RAG技术解析:如何让大模型精准处理私有知识库
1. 从“死记硬背”到“对答如流”RAG如何让大模型“开卷考试”如果你最近在接触AI大模型尤其是想用它来帮你处理一些专业文档、公司内部知识库或者构建一个能回答特定领域问题的智能助手那你大概率会遇到一个困境直接问ChatGPT它要么回答得笼统要么干脆“胡说八道”。比如你问它“我们公司2024年Q3的销售政策是什么”它肯定不知道因为它没“读过”你公司的内部文件。这时候一个听起来有点技术范儿但实际原理非常直观的技术就登场了——RAG检索增强生成。你可以把传统的、未经特殊处理的大模型想象成一个记忆力超群但只背过公开百科全书和网络公开课的天才学生。你问他课本外的、最新的、或者私密的问题他只能靠“猜”和“编”。而RAG就是给这位天才学生配了一个超级高效的“个人图书馆管理员”和一套“实时参考资料检索系统”。当你提问时系统会先让“管理员”根据你的问题从你指定的“图书馆”也就是你的文档库、知识库里快速找出最相关的几份资料然后把问题和这些资料一起交给“天才学生”让他基于这些确切的资料来组织答案。这样一来答案的准确性、相关性和时效性都得到了质的飞跃。这就是RAG的核心价值它让通用大模型具备了“领域专家”的能力同时又避免了从头训练一个专用模型的巨大成本和数据隐私风险。对于开发者、企业知识管理者乃至任何想利用AI处理私有数据的个人来说RAG是目前最实用、最主流的落地路径。接下来我们就抛开那些晦涩的论文术语用“小白”也能听懂、能上手的方式彻底拆解RAG的技术脉络、核心组件和实战要点。2. RAG系统的三大支柱检索、增强与生成一个完整的RAG系统可以清晰地划分为三个核心阶段它们环环相扣共同决定了最终答案的质量。理解这三个阶段你就掌握了RAG的命脉。2.1 第一阶段检索——如何让机器“读懂”你的海量文档检索是RAG的基石目标是快速、精准地从知识库中找到与用户问题最相关的文本片段。这里的关键在于计算机无法像人一样“阅读”和理解文档它需要一种数学化的表示方式。这就是向量化和向量数据库登场的原因。1. 文档预处理与分块你的原始文档PDF、Word、网页、TXT等首先需要被“切碎”。但不是胡乱切而是有策略地分块。常见的策略有固定大小分块比如每500个字符一块简单但可能切断完整的句子或段落。基于分隔符分块按照段落、标题、句号等自然分隔符来切分能更好地保持语义完整性。滑动窗口分块设置一个固定大小如500字符的窗口每次滑动一定步长如200字符这样能避免在关键信息处被切断但会产生重叠块增加存储和检索开销。实操心得分块大小没有黄金标准。对于技术文档按章节或子标题分块效果更好对于对话或客服日志按轮次分块更合适。一个常见的起步尝试是设置块大小为500-1000字符重叠100-200字符然后根据实际效果调整。2. 文本向量化分块后的文本需要通过一个嵌入模型转化为一串数字即向量。这个向量就像是这段文本在高维空间中的一个“坐标点”语义相近的文本其向量在空间中的距离通常用余弦相似度衡量也会很近。嵌入模型选择你可以使用OpenAI的text-embedding-ada-002或开源模型如BGE、Sentence Transformers系列。选择时需权衡效果、速度和成本。向量维度常见的有384维、768维、1024维等。维度越高表征能力越强但计算和存储成本也越高。3. 向量存储与检索所有文本块的向量被存入向量数据库中如Pinecone、Weaviate、ChromaDB或Milvus。当用户提问时系统首先用同样的嵌入模型将问题也转化为一个向量。然后在向量数据库中执行“最近邻搜索”找出与问题向量最相似的几个文本块向量。最后取出这些向量对应的原始文本块作为检索结果。核心原理整个过程的核心假设是“语义相似度等于向量空间距离相近”。通过将文本和问题映射到同一空间我们就把复杂的语义匹配问题转化为了可计算的数学比较问题。2.2 第二阶段增强——如何把“参考资料”巧妙地交给大模型检索到的文本块我们称之为“上下文”或“参考文档”不能直接扔给大模型。如何组织这些信息极大影响了大模型的理解和生成效果。这就是提示工程发挥关键作用的地方。一个最基础但有效的提示模板如下请基于以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请直接回答“根据已知信息无法回答该问题”不要编造信息。 上下文信息 {context_1} {context_2} ... {context_k} 问题{question} 请根据上下文给出答案这里的门道很多上下文排序检索到的多个文本块是按相关性排序后直接拼接还是需要进一步筛选、去重、甚至重排通常将最相关的块放在前面有助于模型聚焦。上下文长度大模型有上下文窗口限制如16K、128K。你需要确保检索到的所有文本块加上你的问题模板总长度不超过这个限制。指令清晰性明确指令“基于上下文回答”和“拒绝回答未知问题”至关重要这是减少大模型“幻觉”即胡编乱造的第一道防线。2.3 第三阶段生成——大模型如何“消化”资料并输出答案这是最后一步也是最“黑盒”的一步。我们将组装好的提示问题上下文发送给大模型如GPT-4、Claude、或开源的Llama、Qwen等让它生成最终答案。这个阶段看似简单但质量取决于前两步如果检索的上下文不相关模型要么答非所问要么被迫“幻觉”。如果提示模板设计得不好模型可能忽略上下文或者无法理解指令。此外大模型本身的“温度”参数也会影响答案的确定性和创造性。对于事实性问答通常建议设置较低的温度如0.1或0以保证答案的稳定和准确。3. 从Demo到生产构建RAG系统的关键决策与陷阱理解了基本原理我们就可以动手搭建了。但一个能跑通的Demo和一个能在生产环境稳定服务的系统之间隔着无数个需要深思熟虑的决策和亟待规避的“坑”。3.1 技术栈选型没有最好只有最合适嵌入模型云端API如OpenAI效果稳定开箱即用无需维护但会产生持续费用且数据需出境需考虑合规性。开源本地部署如BGE、E5数据隐私有保障一次部署长期使用但需要一定的GPU资源且效果调优需要自己动手。建议初期验证想法可用云端API快速验证涉及敏感数据或追求成本可控应选择开源模型。可以定期用MTEB等基准测试排行榜来评估新模型。向量数据库云托管Pinecone, Weaviate Cloud免运维弹性伸缩集成方便但同样有成本和数据位置考量。自托管ChromaDB, Milvus, Qdrant完全自主可控可部署在内网社区活跃但需要自己负责部署、监控和扩缩容。建议对于中小型项目或快速原型ChromaDB简单易用对于海量数据千万级以上向量和高并发场景Milvus、Qdrant等性能更优。大语言模型闭源大模型GPT-4, Claude能力最强尤其是复杂推理和指令遵循方面但API调用成本高且存在速率限制。开源大模型Llama 3, Qwen, DeepSeek可私有化部署成本固定可微调定制但同等参数下能力可能略逊于顶级闭源模型且需要较强的工程能力。建议在答案质量要求极高的场景如法律、医疗咨询可优先考虑GPT-4在成本敏感、数据隐私要求严苛或需要深度定制的场景开源模型是必由之路。3.2 效果优化的核心战场检索质量提升RAG系统效果不佳十有八九问题出在检索环节。以下是几个必须关注的优化方向1. 分块策略的精细化问题固定的分块大小可能切断一个完整的实体如一个人名、一个产品描述或一个逻辑论证。优化尝试基于语义的分块。使用句子嵌入模型计算句子间的相似度在语义发生较大转变的地方进行切分。或者使用专门的分块模型或规则识别文档结构如标题、列表进行分块。2. 检索器的进阶玩法关键词检索稀疏检索与向量检索稠密检索的结合这就是经典的“混合检索”。像BM25这类算法擅长精确匹配关键词而向量检索擅长语义匹配。将两者的结果进行加权融合如 Reciprocal Rank Fusion能同时保证召回率和精确率。多向量检索不仅为整个文本块生成一个向量还可以为块中的关键实体、摘要等生成多个向量从不同维度进行检索提高命中率。检索后重排序初步检索返回Top K个结果比如20个再用一个更精细但开销大的模型如交叉编码器对这K个结果进行相关性重排选出最相关的Top N个比如5个送入生成阶段。这是用较小计算代价换取显著效果提升的有效手段。3. 元数据过滤为每个文本块附加元数据如“文档来源”、“章节标题”、“创建日期”、“文档类型”等。在检索时不仅可以进行向量相似度搜索还可以叠加元数据过滤条件。例如用户问“最新的员工手册”系统可以优先检索“文档类型员工手册”且“创建日期”最近的那些块。3.3 提示工程的魔鬼细节提示模板不是一成不变的需要针对你的任务进行微调。角色设定在提示开头为模型设定一个角色如“你是一个专业的法律助理”能更好地引导其生成风格。Few-Shot示例在提示中提供一两个“问题-上下文-答案”的示例能显著提升模型遵循你格式和风格的能力。分步思考指令对于复杂问题可以要求模型“先一步步推理再给出最终答案”。这能提升答案的逻辑性也便于调试。输出格式约束明确要求答案以“要点列表”、“总结段落”或“JSON格式”输出便于下游系统处理。4. 实战演练手把手构建一个本地知识库问答系统理论说了这么多我们用一个具体的例子串起整个流程。假设我们要为一个产品团队构建一个基于产品需求文档PRD的问答助手。技术栈选择嵌入模型开源模型BAAI/bge-small-zh-v1.5针对中文优化可本地运行向量数据库ChromaDB轻量易于集成大语言模型通过API调用GPT-3.5-Turbo兼顾效果与成本也可替换为本地部署的Qwen开发框架LangChain简化流程编排或直接使用各组件SDK手动集成。4.1 步骤一知识库构建与向量化首先我们需要将所有的PRD文档假设为Markdown格式处理并存入向量数据库。# 示例代码使用LangChain进行文档加载、分块、向量化并存储 from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 1. 加载文档 loader DirectoryLoader(./prd_docs/, glob**/*.md, loader_clsTextLoader) documents loader.load() # 2. 分块 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap100, separators[\n\n, \n, 。, , , ] ) chunks text_splitter.split_documents(documents) # 3. 初始化嵌入模型 embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5) # 4. 创建并持久化向量数据库 vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db ) vectorstore.persist() print(f知识库构建完成共处理 {len(chunks)} 个文本块。)踩坑提醒RecursiveCharacterTextSplitter默认按[\n\n, \n, , ]分割对中文不够友好。务必根据中文标点习惯调整separators参数否则可能在一个句子中间切断。4.2 步骤二检索与问答链搭建接下来我们构建一个检索问答链。当用户提问时系统自动完成检索、增强提示、生成回答的流程。from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate # 1. 加载已存在的向量数据库 embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5) vectorstore Chroma(persist_directory./chroma_db, embedding_functionembeddings) # 2. 将向量数据库转为检索器并设置检索数量 retriever vectorstore.as_retriever(search_kwargs{k: 4}) # 检索最相关的4个块 # 3. 定义自定义提示模板 prompt_template 你是一个专业的产品经理助理请严格根据以下提供的产品需求文档片段来回答问题。如果提供的资料中没有答案请直接说“根据现有资料无法回答”不要编造任何信息。 相关资料 {context} 问题{question} 请根据资料回答 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 4. 初始化大模型 llm ChatOpenAI(model_namegpt-3.5-turbo, temperature0) # 5. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有上下文塞进提示 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回来源文档便于调试 ) # 6. 进行问答 question 用户登录功能的具体验证流程是怎样的 result qa_chain.invoke({query: question}) print(答案, result[result]) print(\n--- 参考来源 ---) for doc in result[source_documents]: print(f内容片段{doc.page_content[:200]}...) print(f来源文件{doc.metadata.get(source, N/A)}\n)4.3 步骤三效果评估与迭代系统跑起来只是第一步更重要的是评估和优化。可以建立一个简单的评估集收集典型问题列出用户最可能问的10-20个问题。人工标注答案为每个问题从文档中找到或总结出标准答案。运行测试用你的RAG系统回答这些问题。评估指标答案相关性生成的答案是否直接回答了问题是/部分/否事实准确性答案中的事实与文档内容是否一致完全一致/部分一致/不一致/幻觉引用质量系统提供的参考来源是否确实支撑了答案分析问题针对回答不好的问题去检查检索到的上下文相关吗如果不相关是分块问题、嵌入模型问题还是检索策略问题上下文足够回答问题吗如果不够是否需要调整检索数量k或优化分块大小模型是否遵循了指令如果没有是否需要强化提示词通过这个迭代过程你可以有针对性地调整分块策略、尝试不同的嵌入模型、优化提示模板甚至引入混合检索和重排序逐步提升系统效果。5. 进阶思考RAG的边界与未来RAG并非万能灵药理解它的边界和演进方向能帮助你在更复杂的场景下做出正确决策。RAG的典型短板多跳推理问题如果答案需要串联多个分散的文档片段进行推理才能得出例如“张三负责的项目中哪个项目的预算最高”基础的RAG可能表现不佳因为它通常独立检索每个片段。数值计算与精确匹配对于需要精确计算如统计总和或严格关键字匹配的任务向量检索的语义相似性可能引入误差。上下文窗口限制即使模型支持128K上下文检索并塞入过多不相关的上下文也会稀释重要信息增加模型处理负担和成本。应对策略与进阶架构智能路由在RAG系统前加入一个“路由层”先判断问题类型。如果是简单事实查询走标准RAG流程如果是需要总结多个文档的复杂问题可能走Map-Reduce流程先分别处理每个文档再汇总如果是计算问题可能直接调用计算工具。Agents智能体将RAG作为智能体的一个“工具”。智能体可以规划步骤例如先检索A文档了解概念再检索B文档获取数据最后调用计算器进行计算从而解决多跳推理问题。RAG-Fusion 与 Hypothetical Document EmbeddingsRAG-Fusion会针对用户原始问题生成多个相关或改写的问题并行检索合并结果。HyDE则让模型先根据问题“幻想”一个假设答案然后用这个假设答案的向量去检索有时能获得更好的上下文。个人体会RAG技术目前正处于爆发期工具链日益成熟让非专家也能快速搭建可用的系统。但真正构建一个可靠、高效、易维护的生产级系统挑战在于细节的打磨文档预处理的质量、检索精度的持续优化、提示词的精心设计、以及对失败案例的深入分析。它更像一个数据工程和提示工程的混合体需要耐心地迭代和调试。对于初学者我的建议是先用最简单的流程固定分块向量检索基础提示跑通一个端到端的例子建立直观感受。然后选择一个最影响你当前效果的环节通常是检索进行深度优化。记住一个80分的RAG系统已经能解决大量实际问题不必一开始就追求完美的100分。

