NVIDIA AI Endpoint’leri ve Ragas ile Tıbbi RAG Değerlendirmesi

Hızla gelişen tıp alanında, en son teknolojilerin entegrasyonu, hasta bakımını geliştirmek ve araştırmaları ilerletmek için büyük önem taşımaktadır. Bu yeniliklerden biri, retrieve-augmented generation (RAG), tıbbi bilgilerin işlenme ve kullanım biçimini dönüştürmektedir.

RAG, büyük dil modelleri (LLM) ile dışsal bilgi alım yeteneklerini birleştirir. Bu sayede, eski bilgiler ve yanlış verilerin (halüsinasyonların) üretilmesi gibi kritik sınırlamalar aşılmış olur. RAG, yapılandırılmış veritabanları, bilimsel literatür ve hasta kayıtlarından güncel ve ilgili bilgileri alarak, tıbbi uygulamalar için daha doğru ve bağlamsal olarak farkında bir temel sağlar. Bu hibrit yaklaşım, üretilen çıktının doğruluğunu ve güvenilirliğini artırırken, aynı zamanda yorumlanabilirliği destekler ve ilaç keşfi ile klinik deneme taraması gibi alanlarda değerli bir araç haline gelir.

RAG’ın tıpta potansiyelini keşfetmeye devam ederken, performansının titizlikle değerlendirilmesi gerekir. Hem alım hem de üretim bileşenlerini inceleyerek, tıbbi uygulamalarda en yüksek doğruluk ve alaka düzeyini sağlamak önemlidir. Tıbbi RAG sistemlerinin kendine özgü talepleri ve gereksinimleri vardır; bu nedenle, bunları kapsamlı bir şekilde ele alacak değerlendirme çerçevelerinin oluşturulması kaçınılmazdır.

Tıbbi RAG Zorlukları

Bunlardan biri, ölçeklenebilirliktir. tıbbi verilerin hacmi, yılda %35’ten fazla bir bileşik yıllık büyüme oranıyla artarken, RAG sistemlerinin bu verileri işleyip ilgili bilgileri hız veya doğruluktan ödün vermeden alabilmesi büyük önem taşımaktadır. Bu, zamanında bilgiye erişimin hasta bakımını doğrudan etkileyebileceği gerçek zamanlı uygulamalar için kritik bir durumdur.

Tıbbi uygulamalar için gereken spesifik dil ve bilgi, hukuk veya finans gibi diğer alanlardan oldukça farklılık gösterebilir. Bu durum, sistemin çok yönlülüğünü kısıtlar ve alan bazlı ince ayar gerektirir.

Bir başka önemli zorluk ise, tıbbi RAG benchmarklarının yokluğu ve bu alandaki genel değerlendirme metriklerinin yetersizliğidir. Bu eksiklik, tıbbi metinler ve sağlık kayıtlarına dayanarak sentetik test ve zemin gerçek verilerin üretilmesini gerektirir.

Metin benzerliğine odaklanan geleneksel metrikler (BLEU veya ROUGE gibi), RAG sistemlerinin performansını yeterince yansıtamamaktadır. Bu metrikler, tıbbi uygulamalarda hayati öneme sahip olan faktüel doğruluk ve bağlamsal alaka düzeylerini yeterince yansıtmaz.

Ayrıca, RAG sistemlerinin değerlendirilmesi, hem alım hem de üretim bileşenlerinin bağımsız olarak hem de bir bütün olarak değerlendirilmesini de içerir. Alım bileşeni, geniş ve dinamik bilgi tabanlarından ilgili ve güncel bilgileri çekebilme yeteneği açısından değerlendirilmeli; bu süreç, doğruluk, duyarlılık ve alaka düzeyini ölçmelidir.

Üretim bileşeni ise, büyük dil modelleri tarafından desteklenerek, ürettiği içeriğin sadakati ve doğruluğu açısından değerlendirilmeli ve bu içeriğin, alınan bilgilerle ve orijinal sorgu ile uyumlu olmasını sağlamalıdır.

