短记忆
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' } } );