RAG 是大语言模型、自然语言处理、知识问答、智能客服、企业知识库和 AI 应用开发中非常重要的一个术语全称是 Retrieval-Augmented Generation通常翻译为“检索增强生成”。它用来描述一种让大语言模型先从外部资料中检索相关内容再基于这些内容生成答案的方法。换句话说RAG 是在回答模型怎样在不完全依赖自身参数记忆的情况下利用外部知识回答问题。如果说普通大语言模型主要依靠训练阶段学到的参数知识来生成回答那么 RAG 更强调“先找资料再组织答案”。它把检索系统和生成模型结合起来让模型在回答问题前先从文档、数据库、网页、知识库或业务资料中取回相关片段再把这些片段放入上下文窗口作为生成答案的依据。因此RAG 常用于企业知识库问答、合同分析、论文问答、客服机器人、代码库问答、政策查询、医学资料检索、产品文档助手和私有数据问答中是理解大语言模型落地应用的重要基础概念。一、基本概念什么是 RAGRAG 是一种“检索 生成”的大语言模型应用方法。它的基本流程可以概括为用户问题 → 检索相关资料 → 放入上下文窗口 → 大语言模型生成答案图 1RAG 工作流程总览例如用户问这份合同中关于违约责任是怎么规定的如果直接让大语言模型回答它可能不知道这份合同的具体内容。RAG 的做法是先从合同文档中检索与“违约责任”相关的段落再把这些段落连同用户问题一起交给模型让模型基于检索到的内容回答。从通俗角度看RAG 像是给模型配了一个资料检索助手。模型不是凭空回答而是先翻资料再根据资料整理答案。RAG 中的三个关键词是• Retrieval检索找到与问题相关的资料• Augmented增强把检索内容作为额外上下文提供给模型• Generation生成由模型组织语言并回答问题因此RAG 不是一个单独的模型结构而是一种把外部知识和大语言模型结合起来的应用框架。二、为什么需要 RAGRAG 之所以重要是因为大语言模型虽然能力很强但仍然有明显边界。1、模型参数知识可能过时大语言模型的知识主要来自训练数据。如果某些信息在模型训练之后才出现模型参数中通常没有这些新信息。例如• 最新政策• 最新产品说明• 最新公司制度• 最新论文• 最新业务数据RAG 可以通过外部知识库实时检索把新资料提供给模型。2、模型不知道私有资料企业内部文档、合同、会议纪要、项目资料、客户记录通常不在模型训练数据中。如果不把这些资料提供给模型模型无法可靠回答相关问题。RAG 可以连接企业知识库让模型基于私有资料回答。3、减少凭空编造大语言模型可能在信息不足时生成看似合理但不真实的内容这通常称为幻觉。RAG 通过提供检索证据可以让模型更有依据地回答问题。从通俗角度看RAG 的价值不是让模型“更会猜”而是让模型“有资料可查”。4、突破上下文窗口限制外部知识库可能非常大不可能全部放进上下文窗口。RAG 的做法不是把整个知识库塞给模型而是根据问题只取回最相关的片段。这让模型可以在有限上下文窗口内使用大规模外部知识。三、RAG 的基本流程RAG 的基本流程通常包括五步准备知识库 → 切分文档 → 向量化与索引 → 检索相关片段 → 生成答案图 2RAG 的知识准备流程1、准备知识库知识库可以来自多种来源例如• PDF 文档• Word 文档• 网页内容• 产品手册• 合同文本• 论文资料• 数据库记录• 代码仓库说明这些资料需要先整理成可检索文本。从通俗角度看知识库就是 RAG 系统的“资料柜”。2、切分文档长文档通常不能直接作为一个整体检索和放入上下文。因此需要把文档切分成较小片段。例如完整文档 → 片段 1 → 片段 2 → 片段 3 → ...每个片段通常称为 chunk。chunk 的大小会影响检索效果。如果 chunk 太短可能缺少上下文。如果 chunk 太长可能包含太多无关内容。3、向量化与索引为了让系统能根据语义相似性检索内容通常会把每个文档片段转换成向量。这个过程称为 embedding。可以简单表示为其中• chunk 表示文档片段• v 表示该片段的向量表示然后这些向量会被存入向量索引或向量数据库中便于快速检索。4、检索相关片段当用户提出问题时系统也会把问题转换成向量其中• query 表示用户问题• q 表示问题向量然后系统计算问题向量与文档片段向量之间的相似度选出最相关的若干片段。常见相似度计算方式之一是余弦相似度其中• q 表示问题向量• v 表示文档片段向量• q · v 表示点积• ‖q‖ 和 ‖v‖ 表示向量长度cosine(q, v) 越大通常表示语义越相近。5、生成答案检索到相关片段后系统会把它们与用户问题一起组织成提示词交给大语言模型生成答案。可以概括为问题 相关片段 → 大语言模型 → 答案从通俗角度看检索负责“找材料”生成负责“组织表达”。四、RAG 与上下文窗口的关系RAG 与上下文窗口关系非常密切。上下文窗口是模型一次能够看到的最大 token 范围。外部知识库可能很大但模型不能一次读取全部内容。因此RAG 的核心做法是只把当前问题最相关的内容放进上下文窗口。可以简单表示为大知识库 → 检索筛选 → 少量相关片段 → 上下文窗口 → 生成答案从通俗角度看上下文窗口像模型当前的工作台RAG 像从资料柜中挑出最相关文件放到工作台上。这意味着• RAG 不是把整个知识库塞进模型• RAG 依赖检索质量• 放入窗口的片段要足够相关• 片段数量不能无限增加• 需要为模型输出预留 token 空间如果上下文窗口被无关片段占满模型可能反而更难回答。因此RAG 的关键不是“放得越多越好”而是“放得越准越好”。五、RAG 中的切分、Embedding 与向量检索RAG 的效果很大程度取决于文档切分和检索质量。1、文档切分文档切分的目标是把长文档拆成适合检索和放入上下文窗口的片段。常见切分方式包括• 按固定长度切分• 按段落切分• 按标题层级切分• 按语义结构切分• 按代码函数或类切分例如一份产品手册可以按章节和小节切分。一份代码文档可以按模块、函数或类切分。从通俗角度看切分不是随便剪开文本而是尽量让每个片段保持完整含义。2、Embedding 表示每个片段会被转换成向量表示。如果两个片段语义相近它们在向量空间中的距离通常更近。例如“违约责任条款”“合同解除后的赔偿责任”这两个片段虽然字面不同但语义可能相关向量检索有机会把它们关联起来。3、向量检索向量检索会根据用户问题找到语义相近的文档片段。例如用户问离职后还能使用公司资料吗系统可能检索到• 保密义务条款• 离职交接规定• 数据安全制度• 知识产权归属说明这说明向量检索不只是关键词匹配而是尝试根据语义相关性找资料。不过向量检索也不是万能的。如果问题表达模糊、文档切分不合理、Embedding 模型不适配领域检索结果可能不准确。六、RAG 的常见增强方式基础 RAG 流程比较简单但真实应用中通常需要增强检索和生成质量。1、关键词检索与向量检索结合向量检索擅长语义相似但有时会漏掉精确关键词。关键词检索擅长精确匹配但不理解深层语义。因此实际系统中常使用混合检索关键词检索 向量检索 → 合并候选片段例如查询合同条款编号、产品型号、函数名、法律条文时关键词检索非常重要。2、重排序初步检索可能返回很多候选片段。重排序会进一步判断哪些片段最适合作为回答依据。可以理解为• 粗检索先找一批可能相关的片段• 重排序再挑出最相关的片段从通俗角度看检索像“海选”重排序像“复筛”。3、查询改写用户问题有时比较口语化、模糊或缺少关键词。查询改写会把用户问题改写成更适合检索的形式。例如用户问题这个能退吗改写后产品退货条件、退款规则、售后政策这有助于检索系统找到更相关资料。4、引用来源为了提高可信度RAG 系统通常会在答案中附上来源片段、文档标题或页码。这可以让用户检查答案依据。从实践角度看RAG 最好不仅给答案还要给证据。七、RAG 与微调的区别RAG 经常和微调一起被比较。二者都可以让模型更适合特定任务但方式不同。图 3RAG 与微调的区别1、RAG把知识放在外部RAG 不一定改变模型参数。它通过检索外部资料把相关内容放入上下文窗口让模型基于这些内容回答。从通俗角度看RAG 是让模型“开卷考试”。它适合• 知识经常变化• 文档很多• 需要可追溯来源• 企业私有知识问答• 不希望频繁训练模型2、微调把能力写进参数微调会继续训练模型参数让模型更适合某类任务、语气、格式或领域表达。从通俗角度看微调是让模型“专项训练”。它适合• 固定输出格式• 特定任务风格• 专业表达习惯• 分类、抽取等稳定任务• 想让模型内化某种行为模式3、二者可以结合RAG 和微调不是互斥关系。很多系统会同时使用• 微调让模型更会按要求回答• RAG让模型回答时有最新资料依据从通俗角度看微调提升模型“答题方式”RAG 提供“答题资料”。如果问题是“模型不知道某份新文档内容”通常优先考虑 RAG。如果问题是“模型不会按固定格式输出”可以考虑微调或提示词工程。八、RAG 的优势、局限与使用注意事项1、RAG 的主要优势RAG 最大的优势是可以利用外部知识。它让模型不必只依赖训练时记住的知识而可以基于当前检索到的资料回答。其次RAG 适合知识更新。文档更新后只要更新索引或知识库模型就可以检索到新内容。再次RAG 便于溯源。答案可以附带来源片段让用户知道结论来自哪里。从通俗角度看RAG 的优势在于它让大语言模型从“闭卷回答”变成“带资料回答”。2、RAG 的主要局限RAG 也有局限。首先检索错了答案就容易错。如果相关片段没有被检索到模型可能无法正确回答。其次检索到了不等于模型一定用得好。如果上下文很长、片段冲突或信息组织混乱模型仍可能误解。再次RAG 对文档质量依赖很强。如果原始文档过时、错误、重复或结构混乱系统回答也会受到影响。此外RAG 不等于完全消除幻觉。它可以降低幻觉风险但不能保证模型永远忠实引用资料。3、使用 RAG 时需要注意的问题使用 RAG 时需要注意• 文档切分要尽量保持语义完整• 检索结果要与问题高度相关• chunk 过短会丢上下文过长会引入噪声• 关键词检索和向量检索可以结合使用• 重要场景应提供引用来源• 文档更新后要同步更新索引• 对冲突资料要提示不确定性• 不要把整个知识库直接塞进上下文窗口• 需要让模型明确“基于资料回答不要编造”从实践角度看RAG 的质量取决于整个链路而不仅仅取决于大语言模型本身。九、Python 示例下面给出一个极简 RAG 思路示例用来帮助理解它的基本流程。示例 1用关键词模拟简单检索# 文档列表企业内部规定等documents [ 公司规定员工离职后不得继续使用内部资料。, 产品支持 7 天无理由退货但定制商品除外。, 合同违约方应承担相应赔偿责任。, 报销申请应在费用发生后 30 天内提交。] # 用户查询问题query 离职后还能使用公司资料吗 # 提取查询中的关键词模拟实际会用分词/向量keywords [离职, 资料] results [] # 遍历文档计算关键词命中次数作为相关性分数for doc in documents: score sum(keyword in doc for keyword in keywords) # 每个关键词在文档中出现则1 if score 0: # 只保留有命中的文档 results.append((score, doc)) # 按分数降序排序分数高表示相关性高results sorted(results, reverseTrue) # 输出检索结果for score, doc in results: print(score, doc)这个例子只是演示用户问题 → 找相关文档片段真实 RAG 系统通常不会只靠简单关键词而会使用 embedding、向量数据库和重排序等方法。示例 2模拟把检索结果放入提示词# 用户查询query 离职后还能使用公司资料吗 # 检索到的相关文档实际可能来自搜索系统retrieved_docs [ 公司规定员工离职后不得继续使用内部资料。, 离职员工应完成资料交接并删除个人设备中的公司文件。] # 将多个文档拼接成上下文添加编号context \n.join( f资料 {i 1}{doc} for i, doc in enumerate(retrieved_docs)) # 构建提示词要求模型仅基于提供资料回答不足则说明无法判断prompt f请只根据下面资料回答问题。如果资料不足请说明无法判断。 {context} 问题{query} # 打印提示词实际会将此提示送入大模型print(prompt)这个例子展示了 RAG 中常见的提示词组织方式检索资料 用户问题 回答要求其中“只根据资料回答”可以降低模型凭空发挥的风险。示例 3模拟向量检索的流程下面示例只展示流程不实现真实 embedding 模型。# 真实系统中embed(text) 会调用 embedding 模型如 Sentence-BERT将文本转为向量def embed(text): # 这里只是占位函数用于说明流程实际应返回固定维度向量 return [0.1, 0.2, 0.3] # 计算两个向量的余弦相似度def cosine_similarity(a, b): dot sum(x * y for x, y in zip(a, b)) # 点积 norm_a sum(x * x for x in a) ** 0.5 # 向量a的模长 norm_b sum(y * y for y in b) ** 0.5 # 向量b的模长 return dot / (norm_a * norm_b) # 余弦值 # 文档片段库实际应分块存储chunks [ 员工离职后不得继续使用内部资料。, 产品支持 7 天无理由退货。, 合同违约方应承担赔偿责任。] # 用户查询query 离职后还能使用公司资料吗 # 将查询文本转为向量query_vec embed(query) # 计算每个文档片段与查询的相似度scored_chunks []for chunk in chunks: chunk_vec embed(chunk) # 文档片段向量 score cosine_similarity(query_vec, chunk_vec) # 相似度分数 scored_chunks.append((score, chunk)) # 按相似度降序排序取前2个最相关的片段top_chunks sorted(scored_chunks, reverseTrue)[:2] print(top_chunks)真实 RAG 系统中• embed(query) 会生成问题向量• embed(chunk) 会生成片段向量• 系统会从大量片段中快速找出相似度最高的内容• 通常还会加入重排序、过滤和引用来源示例 4在 token 预算内选择片段# 检索到的文本片段含 token 数和相关性分数retrieved_chunks [ {text: 片段 A违约责任条款……, tokens: 300, score: 0.91}, {text: 片段 B合同解除规定……, tokens: 500, score: 0.86}, {text: 片段 C无关背景资料……, tokens: 900, score: 0.40}, {text: 片段 D赔偿范围说明……, tokens: 350, score: 0.82},] # 上下文 token 预算限制总长度context_budget 900used 0selected [] # 按分数降序排序优先选择高分片段for chunk in sorted(retrieved_chunks, keylambda x: x[score], reverseTrue): # 如果加入当前片段不超过预算则选取 if used chunk[tokens] context_budget: selected.append(chunk) used chunk[tokens] print(选入上下文的片段)for chunk in selected: print(chunk[text]) print(已用 token, used)这个例子说明RAG 需要在有限上下文窗口中选择片段。并不是检索到的内容都要放进去而是优先放入相关性高、信息密度高的片段。 小结RAG 是“检索增强生成”的方法它让大语言模型先从外部知识库中检索相关资料再基于这些资料生成答案。它适合企业知识库问答、长文档分析、私有资料查询和需要可追溯来源的场景。对初学者而言可以把 RAG 理解为让模型从“闭卷答题”变成“先查资料再答题”。“点赞有美意赞赏是鼓励”
AI 术语通俗词典:RAG
RAG 是大语言模型、自然语言处理、知识问答、智能客服、企业知识库和 AI 应用开发中非常重要的一个术语全称是 Retrieval-Augmented Generation通常翻译为“检索增强生成”。它用来描述一种让大语言模型先从外部资料中检索相关内容再基于这些内容生成答案的方法。换句话说RAG 是在回答模型怎样在不完全依赖自身参数记忆的情况下利用外部知识回答问题。如果说普通大语言模型主要依靠训练阶段学到的参数知识来生成回答那么 RAG 更强调“先找资料再组织答案”。它把检索系统和生成模型结合起来让模型在回答问题前先从文档、数据库、网页、知识库或业务资料中取回相关片段再把这些片段放入上下文窗口作为生成答案的依据。因此RAG 常用于企业知识库问答、合同分析、论文问答、客服机器人、代码库问答、政策查询、医学资料检索、产品文档助手和私有数据问答中是理解大语言模型落地应用的重要基础概念。一、基本概念什么是 RAGRAG 是一种“检索 生成”的大语言模型应用方法。它的基本流程可以概括为用户问题 → 检索相关资料 → 放入上下文窗口 → 大语言模型生成答案图 1RAG 工作流程总览例如用户问这份合同中关于违约责任是怎么规定的如果直接让大语言模型回答它可能不知道这份合同的具体内容。RAG 的做法是先从合同文档中检索与“违约责任”相关的段落再把这些段落连同用户问题一起交给模型让模型基于检索到的内容回答。从通俗角度看RAG 像是给模型配了一个资料检索助手。模型不是凭空回答而是先翻资料再根据资料整理答案。RAG 中的三个关键词是• Retrieval检索找到与问题相关的资料• Augmented增强把检索内容作为额外上下文提供给模型• Generation生成由模型组织语言并回答问题因此RAG 不是一个单独的模型结构而是一种把外部知识和大语言模型结合起来的应用框架。二、为什么需要 RAGRAG 之所以重要是因为大语言模型虽然能力很强但仍然有明显边界。1、模型参数知识可能过时大语言模型的知识主要来自训练数据。如果某些信息在模型训练之后才出现模型参数中通常没有这些新信息。例如• 最新政策• 最新产品说明• 最新公司制度• 最新论文• 最新业务数据RAG 可以通过外部知识库实时检索把新资料提供给模型。2、模型不知道私有资料企业内部文档、合同、会议纪要、项目资料、客户记录通常不在模型训练数据中。如果不把这些资料提供给模型模型无法可靠回答相关问题。RAG 可以连接企业知识库让模型基于私有资料回答。3、减少凭空编造大语言模型可能在信息不足时生成看似合理但不真实的内容这通常称为幻觉。RAG 通过提供检索证据可以让模型更有依据地回答问题。从通俗角度看RAG 的价值不是让模型“更会猜”而是让模型“有资料可查”。4、突破上下文窗口限制外部知识库可能非常大不可能全部放进上下文窗口。RAG 的做法不是把整个知识库塞给模型而是根据问题只取回最相关的片段。这让模型可以在有限上下文窗口内使用大规模外部知识。三、RAG 的基本流程RAG 的基本流程通常包括五步准备知识库 → 切分文档 → 向量化与索引 → 检索相关片段 → 生成答案图 2RAG 的知识准备流程1、准备知识库知识库可以来自多种来源例如• PDF 文档• Word 文档• 网页内容• 产品手册• 合同文本• 论文资料• 数据库记录• 代码仓库说明这些资料需要先整理成可检索文本。从通俗角度看知识库就是 RAG 系统的“资料柜”。2、切分文档长文档通常不能直接作为一个整体检索和放入上下文。因此需要把文档切分成较小片段。例如完整文档 → 片段 1 → 片段 2 → 片段 3 → ...每个片段通常称为 chunk。chunk 的大小会影响检索效果。如果 chunk 太短可能缺少上下文。如果 chunk 太长可能包含太多无关内容。3、向量化与索引为了让系统能根据语义相似性检索内容通常会把每个文档片段转换成向量。这个过程称为 embedding。可以简单表示为其中• chunk 表示文档片段• v 表示该片段的向量表示然后这些向量会被存入向量索引或向量数据库中便于快速检索。4、检索相关片段当用户提出问题时系统也会把问题转换成向量其中• query 表示用户问题• q 表示问题向量然后系统计算问题向量与文档片段向量之间的相似度选出最相关的若干片段。常见相似度计算方式之一是余弦相似度其中• q 表示问题向量• v 表示文档片段向量• q · v 表示点积• ‖q‖ 和 ‖v‖ 表示向量长度cosine(q, v) 越大通常表示语义越相近。5、生成答案检索到相关片段后系统会把它们与用户问题一起组织成提示词交给大语言模型生成答案。可以概括为问题 相关片段 → 大语言模型 → 答案从通俗角度看检索负责“找材料”生成负责“组织表达”。四、RAG 与上下文窗口的关系RAG 与上下文窗口关系非常密切。上下文窗口是模型一次能够看到的最大 token 范围。外部知识库可能很大但模型不能一次读取全部内容。因此RAG 的核心做法是只把当前问题最相关的内容放进上下文窗口。可以简单表示为大知识库 → 检索筛选 → 少量相关片段 → 上下文窗口 → 生成答案从通俗角度看上下文窗口像模型当前的工作台RAG 像从资料柜中挑出最相关文件放到工作台上。这意味着• RAG 不是把整个知识库塞进模型• RAG 依赖检索质量• 放入窗口的片段要足够相关• 片段数量不能无限增加• 需要为模型输出预留 token 空间如果上下文窗口被无关片段占满模型可能反而更难回答。因此RAG 的关键不是“放得越多越好”而是“放得越准越好”。五、RAG 中的切分、Embedding 与向量检索RAG 的效果很大程度取决于文档切分和检索质量。1、文档切分文档切分的目标是把长文档拆成适合检索和放入上下文窗口的片段。常见切分方式包括• 按固定长度切分• 按段落切分• 按标题层级切分• 按语义结构切分• 按代码函数或类切分例如一份产品手册可以按章节和小节切分。一份代码文档可以按模块、函数或类切分。从通俗角度看切分不是随便剪开文本而是尽量让每个片段保持完整含义。2、Embedding 表示每个片段会被转换成向量表示。如果两个片段语义相近它们在向量空间中的距离通常更近。例如“违约责任条款”“合同解除后的赔偿责任”这两个片段虽然字面不同但语义可能相关向量检索有机会把它们关联起来。3、向量检索向量检索会根据用户问题找到语义相近的文档片段。例如用户问离职后还能使用公司资料吗系统可能检索到• 保密义务条款• 离职交接规定• 数据安全制度• 知识产权归属说明这说明向量检索不只是关键词匹配而是尝试根据语义相关性找资料。不过向量检索也不是万能的。如果问题表达模糊、文档切分不合理、Embedding 模型不适配领域检索结果可能不准确。六、RAG 的常见增强方式基础 RAG 流程比较简单但真实应用中通常需要增强检索和生成质量。1、关键词检索与向量检索结合向量检索擅长语义相似但有时会漏掉精确关键词。关键词检索擅长精确匹配但不理解深层语义。因此实际系统中常使用混合检索关键词检索 向量检索 → 合并候选片段例如查询合同条款编号、产品型号、函数名、法律条文时关键词检索非常重要。2、重排序初步检索可能返回很多候选片段。重排序会进一步判断哪些片段最适合作为回答依据。可以理解为• 粗检索先找一批可能相关的片段• 重排序再挑出最相关的片段从通俗角度看检索像“海选”重排序像“复筛”。3、查询改写用户问题有时比较口语化、模糊或缺少关键词。查询改写会把用户问题改写成更适合检索的形式。例如用户问题这个能退吗改写后产品退货条件、退款规则、售后政策这有助于检索系统找到更相关资料。4、引用来源为了提高可信度RAG 系统通常会在答案中附上来源片段、文档标题或页码。这可以让用户检查答案依据。从实践角度看RAG 最好不仅给答案还要给证据。七、RAG 与微调的区别RAG 经常和微调一起被比较。二者都可以让模型更适合特定任务但方式不同。图 3RAG 与微调的区别1、RAG把知识放在外部RAG 不一定改变模型参数。它通过检索外部资料把相关内容放入上下文窗口让模型基于这些内容回答。从通俗角度看RAG 是让模型“开卷考试”。它适合• 知识经常变化• 文档很多• 需要可追溯来源• 企业私有知识问答• 不希望频繁训练模型2、微调把能力写进参数微调会继续训练模型参数让模型更适合某类任务、语气、格式或领域表达。从通俗角度看微调是让模型“专项训练”。它适合• 固定输出格式• 特定任务风格• 专业表达习惯• 分类、抽取等稳定任务• 想让模型内化某种行为模式3、二者可以结合RAG 和微调不是互斥关系。很多系统会同时使用• 微调让模型更会按要求回答• RAG让模型回答时有最新资料依据从通俗角度看微调提升模型“答题方式”RAG 提供“答题资料”。如果问题是“模型不知道某份新文档内容”通常优先考虑 RAG。如果问题是“模型不会按固定格式输出”可以考虑微调或提示词工程。八、RAG 的优势、局限与使用注意事项1、RAG 的主要优势RAG 最大的优势是可以利用外部知识。它让模型不必只依赖训练时记住的知识而可以基于当前检索到的资料回答。其次RAG 适合知识更新。文档更新后只要更新索引或知识库模型就可以检索到新内容。再次RAG 便于溯源。答案可以附带来源片段让用户知道结论来自哪里。从通俗角度看RAG 的优势在于它让大语言模型从“闭卷回答”变成“带资料回答”。2、RAG 的主要局限RAG 也有局限。首先检索错了答案就容易错。如果相关片段没有被检索到模型可能无法正确回答。其次检索到了不等于模型一定用得好。如果上下文很长、片段冲突或信息组织混乱模型仍可能误解。再次RAG 对文档质量依赖很强。如果原始文档过时、错误、重复或结构混乱系统回答也会受到影响。此外RAG 不等于完全消除幻觉。它可以降低幻觉风险但不能保证模型永远忠实引用资料。3、使用 RAG 时需要注意的问题使用 RAG 时需要注意• 文档切分要尽量保持语义完整• 检索结果要与问题高度相关• chunk 过短会丢上下文过长会引入噪声• 关键词检索和向量检索可以结合使用• 重要场景应提供引用来源• 文档更新后要同步更新索引• 对冲突资料要提示不确定性• 不要把整个知识库直接塞进上下文窗口• 需要让模型明确“基于资料回答不要编造”从实践角度看RAG 的质量取决于整个链路而不仅仅取决于大语言模型本身。九、Python 示例下面给出一个极简 RAG 思路示例用来帮助理解它的基本流程。示例 1用关键词模拟简单检索# 文档列表企业内部规定等documents [ 公司规定员工离职后不得继续使用内部资料。, 产品支持 7 天无理由退货但定制商品除外。, 合同违约方应承担相应赔偿责任。, 报销申请应在费用发生后 30 天内提交。] # 用户查询问题query 离职后还能使用公司资料吗 # 提取查询中的关键词模拟实际会用分词/向量keywords [离职, 资料] results [] # 遍历文档计算关键词命中次数作为相关性分数for doc in documents: score sum(keyword in doc for keyword in keywords) # 每个关键词在文档中出现则1 if score 0: # 只保留有命中的文档 results.append((score, doc)) # 按分数降序排序分数高表示相关性高results sorted(results, reverseTrue) # 输出检索结果for score, doc in results: print(score, doc)这个例子只是演示用户问题 → 找相关文档片段真实 RAG 系统通常不会只靠简单关键词而会使用 embedding、向量数据库和重排序等方法。示例 2模拟把检索结果放入提示词# 用户查询query 离职后还能使用公司资料吗 # 检索到的相关文档实际可能来自搜索系统retrieved_docs [ 公司规定员工离职后不得继续使用内部资料。, 离职员工应完成资料交接并删除个人设备中的公司文件。] # 将多个文档拼接成上下文添加编号context \n.join( f资料 {i 1}{doc} for i, doc in enumerate(retrieved_docs)) # 构建提示词要求模型仅基于提供资料回答不足则说明无法判断prompt f请只根据下面资料回答问题。如果资料不足请说明无法判断。 {context} 问题{query} # 打印提示词实际会将此提示送入大模型print(prompt)这个例子展示了 RAG 中常见的提示词组织方式检索资料 用户问题 回答要求其中“只根据资料回答”可以降低模型凭空发挥的风险。示例 3模拟向量检索的流程下面示例只展示流程不实现真实 embedding 模型。# 真实系统中embed(text) 会调用 embedding 模型如 Sentence-BERT将文本转为向量def embed(text): # 这里只是占位函数用于说明流程实际应返回固定维度向量 return [0.1, 0.2, 0.3] # 计算两个向量的余弦相似度def cosine_similarity(a, b): dot sum(x * y for x, y in zip(a, b)) # 点积 norm_a sum(x * x for x in a) ** 0.5 # 向量a的模长 norm_b sum(y * y for y in b) ** 0.5 # 向量b的模长 return dot / (norm_a * norm_b) # 余弦值 # 文档片段库实际应分块存储chunks [ 员工离职后不得继续使用内部资料。, 产品支持 7 天无理由退货。, 合同违约方应承担赔偿责任。] # 用户查询query 离职后还能使用公司资料吗 # 将查询文本转为向量query_vec embed(query) # 计算每个文档片段与查询的相似度scored_chunks []for chunk in chunks: chunk_vec embed(chunk) # 文档片段向量 score cosine_similarity(query_vec, chunk_vec) # 相似度分数 scored_chunks.append((score, chunk)) # 按相似度降序排序取前2个最相关的片段top_chunks sorted(scored_chunks, reverseTrue)[:2] print(top_chunks)真实 RAG 系统中• embed(query) 会生成问题向量• embed(chunk) 会生成片段向量• 系统会从大量片段中快速找出相似度最高的内容• 通常还会加入重排序、过滤和引用来源示例 4在 token 预算内选择片段# 检索到的文本片段含 token 数和相关性分数retrieved_chunks [ {text: 片段 A违约责任条款……, tokens: 300, score: 0.91}, {text: 片段 B合同解除规定……, tokens: 500, score: 0.86}, {text: 片段 C无关背景资料……, tokens: 900, score: 0.40}, {text: 片段 D赔偿范围说明……, tokens: 350, score: 0.82},] # 上下文 token 预算限制总长度context_budget 900used 0selected [] # 按分数降序排序优先选择高分片段for chunk in sorted(retrieved_chunks, keylambda x: x[score], reverseTrue): # 如果加入当前片段不超过预算则选取 if used chunk[tokens] context_budget: selected.append(chunk) used chunk[tokens] print(选入上下文的片段)for chunk in selected: print(chunk[text]) print(已用 token, used)这个例子说明RAG 需要在有限上下文窗口中选择片段。并不是检索到的内容都要放进去而是优先放入相关性高、信息密度高的片段。 小结RAG 是“检索增强生成”的方法它让大语言模型先从外部知识库中检索相关资料再基于这些资料生成答案。它适合企业知识库问答、长文档分析、私有资料查询和需要可追溯来源的场景。对初学者而言可以把 RAG 理解为让模型从“闭卷答题”变成“先查资料再答题”。“点赞有美意赞赏是鼓励”