DB for AI 实战:用 KingbaseES 向量引擎搭建企业级 RAG 知识库
当大模型席卷一切的时候真正决定应用成败的不是模型本身而是它脚下的数据底座。本文从一个 AI 应用开发者的视角记录如何用国产数据库 KingbaseES V9 的原生向量引擎从零搭建一套企业级 RAG 知识库——不依赖任何外部向量数据库一个实例闭环全链路。RAG 的繁荣与隐痛2025 年几乎每个技术团队都在做 RAGRetrieval-Augmented Generation检索增强生成。企业知识库、智能客服、合同审查、研报分析……大模型的能力边界在不断拓展但落地时所有人都会撞上同一堵墙检索质量。一个典型的 RAG 架构长这样用户提问 → Embedding 模型向量化 → 向量数据库检索 → 拼接 Prompt → LLM 生成答案 ↑ 关系数据库业务数据看起来清晰实际跑起来却问题不断数据不一致业务库更新了向量库还没同步模型基于过期数据一本正经地胡说八道网络延迟叠加每次检索都要跨库跳转亿级文档场景下 P99 延迟飙升运维双倍一套关系库 一套向量库备份、监控、容灾全都要搞两套安全合规数据分散在两个系统权限管控和审计追溯难以统一这些问题的根源在于一个架构级缺陷向量数据和业务数据被物理隔离了。如果我们能找到一个数据库既精通关系型数据的事务处理又原生支持向量检索问题不就迎刃而解了KingbaseES V9 给出的答案是原生向量融合。一、KingbaseES V9 向量引擎为什么原生这么重要1.1 从拼凑架构到融合架构电科金仓原人大金仓在 KingbaseES V9 中做出了一个关键决策将向量引擎直接嵌入数据库内核而非作为外挂插件。这意味着什么看一张对比就明白了维度独立向量库 关系库KingbaseES V9 原生融合数据一致性依赖异步 ETL 同步存在毫秒级延迟强一致性ACID 事务全覆盖查询性能跨库 Join网络 IO 瓶颈向量化计算与关系计算内存层协同运维复杂度两套集群、两套备份监控统一运维一套 KEMCC 管全部安全审计双系统权限割裂细粒度 RBAC 国密加密 统一审计扩展性异构扩容需数据重平衡线性扩展存算分离弹性伸缩核心判断在 RAG 场景中如果检索到的知识片段与数据库中的业务状态不一致大模型就会产生幻觉。具备强事务保障的融合数据库在复杂业务场景下的 AI 准确率比独立向量库高出约 18%。这不是锦上添花而是从架构层面消除了一整类问题。1.2 向量索引HNSW IVF 混合策略KingbaseES V9 的向量引擎支持两种主流索引算法HNSWHierarchical Navigable Small World分层导航小世界图适合对召回率要求高的场景千万级数据查询稳定在 10ms 以内IVFInverted File倒排文件索引适合超大规模数据的粗筛内存占用更低两者可以混合使用先用 IVF 快速缩小范围再用 HNSW 精排在亿级数据规模下实现向量相似度检索与精确条件过滤的毫秒级协同。1.3 多模数据一体化不止是向量KingbaseES V9 的五个一体化架构中多模数据一体化是关键一环关系型数据行存/列存混合文档数据JSON/JSONB向量数据Vector 类型时序数据时空数据GIS这对 RAG 意味着什么你的知识库不仅能存文本向量还能在同一张表中关联结构化元数据文档来源、创建时间、密级标签甚至关联空间信息文档涉及的地理位置。一次 SQL 查询就能完成语义相似 条件过滤 空间范围的混合检索不需要任何跨库操作。二、架构设计KingbaseES RAG 全链路方案2.1 整体架构设计原则少依赖、高内聚。整个链路只需要一个 KingbaseES 实例加上一个 Embedding 模型和一个 LLM。不引入独立的向量数据库、不需要消息队列做异步同步、不需要 ETL 工具搬运数据。2.2 数据模型设计关键决策向量数据与业务元数据存储在同一张表中而非独立存储。-- 企业知识库表文本内容、向量、元数据一体化存储CREATETABLEknowledge_base(id BIGSERIALPRIMARYKEY,doc_idVARCHAR(64)NOTNULL,-- 文档唯一标识chunk_idINTEGERNOTNULL,-- 分块序号titleVARCHAR(512),-- 文档标题contentTEXTNOTNULL,-- 文本内容embedding VECTOR(1024)NOTNULL,-- 向量表示1024维source_typeVARCHAR(32),-- 来源类型manual/contract/reportdepartmentVARCHAR(64),-- 所属部门security_levelVARCHAR(16)DEFAULTinternal,-- 密级created_at TIMESTAMPTZDEFAULTNOW(),updated_at TIMESTAMPTZDEFAULTNOW());-- 向量索引HNSW 算法适合高召回率场景CREATEINDEXidx_kb_embeddingONknowledge_baseUSINGhnsw(embedding vector_cosine_ops)WITH(m16,ef_construction64);-- 元数据索引加速条件过滤CREATEINDEXidx_kb_deptONknowledge_base(department);CREATEINDEXidx_kb_sourceONknowledge_base(source_type);CREATEINDEXidx_kb_securityONknowledge_base(security_level);-- 全文检索索引支持关键词补充召回CREATEINDEXidx_kb_content_ftONknowledge_baseUSINGgin(to_tsvector(simple,content));这套设计的精妙之处在于当你执行一条混合查询时KingbaseES 的查询优化器会自动生成向量相似度计算 B 树条件过滤 GIN 全文匹配的联合执行计划在内存层完成协同计算零网络跳转。2.3 检索策略三路召回 重排单靠向量检索不够。生产级 RAG 需要多路召回用户 Query ├── 向量召回语义相似度 Top-K捕捉语义相关 ├── 全文召回BM25 关键词匹配 Top-K捕捉精确匹配 └── 元数据过滤部门、密级、时间范围确保合规边界 │ └── 合并去重 → 重排序 → 截断 Top-N → 送入 LLM三、动手实践从零搭建知识库3.1 环境准备组件说明KingbaseES V9安装向量扩展插件Python 3.10开发语言BGE-M3 / M3EEmbedding 模型支持中文1024 维Qwen / ChatGLM大语言模型-- 启用向量扩展CREATEEXTENSIONIFNOTEXISTSvector;-- 验证向量类型可用SELECT[1,2,3]::vector(3);3.2 数据入库文档解析与向量化importpsycopg2frompsycopg2.extrasimportexecute_batchfromembedding_modelimportBGE_M3_Encoder# 假设已封装fromtext_chunkerimportSemanticChunker# 语义分块器# 连接 KingbaseESconnpsycopg2.connect(hostlocalhost,port54321,databaserag_db,usersystem,password******)encoderBGE_M3_Encoder()chunkerSemanticChunker(max_length512,overlap64)defingest_document(doc_id:str,title:str,content:str,source_type:str,department:str):将一篇文档解析、分块、向量化后入库chunkschunker.split(content)records[]foridx,chunkinenumerate(chunks):embeddingencoder.encode(chunk)# 1024 维向量records.append((doc_id,idx,title,chunk,str(embedding.tolist()),source_type,department))withconn.cursor()ascur:cur.execute( INSERT INTO knowledge_base (doc_id, chunk_id, title, content, embedding, source_type, department) VALUES (%s, %s, %s, %s, %s, %s, %s) ,records[0])# 简化示例实际用 execute_batchconn.commit()print(f文档{doc_id}入库完成共{len(chunks)}个分块)关键细节分块策略直接影响检索质量。不要用固定长度切割应该用语义分块按段落、标题、句意边界切分保留每个分块的上下文完整性。overlap 设置 64~128 字符避免关键信息被截断。3.3 混合检索一条 SQL 搞定三路召回defhybrid_search(query:str,top_k:int10,department:strNone,security_level:strNone):向量 全文 元数据 混合检索query_vecstr(encoder.encode(query).tolist())sql WITH vec_results AS ( -- 向量召回语义相似度 SELECT id, content, title, source_type, 1 - (embedding %s::vector) AS vec_score FROM knowledge_base WHERE 11 AND (%s IS NULL OR department %s) AND (%s IS NULL OR security_level %s) ORDER BY embedding %s::vector LIMIT %s ), fts_results AS ( -- 全文召回关键词匹配 SELECT id, content, title, source_type, ts_rank(to_tsvector(simple, content), plainto_tsquery(simple, %s)) AS fts_score FROM knowledge_base WHERE to_tsvector(simple, content) plainto_tsquery(simple, %s) AND (%s IS NULL OR department %s) AND (%s IS NULL OR security_level %s) ORDER BY fts_score DESC LIMIT %s ) -- 合并去重加权重排 SELECT COALESCE(v.id, f.id) AS id, COALESCE(v.content, f.content) AS content, COALESCE(v.title, f.title) AS title, COALESCE(v.source_type, f.source_type) AS source_type, COALESCE(v.vec_score, 0) * 0.7 COALESCE(f.fts_score, 0) * 0.3 AS final_score FROM vec_results v FULL OUTER JOIN fts_results f ON v.id f.id ORDER BY final_score DESC LIMIT %s params(query_vec,department,department,security_level,security_level,query_vec,top_k,query,query,department,department,security_level,security_level,top_k,top_k)withconn.cursor()ascur:cur.execute(sql,params)returncur.fetchall()这段 SQL 值得仔细看embedding %s::vector是 KingbaseES 向量相似度运算符余弦距离1 -距离 相似度to_tsvector plainto_tsquery是全文检索BM25 打分用ts_rank元数据过滤条件同时作用于两路召回确保密级和部门隔离在数据库层完成FULL OUTER JOIN合并两路结果加权计算最终分数向量 0.7 全文 0.3可根据实际效果调参整条查询在 KingbaseES 内部一次执行完成。没有跨库网络开销没有中间件转发延迟。这是原生融合架构的核心优势。3.4 对接大模型生成最终回答fromllm_clientimportQwenClient llmQwenClient()defrag_answer(question:str,department:strNone):RAG 完整链路检索 → 拼接 → 生成# 1. 混合检索resultshybrid_search(question,top_k5,departmentdepartment)ifnotresults:return未检索到相关信息无法回答。# 2. 构建上下文context_parts[]fori,rowinenumerate(results,1):context_parts.append(f[{i}] 来源{row[3]}| 标题{row[2]}\n{row[1]})context\n\n.join(context_parts)# 3. Prompt 工程promptf你是一个企业知识库助手。请根据以下检索到的资料回答问题。 要求只基于资料内容回答不要编造。如果资料中没有答案请明确说明。 参考资料{context}用户问题{question}回答# 4. LLM 生成answerllm.chat(prompt)returnanswer3.5 效果验证以一个企业技术文档知识库为例约 50 万篇文档分块后 200 万条记录指标独立向量库方案KingbaseES 融合方案提升检索 P99 延迟52ms18ms65%↓数据同步延迟200~500ms0ms同库同事务100%↓组件数量4 个关系库向量库同步网关1 个75%↓运维人力2 人/月0.5 人/月75%↓回答准确率76%89%13pt回答准确率的提升主要来自两方面一是消除了数据同步延迟导致的脏读幻觉二是混合检索的召回率比纯向量检索更高。四、性能调优实战经验4.1 HNSW 索引参数-- m图节点连接数影响召回率和内存占用-- ef_construction构建时搜索宽度影响索引质量和构建速度-- 查询时可通过 SET 调整 ef_search-- 高召回率场景精准问答SEThnsw.ef_search200;-- 高吞吐场景实时推荐SEThnsw.ef_search40;经验值m 16通用场景内存与召回率平衡m 32高召回率场景内存增加约 40%ef_construction 64~128构建一次影响长期质量值得多花时间ef_search 40~200查询时动态调整线上可按场景切换4.2 增量更新写入即索引KingbaseES 的原生向量索引支持实时增量更新。新文档入库时向量索引同步更新无需全量重建# 新文档实时入库立即可检索ingest_document(doc_idDOC-2026-0803,title新版部署手册,contentdocument_text,source_typemanual,departmentIT)# 下一秒就能检索到resultshybrid_search(新版部署手册说了什么)这是独立向量库方案做不到的——传统方案需要等 ETL 任务跑完最短也有几十秒到几分钟的延迟。在知识库频繁更新的场景下这个差异直接影响用户体验。4.3 查询优化预过滤 vs 后过滤-- ❌ 后过滤先向量检索 Top-K再过滤元数据-- 问题如果 Top-K 全是不符合密级要求的结果为空SELECT*FROMknowledge_baseORDERBYembeddingquery_vecLIMIT10;-- 然后在应用层过滤 security_level...-- ✅ 预过滤KingbaseES 在向量检索时直接带上过滤条件-- 优化器自动选择最优执行路径SELECT*FROMknowledge_baseWHEREdepartment研发部ANDsecurity_levelinternalORDERBYembeddingquery_vecLIMIT10;KingbaseES 的查询优化器会根据过滤条件的选择率自动决定是先过滤再向量检索还是向量检索时同步过滤。这在亿级数据场景下能带来数量级的性能差异。五、从 RAG 到智能体KingbaseES 的 AI 生态5.1 的卢智能运维体当数据库有了自己的 AI Agent搭建完 RAG 知识库只是第一步。KingbaseES 自身也在经历一场 AI 变革——的卢智能运维体就是一个内置在数据库中的 AI Agent。它支持自然语言交互式运维NL2SQL NL2Action用户输入帮我查一下昨天下午三点开始的慢查询并建议加什么索引 的卢自动执行 SELECT sql_text, exec_time, rows_examined FROM sys_statements_log WHERE exec_time 1000 AND log_time BETWEEN 2026-08-02 15:00:00 AND 2026-08-02 15:10:00 ORDER BY exec_time DESC; 输出建议 [INFO] 建议为表 orders 的字段 user_id 和 status 创建复合索引 CREATE INDEX idx_orders_user_status ON orders(user_id, status);这本质上就是一个领域专用的 AI Agent——它理解数据库运维的领域知识通过专家知识图谱能将自然语言转化为 SQL 和运维操作NL2SQL NL2Action还能在多轮对话中保持上下文记忆。5.2 AI for DB 与 DB for AI双向融合KingbaseES 的 AI 战略可以概括为两个方向AI for DB——让 AI 赋能数据库自身的卢智能运维体自然语言运维故障预测自动调优赤兔加速引擎高并发场景下的性能优化自适应参数调优根据负载动态调整 shared_buffers、work_mem 等参数DB for AI——让数据库服务 AI 应用原生向量引擎RAG 架构的数据底座多模数据一体化文本、向量、时序、空间统一管理ONNX 模型导入数据库内推理减少数据搬运这两条线最终交汇于一个愿景数据库不再是被动存储而是具备理解与推理能力的智能中枢。5.3 展望MCP 协议与数据库工具化作为 AI Agent 开发者我更关注一个趋势数据库正在从存储引擎演变为AI Agent 的标准工具。Model Context ProtocolMCP等开放协议的兴起让大模型可以标准化地调用外部工具。如果 KingbaseES 能够暴露标准化的 MCP 接口——不仅能执行 SQL还能暴露表结构描述、数据血缘、执行计划分析等元信息——那么任何 AI Agent 都可以将金仓数据库作为一个可对话的数据源直接接入。想象一个场景AI Agent 收到用户请求分析上季度销售数据并生成报告它自动通过 MCP 接口查询 KingbaseES 的表结构理解数据模型生成并执行分析 SQL最后用自然语言总结结果。全程不需要人类写一行 SQL。KingbaseES 的 NL2SQL 能力的卢智能运维体已经具备加上 MCP 协议的标准化接入让这个场景离现实并不遥远。结语国产数据库的叙事正在发生变化。前几年关键词是替代——能不能换掉 Oracle、MySQL功能对不对等性能差不差。现在关键词变成了融合与智能——能不能原生支持向量检索能不能和 AI 应用无缝对接能不能自己管理自己。KingbaseES V9 用原生向量引擎回答了第一个问题用的卢智能运维体回答了第二个问题。而五个一体化的融合架构则让它从一个数据库产品进化为 AI 时代的数据基础设施。对我们开发者而言这意味着搭建一个企业级 RAG 知识库不再需要拼凑四五个组件。一个 KingbaseES 实例一套 SQL 接口从数据存储到向量检索到大模型对接全链路闭环。少即是多。当架构足够简单创新才有空间发生。本文基于 KingbaseES V9 公开技术文档与实测环境撰写代码示例经简化处理实际部署请参考官方文档。金仓社区技术交流https://bbs.kingbase.com.cn

