rag 技术,随着大语言模型的兴起而备受关注,它结合了检索和增强的能力,使其能给在回答问题时,基于特定、可靠的外部知识,而不是仅仅依靠模型内部的记忆或凭空想象。 今天,就针对旅游行业,以用户在机票退票场景,来阐述 rag 是如何在对信息准确性结合时效性要求极高的场景下做功的。
核心思想¶
rag 的核心思想是将检索和生成这两个能力结合起来。 检索(Retrieval):当用户提出“退票”这样的查询时,系统会从庞大的知识库中找出与“退票”问题最相关的几段信息或文本片段。 生成(Generation):将检索到的信息片段作为上下文提供给 LLM。 LLM 利用这些信息进行整合、理解,然后生成一个连贯、准确的关于“退票”的答案,并且这个答案是基于所提供的上下文生成,而非模型凭空编造。这能显著减少模型数据幻觉现象,确保答案基于事实。
现在,我们来拆解在处理用户“退票”查询时,rag 系统各个环节的具体作用:
工作流程¶
1 、文本分块¶
离线处理,有关在知识工程侧的做功点。 在处理“退票”相关文档时,文本分块是至关重要的一步。
- 目的:llm 的上下文窗口是优先的,不能将一篇包含所有退票政策的荣昌文档整体输入给它。将长文档且分成小块,可以提高检索效率和精确性。同时,必须确保信息单元的准确性,例如不能将一个完整的退票流程描述或一个表格从中间切开。
- Everything to MD:文档的智能解析,将多样化的信息来源(html 网页、语雀文档、 word 等)对外统一输出口径,将其转化为标准的 markdown 文档,如航空公司的退票政策、规章制度、常见问题等,md 格式下段落的结构清晰,包含标题、表格、代码块等丰富信息。这些结构信息可以指导有意义的切分,例如,可以根据“退票流程”、 “退票手续费”等标题层级进行切分,以保持每个分块的主题一致性和信息完整性。
- 切分策略:通用工具如 langchain 的
MarkdownHeaderSplitter和RecursiveCharacterTextSplitter在处理比较复杂的 md 结构时(如复杂的表格、代码块)时可能不够完善,容易丢失格式信息。对于工业级应用,尤其是咋技术文档问答场景中,代码和表格中的信息往往至关重要。因此,可以开发或优化“Advanced Markdown Truncker”,基于python-mist等库解析 md,以更好地保留代码块和表格的完整性和结构信息。例如,在“退票手续费对照表”,保留表头和结构对于理解表格数据至关重要。 - 分块大小:根据实验,选择 256 字符作为分块大小是比较好的平衡点。太长的分块可能包含过多与查询不相关的噪音(例如,一篇长政策文档中除了包含退票外,还有改签、选座、延误等内容),干扰后续的检索和生成。太短则可能导致信息碎片化,llm 无法充分理解其含义。 256 是一个平衡点,既能包含上下文,又避免引入过多噪音。
- 并非适用于所有的场景,最终还得看下文档信息的密集程度。
- 元信息补充:每个文本完成后,都应添加文档名(如国航退票政策)和文档提头信息(如 2025 年最新版)作为元数据。这些元数据在后续检索和生成答案时非常有用,可以追溯信息来源,提高答案的可信度和可溯源性。
2 、数据存储与向量检索(Data Storage & Vectir Retrieval)¶
有效存储和检索分块后的数据是 rag 系统的核心引擎之一。
- 存储选择:采用自研的搜索引擎(ADB )或业界广为使用的(Pipecone 、 Milvus)等向量化数据库,方便运营、获得良好的扩展以及专业支持。
- 自定义文档结构:不同于 LangChain 通常使用
page_content和metadata的通用Document类,包含更细致的字段,如doc_id(文档 id)、chunck_id(分块 id)、text(标量)、text_embedding(文本块的向量)和metadata(文档元数据)等。 - 知识类型区分:在
metadata中增加了一个type字段,用以区分知识是 FAQ 类型(如退票流程常见问题)还是普通文档类型(例如详细退票政策规定)。这样的区分比较重要,不同类型的知识可能需要不同的检索策略。 - 对于 FAQ,可能侧重于精确匹配或高度相似度匹配用户问题与 FAQ 中的问题部分。对于
- 对于普通文档,可能需要更强的深层语义理解来匹配用户问题与文档片段所包含的深层含义。
- 向量检索原理:将每个文本块通过 Embedding 模型转换为高维度的数学向量,这些向量代表了文本块在语义空间中的“坐标”。当用户输入“退票”查询时,同样将其转换为向量。检索过程其实计算用户查询向量与所以文本块向量之间的距离或相似度(如余弦相似度),找到语义上最接近的文本块。检索效果取决于 embedding 模型的质量和向量数据库的索引策略。
3 、查询理解(Query Understanding)¶
用户输入的“退票”查询可能多种多样,甚至带有错别字或口语化表达。准确理解用户意图是系统成功的关键。
意图识别¶
这个模块负责识别并分发用户的查询意图。用户可能想在知识库中找答案(rag),也可能想执行某个操作 (例如“机票退票”可能需要调用 api),或者想要查询数据库(例如“我的退票记录”可能需要 NL2SQL)。
- Few-shot Lear ning(少样本学习): 通过提供少量示例,如“帮我查一下退票政策”识别为 rag 查询,而“办理退票手续”识别为 api 调用,让模型学习新查询的意图。
- Prompt Enginerring:精心设计提示词来引导模型进行意图识别,例如在 prompt 中明确列出意图类别、特征和典型例子。
查询改写(Query Rewriting)¶
将用户原始查询转换为更适合后续检索的、更清晰、更结构化的查询,以提高检索的准确性。
- 同义改写:将“退票”改写成更具体的查询,如“机票的退票流程是什么?”或“如何办理机票退票手续?”。通常会在这一步来处理拼写错误和口语化表达,自动修正用户输入中的错别字或不规范表达。
- 子查询:为了提高更详细的退票信息,系统可能会根据“退票”这个主意图,生成更具体的子意图,例如:
- 机票退票流程
- 机票退票失效
- 机票退票费用
- 机票退票政策
- 下钻:如果用户问“退票”,系统可能会先来判定需要先来获取基础概念,改写为“什么是机票退票政策?”以便找到更完整的上下文。
- 抽象:如果需要获取更宏观或更通用的信息,系统可能会将 query 抽象为:“机票退改签”相关政策或规定。
4 、多路召回(Multi-Path Retrieval)¶
多路召回是提升 RAG 系统效果的关键手段,确保系统从不同视角、不同数据获取信息,提高知识的覆盖度和准确性。
- 向量召回(Vector Retrieval):利用 Embedding 模型和向量数据库来查找与“退票”查询语义相似的文本块,这是主力召回方式。
- 关键词召回(Keyword Retrieval):基于关键词匹配,比如经典的 BM25 算法。对于包含明确关键词(如“退票手续费”、“非自愿退票”)的查询,关键词召回可能更直接有效,与向量召回形成互补。

