mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-20 08:58:03 +00:00
refactor(sdk): 移除 MediaAttachment.Description,媒体不再以文本描述参与索引
描述式索引是把图片将就成文本的机制,已在内核侧彻底拆除: - MediaAttachment 不再携带 Description:媒体只按自己的原生向量被 检索与召回,不生成、不检索、不持久化任何描述文本; - InsertWithMedia 的语义随之收敛为「媒体成为文档直接持有的一等块」, 文档向量融合这些块的原生向量,图片按图本身被召回; - 往返测试同步去掉描述字段,只断言 digest/MIME/name/data 不损坏。 注意:这是公开 SDK 的破坏性字段删除(有意为之,媒体描述链路整体废弃), 不是加法式变更。
This commit is contained in:
@ -49,15 +49,17 @@ type TextMemoryAPI interface {
|
|||||||
//
|
//
|
||||||
// 两个方向共用一个类型:
|
// 两个方向共用一个类型:
|
||||||
// - 写入(InsertWithMedia):给 Data + MIME 就是新内容;只给 Digest 则是引用已有内容。
|
// - 写入(InsertWithMedia):给 Data + MIME 就是新内容;只给 Digest 则是引用已有内容。
|
||||||
// - 读出(Query):内核只填 Digest/MIME/Description,**不回 Data**——
|
// - 读出(Query):内核只填 Digest/MIME,**不回 Data**——
|
||||||
// 一次检索可能命中几十张图,把字节全塞回插件会把 ABI 消息撑爆。
|
// 一次检索可能命中几十张图,把字节全塞回插件会把 ABI 消息撑爆。
|
||||||
// 需要字节时拿 Digest 单独取。
|
// 需要字节时拿 Digest 单独取。
|
||||||
|
//
|
||||||
|
// 刻意没有 Description 字段:媒体不作为文本被索引,也不带任何生成的描述。
|
||||||
|
// 它只按自己的原生向量被检索与召回;附加文字请写在文档 / 三元组的文本里。
|
||||||
type MediaAttachment struct {
|
type MediaAttachment struct {
|
||||||
Digest string `json:"digest,omitempty"`
|
Digest string `json:"digest,omitempty"`
|
||||||
MIME string `json:"mime,omitempty"`
|
MIME string `json:"mime,omitempty"`
|
||||||
Data []byte `json:"data,omitempty"`
|
Data []byte `json:"data,omitempty"`
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type TextEvent struct {
|
type TextEvent struct {
|
||||||
@ -74,8 +76,8 @@ type DocMemoryAPI interface {
|
|||||||
Insert(doc *Doc) error
|
Insert(doc *Doc) error
|
||||||
// InsertWithMedia 写入文档并关联媒体。attachments 里带 Data 的会落进
|
// InsertWithMedia 写入文档并关联媒体。attachments 里带 Data 的会落进
|
||||||
// 内容寻址存储(相同字节只存一份),只带 Digest 的直接引用已有内容。
|
// 内容寻址存储(相同字节只存一份),只带 Digest 的直接引用已有内容。
|
||||||
// 插件无需自己拼标记:内核会把 `[mime <短 digest>] <描述>` 补进 Content,
|
// 媒体成为文档直接持有的一等记忆块:文档向量会融合它们的原生向量,
|
||||||
// 让向量检索和后续蒸馏都能看到这份媒体。
|
// 因此图片按自己的向量被召回,不依赖任何生成的描述文本。
|
||||||
InsertWithMedia(doc *Doc, attachments []MediaAttachment) error
|
InsertWithMedia(doc *Doc, attachments []MediaAttachment) error
|
||||||
Remove(id string)
|
Remove(id string)
|
||||||
Stats() map[string]interface{}
|
Stats() map[string]interface{}
|
||||||
|
|||||||
@ -467,7 +467,6 @@ func TestStress_MediaTypesJSONRoundTripAtScale(t *testing.T) {
|
|||||||
MIME: "image/png",
|
MIME: "image/png",
|
||||||
Data: data,
|
Data: data,
|
||||||
Name: "图片-名字 with space & 符号.png",
|
Name: "图片-名字 with space & 符号.png",
|
||||||
Description: "一张紫蓝红三色带图,含 emoji 🎨 与换行\n第二行",
|
|
||||||
}
|
}
|
||||||
b, err := json.Marshal(att)
|
b, err := json.Marshal(att)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -485,7 +484,7 @@ func TestStress_MediaTypesJSONRoundTripAtScale(t *testing.T) {
|
|||||||
t.Fatalf("size=%d 第 %d 字节损坏: %02x != %02x", n, i, back.Data[i], data[i])
|
t.Fatalf("size=%d 第 %d 字节损坏: %02x != %02x", n, i, back.Data[i], data[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if back.Name != att.Name || back.Description != att.Description || back.MIME != att.MIME || back.Digest != att.Digest {
|
if back.Name != att.Name || back.MIME != att.MIME || back.Digest != att.Digest {
|
||||||
t.Fatalf("size=%d 元数据往返不一致: %+v", n, back)
|
t.Fatalf("size=%d 元数据往返不一致: %+v", n, back)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user