![](/contact/xiaochengxu.jpg)
![](/contact/xiaohongshu.jpg)
深入了解 langchain - 概念解惑!
深入了解 langchain
- 概念解惑
上一篇 https://juejin.cn/post/7344282440725315621 我们简单介绍了 langchain
的 prompt
以及 output
相关的内容,本篇我们介绍 langchain
的 model
相关内容。
相关概念
任何语言模型应用程序的核心元素都是模型。LangChain 为我们提供了与任何语言模型交互的构建链。我们在初次使用 LangChain 的时候会看到llm 以及 chatLLM,很多时候我们根本分不清。本篇的所有内容都是为了让模型的使用变得更容易以及在什么情况下使用那种类型的 LLM 。所以下面是本篇的相关内容:
- 认识 LLM
- 构建模型输入的程序
- 处理模型输出的程序
LLM 的类型
LLM
LangChain
集成的模型主要有两种类型:LLM
和 chatLLM
。它们由它们的输入和输出类定义。
LangChain
中的 LLM
指的是纯文本补全模型。它们包装的 API
将字符串prompt
作为输入并输出字符串完成。OpenAI
的 GPT-3
是纯文本补全模型。
ChatLLM
ChatLLM
也就是聊天模型,通常由LLM
支持,但专门针对对话进行了调整。更重要的是,他们提供的 API
使用与 LLM
模型不同的接口。他们不是使用单个字符串,而是将聊天消息列表作为输入,并返回 AI
消息作为输出。GPT-4
, Anthropic
, Claude-2
都是作为ChatLLM
实现的。
这两种 API
类型具有截然不同的输入和输出架构。这意味着与他们互动的最佳方式可能会完全不同。尽管 LangChain
可以互换使用它们,但这并不意味着我们开发者就必须这样做。特别是,LLM
与 ChatModel
的提示策略可能会有很大不同。这意味着我们需要确保使用的prompt
是针对正在使用的模型类型设计的。
另外,并非所有 LLM
都相同。不同的模型有不同的最适合他们的提示策略。例如,Anthropic
的模型最适合使用 XML,而 OpenAI
的模型最适合使用 JSON
。
这意味着我们用于一种模型的提示可能不会转移到其他模型。LangChain
提供了很多默认提示,但并不能保证这些提示能够很好地配合您使用的模型。从过完经历看,大多数提示在 OpenAI
上都能很好地工作,但没有在其他模型上进行过大量测试。
Message
![How to talk to an LLM (with your voice)](https://www.daily.co/blog/content/images/size/w2000/2023/10/AI-Week-2023-how-to-talk-to-an-LLM-feature-1.jpg)
ChatLLM
将消息列表作为输入并返回消息。有几种不同类型的消息。所有消息都有 role
和 content
属性。
role
描述了LLM
在传达的信息。LangChain
针对不同的角色有不同的消息类别。该content
属性描述了消息的内容。Message 可以是不同的类型,比如:
- 字符串(大多数
model
都是这样) - 字典列表(用于多模式输入,其中字典包含有关该输入类型和该输入参数的信息)
此外,消息还有一个additional_kwargs
属性。这是可以传递有关消息的附加信息的地方。这主要用于特定于提供者而非通用的输入参数。比如 OpenAI
的function_call
。
Hummessage
这代表来自用户的消息。通常仅由内容组成
AIMessage
这代表来自模型的消息。这可能包含additional_kwargs
在其中 - 例如如果使用 OpenAI 函数调用functional_call
。
SystemMessage
这代表一条系统消息。只有部分类型的 LLM 支持此功能。这告诉模型如何表现。这通常仅包含内容。也成为角色设定.
FunctionMessage
这表示函数调用的结果。除了role
和之外content
,此消息还有一个name
参数,该参数传达为产生此结果而调用的函数的名称。
ToolMessage
这表示工具调用的结果。这与 FunctionMessage
不同,以便匹配 OpenAI function
和tool
消息类型。除了role
和之外content
,此消息还有一个tool_call_id
参数,该参数将调用的 id 传递给被调用以产生此结果的工具。
Prompt
![Frameworks to Build LLM Applications - by Marcel Salathé](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d8bdf6-e577-4399-af65-62cd9a0d145d_772x608.png)
LLM
的输入通常称为Prompt
。通常应用程序中的用户输入并不是模型的直接输入。相反,它们的输入会以某种方式进行转换,以生成进入模型的字符串或消息列表。接受用户输入并将其转换为最终字符串或消息的对象称为“Prompt template 提示模板”。LangChain
提供了多种抽象,使操作Prompt
变得更加容易。
PromptValue
ChatModel
和 LLM
采用不同的输入类型。PromptValue
是一个设计为可在两者之间互操作的类。它公开了一个要转换为字符串的方法(与 LLM 一起使用)和另一个要转换为消息列表的方法(与 ChatModel 一起使用)。
PromptTemplate
这由模板字符串组成。然后使用用户输入格式化该字符串以生成最终字符串。
MessagePromptTemplate
它由一条模板消息(表示特定角色)和一个 PromptTemplate 组成。然后,此 PromptTemplate
将根据用户输入进行格式化,以生成成为此消息的最终字符串content
。还有一些:
- HumanMessage 的 MessagePromptTemplate
- AIMessage 的 MessagePromptTemplate
- SystemMessage 的 MessagePromptTemplate
Messagesplaceholder
通常提示的输入可以是消息列表。这是我们需要使用 MessagesPlaceholder
的时候。这些对象由variable_name
参数参数化。与该值相同的输入variable_name
就是消息列表。
ChatPromptTemplate
这由 MessagePromptTemplates
或 MessagePlaceholders
的列表组成。然后根据用户输入对这些内容进行格式化以生成最终的消息列表。
输出 params
模型的输出是字符串或消息。通常字符串或消息包含以供下游使用的特定格式格式化的信息(例如,逗号分隔列表或 JSON blob
)。输出解析器负责接收模型的输出并将其转换为更可用的形式。这些通常适用于content
输出消息的值,但有时也适用于additional_kwargs
字段中的值。
StrOutputParser
这是一个简单的输出解析器,仅将语言模型(LLM
或 ChatModel
)的输出转换为字符串。如果模型是 LLM
(因此输出一个字符串),它只会传递该字符串。如果输出是 ChatModel
(因此输出消息),则它会传递.content
消息的属性。
OpenAI FuncallCall
有一些解析器专门用于处理 OpenAI
函数调用。function_call
他们获取arguments
参数的输出additional_kwargs
并使用这些参数.
agents
是使用语言模型来确定要采取哪些步骤的系统。因此需要将语言模型的输出解析为某种可以表示要采取的操作(如果有)的模式。AgentOutputParsers
负责获取原始 LLM
或 ChatModel
输出并将其转换为该模式。这些输出解析器内部的逻辑可能会有所不同,具体取决于所使用的模型和提示策略。
总结
1、上面介绍了 LLM 的两种类型(LLM,ChatLLm)他们的区别是 LLM 只是单轮对话,而 ChatLLM 是续写模式,也就是通常的多伦对话。这种模型可以简单的记住历史对话的内容。不过现在的相关的 LLM 厂商已经淡化单轮还是续写,所以我们以后可以使用 ChatLLM 就可以了。
2、我们跟 LLM 去对话,就需要 prompt, langchain 提供了几个函数可以帮助我们定义 prompt 的格式。 Hummessage
, Systemmessage
,AIMessage
,FunctionMessage
,ToolMessage
这些类型 langchain 都帮我们形成对应的 role
字段的值填写在 LLM 的交互过程中。
3、有了这些函数,最后就是 prompt,prompt 是一个工程化的东西,不同的场景需要设定不同的 prompt
, 比如 RAG
场景,ReACT
agent 的场景. prompt
模板里面可以设定不同的内容,一般都是通过占位符,langchain
都帮我们提供了相关的函数和方法自动替换。这样我们只需要关注 prompt 的主题内容即可。相关FunctionMessage
,ToolMessage
的占位符langchain 会帮我们执行替换,并形成最后的 prompt
内容提交给 LLM。
类似的帖子
![](/contact/xiaochengxu.jpg)
![](/contact/xiaohongshu.jpg)