消息对象字段说明
SystemMessage参数列表
content:消息内容,字段名可以省略
SystemMessage("你是个善解人意的助手")相当于
SystemMessage(content="你是个善解人意的助手")HumanMessage参数列表
content:消息内容,字段名可以省略
HumanMessage("你好啊")metadata:元数据字段,可以有很多,自定义
举例:带有元数据字段
from dotenvimportload_dotenvimportos from langchain.chat_modelsimportinit_chat_model from langchain_core.messagesimportHumanMessage from richimportprint 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 的作用。
from langchain_openrouterimportChatOpenRouter from dotenvimportload_dotenvimportos from langchain_core.messagesimportSystemMessage,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正确传递 给模型服务。即:
from langchain_openrouterimportChatOpenRouter from dotenvimportload_dotenvimportos from langchain_core.messagesimportSystemMessage,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:模型输出的原始内容,字段名可以省略
AIMessage("你好")相当于
AIMessage(content="你好")response_metadata:AIMessage特有属性,LLM的响应中附加元数据,根据不同的模型会有不同,如可能会包含本次token使用量等信息
tool_calls:AIMessage特有属性,表示工具调用信息,当LLM决定调用工具时,在AIMessage中就会包含这个属性,没有工具调用则为空。结构如下:
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调用工具
AIMessage(content="",tool_calls=[{'name':'get_weather','args':{'city':'北京'},'id':'call_xxx'}])更丰富的参数
from langchain_core.messagesimportSystemMessage,HumanMessage from langchain.chat_modelsimportinit_chat_model from dotenvimportload_dotenvimportos from richimportprint 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一致
ToolMessage(content="<工具输出>",name="get_weather",tool_call_id="call_00_nUD2NC9QRN5Cg1GaoIkBJQ4s"# 一定要和AI消息中的调用ID匹配)举例1:工具调用(json格式)
from langchain.chat_modelsimportinit_chat_model from dotenvimportload_dotenvimportos# 从.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)工具调用(对象格式)
from langchain_core.messagesimportAIMessage, ToolMessage,HumanMessage from langchain.chat_modelsimportinit_chat_model from dotenvimportload_dotenvimportos# 从.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)