110.Agent-LangChain核心组件-Messages消息和提示词工程

**摘要:**本文围绕 LangChain 中 Message 这一与大模型沟通的基本数据结构展开,系统讲解消息类型(system、user、assistant、tool)、消息内容(Content)与元数据(metadata)的构成,并通过 message 实例与带角色的类(SystemMessage、HumanMessage、AIMessage、ToolMessage)说明其用法。文章还结合 Agent 使用实例、普通使用实例以及提示词工程,演示如何正确设置系统提示词并调用大模型完成实际任务。

内容参考于:图灵AI大模型全栈

在LangChhain中Message是跟大模型沟通的基本数据结构,就是说知道message的结构后就能知道什么样子后才能和大语言模型进行交互

消息类型

system、user、assistant、tool

system是系统提示词,它最优先遵循的

user是用户提示词,就是我们向大模型提问的问题

assistant是大模型的回复

tool是工具的回复

消息内容

Content:它是实际的消息,消息内容包含文本、图片等,通过与消息类型的配合就能知道是谁的消息了

元数据

metadata:它是可选字段,可以用来描述 Content 的内容、消息的id、Token消耗情况等

message实例

json 复制代码
{
  "messages": [
    {
      "id": "msg_a1b2c3d4e5f6",
      "role": "system",
      "content": "你是一个专业的中文翻译助手,擅长将英文翻译成地道准确的中文。请保持原文的语气和语境。",
      "metadata": {
        "timestamp": "2026-06-10T13:40:00Z",
        "version": "v1"
      }
    },
    {
      "id": "msg_b2c3d4e5f6g7",
      "role": "user",
      "content": "Could you please recommend some popular cafes near Koto Ward?",
      "metadata": {
        "timestamp": "2026-06-10T13:40:30Z",
        "token_usage": {
          "input_tokens": 12
        }
      }
    },
    {
      "id": "msg_c3d4e5f6g7h8",
      "role": "assistant",
      "content": "你能给我推荐一些附近比较受欢迎的咖啡馆吗?",
      "tool_calls": [],
      "metadata": {
        "timestamp": "2026-06-10T13:41:00Z",
        "input_tokens": 12,
        "output_tokens": 156,
        "total_tokens": 168
      }
    }
  ]
}

LangChain为我们提供了带角色的类,从而让我们不需要手动写上方的 messages

SystemMessage, HumanMessage, AIMessage, ToolMessage

SystemMessage表示系统消息

HumanMessage表示用户消息

AIMessage表示助手消息

ToolMessage表示工具消息

Agent使用实例

效果图:通过LangSmith可以看出,它的系统提示词是用的 SystemMessage 里的内容

但是不要这样设置系统提示词,一般使用下图红框的 system_prompt 参数来设置系统提示词

代码

python 复制代码
from langchain.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage
# create_agent是LangChain提供的创建Agent的核心模块
from langchain.agents import create_agent
# 引入调用模型的openai
from langchain_openai import ChatOpenAI
# 引入 把.env文件中的内容加载成环境变量 的库
from dotenv import load_dotenv
import os
把.env文件中的内容加载成环境变量
load_dotenv()
初始化模型
llm = ChatOpenAI(
model="qwen3.7-flash",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
)
创建一个工具,获取天气的工具
def get_weather(city):
# 工具描述,新版本LangChain会获取这个字符串当做工具的描述写到提示词中
""" 获取指定城市的天气信息 """
# 工具逻辑
return f"{city}天气是美好的"
agent = create_agent(
model=llm,
tools=[get_weather],
# 系统提示词
system_prompt="你是一个智能助手,能够回答用户关于天气的问题,可以使用提供的天气工具来获取天气信息"
)
system_msg = SystemMessage("你是一个助手")
human_msg = HumanMessage("大模型是什么?")
messages = {"messages":[system_msg, human_msg]}
result = agent.invoke(messages)
print(result)

普通使用实例

效果图:

代码,它跟create_agent有区别,它的message只需要一个数组就可以了,而create_agent需要一个字典对象,{"messages":\[\]}这样的格式,这个messages不能写错了,写错了就无作用

