Skip to content

Router reconstruct - #237

Open
yu-zhy wants to merge 2 commits into
itmisx:mainfrom
yu-zhy:RouterReconstruct
Open

Router reconstruct#237
yu-zhy wants to merge 2 commits into
itmisx:mainfrom
yu-zhy:RouterReconstruct

Conversation

@yu-zhy

@yu-zhy yu-zhy commented Aug 7, 2026

Copy link
Copy Markdown
   1、建议重构模型路由策略实现,支持用户自定义模型路由语义元句
          ~/.deepx/router/patterns/   追加4个级别的语义元句定义 deep.toml   complex.toml  medium.toml  simple.toml
   2、支持模型路由回降机制,进一步降低成本
   3、进一步细化模型路由策略

- segmenter.yaml 独立配置文件(不污染 model.yaml)
- embedder: onnx 启动语义模型  默认使用bge-small-zh-v1.5  支持自动下载
- topic_tracking: true 启动主题追踪
- onnx_model: xxx  支持手动配置下载模型

add TopicGraph feature with ollama

fix: PR itmisx#219 issue 全部修复

1. modelPin 判断: m.modelPin == "" || m.modelPin == "auto" (原恒为 false)
2. activeModelID 兜底: else 分支加回退逻辑
3. CI: go vet self-assignment 删除 + TF-IDF 首篇文档向量全零修复
4. 话题切换冲突: 移除 TopicSwitch 提示(保留 TopicGraph 用于路由)
5. ONNX 路径: ortLibName build tag 分平台 + ORT 引擎路径改为 ~/.deepx/ocr/
6. ONNX mean pooling: 按 attention_mask 加权平均 + 归一化
7. 阈值分档: adjustedNewTopicThreshold() 按 embedder 类型返回不同值
8. token_type_ids: 补充缺失的 ONNX 模型输入(全零张量)
@itmisx

itmisx commented Aug 9, 2026

Copy link
Copy Markdown
Owner

@yu-zhy
🔴 一、关键词路由被绕过了

tui/model.go:1341 起:

if m.router != nil {
dec := m.router.Decide(input) // ← 有 router 就完全走它
role = dec.Role
} else {
role = agent.RouteByKeyword(input) // ← 只有 router 为 nil 才用关键词
}

而 router.Decide 的决策链(agent/router/router.go)是:

  1. 语义匹配(需要 ONNX)
  2. 长度 > 500 → pro
  3. 默认 → flash

没有关键词那一环。 95 条 complexKeywords 在启用 router 后完全不参与决策。

结合下面第二条(ONNX 加载不了),实际效果是:

▎ 「重构整个认证模块,拆成三层」→ 语义匹配失效 → 不足 500 字 → flash

而当前 main 会正确判成 pro。这是路由质量的直接倒退,而且是静默的。

🔴 二、ONNX 仍然加载不了(#219 就有,未修)

bge-small-zh-v1.5 是 ONNX external-data 格式:model.onnx 只有 41 KB 计算图,90 MB 权重在 model.onnx_data 里。PR 只下载前者。我上次实测:

❌ onnxruntime error [code 6]: filesystem error: in file_size:
No such file or directory ["…/model.onnx_data"]

错误被 embedder, _ = agent.NewEmbedder(...) 吞掉 → embedder 为 nil → HasEmbedder() false → 语义匹配整条路径永不执行。

于是第一条的后果就坐实了:router 启用 = 只剩「长度 > 500」这一条规则。

🔴 三、agent 包的测试编译不过

vet: agent/compact_cooldown_test.go:89:103: not enough arguments in call to StartStream
have (..., WorkingMode)
want (..., WorkingMode, string)

StartStream 加了 reasoningEffort string 参数,调用方没跟着改。

go build ./... 能过(生产代码),但 go test ./agent/ build failed —— 说明作者在这个分支上从没跑过 agent 的测试。#219 至少还能编译(只是 3 个红的)。

🟡 四、四档匹配是「先到先得」,不是「最相似」

matcher.go 的 Match() 按 simple → medium → complex → deep 顺序遍历,谁先越过 0.6 就返回谁:

for i := range m.groups {
for _, pVec := range m.groups[i].Vectors {
if agent.CosineSimilarity(userVec, pVec) >= complexTaskSimThreshold {
return &m.groups[i].Decision // 第一个过线的就返回
}
}
}

而 simple 排第一。一个架构任务只要碰巧和某条 simple 语句(比如「查看代码定义和简单的搜索匹配」)过线,就被判成 flash —— 整个排序系统性偏向最便宜的档。

正确做法是取相似度最高的那一档,而不是固定顺序里第一个过线的。

🟡 五、阈值仍是 0.6,对 bge 太高

我上次实测 bge-small-zh 在这套语料上:pro 组中位 0.526、最高 0.631。0.6 只能捞到 13 条里的 1 条。最优阈值在 0.45 附近。

四档共用同一个 0.6,更没道理 —— 每档的语句风格不同,阈值本该各自标定。

   1、建议重构模型路由策略实现,支持用户自定义模型路由语义元句
   2、支持模型路由回降机制,进一步降低成本
   3、优化启动速度,可异步加载语义模型
	Fixs itmisx#236
@yu-zhy
yu-zhy force-pushed the RouterReconstruct branch from e32ca13 to a37aa0b Compare August 10, 2026 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants