16. LangChain实战项目2——易速鲜花内部问答系统
需求简介
易束鲜花企业内部知识库如下:
本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。
在前面课程的基础上,需要安装的依赖包如下:
pip install docx2txt
pip install qdrant-client
pip install flask
初始化代码
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAIload_dotenv()
ai_model = os.getenv("OPENAI_MODEL")
# 实例化一个大模型工具
llm = ChatOpenAI(model_name=ai_model, temperature=0)from langchain_community.embeddings import HuggingFaceBgeEmbeddings
embedings = HuggingFaceBgeEmbeddings(model_name='./BAAI/bge-large-zh-v1.5', model_kwargs={'device': 'cuda'})import logging
logging.basicConfig()
logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO)
这段代码实例化了一个deepseek的llm,bge-large-zh 的向量模型、日志组件
导入内部知识到向量数据库
# 加载Documents
base_dir = './OneFlower'
documents = []
for file in os.listdir(base_dir):# 构建完整的文件路径file_path = os.path.join(base_dir, file)if file.endswith('.pdf'):loader = PyPDFLoader(file_path)documents.extend(loader.load())elif file.endswith('.docx'):loader = Docx2txtLoader(file_path)documents.extend(loader.load())elif file.endswith('.txt'):loader = TextLoader(file_path)documents.extend(loader.load())# 2.Split 将Documents切分成块以便后续进行嵌入和向量存储
from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)from langchain_community.vectorstores import Qdrant
vectorstore = Qdrant.from_documents(documents=chunked_documents,embedding=embedings,location=":memory:",collection_name="my_documents",
)
内部知识在OneFlow文件夹中,包含了pdf文档、文本文档、word文档等格式,通过加载器加载到document中,然后使用分词器去分割,最后以内存的方式存入到Qdrant向量数据库中
构建查询的QA链
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.chains import RetrievalQA# 实例化一个MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)# 实例化一个RetrievalQA链
qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever_from_llm)
MultiQueryRetriever 核心机制与技术优势
一、核心功能
-
多视角查询扩展
- 接收用户原始查询后,利用 LLM 自动生成多个语义相关但表达形式不同的子查询,例如针对模糊查询补充具体场景或同义词描述。
- 每个子查询独立执行向量数据库检索,合并结果并去重,形成更全面的文档集合。
-
动态适配场景
- 适用于用户输入模糊、语义范围广的场景(如开放性问题),通过多查询覆盖不同解读角度,降低因单一检索偏差导致的错误响应25。
二、技术实现原理
-
生成-检索-融合流程
- 生成阶段:LLM 根据原始查询生成 3-5 个变体问题,例如将“气候变化的影响”扩展为“全球变暖的经济后果”“碳排放对生态系统的破坏”等。
- 检索阶段:各子查询分别通过向量相似度计算从数据库召回 Top-K 文档。
- 融合阶段:合并所有文档并按相关性排序,去重后返回最终结果集。
-
性能优化特性
- 支持异步并发执行子查询检索,显著缩短整体响应时间2。
- 可配置生成查询数量、LLM 温度参数(
temperature
)以平衡生成多样性与相关性。
三、典型应用场景
-
模糊语义解析
- 当用户提问包含歧义术语(如“AI 的伦理问题”)时,自动生成“人工智能数据隐私风险”“机器学习算法偏见案例”等子查询,提升知识覆盖范围。
-
跨领域知识检索
- 在垂直领域(如医疗、法律)中,通过多查询映射专业术语与通用表述,解决术语差异导致的检索遗漏问题
RetrievalQA
组件解析
一、核心功能与定位
- 检索增强生成(RAG):将外部知识库检索与语言模型生成能力结合,通过“先检索后回答”机制提升问答准确性13。
- 适用场景:适用于需要结合结构化/非结构化数据(如文档、数据库)的问答系统,可解决大模型幻觉问题
启动服务器
# 5. Output 问答系统的UI实现
from flask import Flask, request, render_templateapp = Flask(__name__) # Flask APP@app.route('/', methods=['GET', 'POST'])
def home():if request.method == 'POST':# 接收用户输入作为问题question = request.form.get('question')# RetrievalQA链 - 读入问题,生成答案result = qa_chain({"query": question})# 把大模型的回答结果返回网页进行渲染return render_template('index.html', result=result)return render_template('index.html')if __name__ == "__main__":app.run(host='0.0.0.0', debug=True, port=5000)
这里使用flask启动了一个服务,监听post请求,调用qa链,返回数据渲染到index.html
index.html文件内容如下:
<body><div class="container"><div class="header"><h1>易速鲜花内部问答系统</h1><img src="{{ url_for('static', filename='flower.png') }}" alt="flower logo" width="200"></div><form method="POST"><label for="question">Enter your question:</label><input type="text" id="question" name="question"><br><input type="submit" value="Submit"></form>{% if result is defined %}<h2>Answer</h2><p>{{ result.result }}</p>{% endif %}</div>
</body>
运行
输入查询的问题后,后台运行的输出如下
相关文章:

