mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
feat(memory): 千问文本塔 ONNX 嵌入器(onnxruntime 标签,含 stub)
与 internal/memory/clip 同模式:`//go:build onnxruntime` 编真实实现,无标签时 走 stub,默认构建不链接 onnxruntime、行为不变。 加载契约(目录由 core.memory.multimodal_space.model_dir 指定): TextTower.onnx + 外部权重分片、tokenizer.json、embed_config.json。 图内已含 last-token 池化,输出即 [batch, dim];L2 归一化在 Go 侧做。 两个刻意的设计选择: 1. **EmbedImageDense 明确报错,不返回零向量** 导出的是文本塔,视觉塔未导出。返回零向量会让「写入了但检索不到」, 把跨模态检索失效变成静默故障;明确报错则调用方(mediaref.go)log 后 跳过写向量,文本路径不受影响。 2. **Fingerprint 只哈希图文件 + 配置 + 外部权重的文件名与大小** 该目录有 6.5GB 权重分片,启动时全读一遍要几十秒、会阻塞 homeagent 启动。 换模型必然改变文件集合或大小,足以识别切换;代价是理论上存在 「大小相同但内容不同」的漏判,对本地单机部署可接受。已写入注释。 模板渲染(renderInstructionInput)放在无构建标签的 tokenizer.go,因此可被 测试覆盖:参考数据里有该模板串的用例,逐 token 对齐验证——模板差一个字符, 池化取到的「最后一个有效 token」位置就变,向量就不同,且不会报错。 验证:6 个测试全绿;go build ./...(stub)与 go build -tags onnxruntime (真实实现)均通过。
This commit is contained in:
@ -144,6 +144,34 @@ func TestTokenizerEdgeCases(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// 模板渲染必须与参考数据里的整串完全一致,且逐 token 对齐。
|
||||
//
|
||||
// 这是嵌入正确性的前提:模板差一个字符,池化取到的「最后一个有效 token」
|
||||
// 位置就变了,向量也就不同——而且不会报错。
|
||||
func TestRenderInstructionInputMatchesTemplate(t *testing.T) {
|
||||
ref := loadRef(t)
|
||||
tok := loadTokenizer(t)
|
||||
|
||||
const want = "<|im_start|>system\nRepresent the user's input.<|im_end|>\n" +
|
||||
"<|im_start|>user\n你好<|im_end|>\n<|im_start|>assistant\n"
|
||||
|
||||
got := renderInstructionInput("", "你好")
|
||||
if got != want {
|
||||
t.Fatalf("模板渲染不一致:\n got %q\n want %q", got, want)
|
||||
}
|
||||
|
||||
for _, c := range ref.Cases {
|
||||
if c.Text != want {
|
||||
continue
|
||||
}
|
||||
if ids := tok.Encode(got); !sameIDs(ids, c.IDs) {
|
||||
t.Fatalf("模板串 token 不一致:\n got %v\n want %v", ids, c.IDs)
|
||||
}
|
||||
return
|
||||
}
|
||||
t.Fatal("参考数据里缺少该模板串用例")
|
||||
}
|
||||
|
||||
// byteEnc 必须是双射:256 个字节映射到 256 个互不相同的码点。
|
||||
// 有碰撞就会让不同字节编成同一个 token,静默产生错误输入。
|
||||
func TestBytesToUnicodeBijective(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user