消息对象中字段的说明

消息对象字段说明

SystemMessage参数列表

content:消息内容,字段名可以省略

bash 复制代码
SystemMessage("你是个善解人意的助手")

相当于

bash 复制代码
SystemMessage(content = "你是个善解人意的助手")

HumanMessage参数列表

content:消息内容,字段名可以省略

bash 复制代码
HumanMessage("你好啊")

metadata:元数据字段,可以有很多,自定义

举例:带有元数据字段

bash 复制代码
from dotenv import load_dotenv
import os
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from rich import print as rprint

load_dotenv(override=True)

CLOSEAI_API_KEY = os.getenv("CLOSEAI_API_KEY")
CLOSEAI_API_BASE = os.getenv("CLOSEAI_API_BASE")

model = init_chat_model(
    model="gpt-5.4-mini",
    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_API_BASE
)

messages = [
    HumanMessage(
        content="Hello World!",
        name="Bob",
        id = "msg987"
    )
]

rprint(model.invoke(messages))

name和id都属于元数据字段,当消息类型相同,对消息进行区分。但不是所有模型都支持这一功能,是否支持取决于模型供应商,需要查看官方手册。比如:

OpenAI的API手册告诉我们,HumanMessage支持name作为元数据字段,如下图所示。而DeepSeek得API官方文档明确支持name作为元数据,但实测发现模型无法识别

此处通过CloseAI平台调用 gpt-5.4-mini 展示 name 的作用。

bash 复制代码
from langchain_openrouter import ChatOpenRouter
from dotenv import load_dotenv
import os
from langchain_core.messages import SystemMessage,HumanMessage
load_dotenv(override=True)
CLOSEAI_API_KEY = os.getenv("CLOSEAI_API_KEY")
CLOSEAI_API_BASE = os.getenv("CLOSEAI_API_BASE")
model = init_chat_model(
    # model="openai/gpt-6.1-sol",
    model="openai:gpt-5.4-mini",

    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_API_BASE,
)
messages = [
    SystemMessage("你是一个信息抽取器。你会收到多条来自不同发言者的 user 消息。每条消息可能带有 name 字段。你的任务是:"
                  "严格根据每条消息的 name 提取发言者及其观点,并输出JSON。禁止使用"第一个人/第二个人"这种相对称呼。"
                  "若某条消息没有 name,则输出unknown。输出格式:{\"speakers\":[{\"name\":\"...\",\"claim\":\"...\"}]}"),
    HumanMessage(
        content="我认为 1+1=2",
        name="Bob"
),
    HumanMessage(
        content="我认为 1+1>2",
        name="Tom"
),
    HumanMessage(
        content="请列出谁说了什么,不要判断对错。",
        name="audience"
)
]
response = model.invoke(messages)
print(response.content)

说明:模型加载了 name传递 的信息,这在 多人对话场景 很有用。

拓展:使用ChatOpenRouter调用 没有将name正确传递 给模型服务。即:

bash 复制代码
from langchain_openrouter import ChatOpenRouter
from dotenv import load_dotenv
import os
from langchain_core.messages import SystemMessage,HumanMessage
load_dotenv(override=True)
OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv("OPENROUTER_API_BASE")
model = ChatOpenRouter(
    # model="openai/gpt-6.1-sol",
    model="gpt-4o-mini",
    api_key=OPENROUTER_API_KEY,
    base_url=OPENROUTER_API_BASE,
)
messages = [
    SystemMessage("你是一个信息抽取器。你会收到多条来自不同发言者的 user 消息。每条消息可能带有 name 字段。你的任务是:"
                  "严格根据每条消息的 name 提取发言者及其观点,并输出JSON。禁止使用"第一个人/第二个人"这种相对称呼。"
                  "若某条消息没有 name,则输出unknown。输出格式:{\"speakers\":[{\"name\":\"...\",\"claim\":\"...\"}]}"),
    HumanMessage(
        content="我认为 1+1=2",
        name="Bob"
),
    HumanMessage(
        content="我认为 1+1>2",
        name="Tom"
),
    HumanMessage(
        content="请列出谁说了什么,不要判断对错。",
        name="audience"
)
]
response = model.invoke(messages)
print(response.content)

AIMessage参数列表

content:模型输出的原始内容,字段名可以省略

bash 复制代码
AIMessage("你好")

相当于

bash 复制代码
AIMessage(content = "你好")

response_metadata:AIMessage特有属性,LLM的响应中附加元数据,根据不同的模型会有不同,如可能会包含本次token使用量等信息

tool_calls:AIMessage特有属性,表示工具调用信息,当LLM决定调用工具时,在AIMessage中就会包含这个属性,没有工具调用则为空。结构如下:

bash 复制代码
tool_calls=[
    {
        'name': 'get_weather',  #应调用的工具名
        'args': {'city': '杭州'}, # 调用工具的参数
        'id': 'call_00_gIXYOD1Q1OkEXmdDBqXR1578', # 工具调用的唯一标识ID
        'type': 'tool_call'
    },
    {
        'name': 'get_news',
        'args': {},
        'id': 'call_01_jD3phD5PEaIZf0mVLhKt0861',
        'type': 'tool_call'
    }
]

