feat(embedding): 嵌入(n-gram 哈希向量 + 关键词 FTS + OpenAI 兼容 API 钩子 + Manager 选择)

This commit is contained in:
Aska committed 2026-09-06 04:37:10 +08:00
1 parent 70fd915242
commit 51b2bdfba2
9 files changed
+1125

No files matched your search

@@ -0,0 +1,64 @@
package embedding
import (
"context"
"testing"
"git.yeij.top/AskaEth/Cyrene_v2/internal/config"
)
func TestManager_SelectsAPIWhenConfigured(t *testing.T) {
t.Parallel()
cfg := config.EmbeddingConfig{
APIURL: "http://localhost:9999/v1/embeddings",
APIKey: "secret",
Model: "text-embedding-3-small",
}
m := New(cfg)
if m.Embedder() == nil {
t.Fatal("Embedder() returned nil")
}
if _, ok := m.Embedder().(*APIEmbedder); !ok {
t.Fatalf("Embedder() = %T, want *APIEmbedder", m.Embedder())
}
}
func TestManager_SelectsNGramByDefault(t *testing.T) {
t.Parallel()
m := New(config.EmbeddingConfig{})
emb, ok := m.Embedder().(*NGramEmbedder)
if !ok {
t.Fatalf("Embedder() = %T, want *NGramEmbedder", m.Embedder())
}
if emb.Dim() != defaultNGramDim {
t.Errorf("default ngram dim = %d, want %d", emb.Dim(), defaultNGramDim)
}
}
func TestManager_BlankAPIURLSelectsNGram(t *testing.T) {
t.Parallel()
cfg := config.EmbeddingConfig{APIURL: " "} // whitespace counts as unset
m := New(cfg)
if _, ok := m.Embedder().(*NGramEmbedder); !ok {
t.Fatalf("Embedder() = %T, want *NGramEmbedder for blank URL", m.Embedder())
}
}
func TestManager_EmbedDelegatesToSelectedEmbedder(t *testing.T) {
t.Parallel()
m := New(config.EmbeddingConfig{})
vectors, err := m.Embed(context.Background(), []string{"hello"})
if err != nil {
t.Fatalf("Embed() error: %v", err)
}
if len(vectors) != 1 {
t.Fatalf("got %d vectors, want 1", len(vectors))
}
if len(vectors[0]) != defaultNGramDim {
t.Errorf("vector length = %d, want %d", len(vectors[0]), defaultNGramDim)
}
}