概念
任何语言模型应用的核心要素都是……模型。LangChain 为你提供了与任何语言模型交互的构建模块。本节的一切都是为了让模型的使用更简单。这主要涉及:为“模型是什么”提供清晰的接口、用于构造模型输入的辅助工具,以及用于处理模型输出的辅助工具。
模型
LangChain 集成两类主要模型:LLM 和聊天模型(Chat Model)。它们由输入和输出类型来定义。
LLM
LangChain 中的 LLM 指纯文本补全模型。 它们封装的 API 以字符串提示作为输入,并输出字符串补全。OpenAI 的 GPT-3 就是作为 LLM 实现的。
聊天模型
聊天模型通常由 LLM 支撑,但专门为对话进行了调优。 关键在于,它们的提供方 API 使用与纯文本补全模型不同的接口。它们不是接收单个字符串,而是接收一组聊天消息作为输入,并返回一条 AI 消息作为输出。有关消息具体由什么构成,请参阅下文。GPT-4 和 Anthropic 的 Claude-2 都是作为聊天模型实现的。
注意事项
这两类 API 的输入和输出 schema 相当不同。这意味着与它们交互的最佳方式可能相当不同。尽管 LangChain 让把二者当作可互换变得可能,但这并不意味着你 应该 这么做。尤其是,LLM 与 ChatModel 的提示策略可能相当不同。这意味着你需要确保所用的提示是为正在使用的模型类型设计的。
此外,并非所有模型都一样。不同模型有各自最适合的提示策略。例如,Anthropic 的模型最适合使用 XML,而 OpenAI 的模型最适合使用 JSON。这意味着你为一个模型使用的提示可能无法迁移到其它模型。LangChain 提供了大量默认提示,但并不保证它们能与你的模型很好地配合。从历史上看,大多数提示能很好地配合 OpenAI,但在其它模型上未经过充分测试。这是我们正在努力解决的问题,但也是你应该牢记的一点。
消息
ChatModel 接收一个消息列表作为输入,并返回一条消息。有几种不同类型的消息。所有消息都有 role 和 content 属性。role 描述了 谁 在说这条消息。LangChain 为不同角色提供了不同的消息类。content 属性描述了消息的内容。它可以是几种不同的东西:
- 一个字符串(大多数模型是这样)
- 一个字典列表(用于多模态输入,其中字典包含关于该输入类型和输入位置的信息)
此外,消息还有一个 additional_kwargs 属性。这是可以传递关于消息的额外信息的地方。它主要用于 特定于提供方 而非通用的输入参数。这方面最著名的例子是来自 OpenAI 的 function_call。
HumanMessage
这表示来自用户的消息。通常只包含内容。
AIMessage
这表示来自模型的消息。它可能包含 additional_kwargs——例如使用 OpenAI 函数调用时的 functional_call。
SystemMessage
这表示系统消息。只有部分模型支持它。它告诉模型应该如何表现。它通常只包含内容。
FunctionMessage
这表示一次函数调用的结果。除 role 和 content 外,这条消息还有一个 name 参数,用于传达为产生此结果而调用的函数名称。
ToolMessage
这表示一次工具调用的结果。它与 FunctionMessage 不同,是为了对应 OpenAI 的 function 和 tool 消息类型。除 role 和 content 外,这条消息还有一个 tool_call_id 参数,用于传达为产生此结果而调用的工具的调用 id。
提示
语言模型的输入通常称为提示(prompt)。通常,来自你应用的用户输入并不是模型的直接输入。相反,他们的输入会以某种方式被转换,以产生真正进入模型的字符串或消息列表。把用户输入转换为最终字符串或消息的对象称为“提示模板(Prompt Template)”。LangChain 提供了若干抽象,让提示的使用更简单。
PromptValue
ChatModel 和 LLM 接受不同的输入类型。PromptValue 是一个设计为在二者之间可互操作的类。它暴露了一个转换为字符串的方法(用于 LLM)以及另一个转换为消息列表的方法(用于 ChatModel)。
PromptTemplate
这 是提示模板的一个例子。它由一个模板字符串组成。然后这个字符串用用户输入来格式化,以产生最终字符串。
MessagePromptTemplate
这类模板由一个模板 消息 组成——即一个特定角色和一个 PromptTemplate。然后这个 PromptTemplate 用用户输入来格式化,以产生一个最终字符串,成为这条消息的 content。
HumanMessagePromptTemplate
这是产生 HumanMessage 的 MessagePromptTemplate。
AIMessagePromptTemplate
这是产生 AIMessage 的 MessagePromptTemplate。
SystemMessagePromptTemplate
这是产生 SystemMessage 的 MessagePromptTemplate。
MessagesPlaceholder
提示的输入常常可以是一个消息列表。这时你就会使用 MessagesPlaceholder。这些对象由一个 variable_name 参数来参数化。取值与该 variable_name 值相同的输入应该是一个消息列表。
ChatPromptTemplate
这 是提示模板的一个例子。它由一个 MessagePromptTemplate 或 MessagePlaceholder 的列表组成。然后它们用用户输入来格式化,以产生一个最终的消息列表。
输出解析器
模型的输出要么是字符串,要么是一条消息。通常,该字符串或消息包含以下游要用的特定格式化的信息(例如逗号分隔的列表,或 JSON blob)。输出解析器负责接收模型的输出,并将其转换为更有用的形式。它们通常作用于输出消息的 content,但偶尔也作用于 additional_kwargs 字段中的值。
StrOutputParser
这是一个简单的输出解析器,只是把语言模型(LLM 或 ChatModel)的输出转换为字符串。如果模型是 LLM(因此输出字符串),它就直接把该字符串传过去。如果输出来自 ChatModel(因此输出一条消息),它就传递该消息的 .content 属性。
OpenAI Functions 解析器
有几个解析器专门用于处理 OpenAI 函数调用。它们接收 function_call 和 arguments 参数(它们位于 additional_kwargs 内)的输出并处理它们,基本忽略 content。
代理输出解析器
代理(Agents) 是使用语言模型来确定采取哪些步骤的系统。因此,语言模型的输出需要被解析为某种 schema,用来表示要采取什么行动(如果有的话)。AgentOutputParser 负责接收原始 LLM 或 ChatModel 输出,并将其转换为该 schema。这些输出解析器内部的逻辑会因所使用的模型和提示策略而不同。