toool_calls属性是一个ToolCall列表,每个ToolCall是一个字典,包含字段见上

usage_metadata::用量信息

举例:

AIMessage调用工具

bash 复制代码
AIMessage(
    content="",
    tool_calls=[{
        'name': 'get_weather',
        'args': {'city': '北京'},
        'id': 'call_xxx'
}]
)

更丰富的参数

bash 复制代码
from langchain_core.messages import SystemMessage,HumanMessage
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
from rich import print as rprint
# 从.env文件中加载环境变量
load_dotenv(override=True)
CLOSEAI_API_KEY = os.getenv("CLOSEAI_API_KEY")
CLOSEAI_API_BASE = os.getenv("CLOSEAI_API_BASE")
model = init_chat_model(
    model="gpt-6.1-sol",
    model_provider="openai",
    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_API_BASE
)
messages = [
    SystemMessage("你叫小智,是一名助人为乐的助手。"),
    HumanMessage("你好,好久不见,请介绍下你自己。")
]
response = model.invoke(messages)
rprint(response)

返回内容分析

ToolMessage参数列表

content:文件内容

name:工具名称

tool_call_id:工具调用唯一ID,ToolMessage必须紧邻匹配的AIMessage,和前者tool_calls中的id一致

bash 复制代码
ToolMessage(
    content="<工具输出>",
    name="get_weather",
    tool_call_id="call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s" # 一定要和AI消息中的调用ID匹配
)

举例1:工具调用(json格式)

bash 复制代码
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
# 从.env文件中加载环境变量
load_dotenv(override=True)
CLOSEAI_API_KEY = os.getenv("CLOSEAI_API_KEY")
CLOSEAI_BASE_URL = os.getenv("CLOSEAI_BASE_URL")
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_BASE_URL
)
def get_weather(city: str) -> str:
    return "不错哦~"
# 模拟模型绑定工具
model_with_tools = model.bind_tools([get_weather])
ai_message = {
    "role": "assistant",
    "content": "",
    "tool_calls": [{
        "name": "get_weather",
        "args": {"location": "北京"},
        "id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
}]
}
tool_message = {
    "role": "tool",
    "content": "今天北京天气晴朗,万里无云~",
    "tool_call_id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
}
messages = [
    {"role": "user", "content": "北京天气如何"},
    ai_message,
    tool_message
]
response = model.invoke(messages)
print(response)

工具调用(对象格式)

bash 复制代码
from langchain_core.messages import AIMessage, ToolMessage,HumanMessage
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
# 从.env文件中加载环境变量
load_dotenv(override=True)
CLOSEAI_API_KEY = os.getenv("CLOSEAI_API_KEY")
CLOSEAI_BASE_URL = os.getenv("CLOSEAI_BASE_URL")
model = init_chat_model(
    model="gpt-5.4-mini",
    model_provider="openai",
    api_key=CLOSEAI_API_KEY,
    base_url=CLOSEAI_BASE_URL
)
def get_weather(city: str) -> str:
    return "不错哦~"
# 模拟模型绑定工具

model_with_tools = model.bind_tools([get_weather])
# ai_message = {
# "role": "assistant",
# "content": "",
# "tool_calls": [{
# "name": "get_weather",
# "args": {"location": "北京"},
# "id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
# }]
# }
ai_message = AIMessage(
    content = [],
    tool_calls = [{
    "name": "get_weather",
    "args": {"location": "北京"},
    "id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
}]
)
# tool_message = {
# "role": "tool",
# "content": "今天北京天气晴朗,万里无云~",
# "tool_call_id": "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
# }
tool_message = ToolMessage(
    content = "今天北京天气晴朗,万里无云~",
    tool_call_id = "call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"
)
messages = [
# {"role": "user", "content": "北京天气如何"},
HumanMessage(content="北京天气如何"),
    ai_message,
    tool_message
]
# for message in messages:
# print(message)
response = model.invoke(messages)
print(response)
相关推荐
八荒启·交互动画1 小时前
Web特效025—用 Canvas 2D 做Web特效的定义与边界:这支画笔能做到哪一步
前端·webgl·网页特效·八荒启-交互动画·八荒启
Ai-_Man1 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
Java后端的Ai之路1 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
zlpzlpzyd1 小时前
nacos的openapi地址
java
excel2 小时前
Nuxt 中使用 useHead 优化 SEO 与 GEO
前端
Java后端的Ai之路2 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索
happylifetree2 小时前
Python22-26:核心语法-流程控制语句-if条件判断
python
程序员清风2 小时前
PydanticAI 实战:用类型安全构建可靠的 Python Agent
开发语言·python·安全
落魄实习生2 小时前
Agent Scope Java 2.x 系列【10】Middleware
java·开发语言·ai