---
title: "chat - 四种消息类型及提示语增强"
---

大模型接收的是“提示语”（或提示词），返回的是“生成内容”。提示语，则有一条或多条不同类型的消息组成（可以有会话历史消息）。


### 1、四种消息类型结构

* UserMessage 用户消息

由用户输入的消息


| 属性 | 描述 |
| -------- | -------- | 
| `createdAt:Long`                   | 生成时间     |
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `role:ChatRole`                      | 角色     |
| `blocks:List<ContentBlock>`    | 多模态内容块（可能是 text, url 或 base64）     |
| `content:String`                      | 内容（blocks 里的第一个文本块内容）     |


```java
ChatMessage.ofUser("你好！");

//需要多模态模型支持
ChatMessage.ofUser("这图里有方块吗？", ImageBlock.ofUrl("http://../demo.jpg"));

ChatMessage.ofUser(ImageBlock.ofUrl("http://../demo.jpg"));
ChatMessage.ofUser("这图里有方块吗？");
```



* SystemMessage 系统消息（现在的模型，一般用不到了）

系统消息，主要是为当前会话设定AI的角色属性。一般作为一个会放的头条消息

| 属性                                      | 描述 |
| ------------------------ | -------- | 
| `createdAt:Long`                     | 生成时间     |
| `metadata:Map`                      | 元数据（用于扩展输出）     |
| `role:ChatRole`                        | 角色     |
| `content:String`                        | 内容     |



```java
ChatMessage.ofSystem("你是个建筑工地的工人，对搬砖很有经验！");
```

应用示例（不推荐）：

```java
Prompt prompt = Prompt.of();
prompt.addMessage(ChatMessage.ofSystem("你是个建筑工地的工人，对搬砖很有经验！"));
prompt.addMessage(ChatMessage.ofUser("100块砖，搬到10楼大概要多久？"));

chatModel.prompt(prompt); //context 可以是描述天气的任何对象
         .call();
```

一般，不直接使用 SystemMessage 而是通过配置，由框架最终自动装配。应用示例：

```java
chatModel.prompt("100块砖，搬到10楼大概要多久？"); 
         .options(o -> {
            o.systemPrompt("你是个建筑工地的工人，对搬砖很有经验！");
         }).call();
```


* AssistantMessage 助理消息

由大语言模型生成的消息

| 属性 | 描述 |
| -------- | -------- | 
| `createdAt:Long`                     | 生成时间     |
| `metadata:Map`                      | 元数据（用于扩展输出）     |
| `role:ChatRole`                        | 角色     |
| `content:String`                        | 内容     |
| `reasoning:String`                     | 思考内容     |
| `reasoningFieldName:String`       | 思考字段名    |
| `toolCalls:List<ToolCall>`           | 工具调用     |
| `toolCallsRaw:List<Map>`           | 工具调用原数据     |
| `searchResultsRaw:List<Map>`    | 搜索结果原数据     |
| `contentRaw:Object`                   | 内容原数据     |
| | |
| `isThinking:boolean`                   | content 是否为纯思考内容（也可能是混合内容）     |




* ToolMessage 工具消息

由框架根据 AssistantMessage 描述的本地工具调用（Tool call）生成的消息。


| 属性 | 描述 |
| -------- | -------- | 
| `createdAt:Long`                     | 生成时间     |
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `role:ChatRole`                        | 角色     |
| `blocks:List<ContentBlock>`    | 多模态内容块（可能是 text, url 或 base64）     |
| `content:String`                    | 内容（blocks 里的第一个文本块内容）     |
| `name:String`                       | 函数名     |
| `toolCallId:String`                  | 工具调用标识     |
| `returnDirect:boot`                | 是否直接返回     |


### 2、用户消息的构建方式

* 基本消息

```java
chatModel.prompt(ChatMessage.ofUser("hello"))
         .call();
```

* 消息增强（格式化上下文）

```java
String message = "今天天气好吗？";
                
chatModel.prompt(ChatMessage.ofUserAugment(message， context)) //context 可以是描述天气的任何对象
         .call();
```

* 消息增强（定制格式模板）


```java
String message = "今天天气好吗？";
                
chatModel.prompt(ChatMessage.ofUserTmpl("#{query} \n\n 请参考以下内容回答：#{context}")
                            .paramAdd("query", message)
                            .paramAdd("context", context)
                            .generate()) 
            .call();
```

### 3、关于用户消息的“消息增强”

将用户输入的消息通过格式化，附加相关的上下文（或参考资料），从而实现“消息增强”。这也是构成 RAG技术（检索增强生成，结合信息检索和语言模型）的纽带。


* 快捷增强（固定模板，让消息有时间和参考上下文）

```java
//ChatMessage.ofUserAugment(String message, Object context);

//示例1:
ChatMessage.ofUserAugment("a+b 等于几？", "假如 a=1, b=2");

//示例2:
let message = "刘德华今年有哪些演唱会？"
let context = ticketRepository.search(message);

ChatMessage.ofUserAugment(message, context);
```

* 模板增强（基于模板定制消息格式）


```java
let message = "刘德华今年有哪些演唱会？"
let context = ticketRepository.search(message);

ChatMessage.ofUserTmpl("#{message} \n\n #参考资料：#{context} \n\n #要求：如果参考资料里没有，返回没有")
           .paramAdd("message", message)
           .paramAdd("context", context)
           .generate();
```


### 4、多角色混合提示增强

可组合 SystemMessage、UserMessage 和 AssistantMessage 实现多轮对话。达到场景效果。

```java
Prompt prompt = Prompt.of(
    ChatMessage.ofUser("今天北京天气如何？"),
    ChatMessage.ofAssistant("北京今天晴，气温20-25℃。"),
    ChatMessage.ofUser("需要带伞吗？")
);

chatModel.prompt(prompt); 
         .options(o -> {
            o.systemPrompt("你是一个天气预报助手，只回答天气相关问题。");
         }).call();
```