构建可在生产环境中正常运行的RAG系统
可用于实际生产的RAG系统:文档导入、分块处理、嵌入生成、向量数据库、检索功能,以及始终以原始资料为依据的LLM生成功能。
可将此文档视为《构建真正能在生产环境中运行的RAG系统》中内容的面向操作人员的重构版本:清晰的阶段划分、有序的代码模块,以及便于交接时参考的恢复说明。 在“概览”阶段,若能将其视为可量化的基准,则效果最佳。在扩大范围之前,需记录一份最优处理方案、一个故障案例以及回滚说明。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,绝不允许出现无声的、不完整的处理结果。
什么是RAG?
在“什么是RAG”阶段,应在修改代码之前明确输入内容、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。必须注明实际用于生成答案的文本片段;没有引用的话,操作人员就无法区分幻觉内容与索引缺失导致的错误。
可在生产环境中使用的RAG架构
在采用 RAG 架构的阶段,应在修改代码之前明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,这样操作人员无需查看整个系统结构即可进行审核。 需注明实际作为答案依据的段落。如果没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
1. 从文档导入开始
在“从文档开始”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的内容。 必须引用那些真正作为答案依据的段落。如果没有引用,操作人员就无法区分是虚假信息还是索引缺失导致的错误。 在“从文档开始”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功判定标准,并杜绝默默完成部分任务的情况。
生产环境数据接入流程
在处理生产环境数据接入流程阶段时,首先明确相关规范:所需的输入参数、成功标识以及部分失败时的处理方式。这样的清单能确保后续的代码修改始终符合要求。 在功能结果旁记录处理时间以及令牌或查询成本。提前了解成本情况,可避免从演示环境过渡到共享环境时出现意外费用。 在调整提示词之前,先使用固定的问题集测试召回率。仅仅更换提示词往往无法改善较差的检索效果。
2. 分块处理的重要性超出想象
在完成“分块更高效”这一阶段时,首先需列出相关规范:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 应将配置信息与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中于一个位置,这样操作人员无需查看整个系统结构即可进行审计。 在调整提示词之前,需先用固定的问题集来测试召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。
3. 嵌入模型并非魔法
在处理“3个嵌入向量不可用”这一阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品功能的一部分,而非后续需要补充的内容。 在调整提示词之前,先使用固定的问题集来衡量检索的召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。 在处理“3个嵌入向量不可用”这一阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将这一阶段视为输入与经过验证的输出之间的契约。为相关产物命名,定义成功判定标准,并杜绝无声的半完成状态。
4. 单纯使用向量搜索并不总是足够
将“仅向量搜索”阶段视为可度量的指标体系时,其效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。在功能结果旁同时记录处理时间以及令牌或查询成本。提前了解成本情况,就能避免在从演示环境过渡到共享环境时出现意外费用。应将分块策略与检索策略分开,当质量指标发生变化时,修改其中一项无需强制重写另一项。
5. 重新排序能带来巨大差异
将“5次重新排序”视为可度量的指标时,该阶段才能发挥最佳作用。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。 将配置置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放于一处,这样操作人员无需查看整个系统结构即可进行审计。 将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
6. 上下文工程至关重要
将“6个上下文工程关键阶段”视为可度量的对象来处理时效果最佳。在扩大范围之前,先记录一份理想案例、一个故障实例以及回滚说明。 同时记录正常流程与恢复流程。重试机制、人工审核环节以及死信处理都是产品本身的一部分,而非后续需要补充的内容。 将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。 将“6个上下文工程关键阶段”视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,杜绝默默完成部分任务的情况。
Top 10 chunks → LLM
Top 50 candidates
↓
Reranking
↓
Filtering
↓
Deduplication
↓
Context compression
↓
Top relevant context
↓
LLM
7. LLM的基准设定
在“为大语言模型奠定基础”的第7阶段,修改代码之前需明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。当下一步操作是编写代码或调用工具时,应优先选择具有架构验证的结构化输出,而非自由形式的文字描述。
Answer using only the provided context.
If the context does not contain enough information
to answer the question, say that the information
is unavailable.Do not invent facts.When possible, cite the source used to answer.
8. 引用功能远不止是用户界面特性
在“8次引用更多”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审核。 需注明实际作为答案依据的段落。如果没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
9. 在数据检索之前必须建立访问控制
对于9个访问控制必须阶段,在修改代码之前需明确输入参数、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和故障恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的内容。 必须引用实际作为答案依据的段落。如果没有引用,操作人员就无法区分是虚假信息还是索引缺失导致的错误。 对于9个访问控制必须阶段,在修改代码之前需明确输入参数、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功判定标准,并杜绝默许部分完成的情况。
Public Documents
Internal Documents
Finance Documents
HR Documents
Executive Documents
Legal Document
User
↓
Search Everything
↓
LLM
↓
Filter response
User Identity
↓
Permissions
↓
Filtered Retrieval
↓
Relevant Documents
↓
LLM
10. RAG评估是缺失的一环
在处理“10 RAG评估”这一阶段时,首先需明确相关要求:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改始终符合预期。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在调整提示词之前,先使用固定的问题集来测试召回率。仅仅更换提示词往往无法改善较差的检索效果。
检索评估
在进行检索评估阶段时,首先列出相关规范:所需输入、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改不会偏离原有设计。 将配置信息置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放,以便操作人员无需查看整个系统结构即可进行审计。 在调整提示词之前,先使用固定的问题集来衡量召回率。仅仅更换提示词很难改善较差的检索效果。
生成式评估
在进行生成式模型评估阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合初始要求。 同时记录正常流程与异常恢复路径。重试机制、人工审核环节以及错误处理方式都是产品本身的组成部分,而非后续需要补充的功能。 在调整提示词之前,先使用固定的问题集来衡量模型的召回率。仅仅更换提示词往往无法解决模型检索能力薄弱的问题。 在进行生成式模型评估阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合初始要求。 应将这一阶段视为输入与经过验证的输出之间的契约。为相关输出命名,定义成功判定标准,绝不允许出现无声无息的部分完成情况。
11. 构建真实的评估数据集
将“11 构建真实场景”视为可度量的对象使用效果最佳。在扩大范围之前,先记录一份优秀的测试用例、一个失败案例以及回滚说明。在功能结果旁同时记录执行时间以及令牌或查询成本。提前了解成本情况,就能避免在从演示环境过渡到共享环境时出现意外费用。应将分块策略与检索策略分开处理,当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
Question
Expected Answer
Relevant Document
Relevant Chunk
Difficulty
Category
500–1,000 representative questions
12. 可观测性至关重要
将“可观测性至关重要”这一阶段视为可度量的对象来处理效果最佳。在扩大范围之前,先收集一份典型的日志记录、一个故障案例以及回滚说明。 将配置信息与应用程序代码分开。环境文件、密钥存储和功能开关应集中存放于一处,这样操作人员无需查看整个系统结构即可进行审计。 将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
User Query
↓
Query Transformation
↓
Retriever
↓
Retrieved Documents
↓
Similarity Scores
↓
Reranker
↓
Final Context
↓
Prompt
↓
LLM
↓
Final Response
13. 延迟与成本很重要
将“13延迟与成本”阶段视为可测量的指标体系时,其效果最佳。在扩大范围之前,需记录一份理想状态下的处理结果、一个故障案例以及回滚说明。同时文档化正常流程与恢复流程,重试机制、人工审核环节以及死信处理都属于产品功能的一部分,而非后续需要补充的内容。应将分块策略与检索策略分开,当质量指标发生变化时,修改其中一项不应强制要求重新编写另一项。将此阶段视为输入与经过验证的输出之间的契约,为相关成果命名,明确成功标准,杜绝默默完成部分任务的情况。
Quality
↕
Latency
↕
Cost
14. 将数据摄取管道与查询管道分开
对于需要持续处理和分阶段的14项任务,在修改代码之前需明确输入内容、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。应在功能结果旁记录处理时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。需注明实际作为答案依据的段落;没有引用的话,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
离线处理
在离线数据导入阶段,应在修改代码之前明确输入内容、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储和功能标志应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审核。 需注明实际作为答案依据的段落。如果没有引用,操作人员就无法区分是虚假信息还是索引缺失导致的问题。
Documents
↓
Parsing
↓
Cleaning
↓
Chunking
↓
Metadata
↓
Embeddings
↓
Index
在线查询
在在线查询阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程与异常恢复流程。重试机制、人工审核环节以及错误处理都是产品功能的一部分,而非后续需要补充的内容。 必须引用能够支撑答案的原文段落。没有引用依据的话,操作员就无法区分是虚假信息还是索引缺失导致的错误。
User
↓
Query
↓
Retrieval
↓
Reranking
↓
Context
↓
LLM
↓
Response
在在线查询阶段,修改代码之前需明确输入参数、该步骤的负责人以及终止标准。操作员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将这一阶段视为输入与经过验证的输出之间的契约。为相关输出文件命名,明确成功判定标准,并杜绝默许部分完成的情况。
15. 不要忽视文档版本控制
在完成“15. 不要忽视”这一阶段时,首先需明确合同的各项要求:所需输入、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在调整提示词之前,先使用固定的问题集测试检索效果。仅仅更换提示词往往无法改善较差的检索性能。
{
"document": "refund-policy",
"version": "2026.2",
"effective_date": "2026-06-01",
"status": "active"
}
16. RAG常见的错误
在处理16个常见的RAG错误时,首先写下相关规范:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将配置信息与应用程序代码分开存放。环境文件、密钥存储以及功能开关应集中于一个位置,这样操作人员无需查看整个系统结构即可进行审计。 在调整提示词之前,先使用固定的问题集来测试召回率。仅仅更换提示词很难解决检索效果不佳的问题。
“把所有内容都存入向量数据库就行了。”
在处理“Just put everything in stage”时,首先要写下接口规范:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品功能的一部分,而非后续需要补充的内容。 在调整提示词之前,先使用固定的问题集来测试召回率。仅仅更换提示词很难解决检索效果不佳的问题。 在处理“Just put everything in stage”时,首先要写下接口规范:所需的输入参数、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 将这一阶段视为输入与经过验证的输出之间的契约。为相关产物命名,明确成功判定标准,绝不允许出现无声的、不完整的处理结果。
“使用更大的数据块大小。”
将“使用更大数据块”这一阶段视为可度量的指标时效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。在功能结果旁同时记录处理时间以及令牌或查询成本。提前了解成本情况,就能避免在系统从演示环境过渡到共享环境时出现意外费用。应将数据分块策略与检索策略分开,当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
“大语言模型会自行解决。”
将大语言模型视为可度量的对象时,其阶段化开发效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。 将配置信息置于应用程序代码之外。环境文件、密钥存储和功能开关应集中存放,以便操作人员无需查看整个系统结构即可进行审计。 为每轮对话和每次会话设定token预算。智能代理工具往往会大量消耗上下文资源,设置上限可避免演示过程变成意外的费用账单。
“向量搜索就足够了。”
将向量搜索视为可度量的对象时,它在当前阶段表现最佳。在扩大范围之前,需记录一个理想案例、一个失败案例以及回滚说明。 同时记录正常流程与恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的内容。 应将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。 将向量搜索视为可度量的对象时,它在当前阶段表现最佳。在扩大范围之前,需记录一个理想案例、一个失败案例以及回滚说明。 应将这一阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,绝不允许出现无声的、不完整的处理结果。
“我们会手动进行评估。”
在“我们将手动评估”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。除了功能结果外,还需记录执行时间以及令牌或查询成本。提前显示成本信息,可避免在从演示环境切换到共享环境时出现意外费用。必须注明实际作为答案依据的段落;没有引用的话,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
“引用可以稍后添加。”
在修改代码之前,应先为引用添加相关阶段,明确输入内容、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,这样操作人员无需查看整个系统结构即可进行审核。 需注明真正作为答案依据的段落。如果没有引用,操作人员就无法区分是幻觉内容还是索引缺失导致的错误。
“安全性可以在用户界面层处理。”
在“安全性可处理”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程与故障恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的内容。 必须引用实际作为答案依据的段落。没有引用的话,操作人员就无法区分是虚假信息还是索引缺失导致的错误。 在“安全性可处理”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功判定标准,并杜绝默许部分完成的情况。
“提供更多上下文总是更好的选择。”
在处理“提供更多上下文”这一阶段时,首先需写下相关约定:所需的输入参数、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 在功能结果旁记录执行时间以及令牌或查询成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。 在调整提示词之前,先使用固定的问题集测试召回率。仅仅更换提示词往往无法改善较差的检索效果。
可用于生产环境的RAG架构蓝图
在完成“可投入生产的RAG蓝图”阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改始终符合预期。 应将配置信息与应用程序代码分开。环境文件、密钥存储以及功能开关应集中存放于一处,这样操作人员无需查看整个系统结构即可进行审计。 在调整提示词之前,先使用固定的问题集来测试召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。
Documents
↓
Parsing
↓
Cleaning
↓
Metadata
↓
Chunking
↓
Embedding
↓
Vector / Search Index
RAG生产环境检查清单
在处理RAG生产检查清单阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 同时记录正常流程与故障恢复流程。重试机制、人工审核环节以及错误处理方式都是产品本身的一部分,而非后续的优化工作。 在调整提示词之前,需先用固定的问题集来测试召回率。仅仅更换提示词往往无法解决检索效果不佳的问题。 在处理RAG生产检查清单阶段时,首先需明确相关约定:所需输入、成功标志以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 应将此阶段视为输入与经过验证的输出之间的契约。为相关成果命名,定义成功标准,绝不允许出现无声无息的部分完成情况。
数据
将数据阶段视为可度量的对象来处理时,其效果最佳。在扩大范围之前,先记录一份理想的转换结果、一个失败案例以及回滚说明。在功能结果旁同时记录处理时间以及令牌或查询成本。提前了解成本情况,就能避免在从演示环境过渡到共享环境时出现意外费用。应将分块策略与检索策略分开,当质量指标发生变化时,修改其中一项不应迫使重新编写另一项。
检索
将检索阶段视为可度量的对象来处理时,其效果最佳。在扩大范围之前,需记录一份理想输出样本、一个失败案例以及回滚说明。 配置应置于应用程序代码之外。环境文件、密钥存储和功能开关应集中存放,以便操作人员无需查看整个系统结构即可进行审计。 应将分块策略与检索策略分开。当质量指标发生变化时,修改其中一项不应强制要求重新编写另一项。
生成阶段
将生成阶段视为可度量的对象来处理时,其效果最佳。在扩大范围之前,需记录一份理想输出样本、一个失败案例以及回滚说明。 需同时记录正常流程和故障恢复流程。重试机制、人工审核环节以及错误处理方式都是产品的一部分,而非后续需要补充的内容。
安全性
评估
运营
总结
Documents + Embeddings + Vector Database + LLM = RAG