- 工具调用 - 调用外部工具(如数据库查询或 API 调用),并在其响应中使用结果。
- 结构化输出 - 模型的响应被约束为遵循预定义的格式。
- 多模态 - 处理并返回除文本以外的数据,如图像、音频和视频。
- 推理 - 模型执行多步推理以得出结论。
基本用法
在 LangChain 中开始使用模型最简单的方法是使用init_chat_model 从您选择的提供商初始化一个模型:
初始化聊天模型
init_chat_model。
关键方法
调用
模型以消息作为输入,在生成完整响应后输出消息。
流式传输
调用模型,但在生成时实时流式传输输出。
批处理
批量向模型发送多个请求,以实现更高效的处理。
除了聊天模型,LangChain 还支持其他相关技术,例如嵌入模型和向量存储。详情请参阅集成页面。
参数
聊天模型接受可用于配置其行为的参数。支持的完整参数集因模型和提供商而异,但标准参数包括:string
required
您希望与提供商一起使用的特定模型的名称或标识符。
string
与模型提供商进行身份验证所需的密钥。通常在您注册获取模型访问权限时颁发。通常通过设置来访问。
number
控制模型输出的随机性。较高的数值使响应更具创造性;较低的数值使其更具确定性。
string[]
一串字符,指示模型何时应停止生成输出。
number
在取消请求之前等待模型响应的最长时间(以秒为单位)。
number
限制响应中的总数,从而有效控制输出的长度。
number
如果请求因网络超时或速率限制等问题失败,系统将重试发送请求的最大次数。
要查找给定聊天模型支持的所有参数,请前往参考文档。
调用
必须调用聊天模型才能生成输出。有三种主要的调用方法,每种方法适用于不同的用例。调用
调用模型最直接的方法是使用invoke() 并传入单条消息或消息列表。
单条消息
对话历史
流式传输
大多数模型可以在生成输出内容时对其进行流式传输。通过逐步显示输出,流式传输显著改善了用户体验,特别是对于较长的响应。 调用stream() 会返回一个,该迭代器在生成输出块时产生输出块。您可以使用循环实时处理每个块:
AIMessage 的 invoke() 不同,stream() 返回多个 AIMessageChunk 对象,每个对象包含输出文本的一部分。重要的是,流中的每个块都设计为可以通过求和聚合成完整的消息:
构造 AIMessage
invoke() 生成的消息一样处理——例如,它可以聚合成消息历史并作为对话上下文传回给模型。
高级流式传输主题
高级流式传输主题
"自动流式传输"聊天模型
"自动流式传输"聊天模型
LangChain 通过在某些情况下自动启用流式传输模式来简化从聊天模型进行流式传输,即使您没有显式调用流式传输方法。当您使用非流式传输的调用方法但仍希望流式传输整个应用程序(包括聊天模型的中间结果)时,这特别有用。例如,在 LangGraph 代理 中,您可以在节点内调用
model.invoke(),但如果在流式传输模式下运行,LangChain 会自动委托给流式传输。工作原理
当您invoke() 一个聊天模型时,如果 LangChain 检测到您正在尝试流式传输整个应用程序,它将自动切换到内部流式传输模式。就使用调用的代码而言,调用的结果是相同的;然而,在流式传输聊天模型时,LangChain 将负责在 LangChain 的回调系统中调用 on_llm_new_token 事件。回调事件允许 LangGraph stream() 和 astream_events() 实时显示聊天模型的输出。流式传输事件
流式传输事件
LangChain 聊天模型还可以使用 有关事件类型和其他详细信息,请参见
astream_events() 流式传输语义事件。这简化了基于事件类型和其他元数据的过滤,并将在后台聚合完整的消息。请参见下面的示例。astream_events() 参考。批处理
对模型的一组独立请求进行批处理可以显著提高性能并降低成本,因为处理可以并行进行:批处理
batch() 只会返回整个批处理的最终输出。如果您希望在每个输入完成生成时接收其输出,可以使用 batch_as_completed() 流式传输结果:
在完成时生成批处理响应
使用
batch_as_completed() 时,结果可能会乱序到达。每个结果都包含输入索引,以便在需要时匹配以重建原始顺序。工具调用
模型可以请求调用执行任务的工具,例如从数据库获取数据、搜索网络或运行代码。工具是以下内容的配对:- 一个模式,包括工具的名称、描述和/或参数定义(通常是一个 JSON 模式)
- 一个函数或来执行。
您可能会听到“函数调用”这个术语。我们将其与“工具调用”互换使用。
bind_tools() 将其绑定。在后续调用中,模型可以根据需要选择调用任何绑定的工具。
一些模型提供商提供可以通过模型参数启用的内置工具。有关详细信息,请参阅相应的提供商参考。
绑定用户工具
工具执行循环
工具执行循环
当模型返回工具调用时,您需要执行工具并将结果传回给模型。这会创建一个对话循环,模型可以使用工具结果生成其最终响应。工具返回的每个
工具执行循环
ToolMessage 都包含一个 tool_call_id,该 ID 与原始工具调用匹配,帮助模型将结果与请求关联起来。强制工具调用
强制工具调用
默认情况下,模型可以根据用户的输入自由选择使用哪个绑定工具。但是,您可能希望强制选择工具,确保模型使用特定工具或给定列表中的任何工具:
并行工具调用
并行工具调用
许多模型在适当的情况下支持并行调用多个工具。这允许模型同时从不同来源收集信息。模型根据所请求操作的独立性智能地确定何时适合并行执行。
并行工具调用
流式传输工具调用
流式传输工具调用
流式传输响应时,工具调用通过 您可以累积块以构建完整的工具调用:
ToolCallChunk 逐步构建。这允许您在生成工具调用时查看它们,而不是等待完整响应。流式传输工具调用
累积工具调用
结构化输出
可以请求模型以匹配给定模式的格式提供其响应。这对于确保输出可以轻松解析并在后续处理中使用非常有用。LangChain 支持多种模式类型和强制执行结构化输出的方法。- Pydantic
- TypedDict
- JSON 模式
Pydantic 模型 提供最丰富的功能集,包括字段验证、描述和嵌套结构。
结构化输出的关键注意事项:
- 方法参数:部分提供商支持不同的方法(
'json_schema'、'function_calling'、'json_mode') - 包含原始响应:使用
include_raw=True可同时获取解析后的输出和原始 AI 消息 - 验证机制:Pydantic 模型提供自动验证,而
TypedDict和 JSON Schema 需要手动验证
示例:消息输出与解析结构并存
示例:消息输出与解析结构并存
有时需要同时返回原始
AIMessage 对象和解析后的表示形式,以便访问响应元数据(例如 token 使用量):示例:嵌套结构
示例:嵌套结构
支持的模型
LangChain 支持所有主流模型提供商,包括 OpenAI、Anthropic、Google、Azure、AWS Bedrock 等。每个提供商都提供多种具备不同能力的模型。如需查看 LangChain 支持的完整模型列表,请参阅 集成页面。高级配置
多模态支持
某些模型可以处理并返回非文本数据,如图像、音频和视频。您可以通过提供 内容块 向模型传递非文本数据。 详情请参阅消息指南中的 多模态章节。 某些模型也可以在响应中返回多模态数据。在这种情况下,生成的AIMessage 将包含具有多模态类型的内容块。
多模态输出
推理能力
较新的模型能够执行多步推理以得出结论。这包括将复杂问题分解为更小、更易管理的步骤。 如果底层模型支持,您可以暴露这一推理过程,以便更好地理解模型是如何得出最终答案的。'low' 或 'high')或整数 token 预算的形式体现。
详情请参阅 集成页面 中的相关聊天模型说明。
本地模型
LangChain 支持在您自己的硬件上本地运行模型。这在数据隐私要求严格或希望避免使用云端模型成本的场景中非常有用。 Ollama 是本地运行模型最简单的方式之一。完整的本地集成列表请参阅 集成页面。缓存机制
聊天模型 API 的调用通常较慢且昂贵。为缓解这一问题,LangChain 为聊天模型集成提供了可选的缓存层。为模型启用缓存
为模型启用缓存
默认情况下缓存是禁用的。要启用缓存,请导入:接下来,选择一个缓存:
内存缓存
内存缓存
一种临时缓存,将模型调用存储在内存中。环境重启后会被清除,且不跨进程共享。
InMemoryCache
SQLite 缓存
SQLite 缓存
使用 SQLite 数据库存储响应,重启后依然有效
SQLite Cache
速率限制
许多聊天模型提供商对单位时间内可执行的调用次数设置了限制。如果您触发了速率限制,通常会收到来自提供商的速率限制错误响应,需要等待一段时间后才能继续请求。 为帮助管理速率限制,聊天模型集成在初始化时接受一个rate_limiter 参数,用于控制请求速率。
初始化并使用速率限制器
初始化并使用速率限制器
LangChain 内置(可选)的内存速率限制器。该限制器是线程安全的,可被同一进程中的多个线程共享。
定义速率限制器
基础 URL 或代理
对于许多聊天模型集成,您可以配置 API 请求的基础 URL,从而使用具有 OpenAI 兼容 API 的模型提供商或通过代理服务器访问。基础 URL
基础 URL
许多模型提供商提供 OpenAI 兼容的 API(例如 Together AI、vLLM)。您可以通过指定适当的
base_url 参数,在 init_chat_model 中使用这些提供商:当直接实例化聊天模型类时,参数名称可能因提供商而异。请查阅相应的 参考文档 以获取详细信息。
代理配置
代理配置
对数概率(Log Probabilities)
某些模型可以配置为返回 token 级别的对数概率,表示给定 token 的可能性。只需在初始化模型时设置logprobs 参数即可访问:
对数概率
Token 使用量
许多模型提供商在调用响应中返回 token 使用量信息。当可用时,这些信息将包含在相应模型生成的AIMessage 对象中。更多详情请参阅 消息指南。
某些提供商 API(特别是 OpenAI 和 Azure OpenAI 聊天补全)要求用户在流式传输上下文中主动选择接收 token 使用量数据。详情请参阅集成指南中的 流式使用量元数据 部分。
- 回调处理器
- 上下文管理器
回调处理器
调用配置
调用模型时,您可以通过config 参数传递额外配置,使用 [RunnableConfig][RunnableConfig] 字典。这提供了对执行行为、回调和元数据跟踪的运行时控制。
常见配置选项包括:
带配置的调用
关键配置属性
关键配置属性
- 使用 LangSmith 追踪进行调试
- 实现自定义日志记录或监控
- 在生产环境中控制资源使用
- 在复杂管道中追踪调用
RunnableConfig 属性的更多信息,请参阅 [RunnableConfig][RunnableConfig] 参考文档。
可配置模型
您还可以通过指定configurable_fields 创建运行时可配置的模型。如果您未指定模型值,则 'model' 和 'model_provider' 默认为可配置项。
带默认值的可配置模型
带默认值的可配置模型
我们可以创建一个带有默认模型值的可配置模型,指定哪些参数是可配置的,并为可配置参数添加前缀:
声明式使用可配置模型
声明式使用可配置模型
我们可以在可配置模型上调用声明式操作,如
bind_tools、with_structured_output、with_configurable 等,并以与常规实例化聊天模型对象相同的方式链接可配置模型。