Evolver的Selector是怎么工作的:信号匹配与Gene选择的深度解析
【免费下载链接】evolverThe GEP-powered self-evolving engine for AI agents. Auditable evolution with Genes, Capsules, and Events. | evomap.ai项目地址: https://gitcode.com/GitHub_Trending/evolv/evolver
Evolver 是一个由 GEP 协议驱动的 AI 智能体自我进化引擎,它的 Selector(选择器)负责最关键的一步:把检测到的信号(Signals)与基因(Gene)库进行匹配,选出最合适的一条 Gene 来驱动本轮进化。本文面向新手,带你完整看懂 Evolver Selector 的信号匹配流程、Gene 选择打分机制和可审计的决策输出,无需阅读源码也能建立清晰的心智模型。
进化闭环中的 Selector:一个"调度员"
先建立一个整体图景。Evolver 的每次进化都沿一条流水线运行,大致分为五个阶段:
collect(收集日志) → signals(提取信号) → select(选择 Gene)→ enrich(组装上下文)→ dispatch(输出 GEP 提示词)Selector 就站在流水线的中间位置,它不自己"发明"策略,而是像调度员一样:拿着当前问题(信号),去基因池里找最对症的那条 Gene。
对应的源码模块:
- 信号提取:src/gep/signals.js
- 选择器本体:src/gep/selector.js
- 流水线中的选择环节:src/evolve/pipeline/select.js
- 种子基因池:assets/gep/genes.seed.json
第一步:信号从哪来
Selector 的输入是一组"信号",由extractSignals从日志、会话和运行历史中抽取。典型信号分两类:
| 信号类型 | 例子 | 含义 |
|---|---|---|
| 故障类 | error、log_error、test_failure | 系统出了问题,需要修复 |
| 机会类 | user_feature_request、perf_bottleneck、capability_gap、stable_success_plateau | 一切稳定,适合做创新 |
一个设计亮点是:信号模式是多语言正则。种子基因里的匹配词写成error|错误|异常|エラー|오류这样的形式,也就是说中文、日文、韩文的错误描述同样能命中同一条修复类 Gene。这让 Evolver 对使用不同语言记录日志的智能体都能"听懂"。
第二步:信号匹配的三层漏斗
拿到信号后,Selector 对每条 Gene 计算匹配分数,匹配分三层递进:
1️⃣ 直接关键词匹配
每条 Gene 都声明了自己的signals_match列表。比如修复类 Gene 声明了error、failed、unstable等关键词,信号里每命中一个词就加分。
2️⃣ 结构化信号匹配
信号可以是baseName:snippet的格式,例如user_feature_request:给设置页加一个暗色开关。Selector 会只用 baseName 部分(冒号前)去匹配 Gene,冒号后的具体描述不影响命中——这保证了"信号类型决定走哪条 Gene",而不是被描述细节带偏。
3️⃣ 语义相似度匹配
当字面匹配不够精确时,Selector 会做语义兜底:把信号文本和 Gene 的描述分别分词(tokenize,过滤 this、but、also 等无信息量词),计算两组词的余弦相似度,再乘以一个权重(默认 0.4)计入总分。也就是说,"perf_bottleneck" 这类学习标签即使没有写进某条性能优化 Gene 的signals_match,也能靠语义被关联上。
第三步:打分修正——记忆与经验如何影响选择
原始匹配分不是最终分。Selector 会用多类"修正项"调整每条 Gene 的得分:
- 学习历史加分:
learning_history中 outcome 为success的 Gene 得分上调,失败则下调; - 反模式降权:如果某条 Gene 反复踩中同一个 anti_pattern(硬失败),会被明显降权,避免"同一块石头绊倒两次";
- 表观遗传抑制:被标记抑制的 Gene(
isEpigeneticallySuppressed)直接排除在候选之外; - 记忆建议(memoryAdvice):记忆图会给出偏好 Gene(preferred,得分乘以一个小于 1 的系数——只能锦上添花,不能翻盘)、强制 Gene(forced,无视分数直接选中,但会被封禁名单拦截)、以及封禁 Gene 名单(banned,连强制选择都救不回来)。
这套机制的设计意图是:经验可以倾斜选择,但信号匹配仍然是主导——一个高分 Gene 不会因为记忆偏好而输掉给明显更匹配的另一条 Gene。
第四步:Gene 选定后,Capsule 如何搭配
选出 Gene 后,Selector 还会从胶囊池(Capsules)里挑出触发器(trigger)与当前信号匹配的胶囊,作为"历史成功案例"注入上下文。Capsule 本质是"某次成功进化的打包记录",让本轮进化能参考过去真实跑通过的方案,而不是空谈策略。
此外还有一个driftIntensity(漂移强度)参数:在基因池较大或连续多轮成功时,Selector 允许一定概率地随机挑选 Gene,充当进化算法里的"变异",防止系统在局部最优上打转。
可审计的决策输出:为什么这件事重要
Selector 的输出不是一个简单的 Gene ID,而是一个完整的决策结构(由buildSelectorDecision生成):
| 字段 | 作用 |
|---|---|
selected | 最终选中的 Gene ID |
reason | 人类可读的选中文本(例如"forced_gene_selected: xxx") |
selectionPath | 选择路径:forced_gene、memory、semantic或默认匹配 |
alternatives | 落选候选及其分数,方便复盘 |
memoryUsed/memoryEvidence | 本次决策是否用了记忆、用了多少证据 |
这份决策会随EvolutionEvent一起写入审计日志。每一步"为什么选这条 Gene"都可以事后追溯——这正是 Evolver 区别于"随机改提示词"的核心价值。
一个完整例子
假设日志里出现了error和test_failure两个信号:
- 信号提取阶段产出
['error', 'test_failure']; - 修复类种子 Gene
gene_gep_repair_from_errors的signals_match命中多个关键词,得分最高; - 创新类 Gene 因 preconditions 要求"无活跃 error 信号"而不参与;
- Selector 输出
selected: gene_gep_repair_from_errors,selectionPath为默认匹配; - 引擎按该 Gene 的
strategy步骤执行:评估影响面 → 最小可逆补丁 → 验证 → 失败则回滚 → 成功后固化为新事件。
这套"信号 → 匹配 → 打分 → 决策 → 审计"的完整链路,你可以在 test/selector.test.js 中看到大量针对边界情况的断言:强制 Gene 会被封禁拦截、语义匹配能关联性能类 Gene、反复失败的 Gene 会被降权……这些测试就是选择器行为的"活文档"。
延伸阅读:关键文件路径
想继续深入时,建议按这个顺序读源码和资料:
- 选择器核心:src/gep/selector.js
- 信号提取与分类:src/gep/signals.js
- Gene 结构定义:src/gep/schemas/gene.js
- 种子基因池(repair / optimize / innovate 三大类):assets/gep/genes.seed.json
- 选择环节在流水线中的位置:src/evolve/pipeline/select.js
- 选择器行为测试:test/selector.test.js
小结
Evolver 的 Selector 用三层匹配漏斗 + 多层经验修正 + 可审计决策输出,把"这轮进化该干什么"从玄学变成了可解释的工程问题:信号决定候选,经验微调得分,记忆可以倾斜但无法翻盘,而每一次选择都留下完整理由。理解了这个模块,你就掌握了 Evolver 自我进化引擎的"大脑中轴"。
【免费下载链接】evolverThe GEP-powered self-evolving engine for AI agents. Auditable evolution with Genes, Capsules, and Events. | evomap.ai项目地址: https://gitcode.com/GitHub_Trending/evolv/evolver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考