Java 端怎么弄大模型的长期记忆

20 天前
 edg
目前第一次做大模型的长期记忆这方面,不知道有没有有经验的大哥指导一下。
目前的难点是不知道用哪种库去存以及怎么去做更新。
当前想法:
用 es 做大模型长期记忆存储,现在的 es 结构大致为 category ,key ,value 。其中 category 是大分类,比如用户偏好,需求,个人信息,key 是一个 category 的具体方面,如个人信息中 key 可以是身高,体重,血糖等具体方面,value 就是对应的值。
目前的大致流程:用户问题进来-->通过某种技术来判断是否是长期记忆并且解析出对应的 category ,key ,value(这种技术在我的认知里 java 应该实现不了,这个先不深究,就当能够实现)---->我拿到这些信息对用户记忆做添加或者修改--->再把记忆拼接到 prompt 里面。
因为我第一次弄这方面也不知道可不可行,在网上看了很多也没有一个明确的方向,所以想请教下各位大哥,不知道有没有业界更先进的做法。
2808 次点击
所在节点    程序员
23 条回复
frandy
20 天前
了解下 langchain4j 或者 spring ai ,不需要自己从头写,2023 年的时候自己写过,原理是将 AI 和人的对话存储到数据库,按照时间排序,然后每次新的对话,就把之前的对话一起拼起来扔给模型,是的,没错,就是这么做的,你去看一些成熟的框架,也是这么做的,好的是,可以根据对话轮次或者文字长度,进行截取。为什么这么做?因为受限于大模型的 token 最大值不是无限的
MIUIOS
20 天前
楼上说的基本没错,找下现成框架没必要自己手撸,人家带全套的生态工具,直接套用就行了,都是调 api 只是看谁调的花。
aisk
20 天前
拿过去的用户输入,或者做了简单关键词命中的输入,给大模型解析一下让它提取关键信息成你想要的格式,写到 es 里?
Solix
20 天前
找个开源记忆项目,vibe coding 重构成 java 结束
maolon
20 天前
长期记忆一般分为几种做法
1. 个人 profile ,这种提取信息结构化存 json ,一个用户有且只有一个,读的时候固定读取,用 rdb 就行了
2. 知识库/摘要信息,这种就是你现在用 es 在做的事,但是更常见的做法是存 vector db(然后走 rag 那一套),或者走 graph db 那一套(知识提取为三元组,具体看是哪种类型的知识),这两种市面上都有很多开源库的实现
3. 行为记忆/日程,也就是最近有什么 events/日程之类的,一般用于 recall 用户最近行为(而且需要准确 recall ),很多人会把这个功能合并到知识库里(但是这种一般是 time sensitive ,所以直接合并知识库其实不是特别好管理)

然后在此之上,就是记忆的读取/业务层,比如语义检索,关键字检索,retreive ,trim, summary function 之类的东西,这个看你们业务怎么做了,都是自由发挥

记忆读取出来都是拼接回当前的 context 内(你可以简单理解为 prompt ,但是我更愿意叫他 context ),然后调用模型 api
soap0X
20 天前
大模型是无状态无记忆的。最好向量库,不要用传统的库(最近看搜索知道了向量库回想了下之前的知识库,但这里我没实践过)
edg
20 天前
@frandy 也考虑过用框架,但是我们有自己训练的模型所以很早之前手搓了一个,如果引入框架感觉动的刀子太大
edg
20 天前
@aisk 对,目前我的想法就是这样
edg
20 天前
@maolon 好的,谢谢哥,这个我再看下
ethanpeng
20 天前
@soap0X 长期记忆不需要检索吧,为啥要用向量库?
dode
20 天前
那不就是信息和用户绑定,每次会话时都带着呗
dandankele
20 天前
你的问题核心应该是知识检索吧,用户提问,但你不知道去拿哪些数据来喂给大模型?
看你的描述像是围绕个人画像数据方面做的检索,身高、体重、血糖,如果个人的数据量不大、字段不多的话,考虑整体扔给大模型。。。
如果个人数据量比较大,那么就要考虑你的问题了,如何抽取出所需的信息给大模型。。

我目前有两种想法:
1. 将个人画像数据做简单处理,将大量维度数据按小维度扔进向量库,然后根据用户提问做相似性检索取出扔给大模型。
2. 调整应用编排,多次调用大模型,每次调用针对不同关注点做处理。例如首次调用主要是引入意图识别,让大模型根据用户问题帮你识别出可能需要什么 category 下的哪个 key 的个人信息,然后你再去 es 检索。这种缺陷可能会增加响应时间。
72
20 天前
可以提供工具和增加提示词让大模型自己决策什么时候需要“回忆”,什么时候需要“更新偏好”,应该会灵活点
sincw
20 天前
我觉得 Qoder 那个记忆弄得挺好的
realJamespond
20 天前
memo0,graphiti 。system prompt 加上每次对话先查一下向量库?
whoami9426
20 天前
你得反着来,像 claude code 一样,需要什么代码提供 tools 让 llm 自己用 function calling 查询搜索,而不是用 rag 去给他堆上下文
Scarb
20 天前
记忆这块之前研究过。
有很多开源的长期记忆,star 最多的 mem0 ,其他还有 memobase 、memu 、memori 等等。
还可以用云服务 AWS AgentCore Memory 。
没特殊需求直接用 mem0 即可。
原理都差不多,有些会在记忆分类上做优化( User Profile 、Events 、Activity 等等),有些会优化 context 来减少消耗的 token 数量

* 插入
1. 大模型抽取对话中的关键内容
2. 从向量数据库查询已有记忆中相关的记忆
3. 用大模型判断要进行的记忆操作(增删改或者无动作)
4. 执行记忆操作到向量数据库
* 查询
* 直接向量查询,按相似度取前 N 个结果
* 使用
* 每次对话都调用插入,prompt 发到大模型之前查询记忆,把查出来的记忆拼到 prompt 里面
spritecn
20 天前
用 langchain4j, springAi 的接口设计比较复杂
spritecn
20 天前
不用 langchain4j 的话,抄一下他的实现也可以,就很简洁
snow0
20 天前
我看到 copilot 有个指令,“请记住: 要记住的内容”,开放持久记忆功能给用户端

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1175032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX