首页 > 其他分享 >基于langchain的RAG问答(QA)链实现

基于langchain的RAG问答(QA)链实现

时间:2024-11-06 18:45:39浏览次数:5  
标签:检索 RAG docs langchain QA 文档 import 向量

文章目录

概要

该博客将解释如何使用langchain实现一个基于 RAG(检索增强生成)的问答(QA)系统。通过本博客,你将了解从 JSON 文件读取数据、向向量数据库添加文档、进行相似性检索、以及通过大语言模型生成回答的过程。

整体架构流程


1. 加载 JSON 数据
import json

# 定义 JSON 文件路径
file_path = "/dataset/test_m3e.json"  # 替换为实际的 JSON 文件路径

# 打开并读取 JSON 文件
with open(file_path, 'r', encoding='utf-8') as f:
    json_data = json.load(f)

# 提取 "input" 和 "output" 字段作为 query 和 answer
query = [item['input'] for item in json_data]
answer = [item['output'] for item in json_data]

说明:

  • 该代码首先定义文件路径并加载 JSON 文件。
  • JSON 文件中的 input 代表查询内容,output 是对应的回答。

2. 创建文档对象并添加元数据
from langchain_core.documents import Document

# 创建包含 query 和 answer 的文档对象列表
docs = [Document(page_content=query, metadata={'answer': answer}) for query, answer in zip(query, answer)]

# 打印调试信息
print(f"Number of documents: {len(docs)}")
for i, doc in enumerate(docs):
    print(f"Document {i}: {doc}")

说明:

  • 这里通过 Document 对象将查询内容和回答进行配对并封装。page_content 存储查询内容,metadata 中的 answer 是对应的回答。
  • 此步骤便于后续检索时关联查询和答案。

3. 初始化嵌入模型
from langchain_huggingface import HuggingFaceEmbeddings

# 使用 HuggingFace 的 m3e 基础嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="moka-ai/m3e-base") #亦可以将embedding model 部署到本地

说明:

  • 使用 HuggingFaceEmbeddings 类来加载 m3e (m3e中文语料库训练)嵌入模型。
  • 嵌入模型负责将文本转换成向量表示,以便后续的相似性检索。

4. 初始化 Chroma 向量存储
from langchain_chroma import Chroma

# 初始化 Chroma 向量数据库
vector_store = Chroma(
    collection_name="aied_v1",
    embedding_function=embeddings,
    persist_directory="./chroma_db_test_m3e"  # 可选:存储数据的本地目录
)

说明:

  • 使用 Chroma 向量存储来保存嵌入向量数据,并指定了保存的目录,以便持久化存储数据。

5. 向向量数据库添加文档
from uuid import uuid4

# 为每个文档生成唯一ID
uuids = [str(uuid4()) for _ in range(len(docs))]
# 将文档添加到向量数据库中
vector_store.add_documents(documents=docs, ids=uuids)

说明:

  • 为每个文档生成唯一的 UUID,以确保数据库中的每个记录都是唯一的。
  • 使用 add_documents 方法将所有文档存储到 Chroma 向量数据库中。

6. 基于相似度检索文档
# 使用向量数据库进行文本相似性检索
results = vector_store.similarity_search("德育教育", k=2)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

说明:

  • 使用 similarity_search 方法进行查询,返回与“德育教育”最相似的文档。
  • 设置参数 k=2 以限制返回的文档数量为2个。

7. 通过嵌入向量检索相似文档
# 使用嵌入向量进行检索
results = vector_store.similarity_search_by_vector(
    embedding=embeddings.embed_query("德育含义"), k=1
)
for doc in results:
    print(f"* {doc.page_content} [{doc.metadata}]")

说明:

  • similarity_search_by_vector 方法通过嵌入向量检索相似文档,适合预先已生成向量的查询。
  • 该方法比直接文本检索更高效,特别适用于大数据量环境下的相似性计算。

8. 初始化检索器
retriever = vector_store.as_retriever(
    search_type="mmr", search_kwargs={"k": 1, "fetch_k": 2}
)

说明:

  • 初始化检索器以便用于 RAG。
  • 使用 MMR(最大边际相关性)作为检索方式,参数 k=1 指定返回1个结果,fetch_k=2 表示最多检索2个结果。

9. 加载 RAG 提示模板
from langchain import hub

# 从 hub 中加载预定义的 RAG 提示模板
prompt = hub.pull("rlm/rag-prompt")  #也可以通过提示工程自定义提示模版

说明:

  • 加载用于 RAG 的提示模板,该模板定义了生成回答的输入输出格式。
  • 该模板将用于生成答案的格式化。

