第 2 章:模型、消息与调用模式
模型是智能体的推理引擎,消息是传递上下文的基本单位,两者的配合决定了智能体的行为模式。
模型的角色:智能体的推理引擎
模型在智能体系统中扮演着核心推理引擎的角色,直接影响智能体的决策制定过程和整体表现。
下面的表格总结了模型的核心定位及其功能:
| 模型核心定位 | 描述与功能 |
|---|---|
| 推理引擎 | 模型是智能体的核心推理引擎,决定何时调用工具、如何解释结果以及何时给出最终答案。 |
| 通用能力 | 模型能够像人类一样解释和生成文本,无需针对每项任务进行专门训练。 |
| 高级能力 | 许多模型支持工具调用、结构化输出、多模态处理(Multimodal, Multimodal Processing,处理图像、音频等)和多步骤推理。 |
| 性能影响 | 模型选择的质量和能力直接影响智能体的可靠性和性能。不同的模型在遵循复杂指令、结构化推理和上下文窗口大小方面各有优势。 |
LangChain 提供了标准模型接口,使用户可以轻松试验和切换不同提供商的模型,以便找到最适合其特定应用场景的模型。
模型的初始化与配置(init_chat_model)
初始化模型是与主流大语言模型(LLM, Large Language Model)提供商(如 OpenAI、Anthropic、Google 等)连接的第一步。
- 快速初始化: 在 LangChain 中,初始化独立模型最简单的方法是使用
init_chat_model。该函数可以从模型标识符字符串(例如openai:gpt-5)初始化聊天模型。 - 提供商兼容性: LangChain 提供了与数百个 LLM 的集成,这些集成存在于独立的提供商包中(例如
langchain-openai)。
如果需要对模型配置进行完全控制,可以直接初始化模型实例(例如 ChatOpenAI)。
- 使用模型实例时,您可以设置具体的参数,例如
temperature(温度)、max_tokens(限制响应的总 token 数量)、超时(timeouts)、base_url以及其他特定于提供商的设置。 - 身份验证所需的
api_key通常是通过设置环境变量来访问的。
通过 init_chat_model,可以通过内联关键字参数 (**kwargs) 传递这些配置参数,实现灵活的模型初始化。
消息机制:上下文的基本单位
在 LangChain 中,消息是模型上下文的基本单位。它们代表模型的输入和输出,携带内容和元数据,用于表示与大语言模型(LLM, Large Language Model)交互时的对话状态。
消息对象包含三个核心组成部分:
- 角色 (Role): 识别消息类型(例如系统、用户)。
- 内容 (Content): 表示消息的实际内容,如文本、图像、音频等。
- 元数据 (Metadata): 可选字段,例如响应信息、消息 ID 和 Token 用量。
消息在上下文管理中的作用如下:
- 多轮对话:可以向模型提供一个消息列表来表示对话历史。
- 用途选择:
- 对于简单的、独立的生成任务,可以使用文本字符串提示。
- 对于管理多轮对话、处理多模态内容或包含系统指令,则需要使用消息对象列表。
核心消息类型:系统、人类、AI 和工具消息
为便于理解,下表总结了 LangChain 定义的标准消息类型及其典型场景:
| 消息类型 | 角色图标 | 描述与典型场景 |
|---|---|---|
| 系统消息 | 代表一组初始指令,用于设定模型的行为、定义其角色、语气和响应指南。 | |
| 人类消息 | 代表用户输入和交互。它可以包含文本、图像、音频等任何多模态内容。 | |
| AI 消息 | 模型调用的输出。包含文本内容、模型请求的工具调用和提供商特定的元数据(如 Token 用量)。 | |
| 工具消息 | 用于将工具执行的结果传递回模型。模型在进行工具调用后,智能体循环会用 ToolMessage 携带结果返回给模型进行下一步推理。 |
消息内容的高级处理:多模态数据
多模态(Multimodal, Multimodal Processing)是指处理图像、音频、视频等非文本数据的能力。
- 可以通过提供内容块(content blocks)的方式将非文本数据传递给模型。
- 消息的
content属性接受字符串或内容块列表。这些内容块可以是提供商原生格式,也可以是 LangChain 的标准内容块。 - LangChain 提供了标准化的内容块表示,并实现了
content_blocks属性,可以将提供商的原生内容(例如 Anthropic 的thinking或reasoning块)惰性解析为一致的、类型安全的标准表示。 - 在消息中,多模态数据(如图像)以列表形式传递,列表中的每个项定义了其类型(如
type: "image")和数据来源(如url)。 - 某些模型能够返回多模态数据作为响应,此时生成的
AIMessage将在内容块中包含多模态类型的数据。
模型的三种调用方式:Invoke, Stream 和 Batch
聊天模型有三种主要的调用方法,每种方法都适用于不同的用例。下表对比了三种调用方式的特点:
| 调用方式 | 描述 | 返回类型 | 适用场景 |
|---|---|---|---|
| Invoke | 最直接的调用方式。等待模型生成完整响应后,一次性返回结果。 | 单个 AIMessage | 简单的、一次性的请求,不需要实时反馈。 |
| Stream | 模型在生成内容时流式传输其输出。显著改善用户体验,尤其对于长响应。 | 包含 AIMessageChunk 对象的迭代器 | 实时显示输出,响应较慢或较长时。 |
| Batch | 批量处理一组独立的请求。 | 整个批次的最终输出,或流式的单个输入输出 (batch_as_completed) | 提高性能和降低成本,用于并行处理大量独立任务。 |
下方流程图展示了 Invoke 与 Stream 两种调用模式的处理流程:
静态模型与运行时动态模型选择
智能体应用通常需要灵活的模型管理,以平衡成本、性能和任务要求。下面介绍两种模型选择方式:
静态模型 (Static Model):
- 定义:在创建智能体时进行一次性配置,并在整个执行过程中保持不变。
- 特点:这是最常见和直接的方法。
- 实现:通过
init_chat_model或直接初始化提供商模型实例。
动态模型 (Dynamic Model):
- 定义:在运行时(runtime)根据当前状态(state)和上下文动态选择的模型。
- 目的:实现复杂的路由逻辑和成本优化。例如,根据任务选择不同的模型,或者在主要模型失败时回退到备用模型。
- 实现机制:通过中间件。可以使用
@wrap_model_call装饰器创建中间件,该中间件可以在模型请求中修改模型实例。
下方架构图展示了动态模型选择的处理流程:
总结
本章深入探讨了 LangChain 智能体系统的基础:模型和消息。模型作为推理引擎,驱动智能体的决策和行动;消息作为上下文单位,携带指令和对话历史,并通过不同的角色(系统、人类、AI、工具)塑造交互。我们学习了如何通过 init_chat_model 精确配置模型参数,以及如何利用 Invoke、Stream 和 Batch 三种调用模式来满足不同的应用需求。最后,我们区分了静态配置与基于中间件实现的运行时动态模型选择,这对于实现成本效益和复杂的任务路由至关重要。这些概念为后续章节中深入研究上下文工程和智能体设计奠定了坚实的基础。