Skip to content

Spring AI 中 UserMessage 和 SystemMessage 概述

在 Spring AI 中,UserMessageSystemMessage 是用于构建与 AI 模型交互的聊天消息的两种核心类型,它们都属于 AbstractMessage 的子类,用于在对话中区分不同角色的输入。


SystemMessage(系统消息)

  • 作用:用于设定 AI 助手的行为、角色或上下文。它通常出现在对话开始时,向模型提供全局指令,例如“你是一个专业的 Java 工程师”、“请用简洁的语言回答”或“只回答与科技相关的问题”。

  • 特点

    • 由系统(开发者)定义,不来自用户。
    • 在整个对话中起到“规则”或“背景”的作用,影响后续所有回复。
    • 不同模型对系统消息的支持程度可能略有差异,但主流模型(如 OpenAI、通义千问等)均能识别并遵循。
  • 示例

    java
    SystemMessage systemMessage = new SystemMessage("你是一个乐于助人的助手,请用中文回答。");

UserMessage(用户消息)

  • 作用:代表用户的输入,即用户向 AI 提出的问题、请求或指令。它是对话中动态变化的部分,驱动 AI 生成具体的回复。

  • 特点

    • 直接由用户产生,反映用户的意图。
    • 可包含文本、图像、文件等多模态内容(取决于具体实现和模型支持)。
    • 在多轮对话中,多个 UserMessageAssistantMessage(AI 的回复)交替出现。
  • 示例

    java
    UserMessage userMessage = new UserMessage("请解释一下 Spring AI 中的 UserMessage 和 SystemMessage 的区别。");

在 Spring AI 中的使用方式

在构建聊天请求时,通常会将多个消息组合成一个 List<Message> 传递给 ChatClientChatModel。Spring AI 会根据消息的角色(通过 getMessageType() 方法获取 MessageType.SYSTEMMessageType.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();

关键区别总结

维度SystemMessageUserMessage
来源系统/开发者设定用户输入
目的定义助手的行为、规则、背景提出具体问题或请求
可变性通常相对固定(可在单次请求中调整)每次对话都可能变化
在对话中的位置一般放在开头,但也可以根据需要穿插(部分模型支持)与 AssistantMessage 交替出现

注意事项

  • 某些模型(如 OpenAI 的较新版本)对系统消息的处理方式可能有所变化,但 Spring AI 已经封装了底层细节,开发者只需按语义使用即可。
  • 如果不需要系统消息,可以只传递 UserMessage,模型会按照默认行为回复。
  • 在多轮对话中,应保留历史消息(包括 UserMessageAssistantMessage),以便模型理解上下文。

通过合理使用 SystemMessageUserMessage,开发者可以更精准地控制 AI 的回复风格和内容,实现复杂的对话流程。