利用LangChain构建“易速鲜花”内部员工知识库问答系统
项目框架
该项目的实现框架主要包括三个部分:
- 数据源:处理各种格式的文档(如PDF、Word和TXT)。
- 大模型应用:使用大语言模型(LLM)生成回答。
- 用例:构建问答系统或聊天机器人,以满足员工的查询需求。
实现流程
我们将整个项目的实现分为五个步骤:
1. 数据加载
首先,我们使用LangChain中的文档加载器来导入不同格式的文件。通过编写Python代码,我们能够将PDF、Word和TXT文档转换为LangChain可以处理的格式。
import os
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, 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将加载的文档切分成更小的块,以便后续处理。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)
3. 向量数据库存储
我们将这些分割后的文本转换为嵌入,并使用Qdrant向量数据库进行存储。嵌入是将文本转换为数字向量,从而能够在高维空间中进行相似度计算。
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. 信息检索
我们创建一个检索式问答模型,通过比较用户提问的向量与向量数据库中的嵌入,找到最相关的信息。
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())
5. 生成回答并展示
最后,我们利用Flask框架构建一个简单的网页应用,以接收用户的问题并返回相应的答案。
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(问答)系统的实现流程?
首先,通过LangChain的文档加载器从不同格式的文件(如PDF、Word和TXT)中读取公司内部资料,将其转换为可处理的文本格式。接着,利用文本分割器将这些文档切分为较小的文本块,以便后续操作。然后,系统将这些文本块转换为嵌入并存储在向量数据库中,以便快速检索。用户提问时,系统将输入的问题转化为向量,与向量数据库中的嵌入进行比较,检索出最相关的文本块。最后,系统将这些检索到的文本与问题一同输入到大语言模型中,生成准确的答案,并通过网页应用展示给用户。
- LangChain支持很多种向量数据库,你能否用另一种常用的向量数据库Chroma来实现这个任务?
1. 数据加载
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, 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. 文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10) chunked_documents = text_splitter.split_documents(documents)3. 向量数据库存储
from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma vectorstore = Chroma.from_documents( documents=chunked_documents, embedding=OpenAIEmbeddings(), collection_name="my_documents", )4. 创建问答模型
from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())5. Flask应用示例
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)