Tüm bu zorluklar, tıbbi RAG sistemlerinin özel gereksinimlerini karşılamak için kapsamlı değerlendirme çerçevelerinin oluşturulması gerektiğini vurgulamaktadır.

RAGAS Nedir?

Ragas (retrieve-augmented generation assessment), RAG hatlarını değerlendirmek için tasarlanmış popüler, açık kaynaklı, otomatik bir değerlendirme çerçevesidir.

Ragas çerçevesi, performansın değerlendirilmesine yönelik araçlar ve metrikler sağlar; bu metrikler, bağlam alaka düzeyi, bağlam duyarlılığı, sadakat ve cevap alaka düzeyi gibi konulara odaklanır. LLM-as-a-judge yaklaşımını kullanarak referanssız değerlendirmeler yapar ve bu da insan-annotasyon ihtiyacını en aza indirerek değerlendirme sürecini daha verimli ve maliyet etkin hale getirir.

RAG Değerlendirme Stratejileri

RAG’i kapsamlı bir şekilde değerlendirmek için tipik bir strateji şu adımları takip eder:

  1. Sözlükteki belgelerden sentetik olarak üretilmiş soru-cevap-bağlam (triplet) setleri oluşturun.
  2. Her bir örnek soru için kesinlik/duyarlılık metriklerini uygulayın; bunu RAG üzerinden çalıştırarak cevabı ve bağlamı zemin gerçek ile karşılaştırarak yapın.
  3. Düşük kaliteli sentetik örnekleri elen.
  4. Örnek sorguları gerçek RAG ile çalıştırın ve bunun ardından sentetik bağlam ve cevabı zemin gerçek olarak kullanarak değerlendirin.
Diagram shows a question, such as ‘What are typical BP measurements in the case of congestive heart failure?” The system asks whether the retrieved context is relevant to the question and then whether the retrieved context contains information relevant to the question. The response might start with something like, “While normal blood pressure is generally considered below 120/80 mmHg, heart failure patients often require careful management within a target range….” The system then asks if the response is accurate and relevant to the question.
Şekil 1. RAG ve arama sisteminin değerlendirme bileşeni akışı

Bu eğitimi en etkili biçimde kullanabilmek için, LLM çıkarım hatları hakkında temel bir bilgiye sahip olmanız gerekecek.

Kurulum

Başlamak için, NVIDIA API Kataloğu‘nda ücretsiz bir hesap oluşturun ve şu adımları takip edin:

  1. Herhangi bir modeli seçin.
  2. Python, Get API Key‘i seçin.
  3. Üretilen anahtarı NVIDIA_API_KEY olarak kaydedin.

Artık, uç noktalarınıza erişiminiz olmalıdır.

Şimdi, LangChain, NVIDIA AI uç noktaları ve Ragas’ı kurun:

pip install langchain
pip install langchain_nvidia_ai_endpoints
pip install ragas

Tıbbi Veri Setini İndirin

Sonraki adımda, Kaggle MACCROBAT veri seti‘ni indirin. Bu veri setini, Kaggle API belirteci gerektiren, doğrudan Kaggle’dan veya Hugging Face‘ten /MACCROBAT_biomedical_ner versiyonundan indirebilirsiniz.

Bu yazıda, yalnızca tıbbi raporların tam metnini kullanıyor ve NER anotasyonlarını göz ardı ediyoruz:

from langchain_community.document_loaders import HuggingFaceDatasetLoader
from datasets import load_dataset

dataset_name = "singh-aditya/MACCROBAT_biomedical_ner"
page_content_column = "full_text"

loader = HuggingFaceDatasetLoader(dataset_name, page_content_column)
dataset = loader.load()

Sentetik Veri Oluşturma

RAG değerlendirmesindeki ana zorluklardan biri, sentetik veri üretimidir. Bu, sağlam bir değerlendirme için gereklidir çünkü RAG sisteminizi vektör veritabanındaki verilerle ilgili sorularla test etmek istersiniz.

