在 LangChain 中,langchain_core.messages 模块是用于定义和管理消息对象的核心组件,广泛应用于聊天模型、代理(Agents)和对话链(Conversational Chains)。消息对象表示用户、模型、工具或其他实体之间的交互内容,通常用于构建对话上下文、传递工具调用结果或维护对话历史。该模块提供了一套标准化的消息类型,支持结构化对话管理,适用于多轮对话、工具调用和上下文增强等场景。

以下是对 langchain_core.messages 模块的详细介绍,涵盖其定义、核心类、功能、实现方式、应用场景、代码示例、优化建议、注意事项以及与 LangChain 生态的结合。


1. 什么是 langchain_core.messages

langchain_core.messages 模块定义了一组消息类,用于表示对话中的不同角色或类型的消息。它是 LangChain 对话系统的基础,允许开发者:

  • 标准化消息格式:统一表示用户输入、模型响应、工具调用等。
  • 支持多轮对话:通过消息列表维护对话历史。
  • 集成工具调用:处理工具调用请求和结果。
  • 增强上下文:将消息与提示模板、记忆(Memory)或代理结合。

消息对象通常作为列表传递给聊天模型或代理,代表完整的对话上下文。每个消息包含角色(role)、内容(content)和其他元数据(如工具调用信息)。

核心目标

  • 提供一致的消息表示,简化对话管理。
  • 支持复杂交互,如工具调用和多模态输入。
  • 便于与 LangChain 的其他模块(如提示模板、代理、记忆)集成。

2. 核心消息类

langchain_core.messages 模块定义了以下主要消息类,位于 langchain_core.messages 命名空间中:

类名 描述 主要字段 适用场景
BaseMessage 所有消息的基类,定义通用属性。 content(str 或 List)、role(str)、additional_kwargs(Dict) 自定义消息类型
HumanMessage 表示用户发送的消息。 content 用户输入、查询
AIMessage 表示模型生成的消息。 contenttool_calls(List[Dict]) 模型响应、工具调用
SystemMessage 表示系统提示或指令。 content 设置对话上下文、定义模型行为
ToolMessage 表示工具调用的结果。 contenttool_call_id(str) 工具执行结果反馈
FunctionMessage 表示函数调用结果(已废弃,推荐使用 ToolMessage)。 contentname(str) 旧版函数调用(OpenAI Functions)
ChatMessage 表示任意角色的消息。 contentrole(str) 自定义角色对话

字段说明

  • content:消息的主要内容,可以是字符串或多模态内容(如图像、文本混合的列表)。
  • role:消息的角色(如 "human""assistant""system")。
  • additional_kwargs:附加元数据,如时间戳、ID 或模型特定参数。
  • tool_calls(仅 AIMessage):工具调用请求的列表,包含工具名称和参数。
  • tool_call_id(仅 ToolMessage):关联的工具调用 ID,用于匹配请求和结果。

3. 功能与特点

langchain_core.messages 模块提供以下功能:

  1. 统一消息表示
    • 标准化不同角色的消息格式,便于模型和代理处理。
    • 支持字符串和多模态内容(如文本+图像)。
  2. 对话上下文管理
    • 通过消息列表维护多轮对话历史。
    • ConversationBufferMemory 等记忆模块集成。
  3. 工具调用支持
    • AIMessage 支持生成工具调用请求。
    • ToolMessage 用于反馈工具执行结果。
  4. 灵活扩展
    • 支持自定义消息类型,继承 BaseMessage
    • 通过 additional_kwargs 传递元数据。
  5. 序列化与解析
    • 消息对象可序列化为 JSON,便于存储或传输。
    • 支持从 JSON 反序列化为消息对象。
  6. 多模态支持
    • content 可以是字符串或包含文本、图像等的列表。
    • 适用于支持多模态输入的模型(如 GPT-4o)。

特点

  • 模块化:消息类独立且可扩展,适合各种对话场景。
  • 类型安全:使用 Pydantic 模型确保字段验证。
  • 跨模型兼容:支持 OpenAI、Anthropic、HuggingFace 等模型的对话格式。
  • 生态集成:与提示模板、代理、工具、记忆等无缝协作。

4. 使用方式与代码示例

以下是 langchain_core.messages 模块的主要使用方式,结合代码示例说明:

(1) 基本消息创建与使用

创建不同类型的消息并传递给聊天模型:

from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
from langchain_openai import ChatOpenAI

# 初始化模型
llm = ChatOpenAI(api_key="your-openai-key")

# 创建消息列表
messages = [
    SystemMessage(content="你是一个量子计算专家,回答要简洁且准确。"),
    HumanMessage(content="量子计算是什么?"),
]

# 调用模型
response = llm.invoke(messages)
print(response.content)

输出

量子计算是一种基于量子力学原理的计算范式,使用量子比特进行计算。

