总结笔记-RAG | 豆包MarsCodeAI刷题

132 阅读6分钟

RAG(Retrieval-Augmented Generation)

什么是RAG?

RAG,即 Retrieval-Augmented Generation(检索增强生成),是一种将信息检索与文本生成相结合的技术。具体而言,RAG 通过引入外部知识库,增强了传统语言生成模型的能力,使得在生成文本时能够动态地检索相关信息,从而生成更加丰富、准确且有根据的内容。

RAG 的应用场景举例

RAG 技术在许多实际应用中都显示出其强大的潜力:

  1. 客户支持:RAG 可用于构建智能客服系统,能够动态检索产品手册、常见问题解答(FAQ)或用户手册,以准确回答用户的问题。例如,当用户询问某款产品的保修政策时,系统能够从相关文档中提取信息并生成答案。

  2. 医疗领域:在医疗问答系统中,RAG 可以检索最新的医学文献和病例研究,从而为医生或患者提供基于证据的答案。例如,对于某种疾病的最新治疗方案,系统可以提供相关的研究结果作为参考。

  3. 学术研究:RAG 可帮助研究人员快速检索与其课题相关的文献,生成研究综述或推荐相关文献。例如,当研究人员在撰写文献综述时,系统能够从广泛的数据库中检索并总结相关研究成果。

  4. 新闻报道:RAG 可以用于生成新闻摘要,能够从多个来源检索相关信息,生成对事件的全面理解。例如,针对一场比赛的报道,系统可以从不同的体育新闻网站中检索数据并生成综合性报道。

RAG 的工作原理

RAG 的工作流程可以概括为以下几个步骤:

步骤描述
检索对于给定的输入(问题),模型首先使用检索系统从大型文档集合中查找相关的文档或段落。通常使用密集向量搜索。
上下文编码找到相关的文档后,模型将其与原始输入(问题)一起编码,为生成提供丰富的上下文信息。
生成使用编码的上下文信息,模型生成输出(答案),通常通过大模型完成。

这种结合方式使得 RAG 模型不仅依赖于训练数据中的信息,还可以实时从大型外部知识库中检索信息,适应处理未在训练数据中出现的问题。

RAG的实际应用

RAG 的应用需求在企业中日益增长,尤其是在需要处理大量信息并生成准确响应的场景。LangChain 是实现 RAG 的一个重要工具,以下是 LangChain 在 RAG 实现中的关键环节:

1. 文档加载

RAG 的第一步是加载文档。LangChain 提供多种类型的文档加载器,支持多种文档格式(如 HTML、PDF、代码),并与其他主要提供商(如 Airbyte 和 Unstructured.IO)集成。以下是一些常用的文档加载器:

加载器类型描述
TextLoader用于加载文本文件。
PDFLoader用于加载 PDF 文件。
HTMLLoader用于加载 HTML 文档。
CodeLoader用于加载代码文件,适用于程序员。

2. 文本转换

在加载文档后,下一步是对文本进行转换,最常见的方式是将长文档分割成适合模型的块。LangChain 提供多种文档转换器,能够轻松拆分、组合和过滤文档。

文本分割器的设计

文本分割的质量直接影响检索结果的效果。LangChain 中的文本分割器的工作原理如下:

  • 将文本分割为小的、具有语义意义的块(通常是句子)。
  • 将小块组合成更大的块,直到达到特定的大小。
  • 新块与刚生成的块之间应保持一定的重叠,以保留上下文。

3. 考量因素

在实践中,文本分割需要考虑多个因素:

考量因素描述
LLM限制如 GPT-3.5-turbo 的上下文窗口为 4096 个令牌。为确保不会超限,通常建议为输入和输出留出适当的令牌空间。
任务类型不同的任务需要不同大小的文本块。例如,进行细致的拼写检查时,使用较小的分块;而机器翻译和文本摘要等任务则需较大的块。
文本性质文本的结构强度(如代码与自然语言文本的区别)也会影响分割策略的选择。

4. 文本嵌入

文本块形成后,需要通过大语言模型进行嵌入,将文本转换为数值表示,便于计算机处理和比较。LangChain 的 Embeddings 类为与文本嵌入模型交互提供了标准接口。

嵌入方法

LangChain 提供两种主要方法:

方法描述
embed_documents为多个文本创建嵌入。
embed_query为单个查询创建嵌入。

这种设计使得模型能根据不同的需求分别处理文档和查询,从而提高效率。

5. 缓存嵌入

计算嵌入是一个耗时的过程,因此可以使用 CacheBackedEmbeddings 来缓存计算的嵌入,以便下次快速访问。支持多种缓存方式,如:

缓存方式描述
InMemoryStore在内存中存储嵌入,适合临时使用。
LocalFileStore在本地文件系统中存储嵌入,适合不依赖外部数据库的情况。
RedisStore在 Redis 数据库中提供高速缓存。

6. 向量数据库

向量数据库是存储嵌入的常见方式,LangChain 支持多种向量数据库,如 Elasticsearch、Faiss、Chroma 和 Qdrant。选择合适的向量数据库需要考虑多个因素:

选择因素描述
数据规模和速度需求处理大规模数据时,某些数据库可能更具优势。
持久性和可靠性是否需要高可用性和备份功能。
易用性和支持数据库的学习曲线和社区支持。

7. 数据检索

在 LangChain 中,检索器(Retriever)是数据检索模块的核心,负责通过非结构化查询返回相关文档。以下是一个简单的端到端数据检索示例:

import os
from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator

# 设置 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = 'Your OpenAI Key'

# 加载文档
loader = TextLoader('path_to_document.txt', encoding='utf8')

# 创建索引
index = VectorstoreIndexCreator().from_loaders([loader])

# 执行查询
query = "玫瑰花的花语是什么?"
result = index.query(query)
print(result)  # 输出结果

8. 索引管理

LangChain 提供的索引 API 可高效管理和定位文档信息,避免冗余内容并优化搜索结果。索引的优势包括:

优势描述
避免重复内容确保向量存储中没有冗余数据。
优化搜索结果提高搜索的准确性。
只更新更改的内容能检测哪些内容已更新,避免不必要的重写。

总结与展望

RAG 技术通过将非结构化数据的嵌入向量存储与检索机制结合,为信息检索提供了极大的灵活性。它能够在多种场景中发挥作用,如鲜花运营、客户支持、订单管理等。通过 RAG,企业能够快速响应客户查询,提升客户体验,并有效管理大规模信息数据。

随着技术的不断发展,RAG 的应用范围还将进一步扩大,为各行各业提供更高效的解决方案。未来,RAG 可能与深度学习模型更紧密结合,提供更智能的自动化服务,推动各行业的数字化转型。