İçeriğe Geç

Mevzuat Anlamlı Arama

GET /api/v1/library/semantic

Mevzuat Anlamlı Arama

Cümle veya soru bazlı, niyet temelli mevzuat aramasıdır. Anahtar kelime eşleşmesi yerine vektör benzerliği + tam metin füzyonu kullanır; bu nedenle "müşteri şikayetlerinin yönetim süreci" gibi günlük dilde ifadelere doğal yanıt verir.

Hibrit boru hattı

  1. Sorgu, çok dilli Qwen3-Embedding-8B modeliyle 4096 boyutlu vektöre çevrilir (sorgu tarafında modelin instruct ön-eki uygulanır)
  2. Qdrant (vektör) + Postgres FTS (anahtar kelime) paralel olarak çalışır — her biri top-K = max(50, take*3) döner
  3. Sonuçlar RRF (Reciprocal Rank Fusion, k=60) ile birleştirilir
  4. Re-ranking: başlıkta sorgu kelimesi geçen sonuçlara +0.05, aktif filtreyle eşleşen etiket başına +0.10 ek puan eklenir

Filtreler tercih sinyalidir

institutionType, topic, department parametreleri eleme yapmaz — sadece sıralamada öne çekme/aşağı itme sinyali olarak kullanılır. Yani filtreyle eşleşmeyen sonuçlar yine listelenir, daha alta düşer. Bu davranış, anlamlı arama sonuçlarının çok dar bir filtre yüzünden tamamen kaybolmasını engeller.

/library (anahtar kelime) ile farkını burada vurgulamak gerek: orada filtreler sert filtredir; burada yumuşak sinyaldir.

Ancak bu yumuşaklık yalnızca institutionType / topic / department için geçerlidir. Uç nokta, geri getirmeden sonra iki sert eleme uygular: mülga mevzuatı koşulsuz eler (/library'deki legalStatus=all karşılığı burada yoktur) ve aynı kanunun farklı kaynaklardaki nüshalarını tek satıra indirir. Bu nedenle bir sayfa pageSize'dan az sonuç içerebilir; pagination.totalCount eleme öncesi sayıdır.

Hata ve hata ayıklama

search parametresi boş veya eksik gönderilirse uç nokta 400 VALIDATION_ERROR döner.

İsteğe X-Regvion-Debug-Search: 1 başlığını eklerseniz her sonuç ayrıca bir debug nesnesi taşır: semantic, keyword, titleBoost, tagBoost ve rrfRank. Başlık gönderilmezse bu alan null döner.

Sayfalama ve top-K sınırı

  • pageSize 1-50 arası (varsayılan 12)
  • Toplam top-K = 100 ile sınırlıdır; bunun ötesi sıralama gürültüsüdür
  • pagination.truncated = true döndüğünde, sınır aşıldığı için daha fazla sayfa istemenin manası yoktur

/library ile karşılaştırma

Özellik /library (anahtar kelime) /library/semantic (anlamlı)
Sorgu yapısı Token bazlı Cümle/soru bazlı
Filtre davranışı Sert (eler) Etiket filtreleri yumuşak (sinyal); mülga elemesi ve nüsha daraltması serttir
Eşleşme Postgres FTS (Türkçe kök + aksan duyarsız) + başlıkta ILIKE yedeği Vektör benzerliği + FTS füzyonu (RRF)
pageSize üst sınırı 100 50
Sıralama sort ile seçilir: date_desc / date_asc / title_asc / title_desc / relevance Sabit — relevance
Snippet <b> highlight, FTS headline <b> highlight, kelime tabanlı
obligationCount Gerçek yükümlülük sayısı Her zaman 0 — bu uçta doldurulmaz; sayı için /library/{id}/obligations

Listeleme veya filtreleme önceliğiniz varsa /library'yi, doğal dille soru sorduğunuzda /library/semantic'i tercih edin.

Parametreler

İsimKonumTipZorunluAçıklama
search Query string Evet Arama cümlesi.
institutionType Query integer Hayır Tercih sinyali — InstitutionType enum sayı değeri (1-22). Sonuçları dışlamaz, yeniden sıralar.
topic Query integer Hayır Tercih sinyali — TopicType enum sayı değeri (1-25).
department Query integer Hayır Tercih sinyali — DepartmentType enum sayı değeri (1-24).
page Query integer Hayır Sayfa numarası.
pageSize Query integer Hayır 1-50; varsayılan 12.
X-Regvion-Debug-Search Header string Hayır '1' gönderildiğinde her sonuca skor kırılımı eklenir: debug = { semantic, keyword, titleBoost, tagBoost, rrfRank }. Gönderilmezse bu alan null döner.

Yanıtlar

200 — Anlamlı arama sonuçları (top-K=100); pagination.truncated=true ise sınır aşılmıştır. Mülga mevzuat ve aynı kanunun diğer nüshaları geri getirmeden sonra elendiği için bir sayfa pageSize'dan az sonuç içerebilir; pagination.totalCount eleme öncesi sayıdır. 'X-Regvion-Debug-Search: 1' gönderildiyse her sonuç ayrıca debug skor kırılımını taşır.

400 — 'search' parametresi boş veya eksik (VALIDATION_ERROR).