python 复制代码
from langchain.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
初始化模型
llm = init_chat_model(model="qwen3.7-flash",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
model_provider="openai")  # 指定模型提供商为OpenAI
创建消息列表
SystemMessage系统消息, HumanMessage用户消息, AIMessage助手消息, ToolMessage工具消息
system_msg = SystemMessage("你是一个知识渊博的老者,说话方式风趣幽默,喜欢用成语和典故来表达观点。")
human_msg = HumanMessage("大模型是什么?")
messages = [system_msg, human_msg]
也可以使用字典格式的消息列表
messages = [
{"role": "system", "content": "你是一个知识渊博的老者,说话方式风趣幽默,喜欢用成语和典故来表达观点。"},
{"role": "user", "content": "写一首关于春天的诗句。"}
]
# 普通对话
result = llm.invoke(messages)  # 会返回一个AIMessage
print(result)

提示词工程

普通用户的提示词只需要提出问题,但是系统提示词是需要很专业的,一般由 系统指令、工具或函数、上下文或背景知识、历史消息、用户输入 组成

系统指令:设定大模型的角色,比如 你是一位xxx专家,请使用中文回答,通过这样的角色限定,大模型再回答问题时就会偏向找xxx相关的知识来回答

工具或函数:告诉大模型可以调用的外部工具或者函数,也就是Agent中的手和脚

上下文或背景知识:就是给大模型的参考资料,就是给大模型提问时,问题中需要到的资料

历史消息:就是大模型的记忆,我们跟大模型的聊天记录

用户输入:就是最新提问的问题,比如 今天天气怎么样

更细节的实例,去看第2节

代码实例效果图:

代码

python 复制代码
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
加载环境变量
load_dotenv()
初始化模型
llm = ChatOpenAI(model="qwen3.7-flash",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL")
)
创建系统提示词
system_prompt = """
角色
你是一位小红书爆款推文作者。
目标
根据用户提供的主题,创作一篇小红书推文。
输出格式
Markdown
内容要求
标题:提供3个不同风格的爆款标题
公式:数字+形容词+关键词+情绪词(如:"3款巨显白发色 | 黄皮必冲!")
正文:
开头(2行内抓眼球):痛点提问或直接安利
中间:分点陈述(用emoji,加粗重点),写真实体验而非堆砌参数
结尾:引导互动("评论区聊聊你的看法~")
话题标签:提供10个精准标签,组合策略:大流量词+细分词+场景词
视觉建议:一句话描述封面/配图风格
风格要求
口语化、有情绪感、善用"绝了""谁懂啊""真的会谢"等小红书高频词。
"""
创建代理
agent = create_agent(
model=llm,
system_prompt=system_prompt
)
进行流式输出
for token, metadata in agent.stream(
{"messages": [HumanMessage(content="-")]},
stream_mode="messages",
):
print(token.content, end="", flush=True)

相关推荐
一航jason1 小时前
GPU 推荐用吗?——8295 上 Adreno 695 的现实评估
人工智能·ai·ai编程·llama·ai-native
光锥智能1 小时前
小鹏第一位机器人自己走下产线
大数据·人工智能
YonyouHRSaaS1 小时前
AI视频面试系统定义、功能作用、品牌推荐、选择攻略
人工智能·面试·职场和发展·ai面试·视频面试·ai视频面试
zzzll11111 小时前
Codex:OpenAI 的 AI 编程助手全面解析
人工智能
陈童学哦2 小时前
仅2个Token就能篡改大模型输出?Kimi爆出玄学漏洞,多家头部模型集体中招
人工智能
夜果子2 小时前
TraeCode从0.5开发微信小程序【需求-开发-测试】
人工智能
机器学习是魔鬼2 小时前
当 AI 学会“上课”:清华 OpenMAIC 如何打造真正的 AI 互动课堂
人工智能·矩池云
断眉的派大星2 小时前
NVIDIA AI 软件生态完整学习笔记
人工智能
Capricorn19882 小时前
知芽 Notebook Skill 引用存在性校验与单元记忆破解幽灵引用危机
大数据·论文阅读·人工智能·论文笔记