Ускорение классификации медицинских симптомов с 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