说明

  • SystemMessage 设置模型行为。
  • HumanMessage 表示用户查询。
  • 消息列表作为上下文传递给模型。

(2) 对话历史管理

使用消息列表维护多轮对话:

from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(api_key="your-openai-key")

# 初始化对话历史
messages = [
    HumanMessage(content="量子计算是什么?"),
    AIMessage(content="量子计算是一种基于量子力学原理的计算范式。"),
    HumanMessage(content="有哪些最新进展?")
]

# 调用模型
response = llm.invoke(messages)
print(response.content)

输出

最新进展包括超导量子比特的突破和量子纠错技术的改进。

说明

  • 消息列表模拟对话历史,模型根据上下文生成响应。
  • 可结合 ConversationBufferMemory 自动管理历史。

(3) 工具调用与 ToolMessage

处理工具调用请求和结果:

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(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 关联。
  • 模型根据工具结果生成最终响应。

(4) 多模态消息

使用多模态内容(需要支持多模态的模型,如 GPT-4o):

from langchain_core.messages import HumanMessage
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/image.jpg"}}
    ])
]

# 调用模型
response = llm.invoke(messages)
print(response.content)

输出(假设图片可用):

图片显示一台量子计算机的实验设备,周围有冷却装置和控制面板。

说明

  • content 为列表,包含文本和图像 URL。
  • 仅支持多模态模型(如 GPT-4o)。

(5) 与记忆结合

结合 ConversationBufferMemory 管理对话历史:

from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# 初始化模型和记忆
llm = ChatOpenAI(api_key="your-openai-key")
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(llm=llm, memory=memory)

# 第一轮对话
response = conversation.invoke("量子计算是什么?")
print(response["response"])

# 第二轮对话
response = conversation.invoke("有哪些最新进展?")
print(response["response"])

# 查看对话历史
print(memory.chat_memory.messages)

输出

量子计算是一种基于量子力学原理的计算范式。
最新进展包括超导量子比特的突破和量子纠错技术的改进。
[
    HumanMessage(content='量子计算是什么?'),
    AIMessage(content='量子计算是一种基于量子力学原理的计算范式。'),
    HumanMessage(content='有哪些最新进展?'),
    AIMessage(content='最新进展包括超导量子比特的突破...')
]

说明

  • ConversationBufferMemory 自动存储消息对象。
  • return_messages=True 确保返回 HumanMessageAIMessage 实例。

6. 应用场景

langchain_core.messages 模块适用于以下场景:

  1. 多轮对话
    • 构建聊天机器人,维护对话历史。
    • 示例:回答连续问题,如“量子计算是什么?”和“它有什么应用?”。
  2. 工具调用
    • 处理代理或链中的工具交互。
    • 示例:代理调用搜索工具并反馈结果。
  3. 上下文增强
    • 为模型提供系统提示或历史上下文。
    • 示例:设置“以专家身份回答”并提供背景。
  4. 多模态交互
    • 处理文本+图像或文本+音频的对话。
    • 示例:描述图片内容或分析多模态输入。
  5. 对话记忆
    • 结合记忆模块存储和检索对话历史。
    • 示例:实现长期对话的上下文保持。
  6. 代理工作流
    • 在代理中管理用户、模型和工具的消息流。
    • 示例:代理搜索最新信息并总结。

7. 优化建议

(1) 提高消息管理效率

  • 精简消息
    • 仅保留必要的对话历史,减少 token 消耗。
    • 示例:使用 ConversationSummaryMemory 压缩历史。
    from langchain.memory import ConversationSummaryMemory
    memory = ConversationSummaryMemory(llm=llm)
    
  • 批量处理
    • 批量传递多组消息,减少 API 调用。
    results = llm.batch([messages1, messages2])
    

(2) 提高工具调用可靠性

  • 验证工具调用
    • 检查 tool_calls 是否有效。
    if not response.tool_calls:
        print("无工具调用")
        return response.content
    
  • 匹配 tool_call_id
    • 确保 ToolMessagetool_call_idAIMessage 一致。
    tool_message = ToolMessage(content=result, tool_call_id=tool_call["id"])
    

(3) 提高性能

  • 缓存对话
    • 使用 LangChain 的缓存机制存储常见对话。
    from langchain.globals import set_llm_cache
    from langchain.cache import SQLiteCache
    set_llm_cache(SQLiteCache(database_path="cache.db"))
    
  • 异步调用
    • 使用 ainvoke 支持高并发。
    response = await llm.ainvoke(messages)
    

