[声明]
本文参考:Langchain官方文档
什么是LangChain?
LangChain 是一个开源的、用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。它的核心目标是将强大的 LLM(如 GPT-4, Claude, Llama 等)与外部数据源、计算资源和工具连接起来,从而构建更复杂、更有用、更具交互性的 AI 应用。
LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的**核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。**LangChain目前有两个语言的实现:python和Nodejs。
Langchain的核心组件
一个LangChain的应用是需要多个组件共同实现的,LangChain主要支持6种组件:
- Models:模型,各种类型的模型和模型集成,比如GPT-4
- Prompts:提示,包括提示管理、提示优化和提示序列化
- Memory:记忆,用来保存和模型交互时的上下文状态
- Indexes:索引,用来结构化文档,以便和模型交互
- Chains:链,一系列对各种组件的调用
- Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
Models组件介绍
现在市面上的模型多如牛毛,各种各样的模型不断出现,LangChain模型组件提供了与各种模型的集成,并为所有模型提供一个精简的统一接口。
LangChain目前支持三种类型的模型:LLMs、Chat Models(聊天模型)、Embeddings Models(嵌入模型).
-
LLMs: 大语言模型接收文本字符作为输入,返回的也是文本字符.
LLMs (legacy):Older language models that take a string as input and return a string as output.
-
Chat Models(聊天模型): 基于LLMs, 不同的是它接收聊天消息(一种特定格式的数据)作为输入,返回的也是聊天消息.
-
Embedding Models(文本嵌入模型): 文本嵌入模型接收文本作为输入, 返回的是浮点数列表.
LangChain支持的三类模型,它们的使用场景不同,输入和输出不同,开发者需要根据项目需要选择相应。
LLMs (大语言模型)
LLMs使用场景最多,常用大模型的下载库:https://huggingface.co/models
Chat Models (聊天模型)
聊天消息包含下面几种类型,使用时需要按照约定传入合适的值:
- AIMessage: 用来保存LLM的响应,以便在下次请求时把这些信息传回给LLM.
- HumanMessage: 发送给LLMs的提示信息,比如“实现一个快速排序方法”.
- SystemMessage: 设置LLM模型的行为方式和目标。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回json格式”.
- ChatMessage: ChatMessage可以接收任意形式的值,但是在大多数时间,我们应该使用上面的三种类型.
LangChain支持的常见聊天模型有:
模型 | 描述 |
---|---|
ChatOpenAI | OpenAI聊天模型 |
AzureChatOpenAI | Azure提供的OpenAI聊天模型 |
PromptLayerChatOpenAI | 基于OpenAI的提示模版平台 |
在 Chat Model上使用提示词模板
提示模板就是把一些常见的提示整理成模板,用户只需要修改模板中特定的词语,就能快速准确地告诉模型自己的需求。
Embeddings Models(嵌入模型)
将字符串作为输入,返回一个浮动数的列表。在NLP中,Embedding的作用就是将数据进行文本向量化。
Embeddings Models可以为文本创建向量映射,这样就能在向量空间里去考虑文本,执行诸如语义搜索之类的操作,比如说寻找相似的文本片段。
不同的 Embedding 模型对多语言支持和文本类型有不同的特点:
- 多语言支持:
text-embedding-ada-002
:支持多种语言,但对中文等亚洲语言的支持相对较弱bge-large-zh
:对中文有很好的支持multilingual-e5-large
:对多语言都有较好的支持
- 文本类型适用性:
- 代码文本:建议使用专门的代码 Embedding 模型,如
CodeBERT
- 通用文本:可以使用
text-embedding-ada-002
或bge-large-zh
- 专业领域文本:建议使用该领域的专门模型
- 代码文本:建议使用专门的代码 Embedding 模型,如
Prompts
Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。
提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain就提供了PromptTemplates组件,它可以帮助你更方便的构建提示。
Agents (代理)
在 LangChain 中 Agents 的作用就是根据用户的需求,来访问一些第三方工具(比如:搜索引擎或者数据库),进而来解决相关需求问题。
为什么要借助第三方库?
因为大模型虽然非常强大,但是也具备一定的局限性,比如不能回答实时信息、处理数学逻辑问题仍然非常的初级等等。因此,可以借助第三方工具来辅助大模型的应用。
几个重要概念:
Agent代理:
- 制定计划和思考下一步需要采取的行动。
- 负责控制整段代码的逻辑和执行,代理暴露了一个接口,用来接收用户输入。
- LangChain提供了不同类型的代理(主要罗列一下三种):
- zero-shot-react-description: 代理使用ReAct框架,仅基于工具的描述来确定要使用的工具.此代理使用 ReAct 框架确定使用哪个工具 仅基于工具的描述。缺乏 会话式记忆。
- structured-chat-zero-shot-react-description:能够使用多输入工具,结构化的参数输入。
- conversational-react-description:这个代理程序旨在用于对话环境中。提示设计旨在使代理程序有助于对话。 它使用ReAct框架来决定使用哪个工具,并使用内存来记忆先前的对话交互。
Tool工具:
- 解决问题的工具
- 第三方服务的集成,例如计算、网络(谷歌、bing)、代码执行等等
Toolkit工具包:
- 用于完成特定目标所需要的工具组,比如
create_csv_agent
可以使用模型解读csv文件。
AgentExecutor代理执行器:
- 它将代理和工具列表包装在一起, 负责迭代运行代理的循环,直到满足停止的标准。
- 这是实际调用agent并执行其选择的动作部分。
Memory
大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。
因此 LangChain 也提供了Memory组件, Memory分为两种类型:短期记忆和长期记忆。短期记忆一般指单一会话时传递数据,长期记忆则是处理多个会话时获取和更新信息。
Indexes (索引)
Indexes组件的目的是让LangChain具备处理文档处理的能力,包括:文档加载、检索等。注意,这里的文档不局限于txt、pdf等文本类内容,还涵盖email、区块链、视频等内容。
Indexes组件主要包含类型:
- 文档加载器
- 文本分割器
- VectorStores
- 检索器