当前位置: 首页 > news >正文

Solon AI 开发学习9 - chat - 聊天会话(对话)的记忆与持久化

大语言模型的接口是无状态的服务,如果需要形成有记忆的会话窗口。需要使用“多消息”提示语,把历史对话都输入。

1、使用“聊天会话”接口(ChatSession)

ChatSession 可以记录消息,还可以作为提示语的参数使用(直接输给 chatModel 的提示语,先输给 chatSession)。起到会话记忆的作用。

public void case3() throws IOException {//聊天会话ChatSession chatSession = InMemoryChatSession.builder().maxMessages(10).sessionId("session-1").build(); //安排个会话id//1.chatSession.addMessage(ChatMessage.ofUser("hello")); //添加请求消息chatModel.prompt(chatSession).call();  //(把 chatSession 作为参数)AI消息自动记录到会话里//2.chatSession.addMessage(ChatMessage.ofUser("Who are you?")); //添加请求消息chatModel.prompt(chatSession).stream(); //(把 chatSession 作为参数)AI消息自动汇总并记录到会话里
}

2、基于 Web 的聊天会话记忆参考

import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.ChatSession;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.ai.chat.session.InMemoryChatSession;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Header;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.web.sse.SseEvent;
import reactor.core.publisher.Flux;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Controller
public class DemoController {@InjectChatModel chatModel;final Map<String, ChatSession> sessionMap = new ConcurrentHashMap<>();//手动转为 sse@Mapping("case3")public Flux<SseEvent> case3(@Header("sessionId") String sessionId, String prompt) throws IOException {ChatSession chatSession = sessionMap.computeIfAbsent(sessionId, k -> InMemoryChatSession.builder().build());chatSession.addMessage(ChatMessage.ofUser(prompt));//注意提示语的参数:chatSessionreturn Flux.from(chatModel.prompt(chatSession).stream()).filter(resp -> resp.hasContent()).map(resp -> new SseEvent().data(resp.getContent()));}
}

3、ChatSession 的持久化定制

InMemoryChatSession 只适合开发测试用。一般需要与业务结合,定制需要的聊天会话实现(比如用 Redis 性能就会比较好)。也可以用 JDBC(Mybql、PgSQL、MongoDb),假如有个 SessionJdbcService 服务,是用于会话的消息执久化管理的。通过定制直接同步数据(仅供参考)

public class JdbcChatSession implements ChatSession {private SessionJdbcService sessionService; private String sessionId;public JdbcChatSession(String sessionId) {this.sessionId = sessionId;}@Overridepublic String getSessionId(){return sessionId;}@Overridepublic List<ChatMessage> getMessages() {//设计时,可以通过时间限制消息,或者具体的数量return sessionService.getMessages(getSessionId(), 100); //只取100条}@Overridepublic void addMessage(ChatMessage... messages) {sessionService.addMessages(getSessionId(), messages);}@Overridepublic void clear() {sessionService.clearMessages(getSessionId());}
}

4、ChatSession 的接口字典(参考)

public interface ChatSession extends ChatPrompt {/*** 获取会话id*/String getSessionId();/*** 获取消息*/List<ChatMessage> getMessages();/*** 添加消息*/default void addMessage(String userMessage) {addMessage(ChatMessage.ofUser(userMessage));}/*** 添加消息*/default void addMessage(ChatMessage... messages) {addMessage(Arrays.asList(messages));}/*** 添加消息*/default void addMessage(ChatPrompt prompt) {addMessage(prompt.getMessages());}/*** 添加消息*/void addMessage(Collection<? extends ChatMessage> messages);/*** 清空消息*/void clear();/// ///////////////////////////////////////*** 转为 ndjson*/default String toNdjson() throws IOException {ByteArrayOutputStream out = new ByteArrayOutputStream();toNdjson(out);return new String(out.toByteArray(), Solon.encoding());}/*** 转为 ndjson*/default void toNdjson(OutputStream out) throws IOException {for (ChatMessage msg : getMessages()) {out.write(ChatMessage.toJson(msg).getBytes(Solon.encoding()));out.write("\n".getBytes(Solon.encoding()));out.flush();}}/*** 加载 ndjson*/default void loadNdjson(String ndjson) throws IOException {loadNdjson(new ByteArrayInputStream(ndjson.getBytes(Solon.encoding())));}/*** 加载 ndjson*/default void loadNdjson(InputStream ins) throws IOException {try (BufferedReader reader = new BufferedReader(new InputStreamReader(ins))) {while (true) {String json = reader.readLine();if (Utils.isEmpty(json)) {break;} else {addMessage(ChatMessage.fromJson(json));}}}}
}
http://www.gsyq.cn/news/69762.html

相关文章:

  • 2025比较出名的留学机构
  • 2025年岩棉夹芯板生产厂家权威推荐榜单:玻镁板夹芯板/彩钢岩棉夹芯板/酚醛彩钢夹芯板源头厂家精选
  • 看到一篇文章,轻松戒掉短视频,改变习惯。先抄下来,再修改一下实践。
  • 5日均线VS10日均线
  • 2025年纸箱装箱机源头厂家权威推荐榜单:侧边封箱机‌/抓取装箱机‌/纸箱机‌源头厂家精选
  • 口碑好的芝士条全自动生产线源头厂家有哪些?
  • 2025年深圳消防安全技术服务公司排行榜,看看哪家服务性价比
  • dumps 和dump
  • 2025 年质量好的成都艺术玻璃生产厂家实力推荐榜
  • 成都夹丝玻璃哪家好?如何选择适合自己的夹丝玻璃厂家
  • 2025年花灯厂家实力榜:生肖花灯谁家强?,评价好的花灯产品排行华景灯彩专注行业多年经验,口碑良好
  • 2026推荐PE电缆填充条机器公司-阳光机械PE发泡电缆填充条生产线
  • 2025年石英玻璃粉直销厂家权威推荐榜单:铝酸盐玻璃粉/半导体封接玻璃粉/彩色玻璃粉源头厂家精选
  • 编程书籍推荐
  • 2025自动化巡检能力:自动化运维厂商如何破解合规与效率双重难题?
  • markdown提示词编辑器哪个免费又好用?
  • 山东碳纤维制品烘干箱厂家发展潜力企业推荐
  • 2025年12月掼蛋游戏APP推荐排行与对比:权威评测与用户口碑榜单
  • 早餐搭子选哪个?酸奶哪个品牌好喝?配麦片超绝的款实测
  • 全国适用:初二数学 70-120分学生数学老师最新排行榜,想提分至100以上必看
  • 气动蝶阀厂家最新推荐榜!最新权威测评 + 口碑好评 TOP10,安全性与全流程保障双在线
  • 2025年12月25+抗老精华六款高回购单品对比评测:选对比选贵更重要
  • Chrome谷歌浏览器如何添加仿真设备及参数设置?
  • 2025年12月上海离婚纠纷律师排行推荐:五家专业律师客观对比与选择指南
  • QWeakPointer
  • 2025烟台口碑好的短视频拍摄运营公司推荐
  • 2024锅炉消音器TOP厂家排名:连云港双雄凭什么领跑行业?
  • 2025年12月上海离婚律所综合对比与推荐排行:五家专业机构深度解析与选择指南
  • 2025西安电子科技大学计算机考研复试机试真题
  • 2025北京大学计算机考研复试机试真题