Takip et

Ham Sağlık Metninden Bilgi Getirim Hattı Kurma

Ham sağlık verilerini işleyip çalışan bir bilgi getirimi (retrieval pipeline) sistemine dönüştürme adımlarını kod örnekleriyle keşfedin.

Ham Sağlık Metninden Bilgi Getirim Hattı Kurma

Ham sağlık verilerini işleyip çalışan bir bilgi getirimi (retrieval pipeline) sistemine dönüştürme adımlarını kod örnekleriyle keşfedin.

Sağlık sektöründe dijitalleşme hızı arttıkça, eldeki yapılandırılmamış veri miktarı da devasa boyutlara ulaştı. Hastane bilgi yönetim sistemlerinde (HBYS) biriken doktor notları, epikriz raporları, patoloji sonuçları ve e-Nabız benzeri platformlardaki hasta geçmişleri çoğu zaman düz metin formatındadır. Ancak bu ham metinler, işlenmedikçe klinik karar destek sistemleri için bir anlam ifade etmez. Peki, karmaşık ve düzensiz tıp dilini anlamlı, hızlı ve ölçeklenebilir bir bilgi getirim boru hattına (retrieval pipeline) nasıl dönüştürebiliriz? Bu yazımızda, ham sağlık metinlerini modern yapay zeka teknikleriyle çalışan bir vektör arama hattına dönüştürme sürecini adım adım ele alacağız.

Sağlık Verilerinde Ham Metin Dönüştürme Neden Kritik?

Sağlık verileri, genel dil modellerinin en çok zorlandığı alanların başında gelir. Tıp dilinde yoğun şekilde kullanılan kısaltmalar, Latince ve İngilizce terimlerin Türkçe cümle yapılarıyla harmanlanması ve yazım hataları standart metin işleme yaklaşımlarını yetersiz kılar. Bu nedenle, ham sağlık metnini (raw health text) doğrudan bir dil modeline beslemek hem yüksek maliyet yaratır hem de hatalı sonuçlara (hallucination) yol açar.

Ayrıca 6698 sayılı Kişisel Verilerin Korunması Kanunu (KVKK) uyarınca, hasta verilerinin anonimleştirilmesi yasal bir zorunluluktur. Ham metin üzerinde yapılan doğru bir ön işleme aşaması, hassas bilgileri maskedikten sonra veriyi vektör alanına aktarır. Böylece sistem, hem yasal düzenlemelere uyum sağlar hem de doğru bilgiye milisaniyeler içinde ulaşır.

Veri Durumu Arama Yaklaşımı Erişim Hızı Doğruluk Oranı
Ham Metin (Unstructured) SQL / Kelime Bazlı (BM25) Yavaş (Saniyeler) Düşük (Eş anlamlıları kaçırır)
İşlenmiş Vektör Verisi Semantik Vektör Araması Çok Hızlı (Milisaniyeler) Yüksek (Bağlamı anlar)

Sağlık Metinlerini Hazırlama: Temel Adımlar Nasıl Atılır?

Metin dönüştürme sürecinin ilk aşaması, ham veriyi temizlemek ve anlamsal bütünlüğü bozmadan küçük parçalara bölmektir (chunking). Sağlık metinlerinde rastgele bir noktadan metni bölmek, tıbbi bağlamı koparabilir. Örneğin, bir ilacın dozaj bilgisi ile yan etki bilgisi aynı parçada kalmalıdır.

İlk olarak metindeki hasta adı, TC kimlik numarası ve tarih gibi kişisel veriler maskelenir. Bu işlem için kural tabanlı düzenli ifadeler (regex) veya tıbbi varlık tanıma (Named Entity Recognition – NER) modelleri tercih edilir. Ardından, metin parçalama işlemine geçilir. Parçalama yaparken RecursiveCharacterTextSplitter benzeri yapılar kullanarak paragraf ve cümle sınırlarına öncelik tanımak gerekir.

1. Kişisel Verileri Maskeleme (Anonimleştirme)

Örneğin, metinde geçen “Ahmet Yılmaz adlı hastaya 01/02/2024 tarihinde Parasetamol yazıldı” ifadesi, [HASTA_ADI] adlı hastaya [TARİH] tarihinde Parasetamol yazıldı şekline dönüştürülür. Bu sayede veri güvenliği üst seviyeye çıkarılır.

2. Bağlam Odaklı Metin Parçalama (Chunking)

