最近在对我的开源项目 DocFlow 添加上 RAG 的支持,要想好好地使用这个功能,那么必须就得花多点时间去学一下他们的怎么工作的。
文本切分(Text Chunking)
文本切分是将长文档拆分成更小的片段(chunks),以便更高效地索引与检索。 在 RAG(Retrieval-Augmented Generation)流程中,模型并非直接处理整篇文档,而是依赖这些片段。切分的质量会直接影响检索的准确性和回答的清晰度。
-
片段过长 → 模型容易分心,无法聚焦关键信息。
-
片段过短 → 上下文丢失,逻辑不连贯。
-
核心目标 → 保持上下文完整性的同时,避免冗余。
常见的切分方法主要有以下几个方面:
1. 固定长度切分(Simple Chunking)
方式:按固定大小划分,并设置少量重叠(如每段 35 个字符,重叠 5 个字符)。
优点:简单高效,易于实现。
缺点:忽略语义结构,可能打断关键想法。
适用场景:新闻、博客、短文档等非技术性内容。
2. 语义切分(Semantic Chunking)
方式:利用嵌入(embeddings)和余弦相似度,将语义接近的句子聚合。
语义切分(Semantic Chunking)是一种基于语义的文本分块方式,它不是按固定长度截断,而是通过嵌入向量和相似度来判断句子或段落之间的语义关联。相似的句子会被聚合到同一块,而当语义发生明显转变时,就会在该处断开。这样可以保证每个 chunk 都围绕一个完整主题,避免关键信息被拆散,从而提升检索的准确性和回答的连贯性。
优点:语义相关性更强,检索精度高。
缺点:需要高性能模型(如 BERT),计算量大。
适用场景:技术文档、知识库、FAQ。
3. 大语言模型切分(LLM-based Chunking)
-
方式:利用 LLM 将文本划分为自洽、完整的命题或段落。
-
优点:语义连贯度最高,片段更自然。
-
缺点:计算开销大,可能需要微调。
-
适用场景:复杂产品手册、法律文档、学术资料。
区别
接下来我们将使用一张表格来对比他们的区别:
方法 | 实现方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
1. 固定长度切分 | 固定大小 + 少量重叠 | 简单高效,易于实现 | 忽略语义,可能切断关键信息 | 一般性内容,短文本 |
2. 语义切分 | 基于嵌入和相似度聚合句子 | 保持语义一致,检索精度高 | 算力需求高,依赖 embedding | 技术文档、知识库、FAQ |
3. LLM 切分 | 由大语言模型生成自洽片段 | 最连贯,效果最佳 | 成本高,需模型支持 | 产品手册、法律/科研文档 |
重排序
在 RAG 系统中,初始的检索器会拉取一批结果,其中既有相关的,也有不太相关的。重排序(Reranking) 的作用就是对这些结果重新排序,让最相关的片段排在前面,再交给大语言模型处理。
常见的重排序方法有:
-
交叉编码器重排序(Cross-encoder Reranking):将查询和候选片段一起输入到 Transformer 模型(如 BERT),由模型输出匹配度评分。准确率很高,但速度慢、资源消耗大,适合在质量优先于延迟的场景下使用。
-
基于分数的重排序(Score-based Reranking):利用启发式规则或相关性分数(如 BM25 加权、关键词匹配)来调整结果顺序。速度快、开销小,但缺乏细腻的语义判断。
这两种方法都有效,选择哪一种取决于你能容忍的延迟程度。
元数据
利用元数据(Leveraging Metadata)指的是通过结构化标签(如日期、作者、领域或文档类型)来过滤或提升检索结果的相关性。这是一种低成本但高收益的技术,因为它几乎不需要复杂的计算,却能显著提高结果质量。
在实践中,常见的方式主要有三种:
-
日期过滤(Date Filtering):用于移除过时内容,仅保留最新文档,特别适合金融等快速变化的领域。不过,它也可能因为过度强调时效性而遗漏一些重要的历史资料。
-
作者/来源过滤(Author/Source Filtering):通过提升来自权威作者或可信来源的内容,可以有效降低幻觉风险。但与此同时,也可能忽视一些虽不知名但高度相关的信息。
-
文档类型过滤(Document Type Filtering):根据文档的格式来筛选,例如区分指南、博客或政策文件。这有助于更好地匹配用户意图,但如果元数据标注不一致,就容易导致过度过滤。
混合检索(Hybrid Search)
混合检索是指将 基于关键词的稀疏检索 与 基于向量的稠密检索 结合起来,从而提升结果的相关性。 这种方式在处理 边缘案例
或 含糊查询
时尤为有效,因为它能同时兼顾精确匹配和语义理解。
在实际应用中,常见的实现方式主要有两种:
-
分数融合(Score Fusion):将稀疏检索和稠密检索的结果进行加权评分,再综合排序。这样可以在准确性上取得平衡,但需要仔细调参,否则容易引入噪声。
-
结果合并(Result Merging):分别从两种方法中获取排名靠前的结果,然后合并并重新排序。这种方式实现简单,但存在结果重复或排序逻辑不一致的风险。
查询改写(Query Rewriting)
查询改写是指在检索之前对用户输入进行优化与重构。它会将模糊或信息不足的查询重新表述,让系统更好地理解用户意图,从而返回更相关的结果。这种方法在处理 简短查询 或 包含拼写错误的查询 时尤其有用。
在现代系统中,查询改写通常在后台自动完成,常见方式包括:
-
同义词扩展(Synonym Expansion):自动添加等价词或相关词,以覆盖更多表达方式。这有助于提升召回率,但也可能引入一些无关结果。
-
拼写纠错(Spelling Correction):自动修复拼写错误或笔误,对普通用户非常友好。不过在涉及专业术语时,系统可能会误把正确词当作错误而替换。
-
意图澄清(Intent Clarification):通过规则或机器学习模型,将宽泛的查询转化为更具体、更清晰的问题。这可以显著提升相关性,但需要额外的训练数据,并增加系统复杂度。
自动裁剪(Autocut)
自动裁剪是一种根据 token 限制 或 模型约束 来动态修剪文本的方式,它的目标是在不破坏语义完整性的前提下,去除不重要的内容,从而保留关键信息。
这一点非常重要,因为许多大语言模型都有严格的上下文窗口限制。如果输入超过限制,模型可能会出现幻觉、忽略关键信息,甚至性能下降。
常见的自动裁剪策略主要有两类:
-
打分裁剪(Scored Trimming):先对内容按重要性进行排序,再裁剪掉得分最低的部分。这种方式能智能保留核心内容,但前提是需要设计一套可靠的打分机制。
-
规则裁剪(Rule-based Trimming):基于固定规则来裁剪,例如默认去掉引言段落或脚注。实现简单,但缺乏灵活性,面对语义复杂的内容时适应性不足。
假设我们有一份技术文档需要传给 LLM,但它太长(超过 4000 tokens 的限制),必须进行自动裁剪:
text
引言:本手册介绍了产品X的背景、市场前景和设计理念。
章节1:安装步骤,包含详细的环境配置说明。
章节2:核心功能讲解,涵盖API调用、数据结构和常见用例。
章节3:高级功能,包括性能优化和安全配置。
附录:相关参考文献、脚注和历史版本记录。
使用打分裁剪的话,那么系统就会先给每个部分进行打分:
-
安装步骤(高分)
-
核心功能(最高分)
-
高级功能(中等偏高)
-
引言(低分)
-
附录(最低分)
裁剪的最终结果只保留 安装步骤 + 核心功能 + 高级功能
,去掉引言和附录。这样做的好处是保留了对用户最关键的信息。
第二个方法是规则裁剪,它的方法是去掉"引言"和"附录"部分。裁剪的结果是保留 安装步骤 + 核心功能 + 高级功能
。这样做的好处是实现简单,但如果"引言"里刚好有重要注意事项,就会被直接丢掉。
上下文蒸馏(Context Distillation)
在高阶 RAG 系统中,每次都直接解析完整的大型文档并不是最优解。上下文蒸馏的目的,就是将冗长的文档压缩为更有价值、更有意义的摘要,让模型在生成时聚焦于关键信息。
需要注意的是,大语言模型并不需要"所有信息",它只需要"正确且必要的信息"。过多的上下文不仅不会提升效果,反而可能稀释关键信号,导致输出不准确。而上下文蒸馏正是帮助模型保持专注和精确的关键手段。
实现上下文蒸馏的方式主要有两种:
-
基于摘要的蒸馏(Summarization-based Distillation):通过抽取式或生成式摘要提炼要点,生成简洁的上下文,优点是内容紧凑,但可能遗漏一些细节。
-
基于问题的蒸馏(Question-driven Distillation):根据用户的具体问题来定制上下文,只保留与问题最相关的信息,相关性极高,但前提是系统需要正确理解查询意图。
假设我们现在有这样的内容:
text
产品X是一款为中小企业设计的项目管理工具,提供任务分配、进度追踪和团队协作等功能。它的设计初衷是解决团队沟通效率低、任务进展不可见的问题。自2020年发布以来,产品X已经在100多个国家被数万家企业采用。根据用户反馈,产品X最受欢迎的功能是看板(Kanban)和自动提醒(Reminders),它们能帮助团队更直观地管理任务和避免遗漏。
在最新的2.0版本中,产品X引入了AI助手功能,可以自动总结项目进展,并根据团队的历史行为推荐优先任务。该功能使用自然语言处理技术分析会议记录和任务描述,为管理者生成可操作的洞察。尽管如此,部分用户反馈担心AI助手会消耗额外计算资源,并且在某些情况下推荐结果不够精准。
此外,产品X还提供API接口,方便开发者进行二次开发和集成。例如,它可以与Slack、Jira、Trello等常见协作工具连接,帮助团队形成统一的工作流。未来的版本计划加入更多第三方集成,以及跨团队的分析报表功能。
接下来我们将基于摘要来进行蒸馏:
text
产品X是一款面向中小企业的项目管理工具,核心功能包括任务分配、进度追踪和团队协作。自2020年发布以来,被广泛采用,最受欢迎的功能是看板和自动提醒。在2.0版本中新增AI助手,可总结项目进展并推荐任务,但存在计算资源和准确性方面的担忧。此外,产品X支持与常见协作工具集成,并计划扩展更多功能。
它的优点是信息浓缩,快速了解重点,而缺点是一些细节被省略。
如果使用基于问题来进行蒸馏:
text
在2.0版本中,产品X新增了AI助手功能。该助手可以自动总结项目进展,并基于团队历史行为推荐优先任务。其核心技术是自然语言处理,能够分析会议记录和任务描述,为管理者生成可操作的洞察。不过用户反馈指出,该功能在计算资源消耗和推荐准确性上仍有不足。
它的优点是只保留与问题相关的内容,信息更精准,但其他重要背景(如任务分配、集成工具)被忽略。
从上面的对比可以看出:
-
摘要式蒸馏 → 面向全局总结,快速提炼重点信息
-
问题驱动蒸馏 → 面向特定任务,更加精准聚焦
8. 微调大语言模型(Fine-tuning the LLM)
微调 LLM 是指在预训练语言模型的基础上,使用特定领域的数据进行再训练,使模型更好地理解并输出你所期望的回答风格和内容。 当仅靠提示词(Prompts)无法有效引导模型时,尤其是在受监管行业或小众领域,微调就显得格外重要。
-
监督微调(Supervised Fine-tuning):通过标注好的数据(如问答对、代码示例、任务指令)来训练模型。优点是精确、可控,但需要高质量的标注数据和较大算力投入。
-
基于人类反馈的强化学习(RLHF, Reinforcement Learning from Human Feedback):由人工对模型输出进行评分,模型通过学习偏好来调整生成结果。这种方式能帮助模型与价值观或品牌语气保持一致,但同样需要大量人力和算力资源。
9. 微调嵌入模型(Fine-tuning the Embedding Models)
嵌入模型的作用是将文档转化为向量,用于相似度检索。微调嵌入模型的目的在于重新塑造系统对"语义相似性"的理解,尤其是在现成的通用向量模型在你的领域表现不佳时。
-
对比学习(Contrastive Learning):通过训练让语义相近的文本在向量空间中"靠近",而语义不相关的文本"远离"。这种方法能显著提升检索准确率,但需要正负样本数据。
-
领域自适应(Domain Adaptation):在你的语料库上继续训练嵌入模型,使其更贴合领域特性。实现门槛较低,即便没有标注数据也可进行,但如果训练不当,可能会导致过拟合。
总结
在 RAG 系统中,优化检索与生成效果的关键手段可以分为多个 tag。文本切分(Chunking)
决定了文档被拆解后的粒度,影响上下文完整性与检索精准度;重排序(Reranking)
则帮助将最相关的内容排在前面,提高回答质量。元数据利用(Metadata Leveraging) 通过日期、作者或文档类型等标签进行过滤或加权,能低成本地提升结果相关性;混合检索(Hybrid Search) 将关键词与向量检索结合,兼顾精确匹配与语义理解。
此外,查询改写(Query Rewriting) 能优化模糊或带错字的输入,让系统更好理解意图;自动裁剪(Autocut) 在 token 限制下保留最重要的信息,避免上下文超载;上下文蒸馏(Context Distillation) 则通过摘要或问题驱动的方式压缩文档,保证模型专注于关键信息。最后,微调(Fine-tuning) 不论是 LLM 还是嵌入模型,都能让系统更好地适配特定领域,实现从检索到生成的全面提升。
最近在出一个前端的体系课程,里面的内容非常详细,如果你感兴趣,可以加我 v 进行联系 yunmz777
:
