在《从零开始学LangChain》这个系列中,我将介绍什么是LangChain,它是如何工作的,有哪些经典案例,并使用LangChain完成一个完整的AI应用。
LangChain是什么?
LangChain创建于2022年10月,是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。LangChain目前有两个语言的实现:python和nodejs。
接下来我们从两个方面全面的了解LangChain,一是LangChain组件的基础概念,二是LangChain常见的使用场景。
组件
一个LangChain应用是通过很多个组件实现的,LangChain主要支持6种组件:
- Models:模型,各种类型的模型和模型集成,比如GPT-4
- Prompts:提示,包括提示管理、提示优化和提示序列化
- Memory:记忆,用来保存和模型交互时的上下文状态
- Indexes:索引,用来结构化文档,以便和模型交互
- Chains:链,一系列对各种组件的调用
- Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
下面我们了解一下这些组件的作用。
模型
LangChain为GPT4这些第三方的模型提供通用接口,目前支持三种类型的模型
- LLMs
- LLMs(大语言模型)接收文本字符作为输入,返回的也是文本字符
- 聊天模型
- 聊天模型基于LLMs,不同的是它接收聊天消息作为输入,返回的也是聊天消息
- 聊天消息是一种特定格式的数据,LangChain中支持四种消息
AIMessage
,HumanMessage
,SystemMessage
,ChatMessage
,你需要按照它们的角色把数据传递给模型,这部分在后面文章里再详细解释。
- 文本嵌入模型
- 文本嵌入模型接收文本作为输入,返回的是浮点数列表
提示
通常作为输入传递给模型的信息被称为提示,提示可以是文本字符,也可以是文件、图片甚至是视频,LangChain目前只支持字符形式的提示。
提示一般不是硬编码的形式写在代码里,而是由模板和用户输入来生成,LangChain提供多个类和方法来构建提示。
-
提示模板
- 提示模板是一种生成提示的方式,包含一个带有可替换内容的模板,从用户那获取一组参数并生成提示
- 提示模板用来生成LLMs的提示,最简单的使用场景,比如“我希望你扮演一个代码专家的角色,告诉我这个方法的原理{code}”。
-
聊天提示模板
- 聊天模型接收聊天消息作为输入,再次强调聊天消息和普通字符是不一样的,聊天提示模板的作用就是为聊天模型生成提示
-
示例选择器
- 示例选择器是一个高级版的数据筛选器,举个例子,我们在实现一个提示模板时,有这么一组原始数据:
examples = [ {"input": "happy", "output": "sad"}, {"input": "tall", "output": "short"}, {"input": "energetic", "output": "lethargic"}, {"input": "sunny", "output": "gloomy"}, {"input": "windy", "output": "calm"}, ]
- 我们可以实现一个示例选择器,也可以使用内置的产品需求是根据用户提供的参数来筛选数据,参数是number类型,
-
输出解析器
- 由于模型返回的是文本字符,输出解析器可以把文本转换成结构化数据
索引
索引是指几种结构化文档的方式,以便可以与LLMs更好的交互。最常见的使用场景是文档检索,接收用户查询,返回最相关的文档。要注意的是索引也能用在除了检索外的其他场景,同样检索除了索引外也有其他的实现方式。
大多数时间,索引都是和检索非结构化数据(比如文本文档)相关,LangChain支持的主要索引类型如下,它们都是围绕着向量数据库的。
- 文档加载器
- 负责加载各个来源的文档的类
- 文本分割器
- 有时候需要把大的文档分割成小片段来和模型交互,比如GPT3.5只支持4,096 token的输入,文本分割器负责这个工作
- 检索
- 一种保存数据的方式,以便让模型进行查询。
- Vectorstores
- 最常见的索引类型是为每个文档创建嵌入(使用嵌入模型),vectorstore存储文档和关联的嵌入,并且提供查询相关文档的快速方式。
记忆
模型是无状态的,不保存上一次交互时的数据,回想一下OpenAI的API服务,它是没有上下文概念的,而chatGPT是额外实现了上下文功能。
为了提供上下文的功能,LangChain提供了记忆组件,用来在对话过程中存储数据。
这部分比较好理解,我们也在后面的文章继续学习如何使用记忆。
链
链是一个很形象的概念,把一个个独立的组件链接在一起,这也是LangChain名字的由来。
在LangChain中,主要有下面几种链,其中最常用的是LLMChain。
- LLMChain
- LLMChain由PromptTemplate、模型和可选的输出解析器组成。链接收多个输入变量,使用PromptTemplate生成提示,传递给模型,最后使用输出解析器把模型返回值转换成最终格式。
- 索引相关链
- 这种链用来和索引交互,把你自己的数据和LLMs结合起来,最常见的例子是根据你的文档来回答问题。
- 提示选择器
- 这种链的使用场景是为不同模型生成不同的提示
代理
有些应用并不是一开始就确定调用哪些模型,而是依赖于用户输入,代理就提供了一套工具,根据用户的输入来决定调用这些工具种的哪一个。LangChain提供了下面的组件:
- 工具
- 用来方便模型和其他资源交互
- 代理
- 围绕模型的包装器,接收用户输入,决定模型的行为
- 工具集
- 解决特定问题的工具集合
- 代理执行器
- 代理和一组工具,调用代理
使用场景
- 个人助手
- 基于文档的问答系统
- 聊天机器人
- Tabular数据查询
- API交互
- 信息提取
- 文档总结
小结
这是介绍Langchain的第一篇文章,让我们对LangChain有了一个初步认识,了解了LangChain的使用场景。
在后面的文章中,我们结合实例,继续深入地了解LangChain组件是如何使用的。
如果有意见或问题,请在评论里指出,欢迎关注,一起学习LangChain!