如何搭建企业级的RAG应用
说到最近技术圈里讨论最火的技术,RAG(检索增强生成)绝对占有一席之地。它最初是为了解决大语言模型的一些短板而设计的,但很快大家就发现,这玩意儿在企业实际场景里简直太好用了。说句实在话,很多企业压根不在乎你底层用的是不是大模型,他们只关心能不能更快、更准地搜到想要的东西。RAG恰好就干了这个活儿——既提升了搜索的准确率,又让生成的内容更贴合需求。像ChatPDF这种开源项目,就是RAG落地的绝佳例子,一下子就把它的价值给展现出来了。

什么是 RAG
铺垫了这么多,那RAG到底是个什么东西?简单来说,RAG——Retrieval Augmented Generation,检索增强生成。它的核心任务是生成最终答案,但关键在于,它并不是让大模型天马行空地发挥,而是先做一步检索,从现有文档里找依据。下面用一个浅显的例子来说明:
假设一位工程师需要从厚厚的《业务操作手册》里找知识来完成工作。他有三种方式可选:
- :自己去翻阅纸质手册,或者搜索电子版,一页页读下来,碰到复杂的内容还得自己整合多个章节,融会贯通。费时费力。
最原始的方法
- :直接去问一个FAQ式聊天机器人。这确实省了点事,但麻烦也不小——它更像是一问一答的自动回复机,用户还是得自己把零散的回答拼起来;而且背后那个知识库,需要专业人员一条条地整理(包含问题和多种相似问法),工作量巨大,很难大面积推广。
借助问答机器人
- :直接把《业务操作手册》电子版上传到系统,几分钟内系统就把整本书建好索引了。然后工程师随便问,RAG会自动综合手册中多个相关知识点,并用一种“老专家”的口吻给出答案:“要解决这个问题,你得先搞定两个前提,有三种方法可以走。下面咱们一步步来……”
RAG 方案
看到这,你应该明白了。它其实正在悄悄取代传统的FAQ问答模式。
RAG 系统构建挑战
在聊具体架构之前,先得说说构建RAG系统时容易踩的那些坑。最近有研究团队分析了三个跨领域的案例,总结出七个常见故障点:
FP1:缺失的内容(Missing content)
当用户的问题在现有文档里压根儿找不到答案时,理想情况是系统老实说“抱歉,我不知道”。但问题是,有些问题看似相关,实则无解,系统这时候容易被带偏,给出一个不太靠谱的回应。
FP2:错过排名靠前的文档(Missed the top ranked documents)
答案其实藏在文档里,但检索排名不够靠前,导致没被系统推送给用户。理论上所有文档都会被排序,但实际中只会返回前K个,这个K值需要根据性能反复调试。
FP3:未在上下文中——整合策略限制(Not in context - consolidation strategy limitations)
检索到了包含答案的文档,但因为返回结果太多,上下文窗口装不下,导致最相关的信息被排挤掉了。
FP4:未提取(Not extracted)
答案明明就在上下文里,可模型要么被噪音干扰,要么遇到矛盾信息,就是提取不出正确的那部分。
FP5:格式错误(Wrong format)
用户要求输出表格或列表等特定格式,但大模型直接“无视”了指令,给出一堆文字。
FP6:错误特异性(Incorrect specificity)
答案要么太笼统,要么太具体,就是跟用户想要的不在一条线上。比如用户问一个教育问题,系统却偏偏只给答案而不给讲解;或者用户问得太宽泛,系统又不知道该怎么收索。
FP7:不完整(Incomplete)
答案本身没错,但缺少了关键信息——明明这些信息就在上下文里,系统却没提取。比如问“文件A、B、C中涵盖了哪些要点”,它可能只答了一部分。
如何构建企业 RAG 系统
摸清了这些坑,接下来就得看看每个组件该怎么设计,以及有哪些最佳实践。
一、用户认证
这是系统的第一道关。用户开始对话前,必须先确认身份。这不仅仅是为了安全,还能实现个性化。具体来说:
- :确保只有授权用户能进入系统。
访问控制
- :防止敏感信息泄露给不该看的人。
数据安全
- :保证只有目标用户能访问自己的个人信息。
用户隐私
- :每个操作都能追溯到具体用户,方便审计。
问责制
- :根据用户身份调整体验,比如定制内容、偏好和设置。
个性化和定制
二、输入保护
防止用户输入有害或私密信息,这块儿越来越重要——毕竟,最近的研究表明,大模型还挺容易被“越狱”的。具体保护场景包括:
- :抹掉姓名、地址、联系方式等个人身份信息。
匿名化
- :禁止可能用于SQL注入、XSS攻击的字符。
限制子字符串
- :过滤掉仇恨、歧视、露骨等违规内容。
限制主题
- :防止可执行代码注入,避免安全漏洞。
限制代码
- :验证输入文本的语言或脚本是否正确。
限制语言
- :防止恶意提示操纵系统行为。
检测提示注入
- :限制输入长度,防止资源耗尽或DoS攻击。
限制tokens
要防御这些问题,可以借助Meta开源的Llama Guard。
三、数据索引
1. 数据提取
- :处理PDF、Word、Excel、数据库等多种格式,识别超链接、多媒体元素、注释等内嵌内容。尤其要注意表格——从文档表格中提取数据并保留结构,对报告和研究论文尤其重要。Table Transformer这类模型很实用。
文档解析
- :包括格式处理、剔除不可识别内容、压缩和格式化。
数据处理
- :提取文件名、作者、创建日期、文档类型、关键词、章节标题、图片alt信息等,这些都可以作为特殊字段进行索引。
元数据提取
2. 分块
- :一般是256或512个tokens,具体取决于嵌入模型。但弊端也很明显——语义可能被切碎。比如“我们今天晚上应该去吃个大餐庆祝一下”,可能被分成“我们今天晚上应该”和“去吃个大餐庆祝一下”。解决办法是增加冗余,比如512tokens的块只存480,让相邻块互相交叉一点。
固定大小分块
- :针对Markdown、LaTeX、Python代码等有结构特征的文本,依据特定字符或结构标记来切分,保持逻辑连贯性。比如Markdown按标题、列表、引用等来分。
特定格式分块
- :用一组分隔符反复切分,如果第一次没切到理想长度,就递归地用更细的分隔符继续。比如先按句号分,太长就再按逗号或空格切,确保不破坏语义结构。
递归分块
- :先按句子切分(句子本身就是一个语义单位),然后用嵌入模型表征句子,最后把相似的句子组合在一起,同时保持原有顺序。
语义分块
- :一种更高级的语义分块。基于大模型,逐步构建块——先对段落做句法分块,再用LLM生成独立陈述(比如“这段文字讨论了什么主题”),去掉冗余,最后索引并存储命题。查询时直接从命题库检索,而非原始文档库。
命题分块
- :索引类型(文章和推文的分块大不相同)、模型类型(ChatGLM、ChatGPT、Claude各有不同的tokens限制)、问答文本的长度和复杂度(最好让分块尺寸与问答文本长度相当)、应用类型(检索、问答、摘要等也会影响策略)。
影响分块策略的因素
3. 向量化
这是将文本、图像、音频等转化为向量矩阵的过程,也就是变成计算机能理解的格式。嵌入式模型的质量直接影响后续检索的相关度。选择编码器时需要考虑几点:
- :大规模文本嵌入基准(MTEB)可以对OpenAI、Cohere、Voyager等商业模型,以及一些开源模型做全面评估,包括向量维度、平均检索性能、模型大小等。
利用MTEB基准评估
- :编码器在处理敏感信息时不一定表现最佳,需要自定义评估。三种方法:一是通过注释评估——生成专用数据集,人工打标签,再用MRR、NDCG等指标定量评估;二是按模型评估——用LLM或交叉编码器作为评估器,对前三个编码器做手动验证;三是聚类评估——用HDBSCAN等算法分析不同Silhouette分数下的向量相似性。
自定义评估
- :OpenAI这类API省去了托管管理,但开源自建要考虑模型大小和延迟。110M参数以内的小模型可用CPU托管,大模型可能需要GPU。
查询费用
- :建议将文档嵌入单独存储,避免服务迁移或重置时重新计算。
索引成本
- :大规模向量索引的存储成本与维度成线性关系。
仓储成本
- :语义搜索的延迟随维度线性增长,选择较低维度的嵌入能降低延迟。
搜索延迟
- :金融、医疗等敏感领域对数据隐私有严格要求,通常需要私有化部署。
隐私
目前主流的嵌入式模型包括:BGE(国人开发,HuggingFace MTEB排名前二)、M3E(同样来自国内)、通义千问的嵌入模型(1500+维)、OpenAI的Text-embedding-ada-002(1536维,MTEB排名第六,但实际体验很好)。当然,也可以在现有模型基础上微调,一般能提升3%-10%的性能。
四、检索环节
检索环节的技术含量同样很高,通常分为以下几部分工作:
查询重写
- :利用对话历史理解上下文。比如用户先问“你有多少张信用卡?”,再问“白金卡和金卡有年费吗?”,然后问“比较两者的特点”。系统需要根据历史识别意图,重写为“比较白金信用卡和金卡信用卡的功能”。
根据历史重写
- :复杂查询拆分为更具体的子查询。比如对于“比较白金卡和金卡的功能”,拆成“白金信用卡有什么特点?”和“金卡信用卡有什么特点?”。
创建子查询
- :为了克服语义或词汇匹配的局限性,生成同义词或相关术语的类似查询。比如“我想了解白金信用卡”转化为“告诉我白金信用卡的好处”。
创建类似查询
元数据过滤
图关系检索
检索技术
重排序
最大边际相关性
自动剪切
句子窗口检索
子查询
查询路由
HyDE
五、生成(Gen)
这块主要依赖Langchain和LlamaIndex这类框架。有多种用于改进RAG输出的提示技术,值得后面单独研究。
六、输出保护
与输入保护类似,但专门针对大模型生成的输出。目的是防止生成不准确、有违道德或不符合品牌价值观的内容。通过积极监控和分析输出,确保内容事实准确、伦理合理且品牌导向一致。
七、缓存
缓存提示及其对应的响应,方便后续直接调用。这能带来三个明显好处:
- :某些常用查询可以实现接近零延迟的响应。
增强生产推理
- :开发阶段避免重复调用API,省钱又省时间。
加速开发周期
- :积累的提示-响应数据,可以用于后续模型优化。
数据存储
八、存储
需要解决向量、文档、聊天记录、用户反馈等数据的存储问题,这个后面再详细展开。
总结
LLM技术浪潮带来了不少新东西,但要让这些技术在企业里真正发光,还得靠深入研究和持续实践。只有这样,才能打磨出真正高质量的解决方案。
参考:
https://www.rungalileo.io/blog/mastering-rag-how-to-architect-an-enterprise-rag-system
https://mp.weixin.qq.com/s/37tKVQbxenVVBAeMZ334aQ
https://arxiv.org/pdf/2401.05856
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名