你可能最近到处都看到RAG这个术语——"RAG管道","RAG聊天机","建造你自己的RAG应用".
听起来很复杂 但背后的想法其实很简单 在这篇文章中,我会用平庸的语言解释RAG, 然后用我建立的真正项目走过去: 指南,一个内部知识助理,用公司自己的文件回答问题. "问题RAG解决方案"大型语言模型(如GPT或克勞德等)接受了大量通识知识的训练,但他们不知道你的具体数据——你的公司的内部文件,你的产品手册,你的登机指南.
它们也不可能每次文件更改时都会被再训练;这既缓慢又昂贵.
RAG完全不用再训练模型就能解决这个问题.
基本上:RAG的意思是:在回答一个问题之前,首先去寻找你自己文件的相关部分,然后把这些文件连同问题一起交给AI.
就是这样。 "检索"(查找正确的信息)+"强化的一代"(AI使用该信息回答).
而不是AI只从记忆中回答,它用你现在交出的事实来回答.
三个核心片段 让我们来分解你需要做的三件事: 分块、嵌入和向量搜索。
1.
春金 -- -- 破碎文件入片 你不能把整个200页文件的AI模型交给它,要求它通过它有效搜索.
所以第一步是将文件分成更小的,可管理的部分,称为块.
在《指南》中,我使用了一个符号窗口块——它根据每个块的固定符号数(粗略地,字片)将文本分出,而不是仅仅用段落或句子分出。
这很重要,因为: 垃圾空间太大, 东西会减慢。
太小的块会失去上下文,产生混乱的答案.
一个象征性的窗口方法会给你一个一致的,可预测的块大小,这使得接下来的步骤更加可靠.
2.
嵌入-将文本输入数字 一旦有块,你需要一种方法来比较两个文本的"多么相近"——例如,块与用户的问题有多相近?
计算机不能直接比较意义,因此每个块会被转换成一个叫做嵌入(一个向量)的数字列表.
具有相近含义的文字最终会得到数学上相近的数字,即使措辞完全不同.
例如"我如何重置我的密码?"和"改变您登录证书的脚本"将产生相近的嵌入,因为它们的意思大致相同——尽管词几乎没有重叠.
我在《指南》中增加了一件事:一个基于SHA-256散列的嵌入缓存。
生成嵌入会花费时间和金钱,所以在创建出新的嵌入之前,我将块的内容散开,并检查它是否已经嵌入过.
如果有的话,我重复使用缓存版本而不是再次生成.
这本身就大大减少了重复的工作,特别是当文件得到更新但大多数内容保持不变时。
3.
矢量搜索——寻找右方块 现在每个块都有数字嵌入,你需要一个快速的搜索方式,通过其中的上千个(或上百万个)来找到最接近用户提问的.
这就是一个矢量数据库进入的地方。
在"指南"中,我使用了FAISS(Facebook AI相近性搜索)——一个专门用来快速地通过大量嵌入来搜索的图书馆.
流量看起来是这样:用户提问.
这个问题被转换成嵌入式,使用的方法与块相同.
FAISS将嵌入与所存储的所有块嵌入进行比较,并返回最接近的匹配.
这些匹配块是最有可能 包含答案。
将它放在一起 这里就是整个RAG的流量 以指南为例: Guidely 中此功能的后端运行于 FastAPI, FAISS 处理向量搜索, 以及聊天界面的 React/Vite 前端.
为何这个方法有效