相关新闻

“自己写的论文,被判97%AI“:2026年毕业季最荒唐的自证困局

“自己写的论文,被判97%AI“:2026年毕业季最荒唐的自证困局

“自己写的,被判97%AI”:2026年毕业季最荒唐的自证困局西南财经大学的张同学独立查阅文献写的论文,在某查重平台上文献综述部分的AI生成率被判高达97%。正文部分也被判定高AI生成率。 中国政法大学的毛同学独立查阅文献、反复打磨论文&#x…

2026/10/8 1:39:40 阅读更多 →
5个简单步骤:Dhizuku让你的Android设备获得终极DeviceOwner权限控制

5个简单步骤:Dhizuku让你的Android设备获得终极DeviceOwner权限控制

5个简单步骤:Dhizuku让你的Android设备获得终极DeviceOwner权限控制 【免费下载链接】Dhizuku A tool that can share DeviceOwner permissions to other application. 项目地址: https://gitcode.com/gh_mirrors/dh/Dhizuku 你是否曾遇到过Android应用需要特…

2026/10/2 5:50:23 阅读更多 →
如何高效管理你的数字音乐库:Music Tag Web全攻略

如何高效管理你的数字音乐库:Music Tag Web全攻略

如何高效管理你的数字音乐库:Music Tag Web全攻略 【免费下载链接】music-tag-web 音乐标签编辑器,可编辑本地音乐文件的元数据, 音乐刮削。(Editable local music file metadata.) 项目地址: https://gitcode.com/gh_mirrors/m…

