Files
HomeAgent/internal/kernelmod/onnx/mod.go
root 48ca95f964 fix(onnx): 启动日志错报「走规则引擎」—— 实际一直用内嵌 ONNX 模型
用户质疑「编译的内核没启用 onnx」。核查结论:**ONNX 是启用的**,是我上一版
日志改错了,误导了判断。

## 事实

- 编译:`make build` 默认 `HOMED_TAGS=onnxruntime`(Makefile 有明确注释,
  产物里 `go version -m` 可验 `-tags=onnxruntime`、CGO_ENABLED=1)。
- 多模态向量空间:`provider=chineseclip dim=512` 已加载,健康快照
  `onnx.enabled=true`。
- 依存句法分析器:`core.agent.onnx_model_path` 留空时走**二进制内嵌模型**
  (`//go:embed models/*` → 解到 `<data>/nlp/dep_parser.onnx` 后加载),
  同样是 ONNX 推理,不是规则引擎。

## 上一版错在哪

我只回显了**配置值**(空串),于是打出
`dep parser ready (内置规则引擎;未配置 ...)` —— 把「内嵌模型已启用」
说成了「降级到规则引擎」。原始日志 `initialized (model: )` 的空括号
本来就是同一个信息缺失,我把它改成了**更确定的错误结论**。

## 修法

- `nlp.ONNXParser` 记录实际加载的 `modelPath` 并暴露 `ModelPath()`
  (stub 构建下恒为空,两套构建接口一致)。
- 内核启动日志改为报实际路径:
  `dep parser ready (ONNX,模型: /home/newqqagent/nlp/dep_parser.onnx)`

部署后实录:该行正确输出实际模型路径;`onnx.enabled=true`;
启动告警仅剩两条 CLI 型技能降级说明(已在上一个提交解释)。
2026-10-20 09:04:11 +08:00

52 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package onnx 是 onnx-parser 模块:依存句法分析器(失败退回规则引擎)。
//
// ## ★ 它为什么是独立模块
//
// 它写的是**包级单例** `nlp.defaultParser`(internal/nlp/parser.go:15),
// 而该单例由**运行期**读取(`nlp.NewExtractor(nil)` 构造时快照它,
// 由蒸馏路径 `extractKeyTriples` 调用)。
//
// 这正是设计 §2.8.2 说的"签名看不到的隐藏依赖":没有参数传递,
// 而是**包级变量 + 运行期读**。
//
// ⇒ 独立成模块,让 text-memory 能**显式声明**对它的依赖
// (见 kernelmod/textmem 的说明)。这样"碰巧安全"变成"结构保证"。
package onnx
import (
"log"
"path/filepath"
"github.com/JianFeeeee/HomeAgent/internal/kernelboot"
"github.com/JianFeeeee/HomeAgent/internal/kernelmod"
"github.com/JianFeeeee/HomeAgent/internal/nlp"
)
// Module 初始化依存句法分析器。
type Module struct{}
func (Module) Name() string { return "onnx-parser" }
func (Module) Requires() []string { return []string{kernelmod.FacConfig} }
func (Module) Provides() []string { return []string{kernelmod.FacONNX} }
func (Module) Init(ks *kernelboot.KernelState) error {
modelPath := ks.CfgReg.GetString("core.agent.onnx_model_path", "")
onnxParser, err := nlp.NewONNXParser(nlp.ONNXConfig{
ModelPath: modelPath,
DataDir: filepath.Join(ks.Cfg.Daemon.DataDir, "nlp"),
})
if err != nil {
log.Printf("[homed] warn: ONNX parser init: %v, using fallback", err)
return nil
}
nlp.SetDefaultParser(onnxParser)
// 日志必须报**实际解析出的**模型路径,不能回显配置值:
// core.agent.onnx_model_path 留空时内核会用**二进制内嵌**的 dep_parser.onnx
// (解到 <data>/nlp 后加载)。此前只打配置值,于是出现
// "initialized (model: )" —— 看着像 ONNX 没启用,实际内嵌模型一直在跑。
log.Printf("[homed] dep parser ready (ONNX,模型: %s)", onnxParser.ModelPath())
return nil
}
func init() { kernelmod.Register(Module{}) }