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

+43
View File
@@ -0,0 +1,43 @@
package embedding
import (
"context"
"strings"
"git.yeij.top/AskaEth/Cyrene_v2/internal/config"
)
// Manager selects the runtime embedder based on configuration and exposes it
// through a single Embedder handle.
//
// When config.EmbeddingConfig.APIURL is set, the semantic APIEmbedder is
// chosen; otherwise the built-in NGramEmbedder is used. In both cases the
// caller receives a consistent Embedder that is safe for concurrent use.
//
// It is the integration point described in DevDocs/design/04-运行时.md §7: the
// API path is a real semantic-vector enhancement, while the n-gram path keeps
// the runtime zero-dependency and offline.
type Manager struct {
embedder Embedder
}
// New builds a Manager for cfg and selects the embedder. When cfg.APIURL is set
// (ignoring surrounding whitespace), an APIEmbedder is used; otherwise an
// NGramEmbedder with the default dimension.
func New(cfg config.EmbeddingConfig) *Manager {
var embedder Embedder
if strings.TrimSpace(cfg.APIURL) != "" {
embedder = NewAPI(cfg)
} else {
embedder = NewNGram(defaultNGramDim)
}
return &Manager{embedder: embedder}
}
// Embedder returns the selected embedder.
func (m *Manager) Embedder() Embedder { return m.embedder }
// Embed is a convenience pass-through to the selected embedder.
func (m *Manager) Embed(ctx context.Context, texts []string) ([]Vector, error) {
return m.embedder.Embed(ctx, texts)
}