2026/10/5 17:43:54 阅读更多 →

最新新闻

从直连到聚合:大模型API对接的架构演进与实战避坑指南

从直连到聚合:大模型API对接的架构演进与实战避坑指南

1. 从直连到聚合:API对接思路的转变2026年开年到现在,我陆续参与了三个不同规模的AI应用项目,从智能客服到内容生成工具,再到一个内部知识库问答系统。这三个项目有一个共同点:都需要对接大模型API。而在这三个项目的推…

2026/10/13 16:19:32 阅读更多 →
Linux内核inotify联动端侧模型:实现敏感配置文件变动的毫秒级语义差分告警

Linux内核inotify联动端侧模型:实现敏感配置文件变动的毫秒级语义差分告警

运维堡垒机与核心边缘节点上,/etc/pam.d/、/etc/sudoers 以及各类服务的核心配置文件始终是攻防对抗的最前线。传统的内核审计大多仰仗 auditd 规则或轻量级的 inotify 机制。当文件发生写入关闭事件(IN_CLOSE_WRITE)时,工具通常会…

2026/10/13 16:19:32 阅读更多 →
易语言视频转文本源码解析:从取帧到字幕文本的完整实现

易语言视频转文本源码解析:从取帧到字幕文本的完整实现

简介:面向易语言开发者的视频转文本功能实现源码,定位在图形图像与多媒体处理场景,适合对OCR、语音识别及中文编程感兴趣的初中级学员。压缩包共三个文件,大小约6.3MB,包含易语言主程序源文件(.e)、演示动画(.swf)和HT…

