Skip to main content
版权归属于 LangChat Team
官网:https://langchat.cn

05 - ChatMessage 类型详解

版本说明

本文档基于 LangChain4j 1.10.0 版本编写。

学习目标

通过本章节学习,你将能够:
  • 理解 ChatMessage 接口及其实现
  • 掌握 UserMessage、AiMessage、SystemMessage 的使用
  • 了解 ToolExecutionResultMessage 的作用
  • 学会组合不同类型的消息构建对话
  • 掌握多模态消息的处理

前置知识

  • 完成《01 - LangChain4j 简介》章节
  • 完成《02 - 你的第一个 Chat 应用》章节
  • 完成《03 - 深入理解 ChatModel》章节
  • 完成《04 - 模型参数配置》章节

核心概念

ChatMessage 接口层次

ChatMessage 是所有消息类型的基接口,代表与 LLM 交互的任何消息。
类比理解: 如果把与 LLM 的对话比作一场讨论会,那么:
  • UserMessage = 你说的话
  • AiMessage = LLM 说的回答
  • SystemMessage = 会场规则或主持人指示
  • ToolExecutionResultMessage = 工具助手执行任务后的报告

消息类型概览

UserMessage 详解

基本用法

UserMessage 代表来自用户或应用的消息。

UserMessage 的属性

属性说明:
  • text() - 消息的文本内容
  • name() - 用户名称(可选,用于区分不同用户)
  • attributes() - 额外属性,不发送给模型,但存储在 ChatMemory 中

多模态 UserMessage

UserMessage 可以包含多种内容类型:

实际应用示例

AiMessage 详解

基本用法

AiMessage 代表 LLM 生成的响应消息。

AiMessage 的属性

多轮对话中的 AiMessage

AiMessage 与工具调用

SystemMessage 详解

基本用法

SystemMessage 用于设置 LLM 的行为规则、角色和风格。

SystemMessage 的最佳实践

1. 角色定义

2. 行为约束

3. 风格指导

4. 输出格式

SystemMessage 安全注意事项

重要: 不要让用户能够修改或注入 SystemMessage

SystemMessage 实际应用

ToolExecutionResultMessage 详解

基本用法

ToolExecutionResultMessage 用于将工具执行的结果返回给 LLM。

完整的工具调用流程

消息组合使用

单消息场景

多消息对话

消息顺序很重要

消息清理和优化

多模态消息处理

内容类型

LangChain4j 支持多种内容类型:

多模态 UserMessage

内容详情级别

完整示例:智能对话管理

测试代码示例

实践练习

练习 1:创建角色系统

创建一个包含多个角色的对话系统:

练习 2:消息历史优化器

实现一个智能的消息历史优化器:

练习 3:消息序列化器

创建一个可以将对话历史序列化/反序列化的工具:

总结

本章要点

  1. ChatMessage 类型
    • UserMessage - 用户消息,支持多模态
    • AiMessage - AI 响应,包含工具请求
    • SystemMessage - 系统消息,设置行为规则
    • ToolExecutionResultMessage - 工具执行结果
  2. UserMessage 特性
    • 基本文本和多模态内容
    • 可选的用户名称
    • 支持文本、图像、音频、视频、PDF
  3. AiMessage 特性
    • 包含文本、思考内容、工具请求
    • 可以检查工具执行请求
    • 在多轮对话中保存上下文
  4. SystemMessage 最佳实践
    • 定义角色和行为
    • 设置输出格式和约束
    • 重要:不允许用户修改系统消息
  5. 消息组合
    • 消息顺序很重要
    • 系统消息应该在开始
    • 需要管理对话历史长度
  6. 多模态消息
    • 支持多种内容类型
    • 可设置图像详情级别
    • 适用于视觉、音频等场景

下一步

在下一章节中,我们将学习:
  • ChatMemory 对话记忆管理
  • 如何在多轮对话中保持上下文
  • 不同类型的 ChatMemory 实现
  • 持久化对话历史

常见问题

Q1:SystemMessage 和 UserMessage 有什么区别? A:
  • SystemMessage - 设置 LLM 的整体行为、角色和规则
  • UserMessage - 具体的用户问题或请求
  • LLM 对 SystemMessage 的关注度通常高于 UserMessage
Q2:为什么多轮对话中 AI 不记得之前的内容? A:需要维护对话历史并在每次请求时发送。下一章将介绍 ChatMemory 来自动管理这个过程。 Q3:消息历史太长怎么办? A:可以:
  • 限制消息数量(如保留最近 10 条)
  • 根据 Token 数量截断
  • 总结早期对话
  • 使用滑动窗口策略
Q4:如何实现多模态? A:使用 UserMessage.from() 方法传入多个 Content 对象,包括 TextContentImageContentAudioContent 等。 Q5:ToolExecutionResultMessage 是什么时候创建的? A:在 LLM 请求调用工具后,我们手动或自动执行工具,然后创建 ToolExecutionResultMessage 将结果返回给 LLM。

参考资料


版权归属于 LangChat Team
官网:https://langchat.cn