我们跟随黄佳老师,一起学LangChain实战课!
我们要从头完成一个很实用、很有意义的实战项目。目的是直观感受一下LangChain作为一个基于大语言模型的应用开发框架,功能到底有多么强大。好的,现在就开始!
项目及实现框架
项目名称:“易速鲜花”内部员工知识库问答系统。
项目介绍:“易速鲜花”作为一个大型在线鲜花销售平台,有自己的业务流程和规范,也拥有针对员工的SOP手册。新员工入职培训时,会分享相关的信息。但是,这些信息分散于内部网和HR部门目录各处,有时不便查询;有时因为文档过于冗长,员工无法第一时间找到想要的内容;有时公司政策已更新,但是员工手头的文档还是旧版内容。
基于上述需求,我们将开发一套基于各种内部知识手册的 “Doc-QA” 系统。这个系统将充分利用LangChain框架,处理从员工手册中产生的各种问题。这个问答系统能够理解员工的问题,并基于最新的员工手册,给出精准的答案。
用 LangChain 框架实现一个知识库文档系统需要几个关键组件,包括数据源、索引器、检索器和模型。下面是一个整体框架的示例,展示如何使用 LangChain 来实现这样的系统。
1. 安装依赖
首先,确保你安装了 LangChain 和相关依赖。可以通过以下命令安装:
Copypip install langchain
pip install openai # 如果使用 OpenAI 模型
pip install faiss-cpu # 如果使用 FAISS 进行检索
2. 导入库
Copyfrom langchain import OpenAI, Vectorstore
from langchain.chains import RetrievalQA
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.vectorstores import FAISS
3. 数据加载
你需要一个文档数据源。可以是文本文件、PDF 文件或其他格式。以下是一个从文本文件加载文档的示例:
Copydef load_documents(file_path):
loader = TextLoader(file_path)
documents = loader.load()
return documents
4. 创建索引
使用向量存储(如 FAISS)来索引文档并进行检索:
Copydef create_vectorstore(documents):
embeddings = OpenAIEmbeddings() # 使用 OpenAI 的嵌入模型
vectorstore = FAISS.from_documents(documents, embeddings)
return vectorstore
5. 创建检索链
使用 LangChain 的 RetrievalQA 来创建问答链:
Copydef create_qa_chain(vectorstore):
llm = OpenAI() # 使用 OpenAI API 作为语言模型
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
return qa_chain
6. 主程序
整合上述组件,创建一个完整的知识库文档系统:
Copydef main(file_path):
# 加载文档
documents = load_documents(file_path)
# 创建向量存储
vectorstore = create_vectorstore(documents)
# 创建问答链
qa_chain = create_qa_chain(vectorstore)
# 示例:进行查询
query = "你的查询内容是什么?"
response = qa_chain.run(query)
print("回答:", response)
if __name__ == "__main__":
file_path = "path/to/your/documents.txt" # 替换为你的文档路径
main(file_path)
7. 扩展功能
- 多种数据源支持:可以扩展数据加载部分,支持 PDF、Word 文档等格式。
- 用户界面:可以使用 Flask 或 Django 创建一个 Web 界面,供用户输入查询。
- 更多功能:可以添加权限管理、用户历史记录、知识库更新等功能。
最后
回答课程中的思考题。
一. 请你用自己的话简述一下这个基于文档的QA(问答)系统的实现流程?
- 数据加载从各种数据源(如文本文件、PDF或其他文档格式)中加载文档。
- 文档处理对加载的文档进行清洗、分段或格式化,以便于后续步骤进行嵌入和索引。
- 向量化,使用预训练的嵌入模型(如OpenAI的嵌入模型)将处理后的文档转化为向量表示。
- 创建索引,将生成的文档向量存储到向量数据库中(如FAISS),以便快速检索相关文档。
- 问答链,使用问答模型(如OpenAI的语言模型)和创建的向量检索器构建问答链。
- 交互与响应,用户输入查询后,系统检索相关文档并生成答案,最后返回给用户。
- 扩展与优化,根据需求进一步扩展功能,例如增加用户界面、支持多种数据源等。
二. LangChain支持很多种向量数据库,你能否用另一种常用的向量数据库Chroma来实现这个任务?
mport os
from langchain import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 加载文档
def load_documents(file_path):
"""加载指定路径的文本文件并返回文档列表。"""
loader = TextLoader(file_path)
documents = loader.load()
return documents
# 创建向量存储
def create_vectorstore(documents):
"""将文档转换为向量并存储在Chroma数据库中。"""
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
return vectorstore
# 创建问答链
def create_qa_chain(vectorstore):
"""创建问答链以处理用户查询。"""
llm = OpenAI()
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever())
return qa_chain
# 主程序入口
def main(file_path):
"""整合所有组件以实现文档问答功能。"""
documents = load_documents(file_path)
vectorstore = create_vectorstore(documents)
qa_chain = create_qa_chain(vectorstore)
# 示例查询
query = "你的查询内容是什么?"
response = qa_chain.run(query)
print("回答:", response)
if __name__ == "__main__":
file_path = "path/to/your/documents.txt" # 替换为你的文档路径
main(file_path)
今天的学习结束了。