在这篇博文中,我们将深入探讨如何利用LangChain打造一个企业内部员工知识库问答系统的开发框架以及核心实现机制。作为一个旨在企业内部提供员工所需信息的知识库问答系统,其重要性在于提高员工的工作效率,确保他们能够及时准确地获取所需信息。
项目概述
项目名称: 企业内部员工知识库问答系统。
项目介绍: 某外资企业作为一个大型跨国合资企业,拥有繁琐的业务流程和规范。为了帮助新员工更好地适应工作并提高现有员工的工作效率,公司提供了一套包含SOP(Standard Operating Procedure)手册的内部知识库。然而,这些信息散落于各个国家内部网和HR部门目录之中,有时难以查询,有时内容过于冗长,员工无法迅速找到所需信息,有时又存在文档更新不及时的问题。为解决这些问题,我们决定开发一套基于各种内部知识手册的“Doc-QA”系统,旨在提供高效、准确的问答服务。
开发框架
我们采用了LangChain框架来实现这个问答系统,下面是整体框架的描述:
该框架主要分为三个部分:
-
数据源(Data Sources): 数据可以是各种形式,包括非结构化数据(如PDF、Work)、结构化数据(如SQL)、以及代码(如Python、Java)等。在我们的示例中,我们将重点放在非结构化数据的处理上。
-
大模型应用(Application): 这是逻辑引擎,利用大型语言模型生成我们所需要的回答。
-
用例(Use-Cases): 大模型生成的回答可以被用于构建QA/聊天机器人等系统。
核心实现机制
这个项目的核心实现机制是数据处理管道(Pipeline),其包含以下五个步骤:
-
加载(Loading): 文档加载器将文档加载为LangChain可读取的形式。
-
分割(Splitting): 文本分割器将文档切分为指定大小的分割,形成“文档块”或“文档片”。
-
存储(Storage): 将分割后的文档以嵌入的形式存储到向量数据库中,形成“嵌入片”。
-
检索(Retrieval): 应用程序从存储中检索分割后的文档,通过比较余弦相似度等方法找到与输入问题相似的嵌入片。
-
输出(Output): 将问题和相似的嵌入片传递给语言模型,生成最终的答案。
实现阶段
数据的准备和载入
我们先预先准备一些虚拟的企业内部资料:包括pdf、word 和 txt 格式的各种文件。大家需要可以点击下载。
安装包
pip install pypdf
pip install docx2txt
pip install qdrant-client
pip install Flask
pip install -U langchain-community
实现思路
- 导入所需的库和模块,包括文本加载器、分词器、向量存储和检索器等。
- 指定文档的存储目录,并遍历目录中的所有文件。根据文件扩展名使用不同的加载器加载文档。
- 将加载后的文档分割成块,以方便后续进行嵌入和向量存储。
- 使用Qdrant作为向量数据库,将嵌入后的文档存储到其中。
- 初始化GPT-3.5模型和大模型工具ChatOpenAI,创建一个RetrievalQA链。
- 实现一个简单的Web应用程序,接收用户输入的问题,并使用RetrievalQA链生成答案。最后,将答案返回网页进行渲染。
LangChain代码实现
import os
# 1.Load 导入Document Loaders
from langchain_community.document_loaders import TextLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders import Docx2txtLoader
#加载Documents
base_dir = '文档的存放目录'
documents = []
for file in os.listdir(base_dir):
# 构建完整的文件路径
file_path = os.path.join