Bu yaklaşımın önemli bir avantajı, geniş ölçekli testler olanağı sunarken insan-annotasyonu gibi maliyetli kaynaklara ihtiyaç duymamasıdır. Ragas, ilgili veriye dayalı temsil eden sentetik verileri üretebilmesi için bir dizi LLM kullanmaktadır (örneğin, generator, critic, embedding). Ragas, varsayılan olarak OpenAI’yi kullanır, bu sebeple bunu NVIDIA AI uç noktaları ile değiştirebilirsiniz.

from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple
from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings

critic_llm = ChatNVIDIA(model="meta/llama3.1-8b-instruct")
generator_llm = ChatNVIDIA(model="mistralai/mixtral-8x7b-instruct-v0.1")
embeddings = NVIDIAEmbeddings(model="nv-embedqa-e5-v5", truncate="END")

generator = TestsetGenerator.from_langchain(
     generator_llm,
     critic_llm,
     embeddings,
     chunk_size=512
)

# test setini oluştur
testset = generator.generate_with_langchain_docs(dataset,  test_size=10, is_async=False, raise_exceptions=False, distributions={simple: 1.0})

Bu kod, tıbbi raporlarından oluşan MACCROBAT veri setine dayalı bir vektör depo üzerinde dağıtılır; bu da vektör depo içindeki belgelerden ortaya çıkan bir dizi örnek soru oluşturur:

[“Kongestif kalp yetmezliği durumunda tipik kan basıncı ölçümleri nelerdir?”,
“Bel bölgesinde şiddetli akut ağrısı olan hastalarda taramalar neleri ortaya çıkarabilir?”
“Metakronik soliter karaciğer metastazının tedavisi için ameliyat gerekli midir?”  
“Mide kanserinin tespitinde en etkili yöntemler nelerdir?”]

Ayrıca, her bir soruya bir alındı bağlamı ve üretilen zemin gerçek cevapla ilişkilendirilmiştir; bunları daha sonra tıbbi RAG’ın alım ve üretim bileşenlerini bağımsız olarak değerlendirmek ve derecelendirmek için kullanabilirsiniz.

Girdiyi Değerlendirme

Artık sentetik verileri değerlendirme için girdi verisi olarak kullanabilirsiniz. Girdi verisini, üretilen sorular (question), yanıtlar (ground_truth), tıbbi RAG sisteminizden alınan geçerli bağlamlar (contexts) ve bunların ilgili yanıtları (answer) ile doldurun.

Aşağıdaki kod örneğinde, üretimle ilgili metrikleri değerlendirirken (answer_relevancy, faithfulness) zemin gerçeği ile doldurmanız gerekmiyor, bu yüzden boş değerler kullanabilirsiniz:

   # cevap alaka düzeyi ve sadakat metrikleri zemin gerçeğini göz ardı eder; bu yüzden tümünü boş değerlerle doldurun
    ground_truth = ['']*len(queries)
    answers = []
    contexts = []

    # Sorguları arama uç noktasında çalıştırın ve bağlam ve sonuçları toplayın
    for query in queries:
        json_data = query_rag(query)

        response = json_data['results'][0]['answer']
        answers.append(response)
  
        seq_str = []
        seq_str.append(json_data['results'][0]['retrieved _document_context'])
        contexts.append(seq_str)

    # Tüm verileri RAGAS için HF veri setine kaydet
    data = {
        "question": queries,
        "answer": answers,
        "contexts": contexts,
        "ground_truth": ground_truth
    }
    dataset = DatasetDict()
    dataset['eval'] = Dataset.from_dict(data)

    # OpenAI LLM ve gömme modelini NVIDIA AI uç noktaları ile değiştir
    nvidia_llm = ChatNVIDIA(model="meta/llama-3.1-8b-instruct")    