- 图谱召回(Graph Retrieval):利用知识图谱来检索。在离线阶段,用 llm 退票政策文档中抽取实体(如“东方航空”、“经济舱”、“起飞前 24 小时”)及其关系(如“东方航空”的“退票政策”适用于“经济舱”)构建知识图谱。在线阶段,识别查询中的实体(如“东方航空”),然后在图谱上通过个性化 PageRank 等算法找出相关且重要的节点,再映射回原始文本片段。适用于处理多跳推理的“退票”问题,如:“东方航空的头等舱退票的费用是多少?”

- 分级召回(Hierarchical Recall):针对不同类型的知识源进行优化。
- QP 召回(Query-Passage Recall):计算查询(如“退票流程”)与段落(如政策文档中的具体条款)之间的相似度,适用于从文档中找答案。
- QQ 召回(Query-Query Recall):计算查询(如“退票”)与另一个查询(如 FAQ 中的“如何取消机票订单?”)之间的相似度,适用于 FAQ 检索,如果用户问题与 FAQ 中已有的问题表述相似,则可以直接召回该 FAQ 的答案,效率更高。
5、融合与重排(Fusion & Reranking)¶
多路召回会产生大量候选文本块,需要进行有效融合和进一步筛选。
- RRF(Reciprocal Rank Fusion)融合:这是一种与具体召回分数无关的多路召回融合排序方法。它仅关注文档在每个召回结果中的排名,不关注具体分数。 RRF 通过给每个排名一个分数(排名的倒数),然后将同一召回文档在所有召回列表中的 RRF 分数相加,得到一个总分,按总分排序。这样的好处是它对不同召回方法产生的绝对分数不敏感,只要一个文档在任一路召回中排名靠前,就能获得不错的总分,使得最终列表更全面,兼顾了各个召回方法的优势。
- 重排(Reranking):召回阶段旨在尽可能召回所有相关信息,因此结果可能包含一些噪音。重排阶段的目的是进一步筛选和排序,选出真正最相关、质量最高的 Top-K 个分块,再喂给 LLM 。
- 模型:重排通常使用更复杂、更精确的模型,它会将用户查询(如退票流程)和候选文本块(如政策条款)同时输入模型,让模型内部充分交互,判断二者之间的相关性,直接输出相关度得分。犹豫模型能够同时看到问答双方的全部信息,它能捕捉更细微的语义关联和交互特征打分通常比召回阶段更准确。虽然计算量更大、速度更慢,但非常适合在候选结果数量已大量减少的精排阶段使用。
6、生成 (Generation)¶
这是 RAG 的最后一步。将经过重排筛选后的 Top-K 个最相关的文本块,连同用户原始查询(或改写后的查询)一起组合成一个 Prompt,发送给大型语言模型(LLM)。
知识工程(Knowledge Engineering)¶
高质量的知识内容和格式对于 rag 系统在“退票”场景下的准确性至关重要。如果缺失高质量的知识输入,再好的 rag 技术也只是空中楼阁。
文档智能解析(Everything to MD)¶
将企业内部可能存在的各种格式的“退票”相关文档(如航空公司官网的网页版政策、 PDF 版规定、 Word 版申请表、 Excel 版手续费表格、甚至图片中的就=旧规定)统一解析并转换为标准化的 Markdown 格式。
文档结构化复级¶
在解析 md 基础上,更深入地理解和利用其结构信息,如准确识别各种标题(退票流程、非自愿退票)、段落、表格(退票费率表)、列表、代码块等。这用这些结构信息可以进行更智能的分块和检索。
文档增量加工¶
航空公司的退票政策可能会频繁更新(如特殊时期政策)。如何高效可靠地处理这些新增、修改和删除,保证 rag 系统能及时反应最新的“退票”知识,这是一个持续性的挑战。
内容去重和审核¶
知识库中难免会有重复或相似的“退票”内容,甚至可能存在过时或错误的信息。需要机制去识别和处理这些问题,例如进行内容去重以减少检索冗余,建立审核流程以保证知识的准确性和规范性。
FAQ 自动生成与增强¶
自动生成 FAQ:利用大模型阅读“退票”政策文档,自动生成可能的常见用户问题及其对应答案。例如,从“航班延误退票规定”中自动生成“航班延误多久可以免费退票?”及其答案。这能快速扩充 FAQ 知识库,但需人工审核。 FAQ Query 增强(FAQ QA):对整理过的高质量的 FAQ 内容进行自动化增强。例如,对标准 FAQ 问题“如何退票?” 自动生成多种等价但表述不同的问法,如“机票如何退票”、“我买的机票可以退吗?”、“退票手续怎么办?”。这通过扩充问题的多样性,提高 FAQ 的召回率和覆盖面。