API Referans
SmartRAG interface'leri, metodları ve modelleri için eksiksiz API dokümantasyonu
IDocumentSearchService
Amaç: RAG pipeline ve konuşma yönetimi ile AI destekli akıllı sorgu işleme
Namespace: SmartRAG.Interfaces.Document
Metodlar
QueryIntelligenceAsync
Birleşik akıllı sorgu işleme ile RAG ve otomatik oturum yönetimi. Smart Hybrid yönlendirme kullanarak tek sorguda veritabanları, belgeler, görüntüler (OCR) ve ses dosyalarını (transkript) arar.
Akıllı Hibrit Yönlendirme:
- Yüksek Güven (>0.7) + Veritabanı Sorguları: Sadece veritabanı sorgusu çalıştırır
- Yüksek Güven (>0.7) + Veritabanı Sorgusu Yok: Sadece belge sorgusu çalıştırır
- Orta Güven (0.3-0.7): Hem veritabanı hem belge sorgularını çalıştırır, sonuçları birleştirir
- Düşük Güven (<0.3): Sadece belge sorgusu çalıştırır (fallback)
Task<RagResponse> QueryIntelligenceAsync(
string query,
int maxResults = 5,
bool startNewConversation = false,
SearchOptions? options = null
)
Parametreler:
query(string): Kullanıcının sorusu veya sorgusumaxResults(int): Alınacak maksimum doküman parçası sayısı (varsayılan: 5)startNewConversation(bool): Yeni bir konuşma oturumu başlat (varsayılan: false)options(SearchOptions?): Global yapılandırmayı geçersiz kılmak için isteğe bağlı arama seçenekleri (varsayılan: null)
Döndürür: Tüm mevcut veri kaynaklarından (veritabanları, belgeler, görüntüler, ses) AI cevabı, kaynaklar ve metadata içeren RagResponse
Örnek:
// Tüm veri kaynaklarında birleşik sorgu
var response = await _searchService.QueryIntelligenceAsync(
"En iyi müşterileri ve son geri bildirimlerini göster",
maxResults: 5
);
Console.WriteLine(response.Answer);
// Kaynaklar hem veritabanı hem belge kaynaklarını içerir
foreach (var source in response.Sources)
{
Console.WriteLine($"Kaynak: {source.FileName}");
}
SearchOptions Kullanımı:
// Sadece veritabanı araması
var dbOptions = new SearchOptions
{
EnableDatabaseSearch = true,
EnableDocumentSearch = false,
EnableAudioSearch = false,
EnableImageSearch = false
};
var dbResponse = await _searchService.QueryIntelligenceAsync(
"En iyi müşterileri göster",
maxResults: 5,
options: dbOptions
);
// Sadece ses araması
var audioOptions = new SearchOptions
{
EnableDatabaseSearch = false,
EnableDocumentSearch = false,
EnableAudioSearch = true,
EnableImageSearch = false,
PreferredLanguage = "tr"
};
var audioResponse = await _searchService.QueryIntelligenceAsync(
"Toplantıda ne konuşuldu?",
maxResults: 5,
options: audioOptions
);
Bayrak Tabanlı Filtreleme (Sorgu String Ayrıştırma):
Sorgu string’lerinden bayrakları ayrıştırarak hızlı arama tipi seçimi yapabilirsiniz:
// Sorgu string'inden bayrakları ayrıştır
string userQuery = "-db En iyi müşterileri göster";
var searchOptions = ParseSearchOptions(userQuery, out string cleanQuery);
// cleanQuery = "En iyi müşterileri göster"
// searchOptions.EnableDatabaseSearch = true
// Diğerleri = false
var response = await _searchService.QueryIntelligenceAsync(
cleanQuery,
maxResults: 5,
options: searchOptions
);
Mevcut Bayraklar:
-db: Sadece veritabanı araması-d: Sadece doküman (metin) araması-a: Sadece ses araması-i: Sadece görüntü araması- Bayraklar birleştirilebilir (örn:
-db -a= veritabanı + ses araması)
Not: Veritabanı coordinator yapılandırılmamışsa, metod otomatik olarak sadece belge aramasına geri döner, geriye dönük uyumluluğu korur.
SearchDocumentsAsync
AI cevabı üretmeden dokümanları anlamsal olarak arayın.
Task<List<DocumentChunk>> SearchDocumentsAsync(
string query,
int maxResults = 5,
SearchOptions? options = null,
List<string>? queryTokens = null
)
Parametreler:
query(string): Arama sorgusumaxResults(int): Döndürülecek maksimum parça sayısı (varsayılan: 5)options(SearchOptions?, opsiyonel): Global yapılandırmayı geçersiz kılmak için isteğe bağlı arama seçenekleri (varsayılan: null)queryTokens(List?, opsiyonel): Performans optimizasyonu için önceden hesaplanmış sorgu token'ları (varsayılan: null)
Döndürür: İlgili doküman parçalarıyla List<DocumentChunk>
Örnek:
// Temel kullanım
var chunks = await _searchService.SearchDocumentsAsync("makine öğrenimi", maxResults: 10);
foreach (var chunk in chunks)
{
Console.WriteLine($"Skor: {chunk.RelevanceScore}, İçerik: {chunk.Content}");
}
// Arama seçenekleri ile
var options = new SearchOptions
{
EnableDocumentSearch = true,
EnableAudioSearch = false,
EnableImageSearch = false
};
var filteredChunks = await _searchService.SearchDocumentsAsync(
"makine öğrenimi",
maxResults: 10,
options: options
);
// Önceden hesaplanmış token'lar ile (performans optimizasyonu)
var tokens = new List<string> { "makine", "öğrenimi", "algoritmalar" };
var optimizedChunks = await _searchService.SearchDocumentsAsync(
"makine öğrenimi",
maxResults: 10,
queryTokens: tokens
);
GenerateRagAnswerAsync (Kullanımdan Kaldırıldı)
v3.0.0'da Kullanımdan Kaldırıldı
Yerine QueryIntelligenceAsync kullanın. Bu metod v4.0.0'da kaldırılacak.
Geriye dönük uyumluluk için sağlanan eski metod.
[Obsolete("Yerine QueryIntelligenceAsync kullanın")]
Task<RagResponse> GenerateRagAnswerAsync(
string query,
int maxResults = 5,
bool startNewConversation = false
)
IDocumentService
Amaç: Doküman CRUD işlemleri ve yönetimi
Namespace: SmartRAG.Interfaces.Document
Metodlar
UploadDocumentAsync
Tek bir doküman yükleyin ve işleyin.
Task<Document> UploadDocumentAsync(
Stream fileStream,
string fileName,
string contentType,
string uploadedBy,
string language = null
)
Parametreler:
fileStream(Stream): Doküman dosya akışıfileName(string): Dosya adıcontentType(string): MIME içerik tipiuploadedBy(string): Kullanıcı tanımlayıcısılanguage(string, isteğe bağlı): OCR için dil kodu (örn. “tur”, “eng”)
Desteklenen Formatlar:
- PDF:
application/pdf - Word:
application/vnd.openxmlformats-officedocument.wordprocessingml.document - Excel:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - Görseller:
image/jpeg,image/png,image/webp, vb. - Ses:
audio/mpeg,audio/wav, vb. - Veritabanları:
application/x-sqlite3
Örnek:
using var fileStream = File.OpenRead("sozlesme.pdf");
var document = await _documentService.UploadDocumentAsync(
fileStream,
"sozlesme.pdf",
"application/pdf",
"kullanici-123"
);
Console.WriteLine($"Yüklendi: {document.FileName}, Parçalar: {document.Chunks.Count}");
UploadDocumentsAsync
Birden fazla dokümanı toplu olarak yükleyin.
Task<List<Document>> UploadDocumentsAsync(
List<(Stream Stream, string FileName, string ContentType)> files,
string uploadedBy,
string language = null
)
Örnek:
var files = new List<(Stream, string, string)>
{
(File.OpenRead("doc1.pdf"), "doc1.pdf", "application/pdf"),
(File.OpenRead("doc2.docx"), "doc2.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
};
var documents = await _documentService.UploadDocumentsAsync(files, "user-123");
GetDocumentAsync
ID’sine göre bir doküman alın.
Task<Document> GetDocumentAsync(Guid id)
GetAllDocumentsAsync
Tüm yüklenmiş dokümanları alın.
Task<List<Document>> GetAllDocumentsAsync()
DeleteDocumentAsync
Bir dokümanı ve parçalarını silin.
Task<bool> DeleteDocumentAsync(Guid id)
GetStorageStatisticsAsync
Depolama istatistiklerini ve metriklerini alın.
Task<Dictionary<string, object>> GetStorageStatisticsAsync()
Örnek:
var stats = await _documentService.GetStorageStatisticsAsync();
Console.WriteLine($"Toplam Doküman: {stats["TotalDocuments"]}");
Console.WriteLine($"Toplam Parça: {stats["TotalChunks"]}");
RegenerateAllEmbeddingsAsync
Tüm dokümanlar için embedding’leri yeniden oluşturur (AI provider değiştikten sonra yararlı).
Task<bool> RegenerateAllEmbeddingsAsync()
ClearAllEmbeddingsAsync
Doküman içeriğini koruyarak tüm embedding’leri temizler.
Task<bool> ClearAllEmbeddingsAsync()
ClearAllDocumentsAsync
Tüm dokümanları ve embedding’lerini temizler.
Task<bool> ClearAllDocumentsAsync()
IConversationManagerService
Amaç: Konuşma oturumu yönetimi ve geçmiş takibi
Namespace: SmartRAG.Interfaces.Support
Bu interface, daha iyi sorumluluk ayrımı için doküman işlemlerinden ayrılmış özel konuşma yönetimi sağlar.
Metodlar
StartNewConversationAsync
Yeni bir konuşma oturumu başlatır.
Task<string> StartNewConversationAsync()
Döndürür: Yeni oturum ID’si (string)
Örnek:
var sessionId = await _conversationManager.StartNewConversationAsync();
Console.WriteLine($"Oturum başlatıldı: {sessionId}");
GetOrCreateSessionIdAsync
Mevcut oturum ID’sini alır veya otomatik olarak yeni bir tane oluşturur.
Task<string> GetOrCreateSessionIdAsync()
Döndürür: Oturum ID’si (string)
Kullanım Senaryosu: Manuel oturum yönetimi olmadan otomatik oturum sürekliliği
Örnek:
// Otomatik olarak oturumu yönetir - yoksa yeni oluşturur
var sessionId = await _conversationManager.GetOrCreateSessionIdAsync();
AddToConversationAsync
Oturum geçmişine bir konuşma turu (soru + cevap) ekler.
Task AddToConversationAsync(
string sessionId,
string question,
string answer
)
Parametreler:
sessionId(string): Oturum tanımlayıcısıquestion(string): Kullanıcının sorusuanswer(string): AI’ın cevabı
Örnek:
await _conversationManager.AddToConversationAsync(
sessionId,
"Makine öğrenimi nedir?",
"Makine öğrenimi, sistemlerin öğrenmesini sağlayan AI'ın bir alt kümesidir..."
);
GetConversationHistoryAsync
Bir oturum için tam konuşma geçmişini alır.
Task<string> GetConversationHistoryAsync(string sessionId)
Parametreler:
sessionId(string): Oturum tanımlayıcısı
Döndürür: String olarak biçimlendirilmiş konuşma geçmişi
Format:
User: [soru]
Assistant: [cevap]
User: [sonraki soru]
Assistant: [sonraki cevap]
Örnek:
var history = await _conversationManager.GetConversationHistoryAsync(sessionId);
Console.WriteLine(history);
TruncateConversationHistory
Sadece son turları tutmak için konuşma geçmişini kısaltır (bellek yönetimi).
string TruncateConversationHistory(
string history,
int maxTurns = 3
)
Parametreler:
history(string): Tam konuşma geçmişimaxTurns(int): Tutulacak maksimum konuşma turu sayısı (varsayılan: 3)
Döndürür: Kısaltılmış konuşma geçmişi
Kullanım Senaryosu: AI prompt’larında context window taşmasını önler
Örnek:
var fullHistory = await _conversationManager.GetConversationHistoryAsync(sessionId);
var recentHistory = _conversationManager.TruncateConversationHistory(fullHistory, maxTurns: 5);
Tam Kullanım Örneği
public class ChatService
{
private readonly IConversationManagerService _conversationManager;
private readonly IDocumentSearchService _searchService;
public ChatService(
IConversationManagerService conversationManager,
IDocumentSearchService searchService)
{
_conversationManager = conversationManager;
_searchService = searchService;
}
public async Task<string> HandleChatAsync(string userMessage)
{
// Oturum al veya oluştur
var sessionId = await _conversationManager.GetOrCreateSessionIdAsync();
// Context için konuşma geçmişini al
var history = await _conversationManager.GetConversationHistoryAsync(sessionId);
// Context ile sorgu
var response = await _searchService.QueryIntelligenceAsync(userMessage);
// Konuşma geçmişine kaydet
await _conversationManager.AddToConversationAsync(
sessionId,
userMessage,
response.Answer
);
return response.Answer;
}
public async Task<string> StartNewChatAsync()
{
var newSessionId = await _conversationManager.StartNewConversationAsync();
return $"Yeni konuşma başlatıldı: {newSessionId}";
}
}
Depolama Backend’leri
Konuşma geçmişi yapılandırılmış IConversationRepository kullanılarak depolanır:
- SQLite:
SqliteConversationRepository- Kalıcı dosya tabanlı depolama - InMemory:
InMemoryConversationRepository- Hızlı, kalıcı olmayan (geliştirme) - FileSystem:
FileSystemConversationRepository- JSON dosya tabanlı depolama - Redis:
RedisConversationRepository- Yüksek performanslı dağıtık depolama
Depolama backend’i StorageProvider yapılandırmanıza göre otomatik olarak seçilir.
IDocumentParserService
Amaç: Çoklu format doküman ayrıştırma ve metin çıkarma
Namespace: SmartRAG.Interfaces.Document
Metodlar
ParseDocumentAsync
Bir dokümanı ayrıştırın ve doküman entity’si oluşturun.
Task<Document> ParseDocumentAsync(
Stream fileStream,
string fileName,
string contentType,
string uploadedBy,
string language = null
)
GetSupportedFileTypes
Desteklenen dosya uzantılarının listesini alın.
IEnumerable<string> GetSupportedFileTypes()
Dönen Değerler:
.pdf,.docx,.doc.xlsx,.xls.txt,.md,.json,.xml,.csv.jpg,.jpeg,.png,.gif,.bmp,.tiff,.webp.mp3,.wav,.m4a,.aac,.ogg,.flac,.wma.db,.sqlite,.sqlite3
GetSupportedContentTypes
Desteklenen MIME content type’larının listesini alın.
IEnumerable<string> GetSupportedContentTypes()
IDatabaseParserService
Amaç: Canlı bağlantılarla evrensel veritabanı desteği
Namespace: SmartRAG.Interfaces.Database
Metodlar
ParseDatabaseFileAsync
Bir veritabanı dosyasını ayrıştırın (SQLite).
Task<string> ParseDatabaseFileAsync(Stream dbStream, string fileName)
ParseDatabaseConnectionAsync
Canlı veritabanına bağlanın ve içeriği çıkarın.
Task<string> ParseDatabaseConnectionAsync(
string connectionString,
DatabaseConfig config
)
Örnek:
var config = new DatabaseConfig
{
Type = DatabaseType.SqlServer,
ConnectionString = "Server=localhost;Database=Northwind;Trusted_Connection=true;",
IncludedTables = new List<string> { "Customers", "Orders", "Products" },
MaxRowsPerTable = 1000,
SanitizeSensitiveData = true
};
var content = await _databaseService.ParseDatabaseConnectionAsync(
config.ConnectionString,
config
);
ExtractTableDataAsync
Belirli bir tablodan veri çıkarın.
Task<string> ExtractTableDataAsync(
string connectionString,
string tableName,
DatabaseType databaseType,
int maxRows = 1000
)
ExecuteQueryAsync
Özel SQL sorgusu çalıştırın.
Task<string> ExecuteQueryAsync(
string connectionString,
string query,
DatabaseType databaseType,
int maxRows = 1000
)
Örnek:
var result = await _databaseService.ExecuteQueryAsync(
"Server=localhost;Database=Sales;Trusted_Connection=true;",
"SELECT TOP 10 CustomerID, CompanyName FROM Customers WHERE Country = 'USA'",
DatabaseType.SqlServer,
maxRows: 10
);
GetTableNamesAsync
Veritabanından tablo isimlerinin listesini alın.
Task<List<string>> GetTableNamesAsync(
string connectionString,
DatabaseType databaseType
)
GetTableSchemaAsync
Belirli bir tablo için şema bilgilerini alın.
Task<string> GetTableSchemaAsync(
string connectionString,
string tableName,
DatabaseType databaseType
)
ValidateConnectionAsync
Veritabanı bağlantısını doğrulayın.
Task<bool> ValidateConnectionAsync(
string connectionString,
DatabaseType databaseType
)
Örnek:
bool isValid = await _databaseService.ValidateConnectionAsync(
"Server=localhost;Database=MyDb;Trusted_Connection=true;",
DatabaseType.SqlServer
);
if (isValid)
{
Console.WriteLine("Bağlantı başarılı!");
}
GetSupportedDatabaseTypes
Desteklenen veritabanı türlerinin listesini alın.
IEnumerable<DatabaseType> GetSupportedDatabaseTypes()
GetSupportedDatabaseFileExtensions
Desteklenen veritabanı dosya uzantılarının listesini alın.
IEnumerable<string> GetSupportedDatabaseFileExtensions()
ClearMemoryCache
Bellek önbelleğini temizleyin.
void ClearMemoryCache()
ISemanticSearchService
Amaç: Gelişmiş semantik arama ve benzerlik hesaplama
Namespace: SmartRAG.Interfaces.Search
Metodlar
CalculateEnhancedSemanticSimilarityAsync
Gelişmiş semantik benzerlik skoru hesaplayın.
Task<double> CalculateEnhancedSemanticSimilarityAsync(
string query,
string documentContent,
CancellationToken cancellationToken = default
)
Örnek:
var similarity = await _semanticSearchService.CalculateEnhancedSemanticSimilarityAsync(
"machine learning algorithms",
"artificial intelligence and neural networks",
cancellationToken
);
Console.WriteLine($"Benzerlik Skoru: {similarity:F2}");
IContextExpansionService
Amaç: Aynı dokümandaki bitişik chunk’ları dahil ederek doküman chunk context’ini genişletme
Namespace: SmartRAG.Interfaces.Search
Metodlar
ExpandContextAsync
Aynı dokümandaki bitişik chunk’ları dahil ederek context’i genişletir. Bu, bir başlık bir chunk’ta ve içerik bir sonraki chunk’ta olsa bile, her ikisinin de arama sonuçlarına dahil edilmesini sağlar.
Task<List<DocumentChunk>> ExpandContextAsync(
List<DocumentChunk> chunks,
int contextWindow = 2
)
Parametreler:
chunks(List): Arama ile bulunan başlangıç chunk'ları contextWindow(int): Bulunan her chunk’ın öncesi ve sonrasına dahil edilecek bitişik chunk sayısı (varsayılan: 2, maksimum: 5)
Döndürür: Context ile genişletilmiş chunk listesi, doküman ID ve chunk index’e göre sıralanmış
Örnek:
// İlgili chunk'ları ara
var chunks = await _searchService.SearchDocumentsAsync("SRS bakımı", maxResults: 5);
// Context'i genişletmek için bitişik chunk'ları dahil et
var expandedChunks = await _contextExpansion.ExpandContextAsync(chunks, contextWindow: 2);
// Artık expandedChunks başlık chunk'ını VE içerik chunk'larını içeriyor
foreach (var chunk in expandedChunks)
{
Console.WriteLine($"Chunk {chunk.ChunkIndex}: {chunk.Content.Substring(0, 100)}...");
}
Not: Bu servis, RAG cevapları oluştururken DocumentSearchService tarafından otomatik olarak kullanılır. Sadece başlıkların bulunup karşılık gelen içeriğin bulunmadığı durumları önlemeye yardımcı olur.
IAIService
Amaç: AI provider’ları ile etkileşim
Namespace: SmartRAG.Interfaces.AI
Metodlar
GenerateResponseAsync
AI’dan yanıt oluşturun.
Task<string> GenerateResponseAsync(
string prompt,
CancellationToken cancellationToken = default
)
GenerateEmbeddingsAsync
Tek bir metin için embedding oluşturun.
Task<float[]> GenerateEmbeddingsAsync(
string text,
CancellationToken cancellationToken = default
)
GenerateEmbeddingsBatchAsync
Birden fazla metin için toplu embedding oluşturun.
Task<List<float[]>> GenerateEmbeddingsBatchAsync(
List<string> texts,
CancellationToken cancellationToken = default
)
Örnek:
var texts = new List<string>
{
"Machine learning is fascinating",
"AI will change the world",
"Deep learning models are powerful"
};
var embeddings = await _aiService.GenerateEmbeddingsBatchAsync(texts);
Console.WriteLine($"Oluşturulan embedding sayısı: {embeddings.Count}");
Veri Modelleri
SearchOptions
İstek başına arama yapılandırması ile arama tipleri üzerinde detaylı kontrol.
public class SearchOptions
{
public bool EnableDatabaseSearch { get; set; } = true;
public bool EnableDocumentSearch { get; set; } = true;
public bool EnableAudioSearch { get; set; } = true;
public bool EnableImageSearch { get; set; } = true;
public string? PreferredLanguage { get; set; }
public static SearchOptions Default => new SearchOptions();
public static SearchOptions FromConfig(SmartRagOptions options);
}
Özellikler:
EnableDatabaseSearch(bool): Veritabanlarında arama yapmayı etkinleştir (varsayılan: true)EnableDocumentSearch(bool): Metin dokümanlarında arama yapmayı etkinleştir (varsayılan: true)EnableAudioSearch(bool): Ses dosyalarında transkripsiyon ile arama yapmayı etkinleştir (varsayılan: true)EnableImageSearch(bool): Görüntülerde OCR ile arama yapmayı etkinleştir (varsayılan: true)PreferredLanguage(string?): AI yanıtları için ISO 639-1 dil kodu (örn: “tr”, “en”, “de”)
Statik Metodlar:
Default: Tüm özellikler etkin varsayılan arama seçenekleri oluştururFromConfig(SmartRagOptions): Global yapılandırmadan arama seçenekleri oluşturur
Örnek:
// Özel arama seçenekleri
var options = new SearchOptions
{
EnableDatabaseSearch = true,
EnableDocumentSearch = false,
EnableAudioSearch = false,
EnableImageSearch = false,
PreferredLanguage = "tr"
};
var response = await _searchService.QueryIntelligenceAsync(
"En iyi müşterileri göster",
maxResults: 5,
options: options
);
// Global yapılandırmayı kullan
var globalOptions = SearchOptions.FromConfig(_smartRagOptions);
var response2 = await _searchService.QueryIntelligenceAsync(
"Her şeyde ara",
maxResults: 5,
options: globalOptions
);
Bayrak Tabanlı Filtreleme:
Hızlı arama tipi seçimi için sorgu string bayrak ayrıştırması uygulayabilirsiniz:
private SearchOptions? ParseSearchOptions(string input, out string cleanQuery)
{
cleanQuery = input;
var hasDocumentFlag = input.Contains("-d ", StringComparison.OrdinalIgnoreCase)
|| input.EndsWith("-d", StringComparison.OrdinalIgnoreCase);
var hasDatabaseFlag = input.Contains("-db ", StringComparison.OrdinalIgnoreCase)
|| input.EndsWith("-db", StringComparison.OrdinalIgnoreCase);
var hasAudioFlag = input.Contains("-a ", StringComparison.OrdinalIgnoreCase)
|| input.EndsWith("-a", StringComparison.OrdinalIgnoreCase);
var hasImageFlag = input.Contains("-i ", StringComparison.OrdinalIgnoreCase)
|| input.EndsWith("-i", StringComparison.OrdinalIgnoreCase);
if (!hasDocumentFlag && !hasDatabaseFlag && !hasAudioFlag && !hasImageFlag)
{
return null; // Varsayılanı kullan
}
var options = new SearchOptions
{
EnableDocumentSearch = hasDocumentFlag,
EnableDatabaseSearch = hasDatabaseFlag,
EnableAudioSearch = hasAudioFlag,
EnableImageSearch = hasImageFlag
};
// Sorgudan bayrakları kaldır
var parts = input.Split(' ');
var cleanParts = parts.Where(p =>
!p.Equals("-d", StringComparison.OrdinalIgnoreCase) &&
!p.Equals("-db", StringComparison.OrdinalIgnoreCase) &&
!p.Equals("-a", StringComparison.OrdinalIgnoreCase) &&
!p.Equals("-i", StringComparison.OrdinalIgnoreCase));
cleanQuery = string.Join(" ", cleanParts);
return options;
}
// Kullanım
string userQuery = "-db En iyi müşterileri göster";
var searchOptions = ParseSearchOptions(userQuery, out string cleanQuery);
// cleanQuery = "En iyi müşterileri göster"
// searchOptions.EnableDatabaseSearch = true, diğerleri = false
var response = await _searchService.QueryIntelligenceAsync(
cleanQuery,
maxResults: 5,
options: searchOptions
);
Mevcut Bayraklar:
-db: Sadece veritabanı araması-d: Sadece doküman (metin) araması-a: Sadece ses araması-i: Sadece görüntü araması- Bayraklar birleştirilebilir (örn:
-db -a= veritabanı + ses araması)
DatabaseConfig
Veritabanı yapılandırma modeli.
public class DatabaseConfig
{
public DatabaseType Type { get; set; }
public string ConnectionString { get; set; } = string.Empty;
public List<string> IncludedTables { get; set; } = new();
public List<string> ExcludedTables { get; set; } = new();
public int MaxRowsPerTable { get; set; } = 1000;
public bool SanitizeSensitiveData { get; set; } = true;
public int QueryTimeoutSeconds { get; set; } = 30;
public bool EnableSchemaAnalysis { get; set; } = true;
public int SchemaRefreshIntervalMinutes { get; set; } = 60;
}
Özellikler:
Type- Veritabanı türü (SqlServer, MySql, PostgreSQL, SQLite)ConnectionString- Bağlantı dizesiIncludedTables- Dahil edilecek tablolarExcludedTables- Hariç tutulacak tablolarMaxRowsPerTable- Tablo başına maksimum satır sayısıSanitizeSensitiveData- Hassas verileri temizleQueryTimeoutSeconds- Sorgu zaman aşımıEnableSchemaAnalysis- Şema analizini etkinleştirSchemaRefreshIntervalMinutes- Şema yenileme aralığı
RagResponse
Kaynaklarla AI tarafından üretilmiş yanıt.
public class RagResponse
{
public string Answer { get; set; } = string.Empty;
public List<DocumentChunk> Sources { get; set; } = new();
public double Confidence { get; set; }
public TimeSpan ProcessingTime { get; set; }
public Dictionary<string, object> Metadata { get; set; } = new();
}
Özellikler:
Answer- AI tarafından üretilen yanıtSources- Yanıt için kullanılan kaynak chunk’larConfidence- Yanıtın güven skoru (0.0-1.0)ProcessingTime- İşlem süresiMetadata- Ek meta veriler
DocumentChunk
İlgililik skoru ile doküman parçası.
public class DocumentChunk
{
public string Id { get; set; } // Parça ID
public string DocumentId { get; set; } // Üst doküman ID
public string Content { get; set; } // Parça metin içeriği
public List<float> Embedding { get; set; } // Vektör embedding
public double RelevanceScore { get; set; } // Benzerlik skoru (0-1)
public int ChunkIndex { get; set; } // Dokümandaki pozisyon
}
SearchOptions
İstek başına arama yapılandırması ile arama tipleri üzerinde detaylı kontrol.
public class SearchOptions
{
public bool EnableDatabaseSearch { get; set; } = true;
public bool EnableDocumentSearch { get; set; } = true;
public bool EnableAudioSearch { get; set; } = true;
public bool EnableImageSearch { get; set; } = true;
public string? PreferredLanguage { get; set; }
public static SearchOptions Default => new SearchOptions();
public static SearchOptions FromConfig(SmartRagOptions options);
}
Özellikler:
EnableDatabaseSearch(bool): Veritabanlarında arama yapmayı etkinleştir (varsayılan: true)EnableDocumentSearch(bool): Metin dokümanlarında arama yapmayı etkinleştir (varsayılan: true)EnableAudioSearch(bool): Ses dosyalarında transkripsiyon ile arama yapmayı etkinleştir (varsayılan: true)EnableImageSearch(bool): Görüntülerde OCR ile arama yapmayı etkinleştir (varsayılan: true)PreferredLanguage(string?): AI yanıtları için ISO 639-1 dil kodu (örn: “tr”, “en”, “de”)
Statik Metodlar:
Default: Tüm özellikler etkin varsayılan arama seçenekleri oluştururFromConfig(SmartRagOptions): Global yapılandırmadan arama seçenekleri oluşturur
Örnek:
// Özel arama seçenekleri
var options = new SearchOptions
{
EnableDatabaseSearch = true,
EnableDocumentSearch = false,
EnableAudioSearch = false,
EnableImageSearch = false,
PreferredLanguage = "tr"
};
var response = await _searchService.QueryIntelligenceAsync(
"En iyi müşterileri göster",
maxResults: 5,
options: options
);
Bayrak Tabanlı Filtreleme:
Hızlı arama tipi seçimi için sorgu string bayrak ayrıştırması uygulayabilirsiniz. Detaylar için Examples sayfasına bakın.
Mevcut Bayraklar:
-db: Sadece veritabanı araması-d: Sadece doküman (metin) araması-a: Sadece ses araması-i: Sadece görüntü araması- Bayraklar birleştirilebilir (örn:
-db -a= veritabanı + ses araması)
Document
Metadata ile doküman varlığı.
public class Document
{
public Guid Id { get; set; } // Doküman ID
public string FileName { get; set; } // Orijinal dosya adı
public string ContentType { get; set; } // MIME tipi
public long FileSize { get; set; } // Byte cinsinden dosya boyutu
public DateTime UploadedAt { get; set; } // Yükleme zaman damgası
public string UploadedBy { get; set; } // Kullanıcı tanımlayıcısı
public string Content { get; set; } // Çıkarılan metin içeriği
public List<DocumentChunk> Chunks { get; set; } // Doküman parçaları
}
Enumerasyonlar
AIProvider
Desteklenen AI sağlayıcıları.
public enum AIProvider
{
OpenAI, // OpenAI GPT modelleri
Anthropic, // Anthropic Claude modelleri
Gemini, // Google Gemini modelleri
AzureOpenAI, // Azure OpenAI servisi
Custom // Özel/Ollama/LM Studio/OpenRouter
}
StorageProvider
Doküman ve vektör verisi kalıcılığı için desteklenen depolama backend’leri.
public enum StorageProvider
{
InMemory, // RAM depolama (kalıcı değil, test ve geliştirme için)
Redis, // Yüksek performanslı önbellek ve depolama
Qdrant // Gelişmiş vektör arama yetenekleri için vektör veritabanı
}
Not: SQLite ve FileSystem, StorageProvider seçenekleri olarak mevcut değildir. Bunlar yalnızca konuşma geçmişi depolama için ConversationStorageProvider seçenekleri olarak mevcuttur.
DatabaseType
Desteklenen veritabanı tipleri.
public enum DatabaseType
{
SQLite, // SQLite gömülü veritabanı
SqlServer, // Microsoft SQL Server
MySQL, // MySQL / MariaDB
PostgreSQL // PostgreSQL
}
RetryPolicy
Başarısız istekler için yeniden deneme politikaları.
public enum RetryPolicy
{
None, // Yeniden deneme yok
FixedDelay, // Sabit gecikme
LinearBackoff, // Doğrusal artan gecikme
ExponentialBackoff // Üssel artan gecikme (önerilen)
}
Kullanım Desenleri
Dependency Injection
Servislerinizde/controller’larınızda interface’leri enjekte edin:
public class MyService
{
private readonly IDocumentSearchService _searchService;
private readonly IDocumentService _documentService;
private readonly IDatabaseParserService _databaseService;
public MyService(
IDocumentSearchService searchService,
IDocumentService documentService,
IDatabaseParserService databaseService)
{
_searchService = searchService;
_documentService = documentService;
_databaseService = databaseService;
}
public async Task<string> ProcessQuery(string query)
{
var response = await _searchService.QueryIntelligenceAsync(query);
return response.Answer;
}
}
Hata Yönetimi
try
{
var response = await _searchService.QueryIntelligenceAsync(query);
return Ok(response);
}
catch (SmartRagException ex)
{
// SmartRAG'e özgü istisnalar
_logger.LogError(ex, "SmartRAG hatası: {Message}", ex.Message);
return BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
// Genel istisnalar
_logger.LogError(ex, "Beklenmeyen hata");
return StatusCode(500, "Sunucu hatası");
}
Async/Await En İyi Pratikleri
// ✅ İYİ - Async/await kullan
public async Task<SearchResult> SearchAsync(string query)
{
var embedding = await _embeddingService.GenerateEmbeddingAsync(query);
var results = await _repository.SearchAsync(embedding);
return results;
}
// ❌ KÖTÜ - Blocking call
public SearchResult Search(string query)
{
var embedding = _embeddingService.GenerateEmbeddingAsync(query).Result;
var results = _repository.SearchAsync(embedding).Result;
return results;
}
Performans İpuçları
Performans Optimizasyonu
- Chunk Boyutu: Optimal denge için 500-1000 karakter
- MaxResults: Genellikle 5-10 parça yeterli
- Toplu İşlemler: Birden fazla dosya için
UploadDocumentsAsynckullanın - Depolama: Üretim için Qdrant veya Redis kullanın (InMemory değil)
- Önbellekleme: Daha iyi performans için konuşma depolamayı etkinleştirin
- Veritabanı Limitleri: Makul MaxRowsPerTable ayarlayın (1000-5000)
Sonraki Adımlar
Changelog
Tüm versiyonlardaki yeni özellikleri, iyileştirmeleri ve breaking change'leri takip edin.
Changelog'u GörüntüleGelişmiş Interface’ler
IMultiDatabaseQueryCoordinator
Amaç: AI kullanarak çoklu veritabanı sorgularını koordine eder
Namespace: SmartRAG.Interfaces.Database
Bu interface, doğal dil kullanarak birden fazla veritabanına aynı anda sorgu yapmayı sağlar. AI sorguyu analiz eder, hangi veritabanları ve tablolara erişileceğini belirler, optimize edilmiş SQL sorguları oluşturur ve sonuçları tutarlı bir yanıt halinde birleştirir.
Metodlar
QueryMultipleDatabasesAsync
Tam bir akıllı sorguyu çalıştırır: intent analizi + yürütme + sonuç birleştirme.
Overload 1: Otomatik intent analizi ile tam sorgu
Task<RagResponse> QueryMultipleDatabasesAsync(
string userQuery,
int maxResults = 5
)
Overload 2: Önceden analiz edilmiş intent ile sorgu (gereksiz AI çağrılarını önler)
Task<RagResponse> QueryMultipleDatabasesAsync(
string userQuery,
QueryIntent preAnalyzedIntent,
int maxResults = 5
)
Parametreler:
userQuery(string): Doğal dil kullanıcı sorgusupreAnalyzedIntent(QueryIntent, opsiyonel): Gereksiz AI çağrılarını önlemek için önceden analiz edilmiş sorgu intent’imaxResults(int): Döndürülecek maksimum sonuç sayısı (varsayılan: 5)
Döndürür: Birden fazla veritabanından verilerle AI üretilmiş yanıt içeren RagResponse
Örnek 1 - Otomatik Intent Analizi:
var response = await _coordinator.QueryMultipleDatabasesAsync(
"TableA kayıtlarını ve bunların Database1'den gelen TableB detaylarını göster"
);
Console.WriteLine(response.Answer);
// Birden fazla veritabanından gelen veriler birleştirilmiş AI cevabı
Örnek 2 - Önceden Analiz Edilmiş Intent (Performans Optimizasyonu):
// Intent'i bir kez analiz et
var intent = await _queryIntentAnalyzer.AnalyzeQueryIntentAsync(
"TableA kayıtlarını ve bunların Database1'den gelen TableB detaylarını göster"
);
// Gereksiz AI çağrılarını önlemek için önceden analiz edilmiş intent'i kullan
var response = await _coordinator.QueryMultipleDatabasesAsync(
"TableA kayıtlarını ve bunların Database1'den gelen TableB detaylarını göster",
intent,
maxResults: 10
);
Console.WriteLine(response.Answer);
AnalyzeQueryIntentAsync (Deprecated)
'da Deprecated
Bunun yerine IQueryIntentAnalyzer.AnalyzeQueryIntentAsync kullanın. Bu method v4.0.0'da kaldırılacak.
Kullanıcı sorgusunu analiz eden ve hangi veritabanları/tabloları sorgulayacağını belirleyen eski method.
[Obsolete("Use IQueryIntentAnalyzer.AnalyzeQueryIntentAsync instead. Will be removed in v4.0.0")]
Task<QueryIntent> AnalyzeQueryIntentAsync(string userQuery)
Parametreler:
userQuery(string): Doğal dil kullanıcı sorgusu
Dönen Değer: QueryIntent veritabanı yönlendirme bilgileri ile
Önerilen Kullanım:
// Bunun yerine IQueryIntentAnalyzer kullanın
var intent = await _queryIntentAnalyzer.AnalyzeQueryIntentAsync(
"Database1 ve Database2 arasındaki verileri karşılaştır"
);
Console.WriteLine($"Güven: {intent.Confidence}");
Console.WriteLine($"Cross-DB Join Gerekiyor: {intent.RequiresCrossDatabaseJoin}");
foreach (var dbQuery in intent.DatabaseQueries)
{
Console.WriteLine($"Veritabanı: {dbQuery.DatabaseName}");
Console.WriteLine($"Tablolar: {string.Join(", ", dbQuery.RequiredTables)}");
}
ExecuteMultiDatabaseQueryAsync
Sorgu intent’ine göre birden fazla veritabanında sorguları çalıştırır.
Task<MultiDatabaseQueryResult> ExecuteMultiDatabaseQueryAsync(
QueryIntent queryIntent
)
Parametreler:
queryIntent(QueryIntent): Analiz edilmiş sorgu intent’i
Dönen Değer: MultiDatabaseQueryResult tüm veritabanlarından birleştirilmiş sonuçlarla
GenerateDatabaseQueriesAsync
Intent’e göre her veritabanı için optimize edilmiş SQL sorguları oluşturur.
Task<QueryIntent> GenerateDatabaseQueriesAsync(QueryIntent queryIntent)
Parametreler:
queryIntent(QueryIntent): SQL oluşturulacak sorgu intent’i
Dönen Değer: Oluşturulmuş SQL sorguları ile güncellenmiş QueryIntent
Not: MergeResultsAsync, IMultiDatabaseQueryCoordinator interface’inde değil, IResultMerger interface’inde mevcuttur. Coordinator, result merger’ı dahili olarak otomatik kullanır.
Generic Sorgu Örnekleri
Tüm örnekler generic placeholder isimler kullanır (TableA, TableB, Database1). Asla domain-specific isimler kullanılmaz (Products, Orders, Customers gibi).
IDatabaseConnectionManager
Amaç: Konfigürasyondan veritabanı bağlantılarını yönetir
Namespace: SmartRAG.Interfaces.Document
Veritabanı bağlantı yaşam döngüsü, doğrulama ve runtime yönetimini ele alır.
Metodlar
InitializeAsync
Konfigürasyondan tüm veritabanı bağlantılarını başlatır.
Task InitializeAsync()
Örnek:
await _connectionManager.InitializeAsync();
Console.WriteLine("Tüm veritabanı bağlantıları başlatıldı");
GetAllConnectionsAsync
Konfigüre edilmiş tüm veritabanı bağlantılarını alır.
Task<List<DatabaseConnectionConfig>> GetAllConnectionsAsync()
Döndürür: Tüm veritabanı bağlantı konfigürasyonları listesi
GetConnectionAsync
ID’ye göre belirli bir bağlantıyı alır.
Task<DatabaseConnectionConfig> GetConnectionAsync(string databaseId)
Parametreler:
databaseId(string): Veritabanı tanımlayıcısı
Dönen Değer: Bağlantı yapılandırması veya bulunamazsa null
ValidateConnectionAsync
Belirli bir bağlantıyı doğrular.
Task<bool> ValidateConnectionAsync(string databaseId)
Parametreler:
databaseId(string): Veritabanı tanımlayıcısı
Dönen Değer: Bağlantı geçerliyse true, aksi takdirde false
Örnek:
bool isValid = await _connectionManager.ValidateConnectionAsync("database-1");
if (isValid)
{
Console.WriteLine("Bağlantı geçerli");
}
GetDatabaseIdAsync
Bağlantıdan veritabanı ID’sini alır (Name sağlanmamışsa otomatik oluşturur).
Task<string> GetDatabaseIdAsync(DatabaseConnectionConfig connectionConfig)
Parametreler:
connectionConfig(DatabaseConnectionConfig): Bağlantı yapılandırması
Dönen Değer: Benzersiz veritabanı tanımlayıcısı
Örnek:
var config = new DatabaseConnectionConfig
{
Name = "SalesDB",
ConnectionString = "Server=localhost;Database=Sales;Trusted_Connection=true;",
DatabaseType = DatabaseType.SqlServer
};
var databaseId = await _connectionManager.GetDatabaseIdAsync(config);
Console.WriteLine($"Veritabanı ID: {databaseId}");
IDatabaseSchemaAnalyzer
Amaç: Veritabanı şemalarını analiz eder ve akıllı metadata oluşturur
Namespace: SmartRAG.Interfaces.Database
Tabloları, sütunları, ilişkileri içeren kapsamlı şema bilgisini çıkarır ve AI destekli özetler oluşturur.
Metodlar
AnalyzeDatabaseSchemaAsync
Bir veritabanı bağlantısını analiz eder ve kapsamlı şema bilgisi çıkarır.
Task<DatabaseSchemaInfo> AnalyzeDatabaseSchemaAsync(
DatabaseConnectionConfig connectionConfig
)
Parametreler:
connectionConfig(DatabaseConnectionConfig): Veritabanı bağlantı konfigürasyonu
Döndürür: Tablolar, sütunlar, foreign key’ler ve AI özetler dahil tam DatabaseSchemaInfo
Örnek:
var config = new DatabaseConnectionConfig
{
ConnectionString = "Server=localhost;Database=Northwind;Trusted_Connection=true;",
DatabaseType = DatabaseType.SqlServer
};
var schemaInfo = await _schemaAnalyzer.AnalyzeDatabaseSchemaAsync(config);
Console.WriteLine($"Veritabanı: {schemaInfo.DatabaseName}");
Console.WriteLine($"Tablo Sayısı: {schemaInfo.Tables.Count}");
Console.WriteLine($"Toplam Satır: {schemaInfo.TotalRowCount:N0}");
Console.WriteLine($"AI Özeti: {schemaInfo.AISummary}");
GetAllSchemasAsync
Tüm analiz edilmiş veritabanı şemalarını alır.
Task<List<DatabaseSchemaInfo>> GetAllSchemasAsync()
Dönen Değer: Bellekte bulunan tüm veritabanı şemalarının listesi
GetSchemaAsync
Belirli bir veritabanı için şemayı alır.
Task<DatabaseSchemaInfo> GetSchemaAsync(string databaseId)
Parametreler:
databaseId(string): Veritabanı tanımlayıcısı
Dönen Değer: Veritabanı şema bilgisi veya bulunamazsa null
GenerateAISummaryAsync
Veritabanı şeması için AI destekli özet oluşturur.
Task<string> GenerateAISummaryAsync(DatabaseSchemaInfo schemaInfo)
Parametreler:
schemaInfo(DatabaseSchemaInfo): Şema bilgisi
Dönen Değer: AI tarafından oluşturulan şema özeti
IAudioParserService
Amaç: Whisper.net ile ses transkripsiyonu (%100 yerel işleme)
Namespace: SmartRAG.Interfaces.Parser
Whisper.net kullanarak yerel ses-metin transkripsiyonu sağlar. Tüm işlem lokalde yapılır.
Gizlilik Notu
Ses transkripsiyonu %100 yerel işleme için Whisper.net kullanır. Hiçbir ses verisi hiçbir zaman harici servislere gönderilmez. GDPR/KVKK/HIPAA uyumlu.
Metodlar
TranscribeAudioAsync
Bir akıştan ses içeriğini metne transcribe eder.
Task<AudioTranscriptionResult> TranscribeAudioAsync(
Stream audioStream,
string fileName,
string language = null
)
Parametreler:
audioStream(Stream): Transcribe edilecek ses akışıfileName(string): Format tespiti için ses dosyası adılanguage(string, isteğe bağlı): Transkripsiyon için dil kodu (örn. “tr”, “en”, “auto”)
Döndürür: Transcribe edilmiş metin, güven skoru ve metadata ile AudioTranscriptionResult
Örnek:
using var audioStream = File.OpenRead("toplanti.mp3");
var result = await _audioParser.TranscribeAudioAsync(
audioStream,
"toplanti.mp3",
language: "tr"
);
Console.WriteLine($"Transkripsiyon: {result.Text}");
Console.WriteLine($"Güven: {result.Confidence:P}");
IImageParserService
Amaç: Tesseract kullanarak görüntülerden OCR metin çıkarma
Namespace: SmartRAG.Interfaces.Parser
Görüntülerden metin çıkarmak için optik karakter tanıma (OCR) sağlar. Tüm işlem Tesseract kullanarak lokaldir.
Metodlar
ExtractTextFromImageAsync
OCR kullanarak bir görüntüden metin çıkarır.
Task<string> ExtractTextFromImageAsync(
Stream imageStream,
string language = null
)
Parametreler:
imageStream(Stream): İşlenecek görüntü akışılanguage(string, opsiyonel): OCR için dil kodu (örn: “eng”, “tur”). Null ise sistem yerel ayarını otomatik kullanır
Döndürür: Çıkarılan metin (string)
Örnek:
using var imageStream = File.OpenRead("dokuman.png");
var text = await _imageParser.ExtractTextFromImageAsync(
imageStream,
language: "tur"
);
Console.WriteLine($"Çıkarılan Metin: {text}");
ExtractTextWithConfidenceAsync
Güven skorlarıyla görüntüden metin çıkarır.
Task<OcrResult> ExtractTextWithConfidenceAsync(
Stream imageStream,
string language = null
)
Parametreler:
imageStream(Stream): İşlenecek görüntü akışılanguage(string, opsiyonel): OCR için dil kodu (örn: “eng”, “tur”). Null ise sistem yerel ayarını otomatik kullanır
Döndürür: Çıkarılan metin, güven skorları ve metin bloklarıyla OcrResult
Örnek:
using var imageStream = File.OpenRead("fatura.jpg");
var result = await _imageParser.ExtractTextWithConfidenceAsync(
imageStream,
language: "tur"
);
Console.WriteLine($"Metin: {result.ExtractedText}");
Console.WriteLine($"Güven: {result.Confidence:P}");
PreprocessImageAsync
Daha iyi OCR sonuçları için görüntüyü ön işleme tabi tutar.
Task<Stream> PreprocessImageAsync(Stream imageStream)
Parametreler:
imageStream(Stream): Giriş görüntü akışı
Dönen Değer: Ön işleme tabi tutulmuş görüntü akışı
Ön İşleme Adımları:
- Gri tonlama dönüşümü
- Kontrast artırma
- Gürültü azaltma
- İkili hale getirme
Örnek:
using var originalStream = File.OpenRead("dusuk-kalite.jpg");
var preprocessedStream = await _imageParser.PreprocessImageAsync(originalStream);
var result = await _imageParser.ExtractTextFromImageAsync(preprocessedStream);
Console.WriteLine($"Ön işleme sonrası metin: {result}");
CorrectCurrencySymbols
Metindeki para birimi sembolü yanlış okumalarını düzeltir (örn: % → ₺, $, €). Bu method, OCR sonuçlarında kullanılan aynı para birimi düzeltme mantığını herhangi bir metne uygular.
string CorrectCurrencySymbols(string text, string language = null)
Parametreler:
text(string): Düzeltilecek metinlanguage(string, opsiyonel): Context için dil kodu (loglama için kullanılır)
Döndürür: Düzeltilmiş para birimi sembolleri ile metin
Örnek:
var correctedText = _imageParser.CorrectCurrencySymbols("Fiyat: 100%", "tr");
Console.WriteLine(correctedText); // "Fiyat: 100₺"
Desteklenen Görüntü Formatları:
- JPEG, PNG, GIF, BMP, TIFF, WEBP
Strategy Pattern Interface’leri
SmartRAG , genişletilebilirlik ve özelleştirme için Strategy Pattern’i tanıtıyor.
ISqlDialectStrategy
Amaç: Veritabanına özgü SQL üretimi ve doğrulama
Namespace: SmartRAG.Interfaces.Database.Strategies
Veritabanına özgü SQL optimizasyonu ve özel veritabanı desteği sağlar.
Özellikler
DatabaseType DatabaseType { get; }
Metodlar
BuildSystemPrompt
Bu veritabanı diyalektine özgü SQL üretimi için AI sistem prompt’u oluşturur.
string BuildSystemPrompt(DatabaseSchemaInfo schema, string userQuery)
ValidateSyntax
Bu belirli diyalekt için SQL sözdizimini doğrular.
bool ValidateSyntax(string sql, out string errorMessage)
FormatSql
SQL sorgusunu diyalekte özgü kurallara göre biçimlendirir.
string FormatSql(string sql)
GetLimitClause
Bu diyalekt için LIMIT cümlesi formatını alır.
string GetLimitClause(int limit)
Döndürür:
- SQLite/MySQL:
LIMIT {limit} - SQL Server:
TOP {limit} - PostgreSQL:
LIMIT {limit}
Yerleşik Uygulamalar
SqliteDialectStrategy- SQLite için optimize edilmiş SQLPostgreSqlDialectStrategy- PostgreSQL için optimize edilmiş SQLMySqlDialectStrategy- MySQL/MariaDB için optimize edilmiş SQLSqlServerDialectStrategy- SQL Server için optimize edilmiş SQL
Özel Uygulama Örneği
Not: Bu kavramsal bir örnektir. Yeni bir veritabanı tipi desteği eklemek için:
DatabaseTypeenum’ına veritabanı tipini ekleyin- O veritabanı için
ISqlDialectStrategyimplementasyonu yapın - Dependency injection’da stratejiyi kaydedin
// Örnek: Özel veritabanı diyalekt stratejisi
public class CustomDialectStrategy : BaseSqlDialectStrategy
{
public override DatabaseType DatabaseType => DatabaseType.Custom; // Custom'ın enum'a eklendiği varsayılıyor
public override string BuildSystemPrompt(DatabaseSchemaInfo schema, string userQuery)
{
return $"SQL oluştur: {userQuery}\\nŞema: {schema}";
}
public override bool ValidateSyntax(string sql, out string errorMessage)
{
// Veritabanına özgü doğrulama
errorMessage = null;
return true;
}
public override string FormatSql(string sql)
{
// Veritabanına özgü biçimlendirme
return sql;
}
public override string GetLimitClause(int limit)
{
// Veritabanına özgü LIMIT clause formatı
return $"LIMIT {limit}";
}
}
IScoringStrategy
Amaç: Özelleştirilebilir doküman ilgililik skorlaması
Namespace: SmartRAG.Interfaces.Search.Strategies
Arama sonuçları için özel skorlama algoritmaları sağlar.
Metodlar
CalculateScoreAsync
Bir doküman parçası için ilgililik skoru hesaplar.
Task<double> CalculateScoreAsync(
string query,
DocumentChunk chunk,
List<float> queryEmbedding
)
Parametreler:
query(string): Arama sorgusuchunk(DocumentChunk): Skorlanacak doküman parçasıqueryEmbedding(List): Sorgu embedding vektörü
Döndürür: 0.0 ile 1.0 arasında skor
Yerleşik Uygulama
HybridScoringStrategy (varsayılan):
- %80 semantik benzerlik (embedding’lerin kosinüs benzerliği)
- %20 anahtar kelime eşleşmesi (BM25 benzeri skorlama)
Özel Uygulama Örneği
public class SemanticOnlyScoringStrategy : IScoringStrategy
{
public async Task<double> CalculateScoreAsync(
string query,
DocumentChunk chunk,
List<float> queryEmbedding)
{
// Saf semantik benzerlik (%100 embedding tabanlı)
return CosineSimilarity(queryEmbedding, chunk.Embedding);
}
private double CosineSimilarity(List<float> a, List<float> b)
{
double dotProduct = 0, normA = 0, normB = 0;
for (int i = 0; i < a.Count; i++)
{
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dotProduct / (Math.Sqrt(normA) * Math.Sqrt(normB));
}
}
IFileParser
Amaç: Belirli dosya formatlarını ayrıştırma stratejisi
Namespace: SmartRAG.Interfaces.Parser.Strategies
Özel dosya formatı ayrıştırıcıları sağlar.
Metodlar
ParseAsync
Bir dosyayı ayrıştırır ve içeriği çıkarır.
Task<FileParserResult> ParseAsync(Stream fileStream, string fileName)
CanParse
Bu ayrıştırıcının verilen dosyayı işleyip işleyemeyeceğini kontrol eder.
bool CanParse(string fileName, string contentType)
Yerleşik Uygulamalar
PdfFileParser- PDF dokümanlarıWordFileParser- Word dokümanları (.docx)ExcelFileParser- Excel elektronik tabloları (.xlsx)TextFileParser- Düz metin dosyalarıImageFileParser- OCR ile görsellerAudioFileParser- Ses transkripsiyonDatabaseFileParser- SQLite veritabanları
Özel Uygulama Örneği
public class MarkdownFileParser : IFileParser
{
public bool CanParse(string fileName, string contentType)
{
return fileName.EndsWith(".md", StringComparison.OrdinalIgnoreCase) ||
contentType == "text/markdown";
}
public async Task<FileParserResult> ParseAsync(Stream fileStream, string fileName)
{
using var reader = new StreamReader(fileStream);
var content = await reader.ReadToEndAsync();
// Düz metin için markdown sözdizimini kaldır
var plainText = StripMarkdownSyntax(content);
return new FileParserResult
{
Content = plainText,
Success = true
};
}
private string StripMarkdownSyntax(string markdown)
{
// Markdown biçimlendirmesini kaldır
return Regex.Replace(markdown, @"[#*`\[\]()]", "");
}
}
Ek Servis Interface’leri
IConversationRepository
Amaç: Konuşma depolama için veri erişim katmanı
Namespace: SmartRAG.Interfaces.Storage
Daha iyi SRP uyumu için IDocumentRepository‘den ayrıldı.
Metodlar
Task<string> GetConversationHistoryAsync(string sessionId);
Task SaveConversationAsync(string sessionId, string history);
Task DeleteConversationAsync(string sessionId);
Task<bool> ConversationExistsAsync(string sessionId);
Uygulamalar
SqliteConversationRepositoryInMemoryConversationRepositoryFileSystemConversationRepositoryRedisConversationRepository
IAIConfigurationService
Amaç: AI sağlayıcı yapılandırma yönetimi
Namespace: SmartRAG.Interfaces.AI
Daha iyi SRP için yapılandırma yürütmeden ayrıldı.
Metodlar
AIProvider GetProvider();
string GetModel();
string GetEmbeddingModel();
int GetMaxTokens();
double GetTemperature();
IAIRequestExecutor
Amaç: Yeniden deneme/yedekleme ile AI istek yürütme
Namespace: SmartRAG.Interfaces.AI
Otomatik yeniden deneme ve yedekleme mantığı ile AI isteklerini işler.
Metodlar
Task<string> ExecuteRequestAsync(string prompt, CancellationToken cancellationToken = default);
Task<List<float>> ExecuteEmbeddingRequestAsync(string text, CancellationToken cancellationToken = default);
IQueryIntentAnalyzer
Amaç: Veritabanı yönlendirmesi için sorgu niyet analizi
Namespace: SmartRAG.Interfaces.Database
Veritabanı yönlendirme stratejisini belirlemek için sorguları analiz eder.
Metodlar
Task<QueryIntent> AnalyzeQueryIntentAsync(string userQuery);
IDatabaseQueryExecutor
Amaç: Birden fazla veritabanında sorgu yürütme
Namespace: SmartRAG.Interfaces.Database
Veritabanları arasında paralel sorgu yürütme.
Metodlar
Task<MultiDatabaseQueryResult> ExecuteMultiDatabaseQueryAsync(QueryIntent queryIntent);
IResultMerger
Amaç: Birden fazla veritabanından sonuçları birleştirme
Namespace: SmartRAG.Interfaces.Database
AI destekli sonuç birleştirme.
Metodlar
MergeResultsAsync
Birden fazla veritabanından gelen sonuçları tutarlı bir yanıta birleştirir.
Task<string> MergeResultsAsync(MultiDatabaseQueryResult queryResults, string originalQuery)
Parametreler:
queryResults(MultiDatabaseQueryResult): Birden fazla veritabanından gelen sonuçlaroriginalQuery(string): Orijinal kullanıcı sorgusu
Döndürür: Birleştirilmiş ve formatlanmış sonuçlar string olarak
GenerateFinalAnswerAsync
Birleştirilmiş veritabanı sonuçlarından nihai AI yanıtı oluşturur.
Task<RagResponse> GenerateFinalAnswerAsync(
string userQuery,
string mergedData,
MultiDatabaseQueryResult queryResults
)
Parametreler:
userQuery(string): Orijinal kullanıcı sorgusumergedData(string): Veritabanlarından birleştirilmiş veriqueryResults(MultiDatabaseQueryResult): Sorgu sonuçları
Döndürür: AI üretilmiş yanıt içeren RagResponse
ISQLQueryGenerator
Amaç: SQL sorguları oluşturma ve doğrulama
Namespace: SmartRAG.Interfaces.Database
Veritabanına özgü SQL için ISqlDialectStrategy kullanır.
Metodlar
Task<string> GenerateSqlAsync(string userQuery, DatabaseSchemaInfo schema, DatabaseType databaseType);
bool ValidateSql(string sql, DatabaseSchemaInfo schema, out string errorMessage);
IEmbeddingSearchService
Amaç: Embedding tabanlı semantik arama
Namespace: SmartRAG.Interfaces.Search
Temel embedding arama işlevselliği.
Metodlar
Task<List<DocumentChunk>> SearchByEmbeddingAsync(List<float> queryEmbedding, int maxResults = 5);
ISourceBuilderService
Amaç: Arama sonucu kaynakları oluşturma
Namespace: SmartRAG.Interfaces.Search
Chunk’lardan SearchSource nesneleri oluşturur.
Metodlar
List<SearchSource> BuildSources(List<DocumentChunk> chunks);
IAudioParserService
Amaç: Ses dosyası ayrıştırma ve transkripsiyon
Namespace: SmartRAG.Interfaces.Parser
Metodlar
Task<AudioTranscriptionResult> TranscribeAudioAsync(Stream audioStream, string fileName, string language = null);
Parametreler:
audioStream(Stream): Transkripsiyon yapılacak ses stream’ifileName(string): Format algılama için ses dosyasının adılanguage(string, opsiyonel): Transkripsiyon için dil kodu (örn: “tr-TR”, “en-US”, “auto”)
Döndürür: Transkripsiyon edilmiş metin, güven skoru ve metadata içeren AudioTranscriptionResult
IImageParserService
Amaç: Görüntü OCR işleme
Namespace: SmartRAG.Interfaces.Parser
Metodlar
Task<string> ExtractTextFromImageAsync(Stream imageStream, string language = null);
Task<OcrResult> ExtractTextWithConfidenceAsync(Stream imageStream, string language = null);
Task<Stream> PreprocessImageAsync(Stream imageStream);
string CorrectCurrencySymbols(string text, string language = null);
Parametreler:
imageStream(Stream): İşlenecek görüntü stream’ilanguage(string, opsiyonel): OCR için dil kodu (örn: “eng”, “tur”). Null ise sistem yerel ayarını otomatik kullanırtext(string): Para birimi sembollerini düzeltilecek metin
Döndürür:
ExtractTextFromImageAsync: String olarak çıkarılmış metinExtractTextWithConfidenceAsync: Metin, güven skorları ve metin blokları içerenOcrResultPreprocessImageAsync: Ön işlenmiş görüntü stream’iCorrectCurrencySymbols: Düzeltilmiş para birimi sembolleri ile metin (örn: % → ₺, $, €)
IAIProvider
Amaç: Metin üretimi ve embedding’ler için düşük seviye AI sağlayıcı arayüzü
Namespace: SmartRAG.Interfaces.AI
Birden fazla AI backend için sağlayıcı soyutlaması.
Metodlar
Task<string> GenerateTextAsync(string prompt, AIProviderConfig config);
Task<List<float>> GenerateEmbeddingAsync(string text, AIProviderConfig config);
Task<List<List<float>>> GenerateEmbeddingsBatchAsync(IEnumerable<string> texts, AIProviderConfig config);
Task<List<string>> ChunkTextAsync(string text, int maxChunkSize = 1000);
IAIProviderFactory
Amaç: AI sağlayıcı örnekleri oluşturmak için fabrika
Namespace: SmartRAG.Interfaces.AI
AI sağlayıcı oluşturma için fabrika deseni.
Metodlar
IAIProvider CreateProvider(AIProvider providerType);
IPromptBuilderService
Amaç: Farklı senaryolar için AI prompt’ları oluşturmak için servis
Namespace: SmartRAG.Interfaces.AI
Konuşma geçmişi desteği ile merkezi prompt oluşturma.
Metodlar
string BuildDocumentRagPrompt(string query, string context, string? conversationHistory = null, string? preferredLanguage = null);
string BuildHybridMergePrompt(string query, string? databaseContext, string? documentContext, string? conversationHistory = null, string? preferredLanguage = null);
string BuildConversationPrompt(string query, string? conversationHistory = null, string? preferredLanguage = null);
Parametreler:
query(string): Kullanıcı sorgusucontext(string): Doküman context’i (BuildDocumentRagPrompt için)databaseContext(string?, opsiyonel): Veritabanı sorgu sonuçları (BuildHybridMergePrompt için)documentContext(string?, opsiyonel): Doküman arama sonuçları (BuildHybridMergePrompt için)conversationHistory(string?, opsiyonel): Önceki konuşma turlarıpreferredLanguage(string?, opsiyonel): AI yanıt dili için tercih edilen dil kodu (örn: “tr”, “en”)
IDocumentRepository
Amaç: Doküman depolama işlemleri için repository arayüzü
Namespace: SmartRAG.Interfaces.Document
İş mantığından ayrılmış repository katmanı.
Metodlar
AddAsync
Depolamaya yeni bir doküman ekler.
Task<Document> AddAsync(Document document)
GetByIdAsync
Benzersiz tanımlayıcıya göre dokümanı alır.
Task<Document> GetByIdAsync(Guid id)
GetAllAsync
Depolamadan tüm dokümanları alır.
Task<List<Document>> GetAllAsync()
DeleteAsync
ID’ye göre depolamadan dokümanı kaldırır.
Task<bool> DeleteAsync(Guid id)
GetCountAsync
Depolamadaki toplam doküman sayısını alır.
Task<int> GetCountAsync()
SearchAsync
Sorgu string’i kullanarak dokümanları arar.
Task<List<DocumentChunk>> SearchAsync(string query, int maxResults = 5)
Parametreler:
query(string): Arama sorgu string’imaxResults(int): Döndürülecek maksimum sonuç sayısı (varsayılan: 5)
Döndürür: İlgili doküman chunk’larının listesi
ClearAllAsync
Depolamadan tüm dokümanları temizler (verimli toplu silme).
Task<bool> ClearAllAsync()
Döndürür: Tüm dokümanlar başarıyla temizlendiyse true
IDocumentScoringService
Amaç: Sorgu ilgisine göre doküman parçalarını puanlamak için servis
Namespace: SmartRAG.Interfaces.Document
Anahtar kelime ve semantik ilgi ile hibrit puanlama stratejisi.
Metodlar
List<DocumentChunk> ScoreChunks(List<DocumentChunk> chunks, string query, List<string> queryWords, List<string> potentialNames);
double CalculateKeywordRelevanceScore(string query, string content);
IAudioParserFactory
Amaç: Ses ayrıştırıcı servis örnekleri oluşturmak için fabrika
Namespace: SmartRAG.Interfaces.Parser
Ses ayrıştırıcı oluşturma için fabrika deseni.
Metodlar
IAudioParserService CreateAudioParser(AudioProvider provider);
IStorageFactory
Amaç: Doküman ve konuşma depolama repository’leri oluşturmak için fabrika
Namespace: SmartRAG.Interfaces.Storage
Tüm depolama işlemleri için birleşik fabrika.
Metodlar
IDocumentRepository CreateRepository(StorageConfig config);
IDocumentRepository CreateRepository(StorageProvider provider);
StorageProvider GetCurrentProvider();
IDocumentRepository GetCurrentRepository();
IConversationRepository CreateConversationRepository(StorageConfig config);
IConversationRepository CreateConversationRepository(StorageProvider provider);
IConversationRepository GetCurrentConversationRepository();
IQdrantCacheManager
Amaç: Qdrant işlemlerinde arama sonuçlarını önbelleğe almak için arayüz
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Performans optimizasyonu için arama sonuçlarını önbelleğe alma.
Metodlar
List<DocumentChunk> GetCachedResults(string queryHash);
void CacheResults(string queryHash, List<DocumentChunk> results);
void CleanupExpiredCache();
IQdrantCollectionManager
Amaç: Qdrant koleksiyonlarını ve doküman depolamayı yönetmek için arayüz
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Qdrant vektör veritabanı için koleksiyon yaşam döngüsü yönetimi.
Metodlar
Task EnsureCollectionExistsAsync();
Task CreateCollectionAsync(string collectionName, int vectorDimension);
Task EnsureDocumentCollectionExistsAsync(string collectionName, Document document);
Task<int> GetVectorDimensionAsync();
IQdrantEmbeddingService
Amaç: Metin içeriği için embedding’ler oluşturmak için arayüz
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Qdrant vektör depolama için embedding oluşturma.
Metodlar
Task<List<float>> GenerateEmbeddingAsync(string text);
Task<int> GetVectorDimensionAsync();
IQdrantSearchService
Amaç: Qdrant vektör veritabanında arama yapmak için arayüz
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Qdrant için vektör, metin ve hibrit arama yetenekleri.
Metodlar
Task<List<DocumentChunk>> SearchAsync(List<float> queryEmbedding, int maxResults);
Task<List<DocumentChunk>> FallbackTextSearchAsync(string query, int maxResults);
Task<List<DocumentChunk>> HybridSearchAsync(string query, int maxResults);
IQueryIntentClassifierService
Amaç: Sorgu niyetini sınıflandırmak için servis (konuşma vs bilgi)
Namespace: SmartRAG.Interfaces.Support
Hibrit yönlendirme için AI tabanlı sorgu niyet sınıflandırması.
Metodlar
Task<bool> IsGeneralConversationAsync(string query, string? conversationHistory = null);
bool TryParseCommand(string input, out QueryCommandType commandType, out string payload);
Komut Türleri:
QueryCommandType.None: Komut algılanmadıQueryCommandType.NewConversation:/newveya/resetkomutuQueryCommandType.ForceConversation:/convkomutu
ITextNormalizationService
Amaç: Metin normalizasyonu ve temizleme
Namespace: SmartRAG.Interfaces.Support
Metodlar
string NormalizeText(string text);
string RemoveExtraWhitespace(string text);