【LangChain】langchain_core.messages.AIMessage 类:AI 模型生成的消息(回答内容、工具调用请求、相关元数据)

langchain_core.messages.AIMessage 是 LangChain 框架中 langchain_core.messages 模块的一个核心类,用于表示由 AI 模型生成的消息。它继承自 BaseMessage,是对话系统中表示模型输出的关键组件,广泛应用于聊天机器人、智能代理和多轮对话场景。以下是对 AIMessage 的详细介绍,涵盖其定义、功能、属性与方法、使用方式、应用场景、代码示例、优化建议和注意事项。


1. 什么是 AIMessage

AIMessage 是一个具体消息类,表示聊天模型(如 ChatOpenAIChatAnthropic)在响应用户或系统输入时生成的消息。它包含 AI 的回答内容、工具调用请求(如果有)以及相关元数据。AIMessage 的设计目标是:

  • 标准化 AI 输出:统一表示模型的文本响应、工具调用和元数据。
  • 支持复杂交互:处理多轮对话、工具调用和多模态输出。
  • 无缝集成:与 LangChain 的代理、链、记忆等模块协作。

核心功能

  • 存储 AI 生成的文本或多模态内容。
  • 支持工具调用,通过 tool_calls 属性指定要调用的工具和参数。
  • 提供错误处理机制,捕获无效的工具调用。
  • 支持序列化和反序列化,便于存储或传输。

BaseMessage 的关系

  • AIMessage 继承自 BaseMessage,扩展了特定于 AI 输出的字段(如 tool_callsinvalid_tool_calls)。
  • 它与 HumanMessageSystemMessageToolMessage 等其他消息类一起,构建完整的对话上下文。

2. 功能与特点

AIMessage 提供以下主要功能:

  1. 消息内容
    • 通过 content 属性存储 AI 的响应,可以是字符串或多模态内容(如文本+图像)。
    • 示例:content="巴黎是法国的首都。" 或包含图像的列表。
  2. 工具调用
    • 通过 tool_calls 属性存储工具调用请求,包含工具名称、参数和 ID。
    • 支持 OpenAI 的函数调用或其他模型的工具调用接口。
  3. 错误处理
    • 通过 invalid_tool_calls 属性捕获解析错误的工具调用,确保健壮性。
  4. 元数据
    • 使用 additional_kwargs 存储额外信息,如时间戳、模型特定参数。
    • 可选的 id 属性用于消息唯一标识。
  5. 序列化
    • 支持 to_jsonfrom_json 方法,便于消息存储和传输。
  6. 对话上下文
    • 作为消息列表的一部分,维护多轮对话历史,供模型生成上下文相关响应。

特点

  • 类型安全:使用 Pydantic 模型,确保字段验证。
  • 跨模型兼容:支持 OpenAI、Anthropic、Mistral 等模型的输出格式。
  • 灵活扩展:通过 additional_kwargs 支持自定义元数据。
  • 高效集成:与 LangChain 的代理、记忆和提示模板无缝协作。

3. 核心属性与方法

核心属性

属性类型描述示例
contentUnion[str, List[Dict]]消息内容,字符串或多模态数据。"巴黎是法国的首都。"[{"type": "text", "text": "Hi"}]
rolestr消息角色,固定为 "assistant""assistant"
additional_kwargsDict[str, Any]附加元数据,如工具调用或时间戳。{"tool_calls": [...], "timestamp": "2025-05-15"}
tool_callsList[Dict]工具调用请求列表,包含工具名称、参数和 ID。[{"id": "call_1", "function": {"name": "search", "arguments": {"query": "news"}}}]
invalid_tool_callsList[Dict]解析错误的工具调用列表。[]
idOptional[str]消息的唯一标识符。"msg_001"
examplebool是否为示例消息(通常忽略)。False
nameOptional[str]消息的名称,用于区分不同 AI 实体。"Assistant1"

核心方法

方法描述输入输出示例
to_json序列化为 JSON 格式。Dictmessage.to_json()
from_json从 JSON 还原消息(类方法)。DictAIMessageAIMessage.from_json(json_data)
__str__返回字符串表示。strstr(message)
__eq__比较消息是否相等。AIMessageboolmessage1 == message2

注意

  • tool_callsinvalid_tool_callsAIMessage 特有的,专为工具调用场景设计。
  • 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。

说明

  • AIMessagetool_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
图片显示一台量子计算机的实验设备,周围有冷却装置和控制面板。

说明

  • AIMessagecontent 可以是字符串或多模态数据。

(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 适用于以下场景:

  1. 聊天机器人
    • 表示 AI 的响应,维护多轮对话。
    • 示例:回答“法国的首都是什么?”。
  2. 智能代理
    • 处理工具调用,如搜索或计算。
    • 示例:代理调用天气 API 并返回结果。
  3. 多模态交互
    • 处理文本+图像的响应。
    • 示例:描述量子计算机图片。
  4. 对话记忆
    • 存储在 ConversationBufferMemory 中,保持上下文。
    • 示例:连续回答相关问题。
  5. 结构化输出
    • 结合 with_structured_output 生成 JSON 格式响应。
    • 示例:提取实体信息。
  6. 错误处理
    • 使用 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 限制,使用截断或总结。
  • 工具调用一致性
    • 确保 ToolMessagetool_call_idAIMessagetool_calls 匹配。
  • 序列化安全
    • 验证 JSON 数据格式,避免反序列化错误。
    try:
        msg = AIMessage.from_json(json_data)
    except ValueError as e:
        print(f"反序列化失败:{e}")
    
  • 安全性
    • 避免在 contentadditional_kwargs 中包含敏感信息。
    • 验证工具调用参数,防止注入攻击。
  • 废弃警告
    • FunctionMessage 已废弃,优先使用 ToolMessage

8. 与 LangChain 生态的结合

  • 聊天模型
    • AIMessageBaseChatModel 的输出。
    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:元数据。
  • 功能:支持文本/多模态输出、工具调用、错误处理、序列化。
  • 应用场景:聊天机器人、代理、多模态交互、记忆、结构化输出。
  • 优化点:消息管理、工具调用可靠性、性能、监控、上下文优化。
  • 注意事项:模型兼容性、消息长度、工具调用一致性、序列化安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值