RAG(Retrieval-Augmented Generation,检索增强生成)是一种将外部知识检索 与大语言模型(LLM)生成能力相结合的技术,用于提升回答的准确性、减少"幻觉"(Hallucination),并支持私有或实时数据。
1.文档加载,准备知识库
从各种来源,如 PDF、Word、网页、数据库、TXT 等,读取原始文本。
2.准备知识库-切分文档
把长文本切分为较小的语意片段,便于后续向量化和检索。
固定大小切分:如按照字符数、token数
按标点符号切分:如换行符
按文档结构切分:如标题、章节
按语意切分:将句子按照相关性合并成段落
语义连贯行越来越好、实现复杂度愈来愈难。
3.准备知识库-向量化
将每个文本块转换为高维向量(embedding),用于语义相似度计算。
text-embedding-ada-002(OpenAI)BGE(智源)、m3e(国产)、Sentence-BERT
词嵌入:语义相似度捕捉的更好。
应用阶段:将训练好的模型应用于新文本以生成词潜入。
训练阶段:使用大型文本数据集训练模型以学习词表示。
4.向量存储
为向量存储和处理而生的数据库:向量数据库。
主要作用:嵌入文本、存储向量、进行相似度分析。
常见数据库:faiss、chroma、milvus等
5.检索
当用户提问时,将问题也转为向量,在向量库中查找最相似的 top-k 文本块。
(1)基于文本相似度的检索
问题向量vs知识块向量
余弦相似度:用向量的夹角表示这两个向量的相似度。夹角从0到180度,夹角越大,相似度越小。
欧氏距离:用向量的距离表示这两个向量的相关性。距离越小,相关性越高。
(2)基于关键字的检索
对于文档进行分词和去重之后,抽取关键字、匹配文档
语意捕捉效果更好,容错率更高。
关键词在部分场景下命中率高。
6.重排序(Re-ranking,可选但推荐)
对初步检索结果进行精排,提升相关性(尤其在 top-k 较大时)。
解决"语义相近但不相关"的误检问题。
7.提示词的构造+模型选择+生成回答
(1)提示词
用模版,不会每次都自己写。问题+参考文档,回答要求。
请根据以下上下文回答问题:
上下文:{retrieved_text}
问题:{query}
回答:
(2)模型的选择
开源:自行部署
- 安全和隐私性好
- 硬件要求较高
- 模型能力相对较低
- 应用:ollama、huggingface、魔塔
闭源:调用外部接口
- 安全性较低(需连外网)
- 模型能力较强
- 一键调用,不需要维护。
- 应用:各大官方API、通用框架。
(3)生成回答
将用户问题 + 检索到的上下文一起送入 LLM,生成最终答案。
8.总结
索引、检索、生成
作用:索引为了搭建一个知识库,支撑后面的检索。检索为了找到合适的文档。生成是为了整合提问和参考文档,输入大模型,得到答案。
核心:检索的核心是怎么切割模型,怎么选择合适的向量模型。检索核心是检索方式的选择。生成核心是提示词的构建,大模型的选择。