ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ai agent 多会话切换 长短记忆 human in loop 实战总结

ai agent 多会话切换 长短记忆 human in loop 实战总结
短记忆

checkpointer + mongoStore +thread_id

传入configure agent.invoke 的 thread_id 要一致 会每次将相同 thread_id的 自动放进prompt

并且需要保证 几个前置条件:

a) agent图要保证一致 即配置需要完全一致,

b) thread_id 需要相同 当用户在多对话切换的时候 一定要保障一个对话对应的固定的一个

c) thread_id 并且在ttl 有效时间范围内

长记忆

长期记忆 mongoStore存储库

addDocuments 文档存入库 使用thread_id声明 标签或者过滤条件

similaritySearch preFilter thread_id

将similaritySearch 的结果添加到invoke messages里面 agent会根据传入的对话内容 从而实现长期记忆搜索

human in loop

human in loop 的核心思想也是通过相同的thread_id 执行agent.invoke command 继续执行agent 需要和之前手动暂停 interreup 的 agent.invoke 配置要完全一致 才能正确的找到并执行对应的工具类

业务逻辑 当从agent返回的最新的message里 如果存在 interreup则 判断需要执行中断逻辑 则通过sse通知到前端 前端接受通知后渲染需要进行判断的ui 当前端手动触发 确定 或者拒绝 ,触发后端接口 接口里继续执行 agent.invoke command thread_id要和中断前保持一致 其余配置或者参数也需要和之前中断的agent一致 ,agent会自动识别执行到对应的tool

声明适用human in loop通过 humanInTheLoopMiddleware interruptOn 声明需要手动干预的工具类 并且需要手动判断的操作 allowedDecisions 对应 执行中断的命令 command decision

createAgent({ model: llm, tools, checkpointer: checkpointer, // 用于保存上下文 配合invoke thread_id一起使用 middleware: [ // 增加human-in-loop中间件 humanInTheLoopMiddleware({ interruptOn: { // 设置需要human in loop干预的工具类 和允许操作 addTask: { allowedDecisions: ['approve', 'reject', 'edit'], description: '操作任务需要管理员权限确认' } } }) ], })

resume descisions选项 为具体执行的操作 对应 allowedDecisions 设置的命令 注意:thread_id一定要和之前createAgent.invoke的时候对应上 并且设置必须要和 createAgent的时候完全统一才能找到之前的中断内容并继续执行 通过thread_id获取到之前的聊天内容并添加到 prompt内

const result = await agent.invoke( new Command({ resume: { decisions: [{ type: stateMaps[state] }] } // 编辑参数后执行 // resume: { // descision: [{ type: ['edit'], args: {} }] // } }), { configurable: { thread_id: `${userId}_${chatId}`, chatId: chatId, userId: userId, executionMode: 'parallel' } } );
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进