用 LangChain 快速搭建一个 RAG 演示原型并不难,但当你要把它推向真实的生产环境,服务成千上万的用户和百万级的文档时,真正的挑战才刚刚开始。从数据处理、检索质量到生成控制,每一步都隐藏着从实验室到生产线必然遭遇的“坑”。
1. 数据处理:RAG系统的“原料”天花板
决定一个 RAG 系统效果上限的,往往不是模型有多强大,而是你“喂”给它的数据质量有多高。原型阶段,我们可以用几份精心准备的 PDF 文档来演示,效果看起来不错。然而,真实业务中的数据远非如此理想。
首先,你需要面对格式的丛林。企业级知识库绝不会只有纯文本,PDF、Word、PPT、HTML、扫描件、Excel表格,甚至包含文字的图片,都是常见的数据源。每种格式的解析逻辑和工具链都不同,解析质量也参差不齐。PDF 尤其是个重灾区:文字版 PDF 尚可,扫描件 PDF 依赖 OCR 的准确性,而一旦遇到内嵌复杂表格或公式,多数解析工具都会束手无策,导致表格结构被拆得七零八落,严重影响后续的检索和生成质量。
其次,文本切块(Chunking)策略的抉择充满了权衡。你不可能把整本手册塞进 LLM 的有限上下文窗口,必须将文档切割成小块。但怎么切?固定长度切割简单粗暴,但可能将完整的句子或段落拦腰截断,丢失关键语境;按语义切割听起来合理,但如何定义“语义完整”的段落本身就是难题;对于表格数据,你更需要特殊处理,绝不能把表头和表体切成两个独立的块。实践中,我们往往需要为不同类型的文档设计不同的切块策略,反复调整块大小和重叠比例。
一个常被低估的隐形挑战是数据更新与同步。企业的知识库是动态变化的,文档会被修订、新增或删除。每次源数据变动后,如何同步更新向量数据库中的嵌入表示?如果一份文档已更新,但向量库中还残留着旧版本的片段,系统就会检索出过时的“垃圾”信息。构建一套可靠、高效的增量更新流水线,确保向量库与源数据的严格一致,本身就是一项不小的系统工程。

2. 检索质量:准确率、召回率与“噪声”的博弈
数据处理好了只是第一步。当用户提出一个问题,系统能否从海量文档块中精准“捞”出最相关的那几条,这直接决定了 RAG 的生命线。检索阶段的挑战可以概括为三个经典困境:“找不到”、“找不准” 和 “找太多”。
- “找不到”:源于用户提问与文档表述之间的“语义鸿沟”。用户问“怎么请假?”,而公司制度里写的是“员工休假申请流程”。两者在人类看来是一个意思,但如果 Embedding 模型对这类领域性表达的映射能力不足,就可能完全检索不到相关内容。这在医疗、法律等专业领域尤其突出。
- “找不准”:检索到的内容与问题主题相关,但并未包含用户真正需要的精确信息。例如,用户问“差旅报销上限是多少?”,系统可能返回一大段关于报销流程的通用介绍,却唯独缺少那个具体的金额数字。纯向量相似度检索容易犯这种“主题相关但信息不对”的错误。
- “找太多”:为了确保召回,你可能会设置一个较大的 Top-K 值。但这会把大量相关度不高的“噪声”信息一起塞给 LLM。研究表明,大模型存在“Lost in the Middle”现象,即它们倾向于关注上下文的首尾部分,中间的大量信息可能被忽略或混淆,反而导致生成错误答案。

针对这些问题,业界已有成熟的工程实践组合拳:
- 混合检索(Hybrid Search):结合向量检索(擅长语义匹配)和关键词检索(如 BM25,擅长精确匹配),取长补短,是提升召回率的性价比之选。
- 重排序(Reranking):在初步检索出一批候选结果后,使用更精细的 Cross-Encoder 模型对它们进行二次打分和精细排序,能显著提升 Top 结果的精准度。
- 查询改写(Query Rewriting):利用 LLM 将用户的原始问题改写成更利于检索的表述,或者从多个角度生成若干子查询并行检索,最后合并结果,能有效弥合语义鸿沟。
3. 生成阶段:幻觉并未消失,只是换了形式
不少人认为,RAG 通过提供上下文,从根本上解决了 LLM 的“幻觉”问题。现实要骨感得多。
即使检索到了完全正确的上下文,LLM 依然可能不忠实于检索结果。一种常见情况是模型“过度补充”:文档只说“公司2023年营收50亿”,它可能“好心”地加上一句“同比增长20%”,而这个增长率纯属虚构。更隐蔽的是,当检索到的多个片段之间存在细微矛盾时,LLM 可能会自行“调和”,生成一个看似合理但原文从未提及的综合结论。
另一个生产级难题是引用与溯源。在很多严肃场景(如金融、法律),用户不仅需要答案,还必须知道答案的确切出处。然而,让 LLM 准确标注“这句话出自文档A的第3段”,比想象中困难。它可能张冠李戴,或者将来自不同文档的片段混编进同一句话,导致溯源失效。

