feat(embedding): 嵌入(n-gram 哈希向量 + 关键词 FTS + OpenAI 兼容 API 钩子 + Manager 选择)
This commit is contained in:
1 parent
70fd915242
commit
51b2bdfba2
9 files changed
+1125
No files matched your search
@@ -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)
|
||||
}
|
||||
Reference in new issue
Block a user