Spring AI 中 UserMessage 和 SystemMessage 概述
在 Spring AI 中,UserMessage 和 SystemMessage 是用于构建与 AI 模型交互的聊天消息的两种核心类型,它们都属于 AbstractMessage 的子类,用于在对话中区分不同角色的输入。
SystemMessage(系统消息)
作用:用于设定 AI 助手的行为、角色或上下文。它通常出现在对话开始时,向模型提供全局指令,例如“你是一个专业的 Java 工程师”、“请用简洁的语言回答”或“只回答与科技相关的问题”。
特点:
- 由系统(开发者)定义,不来自用户。
- 在整个对话中起到“规则”或“背景”的作用,影响后续所有回复。
- 不同模型对系统消息的支持程度可能略有差异,但主流模型(如 OpenAI、通义千问等)均能识别并遵循。
示例:
javaSystemMessage systemMessage = new SystemMessage("你是一个乐于助人的助手,请用中文回答。");
UserMessage(用户消息)
作用:代表用户的输入,即用户向 AI 提出的问题、请求或指令。它是对话中动态变化的部分,驱动 AI 生成具体的回复。
特点:
- 直接由用户产生,反映用户的意图。
- 可包含文本、图像、文件等多模态内容(取决于具体实现和模型支持)。
- 在多轮对话中,多个
UserMessage与AssistantMessage(AI 的回复)交替出现。
示例:
javaUserMessage userMessage = new UserMessage("请解释一下 Spring AI 中的 UserMessage 和 SystemMessage 的区别。");
在 Spring AI 中的使用方式
在构建聊天请求时,通常会将多个消息组合成一个 List<Message> 传递给 ChatClient 或 ChatModel。Spring AI 会根据消息的角色(通过 getMessageType() 方法获取 MessageType.SYSTEM 或 MessageType.USER)将它们正确地映射到模型 API 所要求的格式。
示例代码(使用 Spring AI 的 ChatClient):
java
ChatClient chatClient = ...; // 注入或创建
List<Message> messages = List.of(
new SystemMessage("你是一个专业的 Spring 技术顾问。"),
new UserMessage("如何在 Spring Boot 中集成 Redis?")
);
String response = chatClient.prompt(new Prompt(messages))
.call()
.content();关键区别总结
| 维度 | SystemMessage | UserMessage |
|---|---|---|
| 来源 | 系统/开发者设定 | 用户输入 |
| 目的 | 定义助手的行为、规则、背景 | 提出具体问题或请求 |
| 可变性 | 通常相对固定(可在单次请求中调整) | 每次对话都可能变化 |
| 在对话中的位置 | 一般放在开头,但也可以根据需要穿插(部分模型支持) | 与 AssistantMessage 交替出现 |
注意事项
- 某些模型(如 OpenAI 的较新版本)对系统消息的处理方式可能有所变化,但 Spring AI 已经封装了底层细节,开发者只需按语义使用即可。
- 如果不需要系统消息,可以只传递
UserMessage,模型会按照默认行为回复。 - 在多轮对话中,应保留历史消息(包括
UserMessage和AssistantMessage),以便模型理解上下文。
通过合理使用 SystemMessage 和 UserMessage,开发者可以更精准地控制 AI 的回复风格和内容,实现复杂的对话流程。
