feat(v2): 架构与算法优化二轮——推理机不变量外提、知识库匹配预编译、协作循环增量索引
- inference.py(/chat/legacy 热路径):kb.match 循环不变量外提(原每步全量重扫+重排序, 最坏 O(steps×rules×patterns));fired 查重 list→set - knowledge.py:Rule patterns 注册侧懒缓存小写副本(原每条规则每次匹配重复 lower); match() 文本只 lower 一次(原逐规则重复);load() 的 yaml 文件名集合提到循环外 - worker.py:本地端点生成器 httpx.AsyncClient 懒建复用(原每步新建/销毁连接, 对齐 ArchitectClient 惯用法;协作循环最多 10 次生成免重复建连) - pipeline.py(协作循环):plan_by_id O(1) 步定义查找;done 集合增量维护 (原每轮重建 progress+archive 扫描);领域只解析一次(原 _artifact_name 每步 全领域 kb.match);_deps_done 支持传入预填集合(保持旧签名兼容) - v2stats.py:回合数分布改增量聚合(sum/max/分桶计数),summary() O(n)→O(1), 不再持有无界 list(修长时运行内存增长) - gateway/agent.py + api.py:AgentService 运行计数 O(1) 化(原 register 全量扫描), 状态迁移收敛到 _transition_state 单一入口(api.py cancel/异常两处绕过点一并接入, 消除计数与状态脱节隐患);21 项 agent 测试全绿(两轮全量 230 passed 复核)
This commit is contained in:
@@ -53,20 +53,26 @@ class InferenceEngine:
|
||||
# ---------------------------------------------------------------
|
||||
def run(self, query: str, domain: str, memory: WorkingMemory,
|
||||
max_steps: Optional[int] = None) -> List[str]:
|
||||
"""前向链主循环。返回触发规则 id 列表(按触发顺序)。"""
|
||||
"""前向链主循环。返回触发规则 id 列表(按触发顺序)。
|
||||
|
||||
循环不变量外提:query/domain 在循环内不变,kb.match 结果只算一次
|
||||
(原实现每步全量重扫+重排序,最坏 O(steps × rules × patterns))。
|
||||
"""
|
||||
steps = max_steps or self.max_steps
|
||||
rules = self.kb.match(query, domain=domain)
|
||||
fired: List[str] = []
|
||||
fired_set: set = set() # O(1) 查重(fired 保持列表维护触发顺序)
|
||||
for _ in range(steps):
|
||||
rules = self.kb.match(query, domain=domain)
|
||||
# 选第一个"未触发过"的规则
|
||||
target: Optional[Rule] = None
|
||||
for r in rules:
|
||||
if r.id not in fired:
|
||||
if r.id not in fired_set:
|
||||
target = r
|
||||
break
|
||||
if target is None:
|
||||
break # 无新规则可触发 → 终止
|
||||
fired.append(target.id)
|
||||
fired_set.add(target.id)
|
||||
self._fire(target, query, memory)
|
||||
return fired
|
||||
|
||||
|
||||
Reference in New Issue
Block a user