Java后端
·2025-10-30AI零代码生成平台,针对vue工程化项目,存在有时提出修改需求,大模型不调用工具,直接返回结果,文件也没有修改。这是一个非常严重的bug,如果项目要上线,是必须要修复的。
# 方案设计
vue工程项目,修改原有应用时,AI有时不调用工具直接返回的原因,是因为目前chat_history表中存储的对话记忆,是精简过的,和memory中存储的不一致。
每次从aiCodeGeneratorFactory获取AiCodeGeneratorService,都是要先从caffine本地缓存的Cache中获取的。既然是缓存,就有过期和重建的问题,既然是本地缓存,那么重启后就会失效。
本地缓存缓存中没有,就会走重建的逻辑aiCodeGeneratorService。
重建的第一步,是构建langchain4j的MessageWindowChatMemory,将对话记忆存入redis中。但是在存入redis之前,会将MessageWindowChatMemory中的历史数据给清理掉,然后从数据库chat_history表中读取历史记录(这一步是重点,问题就出在这。保存在数据库中的vue项目对话记录,是经过精简美化阉割后的,保存的内容,让ai判断出不需要使用工具。)
在存入redis之前,为什么会将MessageWindowChatMemory中的历史数据给清理掉?观察RedisChatMemoryStore,它是作为属性被注入到AiCodeGeneratorFactory中的。因为是属性,所以被共享。
解决这个问题的方式有很多种:**(思路仅供参考,非教学,内容请自行甄别,有不合理之处欢迎指出)**
1、如果不将MessageWindowChatMemory中的历史数据给清理掉,可以解决这个问题,尝试在aiCodeGeneratorService方法中自己创建RedisChatMemoryStore实例,而不将RedisChatMemoryStore通过属性的方式注入。**然后设置永不过期**,不从数据库中加载历史对话到RedisChatMemoryStore中。
```java
RedisChatMemoryStore chatMemoryStore = RedisChatMemoryStore.builder().host("localhost").port(6379).prefix(String.valueOf(appId) + ":").build();
// chatHistoryService.ChatHisD2Memory(appId, messageWindowChatMemory, 20);
```
2、但是在第一种方案中,设置RedisChatMemoryStore缓存永不过期,可能不太好,因为缓存是一种比较贵的资源。那么可以尝试使用其他的ChatMemoryStore,比如自己实现一个持久化到数据库中的。
3、还有一种方案,就是针对vue工程项目,创建一张原始对话记忆日志表,保存对话记忆的时候,将原始的带有工具调用信息的没有任何美化精简的对话记忆另外保存一份到该表中,重建缓存时从该表中读取,这一条在编程导航里好像看到过有代码实现。
由此可见vue工程化项目还是比较麻烦的,很多地方都需要特殊处理。
3
3
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
