检索增强生成(RAG)系统已成为大模型应用的热门方向。许多团队能够在短时间内搭建一个RAG演示系统,但当用户规模扩大,系统开始面临严峻挑战:延迟增加、召回率下降、幻觉问题频发,以及严格的安全审查导致部署停滞。本文将深入探讨一个可用于生产环境的RAG模式,解决这些痛点,涵盖完整的数据流,安全防护(Guardrails)机制、实时的评估闭环,并提供一份可复制的部署清单。
RAG系统架构:混合检索与重排序
一个生产级的RAG系统并非简单的堆砌,它需要一个清晰且高效的架构。核心流程包括:检索(Retrieval)、重排序(Reranking)和生成(Generation)。首先,检索器负责寻找相关的文本片段;然后,重排序器对这些片段进行排序,选出最相关的部分;最后,语言模型基于这些片段生成答案,并引用相应的来源。为了提升检索效果,通常采用混合检索策略,将密集向量检索与BM25关键词检索相结合。密集向量检索擅长处理语义信息,而BM25则能有效捕捉罕见且精确的关键词,两者互补,共同提高召回率。例如,在处理法律文档时,密集向量检索可以识别语义相似的案例,而BM25可以快速定位到包含特定法条的文档。
数据流优化:分块、嵌入与索引刷新
顺畅的数据流是保证RAG系统性能的关键。这涉及到分块(Chunking)、嵌入(Embedding)和索引刷新等环节。
- 分块:将文本分割成小块,以便进行向量化表示。合理的块大小至关重要。过短的块可能提高召回率,但会增加索引成本;过长的块则可能丢失上下文信息。根据LlamaIndex的研究,512个token的块大小,并设置20%的重叠,可以在保证延迟低于50毫秒的情况下,处理千万级别的向量数据。
- 嵌入:将文本块转换为高维向量。嵌入模型的选择直接影响检索效果和成本。低成本的模型,例如,每千token花费0.0001美元的模型,适合大规模数据的初步索引;而更昂贵的多语言模型,例如,花费是前者的四倍的模型,则能提供更好的语义理解能力,尤其是在处理多语言文本时。例如,假设我们需要嵌入200万个文本块,每个块包含800个token,那么嵌入成本将在160到640美元之间。
- 索引刷新:保持索引数据的新鲜度。对于静态文档,可以通过夜间批量任务进行更新;对于频繁变化的数据,则需要构建流式管道,将新的数据行实时推送到嵌入服务,并更新向量存储。例如,对于实时新闻数据,我们可以使用Kafka等消息队列,将更新的新闻文本实时发送到嵌入服务,然后更新向量数据库,确保用户始终能检索到最新的信息。
可扩展的检索:向量检索、BM25与重排序
检索环节的效率直接影响用户体验。为了实现可扩展的检索,我们需要精心设计检索策略,并监控关键性能指标。理想的目标是:向量检索的95分位延迟小于50毫秒,重排序小于20毫秒,整个答案生成过程小于600毫秒。
- 向量检索:利用向量数据库,例如Milvus,进行快速的相似性搜索。通过构建高效的索引结构,例如HNSW,可以显著提高检索速度。
- BM25:利用传统的关键词检索算法,弥补向量检索在处理罕见关键词方面的不足。
- 重排序:使用轻量级的交叉编码器(cross-encoder)对检索结果进行重排序。例如,可以选择前50个结果,然后使用交叉编码器进行打分,并最终保留前5个。这可以有效提高检索结果的准确性。
例如,在电商搜索场景中,用户搜索“新款红色连衣裙”,向量检索可以找到语义相关的连衣裙,而BM25可以确保“红色”这个关键词得到足够的重视,最后通过重排序,将最符合用户意图的商品排在前面。
安全防护:构建安全围栏
安全防护(Guardrails)是确保RAG系统安全可靠运行的关键。Guardrails本质上是一些过滤器,用于检查输入提示和输出答案,拦截不允许的内容或结构错误。
- Llama Guard:使用安全分类法来标记风险文本,可以在本地使用Python代码快速部署。
- Guardrails YAML策略:允许用户定义规则,验证结构或过滤不雅内容,而无需修改核心模型代码。
- 可编程Guardrail框架:允许用户使用特定领域的语言编写自定义策略。NVIDIA的NeMo Guardrails就是一个典型的例子。
例如,可以设置规则,禁止系统生成包含仇恨言论或个人隐私信息的答案。如果检测到违规内容,系统可以拒绝回答或重写答案,并记录跟踪ID,以便后续审计。
持续评估:构建实时监控与反馈循环
评估是持续改进RAG系统的关键。我们需要建立一个全面的评估体系,包括离线指标、模型评估和在线信号。
- 离线检索指标:包括Recall@5(正确文档是否在前5个结果中)、MRR(平均首次命中排名)和nDCG(奖励正确排序)。可以使用Ragas等工具,通过生成200-500个带标签的问题,一次性计算这些指标。
- 模型评估:使用Ragas和TruLens等工具,让judge模型对实际跟踪数据进行评分,返回忠实度(答案基于来源)和答案相关性分数,而无需人工标注。
- 合成问答:创建一个问题,使用更强大的模型生成标准答案,然后让RAG系统回答,并评估结果。OpenAI Evals可以自动化这个流程。
- 在线信号:包括首个token的生成时间(<300毫秒)、用户重述率(用户在30秒内再次提问的频率)和每千次请求的成本(如果成本增加25%,则发出警报)。
- 持续循环:使用Langfuse等跟踪工具,将生产跟踪数据流式传输到夜间Ragas运行中,并在忠实度低于90%时发送Slack警报。
例如,可以设置一个监控面板,实时显示Recall@5、忠实度和延迟等关键指标。如果忠实度突然下降,则可以触发自动警报,通知开发人员进行调查。
可观测性:监控关键指标
可观测性对于理解RAG系统的运行状态至关重要。我们需要构建仪表盘,监控以下关键指标:向量搜索延迟、重排序延迟、token使用量、Guardrail拒绝率和嵌入任务失败率。例如,可以使用Grafana等工具,将跟踪数据可视化,以便快速发现问题。
部署清单:确保质量与成本效益
在部署之前,我们需要完成一份详细的清单,确保系统满足性能、准确性和安全性的要求。
- Recall@5 ≥ 0.8
- 忠实度 ≥ 0.9
- p95 延迟 < 800毫秒
- 每千次查询的成本 < 0.40美元
- 日志保留30天,并进行脱敏处理
- 回滚测试已完成
常见陷阱:避免性能瓶颈与安全风险
在构建RAG系统时,需要避免一些常见的陷阱:
- 过小的文本块:可能导致向量存储成本过高。
- 缺乏索引刷新:可能导致模型引用过时的信息。
- 跳过重排序:可能导致答案引用不相关的脚注。
通过进行大规模测试、使用重排序器、定期刷新索引和构建安全围栏,可以避免这些问题。
结论:构建稳健的RAG系统
强大的RAG系统并非魔法,而是扎实的基础设施、持续的评估和清晰的安全机制。通过遵循本文提供的步骤,并密切关注关键指标,我们可以构建一个快速、准确且安全的RAG系统,长期稳定运行。
核心关键词总结:
- 检索增强生成(RAG)
- 延迟
- 召回率
- 幻觉
- 数据流
- 安全防护(Guardrails)
- 评估
- 部署
- 混合检索
- 密集向量检索
- BM25关键词检索
- 分块
- 嵌入
- 索引刷新
- 重排序