RAG 演进 01-NaiveRAG
RAG 的早期主要包括:索引、检索、生成阶段,也被称为 Naive RAG
![[NaiveRAG 认识 - 20250122144205.png]]
索引 Indexing
数据索引的目的是通过用户提问检索到知识库相关的内容,涉及:数据提取、分块及嵌入过程
- 数据提取:目的从 PDF、word、markdown 以及数据库等数据源抽取数据,包括数据预处理及元数据提取
- 分块 (Chunking):由于模型一次输入是有限,不可能把一整个知识库一次性输入 LLM,所以需要多数据进行分块处理,分块技术有按句子、按段落等。分块的好坏影响 RAG 的效果,可以假设 "我喜欢她" 刚好被分为 "我喜欢",“她”,语义就被拆分了,因此常使用重叠避免这种问题
- 嵌入:是为了解决一句话可以使用不同字词去表达的问题,试想如果仅仅通过关键字查找知识库,可能会漏掉很多相近的语义信息。因此将分块嵌入到向量空间,通过比较向量来分析提问与分块的相近程度
这里为什么要进行分块?直接全部输入 llm 不可以吗?这里存在两个问题:
- llm 的上下文有限:一次输入太多内容将被截断,并且上下文越长,回答越慢
- 减少信息干扰:上下文和问题越相关,llm 回答的越准确
检索 Retrieval
检索是从索引中检索出跟提问相关的上下文,也就是通过关键词等方式比较提问与分块的相似程度,然后提取比较相似的部分出来
所谓关键词检索,即通过对提问、文档进行分词,然后通过文本相似性算法 (TF-IDF/BM25) 计算关键词的打分,获得相似文本
生成 Generation
将检索的相关上下文 + 提问一起提供给 llm,让 lmm 输出最后的回答
1 | # 创建PromptTemplate |