<НА ГЛАВНУЮ

Ускорение классификации медицинских симптомов с Adala и Google Gemini: Практическое руководство

В этом руководстве показано, как построить конвейер активного обучения для классификации медицинских симптомов, интегрируя Adala с Google Gemini для эффективной аннотации и визуализации уверенности.

Установка Adala и зависимостей

В этом руководстве мы начинаем с установки фреймворка Adala напрямую из репозитория GitHub вместе с необходимыми зависимостями, такими как pandas, matplotlib и Google Generative AI SDK. Проводятся проверки для подтверждения корректной установки и доступности пакета в Python.

!pip install -q git+https://github.com/HumanSignal/Adala.git
!pip install -q google-generativeai pandas matplotlib
!pip list | grep adala

Проверяются пути Python и директории пакетов, чтобы убедиться в правильной установке.

Интеграция Google Gemini в качестве кастомного аннотатора

Google Gemini настраивается как кастомный аннотатор через класс GeminiAnnotator. Этот класс использует клиент Google Generative AI для классификации медицинских симптомов по категориям: сердечно-сосудистые, респираторные, гастроинтестинальные и неврологические.

class GeminiAnnotator:
    def __init__(self, model_name="models/gemini-2.0-flash-lite", categories=None):
        self.model = genai.GenerativeModel(model_name=model_name,
                                          generation_config={"temperature": 0.1})
        self.categories = categories
       
    def annotate(self, samples):
        results = []
        for sample in samples:
            prompt = f"""Классифицируйте этот медицинский симптом в одну из следующих категорий:
            {', '.join(self.categories)}.
            Верните JSON в формате: {{"category": "selected_category",
            "confidence": 0.XX, "explanation": "короткое объяснение"}}
           
            СИМПТОМ: {sample.text}"""
           
            try:
                response = self.model.generate_content(prompt).text
                json_match = re.search(r'(\{.*\})', response, re.DOTALL)
                result = json.loads(json_match.group(1) if json_match else response)
               
                labeled_sample = type('LabeledSample', (), {
                    'text': sample.text,
                    'labels': result["category"],
                    'metadata': {
                        "confidence": result["confidence"],
                        "explanation": result["explanation"]
                    }
                })
            except Exception as e:
                labeled_sample = type('LabeledSample', (), {
                    'text': sample.text,
                    'labels': "unknown",
                    'metadata': {"error": str(e)}
                })
            results.append(labeled_sample)
        return results

Подготовка и аннотирование примеров симптомов

Список медицинских симптомов оборачивается в объекты TextSample и передается аннотатуру. Активный обучающий цикл выполняется три итерации, при этом симптомы, содержащие слова "грудь", "сердце" или "боль", получают повышенный приоритет для выбора.

sample_data = [
    "Боль в груди, отдающая в левую руку при нагрузке",
    "Постоянный сухой кашель с хрипами",
    "Сильная головная боль с чувствительностью к свету",
    "Спазмы желудка и тошнота после еды",
    "Онемение в пальцах правой руки",
    "Одышка при подъеме по лестнице"
]
 
text_samples = [type('TextSample', (), {'text': text}) for text in sample_data]
 
annotator = GeminiAnnotator(categories=CATEGORIES)
labeled_samples = []
 
print("\nЗапуск цикла активного обучения:")
for i in range(3):  
    print(f"\n--- Итерация {i+1} ---")
   
    remaining = [s for s in text_samples if s not in [getattr(l, '_sample', l) for l in labeled_samples]]
    if not remaining:
        break
       
    scores = np.zeros(len(remaining))
    for j, sample in enumerate(remaining):
        scores[j] = 0.1
        if any(term in sample.text.lower() for term in ["грудь", "сердце", "боль"]):
            scores[j] += 0.5  
   
    selected_idx = np.argmax(scores)
    selected = [remaining[selected_idx]]
   
    newly_labeled = annotator.annotate(selected)
    for sample in newly_labeled:
        sample._sample = selected[0]  
    labeled_samples.extend(newly_labeled)
   
    latest = labeled_samples[-1]
    print(f"Текст: {latest.text}")
    print(f"Категория: {latest.labels}")
    print(f"Доверие: {latest.metadata.get('confidence', 0)}")
    print(f"Объяснение: {latest.metadata.get('explanation', '')[:100]}...")

Визуализация уверенности классификации

Извлекаются категории и уровни доверия модели, после чего строится столбчатая диаграмма с помощью Matplotlib.

categories = [s.labels for s in labeled_samples]
confidence = [s.metadata.get("confidence", 0) for s in labeled_samples]
 
plt.figure(figsize=(10, 5))
plt.bar(range(len(categories)), confidence, color='skyblue')
plt.xticks(range(len(categories)), categories, rotation=45)
plt.title('Уверенность классификации по категориям')
plt.tight_layout()
plt.show()

Итоги

Сочетая модульный активный обучающий фреймворк Adala с генеративными возможностями Google Gemini, мы создаем эффективный конвейер аннотирования медицинских текстов с приоритетным выбором и визуализацией уверенности, что открывает возможности для расширения и усложнения задач аннотации.

🇬🇧

Switch Language

Read this article in English

Switch to English