nvidia_embeddings = NVIDIAEmbeddings(model="nvidia/nv-embedqa-e5-v5", truncate="END")

   result = evaluate(
            dataset["eval"],
            metrics=[answer_relevancy, 
                faithfulness
                ],
            llm=nvidia_llm,
            embeddings=nvidia_embeddings,
            raise_exceptions=False,
            is_async=False,
        )

Anlamlı Arama Uygulaması

Sistemi, soru/cevap çiftleri yerine anahtar kelimelere dayalı anlamlı arama değerlendirmeleri ile değiştirebilirsiniz. Bu durumda, Ragas’tan anahtar kelimeleri çıkarır ve üretilmiş test setini göz ardı edersiniz. Bu, tıbbi sistemlerde, tam bir RAG hattı henüz devreye alınmadığında oldukça faydalıdır.

testset = generator.generate_with_langchain_docs([doc], test_size=10, is_async=False, raise_exceptions=False, distributions={simple: 1.0})
        queries = []
        for node in generator.docstore.nodes:
            queries += node.keyphrases
        return queries

Bu şimdi, bir dizi sorgu üretiyor ve bunları tıbbi bir anlamlı arama sistemine değerlendirme girdi olarak verebilirsiniz:

[“lezyon”, “intrapreriotral sıvı”, “RF tedavisi”, “palpitasyonlar”, “torakoskopik akciğer biyopsisi”, “preoperatif kemoradyoterapi”, “hemoglobin düzeyi”, “iğne biyopsi örneği”, “hipotansiyon”, “taşikardi”, “karın radyografisi”, “pnömatik genişletme balonu”, “bilgisayarlı tomografi (BT) taraması”, “tümör hücreleri“, “radyolojik incelemeler“, “S-100 proteini“, “ultrastrüktürel analiz”, “Birbeck granülleri”, “diyastolik kongestif kalp yetmezliği (CHF)”, “brakiyal kan basıncı”, “ventriküler endomiyokardiyal biyopsi”, “miyokardit”, “infiltratif kardiyomiyopatiler”, “stenoz”, “diyastolik disfonksiyon”, “otoimmün hepatit”]

Anlamlı Arama Özelleştirme

Daha önce belirtildiği gibi, varsayılan değerlendirme metrikleri her zaman tıbbi sistemler için yeterli olmayabilir ve genellikle alan bazlı zorlukları desteklemek üzere özelleştirilmelidir.

Bu nedenle, Ragas’ta özel metrikler oluşturabilirsiniz. Bu, özel bir istemin oluşturulmasını gerektirir. Örneğin, bir anlamlı arama sorgusu için alım kesinliği ölçmek üzere bir özel istem oluşturun:

RETRIEVAL_PRECISION = Prompt(
    name="retrieval_precision",
    instruction="""Bir kullanıcı bu sorguyu bir arama motoruna girdiğinde, bu sonucunun yeterince alaka düzeyi var mı ki sonuçların ilk sayısında yer alabilir? Cevaplar kesinlikle '1' veya '0' olmalıdır. Yeterli bilgi içermiyorsa '0' ve yeterli bilgi içeriyorsa '1' olarak cevap verin.""",
    input_keys=["question", "context"],
    output_key="answer",
    output_type="json",
)

Ardından, _ascore fonksiyonunu geçersiz kılacak yeni bir sınıf oluşturun ve değerlendirme sonucu, istemin cevabına dayanan bir puan hesaplamak üzere özelleştirin:

@dataclass
class RetrievalPrecision(MetricWithLLM):

    name: str = "retrieval_precision"  # type: ignore
    evaluation_mode: EvaluationMode = EvaluationMode.qc  # type: ignore
    context_relevancy_prompt: Prompt = field(default_factory=lambda: RETRIEVAL_PRECISION)

    async def _ascore(self, row: t.Dict, callbacks: Callbacks, is_async: bool) -> float:
        score=response[0] # first token is the result [0,1]
        if score.isnumeric():
            return int(score)
        else:
            return 0

    retrieval_precision = RetrievalPrecision()

