学习笔记:基于LangChain的“易速鲜花”内部员工知识库问答系统
项目概览
项目名称
“易速鲜花”内部员工知识库问答系统
项目介绍
“易速鲜花”是一个大型在线鲜花销售平台,需要一个系统来帮助员工快速查询内部业务流程和规范。该系统基于员工手册等内部知识手册,利用LangChain框架,处理员工提出的问题,并提供精准答案。
开发框架与核心机制
框架组成
- 数据源(Data Sources):包括非结构化数据(如PDF、Word文档)、结构化数据(如SQL数据库)和代码。
- 大模型应用(LLM App):以大模型为逻辑引擎,生成所需回答。
- 用例(Use-Cases):构建QA/聊天机器人等系统。
核心实现机制
- 数据处理管道(Pipeline):包括文档加载、文本分割、存储、检索和输出五个步骤。
具体实现流程
1. 数据的准备和载入
使用LangChain的document_loaders加载pdf、word和txt格式的文件,并将文本存储在列表中。
import os
os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.document_loaders import TextLoader
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. 文本的分割
使用RecursiveCharacterTextSplitter将文档切分成200字符左右的块,为嵌入和向量存储做准备。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)
3. 向量数据库存储
将分割后的文本转换成嵌入形式,并存储在向量数据库Qdrant中,使用OpenAIEmbeddings生成嵌入。
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Qdrant.from_documents(
documents=chunked_documents,
embedding=OpenAIEmbeddings(),
location=":memory:",
collection_name="my_documents",
)
4. 相关信息的获取
通过将问题转换为向量并与数据库中的向量比较,提取最相关的信息。选择余弦相似度作为度量标准,因为它更适用于文本数据的语义比较。
5. 生成回答并展示
创建Flask应用接收用户问题,使用RetrievalQA链获取相关文档和生成答案,最后在网页上显示。
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
question = request.form.get('question')
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)
思考题解答
基于文档的QA系统的实现流程
- 数据载入:将非结构化数据(PDF、Word、TXT)载入系统。
- 文本分割:将载入的文本分割成小块,便于处理。
- 嵌入存储:将文本块转换为向量并存储在向量数据库中。
- 信息检索:根据用户问题,从向量数据库中检索最相关的信息。
- 生成回答:利用大模型生成问题的答案,并在UI上展示。
使用Chroma实现任务
是的,可以使用Chroma作为向量数据库来实现这个任务。Chroma是一个开源的向量数据库,可以存储和检索向量化的数据。只需将代码中的Qdrant替换为Chroma,并进行相应的配置即可。
使用HuggingFace的google/flan-t5-x1模型
可以的,HuggingFace提供了多种预训练模型,包括google/flan-t5-x1。可以通过配置LangChain来使用这个模型代替GPT-3.5,需要确保模型接口与LangChain兼容,并进行相应的代码调整。
总结
通过这个项目,我们学习了如何使用LangChain框架来构建一个基于文档的问答系统。这个系统能够处理非结构化数据,通过大模型生成精准的回答,并且可以很容易地扩展到其他类型的数据和模型。LangChain的灵活性和易用性使得构建复杂的NLP应用变得更加简单。