前几天我朋友问我,说他在网上看到一个词叫RAG,什么检索增强生成,看起来特别高大上,但完全不知道是干嘛用的。我说你等一下,我拿个最土的办法给你讲清楚。
你有没有过这种经历:跟一个AI聊天,问它“我小区楼下那家重庆小面今天开门吗”,AI一本正经地告诉你“重庆小面是一种流行于中国西南地区的面食,通常以麻辣为特色”。你气得想砸手机。这不是你想要的答案,你想要的是那家店到底开没开,但AI根本不知道你楼下有家面馆,更不知道它今天是不是老板去相亲了所以歇业。
这就是大模型最要命的问题:它们学完知识之后,知识就定住了。像一本印好的百科全书,2023年印刷的,里面就没有2024年的事。你问它最新新闻,它只能瞎编。
RAG就是专门治这个毛病的。
我直接说人话:RAG等于给AI配了个u盘。平时AI脑子里只有它训练时候学到的那些老知识,但有了RAG之后,它可以在回答问题前去查一下你给它的资料,查完再回答。这就好比考试的时候,别的同学是闭卷,只有知识点,遇到没见过的题就瞎蒙;RAG同学是开卷,旁边放着一堆参考书,先翻书再答题。
具体怎么操作呢?我拆开来看。
第一步,你把一堆资料扔给系统。比如你是一家公司的客服,你有一份2024年最新的产品手册、价格表、退换货政策,总共50页PDF。你把这些文件喂给RAG系统,系统会把这些文档切成一万多块小碎片,每一块大概一两百个字,然后给每块生成一个“指纹”一样的向量编码。这个编码本质上是把文字转成了一串数字,方便计算机快速找东西。
第二步,用户来问问题了。比如有人问“你们家那个蓝牙耳机防水吗”。系统拿到这个问题,先不给大模型,而是先把这个问题也转成同样的数字编码,然后去那一万多块碎片里找最像的。找的时候用的是一种叫向量相似度搜索的技术,具体来说就是用余弦距离算一下,哪个碎片的数字编码跟问题的编码最接近。系统会找出最相关的三五块碎片,比如产品手册里关于防水等级的那一段。
第三步,把找到的这几块碎片和用户的问题拼在一起,形成一个完整的提示词,再发给大模型。这个提示词大概长这样:“请根据以下参考资料回答问题:资料1:XX耳机支持IPX5级防水,可防汗防雨。资料2:不适用于游泳或淋浴。问题:这个蓝牙耳机防水吗?”模型看到这些真材实料的资料,就不会瞎编了,它会照着资料说“支持IPX5防水,能防汗防雨,但不能游泳”。
你看,这个流程里每一步都是确定的,不是玄学。RAG不是让模型变得更聪明,而是让模型变得有据可查。
我去年在一个项目里试过自己搭RAG。用的是LlamaIndex这个框架,当时版本还是0.8.x。我把我司一份120页的技术文档扔进去,然后问了一个特别刁钻的问题:“服务器在连续运行72小时后,如果环境温度超过35度,风扇转速会怎么变”。没有RAG的时候,GPT-4直接给我编了一个答案,说“建议降低负载”,说得跟养生建议似的。用了RAG之后,它直接从文档第87页找到了具体的转速曲线公式,一字不差地念出来。我当时就感觉,这东西真不是花架子。
但RAG也有翻车的时候。最常见的是检索不准。比如你问“苹果好吃吗”,系统可能把“苹果手机维修指南”那一块碎片给捞上来了,因为它的向量编码跟“苹果”这个词匹配上了,但语义完全是两码事。这时候模型就会对着手机维修指南回答水果好不好吃,结果当然是一本正经地胡说八道。
我踩过一个坑。有一次我把一个产品FAQ文档切得太细了,每块只切了50个字。结果用户问“怎么退款”,系统捞上来一块写着“退款需要联系客服”,另一块写着“客服工作时间是9点到18点”,第三块写着“客服电话是400-xxx”。这三块单独看都没问题,但合在一起发给模型,模型就理解成了“只有9点到18点才能退款”,实际上文档里明确写着“退款申请24小时可提交,只是人工处理在9点到18点”。这个问题后来我把切块大小调成了200个字,并且加了重叠窗口,就是每两块之间有20个字的重复,这样上下文就没断了。调完之后准确率从62%升到了89%。
还有一次更离谱。我用了一个开源的embedding模型,叫什么all-MiniLM-L6-v2,效果差到令人发指。我问“笔记本电脑电池续航”,它给我捞上来一段关于“电池回收环保政策”的内容。后来换成了OpenAI的text-embedding-3-small,虽然贵了点,但检索效果确实好不少。这玩意儿就这么现实,便宜没好货。
RAG的好处是显而易见的。你不用重新训练模型,不用花几十万买显卡,只需要把文档扔进去,跑几个脚本,就能让一个通用模型变得特别懂你的业务。而且最关键的是,它不会遗忘。大模型有个毛病,你微调它之后,它可能学会了新东西,但把以前学的老知识给忘了,这叫灾难性遗忘。RAG没有这个问题,你把新文档加进去,它立刻就能查到,旧的还在,不会冲突。
现在很多公司都在用RAG做客服机器人、内部知识库、法律文书助手。我见过一个律师事务所的案例,他们把几百份合同模板和判例法条塞进RAG,律师问问题的时候,系统不光能给出答案,还能精确到第几条第几款,甚至能标注“这句话来自北京市高级人民法院2023年某号判决书”。这在以前得靠律师自己翻半天卷宗。
当然RAG不是万能的。如果一个问题需要模型进行复杂的推理,比如“如果A成立且B不成立,但C在某种条件下例外,那么D应该怎么处理”,RAG可能就抓瞎了,因为检索出来的碎片可能不包含完整的逻辑链条。这时候就需要结合一些推理增强的技术,比如让模型先检索再思考,或者把多个碎片组合起来做多跳推理。但那是更高级的玩法了,普通场景用不上。
我自己现在写代码查bug的时候也在用RAG。我把自己的项目代码库用RAG索引了一遍,遇到报错的时候,直接问“这个TypeError: ‘NoneType’ object is not subscriptable 在哪个文件出现过”,系统能把我以前修过的类似bug的代码片段翻出来。这比我自己翻git历史快十倍。
所以如果有人再问你RAG是什么,你就说:就是给AI配了个优盘,让它能查资料再回答,不乱编。这句话值两千块钱的咨询费。
📎 延伸阅读
看完这篇,如果你想:
- 直接拿工具 → 回复”13“,我把跨境获客工具包发给你
- 系统学习 → 点击菜单”AI训练营”,从0开始跑通AI变现