(4) 监控与调试

  • 回调
    • 使用回调记录消息生成和工具调用。
    from langchain_core.callbacks import BaseCallbackHandler
    class MessageCallback(BaseCallbackHandler):
        def on_chat_model_start(self, serialized, messages, **kwargs):
            print(f"输入消息:{messages}")
    config = {"callbacks": [MessageCallback()]}
    response = llm.invoke(messages, config=config)
    
  • LangSmith
    • 分析消息流和性能。
    from langsmith import Client
    config = {"callbacks": [Client(api_key="your-langsmith-key")]}
    

(5) 上下文优化

  • 动态系统提示
    • 根据任务调整 SystemMessage
    system_message = SystemMessage(content=f"今天是 {datetime.now().strftime('%Y-%m-%d')},回答要简洁。")
    
  • 消息截断
    • 限制历史消息数量,防止上下文超限。
    messages = messages[-10:]  # 保留最后 10 条消息
    

8. 注意事项

  • 模型兼容性
    • 某些模型不支持多模态消息(如图像输入)。
    • 检查模型文档是否支持 tool_calls(如 GPT-4、Claude)。
  • 消息长度
    • 过多的消息或长内容可能超过模型的 token 限制。
    • 使用 ConversationSummaryMemory 或截断消息。
  • 工具调用一致性
    • 确保 ToolMessagetool_call_idAIMessagetool_calls 匹配。
    • 缺少 tool_call_id 可能导致代理无法关联结果。
  • 序列化
    • 消息对象需正确序列化以存储或传输。
    • 使用 to_json()from_json() 方法。
    json_data = message.to_json()
    restored_message = BaseMessage.from_json(json_data)
    
  • 安全性
    • 避免在消息中包含敏感信息(如 API 密钥)。
    • 验证用户输入,防止注入攻击。
  • 废弃警告
    • FunctionMessage 已标记为废弃,推荐使用 ToolMessage
    • 检查代码是否使用最新消息类型。

9. 与 LangChain 生态的结合

  • 提示模板(Prompt Templates)
    • 使用 ChatPromptTemplate 管理消息。
    from langchain_core.prompts import ChatPromptTemplate
    prompt = ChatPromptTemplate.from_messages([
        ("system", "你是一个专家。"),
        ("human", "{input}")
    ])
    
  • 代理(Agents)
    • 消息用于代理的输入和工具调用。
    from langchain.agents import create_openai_tools_agent
    agent = create_openai_tools_agent(llm, tools, prompt)
    
  • 工具(Tools)
    • AIMessageToolMessage 支持工具调用。
    messages.append(ToolMessage(content=tool_result, tool_call_id=tool_call["id"]))
    
  • 记忆(Memory)
    • 结合 ConversationBufferMemory 存储消息。
    memory = ConversationBufferMemory(return_messages=True)
    
  • 回调(Callbacks)
    • 监控消息生成和处理。
    config = {"callbacks": [MessageCallback()]}
    
  • LangSmith
    • 分析消息流和对话性能。

10. 综合示例:代理工具调用

以下是一个结合消息、工具调用和代理的完整示例:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage
from langchain_core.tools import tool
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.callbacks import StdOutCallbackHandler
from langchain_core.runnables import RunnableConfig

# 定义工具
@tool
def search_web(query: str) -> str:
    """搜索网络信息"""
    return f"搜索结果:{query} 的最新信息..."

# 初始化模型和工具
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
tools = [search_web]

# 设置提示模板
prompt = ChatPromptTemplate.from_messages([
    SystemMessage(content="你是一个研究助手,擅长搜索和总结信息。"),
    MessagesPlaceholder(variable_name="messages"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# 创建代理
agent = create_openai_tools_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 配置 RunnableConfig
config = RunnableConfig(
    callbacks=[StdOutCallbackHandler()],
    max_iterations=3,
    metadata={"request_id": "req_001"}
)

# 执行任务
response = agent_executor.invoke({
    "messages": [HumanMessage(content="量子计算的最新进展是什么?")]
}, config=config)

print(response["output"])

输出

[AgentExecutor] 正在执行...
[Tool: search_web] 输入:量子计算的最新进展
[Tool Output] 搜索结果:量子计算的最新信息...
[Final Answer] 量子计算的最新进展包括超导量子比特的突破...

11. 学习资源


12. 总结

  • 定义langchain_core.messages 模块定义消息类,用于表示对话中的用户、模型、工具等交互内容。
  • 核心类
    • HumanMessage:用户输入。
    • AIMessage:模型响应,支持工具调用。
    • SystemMessage:系统指令。
    • ToolMessage:工具结果。
    • ChatMessage:自定义角色。
  • 功能:统一消息表示、对话管理、工具调用、多模态支持、序列化。
  • 应用场景:多轮对话、工具调用、上下文增强、多模态交互、记忆管理、代理工作流。
  • 优化点:消息管理、工具调用可靠性、性能、监控、上下文优化。
  • 注意事项:模型兼容性、消息长度、工具调用一致性、序列化、安全性、废弃警告。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