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用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
第14节 Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局…...
【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...
本地部署drawDB结合内网穿透技术实现数据库远程管控方案
文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...
