检索增强生成(RAG)作为一种结合信息检索与文本生成的技术,已成为解决大语言模型(LLM)"知识过时"和"幻觉输出"问题的关键方案。RAG通过将外部知识库与LLM生成能力相结合,使模型能够基于真实、最新的信息输出答案,显著提升了生成内容的准确性和时效性
核心思想:从给你链接到给你答案,一种从传统关键词搜索向下一代AI驱动的生成式搜索演进的完整构想。
传统的搜索是你输入关键词、系统返回一个相关的文档列表、你需要自己去逐篇阅读、寻找答案。而这套新的生成式搜索(Generative Search)流程、目标是直接理解你的问题、并通过阅读和总结相关文档、直接生成一个精准、连贯的答案。这是典型的检索增强生成(RAG、Retrieval-Augmented Generation)架构。
RAG系统的核心流程可概括为"先检索、后生成",主要分为三个关键环节:索引构建、检索和生成。
在 RAG 系统中、文档需要被分割成多个文本块后再进行向量嵌入
什么是chunk?
- chunk 就是把一份长文档分割成多个 较小的文本片段
(text chunks)- 每个 chunk 作为一个独立的检索单元,被编码成向量。
- 当用户发起查询时、RAG 系统会在向量库里查找与 query 最相关的 chunk、把这些 chunk 作为上下文传递给大模型。
Chunk = 文本块。在 RAG 中、把文档切成 chunk、再做 embedding、可以提升检索精度、减少冗余、是业界常用的做法
chunk 更小、可以只把最相关的几个 chunk 提供给大模型、节省 prompt 长度不考虑大模型输入长度限制和成本问题的情况下、其目的是在保持语义上的连贯性的同时、尽可能减少嵌入内容中的噪声、从而更有效地找到与用户查询最相关的文档部分。
在 RAG 系统中实施合适的文档分块策略,旨在找到这种平衡、确保信息的完整性和相关性。一般来说、理想的文本块应当在没有周围上下文的情况下对人类来说仍然有意义、这样对语言模型来说也是有意义的。
固定大小的分块:最简单和直接的方法、直接设定块中的字数、并选择块之间是否重复内容。通常我们会保持块之间的一些重叠、以确保语义上下文不会在块之间丢失。与其他形式的分块相比、固定大小分块简单易用且不需要很多计算资源。
带重叠切分(sliding window / overlap)
特殊结构的分块:针对特定结构的文档的专门分块器。这些分块器专门设计来处理这些类型的文档、以确保正确地保留和理解其结构。langchain 提供的特殊分块器包括:Markdown 文件、LaTeX 文件、以及各种主流代码语言分块器
递归分块:在大多数情况下推荐的方法、通过重复地应用分块规则来递归地分解文本。例如在 langchain 中会先通过段落换行符(\n\n)进行分割、然后检查这些块的大小。如果块大小不超过一定阈值、则该块被保留。对于大小超过标准的块、使用单换行符(\n)再次分割。这种方法可以灵活地调整块的大小。例如、对于文本中的密集信息部分、可能需要更细的分割来捕捉细节、而对于信息较少的部分、则可以使用更大的块。它的挑战在于、需要制定精细的规则来决定何时和如何分割文本。
从小到大分块:既然小的分块和大的分块各有优势、一种更为直接的解决方案是将同一文档从大到小所有尺寸的分块、然后将不同大小的块全部存储在数据库中、并保存每个分块的上下级关系、进行递归搜索。因为我们需要存储大量重复的内容、这种方案的缺点是需要更大的存储空间。
按语义切分
分块大小的选择
首先不同的嵌入模型有其最佳输入大小、例如 OpenAI 的
text-embedding-ada-002模型在 256 或 512 大小的块上表现更好。其次文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。处理长篇文章或书籍时、较大的分块有助于保留更多的上下文和主题连贯性、而对于社交媒体帖子、较小的分块可能更合适捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的、较小的分块可能更为合适。相反如果查询较为复杂、可能需要更大的分块
基金 分红 REITs今年以来基金分红有什么特点?REITs在其中扮演了什么角色?这种输入的转变、要求后台具备更强大的语言理解能力。这是整个流程中技术含量最高、最关键的一步、它远不止是简单的分词。
基金 分红进行分词、变成基金和分红两个词(传统用ES和MongoDB)基金、分红、REITs、今年以来(时间状语)等。search(keywords="基金分红、 time_range="2025-01-01 to now")search(keywords="REITs 分红 特点")search(keywords="债券基金 分红 比例")item_feature索引中,执行检索。图中从生成总结指回Query解析的反馈、是流程最先进、最智能的部分
它代表了一种多轮、迭代的搜索思想
它解决了什么问题?
有时候、第一轮召回的文档可能不足以完美地回答用户的问题
比如用户问AI对经济的宏观和微观影响、第一轮召回的文章可能大多是关于宏观影响的。
它如何工作?
AI对中小企业生产效率的影响(这就是一次Query改写)。价值: 这个反馈循环、让搜索从一次性的请求-响应模式、进化成了一个能够像人类一样思考、反思、并进行多步推理的AI代理(AI Agent)
在我们平常的 RAG 中通常是简单地基于上述的一条链路来回答用户的问题的,有时候第一轮召回的文档可能不足以完美地回答用户的问题。基于前面提到过的反馈环节,在 UltraRAG 中提出了 RAG Pipeline 方式编排推理流程来实现反馈环节。
[!summary] 什么是 Pipeline? 在 UR-2.0 中,Pipeline 是你定义“推理任务如何执行”的流程脚本。它像一个“任务计划表”或“工作流蓝图”,用来明确告诉系统每一步该做什么、怎么做、做完后怎么走下一步。你可以通过 Pipeline 组合不同模块(Server)中的功能(Tool),构建出一个完整、可复现、可控制的 RAG 推理流程。例如:
- 加载数据 → 检索文档 → 构造 prompt → 调用大模型 → 评估结果;
- 或者在多轮生成中,根据模型中间的表现决定是否重新检索或停止生成。 Pipeline 的核心作用是:让复杂的 RAG 流程结构清晰、灵活、模块化,并通过 YAML 配置实现零代码编排。
在 UR-2.0 中,Pipeline 是你定义“推理任务如何执行”的流程脚本。它像一个“任务计划表”或“工作流蓝图”,用来明确告诉系统每一步该做什么、怎么做、做完后怎么走下一步。你可以通过 Pipeline 组合不同模块(Server)中的功能(Tool),构建出一个完整、可复现、可控制的 RAG 推理流程。例如:
Pipeline 的核心作用是:让复杂的 RAG 流程结构清晰、灵活、模块化,并通过 YAML 配置实现零代码编排。
串行结构是 UltraRAG Pipeline 中最基本、最常见的执行方式。多个步骤按顺序依次执行,前一步的输出(若有)可以作为下一步的输入,也可以独立执行。构建一个基础的 RAG 工作流通常只需使用串行结构即可完成。
在一些多轮推理、多跳问答、多轮检索等任务中,单次执行流程往往不足以获得最终答案。此时就需要使用 循环结构(loop),以重复执行某些模块,逐步迭代信息、强化生成结果。
在复杂的推理任务中,我们常常需要根据模型当前的输出或中间状态决定流程是否继续。例如:
为实现上述能力,UR-2.0 提供了 分支结构(branch),用于构建具备 条件跳转逻辑 的动态推理流程。