LangChain概念指南(2)
组件
LangChain 提供了标准且可扩展的接口和第三方集成,用于构建与 LLMs 相关的各种组件。有些组件是 LangChain 实现的,有些则依赖于第三方集成,还有一些是混合的。
对话模型 (Chat models)
使用一系列消息作为输入,并返回对话消息作为输出的语言模型(与传统的以纯文本为输入的模型相对)。
这些通常是更新型的模型(旧版模型通常是“LLMs”,见下文)。
对话模型支持为对话消息分配不同的角色,有助于区分来自 AI、用户和系统消息的消息。
尽管底层模型是消息输入、消息输出,但 LangChain 包装器还允许这些模型以字符串作为输入。这意味着您可以轻松地将对话模型用作 LLMs 的替代品。
当以字符串形式输入时,它将被转换为 HumanMessage,然后传递给底层模型。
LangChain 不托管任何对话模型,而是依赖于第三方集成。
我们构建对话模型时有一些标准化参数:
model: 模型的名称
temperature: 采样温度
timeout: 请求超时
max_tokens: 生成的最大令牌数
stop: 默认停止序列
max_retries: 最大重试请求次数
api_key: 模型提供商的 API 密钥
base_url: 发送请求的端点
一些重要的注意事项:
标准参数仅适用于公开了预期功能的参数的模型提供商。例如,一些提供商没有公开配置最大输出令牌的选项,因此在这些情况下无法支持 max_tokens。
标准参数目前仅在拥有自己集成包的集成上强制执行(例如 langchain-openai、langchain-anthropic 等),它们在 langchain-community 中的模型上没有强制执行。
对话模型还接受特定于该集成的其他参数。要查找特定模型支持的所有参数,请访问该模型的 API 参考。
工具调用 一些对话模型已经针对工具调用进行了微调,并提供了专用的 API。
通常,这些模型在工具调用方面比非微调模型更好,建议在需要工具调用的用例中使用。
有关更多信息,请参见工具调用部分。
有关如何使用对话模型的详细信息,请参见此处的相关指南。
多模态性 (Multimodality)
一些对话模型是多模态的,接受图像、音频甚至视频作为输入。这些仍然较少见,意味着模型提供商尚未标准化定义 API 的“最佳”方式。多模态输出甚至更不常见。因此,我们的多模态抽象保持相对轻量级,并计划随着该领域的成熟进一步巩固多模态 API 和交互模式。
在 LangChain 中,大多数支持多模态输入的对话模型也接受 OpenAI 的内容块格式中的这些值。到目前为止,这仅限于图像输入。对于像 Gemini 这样支持视频和其他字节输入的模型,API 还支持原生的、特定于模型的表示。
有关如何使用多模态模型的详细信息,请参见此处的相关指南。
LLMs
接受字符串作为输入并返回字符串的语言模型。
这些通常是较旧的模型(较新的模型通常是对话模型,见上文)。
尽管底层模型是字符串输入、字符串输出,但 LangChain 包装器还允许这些模型以消息作为输入。
这为它们提供了与对话模型相同的接口。
当消息作为输入传递时,它们将在内部被格式化为字符串,然后传递给底层模型。
LangChain 不托管任何 LLMs,而是依赖于第三方集成。
有关如何使用 LLMs 的详细信息,请参见此处的相关指南。
消息 (Messages)
一些语言模型以消息列表作为输入并返回一条消息。
有几种不同类型的消息。
所有消息都有 role、content 和 response_metadata 属性。
role 描述了是谁在说这条消息。
LangChain 为不同的角色有不同的消息类。
content 属性描述了消息的内容。
这可以是几种不同的东西:
一个字符串(大多数模型处理这种类型的内容)
一个字典列表(这用于多模态输入,其中字典包含有关输入类型和输入位置的信息)
提示模板 (Prompt templates)
提示模板帮助将用户输入和参数转换为语言模型的指令。
这可以用来指导模型的响应,帮助它理解上下文并生成相关和连贯的语言输出。
提示模板以字典作为输入,其中每个键代表提示模板中要填充的变量。
提示模板输出一个 PromptValue。这个 PromptValue 可以传递给 LLM 或 ChatModel,并且也可以转换为字符串或消息列表。
PromptValue 存在的原因是为了便于在字符串和消息之间进行切换。
有几种不同类型的提示模板:
字符串提示模板 (String PromptTemplates)
这些提示模板用于格式化一个单一的字符串,通常用于更简单的输入。
以下是构造和使用 PromptTemplate 的一个常见方式:
from langchain_core.prompts import PromptTemplate prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}") prompt_template.invoke({"topic": "cats"})
对话提示模板 (ChatPromptTemplates)
这些提示模板用于格式化消息列表。这些“模板”本身由一系列模板组成。
以下是构造和使用 ChatPromptTemplate 的一个常见方式:
from langchain_core.prompts import ChatPromptTemplate prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a helpful assistant"), ("user", "Tell me a joke about {topic}") ]) prompt_template.invoke({"topic": "cats"})
在上面的例子中,当调用这个 ChatPromptTemplate 时,它将构造两条消息。
第一条是系统消息,没有变量需要格式化。
第二条是 HumanMessage,将由用户传递的 topic 变量格式化。
MessagesPlaceholder
MessagesPlaceholder 是一个提示模板,负责在特定位置添加一系列消息。在上述 ChatPromptTemplate 中,我们看到了如何格式化两条消息,每条都是一个字符串。但如果我们希望用户传入一系列消息,我们将这些消息插入到特定位置,这时我们就可以使用 MessagesPlaceholder。
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.messages import HumanMessage prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a helpful assistant"), MessagesPlaceholder("msgs") ]) prompt_template.invoke({"msgs": [HumanMessage(content="hi!")]})
这将生成两条消息的列表,第一条是系统消息,第二条是我们传入的 HumanMessage。如果我们传入了5条消息,那么总共将生成6条消息(系统消息加上5条传入的消息)。这在需要将一系列消息插入特定位置时非常有用。
不显式使用 MessagesPlaceholder 类的另一种实现方式是:
prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a helpful assistant"), ("placeholder", "{msgs}") # <-- 这是改动的部分 ])
有关如何使用提示模板的详细信息,请参见此处的相关指南。
示例选择器 (Example selectors)
为了实现更好的性能,一种常见的提示技术是将示例作为提示的一部分包含在内。这为语言模型提供了它应该如何表现的具体示例。有时这些示例被硬编码到提示中,但在更高级的情况下,动态选择它们可能更好。示例选择器是负责选择然后格式化示例到提示中的类。
有关如何使用示例选择器的详细信息,请参见此处的相关指南。
输出解析器 (Output parsers)
注意:
此处的信息指的是将模型的文本输出尝试解析为更结构化表示的解析器。越来越多的模型支持函数(或工具)调用,这可以自动处理此问题。建议使用函数/工具调用而不是输出解析。有关那方面的文档,请参见此处。
输出解析器负责将模型的输出转换为更适合下游任务的格式。当您使用 LLM 生成结构化数据,或规范化聊天模型和 LLM 的输出时,这非常有用。
LangChain 有许多不同类型的输出解析器。这是一个 LangChain 支持的输出解析器列表。下面的表格包含了各种信息:
名称:输出解析器的名称
支持流媒体:输出解析器是否支持流媒体。
有格式指令:输出解析器是否有格式指令。这通常在以下情况下不可用:(a) 期望的模式不是在提示中指定的,而是在其他参数中(如 OpenAI 函数调用),或 (b) 当 OutputParser 包装了另一个 OutputParser。
调用 LLM:这个输出解析器本身是否调用一个 LLM。这通常只由试图纠正格式错误的输出解析器完成。
输入类型:预期的输入类型。大多数输出解析器在字符串和消息上工作,但有些(如 OpenAI 函数)需要具有特定 kwargs 的消息。
输出类型:解析器返回的对象的输出类型。
描述:我们对这个输出解析器的评论以及何时使用它。
名称 | 支持流媒体 | 有格式指令 | 调用 LLM | 输入类型 | 输出类型 | 描述 |
---|---|---|---|---|---|---|
JSON | ✅ | ✅ | str | Message | JSON object | 根据指定返回 JSON 对象。您可以指定一个 Pydantic 模型,它将返回该模型的 JSON。可能是获取不使用函数调用的结构化数据最可靠的输出解析器。 | |
XML | ✅ | ✅ | str | Message | dict | 当需要 XML 输出时使用。在擅长编写 XML 的模型(如 Anthropic)上使用。 | |
CSV | ✅ | ✅ | str | Message | List[str] | 返回逗号分隔值的列表。 | |
OutputFixing | ✅ | str | Message | 包装另一个输出解析器。如果该解析器出错,则将错误消息和不良输出传递给 LLM 并要求其修正输出。 | |||
RetryWithError | ✅ | str | Message | 包装另一个输出解析器。如果该解析器出错,则会将原始输入、不良输出和错误消息传递给 LLM 并要求其修正。与 OutputFixingParser 相比,这个还会发送原始指令。 | |||
Pydantic | ✅ | str | Message | pydantic.BaseModel | 采用用户定义的 Pydantic 模型并以该格式返回数据。 | ||
YAML | ✅ | str | Message | pydantic.BaseModel | 采用用户定义的 Pydantic 模型并以该格式返回数据。使用 YAML 进行编码。 | ||
PandasDataFrame | ✅ | ✅ | str | Message | dict | 适用于执行 pandas DataFrames 操作。 | |
Enum | ✅ | ✅ | str | Message | Enum | 将响应解析为提供的枚举值之一。 | |
Datetime | ✅ | ✅ | str | Message | datetime.datetime | 将响应解析为日期时间字符串。 | |
Structured | ✅ | ✅ | str | Message | Dict[str, str] | 返回结构化信息的输出解析器。它比其他输出解析器功能较弱,因为它只允许字段为字符串。这在您使用较小的 LLM 时可能有用。 |