Hanah

Hanah

wow-agent day06 RAG接入Agent

Reference:Datawhale wow agent day06

什么是 RAG?#

我们检索豆包得到以下回答:
在自然语言处理领域,语言模型通常是在大规模的文本语料上进行训练,以学习语言的模式和语义信息。然而,这些模型存在知识更新不及时、生成内容可能包含错误信息(如幻觉现象)等问题。RAG 技术的出现就是为了解决这些问题。
它将信息检索和文本生成相结合。简单来说,在生成回答之前,先从外部知识库(如文档数据库、知识图谱等)中检索相关的信息,然后利用这些检索到的信息来辅助语言模型生成更准确、更有针对性的回答。就像是在回答问题时,先去查阅相关的书籍资料,然后根据查到的内容来组织一个更好的回答。
工作流程

  1. 检索阶段
    当接收到一个用户的问题(例如,在问答系统中),系统会使用某种检索机制(如向量空间模型、倒排索引等)在知识库中查找与问题相关的文本片段。例如,如果问题是 “如何治疗感冒?”,系统会在医学知识库中检索包含 “感冒治疗方法” 相关内容的文档段落。
    这些检索到的文本片段可以是完整的句子、段落,甚至是多个文档的部分内容,它们被作为生成回答的参考信息。
  2. 生成阶段
    将检索到的信息和原始问题一起输入到语言生成模型中(如 Transformer 架构的生成式语言模型)。语言模型会根据这些输入,结合自身学到的语言知识,生成最终的回答。例如,语言模型会对检索到的感冒治疗方法相关的文本进行分析、整合,生成诸如 “感冒可以通过多喝水、休息和服用适当的药物来治疗” 这样的回答。

构建索引#

# 从指定文件读取,输入为List
from llama_index.core import SimpleDirectoryReader,Document
documents = SimpleDirectoryReader(input_files=['../docs/问答手册.txt']).load_data()

# 构建节点
from llama_index.core.node_parser import SentenceSplitter
transformations = [SentenceSplitter(chunk_size = 512)]

from llama_index.core.ingestion.pipeline import run_transformations
nodes = run_transformations(documents, transformations=transformations)

# 构建索引
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex

emb = embedding.get_text_embedding("你好呀呀")
vector_store = FaissVectorStore(faiss_index=faiss.IndexFlatL2(len(emb)))
storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(
    nodes = nodes,
    storage_context=storage_context,
    embed_model = embedding,
)

代码详解:这个代码的目的是将文本数据转化为向量表示,并构建一个可以用于快速检索的向量索引。通过这种方式,可以实现高效的文本搜索和相似性匹配。

  • 使用 SimpleDirectoryReader 从指定路径 docs\ 问答手册.txt 中读取数据。load_data () 方法将文件内容加载为 Document 对象的列表。
  • 使用 SentenceSplitter 将文本分割成更小的块,每个块的大小为 512 个字符。transformations 是一个包含分割规则的列表。
  • run_transformations 函数应用之前定义的 transformations,将 documents 转换为 nodes,这些节点将用于构建索引。
  • 使用 FaissVectorStore 和 faiss 库创建一个向量存储。IndexFlatL2 是一种基于 L2 距离的索引。
    StorageContext 用于管理存储上下文,from_defaults 方法使用默认设置创建上下文。
    VectorStoreIndex 使用节点、存储上下文和嵌入模型构建索引。

构建问答引擎#

# 构建检索器
from llama_index.core.retrievers import VectorIndexRetriever
# 想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len(emb)} # 必要参数
retriever = VectorIndexRetriever(**kwargs)

# 构建合成器
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm, streaming=True)

# 构建问答引擎
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(
      retriever=retriever,
      response_synthesizer=response_synthesizer,
        )

代码详解:这个代码片段的主要功能是构建一个问答系统,利用向量检索器和响应合成器来处理和生成对话响应。

  1. 导入模块:
  • 从 llama_index 库中导入 VectorIndexRetriever 类,用于创建向量索引检索器。
  • 构造参数字典:
    kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len (emb)}:创建一个字典 kwargs,用于存储检索器的参数。
    similarity_top_k: 设置为 5,表示在检索时返回最相似的 5 个结果。
    index: 使用之前构建的 index 对象。
    dimensions: 设置为 len (emb),表示嵌入向量的维度。
    创建检索器:
    retriever = VectorIndexRetriever (**kwargs):使用参数字典 kwargs 创建一个 VectorIndexRetriever 对象 retriever,用于执行向量检索。
  1. 从 llama_index 库中导入 get_response_synthesizer 函数,用于获取响应合成器。
    创建合成器:调用 get_response_synthesizer 函数,传入参数 llm(语言模型)和 streaming=True,创建一个响应合成器 response_synthesizer,用于生成对话响应。
  2. 导入模块:从 llama_index 库中导入 RetrieverQueryEngine 类,用于创建问答引擎。
    创建问答引擎:
    使用之前创建的 retriever 和 response_synthesizer 对象,创建一个 RetrieverQueryEngine 对象 engine,用于处理问答查询。

测试结果#

# 提问
question = "What are the applications of Agent AI systems ?"
response = engine.query(question)
for text in response.response_gen:
    print(text, end="")
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。