From 48ca95f964847b26b5db79b3065ad1271c7de056 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 20 Oct 2026 09:04:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(onnx):=20=E5=90=AF=E5=8A=A8=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E9=94=99=E6=8A=A5=E3=80=8C=E8=B5=B0=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E3=80=8D=E2=80=94=E2=80=94=20=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E4=B8=80=E7=9B=B4=E7=94=A8=E5=86=85=E5=B5=8C=20ONNX?= =?UTF-8?q?=20=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户质疑「编译的内核没启用 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/*` → 解到 `/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 型技能降级说明(已在上一个提交解释)。 --- internal/kernelmod/onnx/mod.go | 12 +++++------- internal/nlp/onnx.go | 28 +++++++++++++++++++++------- internal/nlp/onnx_stub.go | 3 +++ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/internal/kernelmod/onnx/mod.go b/internal/kernelmod/onnx/mod.go index 6c86d8d4..68e3907f 100644 --- a/internal/kernelmod/onnx/mod.go +++ b/internal/kernelmod/onnx/mod.go @@ -40,13 +40,11 @@ func (Module) Init(ks *kernelboot.KernelState) error { return nil } nlp.SetDefaultParser(onnxParser) - // 空路径 = 走内置规则引擎(不发 ONNX 推理)。旧日志打成 - // "initialized (model: )" —— 空括号看着像配置泄漏了,实为正常回退。 - if modelPath == "" { - log.Printf("[homed] dep parser ready (内置规则引擎;未配置 core.agent.onnx_model_path)") - } else { - log.Printf("[homed] dep parser ready (ONNX model: %s)", modelPath) - } + // 日志必须报**实际解析出的**模型路径,不能回显配置值: + // core.agent.onnx_model_path 留空时内核会用**二进制内嵌**的 dep_parser.onnx + // (解到 /nlp 后加载)。此前只打配置值,于是出现 + // "initialized (model: )" —— 看着像 ONNX 没启用,实际内嵌模型一直在跑。 + log.Printf("[homed] dep parser ready (ONNX,模型: %s)", onnxParser.ModelPath()) return nil } diff --git a/internal/nlp/onnx.go b/internal/nlp/onnx.go index b776b96b..934986c7 100644 --- a/internal/nlp/onnx.go +++ b/internal/nlp/onnx.go @@ -20,10 +20,23 @@ var onnxModelFS embed.FS const maxSeqLen = 128 type ONNXParser struct { - rt *ort.DynamicAdvancedSession - vocab map[string]int64 - posVocab map[string]int64 - close sync.Once + rt *ort.DynamicAdvancedSession + vocab map[string]int64 + posVocab map[string]int64 + close sync.Once + modelPath string // 实际加载的模型路径(空 ModelPath 时为解出的内嵌模型) +} + +// ModelPath 返回**实际**加载的 ONNX 模型路径。 +// +// 为什么需要它:配置里的 core.agent.onnx_model_path 允许留空,此时用二进制内嵌 +// 的 dep_parser.onnx(解到 DataDir/nlp 后加载)。只看配置就会把「内嵌模型已启用」 +// 误报成「未配置 → 走规则引擎」—— 启动日志一度这样误导。 +func (p *ONNXParser) ModelPath() string { + if p == nil { + return "" + } + return p.modelPath } type ONNXConfig struct { @@ -75,9 +88,10 @@ func NewONNXParser(cfg ONNXConfig) (*ONNXParser, error) { } return &ONNXParser{ - rt: session, - vocab: vocab, - posVocab: posVocab, + rt: session, + vocab: vocab, + posVocab: posVocab, + modelPath: modelPath, }, nil } diff --git a/internal/nlp/onnx_stub.go b/internal/nlp/onnx_stub.go index 10c30106..39f83fcd 100644 --- a/internal/nlp/onnx_stub.go +++ b/internal/nlp/onnx_stub.go @@ -15,6 +15,9 @@ func NewONNXParser(_ ONNXConfig) (*ONNXParser, error) { return nil, fmt.Errorf("ONNX parser requires build tag 'onnxruntime' (go build -tags onnxruntime)") } +// ModelPath 在无 onnxruntime 标签时恒为空(根本没有加载模型)。 +func (p *ONNXParser) ModelPath() string { return "" } + func (p *ONNXParser) Parse(_ string) (*ParseResult, error) { return nil, fmt.Errorf("ONNX parser not available: rebuild with -tags onnxruntime") }