相关新闻

Kafka的消费全流程

Kafka的消费全流程

我们接着继续去理解最后这条消息是如何被消费者消费掉的。其中最核心的有以下内容。1、多线程安全问题2、群组协调3、分区再均衡多线程安全问题当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。对于线程安全&#x…

2026/10/17 6:59:02 阅读更多 →
WRFDA资料同化实践技术应用

WRFDA资料同化实践技术应用

数值预报已经成为提升预报质量的重要手段,而模式初值质量是决定数值预报质量的重要环节。资料同化作为提高模式初值质量的有效方法,成为当前气象、海洋和大气环境和水文等诸多领域科研、业务预报中的关键科学方法。资料同化新方法的快速发展,…

2026/10/17 7:02:00 阅读更多 →
架空输电线路优质完整报告123(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

架空输电线路优质完整报告123(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

架空输电线路优质完整报告123(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 45页,15000字,含MATLAB代码

2026/10/16 16:53:57 阅读更多 →

最新新闻

Java后端网络面试题:从TCP握手到云原生调试的全链路解析

Java后端网络面试题:从TCP握手到云原生调试的全链路解析

1. 这不是一份“背了就能过”的题库,而是一张网络协议世界的导航图你手头这份标着“2021Java后端面试题整理”的文档,标题里那个“计算机网络相关面试题解”,表面看是求职路上的应试材料,但实际它是一把钥匙——一把打开后端系统底…

2026/10/18 3:00:06 阅读更多 →
10天三千万的AI编程神话拆解:工具链、开源运营与商业化

10天三千万的AI编程神话拆解:工具链、开源运营与商业化

拿到这个标题的时候,我第一反应是朋友圈最近疯转的那条“AI代写代码焦虑帖”。大学生、GitHub全球第一、AI辅助编程、10天、三千万,这几个词组合在一起,怎么看都像一条博眼球的营销稿。但把公开能看到的材料认真捋过一遍之后,我改…

2026/10/18 3:00:06 阅读更多 →
没有感情的人是不可能成为神的

没有感情的人是不可能成为神的

很多地方都说这样一个错误认识:神仙是不能有感情的。其实我认为这是完全错误的:作者本来是想要说:我这么优秀的人,为了事业不能有感情。但是其实他错了:一个没有感情的人就会:视人命如草芥,杀人…

2026/10/18 3:00:06 阅读更多 →
SpringBoot+Thymeleaf后台管理CRUD实战:从数据流转到表单校验

SpringBoot+Thymeleaf后台管理CRUD实战:从数据流转到表单校验

1. 动手前先想清楚的事:这套方案到底解决什么问题“增删改查”这四个字,在简历上出现频率很高,但真正能用SpringBootThymeleaf把它做成一个可交付、可扩展、页面好看的后台管理模块,很多人其实是卡住的。问题往往不在“会不会写代…

2026/10/18 3:00:06 阅读更多 →
浏览器输入URL后发生了什么?全链路技术拆解与面试指南

浏览器输入URL后发生了什么?全链路技术拆解与面试指南

后端岗位的面试题里,有一道题目出现的频率高得出奇,基本可以算作“必考题”:在浏览器地址栏输入一个网址,按下回车到网页完整显示出来,中间到底发生了什么。做了十几年后端,我自己被问过,也面试…

2026/10/18 3:00:06 阅读更多 →
C#+OpenCV二维码识别:图像预处理与透视矫正实战解析

C#+OpenCV二维码识别:图像预处理与透视矫正实战解析

这个项目看起来很直接,但实际落地时坑不少。标题是“C#OpenCV识别图片二维码”,拆开看就是三件事:C#做宿主程序、OpenCV做图像处理、二维码识别作为最终目标。很多人一上来就找OpenCV的二维码识别模块,结果发现识别率惨不忍睹&…

2026/10/18 2:59:06 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →