langchain_core.messages.AIMessage
是 LangChain 框架中 langchain_core.messages
模块的一个核心类,用于表示由 AI 模型生成的消息。它继承自 BaseMessage
,是对话系统中表示模型输出的关键组件,广泛应用于聊天机器人、智能代理和多轮对话场景。以下是对 AIMessage
的详细介绍,涵盖其定义、功能、属性与方法、使用方式、应用场景、代码示例、优化建议和注意事项。
1. 什么是 AIMessage
?
AIMessage
是一个具体消息类,表示聊天模型(如 ChatOpenAI
、ChatAnthropic
)在响应用户或系统输入时生成的消息。它包含 AI 的回答内容、工具调用请求(如果有)以及相关元数据。AIMessage
的设计目标是:
- 标准化 AI 输出:统一表示模型的文本响应、工具调用和元数据。
- 支持复杂交互:处理多轮对话、工具调用和多模态输出。
- 无缝集成:与 LangChain 的代理、链、记忆等模块协作。
核心功能:
- 存储 AI 生成的文本或多模态内容。
- 支持工具调用,通过
tool_calls
属性指定要调用的工具和参数。 - 提供错误处理机制,捕获无效的工具调用。
- 支持序列化和反序列化,便于存储或传输。
与 BaseMessage
的关系:
AIMessage
继承自BaseMessage
,扩展了特定于 AI 输出的字段(如tool_calls
、invalid_tool_calls
)。- 它与
HumanMessage
、SystemMessage
和ToolMessage
等其他消息类一起,构建完整的对话上下文。
2. 功能与特点
AIMessage
提供以下主要功能:
- 消息内容:
- 通过
content
属性存储 AI 的响应,可以是字符串或多模态内容(如文本+图像)。 - 示例:
content="巴黎是法国的首都。"
或包含图像的列表。
- 通过
- 工具调用:
- 通过
tool_calls
属性存储工具调用请求,包含工具名称、参数和 ID。 - 支持 OpenAI 的函数调用或其他模型的工具调用接口。
- 通过
- 错误处理:
- 通过
invalid_tool_calls
属性捕获解析错误的工具调用,确保健壮性。
- 通过
- 元数据:
- 使用
additional_kwargs
存储额外信息,如时间戳、模型特定参数。 - 可选的
id
属性用于消息唯一标识。
- 使用
- 序列化:
- 支持
to_json
和from_json
方法,便于消息存储和传输。
- 支持
- 对话上下文:
- 作为消息列表的一部分,维护多轮对话历史,供模型生成上下文相关响应。
特点:
- 类型安全:使用 Pydantic 模型,确保字段验证。
- 跨模型兼容:支持 OpenAI、Anthropic、Mistral 等模型的输出格式。
- 灵活扩展:通过
additional_kwargs
支持自定义元数据。 - 高效集成:与 LangChain 的代理、记忆和提示模板无缝协作。
3. 核心属性与方法
核心属性
属性 | 类型 | 描述 | 示例 |
---|---|---|---|
content | Union[str, List[Dict]] | 消息内容,字符串或多模态数据。 | "巴黎是法国的首都。" 或 [{"type": "text", "text": "Hi"}] |
role | str | 消息角色,固定为 "assistant" 。 | "assistant" |
additional_kwargs | Dict[str, Any] | 附加元数据,如工具调用或时间戳。 | {"tool_calls": [...], "timestamp": "2025-05-15"} |
tool_calls | List[Dict] | 工具调用请求列表,包含工具名称、参数和 ID。 | [{"id": "call_1", "function": {"name": "search", "arguments": {"query": "news"}}}] |
invalid_tool_calls | List[Dict] | 解析错误的工具调用列表。 | [] |
id | Optional[str] | 消息的唯一标识符。 | "msg_001" |
example | bool | 是否为示例消息(通常忽略)。 | False |
name | Optional[str] | 消息的名称,用于区分不同 AI 实体。 | "Assistant1" |
核心方法
方法 | 描述 | 输入 | 输出 | 示例 |
---|---|---|---|---|
to_json | 序列化为 JSON 格式。 | 无 | Dict | message.to_json() |
from_json | 从 JSON 还原消息(类方法)。 | Dict | AIMessage | AIMessage.from_json(json_data) |
__str__ | 返回字符串表示。 | 无 | str | str(message) |
__eq__ | 比较消息是否相等。 | AIMessage | bool | message1 == message2 |
注意:
tool_calls
和invalid_tool_calls
是AIMessage
特有的,专为工具调用场景设计。role
固定为"assistant"
,标识消息来自 AI。
4. 使用方式与代码示例
(1) 基本对话
创建 AIMessage
作为模型输出:
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 创建消息
messages = [HumanMessage(content="法国的首都是什么?")]
# 调用模型
response = llm.invoke(messages)
print(isinstance(response, AIMessage)) # 确认类型
print(response.content)
输出:
True
法国的首都是巴黎。
说明:
llm.invoke
返回AIMessage
实例,包含模型的响应。
(2) 工具调用
处理工具调用请求和结果:
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 定义工具
@tool
def calculator(expression: str) -> str:
"""执行数学计算"""
return str(eval(expression))
# 初始化模型并绑定工具
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key").bind_tools([calculator])
# 创建消息
messages = [HumanMessage(content="计算 5 + 3")]
# 调用模型
response = llm.invoke(messages)
# 处理工具调用
if response.tool_calls:
tool_call = response.tool_calls[0]
tool_result = calculator.invoke(tool_call["args"])
messages.extend([
AIMessage(content="", tool_calls=[tool_call]),
ToolMessage(content=tool_result, tool_call_id=tool_call["id"])
])
# 继续对话
final_response = llm.invoke(messages)
print(final_response.content)
输出:
计算结果为 8。
说明:
AIMessage
的tool_calls
包含工具调用信息。ToolMessage
通过tool_call_id
关联工具结果。
(3) 多模态输出
处理多模态响应(假设模型支持):
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 创建消息
messages = [
HumanMessage(content=[
{"type": "text", "text": "描述这张图片的内容。"},
{"type": "image_url", "image_url": {"url": "https://example.com/quantum.jpg"}}
])
]
# 调用模型
response = llm.invoke(messages)
print(isinstance(response, AIMessage))
print(response.content)
输出(假设图片可用):
True
图片显示一台量子计算机的实验设备,周围有冷却装置和控制面板。
说明:
AIMessage
的content
可以是字符串或多模态数据。
(4) 序列化与反序列化
序列化 AIMessage
并还原:
from langchain_core.messages import AIMessage
# 创建消息
message = AIMessage(
content="巴黎是法国的首都。",
additional_kwargs={"timestamp": "2025-05-15"},
id="msg_001"
)
# 序列化为 JSON
json_data = message.to_json()
print(json_data)
# 从 JSON 还原
restored_message = AIMessage.from_json(json_data)
print(restored_message.content, restored_message.id)
输出:
{'type': 'ai', 'content': '巴黎是法国的首都。', 'additional_kwargs': {'timestamp': '2025-05-15'}, 'id': 'msg_001'}
巴黎是法国的首都。 msg_001
说明:
to_json
返回消息的字典表示。from_json
还原为AIMessage
实例。
(5) 结合代理
在代理中使用 AIMessage
:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.tools import Tool
from langchain_core.callbacks import StdOutCallbackHandler
from langchain_core.runnables import RunnableConfig
# 定义工具
def search_web(query: str) -> str:
return f"搜索结果:{query} 的最新信息..."
search_tool = Tool(name="SearchWeb", func=search_web, description="搜索网络信息")
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 设置提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个研究助手,擅长搜索信息。"),
MessagesPlaceholder(variable_name="messages"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建代理
agent = create_openai_tools_agent(llm, [search_tool], prompt)
agent_executor = AgentExecutor(agent=agent, tools=[search_tool], verbose=True)
# 配置 RunnableConfig
config = RunnableConfig(callbacks=[StdOutCallbackHandler()], max_iterations=3)
# 执行任务
response = agent_executor.invoke({
"messages": [HumanMessage(content="量子计算的最新进展是什么?")]
}, config=config)
print(response["output"])
输出:
[AgentExecutor] 正在执行...
[Tool: SearchWeb] 输入:量子计算的最新进展
[Tool Output] 搜索结果:量子计算的最新信息...
[Final Answer] 量子计算的最新进展包括超导量子比特的突破...
说明:
AIMessage
可能包含工具调用,代理处理后生成最终响应。
5. 应用场景
AIMessage
适用于以下场景:
- 聊天机器人:
- 表示 AI 的响应,维护多轮对话。
- 示例:回答“法国的首都是什么?”。
- 智能代理:
- 处理工具调用,如搜索或计算。
- 示例:代理调用天气 API 并返回结果。
- 多模态交互:
- 处理文本+图像的响应。
- 示例:描述量子计算机图片。
- 对话记忆:
- 存储在
ConversationBufferMemory
中,保持上下文。 - 示例:连续回答相关问题。
- 存储在
- 结构化输出:
- 结合
with_structured_output
生成 JSON 格式响应。 - 示例:提取实体信息。
- 结合
- 错误处理:
- 使用
invalid_tool_calls
捕获工具调用错误。 - 示例:处理解析失败的工具调用。
- 使用
6. 优化建议
(1) 提高消息管理效率
- 精简历史:
- 限制对话历史长度,减少 token 消耗。
messages = messages[-10:] # 保留最后 10 条消息
- 总结历史:
- 使用
ConversationSummaryMemory
压缩长对话。
from langchain.memory import ConversationSummaryMemory memory = ConversationSummaryMemory(llm=llm)
- 使用
(2) 提高工具调用可靠性
- 验证工具调用:
- 检查
tool_calls
是否有效。
if not response.tool_calls: print("无工具调用") return response.content
- 检查
- 处理无效调用:
- 检查
invalid_tool_calls
并记录错误。
if response.invalid_tool_calls: print("无效工具调用:", response.invalid_tool_calls)
- 检查
(3) 提高性能
- 异步调用:
- 使用
ainvoke
处理高并发。
response = await llm.ainvoke(messages)
- 使用
- 缓存:
- 缓存常见查询结果。
from langchain.globals import set_llm_cache from langchain.cache import SQLiteCache set_llm_cache(SQLiteCache(database_path="cache.db"))
(4) 监控与调试
- 回调:
- 使用回调记录
AIMessage
生成。
from langchain_core.callbacks import BaseCallbackHandler class MessageCallback(BaseCallbackHandler): def on_chat_model_start(self, serialized, messages, **kwargs): print(f"输入消息:{messages}") config = {"callbacks": [MessageCallback()]}
- 使用回调记录
- LangSmith:
- 分析消息流和性能。
from langsmith import Client config = {"callbacks": [Client(api_key="your-langsmith-key")]}
(5) 上下文优化
- 动态元数据:
- 在
additional_kwargs
中添加上下文。
message = AIMessage(content="Hi", additional_kwargs={"session_id": "sess_001"})
- 在
- 结构化输出:
- 使用
with_structured_output
确保格式一致。
class Answer(BaseModel): question: str answer: str structured_llm = llm.with_structured_output(Answer)
- 使用
7. 注意事项
- 模型兼容性:
- 工具调用需要模型支持(如 GPT-4o、Claude)。
- 多模态输出需要特定模型(如 GPT-4o)。
- 消息长度:
- 过长内容可能超过 token 限制,使用截断或总结。
- 工具调用一致性:
- 确保
ToolMessage
的tool_call_id
与AIMessage
的tool_calls
匹配。
- 确保
- 序列化安全:
- 验证 JSON 数据格式,避免反序列化错误。
try: msg = AIMessage.from_json(json_data) except ValueError as e: print(f"反序列化失败:{e}")
- 安全性:
- 避免在
content
或additional_kwargs
中包含敏感信息。 - 验证工具调用参数,防止注入攻击。
- 避免在
- 废弃警告:
FunctionMessage
已废弃,优先使用ToolMessage
。
8. 与 LangChain 生态的结合
- 聊天模型:
AIMessage
是BaseChatModel
的输出。
response = llm.invoke(messages) # 返回 AIMessage
- 提示模板:
- 使用
ChatPromptTemplate
管理消息。
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([("human", "{input}")])
- 使用
- 代理:
AIMessage
支持工具调用,驱动代理行为。
agent.invoke({"messages": [HumanMessage(content="Hi")]})
- 记忆:
- 存储在
ConversationBufferMemory
中。
from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory(return_messages=True)
- 存储在
- 回调:
- 使用
RunnableConfig
配置回调。
config = {"callbacks": [StdOutCallbackHandler()]}
- 使用
9. 总结
- 定义:
AIMessage
是表示 AI 模型输出的消息类,继承自BaseMessage
。 - 核心属性:
content
:消息内容。tool_calls
:工具调用请求。invalid_tool_calls
:错误工具调用。additional_kwargs
:元数据。
- 功能:支持文本/多模态输出、工具调用、错误处理、序列化。
- 应用场景:聊天机器人、代理、多模态交互、记忆、结构化输出。
- 优化点:消息管理、工具调用可靠性、性能、监控、上下文优化。
- 注意事项:模型兼容性、消息长度、工具调用一致性、序列化安全。