创世网站,网站开发 行业动态,哪个网站是自己销售,深圳比较好的设计院需求简介
易束鲜花企业内部知识库如下#xff1a; 本实战项目设计一个内部问答系统#xff0c;基于这些内部知识#xff0c;回答内部员工的提问。 在前面课程的基础上#xff0c;需要安装的依赖包如下#xff1a;
pip install docx2txt
pip install qdrant-client
pip i…需求简介
易束鲜花企业内部知识库如下 本实战项目设计一个内部问答系统基于这些内部知识回答内部员工的提问。 在前面课程的基础上需要安装的依赖包如下
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_nameai_model, temperature0)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的llmbge-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_size200, chunk_overlap10)
chunked_documents text_splitter.split_documents(documents)from langchain_community.vectorstores import Qdrant
vectorstore Qdrant.from_documents(documentschunked_documents,embeddingembedings,location:memory:,collection_namemy_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(retrievervectorstore.as_retriever(), llmllm)# 实例化一个RetrievalQA链
qa_chain RetrievalQA.from_chain_type(llm, retrieverretriever_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 APPapp.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, resultresult)return render_template(index.html)if __name__ __main__:app.run(host0.0.0.0, debugTrue, port5000) 这里使用flask启动了一个服务监听post请求调用qa链返回数据渲染到index.html
index.html文件内容如下
bodydiv classcontainerdiv classheaderh1易速鲜花内部问答系统/h1img src{{ url_for(static, filenameflower.png) }} altflower logo width200/divform methodPOSTlabel forquestionEnter your question:/labelinput typetext idquestion namequestionbrinput typesubmit valueSubmit/form{% if result is defined %}h2Answer/h2p{{ result.result }}/p{% endif %}/div
/body
运行
输入查询的问题后后台运行的输出如下