V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
edg
V2EX  ›  程序员

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

  •  2
     
  •   edg · 2025 年 11 月 25 日 · 3204 次点击
    这是一个创建于 52 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前第一次做大模型的长期记忆这方面,不知道有没有有经验的大哥指导一下。
    目前的难点是不知道用哪种库去存以及怎么去做更新。
    当前想法:
    用 es 做大模型长期记忆存储,现在的 es 结构大致为 category ,key ,value 。其中 category 是大分类,比如用户偏好,需求,个人信息,key 是一个 category 的具体方面,如个人信息中 key 可以是身高,体重,血糖等具体方面,value 就是对应的值。
    目前的大致流程:用户问题进来-->通过某种技术来判断是否是长期记忆并且解析出对应的 category ,key ,value(这种技术在我的认知里 java 应该实现不了,这个先不深究,就当能够实现)---->我拿到这些信息对用户记忆做添加或者修改--->再把记忆拼接到 prompt 里面。
    因为我第一次弄这方面也不知道可不可行,在网上看了很多也没有一个明确的方向,所以想请教下各位大哥,不知道有没有业界更先进的做法。
    23 条回复    2025-11-27 13:38:41 +08:00
    frandy
        1
    frandy  
       2025 年 11 月 25 日
    了解下 langchain4j 或者 spring ai ,不需要自己从头写,2023 年的时候自己写过,原理是将 AI 和人的对话存储到数据库,按照时间排序,然后每次新的对话,就把之前的对话一起拼起来扔给模型,是的,没错,就是这么做的,你去看一些成熟的框架,也是这么做的,好的是,可以根据对话轮次或者文字长度,进行截取。为什么这么做?因为受限于大模型的 token 最大值不是无限的
    MIUIOS
        2
    MIUIOS  
       2025 年 11 月 25 日
    楼上说的基本没错,找下现成框架没必要自己手撸,人家带全套的生态工具,直接套用就行了,都是调 api 只是看谁调的花。
    aisk
        3
    aisk  
       2025 年 11 月 25 日
    拿过去的用户输入,或者做了简单关键词命中的输入,给大模型解析一下让它提取关键信息成你想要的格式,写到 es 里?
    Solix
        4
    Solix  
       2025 年 11 月 25 日 via iPhone
    找个开源记忆项目,vibe coding 重构成 java 结束
    maolon
        5
    maolon  
       2025 年 11 月 25 日   ❤️ 4
    长期记忆一般分为几种做法
    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
        6
    soap0X  
       2025 年 11 月 25 日 via Android
    大模型是无状态无记忆的。最好向量库,不要用传统的库(最近看搜索知道了向量库回想了下之前的知识库,但这里我没实践过)
    edg
        7
    edg  
    OP
       2025 年 11 月 25 日
    @frandy 也考虑过用框架,但是我们有自己训练的模型所以很早之前手搓了一个,如果引入框架感觉动的刀子太大
    edg
        8
    edg  
    OP
       2025 年 11 月 25 日
    @aisk 对,目前我的想法就是这样
    edg
        9
    edg  
    OP
       2025 年 11 月 25 日
    @maolon 好的,谢谢哥,这个我再看下
    ethanpeng
        10
    ethanpeng  
       2025 年 11 月 26 日
    @soap0X 长期记忆不需要检索吧,为啥要用向量库?
    dode
        11
    dode  
       2025 年 11 月 26 日
    那不就是信息和用户绑定,每次会话时都带着呗
    dandankele
        12
    dandankele  
       2025 年 11 月 26 日
    你的问题核心应该是知识检索吧,用户提问,但你不知道去拿哪些数据来喂给大模型?
    看你的描述像是围绕个人画像数据方面做的检索,身高、体重、血糖,如果个人的数据量不大、字段不多的话,考虑整体扔给大模型。。。
    如果个人数据量比较大,那么就要考虑你的问题了,如何抽取出所需的信息给大模型。。

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

    * 插入
    1. 大模型抽取对话中的关键内容
    2. 从向量数据库查询已有记忆中相关的记忆
    3. 用大模型判断要进行的记忆操作(增删改或者无动作)
    4. 执行记忆操作到向量数据库
    * 查询
    * 直接向量查询,按相似度取前 N 个结果
    * 使用
    * 每次对话都调用插入,prompt 发到大模型之前查询记忆,把查出来的记忆拼到 prompt 里面
    spritecn
        18
    spritecn  
       2025 年 11 月 26 日
    用 langchain4j, springAi 的接口设计比较复杂
    spritecn
        19
    spritecn  
       2025 年 11 月 26 日
    不用 langchain4j 的话,抄一下他的实现也可以,就很简洁
    snow0
        20
    snow0  
       2025 年 11 月 26 日
    我看到 copilot 有个指令,“请记住: 要记住的内容”,开放持久记忆功能给用户端
    lvxiaomao
        21
    lvxiaomao  
       2025 年 11 月 26 日
    langchain4j 不是有 MemoryStore 嘛 可以实现一个
    soap0X
        22
    soap0X  
       2025 年 11 月 26 日 via Android
    @ethanpeng 我看楼主说 java 搞不定就推荐了解了下向量库(我也不熟)。历史数据大的话肯定得需要提取了,他说的搞不定的不知道是不是格式如果是的话是否可以先让大模型帮提取出来个格式,说的记忆不知道是不是识别用户把过往信息写到提示词里面
    kid1412621
        23
    kid1412621  
       2025 年 11 月 27 日
    @maolon 请问 recall 和 retrieval 是什么区别
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
    ♥ Do have faith in what you're doing.