-
Notifications
You must be signed in to change notification settings - Fork 64
[功能讨论]Agent协作-共享有用信息机制 #36
Description
现状
用户发起任务 -> 主Agent委派探索子Agent -> 探索子Agent探索项目生成探索报告 -> 主Agent根据探索报告委派规划子Agent -> 规划子Agent又搜索项目,再去计划 -> 主Agent根据规划报告委派通用子Agent -> 通用子Agent又又搜索项目,再去实施...
如果主Agent细分任务发布给多个通用子Agent,从项目中找文件这一耗时耗token步骤又会重复多次
问题
耗时,耗Token显而易见
每个子Agent在各自搜索时,会读取到与自己任务无关的多余的文件内容,以找到有用信息.
解决思路
一个在各Agent之间共享有用信息的机制
让Agent可以在工作时,将找到的有用信息,精确到行,添加到会话级,同会话的所有Agent的上下文都会被注入有用信息内容.
已在我的fork仓库中实现了此方案,可直接试用下
工具
1. useful-info-add
- 功能: 精确添加文件内容到有用信息列表
- 参数:
- filePath (必选): 文件路径
- startLine (可选,默认为1): 起始行号
- endLine (可选,默认为文件末尾): 结束行号
- description (可选): 描述信息
- 特点:
- 支持批量添加
- 自动合并重叠范围
- 跳过不存在的文件
- 使用场景: 编辑文件后添加修改的关键部分
2. useful-info-delete
- 功能: 从有用信息列表中删除项目
- 参数:
- itemId (可选): 项目 ID
- filePath (可选): 文件路径
- startLine (可选): 起始行号
- endLine (可选): 结束行号
- 删除方式:
- 按项目 ID 删除
- 按文件路径删除所有项目
- 按文件路径 + 行号范围精确删除
- 使用场景: 清理过时或无效的信息
3. useful-info-list
- 功能: 列出当前会话的所有有用信息元数据列表(不含内容,仅显示位置信息)
- 使用场景: 调试使用,或展示给用户看,一般不授权给Agent,若有专门管理有用信息的子Agent,可授权给它
机制
根据有用信息索引实时获取文件内容,格式化(加行号)整合后,作为一条特殊user消息,注入到Agent上下文.
同文件交集或相邻行的合并,LRU,限制注入数量等优化
上下文压缩后,有用信息仍在
新的工作流
用户发起任务 -> 主Agent委派探索子Agent -> 探索子Agent探索项目,并记录有用信息 -> 主Agent根据探索报告委派规划子Agent -> 规划子Agent直接已知多条有用信息,稍微看下重要文件,甚至跳过不看,直接规划(如果是生成 计划.md,会将计划.md加入有用信息) -> 主Agent根据规划报告委派通用子Agent -> 通用子Agent已知多条有用信息和任务规划,直接看相关文件,实施任务(实施后,会将编辑过的文件加入有用信息)
忧虑
以下是设计之初就担心的点,但实际使用中还未去做实际验证:
- 会担心Agent即使有有用信息,但仍倾向于调用读文件工具再读一遍
- Agent使用有用信息工具时倾向于只增不减(todo工具也同样),如果确切要清理,需要用户明确要求
- 希望是 有用信息的token占用,甚至是信息有效率,能自动通知Agent,自主决策何时清理.但增加了系统复杂度.
- 实际使用是否对Agent协作有效率和准确性提升,我暂无法测评.
最后
佬可以去我的fork试试这个机制,看有没有用,因为我的fork还有其他更改,部分觉得不符合佬的设计,故没提pr.但这个 共享有用信息 想提出来 大佬们讨论下.
ps
我的fork没提的特性简述,需要可再开讨论
- ROLE.md全量替换内置系统提示词,而非只替换第一行角色定义.(觉得不符和佬设计,没提,就有后续一堆没提的了)
- snow启动直接yolo(本来是想实现用户切换yolo,立刻生效的,但偷懒了).
- 全局和项目ROLE.md,项目级别覆盖全局级别.
- AGENTS.md 追加到 主Agent和所有子Agent的系统提示词后面,全局和项目合并.
- 子代理换用TOML配置,可读性和多行文本可编辑行更好
- 主Agent和子Agent增强出错重试,很难打断工作循环(我聚合多家公益站,api极其不稳定也不断)
- todo工具去掉create,改为每个会话自动创建,且主子Agent只共用这一个todo列表 [todo工具设计讨论]去掉create工具,会话开始自动生成唯一todo. #37
- 子代理回复在ui精简展示(是想做成默认截断显示,快捷键可展开)