工程上的常见对策包括:
- 在系统 Prompt 中明确约束,要求模型“仅根据提供的上下文回答,不要使用外部知识”,并指令其逐一标注引用来源。
- 引入事实一致性检查,例如使用自然语言推理(NLI)模型来判断生成的每一句话是否都能从上下文中推断出来。
- 设计优雅的 “无法回答”(Fallback)机制,当检索内容不足以支撑回答时,引导模型诚实告知用户,而非强行捏造。
4. 规模化:当数据从百级跃升至百万级
原型可能处理几百个文档,生产系统则要面对几十万甚至上百万的规模。量变引发质变,一系列新的工程挑战随之而来。
- 向量数据库的选型与调优:百万级向量的近似最近邻(ANN)检索需要精心设计索引结构(如 HNSW、IVF)。索引参数的选择直接影响检索精度、速度和内存开销的平衡。Milvus、Pinecone、Qdrant 等不同向量数据库在不同数据规模和查询模式下的表现差异显著,选型必须基于实际的 Benchmark。
- 端到端延迟优化:一次 RAG 调用通常包含查询嵌入(~50ms)、向量检索(~200ms)和 LLM 生成(~500ms-3s+)等多个环节,加上可能的 Reranking,总延迟轻松突破秒级。对于实时交互场景,必须在每个环节“抠”时间:Embedding 缓存、热门查询预计算、流式输出等都是常用手段。
- 成本控制:大规模服务下,Embedding API 调用、向量存储、尤其是 LLM 推理的消耗会形成可观的成本。策略性缓存、根据问题复杂度进行模型分级路由、批处理请求等,是控制成本的关键。

5. 评估体系:如何知道系统是在变好还是变坏?
RAG 系统上线后,如何科学评估其效果?这是一个多维度、分层的复杂问题。
- 检索环节评估:需要评估召回率(该找到的都找到了吗?)和准确率(找到的都是对的吗?)。这依赖于一个标注好的评估数据集,在项目初期构建成本不菲。
- 生成环节评估:需要评估答案的准确性、完整性和忠实性。目前主流做法是 LLM-as-Judge,即用另一个 LLM 作为“评委”来打分,同时配合人工抽检。像 RAGAS、TruLens 这类框架标准化了部分流程,但评估提示词的设计质量直接影响结果的可靠性。
- 端到端与用户体验评估:还需要关注响应时间、问题解决率、用户满意度等线上指标,这需要结合 A/B 测试和真实的用户反馈来持续迭代。
一个稳健的评估体系通常需要三层互补:
- 离线回归测试:基于标注评估集,每次代码改动后自动运行,防止效果劣化。
- LLM 自动评估:利用 LLM-as-Judge 进行大规模、多维度的自动化评估,覆盖边界情况。
- 人工抽检与线上反馈:进行深度 Badcase 分析和 A/B 测试,持续优化核心体验。

6. 安全与合规:企业级部署的硬约束
对于企业应用,安全和合规不是附加题,而是必答题。RAG 系统引入了特有的风险点:
- 数据权限泄露:知识库中可能混合了不同密级的文档。如果没有在检索环节实施文档级甚至片段级的权限过滤(ACL),低权限用户就可能通过巧妙提问,间接获取高敏感信息。
- Prompt 注入攻击:攻击者可能通过用户输入(直接注入)或在可控制的文档中埋藏指令(间接注入),诱导 LLM 突破系统设定,泄露数据或执行恶意操作。
- 合规性要求:在金融、医疗等行业,系统的输出可能构成“建议”,需要附加合规免责声明,并确保全链路问答可审计、可追溯。

总结:从原型到生产的核心挑战
回顾从 Demo 到生产部署的全过程,RAG 系统面临的核心工程挑战可以归纳为以下五个方面:
- 数据处理的“脏活累活”:多样格式解析、科学的文本切块、动态数据同步,是决定效果上限的基础。
- 检索质量的精细调控:解决“找不着、找不准、找太多”的问题,需要混合检索、重排序、查询改写等组合技术。
- 生成阶段的忠实性控制:通过 Prompt 约束、事实一致性校验和 Fallback 机制,让 LLM 在“知识增强”后依然保持严谨。
- 规模化的工程优化:在百万级数据量下,对向量数据库、系统延迟和运营成本进行精细调优。
- 可持续的评估与迭代体系:构建离线测试、自动评估、人工抽检三层互补的评估框架,才能保证系统持续改进而非盲目迭代。
此外,企业级部署还必须将权限控制、对抗 Prompt 注入、合规审计等安全要求深度整合到系统架构中。
开发一个健壮、高效的 RAG 系统远不止调用几个 API 那么简单。它要求开发者具备数据处理、检索算法、大模型应用、分布式系统乃至安全合规的复合能力。这也是为什么在诸如 人工智能 应用开发的面试求职中,这类问题能如此有效地考察候选人的工程实践经验与系统性思考能力。如果你在搭建自己的 RAG 系统时遇到了文中提及的挑战,欢迎来云栈社区和更多开发者一起交流探讨。