16. LangChain实战项目2——易速鲜花内部问答系统

server/2025/3/3 20:32:33/

需求简介

易束鲜花企业内部知识库如下:

本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。

 

在前面课程的基础上,需要安装的依赖包如下:

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 核心机制与技术优势

一、核心功能
  1. 多视角查询扩展

    • 接收用户原始查询后,利用 LLM 自动生成多个语义相关但表达形式不同的子查询,例如针对模糊查询补充具体场景或同义词描述‌。
    • 每个子查询独立执行向量数据库检索,合并结果并去重,形成更全面的文档集合‌。
  2. 动态适配场景

    • 适用于用户输入模糊、语义范围广的场景(如开放性问题),通过多查询覆盖不同解读角度,降低因单一检索偏差导致的错误响应‌25。

二、技术实现原理
  1. 生成-检索-融合流程

    • 生成阶段‌:LLM 根据原始查询生成 3-5 个变体问题,例如将“气候变化的影响”扩展为“全球变暖的经济后果”“碳排放对生态系统的破坏”等‌。
    • 检索阶段‌:各子查询分别通过向量相似度计算从数据库召回 Top-K 文档‌。
    • 融合阶段‌:合并所有文档并按相关性排序,去重后返回最终结果集‌。
  2. 性能优化特性

    • 支持异步并发执行子查询检索,显著缩短整体响应时间‌2。
    • 可配置生成查询数量、LLM 温度参数(temperature)以平衡生成多样性与相关性‌。

三、典型应用场景
  1. 模糊语义解析

    • 当用户提问包含歧义术语(如“AI 的伦理问题”)时,自动生成“人工智能数据隐私风险”“机器学习算法偏见案例”等子查询,提升知识覆盖范围‌。
  2. 跨领域知识检索

    • 在垂直领域(如医疗、法律)中,通过多查询映射专业术语与通用表述,解决术语差异导致的检索遗漏问题‌

 

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>

运行

输入查询的问题后,后台运行的输出如下


http://www.ppmy.cn/server/172159.html

相关文章

进阶--jvm

目录 jvm部分 jvm的作用 jvm内部构造 垃圾回收部分 类加载系统 类加载过程 类在哪些情况下被加载 类在以下两种情况下,是不会被加载的 运行时数据区 程序计数器 本地方法栈 堆 堆空间区域划分 为什么分区(代) 对象创建存储过程: JVM调优 方法区 方法区的垃圾…

Github 仓库 git clone 速度过慢解决方案

很多时候想从 GitHub 上 clone 一个仓库&#xff0c;都会遇到速度慢的问题&#xff0c;而且经常连接失败&#xff0c;这里给出有效解决方案。 一、背景 应该是很多小伙伴碰到过的问题&#xff1a;想从 GitHub 上面 clone 项目&#xff0c;很多情况下会慢的离谱&#xff0c;等…

专业工具,提供多种磁盘分区方案

随着时间的推移&#xff0c;电脑的磁盘空间往往会越来越紧张&#xff0c;许多人都经历过磁盘空间不足的困扰。虽然通过清理垃圾文件可以获得一定的改善&#xff0c;但随着文件和软件的增多&#xff0c;磁盘空间仍然可能显得捉襟见肘。在这种情况下&#xff0c;将其他磁盘的闲置…

基于springboot+vue实现的宠物救助及领养平台(源码+L文+ppt)43-21

摘 要 宠物救助及领养平台是一个专注于宠物保护和幸福的在线平台。它致力于连接那些需要帮助的宠物与愿意给予它们关爱的家庭。通过这个平台&#xff0c;人们可以报告丢失的宠物、寻求救助资源&#xff0c;以及浏览可领养的宠物信息。该平台不仅提供了一个渠道&#xff0c;让…

【C++经典例题】回文串判断:两种高效解法剖析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;C经典例题 期待您的关注 目录 一、问题描述 示例 二、解法一&#xff1a;将字母数字连接到新的 string 思路 代码实现 代码解…

【R包】pathlinkR转录组数据分析和可视化利器

介绍 通常情况下&#xff0c;基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因&#xff08;deg&#xff09;。理解如此庞大的数据集的生物学意义变得非常困难&#xff0c;尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…

Nginx+PHP+MYSQL-Ubuntu在线安装

在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下&#xff1a; 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx&#xff1a; sudo apt install nginx启动并启用 Nginx 服务&#xff1a; sudo…

Docker项目部署-部署Java应用

总结 部署一个Java项目需要做什么事情。 1.首先需要将项目打包&#xff0c;打包完得到jar包。 2.把打包得到的jar包和Dockerfile一起放到虚拟机里。 3.利用命令docker build -t 镜像名 . 构建镜像。 4.最后利用docker run 去部署应用。