Sağlık metinlerinde ideal parça boyutu (chunk size) genellikle 300 ile 500 karakter arasında değişir. Bunun yanı sıra, parçalar arasında %10 ile %15 oranında örtüşme (overlap) bırakmak, anlamsal kopuklukların önüne geçer.

Vektör Veritabanı ve Embedding Seçimi Nasıl Yapılır?

Metin parçaları hazırlandıktan sonra, bu metinlerin anlamsal karşılıklarını sayısal dizilere, yani vektörlere (embeddings) dönüştürmek gerekir. Genel kullanım için geliştirilmiş embedding modelleri, tıbbi kavramlar arasındaki ilişkileri gözden kaçırabilir. Bu nedenle Türkçe sağlık metinlerinde ya çok dilli (multilingual) güçlü modeller ya da tıp alanında özel olarak eğitilmiş dönüştürücü (transformer) modeller tercih edilmelidir.

Oluşturulan vektörler, arama performansını artırmak için bir vektör veritabanına (Vector Database) kaydedilir. Günümüzde ChromaDB, Qdrant ve Milvus gibi çözümler bu süreçte sıkça kullanılır. Bu veritabanları, cosine similarity (kosinüs benzerliği) veya Euclidean distance (Öklid mesafesi) yöntemlerini kullanarak sorgu metnine en yakın sağlık kayıtlarını saniyeler içinde bulur.

Uygulamalı Örnek: Python ile Bilgi Getirim Hattı Nasıl Kodlanır?

Aşağıdaki Python örneğinde, ham bir sağlık metninin nasıl işlendiğini, vektör veritabanına aktarıldığını ve bilgi getirim hattının (retrieval pipeline) nasıl sorgulandığını adım adım görebilirsiniz.

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings

# 1. Ham Sağlık Metni (Örnek Epikriz Notu)
ham_saglik_metni = """
Hasta 45 yaşında erkek. Şiddetli göğüs ağrısı ve nefes darlığı şikayetiyle acil servise başvurdu.
Yapılan EKG incelemesinde ST elevasyonu saptandı. Troponin T seviyesi yüksek çıktı (1.2 ng/mL).
Hastaya acil koroner anjiyografi yapıldı ve sol ön inen artere (LAD) stent takıldı.
Taburculuk sonrası Klopidogrel ve Asetilsalisilik asit tedavisi planlandı.
"""

# 2. Metin Parçalama (Chunking)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=30,
    separators=["\n\n", "\n", ".", " "]
)
parcalar = text_splitter.split_text(ham_saglik_metni)

# 3. Embedding Modelinin Yüklenmesi
embedding_model = HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

# 4. Vektör Veritabanına Kayıt (ChromaDB)
vector_db = Chroma.from_texts(
    texts=parcalar,
    embedding=embedding_model,
    collection_name="saglik_raporlari"
)

# 5. Bilgi Getirimi (Retrieval) Sorgusu
sorgu = "Hastaya hangi damar müdahalesi yapıldı ve ne takıldı?"
benzer_sonuclar = vector_db.similarity_search(sorgu, k=2)

print("--- Bulunan İlgili Sağlık Kayıtları ---")
for i, doc in enumerate(benzer_sonuclar):
    print(f"Sonuç {i+1}:\n{doc.page_content}\n")

Yukarıdaki kod bloğunda görüldüğü üzere, RecursiveCharacterTextSplitter sınıfı ham metni anlamsal bütünlüğünü koruyarak küçük parçalara böler. Ardından sentence-transformers kütüphanesinden alınan çok dilli model ile vektörler üretilir. Son olarak Chroma veritabanı üzerinden yapılan sorgu, doğrudan stent takılan damar bilgisini içeren parçayı getirir.

Gerçek Dünya Vaka Analizi: Yerel Bir Hastanenin İyileşme Hikayesi

Konuyu somutlaştırmak adına, Türkiye’de faaliyet gösteren özel bir hastane grubunun acil servis sürecinde yaşadığı sorunu inceleyelim. Hastanenin acil servisine başvuran mükerrer hastaların geçmiş tıbbi geçmişleri, binlerce sayfalık düz metin doktor notları arasında gömülü durumdaydı. Nöbetçi doktorların bu metinleri okuyup hastanın alerjilerini veya geçirdiği ameliyatları tespit etmesi ortalama 12 dakika sürüyordu.

