目前大语言模型层出不穷,每一个大语言模型都要去其发布的repo里学习安装和使用方法,以前实际使用时也感觉到这种方式的冗余。在接触了LangChain之后,才找到了一个如此便利的工具,能够将不同的语言大模型集成在一起,通过模块化的方式进行调用,实属方便。因此,特开此系列笔记简要记录自己的LangChain学习心得和思考,方便以后回顾学习思路并查缺补漏。
本系列笔记计划先完整走一下LangChain的实践流程,再对相关模块进行深入。从整体来看,LangChain的使用主要分为以下四步:准备数据、生成提示(Prompt)、调用模型、解析输出。本篇笔记主要涉及前两步。
准备数据
如果想直接使用通用大模型回答一些普遍性问题,则不需要做数据准备这一步。但如果想要大模型能够对我需求的某一特定领域的知识进行处理,则需要准备好该领域的相关数据,传入大模型进行“补强”。数据准备主要分为以下四步。
-
加载:将准备好的知识文档加载进来,使LangChain能够读取。
-
分割:将加载好的文档分割成文档块,这是为了方便对知识进行向量化,转化为大模型好理解的数学表示,从而有助于后续对知识的检索和使用。
-
存储:将文档块转化为向量,此时转化而成的向量称为嵌入(Embedding),将嵌入储存进向量数据库中。
-
检索:当大模型收到用户输入的问题时,该问题也会被向量化,然后和向量数据库中存储好的嵌入进行比对,找到最相关的部分,将问题和相关部分一起传入大模型进行推理。因此才需要在前述步骤中将文本向量化,因为大量的文字并不方便进行比较和检索,而转化为数学表示后就可以进行量化比较。
由此,大模型的输入便能包含它之前所不知道的某一特定领域的知识,从而给出更贴切的回答。
生成提示
一般来说,将用户输入和可能需要的本地知识直接输入大模型后也可以得到答案。但通过提示工程,能让大模型的表现更加系统化、标准化,得到更好的输出,所以提示工程也是目前很热门的职位方向。
为了能够复用提示的设置,需要构建提示模板。LangChain也对提示模板的使用进行了很人性化的封装,只需要定义一次模板,就能生成多种不同的提示,更加易于维护。如果提示中有多个变量需要变化,LangChain的提示模板也能自动插入,不用再进行冗余的字符串拼接等操作。
可以说,在给定大模型的情况下,其输出质量如何基本完全依靠提示的构建是否有效。在之后的笔记中,也会对提示工程这一模块进行更深入的探讨。