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


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

* UserMessage 用户消息

由用户输入的消息


| 属性 | 描述 |
| -------- | -------- | 
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `content:String`                    | 内容     |
| `medias:List<AiMedia>`         | 图片集合（可以是 url 或 base64）     |


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

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

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



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

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

| 属性 | 描述 |
| -------- | -------- | 
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `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();
```


* AssistantMessage 助理消息

由大语言模型生成的消息

| 属性 | 描述 |
| -------- | -------- | 
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `content:String`                    | 内容（当内容为空时，表示为思考状态）     |
| `toolCalls:List<ToolCall>`       | 工具调用     | 




* ToolMessage 工具消息

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


| 属性 | 描述 |
| -------- | -------- | 
| `metadata:Map`                    | 元数据（用于扩展输出）     |
| `content:String`                    | 内容     |
| `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.ofSystem("你是一个天气预报助手，只回答天气相关问题。"),
    ChatMessage.ofUser("今天北京天气如何？"),
    ChatMessage.ofAssistant("北京今天晴，气温20-25℃。"),
    ChatMessage.ofUser("需要带伞吗？")
);

chatModel.prompt(prompt); 
         .call();
```