改造目标
在原有“单轮对话”基础上,实现“多轮上下文记忆”功能,即每次提问时携带前文对话历史。
改造内容一览
模块 | 原有逻辑 | 改造后逻辑 |
---|---|---|
前端发送逻辑 | 每次仅发送用户当前提问 | 每次发送所有历史对话(包括 AI 回复) |
后端接口接收 | 只接收 String message (一轮内容) | 接收 String messagesJson ,反序列化为对话列表 |
请求构造 | messages=[{role: user, content: xxx}] | messages=[{role: system}, {role: user}, {role: assistant}, ...] |
前端改造(sendMessage 方法)
改造点
将当前所有对话内容打包为 JSON,作为参数发送给后端
修改代码片段
const sendMessage = (message) => {
// 1. 推入用户输入
chats.value.push({
role: 'user',
content: message,
...
});
// 2. 推入占位 assistant 回复
chats.value.push({
role: 'assistant',
content: '',
status: 'loading',
...
});
// 3. 组装上下文消息:user + assistant 组成的 messages 数组
const messagesPayload = chats.value.map(({ role, content }) => ({ role, content }));
// 4. 序列化为 JSON 传给后端
const eventSource = new EventSource(`/api/stream?message=${encodeURIComponent(JSON.stringify(messagesPayload))}`);
eventSource.onmessage = (event) => {
...
};
};
后端改造(getAiResult()
方法)
改造点
接收完整的历史消息 JSON,解析为 List,传给 DeepSeek
修改后完整代码片段:
private void getAiResult(PrintWriter pw, String messagesJson) throws InterruptedException {
// 1. 解析前端传来的 JSON 字符串为 List<Map<String, String>>
List<Map<String, String>> messages = JsonUtils.parseJsonList(messagesJson);
// 2. 构造请求参数,添加预设 system 消息
Map<String, Object> params = new HashMap<>();
params.put("model", "deepseek-chat");
params.put("stream", true);
// 预设角色:经验丰富的小学学习辅导 AI
Map<String, String> systemMessage = new HashMap<>();
systemMessage.put("role", "system");
systemMessage.put("content", "你是一名经验丰富的小学学习辅导AI助手,擅长用浅显易懂的语言解答学生问题。");
messages.add(0, systemMessage); // 插入到最前
params.put("messages", messages);
// 发起 SSE 请求
String jsonParams = JsonUtils.convertObj2Json(params);
...
}
工具类 JsonUtils 补充方法
解析前端传来 JSON 数组的工具方法
public static List<Map<String, String>> parseJsonList(String json) {
try {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(json, new TypeReference<List<Map<String, String>>>() {});
} catch (Exception e) {
throw new RuntimeException("JSON 解析失败", e);
}
}
实现效果
-
AI 每轮对话都基于完整上下文进行理解与生成。
-
支持预设角色影响全局行为风格。
-
可灵活扩展为带历史记录管理的对话系统。