Artık yeni özel metriğiniz retrieval_precision olarak tanımlandı ve standart Ragas değerlendirme hattında kullanılabilir:

nvidia_llm = ChatNVIDIA(model="meta/llama-3.1-8b-instruct")
nvidia_embeddings = NVIDIAEmbeddings(model="nvidia/nv-embedqa-e5-v5", truncate="END")

score = evaluate(dataset["eval"], metrics=[retrieval_precision], llm=nvidia_llm, embeddings=nvidia_embeddings, raise_exceptions=False, is_async=False)

Yapılan Değerlendirme Sonrasında İyileştirme

RAG ve LLM değerlendirme çerçeveleri sıklıkla LLM-as-a-judge tekniklerini kullanır ve çoğu zaman uzun ve karmaşık istemlere ihtiyaç duyar. Daha önceki özel metriğin örneğinde de gördüğünüz gibi, bu aynı zamanda LLM cevabının ayrıştırılması ve sonrasında ayrıca işlenmesini gerektirir.

Bu süreci iyileştirebilir ve daha sağlam hale getirebilirsiniz. yapılandırılmış çıktı özelliğini kullanarak, önceki istemi basit bir hale getirebilirsiniz:

import enum

class Choices(enum.Enum):
    Y = "Y"
    N = "N"

structured_llm = nvidia_llm.with_structured_output(Choices)

structured_llm.invoke("Bir kullanıcı bu sorguyu bir arama motoruna girdiğinde, bu sonucunun yeterince alaka düzeyi olduğunu belirtiyor mu? Sonuçta yer alabilmek için yeterli bilgi içeriyor mu? 'N' cevabını sağlayan özet, soruya cevap vermek için yeterli bilgi içermiyorsa, 'Y' cevabını veren özet, soruya cevap verebilir.")

Sonuç

RAG, büyük dil modelleri ile yoğun vektör temsilinin güçlü bir yaklaşım olarak öne çıktığı bir yöntem olarak ortaya çıkmıştır. Sıkı veri yapılarının kullanımı sayesinde, RAG modelleri ölçeklenebilirliklerini artırarak büyük ölçekli kurumsal uygulamalar için oldukçau uygun bir seçim sağlıyor; bu durum, çok dilli müşteri hizmeti sohbet botları ve kod üretim temsilcilerinde büyük bir ihtiyaçtır.

Büyük dil modelleri geliştikçe, RAG’in tıpta yenilikçilik sağladığı ve yüksek kaliteli, akıllı sistemler sunduğu gözler önüne serilmektedir.

Bir tıbbi RAG sistemini değerlendirirken dikkate alınması gereken birkaç temel unsur vardır:

  • Sistem, güncel ve ilgili bilgileri sağlayarak, geri alınan bağlama sadık kalmalıdır.
  • Özel tıbbi terminoloji ve kavramları işlemek için dayanıklı olmalı ve gürültülü veya hatalı girdilerle başa çıkabilmelidir.
  • Doğru değerlendirmenin gerçekleştirilmesi için alım ve üretim bileşenleri için uygun metriklerin kullanılması, özel tıbbi veri setlerine göre benchmark yapılması ve maliyet etkinliğinin göz önünde bulundurulması gerekir.
  • Sağlık profesyonellerinden geri bildirim almak ve sürekli değerlendirmeler yapmak, sistemin klinik ortamlardaki pratik faydasını ve alaka düzeyini sağlamak açısından kritik öneme sahiptir.

Bu yazıda tarif edilen hat yapısı tüm bu maddeleri ele almakta ve ek metrikler ve özellikler içerecek şekilde geliştirilmeye açıktır.

Ragas kullanarak yapılan bir referans değerlendirme aracıyla ilgili daha fazla bilgi için lütfen değerlendirme örneğine bakın ve /NVIDIA/GenerativeAIExamples GitHub deposuna göz atın.

Kaynak

Nvdia Blog

Exit mobile version