108 lines
4.1 KiB
C#
108 lines
4.1 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;
|
|
var useConfidenceAware = configuration?.GetValue<bool>("Features:UseConfidenceAwareRAG") ?? false;
|
|
|
|
if (useHierarchical && !useConfidenceAware)
|
|
{
|
|
_logger.LogInformation("Usando HierarchicalRAGService");
|
|
return GetService<HierarchicalRAGService>();
|
|
}
|
|
|
|
if (useConfidenceAware)
|
|
{
|
|
_logger.LogInformation("Usando ConfidenceAwareRAGService");
|
|
return GetService<ConfidenceAwareRAGService>();
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
}
|