详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

news/2025/10/7 10:33:39/文章来源:https://www.cnblogs.com/ljbguanli/p/19128250

详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

在本文中,我将详细介绍如何使用LangChain框架构建一个完整的RAG(检索增强生成)问答系统。通过向量检索获取相关上下文,并结合大语言模型,我们能够构建出一个能够基于特定知识库回答问题的智能系统。

1. 基础设置与向量检索准备

首先,我们需要导入必要的库并设置向量存储访问:

import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_redis import RedisConfig, RedisVectorStore
# 加载环境变量
load_dotenv(
)
# 定义查询问题
query = "我的生日是几月几日?"
# 初始化阿里云百炼平台的向量模型
embedding = DashScopeEmbeddings(model="text-embedding-v3"
, dashscope_api_key=os.getenv("ALY_EMBADING_KEY"
)
)
redis_url = "redis://localhost:6379" # Redis数据库的连接地址
# 配置Redis向量存储
config = RedisConfig(
index_name="my_index2"
, # 索引名称
redis_url=redis_url, # Redis数据库的连接地址
)
# 创建向量存储实例和检索器
vector_store = RedisVectorStore(embedding, config=config)
retriever = vector_store.as_retriever(
)

这部分代码完成了以下工作:

  • 加载环境变量以安全地使用API密钥
  • 初始化阿里云文本嵌入模型
  • 配置Redis向量数据库连接
  • 创建检索器(retriever),用于执行向量相似度检索

2. 执行向量检索

接下来,我们使用检索器从向量库中获取与查询相关的文本段落:

# 执行检索,获取相关文本段落
retriever_segments = retriever.invoke(query, k=5
)
print(retriever_segments)
# 将检索结果整合
text = []
for segment in retriever_segments:
text.append(segment.page_content)

在这段代码中:

  • retriever.invoke(query, k=5) 检索与查询语义最相关的5个文本段落
  • 我们将检索到的每个段落的文本内容提取并整合到一个列表中

3. 构建Prompt模板

我们需要设计一个提示模板,将检索到的相关信息和用户问题一起传递给大语言模型:

from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
[
("system"
, """你是一个问答机器人,你的任务是根据下述给定的已知信息回答用户的问题
已知信息:{context}
用户问题:{query}
如果已知问题不包含用户问题的答案,或者已知信息不足以回答用户的问题,请回答"抱歉,我无法回答这个问题。"
请不要输出已知信息中不包含的信息或者答案。
用中文回答用户问题
"""
)
,
]
)
# 格式化prompt
prompt = prompt_template.invoke({
"context": text, "query": query
}
)
print(prompt.to_messages(
)[0].content)

这个提示模板:

  • 明确定义了AI助手的角色和任务
  • 设置了两个变量:{context}用于传入检索结果,{query}用于传入用户问题
  • 提供了清晰的回答指令,包括当信息不足时如何响应

4. 调用大语言模型获取回答

现在,我们使用LLM来生成基于上下文的回答:

from langchain_openai import ChatOpenAI
# 结果解析器,直接获取纯文本回复
parser = StrOutputParser(
)
# 初始化LLM模型接口
model = ChatOpenAI(base_url="https://openrouter.ai/api/v1"
, api_key=os.getenv("OPENAI_KEY"
)
,
model="qwen/qwq-32b:free"
)
# 调用模型获取回答
result = model.invoke(prompt)
print(result)

这里我们:

  • 使用了OpenRouter平台上的通义千问模型
  • 通过model.invoke(prompt)将格式化后的提示发送给模型
  • 获取模型的文本响应

5. 构建完整的RAG链

最后,我们将把所有步骤整合成一个完整的LangChain处理链,实现端到端的RAG问答:

from operator import itemgetter
# 辅助函数:收集文档内容
def collect_documents(segments):
text = []
for segment in segments:
text.append(segment.page_content)
return text
# 构建完整的处理链
chain = ({
"context": itemgetter("query"
) | retriever | collect_documents,
"query": itemgetter("query"
)
} | prompt_template | model | parser)
# 设置新的查询并执行链
query = "你能帮助史可轩处理日常事务吗"
response = chain.invoke({
"query": query
}
)
print(response)

这个链式处理流程:

  1. 接收用户查询
  2. 执行向量检索获取相关上下文
  3. 将上下文和查询组合到提示模板中
  4. 调用LLM生成回答
  5. 解析并返回最终的文本响应

详细解析链式处理

让我们解析一下这个链式处理的构建方式:

chain = ({
"context": itemgetter("query"
) | retriever | collect_documents,
"query": itemgetter("query"
)
} | prompt_template | model | parser)

这个链式结构使用了LangChain的管道操作符 |,实现了以下流程:

  1. itemgetter("query") 从输入字典中提取查询文本
  2. 将查询传递给 retriever 执行向量检索
  3. collect_documents 函数处理检索结果,提取文本内容
  4. 将处理后的上下文和原始查询分别作为 contextquery 传递给提示模板
  5. 提示模板格式化后的内容发送给LLM模型处理
  6. 最后通过 parser 解析LLM的响应,获取纯文本结果

总结

本文介绍了如何使用LangChain框架构建一个完整的RAG问答系统,主要包含以下步骤:

  1. 向量检索:从Redis向量数据库中检索与用户问题语义相似的文本段落
  2. 提示工程:设计合适的提示模板,将检索结果作为上下文与用户问题一起发送给模型
  3. 模型调用:利用LangChain的接口调用大语言模型生成答案
  4. 链式处理:使用LangChain的管道操作将各个组件整合成一个端到端的工作流

这种RAG架构具有很好的可解释性和可靠性,能够基于特定的知识库回答问题,避免了大语言模型"幻觉"问题,特别适合构建企业级知识问答系统、客服助手等应用。

通过向量检索提供相关上下文,我们可以让大语言模型更准确地回答特定领域的问题,同时也能降低知识更新的成本(只需更新向量库而无需重新训练模型)。这种方案在实际应用中具有很高的灵活性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站改版 优势php+mysql网站开发

需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围)。 将两数相除,要求不使用乘法、除法和%运算符。 得到商和余数。 被除数 %除数商 ... 余数 #这里%代表除 //1、求商,就是求里…

网站模板后台手机免播看成片

docker迁移容器 将容器保存为镜像 docker commit container-id image-name将保存好的镜像打包(保存到/path文件夹) docker save image-name > /path/image-name.tar将打包好的镜像迁移到新服务器,新服务器执行如下命令 scp -P 22 username旧服务器IP地址:/旧服务…

完整教程:docker创建postgreSql带多个init的sql

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vscode的文心快码插件不错

vscode的文心快码插件不错vscode的文心快码插件不错

做网络营销如何建立自己的网站昆明建网站要多少钱

事件委托(事件代理) 将原本需要绑定在子元素上的事件监听器委托在父元素上,让父元素充当事件监听的职务。 事件委托是一种利用事件冒泡的特性,在父节点上响应事件,而不是在子节点上响应事件的技术。它能够改善性能&a…

EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系

EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系 这四大组件共同构成了一个完整的、支持价值感知、博弈、创造与分布式协同的硬件基础。它们之间的关系,并非简单的并列,而是一个有机的、分层协同的体系。 一、 核心组件定…

地下城做心悦任务的网站wordpress后台cookies

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件,方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

自己有一个域名怎么做网站个人工作室装修风格

题目:77. 组合 参考链接:代码随想录 回溯法理论基础 回溯三部曲:回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

响水做网站需要多少钱企业网站建设规划ppt

开发条件:eclipsepydev插件django editor插件 关于eclipse安装小编就不多做介绍,我自己用的版本如下 1.安装pydev插件 启动Eclipse, 点击Help->Install New Software 弹出如下框 点击add 分别在 Name中填:Pydev, Location中填http://pydev.org/up…

加强网站微信公众号平台建设wordpress添加网易云音乐播放器

一、文件的属性 1. 权限详解 r 表示读权限————————————读取文件内容 w 表示写权限————————————编辑、新增、修改内容(非删除) x 代表执行权限———————————读取文件内容 — 表示没有该权限——————————读取文件内容 2. 权限对目录的重…

Educational Codeforces Round 183 (Rated for Div. 2)题解

Educational Codeforces Round 183 (Rated for Div. 2)题解Educational Codeforces Round 183 (Rated for Div. 2) 题解 A 直接提前分给三人,看看余下多少,然后用 3 去相减就行了。不过注意 3 的倍数的情况是 0。 #i…

html做的网页怎么变成网站wordpress充值金币

在OSI模型中,会话层(Session Layer)主要负责建立、管理和终止会话,提供数据交换的服务。然而,相对于物理层、数据链路层、网络层、运输层等层,会话层的协议并没有像其他层次那样具有明确的、广泛应用的协议…

济南住房和城乡建设局网站seo网站导航建设技巧

目录 一、前言 二、为什么会出现构造函数和析构函数 三、构造函数 🍎构造函数的概念 🍐构造函数特性 💦解释特性3:对象实例化时编译器自动调用对应的构造函数 💦解释特性4:构造函数支持重载 &…

股市技术分析突破

本书通过简洁生动的文字和图文并茂的形式介绍了股市分析的各种理论、技巧和心法。 全书分为4篇共10章。技术篇(第1~5章)重点介绍股票估值和财务报表分析的实用方法,以及技术分析的各种理论及技巧,包括常见的K线组合…

干货分享:无需下载,在线快速编辑图片的完整教程

你有没有遇到过这种情况:临时需要剪个图、去个水印,却发现电脑没装PS,或者软件太卡根本带不动?别担心,现在有不少在线P图工具特别好用,打开网页就能操作,无需安装,上手简单,连新手也能轻松搞定! 一、为什么推…

34.1STM32下的can总线实现知识(区分linux)_csdn - 详解

34.1STM32下的can总线实现知识(区分linux)_csdn - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

js实现promise常用场景使用示例

下面为你介绍 JavaScript 中 Promise 的几个些常用场景及实现示例,这些场景在实际开发中经常会遇到。 1. 异步请求处理 Promise 最常见的用途之一是处理异步请求,比如使用 fetch API 调用后端接口: // 发起 GET 请求…

企业加强网站建设的必要性天津网站优化公司推荐哪家

说明:本系列是七月算法深度学习课程的学习笔记 文章目录1神经网络与卷积神经网络1.1 深度神经网络适合计算机视觉处理吗1.2CNN的结构1.2.1 数据输入层1.2.2 卷积层1.2.3 激励层1.2.3 池化层1.2.4 全连接层1.3CNN的训练算法1.4CNN的优缺点2正则化与Droupout3典型结构…

spatial for parallel compute 使用简介

spatial for parallel compute 使用简介spatial 能干嘛 spatial 可以很方便地设计并行计算电路,内置了 并行计算语法和流水线语法支持。 下载与编译 官方下载地址是 https://github.com/stanford-ppl/spatial 国内的备…

网站icp备案信息成都旅游的网站建设

一、简介 本文介绍基于 buildroot 文件系统的 QT 模块的使用方法: • 如何在 buildroot 工具里编译 QT 动态库; • 编译及运行 qt_demo 应用程序; • 适配过程遇到的问题。 二、QT动态库编译 在项目根路径执行 ./build.sh buildroot_menuc…