type
status
date
slug
summary
tags
category
icon
password
🌱 基础 RAG 技术 (Foundational RAG Techniques)
1. 基础 RAG (Basic RAG)
- 核心组件
- PDF 处理与文本提取: 从源文件中解析和提取纯文本内容。
- 文本分块 (Chunking): 将长文本切分为可管理的、具有语义上下文的片段。
- 向量化与存储: 使用
OpenAI Embeddings
和FAISS
创建并索引文本向量。 - 检索器 (Retriever): 根据查询执行相似度搜索并返回最相关的文本块。
- 系统评估: 提供用于衡量检索性能和质量的框架。
- 实现方法详解
- 1. 文档预处理:
- 加载器: 使用
PyPDFLoader
库加载并解析 PDF 文档。 - 分块器: 应用
RecursiveCharacterTextSplitter
进行文本分块,可灵活配置块大小 (chunk size)
和重叠部分 (overlap)
以优化上下文保留。 - 2. 文本清理:
- 自定义函数: 应用
replace_t_with_space
等函数对文本块进行标准化处理,以解决源文档中可能存在的特定格式或编码问题。 - 3. 向量存储创建:
- 嵌入模型: 调用
OpenAI Embeddings
API 将每个文本块转换为高维语义向量。 - 向量数据库: 利用
FAISS
(Facebook AI Similarity Search) 构建高效的向量索引,支持毫秒级的相似度搜索。 - 4. 检索器设置:
- 配置: 将
FAISS
索引包装成一个标准检索器,并配置其返回Top-k
(例如:k=2) 个最相关的结果。 - 5. 核心编码函数:
- 封装: 整个流程被封装在
encode_pdf
函数中,实现了从加载、处理到索引的全过程自动化,提高了代码的模块化和复用性。
- 关键特性与优势
- 可扩展性 (Scalability): 分块处理机制使其能够轻松应对大型文档,不受内存限制。
- 灵活性 (Flexibility): 方便调整分块策略、嵌入模型和检索数量等参数,以平衡召回率和精确度。
- 高效率 (Efficiency):
FAISS
的使用确保了即使在海量数据中也能进行快速的向量检索。 - 前沿技术集成: 采用
OpenAI
的SOTA嵌入模型,保证了文本表示的质量和深度。
- 使用与评估示例
- 查询示例: 通过以下测试查询来演示系统的基本用法:
- 评估接口: 系统包含
evaluate_rag
函数,为量化评估检索器的性能和进行迭代优化提供了标准接口。
结论该简易RAG
系统是一个强大而灵活的信息检索与问答基础架构。它通过将非结构化的文档内容转化为结构化的、可搜索的向量数据,有效地桥接了自然语言查询与海量文档信息之间的鸿沟,为需要从大型文档集中精准、快速获取信息的应用场景提供了一套高效的解决方案。
2. 使用 CSV 文件的 RAG (RAG with CSV Files)
- 应用场景与数据结构
- 数据文件: 系统处理的
CSV
文件包含虚拟客户数据。 - 数据属性: 文件列可能包括
姓
,名
,公司
等客户属性。 - 核心用例: 基于此数据集构建一个智能的 客户信息问答 (Q&A) 系统,允许用户通过自然语言查询客户的具体信息。
- 核心组件
- CSV 加载与分割: 解析
CSV
文件并将其内容准备为可处理的文本单元。 - 向量存储创建: 使用
FAISS
索引和OpenAI
的嵌入模型 (Embeddings) 构建向量数据库。 - 检索器设置 (Retriever Setup): 配置检索器以根据查询的语义相似度来提取信息。
- 问答链构建 (Q&A Chain): 整合检索器和语言模型,形成一个完整的问答流程。
- 实现方法详解
- 1. 文档预处理:
- 加载器: 使用
LangChain
框架中的CSVLoader
来加载CSV
文件。CSVLoader
通常会将表格中的每一行视为一个独立的文档或记录。 - 分块: 数据在加载过程中被自然地分割成多个文本块(例如,每行一个块),为后续的向量化做准备。
- 2. 向量存储创建:
- 嵌入模型: 调用
OpenAI Embeddings
API,将每个文本块(即CSV
的行记录)转换为高维度的语义向量。 - 向量数据库: 将生成的所有向量存入
FAISS
(Facebook AI Similarity Search) 向量存储中,并为其创建高效的检索引擎。 - 3. 检索器设置:
- 配置: 将
FAISS
向量存储配置为一个检索器,使其能够接收用户查询,并返回一个或多个最相关的文本块(即最相关的客户信息行)。
- 此方法的关键优势
- 可扩展性 (Scalability): 即使
CSV
文件包含数十万行数据,分块和索引的机制也能保证系统性能。 - 灵活性 (Flexibility): 可以轻松调整嵌入模型、检索的邻近结果数量 (
k
值)等参数,以优化特定场景下的问答效果。 - 高效率 (Efficiency):
FAISS
确保了在高维向量空间中的相似度搜索速度极快,可实现实时响应。 - 前沿技术集成 (Advanced NLP): 利用
OpenAI
的SOTA嵌入模型,确保了对查询意图和CSV
内容的深度语义理解。
结论这个简易的RAG
系统为构建针对结构化数据(如CSV
文件)的复杂信息检索和问答应用提供了一个坚实的基础。通过将表格数据编码到可搜索的向量空间中,它能够高效地响应自然语言查询,并返回精准的行级信息。此方法对于需要从大型CSV
文件或表格数据中快速、智能地访问特定信息的应用场景(如商业智能、客户支持、数据分析)尤其有价值。
3. 可靠 RAG (Reliable RAG)
- 概述 🔎 这是对基础RAG的增强,通过增加验证和精炼步骤,确保检索信息的准确性和相关性。
- 实现 🛠️ 检查检索到的文档与查询的相关性,并高亮显示用于生成答案的文档片段,从而增加系统的透明度和可信度。
- 流程分步详解
- 1. Start (开始):
- 流程的正式起点。
- 2. Query (用户查询):
- 接收用户的输入问题或指令作为流程的触发器。
- 3. Vectorstore (向量存储检索):
- 系统将
query
在向量数据库中进行语义搜索,输出为retrieved docs + query
。 - 此阶段的目标是初步筛选出与查询主题在语义上可能相关的文档或文本片段。
- 4. Check Document Relevancy (检查文档相关性):
- 【可靠性关键步骤 1】 对检索到的
docs
进行二次筛选,使用更精确的模型或规则来评估其与query
的真实关联度。此举能有效剔除无关的“噪音”文档,确保送入语言模型的上下文是高质量且高度相关的。 - 输出为经过验证的
relevant docs + query
。 - 5. Generate Answer (生成答案):
- 大语言模型 (
LLM
) 基于高质量的relevant docs
和原始query
来综合信息,生成初步答案。 - 输出为
relevant docs + answer
。 - 6. Check Hallucination (事实一致性检测):
- 【可靠性关键步骤 2】 验证所生成的
answer
是否严格基于给定的relevant docs
,没有凭空捏造或过度推断信息。这是确保答案忠实于源文档的核心环节,旨在消除或标记“模型幻觉”。 - 输出为经过事实核查的
query + relevant docs + answer
。 - 7. Highlight Document Snippet (高亮文档片段 / 引用溯源):
- 【可靠性关键步骤 3】 将答案中的关键信息与源文档的具体片段进行明确的关联和高亮。此举为用户提供了透明的可追溯路径,允许用户自行验证答案的来源,极大增强了系统的可信度。
- 8. End (结束):
- 流程结束,向用户交付一个有事实依据、可验证、可溯源的最终答案。
- 核心优势:为何称之为“可靠”
- 前置相关性检查 (Input Guardrail): 在信息输入端进行“净化”,从源头保证了上下文的质量,避免“垃圾进,垃圾出”。
- 后置幻觉检测 (Output Guardrail): 在信息输出端进行“核查”,扮演了“事实警察”的角色,确保答案的忠实性和准确性。
- 全程可追溯引用 (Verifiability): 赋予用户最终的“审判权”,通过高亮和引用,让系统从一个不透明的“黑盒”转变为一个可信赖的、透明的合作伙伴。
4. 选择分块大小 (Choose Chunk Size )
- 概述 🔎 为文本块选择一个合适的固定大小,以平衡上下文保留和检索效率。
- 实现 🛠️ 通过实验不同的分块大小,找到在特定用例中既能保留足够上下文又能保持检索速度的最佳平衡点。
- 举例说明 💡
- 场景: 分析一篇长篇科学论文。
- 问题:
- 如果分块太小(如一个句子),当提问“这项研究的主要贡献是什么?”时,可能只检索到“本研究提出了一种新算法”,而丢失了下文对该算法的详细描述。
- 如果分块太大(如整个章节),可能会引入大量无关信息,导致LLM在生成答案时重点不突出。
- 优化: 通过测试,发现将分块大小设置为3-5个段落可以在保留核心思想和避免噪声之间取得最佳平衡。
5. 命题分块 (Proposition Chunking)
- 核心动机 (Motivation)
- 此方法旨在构建一个能将文本文档分解为简明、事实化命题的系统,从而实现更细粒度、更精确的信息检索。与传统的基于大文本块的检索相比,使用命题能够对特定查询进行更精细的控制和处理,尤其适用于从细节丰富或结构复杂的文本中提取知识。通过对比“小粒度命题”和“大文本块”两种检索系统的效果,可以评估细粒度信息检索的实际效能。
- 核心组件 (Key Components)
- 文档分块 (Document Chunking): 将原始文档分割成易于分析和处理的管理单元。
- 命题生成 (Proposition Generation): 利用大语言模型 (LLM) 将文档块分解为事实准确、上下文独立的命题。
- 命题质量检查 (Proposition Quality Check): 基于准确性、清晰性、完整性和简洁性等标准,对生成的命题进行评估。
- 嵌入与向量存储 (Embedding and Vector Store): 将通过质量检查的命题(以及作为对照组的较大文档块)嵌入到向量存储中,以便高效检索。
- 检索与对比 (Retrieval and Comparison): 使用不同类型的查询来测试系统,并对比基于命题的模型与基于大文本块的模型的检索结果。
- 举例说明 (Illustrative Example)
- 原始文本 (Original Text):
- 传统分块结果 (Traditional Chunking Result):
- 传统分块方法可能会将整个段落视为一个单独的文本块。当用户查询“谁创立了特斯拉?”时,模型需要在这一整个包含多个信息的长文本块中寻找答案,容易受到其他无关信息的干扰。
- 命题分块结果 (Propositions Chunking Result):
- 命题分块会将上述文本分解为一系列独立的、原子化的事实。
- 优势: 现在,当用户查询“谁创立了特斯拉?”时,系统可以非常精确地匹配到命题“特斯拉公司由马丁·艾伯哈德和马克·塔彭宁创立。”,从而返回更准确、更直接的答案。
"特斯拉公司是一家美国公司,由马丁·艾伯哈德和马克·塔彭宁于2003年创立,设计和制造电动汽车、电池储能设备和太阳能电池板,其总部位于德克萨斯州奥斯汀。"
["特斯拉公司是一家美国公司,由马丁·艾伯哈德和马克·塔彭宁于2003年创立,设计和制造电动汽车、电池储能设备和太阳能电池板,其总部位于德克萨斯州奥斯汀。"]
[ "特斯拉公司是一家美国公司。", "特斯拉公司由马丁·艾伯哈德和马克·塔彭宁创立。", "特斯拉公司创立于2003年。", "特斯拉公司设计和制造电动汽车。", "特斯拉公司设计和制造电池储能设备。", "特斯拉公司设计和制造太阳能电池板。", "特斯拉公司的总部位于德克萨斯州奥斯汀。" ]
- 实现方法详解 (Method Details)
- 1. 环境配置:
- 首先加载环境变量(如 LLM 服务的 API 密钥),确保系统能够访问所有必要的外部资源。
- 2. 初始文档分块:
- 使用
RecursiveCharacterTextSplitter
将输入文档初步分割成较小的文本块 (chunks)。这确保了每个块的大小都适合后续送入 LLM 进行处理。 - 3. 命题生成:
- 针对每一个文本块,使用一个强大的 LLM (例如
llama-3.1-70b-versatile
) 来生成命题。通过特定的提示 (Prompt),引导模型输出一个事实陈述的列表,其中每个陈述都应是独立的、无需额外上下文即可理解的。 - 4. 命题质量检查:
- 引入第二个 LLM 作为“评分员”,对生成的命题进行质量评估。评分维度包括:
准确性 (accuracy)
、清晰性 (clarity)
、完整性 (completeness)
和简洁性 (conciseness)
。 - 只有在所有维度上都达到预设阈值的命题才会被保留,从而保证了知识库的质量。
- 5. 嵌入与向量存储:
- 将通过质量检查的命题,使用
OllamaEmbeddings
等模型进行向量化。 - 将生成的命题向量存入一个
FAISS
向量存储中,以支持高效的相似度搜索。 - 6. 检索与对比测试:
- 构建两个并行的检索系统:一个基于“命题”,另一个基于传统的“较大文档块”。
- 使用多个测试查询分别对这两个系统进行测试,以深入比较它们的性能差异和返回结果的精确度。
- 主要优势 (Benefits)
- 细粒度检索 (Granularity): 通过将文档分解为微小的事实单元,系统能够支持高度特定的信息检索,极大地简化了从复杂文档中提取精确答案的过程。
- 质量保证 (Quality Assurance): 内置的质量检查机制确保了存入知识库的命题符合高标准,从而提高了检索信息的整体可靠性。
- 检索灵活性 (Flexibility in Retrieval): 通过直接比较两种分块策略的检索结果,可以深入理解在不同查询场景下,细粒度和更广泛上下文之间的权衡关系,为优化检索策略提供依据。
- 对比
特征 | 基于方面命题的检索 (Aspect-Proposition-Based Retrieval) | 简单区块检索 (Simple Chunk Retrieval) |
响应精度 | 高: 提供重点突出、直接的答案。 | 中: 提供更多上下文,但可能包含不相关的信息。 |
清晰度和简洁性 | 高: 清晰简洁,避免不必要的细节。 | 中: 内容更全面,但可能信息过载。 |
上下文丰富度 | 低: 可能缺乏上下文,侧重于特定的命题。 | 高: 提供额外的上下文和细节。 |
全面性 | 低: 可能忽略更广泛的背景或补充细节。 | 高: 提供更完整、信息更详尽的视图。 |
叙事流畅性 | 中: 可能显得零散或脱节。 | 高: 保持原始文档的逻辑流程和连贯性。 |
信息过载 | 低: 不太可能因信息过多而让用户不知所措。 | 高: 有可能因信息过多而给用户带来负担。 |
用例适用性 | 最适合快速、基于事实的查询。 | 最适合需要深入理解的复杂查询。 |
效率 | 高: 提供快速、有针对性的响应。 | 中: 可能需要用户花费更多精力筛选额外内容。 |
特异性 | 高: 精确且有针对性的响应。 | 中: 由于包含更广泛的上下文,答案的针对性可能较差。 |
- 作者:SimonSun
- 链接:https://simonsun.xyz//article/rag-3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章