16. LangChain实战项目2——易速鲜花内部问答系统
需求简介 易束鲜花企业内部知识库如下: 本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。 在前面课程的基础上,需要安装的依赖包如下: pip install docx2txt pip install qdrant-client pip i…...

一文了解Conda使用
一、Conda库频道 conda的软件频道是存储软件包的远程位置,当在Conda中安装软件包时,它会从指定的频道中下载和提取软件包。频道包含了各种软件包,不同的频道可能提供不同版本的软件包,用户可以根据需要选择适合的版本。 常见 Co…...
AI辅助学习vue第十四章
第十四章:技术引领与未来展望 在第十五章,你已经在Vue技术领域深耕许久,积累了丰富的经验与卓越的影响力。此时,你将站在行业前沿,引领技术走向,为Vue技术的未来发展开辟新道路。 1. 引领Vue技术发展方向…...
chromadb向量数据库使用 (1)
目录 完整代码代码解释 完整代码 import chromadb chroma_client chromadb.Client()collection chroma_client.create_collection(name"my_collection")collection.add(documents["This is a document about pineapple","This is a document about…...

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select
目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…...
关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并…...
PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1 中,10 是主要版本,1 是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。 版本号规则: PostgreSQL 10 及以后:版本号…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
JAVA面试常见题_基础部分_mybatis面试题
1、什么是 MyBatis? 答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 :MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…...
RISC-V汇编学习(一)—— 基础认识
最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要…...
【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
一、问题描述: 在Delphi 中使用WebView2控件,如果预先把主界面置顶(Self.FormStyle : fsStayOnTop;),此时,如果在Web页面中有使用(<input type"file" id"fileInput" acc…...

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除
目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话,相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…...

基金 word-->pdf图片模糊的解决方法
1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印],其中打印机选择pdf阅读器,例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像],将所有的采样、压缩均设置为 关闭。点击[另存为],保存为 基金报告…...

React底层原理详解
React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解 在面试中介绍React底层原理时,需遵循逻辑清晰、层次分明、重点突出的原则,结合技术深度与实际应用场景。以下是结构化回答模板:…...

Word 插入图片会到文字底下解决方案
一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…...
基于DeepSeek 的图生文最新算法 VLM-R1
目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...
Composer如何通过GitHub Personal Access Token安装私有包:完整教程
使用Composer安全管理您的PHP私有依赖包 一、前言 在PHP开发中,我们经常需要将内部工具包托管为私有仓库。传统的账号密码验证方式存在安全隐患,而GitHub Personal Access Token(PAT)提供了一种更安全的鉴权方案。本文将通过4个…...
postgresql postgis扩展相关
项目 下载地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…...

基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

神经网络之RNN和LSTM(基于pytorch-api)
1.RNN 1.1简介 RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...