2026/10/13 16:19:32 阅读更多 →
易语言 esqlite3 V1.1 源码升级:多线程事务锁与加密数据库实战

易语言 esqlite3 V1.1 源码升级:多线程事务锁与加密数据库实战

简介:本资源为 sqlite3 易语言支持库与模块的 esqlite3 V1.1 版本,面向使用易语言进行数据库开发的中高级开发者,重点解决多线程环境下 SQLite 操作的稳定性与功能扩展问题。相比 1.0,本次更新新增了 S3 互斥体进入/退出、S3 聚合…

2026/10/13 16:19:32 阅读更多 →
WeTTY 源码安装与开发环境搭建:从 git clone 到热重载开发服务器

WeTTY 源码安装与开发环境搭建:从 git clone 到热重载开发服务器

后端开发工具运维 【免费下载链接】wetty Terminal in browser over http/https. (Ajaxterm/Anyterm alternative, but much better) 项目地址: https://gitcode.com/gh_mirrors/we/wetty 点击查看 免费下载 本文是基于 docs/development.md 展开的源码级开发指南&…

2026/10/13 16:19:32 阅读更多 →
交互式 ER 图 + Schema 差异对比 + 迁移SQL生成:LibreDB Studio 数据库设计工作流完整实操

交互式 ER 图 + Schema 差异对比 + 迁移SQL生成:LibreDB Studio 数据库设计工作流完整实操

【免费下载链接】libredb-studio One browser tab for PostgreSQL, MySQL, Oracle, SQL Server, MongoDB, Redis, SQLite, Couchbase, ClickHouse, Druid, DuckDB, Turso and more. An open-source SQL IDE with SSO, audit trail and AI-assisted queries MIT licensed, with …

2026/10/13 16:18:31 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →