ChatRAG/Services/SearchVectors/VectorDatabaseFactory.cs
2025-06-21 14:20:07 -03:00

101 lines
3.7 KiB
C#

using ChatApi.Data;
using ChatRAG.Contracts.VectorSearch;
using ChatRAG.Data;
using ChatRAG.Services.Contracts;
using ChatRAG.Services.ResponseService;
using ChatRAG.Services.TextServices;
using ChatRAG.Settings.ChatRAG.Configuration;
using Microsoft.Extensions.Options;
namespace ChatRAG.Services.SearchVectors
{
public class VectorDatabaseFactory : IVectorDatabaseFactory
{
private readonly IServiceProvider _serviceProvider;
private readonly VectorDatabaseSettings _settings;
private readonly ILogger<VectorDatabaseFactory> _logger;
public VectorDatabaseFactory(
IServiceProvider serviceProvider,
IOptions<VectorDatabaseSettings> settings,
ILogger<VectorDatabaseFactory> logger)
{
_serviceProvider = serviceProvider;
_settings = settings.Value;
_logger = logger;
}
public string GetActiveProvider()
{
return _settings.Provider;
}
public VectorDatabaseSettings GetSettings()
{
return _settings;
}
public IVectorSearchService CreateVectorSearchService()
{
_logger.LogInformation("Criando VectorSearchService para provider: {Provider}", _settings.Provider);
return _settings.Provider.ToLower() switch
{
"qdrant" => GetService<QdrantVectorSearchService>(),
"mongodb" => GetService<MongoVectorSearchService>(),
"chroma" => GetService<ChromaVectorSearchService>(),
_ => throw new ArgumentException($"Provider de VectorSearch não suportado: {_settings.Provider}")
};
}
public ITextDataService CreateTextDataService()
{
_logger.LogInformation("Criando TextDataService para provider: {Provider}", _settings.Provider);
return _settings.Provider.ToLower() switch
{
"qdrant" => GetService<QdrantTextDataService>(),
"mongodb" => GetService<MongoTextDataService>(),
"chroma" => GetService<ChromaTextDataService>(),
_ => throw new ArgumentException($"Provider de TextDataService não suportado: {_settings.Provider}")
};
}
public IResponseService CreateResponseService()
{
_logger.LogInformation("Criando ResponseService para provider: {Provider}", _settings.Provider);
// Verificar se deve usar RAG Hierárquico
var configuration = _serviceProvider.GetService<IConfiguration>();
var useHierarchical = configuration?.GetValue<bool>("Features:UseHierarchicalRAG") ?? false;
if (useHierarchical)
{
_logger.LogInformation("Usando HierarchicalRAGService");
return GetService<HierarchicalRAGService>();
}
// Usar estratégia baseada no provider ou configuração
var ragStrategy = configuration?.GetValue<string>("Features:RAGStrategy");
return ragStrategy?.ToLower() switch
{
"hierarchical" => GetService<HierarchicalRAGService>(),
"standard" => GetService<ResponseRAGService>(),
_ => GetService<ResponseRAGService>() // Padrão
};
}
private T GetService<T>() where T : class
{
var service = _serviceProvider.GetService<T>();
if (service == null)
{
throw new InvalidOperationException($"Serviço {typeof(T).Name} não está registrado no DI container. " +
$"Verifique se o serviço foi registrado para o provider '{_settings.Provider}'.");
}
return service;
}
}
}