embedding_provider.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package service
  2. import (
  3. "context"
  4. "log"
  5. "github.com/2930134478/AI-CS/backend/service/embedding"
  6. )
  7. // ConfigBackedEmbeddingProvider 基于 DB 配置的嵌入服务提供者,每次 Get 从配置读取,保存即生效
  8. type ConfigBackedEmbeddingProvider struct {
  9. configService *EmbeddingConfigService
  10. factory *embedding.EmbeddingFactory
  11. }
  12. // NewConfigBackedEmbeddingProvider 创建基于 DB 配置的嵌入服务提供者
  13. func NewConfigBackedEmbeddingProvider(configService *EmbeddingConfigService, factory *embedding.EmbeddingFactory) *ConfigBackedEmbeddingProvider {
  14. return &ConfigBackedEmbeddingProvider{
  15. configService: configService,
  16. factory: factory,
  17. }
  18. }
  19. // Get 返回当前配置对应的嵌入服务(每次从 DB 读取,无缓存)
  20. func (p *ConfigBackedEmbeddingProvider) Get(ctx context.Context) (embedding.EmbeddingService, error) {
  21. typ, apiURL, apiKey, model, err := p.configService.GetRaw()
  22. if err != nil {
  23. return nil, err
  24. }
  25. if apiKey != "" {
  26. switch typ {
  27. case "openai", "api":
  28. return embedding.NewOpenAIEmbeddingService(apiURL, apiKey, model), nil
  29. case "local", "bge":
  30. return embedding.NewBGEEmbeddingService(apiURL, apiKey, model), nil
  31. default:
  32. svc, createErr := p.factory.CreateEmbeddingService(typ)
  33. if createErr != nil {
  34. log.Printf("⚠️ 从 DB 创建嵌入服务失败 (%s),回退到环境变量: %v", typ, createErr)
  35. return p.fallbackFromEnv()
  36. }
  37. return svc, nil
  38. }
  39. }
  40. return p.fallbackFromEnv()
  41. }
  42. func (p *ConfigBackedEmbeddingProvider) fallbackFromEnv() (embedding.EmbeddingService, error) {
  43. svc, err := p.factory.CreateDefaultEmbeddingService()
  44. if err != nil {
  45. return embedding.NewUnconfiguredEmbeddingService(), nil
  46. }
  47. return svc, nil
  48. }