跳至主要內容

LangChain学习

黄曦大约 3 分钟LangChainLangChain

AI 专栏

AI 相关技术文档


LangChain —— 消息(Message)

消息(Message)是 LangChain 中模型上下文(Context)的基本单位。

每条消息主要包含三个部分:

  • Role(角色):标识消息类型,例如 systemuser
  • Content(内容):消息的实际内容,可以是文本、图片、音频、文档等多模态数据
  • Metadata(元数据):可选信息,例如消息 ID、Token 使用量、响应信息等

最简单的使用方式

通常推荐创建消息对象,然后将消息列表传递给模型。

from langchain.chat_models import init_chat_model
from langchain.messages import (
    HumanMessage,
    AIMessage,
    SystemMessage
)

model = init_chat_model("openai:gpt-5-nano")

system_msg = SystemMessage(
    "You are a helpful assistant."
)

human_msg = HumanMessage(
    "Hello, how are you?"
)

messages = [
    system_msg,
    human_msg
]

response = model.invoke(messages)

返回值为:

AIMessage(...)

简单调用(无上下文)

如果只是一次性的文本生成,不需要保留聊天历史,可以直接传入字符串。

response = model.invoke(
    "Write a haiku about spring"
)

适用场景

  • 文本生成
  • 翻译
  • 总结
  • 改写
  • 不需要多轮对话

字典格式(OpenAI Chat 格式)

虽然 LangChain 已经封装了 Message 类,但仍然兼容 OpenAI Chat Completion 的消息格式。

messages = [
    {
        "role": "system",
        "content": "You are a poetry expert"
    },
    {
        "role": "user",
        "content": "Write a haiku about spring"
    },
    {
        "role": "assistant",
        "content": "Cherry blossoms bloom..."
    }
]

response = model.invoke(messages)

说明

能用,但一般不推荐

更推荐使用:

  • SystemMessage
  • HumanMessage
  • AIMessage
  • ToolMessage

LangChain 消息类型

LangChain 内置了几种常见消息类型。

消息类型作用
SystemMessage系统提示词,定义模型行为
HumanMessage用户输入
AIMessageAI 返回结果
ToolMessage工具调用结果

1. SystemMessage(系统消息)

用于告诉模型:

  • 扮演什么角色
  • 使用什么语气
  • 遵循哪些规则
  • 提供哪些上下文

例如:

from langchain.messages import SystemMessage

system_msg = SystemMessage(
    "You are a helpful assistant."
)

常见用途:

  • 设定 AI 身份
  • 输出格式约束
  • 指定回复语言
  • 安全限制

2. HumanMessage(用户消息)

表示用户输入。

除了文本,还支持:

  • 图片
  • 音频
  • 文件
  • 多模态内容

示例:

from langchain.messages import HumanMessage

human_msg = HumanMessage(
    content="Hello!"
)

HumanMessage 元数据

可以携带一些额外信息。

human_msg = HumanMessage(
    content="Hello!",
    name="alice",
    id="msg_123"
)

参数说明:

参数说明
content消息内容
name可选,用户名称
id可选,消息唯一 ID

3. AIMessage(AI 消息)

表示模型返回的内容。

除了文本之外,还可能包含:

  • Tool Calls
  • 多模态输出
  • Provider Metadata
  • Token 使用情况

例如:

response = model.invoke(messages)

print(response)

返回:

AIMessage(...)

手动创建 AIMessage

有时候,并不是所有 AIMessage 都来自模型。

例如:

  • 补充聊天历史
  • 恢复历史记录
  • 模拟 AI 回复

都可以手动创建。

from langchain.messages import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

ai_msg = AIMessage(
    "I'd be happy to help you with that question!"
)

messages = [
    SystemMessage(
        "You are a helpful assistant"
    ),
    HumanMessage(
        "Can you help me?"
    ),
    ai_msg,
    HumanMessage(
        "Great! What's 2+2?"
    )
]

response = model.invoke(messages)

这样模型会认为这条 AIMessage 就是之前已经回答过的内容。


4. ToolMessage(工具消息)

用于表示工具调用后的返回结果。

例如:

Human
    ↓
AI 发起 Tool Call
    ↓
Tool 执行
    ↓
ToolMessage 返回结果
    ↓
AI 根据 ToolMessage 继续回答

ToolMessage 通常由 Agent 自动生成,一般无需手动创建。


Token 使用情况

LangChain 会将 Token 使用信息保存到:

response.usage_metadata

示例:

response = model.invoke("Hello!")

print(response.usage_metadata)

可能输出:

{
    "input_tokens": 15,
    "output_tokens": 28,
    "total_tokens": 43
}

总结

SystemMessage
        │
        ▼
HumanMessage
        │
        ▼
   Chat Model
        │
        ▼
AIMessage
        │
        ▼
(可选)
Tool Call
        │
        ▼
ToolMessage
        │
        ▼
AIMessage

常见使用场景

场景推荐方式
一次性文本生成model.invoke("...")
多轮聊天Message 列表
设置 AI 身份SystemMessage
用户输入HumanMessage
AI 回复AIMessage
Tool 调用ToolMessage
查看 Tokenresponse.usage_metadata

推荐实践

✅ 推荐使用 Message 对象:

SystemMessage(...)
HumanMessage(...)
AIMessage(...)
ToolMessage(...)

❌ 不推荐直接使用字典格式:

{
    "role": "...",
    "content": "..."
}

虽然两种方式都支持,但 Message 类具有更好的:

  • 类型提示
  • 可读性
  • 可维护性
  • IDE 自动补全
  • 与 LangChain API 深度集成