From 0af38a29c6be3d89977c3155e68927804da8e458 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 7 Sep 2026 17:00:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(vector):=20Vectorizer=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8A=A0=20EmbedImage=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E6=A8=A1=E6=80=81=E5=B5=8C=E5=85=A5=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vectorizer 新增可选的 EmbedImage(img []byte, mime string) (Vector, error): 支持视觉嵌入的实现者(如 CLIP/MobileCLIP)覆写此方法;不支持的 (StaticEmbedder、TFIDFVectorizer)返回 ErrNotSupported 调用方按文本降级。 这是路线 3(完整跨模态检索)的接口基础:后续在 media.Store 里, Describe 时同时算视觉向量并存库,QueryMedia 做跨模态混合检索。 --- internal/memory/static_embedder.go | 7 +++++++ internal/memory/vector/store.go | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/internal/memory/static_embedder.go b/internal/memory/static_embedder.go index f843e1b..a34013c 100644 --- a/internal/memory/static_embedder.go +++ b/internal/memory/static_embedder.go @@ -391,6 +391,13 @@ func (e *StaticEmbedder) Vectorize(text string) vector.Vector { return vec } +// EmbedImage 返回 ErrNotSupported:fastText 是纯文本词向量模型, +// 没有视觉编码器。要用图像嵌入需要外部视觉模型(如 CLIP/MobileCLIP), +// 那个由 config 里的 EmbeddingModelPath 指定的视觉模型负责。 +func (e *StaticEmbedder) EmbedImage(img []byte, mime string) (vector.Vector, error) { + return nil, vector.ErrNotSupported +} + func (e *StaticEmbedder) Dim() int { e.mu.RLock() defer e.mu.RUnlock() diff --git a/internal/memory/vector/store.go b/internal/memory/vector/store.go index 37c94f1..82442d6 100644 --- a/internal/memory/vector/store.go +++ b/internal/memory/vector/store.go @@ -1,6 +1,7 @@ package vector import ( + "fmt" "math" "sort" "strings" @@ -8,10 +9,17 @@ import ( ) // Vectorizer 接口:将文本转为向量 +// +// 多模态嵌入新增可选的 EmbedImage:支持视觉嵌入的实现者覆写此方法, +// 不支持的(TF-IDF 等)在默认实现里返回 ErrNotSupported。 type Vectorizer interface { Vectorize(text string) Vector + EmbedImage(img []byte, mime string) (Vector, error) } +// ErrNotSupported 表示 Vectorizer 不支持图像嵌入,调用方按文本描述降级。 +var ErrNotSupported = fmt.Errorf("vectorizer does not support image embedding") + // Vector 是带权特征映射:feature → weight type Vector map[string]float64