Geliştirilen yerel bilgi getirim boru hattı sayesinde, geçmiş sağlık kayıtları ilk olarak regex ve NER modelleri ile KVKK standartlarında maskelendi. Ardından hibrit arama (hybrid search) mimarisi kuruldu. Bu mimaride hem kelime bazlı BM25 algoritması hem de yoğun vektör araması (dense vector search) birleştirildi.

Proje sonucunda doktorların aradıkları kritiğe (örneğin “Hastanın penisilin alerjisi var mı?”) yanıt bulma süresi 12 dakikadan 2.4 saniyeye geriledi. Ayrıca semantik arama sayesinde doktor “Şeker hastalığı” aradığında, sistem geçmiş notlarda geçen “Diyabetes Mellitus” veya “HTN” ifadelerini de başarıyla yakaladı. Doğru bağlam getirme oranı %94 seviyesine ulaştı.

Hibrit Arama ve İleri Düzey İyileştirme Teknikleri Nelerdir?

Sadece vektör aramasına dayanmak, bazı tıbbi durumlarda yetersiz kalabilir. Özellikle spesifik ilaç kodları (örneğin ICD-10 kodları) veya nadir görülen tıbbi terimler arandığında, geleneksel anahtar kelime aramaları (BM25) semantik aramadan daha kesin sonuçlar verebilir. Bu nedenle ileri düzey boru hatlarında Hibrit Arama (Hybrid Search) yaklaşımı uygulanır.

Hibrit arama sistemlerinde, geleneksel arama ile vektör aramasından elde edilen sonuçlar birleştirilir. Sonrasında bu sonuçlar bir Cross-Encoder (Re-ranker) modeline gönderilerek yeniden sıralanır. Yeniden sıralama aşaması, kullanıcı sorgusu ile getirilen metin parçası arasındaki anlamsal uyumu daha derin bir analizle puanlar.

  • Aşama 1 (Getirim – Retrieval): BM25 ve Vektör arama ile en alakalı 20 doküman seçilir.
  • Aşama 2 (Yeniden Sıralama – Re-ranking): Cross-Encoder modeli bu 20 dokümanı sorguyla tek tek karşılaştırıp en doğru 3 dokümanı en üste çıkarır.
  • Aşama 3 (Üretim – Generation): Seçilen 3 doküman büyük dil modeline (LLM) bağlam olarak sunulur.

Bu yöntem, yanlış tıbbi tavsiye veya hatalı veri getirme riskini minimuma indirerek sistemin güvenilirliğini belirgin şekilde artırır.

Sağlık Sistemlerinde Sıkça Sorulan Sorular

1. KVKK uyumluluğu için ham veride neye dikkat edilmeli?

Ham metin vektör veritabanına aktarılmadan önce hasta adı, soyadı, T.C. Kimlik Numarası, telefon ve adres gibi kişisel verilerin (PII) anonimleştirilmesi veya maskelenmesi gerekir. Vektörlerin kendisi geri dönüştürülemez görünse de veritabanında tutulan metin parçaları risk oluşturabilir.

2. Türkçe medikal terimler için en iyi embedding modeli hangisidir?

Çok dilli (multilingual) ve yüksek boyutlu modeller (örneğin BGE-M3 veya OpenAI text-embedding-3 serisi) Türkçe sağlık metinlerinde oldukça başarılıdır. Tamamen yerel çözüm arayanlar için HuggingFace üzerindeki çok dilli transformer modelleri ince ayar (fine-tuning) yapılarak kullanılabilir.

3. Vektör arama neden geleneksel SQL aramasından daha iyidir?

SQL veri tabanındaki LIKE sorguları sadece birebir eşleşen kelimeleri bulur. Vektör araması ise anlamsal benzerliğe bakar. Örneğin kullanıcı “baş dönmesi” aradığında, vektör araması metin içinde geçen “vertigo” ifadesini de tespit edebilir.

4. Küçük tıp merkezleri için bu sistem çok mu maliyetlidir?

Hayır, açık kaynak kodlu araçlar (ChromaDB, Python, LangChain, HuggingFace) sayesinde sunucu altyapısı dışında ek bir lisans maliyeti ödemeden tamamen yerel (on-premise) çalışan bir bilgi getirim hattı kurmak mümkündür.

#SaglikTeknolojileri #YapayZeka #Python #BilgiGetirimi #NLP

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.