10. 定义 RAG 链并生成回答
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 初始化大语言模型
llm = ChatZhipuAI(
    temperature=0.5,
    model="glm-4",
    api_key="xxx"  
)

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)
# 定义 RAG 链并进行文档格式化、提示、生成回答
rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 使用 RAG 链生成回答
rag_chain.invoke("什么是德育含义?")

说明:

  • RAG 链将检索结果格式化并通过提示模板提供给语言模型生成回答。
  • format_docs 函数用于将文档内容格式化为连续文本。
  • 使用 invoke 方法传入问题,并通过 StrOutputParser 解析生成的答案。

总结

通过上述步骤,我们完成了 RAG 的代码实现,包括:

  • 加载数据
  • 嵌入向量生成与存储
  • 向量相似性检索
  • 使用提示模板和检索所得文档和大语言模型生成回答

技术名词解释

提示:这里可以添加技术名词解释

例如:

  • Chroma

小结

后续会基于gradio搭建完整的QA系统

标签:检索,RAG,docs,langchain,QA,文档,import,向量
From: https://blog.csdn.net/qq_44742936/article/details/143577202

相关文章

  • AI-Prompt、RAG、微调还是重新训练?选择正确的生成式AI的使用方法
    生成式人工智能正在快速发展,许多人正在尝试使用这项技术来解决他们的业务问题。一般情况下有4种常见的使用方法:PromptEngineeringRetrievalAugmentedGeneration(RAG检索增强生成)微调从头开始训练基础模型(FM)本文将试图根据一些常见的可量化指标,为选择正确的生......
  • 基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
    文本到图谱的转换是一个具有技术挑战性的研究领域,其核心任务是将非结构化文本数据转换为结构化的图谱表示。这种技术虽然由来已久,但随着大型语言模型(LLMs)的发展,其应用范围得到了显著扩展,并逐渐成为主流技术方案之一。上图展示了信息抽取过程中文本到知识图谱的转换。图左侧展......
  • 07LangChain实战课 - LLM模块使用与自定义模型调用
    LangChain实战课-LLM模块使用与自定义模型调用1.课程简介本节课聚焦于LangChain中的LLM(LargeLanguageModel)模块,探讨如何使用不同的大语言模型,包括开源模型和自定义模型。2.大语言模型的发展Transformer架构:Google在2018年提出的架构,是现代预训练模型的核心。基础......
  • 08LangChain实战课 - 输出解析器深入与Pydantic解析器实战
    LangChain实战课-输出解析器深入与Pydantic解析器实战1.课程回顾第5课中,我们学习了如何为花和价格生成吸引人的描述,并将这些描述和原因存储到CSV文件中。程序调用了OpenAI模型,并利用了结构化输出解析器以及数据处理和存储工具。2.LangChain中的输出解析器输出解析器......
  • QA在需求评审时,都需要关注哪些点
    业务场景用户角度:考虑用户遇到情况,各种情况在需求中是否有对应描述业务流程图:根据用户故事画出简单流程图,各个业务逻辑路径之间的约束关系,执行条件是否有明确合目的定义:功能点数据约束是否全面、合理有在分支的逻短,描述是否覆盖所有路径多状态流程,状态流转描述是否合理......
  • 零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG
    零基础学习SpringAIJavaAI使用向量数据库postgresql检索增强生成RAG向量数据库是一种特殊类型的数据库,在人工智能应用中发挥着至关重要的作用。在向量数据库中,查询与传统的关系数据库不同。它们不是进行精确匹配,而是执行相似性搜索。当给定一个向量作为查询时,向量数......
  • 基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
    作者:肯梦本文将演示如何使用事件总线(EventBridge),向量检索服务(DashVector),函数计算(FunctionCompute)结合灵积模型服务[1]上的EmbeddingAPI[2],来从0到1构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于OSS文本文档动态插入数据,进行实时的文本......
  • Windows Server 2025 Enhanced Storage 是微软在其未来版本的 Windows Server 操作系
    WindowsServer2025EnhancedStorage是微软在其未来版本的WindowsServer操作系统中引入的一项新技术或功能,旨在增强存储管理和优化存储性能。虽然在我的知识库中没有具体的“WindowsServer2025EnhancedStorage”这个专有术语的详细描述,但我可以根据类似技术的背景以及微......
  • 前端数据持久化指南:LocalStorage、SessionStorage 等的区别与应用
    一、引言在前端开发中,数据持久化是一个至关重要的需求。它能够确保用户在不同页面切换、刷新页面或者关闭浏览器后,数据仍然能够被保存和恢复。本文将详细介绍几种实现前端数据持久化的方法,并深入分析它们之间的区别。二、实现前端数据持久化的方法(一)LocalStorage介绍:LocalS......
  • averaged_perceptron_tagger_eng模块
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注......