diff --git a/SpringAI/0_使用SpringAI接入AI模型.md b/SpringAI/0_使用SpringAI接入AI模型.md index 6ecfc42..cb02d52 100644 --- a/SpringAI/0_使用SpringAI接入AI模型.md +++ b/SpringAI/0_使用SpringAI接入AI模型.md @@ -150,7 +150,7 @@ spring: private final ChatModel chatModel; ``` -2. 非流式问答 +2. 同步返回答案 ```java @GetMapping("chat") @@ -163,11 +163,11 @@ public String chat(@RequestParam String prompt) {// 用户输入的prompt } ``` -3. 流式问答 +3. 流式返回答案 ```java @GetMapping(value = "chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux> chatStream(@RequestParam String prompt) { + public Flux> chat(@RequestParam String prompt) { return ChatClient.create(chatModel) .prompt() .user(prompt) @@ -176,4 +176,27 @@ public String chat(@RequestParam String prompt) {// 用户输入的prompt // ServerSendEvent(SSE)是一个轻量级的服务端向客户端单向推送的流式传输工具 .map(chatResponse -> ServerSentEvent.builder(JSONUtil.toJsonStr(chatResponse)).event("message").build()); } +``` + +### ChatMermory + +ChatMermory是一个记录与用户对话的组件,在聊天的模型中将用户与大模型API前几轮对话消息,发送给大模型的API是一个很常见的需求。它本身是一个接口,比如**InMemoryChatMemory**就是一个在JVM内存中记录的实现。可以按照自己的需求实现不同形式的存储,比如Redis、或数据库持久化存储。 + +### MessageChatMemoryAdvisor + +ChatMermory仅仅是一个存储和获取历史对话消息的接口,而MessageChatMemoryAdvisor则是ChatClient中的一部分,比如这样做: + +```java +// 这里用InMemoryChatMemory做示例 +private static final ChatMemory chatMemory = new InMemoryChatMemory(); +// 从历史记录里取6条对话消息一起发送至模型的API。 +// 历史消息也是算在这一次对话Token消耗的,要关注Token膨胀的问题 +var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, sessionId, 6); +ChatClient.create(chatModel) + .prompt() + .user(prompt) + .advisors(messageChatMemoryAdvisor) + .stream() + .content() + .map(chatResponse -> ServerSentEvent.builder(chatResponse).event("message").build()); ``` \ No newline at end of file