大家好,我是静愚,朋友们都喜欢叫我“鲸鱼”。我将带领大家开启一段Langchain技术的实战之旅。
以《易车》实际应用场景为背景的系列学习文章,旨在帮助你们更直观、更深入地理解和掌握Langchain技术。
掌握一项技术,最重要的是能够解决实际问题。脱离了业务场景的技术,就像是无根之木、无源之水。
在这里,我们一起探索如何将Langchain技术应用于实际业务,让技术落地生根,助力业务发展。
上篇讲解了整个实战学习Langchain项目的环境准备。
在深入剖析LangChain的各个核心组件之前,我将从零开始,逐步构建一个实用的实践项目。通过这一过程体验LangChain作为基于大型语言模型的应用开发框架,其功能的强大究竟体现在何处。
这种直观的感受将有助于您更深刻地理解LangChain的潜力和应用范围。
项目介绍
我先大概介绍一下这个项目,以及此项目的开发框架。
项目名称:“易车”——汽车销售智问智答。
项目介绍:“易车”作为一个大型的在线汽车销售问答系统,有业务流程和规范,同时也有员工的销售指导手册。新员工入职销售培训时,会分享相关的信息。但是,这些信息分散于内部网和其他部门目录各处,有时不便查询;有时因为文档过于冗长,员工无法第一时间找到想要的内容;有时公司销售政策已更新,但是员工手头的文档还是旧版内容。
基于上述需求,我们将开发一套基于各种内部汽车销售知识的 “LLM-QA” 系统。这个系统将充分利用 LangChain 框架,处理从销售手册中提到的各种问题。这个问答系统能够理解销售人员的问题,并基于最新的销售指导手册,给出精准的答案。
项目框架:下面这张图片描述了通过 LangChain 框架实现一个知识库文档系统的整体框架。
其中:
数据源(Data Sources):数据可以有很多种,包括 PDF 在内的非结构化的数据(Unstructured Data)、SQL 在内的结构化的数据(Structured Data)。在这个示例中,我们聚焦于对非结构化数据的处理。
大模型应用(Application,即 LLM App):以大模型为逻辑引擎,生成我们所需要的回答。
用例(Use-Cases):大模型生成的回答可以构建出 QA/ 聊天机器人等系统。
核心机制:项目的核心实现原理就是下图的数据处理及检索流程。
在构建基于文档的问答系统的每一步中,LangChain 精心准备了一系列高效工具,旨在让这一过程变得前所未有的流畅与便捷。整个流程精妙地划分为五个关键阶段,让我们逐一深入探索:
- Loading(加载):LangChain 的文档加载器如同一位灵巧的搬运工,将各类文档转化为LangChain易于解读的格式。
- Splitting(分割):接着,文本分割器如同一位细心的厨师,将庞大的文档精心切割成更易于管理的“文档块”。这一步骤的关键在于平衡信息的完整性与处理的效率,确保每一块内容都能独立成章,同时又便于后续的分析与检索。
- Storage(存储):随后,这些精心分割的文档块被赋予了新的生命——它们被转化为“嵌入”(Embedding),一种能够捕捉文本深层含义的数值表示,并被妥善存储于向量数据库(Vector DB)之中。
- Retrieval(检索):当应用程序接收到用户的查询时,检索机制便如同一位敏锐的侦探,开始在向量数据库中穿梭,利用余弦相似度等高级算法,寻找与用户问题最为契合的嵌入片。
- Output (输出):最终,经过层层筛选的相似嵌入片与用户的原始问题一同被传递给语言模型(LLM)。在这里,它们将共同激发创意的火花,生成既准确又富有洞察力的答案。LangChain的这一环节,就像是连接用户与知识海洋的桥梁,让每一次问答都充满惊喜与价值。
值得注意的是,上述流程中涉及的“嵌入”、“向量存储”等概念,虽然初听起来可能略显抽象,但它们正是现代自然语言处理技术的核心所在。无需担忧,随着我们后续的详细讲解,这些概念将逐渐变得清晰易懂,助您更好地掌握LangChain这一强大工具。
文件准备及Load
此次材料准备了三种文件类型的源文档,包括PDF、doc、txt格式的文件。可以在这里下载
首先用 LangChain 中的 document_loaders
来加载各种格式的文本文件。在项目目录下,我创建了一个files的目录用于存放文件附件。
在这一步中,我们从 pdf、word、txt和md 文件中加载文本,然后将这些文本存储在一个列表中。(注意:可能需要安装 PyPDF、Docx2txt 等库)
# 1. 导入Document Loaders
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders import Docx2txtLoader
from langchain_community.document_loaders import TextLoader
# 加载文件
base_file_path = './files' # 文档的存放目录
documents = []
for file in os.listdir(base_file_path):