Aktives Lernen zur Datenannotation: Gemini + Adala-Handbuch

Adala Framework – Aktives Lernen für die Datenannotation

Aktives Lernen verändert unsere Trainingsmethoden AI für durch die intelligente Auswahl der wertvollsten Daten für die Annotation. In Kombination mit leistungsstarke LLMs Google Trends, Amazons Bestseller Google Gemini, es erstellt effiziente Annotation-Pipelines, die den manuellen Aufwand reduzieren und gleichzeitig eine hohe Datenqualität gewährleisten.

Dieser Leitfaden zeigt, wie man solche Pipelines mit dem Adala-Framework erstellt – einem leistungsstarken, aber wenig genutzten Werkzeug für die autonome Datenkennzeichnung.

Wir implementieren einen medizinischen Symptomklassifizierer, der Gemini nutzt's Fähigkeiten durch einen strukturierten aktiven Lernworkflow.

Aktives Lernen zur Datenannotation verstehen

Aktives Lernen zur Datenannotation verstehen

Aktives Lernen begegnet der zentralen Herausforderung des überwachten Lernens : der Gewinnung großer Mengen an annotierten Daten. Anstatt Datenpunkte zufällig für die Annotation auszuwählen, identifizieren aktive Lernalgorithmen die informativsten Beispiele, die am meisten zur Modellverbesserung beitragen.

Warum aktives Lernen wichtig ist:

Reduziert die Annotationskosten, indem der menschliche Aufwand dort konzentriert wird, wo er am wichtigsten ist.
Verbessert Modellgenauigkeit mit weniger beschrifteten Beispielen.
Behebt das Klassenungleichgewicht, indem unterrepräsentierten Kategorien Priorität eingeräumt wird.
Schafft eine kontinuierliche Lernschleife zwischen Modell und Kommentator.

Das Adala-Framework integriert diese Vorteile in Produktionsabläufe durch modulare Komponenten, die den aktiven Lernprozess optimieren . Bevor wir uns mit der Implementierung befassen, wollen wir untersuchen, warum Adala besonders gut für die Integration mit modernen Lernmanagementsystemen wie Google Gemini geeignet ist.

Was ist Adala? Eine Einführung in das Framework

Adala (Autonomous Data Labeling Agent) ist ein Open-Source-Framework, das speziell für die Implementierung spezialisierter Agenten zur Datenverarbeitung entwickelt wurde . Im Gegensatz zu herkömmlichen Annotationswerkzeugen verfolgt Adala einen agentenbasierten Ansatz, der Folgendes kombiniert:

Kompetenzbasierte Architektur: Definieren Sie die spezifischen Funktionen, die Ihr Annotation-Agent benötigt.
Laufzeitflexibilität: Wechseln Sie zwischen verschiedenen LLMs oder benutzerdefinierten Laufzeiten.
Umgebungsverbindungen: Interagieren Sie mit verschiedenen Datenquellen.
Integrierte Lernschleifen: Schulen Sie Agenten, damit sie sich im Laufe der Zeit verbessern.

Anhand des Schnellstartbeispiels von Adala können wir sehen, wie es die Stimmungsanalyse strukturiert :

python

import pandas as pd
from adala.agents import Agent
from adala.environments import StaticEnvironment
from adala.skills import ClassificationSkill
from adala.runtimes import OpenAIChatRuntime
from rich import print

# Train dataset
train_df = pd.DataFrame([
    ["It was the negative first impressions, and then it started working.", "Positive"],
    ["Not loud enough and doesn't turn on like it should.", "Negative"],
    ["I don't know what to say.", "Neutral"],
    ["Manager was rude, but the most important that mic shows very flat frequency response.", "Positive"],
    ["The phone doesn't seem to accept anything except CBR mp3s.", "Negative"],
    ["I tried it before, I bought this device for my son.", "Neutral"],
], columns=["text", "sentiment"])

# Test dataset
test_df = pd.DataFrame([
    "All three broke within two months of use.",
    "The device worked for a long time, can't say anything bad.",
    "Just a random line of text."
], columns=["text"])

agent = Agent(
    # connect to a dataset
    environment=StaticEnvironment(df=train_df),
    # define a skill
    skills=ClassificationSkill(
        name='sentiment',
        instructions="Label text as positive, negative or neutral.",
        labels=["Positive", "Negative", "Neutral"],
        input_template="Text: {text}",
        output_template="Sentiment: {sentiment}"
    ),
    # define runtimes
    runtimes = {
        'openai': OpenAIChatRuntime(model='gpt-4o'),
    },
    teacher_runtimes = {
        'default': OpenAIChatRuntime(model='gpt-4o'),
    },
    default_runtime='openai',
)

agent.learn(learning_iterations=3, accuracy_threshold=0.95)
predictions = agent.run(test_df)

Für unsere Aufgabe der Klassifizierung medizinischer Symptome werden wir diese Architektur anpassen, um Google Gemini zu integrieren und gleichzeitig eine maßgeschneiderte Active-Learning-Strategie zu implementieren.

Einrichten Ihrer Umgebung

Lassen's Beginnen Sie mit der Installation von Adala und den erforderlichen Abhängigkeiten:

python

# Install Adala directly from GitHub
!pip install -q git+https://github.com/HumanSignal/Adala.git

# Verify installation
!pip list | grep adala

# Install additional dependencies
!pip install -q google-generativeai pandas matplotlib numpy

Wir müssen das Repository auch klonen, um direkt auf seine Komponenten zugreifen zu können:

python

# Clone the repository for access to source files
!git clone https://github.com/HumanSignal/Adala.git

# Ensure the package is in our Python path
import sys
sys.path.append('./Adala')

# Import key components
from Adala.adala.annotators.base import BaseAnnotator
from Adala.adala.strategies.random_strategy import RandomStrategy
from Adala.adala.utils.custom_types import TextSample, LabeledSample

Integration von Google Gemini als benutzerdefinierter Annotator

Anders als die ursprüngliche Implementierung, die lediglich eine einfache Wrapper-Schicht um Google Gemini nutzte, entwickeln wir einen robusteren Annotator , der den Designmustern von Adala folgt. Dadurch wird unsere Lösung wartungsfreundlicher und erweiterbarer.

Zuerst müssen wir die Google Generative einrichten AI Klient:

python

import google.generativeai as genai
import os

# Set API key from environment or enter manually
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") or getpass("Enter your Gemini API Key: ")
genai.configure(api_key=GEMINI_API_KEY)

Jetzt erstellen wir einen benutzerdefinierten Annotator, indem wir Adala erweitern's BaseAnnotator-Klasse:

python

import json
import re
from typing import List, Dict, Any, Optional

class GeminiAnnotator(BaseAnnotator):
    """Custom annotator using Google Gemini for medical symptom classification."""
    
    def __init__(self, 
                 model_name: str = "models/gemini-2.0-flash-lite", 
                 categories: List[str] = None,
                 temperature: float = 0.1):
        """Initialize the Gemini annotator.
        
        Args:
            model_name: The Gemini model to use
            categories: List of valid classification categories
            temperature: Controls randomness in generation (lower = more deterministic)
        """
        self.model = genai.GenerativeModel(
            model_name=model_name,
            generation_config={"temperature": temperature}
        )
        self.categories = categories or ["Cardiovascular", "Respiratory", 
                                         "Gastrointestinal", "Neurological"]
    
    def _build_prompt(self, text: str) -> str:
        """Create a structured prompt for the model.
        
        Args:
            text: The symptom text to classify
            
        Returns:
            A formatted prompt string
        """
        return f"""Classify this medical symptom into one of these categories:
        {', '.join(self.categories)}.
        
        Return JSON format: {{"category": "selected_category", 
        "confidence": 0.XX, "explanation": "brief_reason"}}
        
        SYMPTOM: {text}"""
    
    def _parse_response(self, response: str) -> Dict[str, Any]:
        """Extract structured data from model response.
        
        Args:
            response: Raw text response from Gemini
            
        Returns:
            Dictionary containing parsed fields
        """
        try:
            # Extract JSON from response even if surrounded by text
            json_match = re.search(r'(\{.*\})', response, re.DOTALL)
            result = json.loads(json_match.group(1) if json_match else response)
            return {
                "category": result.get("category", "Unknown"),
                "confidence": result.get("confidence", 0.0),
                "explanation": result.get("explanation", "")
            }
        except Exception as e:
            return {
                "category": "Unknown",
                "confidence": 0.0,
                "explanation": f"Error parsing response: {str(e)}"
            }
    
    def annotate(self, samples: List[TextSample]) -> List[LabeledSample]:
        """Annotate a batch of text samples.
        
        Args:
            samples: List of TextSample objects
            
        Returns:
            List of LabeledSample objects with annotations
        """
        results = []
        for sample in samples:
            prompt = self._build_prompt(sample.text)
            try:
                response = self.model.generate_content(prompt).text
                parsed = self._parse_response(response)
                
                # Create labeled sample with metadata
                labeled_sample = LabeledSample(
                    text=sample.text,
                    labels=parsed["category"],
                    metadata={
                        "confidence": parsed["confidence"],
                        "explanation": parsed["explanation"]
                    }
                )
            except Exception as e:
                # Graceful error handling
                labeled_sample = LabeledSample(
                    text=sample.text,
                    labels="Unknown",
                    metadata={"error": str(e)}
                )
            
            # Store reference to original sample
            labeled_sample._sample = sample
            results.append(labeled_sample)
            
        return results

Diese Implementierung bietet erhebliche Verbesserungen gegenüber dem Original:

  1. Es folgt der richtigen Klassenvererbung von Adala's BaseAnnotator
  2. Implementiert private Hilfsmethoden für die schnelle Erstellung und Analyse von Antworten
  3. Verwendet strukturierte Fehlerbehandlung und Typhinweise
  4. Bietet vollständige Dokumentation

Aufbau einer Symptomklassifizierungs-Pipeline

Wir erstellen einen Datensatz mit medizinischen Symptomen für unsere Klassifizierungsaufgabe. Anders als in der ursprünglichen Implementierung verwenden wir einen vielfältigeren Datensatz mit ausgewogener Repräsentation der Kategorien:

python

# Create a more comprehensive dataset
symptom_data = [
    # Cardiovascular symptoms
    "Chest pain radiating to left arm during exercise",
    "Heart palpitations when lying down",
    "Swollen ankles and shortness of breath",
    "Dizziness when standing up quickly",
    
    # Respiratory symptoms
    "Persistent dry cough with occasional wheezing",
    "Shortness of breath when climbing stairs",
    "Coughing up yellow or green mucus",
    "Rapid breathing with chest tightness",
    
    # Gastrointestinal symptoms
    "Stomach cramps and nausea after eating",
    "Burning sensation in upper abdomen",
    "Frequent loose stools with abdominal pain",
    "Yellowing of skin and eyes",
    
    # Neurological symptoms
    "Severe headache with sensitivity to light",
    "Numbness in fingers of right hand",
    "Memory loss and confusion",
    "Tremors in hands when reaching for objects"
]

# Convert to TextSample objects
text_samples = [TextSample(text=text) for text in symptom_data]

Implementierung fortgeschrittener aktiver Lernstrategien

Die ursprüngliche Implementierung verwendete einen einfachen Prioritätsbewertungsmechanismus. Wir werden diesen mit mehreren Strategien erweitern, um Adala zu demonstrieren.'s Flexibilität:

python

import numpy as np
from typing import List, Callable

class PrioritizationStrategy:
    """Base class for sample prioritization strategies."""
    
    def score_samples(self, samples: List[TextSample]) -> np.ndarray:
        """Assign priority scores to samples.
        
        Args:
            samples: List of samples to score
            
        Returns:
            Array of scores, higher values indicate higher priority
        """
        raise NotImplementedError("Subclasses must implement this method")
    
    def select(self, samples: List[TextSample], n: int = 1) -> List[TextSample]:
        """Select the top n highest scoring samples.
        
        Args:
            samples: List of samples to select from
            n: Number of samples to select
            
        Returns:
            List of selected samples
        """
        if not samples:
            return []
        
        scores = self.score_samples(samples)
        indices = np.argsort(-scores)[:n]  # Descending order
        return [samples[i] for i in indices]

class KeywordPriority(PrioritizationStrategy):
    """Prioritize samples based on medical urgency keywords."""
    
    def __init__(self, keyword_weights: Dict[str, float]):
        """Initialize with keyword weights.
        
        Args:
            keyword_weights: Dictionary mapping keywords to priority weights
        """
        self.keyword_weights = keyword_weights
    
    def score_samples(self, samples: List[TextSample]) -> np.ndarray:
        scores = np.zeros(len(samples))
        for i, sample in enumerate(samples):
            # Base score
            scores[i] = 0.1
            
            # Add weights for each keyword found
            text_lower = sample.text.lower()
            for keyword, weight in self.keyword_weights.items():
                if keyword in text_lower:
                    scores[i] += weight
        
        return scores

class UncertaintyPriority(PrioritizationStrategy):
    """Prioritize samples based on model uncertainty."""
    
    def __init__(self, model_fn: Callable[[List[TextSample]], List[float]]):
        """Initialize with uncertainty model function.
        
        Args:
            model_fn: Function that returns uncertainty scores for samples
        """
        self.model_fn = model_fn
    
    def score_samples(self, samples: List[TextSample]) -> np.ndarray:
        # Higher uncertainty = higher priority
        return np.array(self.model_fn(samples))

# Create a combined strategy
keyword_weights = {
    "chest": 0.5,
    "pain": 0.4,
    "breathing": 0.4, 
    "dizz": 0.3,
    "head": 0.2,
    "numb": 0.2
}

keyword_strategy = KeywordPriority(keyword_weights)

Nun lass's Implementieren Sie unseren erweiterten aktiven Lernkreislauf:

python

from matplotlib import pyplot as plt
from IPython.display import clear_output
import time

def run_active_learning_loop(
    samples: List[TextSample],
    annotator: GeminiAnnotator,
    strategy: PrioritizationStrategy,
    iterations: int = 5,
    batch_size: int = 1,
    visualization_interval: int = 1
):
    """Run an active learning loop with visualization.
    
    Args:
        samples: Pool of unlabeled samples
        annotator: Annotation system
        strategy: Sample selection strategy
        iterations: Number of learning iterations
        batch_size: Samples to annotate per iteration
        visualization_interval: How often to update visualizations
    
    Returns:
        List of labeled samples
    """
    labeled_samples = []
    remaining_samples = list(samples)
    
    print("\nStarting Active Learning Loop:")
    
    for i in range(iterations):
        print(f"\n--- Iteration {i+1}/{iterations} ---")
        
        # Filter out already labeled samples
        remaining_samples = [
            s for s in remaining_samples 
            if s not in [getattr(l, '_sample', l) for l in labeled_samples]
        ]
        
        if not remaining_samples:
            print("No more samples to label. Stopping.")
            break
        
        # Select most important samples
        selected = strategy.select(remaining_samples, n=batch_size)
        
        # Annotate selected samples
        newly_labeled = annotator.annotate(selected)
        labeled_samples.extend(newly_labeled)
        
        # Display annotation results
        for sample in newly_labeled:
            print(f"Text: {sample.text}")
            print(f"Category: {sample.labels}")
            print(f"Confidence: {sample.metadata.get('confidence', 0):.2f}")
            explanation = sample.metadata.get('explanation', '')
            print(f"Explanation: {explanation[:100]}..." if len(explanation) > 100 else explanation)
            print()
        
        # Visualize results periodically
        if (i + 1) % visualization_interval == 0:
            visualize_results(labeled_samples)
            
    return labeled_samples

def visualize_results(labeled_samples: List[LabeledSample]):
    """Create visualizations of annotation results.
    
    Args:
        labeled_samples: List of labeled samples to visualize
    """
    if not labeled_samples:
        return
        
    # Extract data
    categories = [s.labels for s in labeled_samples]
    confidence = [s.metadata.get("confidence", 0) for s in labeled_samples]
    texts = [s.text[:30] + "..." for s in labeled_samples]
    
    # Set up plots
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
    
    # Plot 1: Confidence by category
    category_counts = {}
    category_confidence = {}
    
    for cat, conf in zip(categories, confidence):
        if cat not in category_counts:
            category_counts[cat] = 0
            category_confidence[cat] = 0
        category_counts[cat] += 1
        category_confidence[cat] += conf
    
    for cat in category_confidence:
        category_confidence[cat] /= category_counts[cat]
    
    cats = list(category_counts.keys())
    counts = list(category_counts.values())
    avg_conf = list(category_confidence.values())
    
    x = np.arange(len(cats))
    width = 0.35
    
    ax1.bar(x - width/2, counts, width, label='Count')
    ax1.bar(x + width/2, avg_conf, width, label='Avg Confidence')
    ax1.set_xticks(x)
    ax1.set_xticklabels(cats, rotation=45)
    ax1.set_title('Category Distribution and Confidence')
    ax1.legend()
    
    # Plot 2: Individual sample confidence
    sorted_indices = np.argsort(confidence)
    ax2.barh(range(len(texts)), [confidence[i] for i in sorted_indices])
    ax2.set_yticks(range(len(texts)))
    ax2.set_yticklabels([texts[i] for i in sorted_indices])
    ax2.set_title('Sample Confidence')
    ax2.set_xlabel('Confidence')
    
    plt.tight_layout()
    plt.show()

Ausführen der End-to-End-Pipeline

Jetzt können wir unsere komplette aktive Lernpipeline ausführen:

python

# Initialize components
categories = ["Cardiovascular", "Respiratory", "Gastrointestinal", "Neurological"]
annotator = GeminiAnnotator(categories=categories)
strategy = keyword_strategy

# Run the active learning loop
labeled_data = run_active_learning_loop(
    samples=text_samples,
    annotator=annotator,
    strategy=strategy,
    iterations=5,
    visualization_interval=2
)

# Final visualization and analysis
visualize_results(labeled_data)

# Print summary statistics
print("\nAnnotation Summary:")
print(f"Total samples annotated: {len(labeled_data)}")

categories = [s.labels for s in labeled_data]
unique_categories = set(categories)
print(f"Categories found: {len(unique_categories)}")
for category in unique_categories:
    count = categories.count(category)
    print(f"  - {category}: {count} samples ({count/len(labeled_data):.1%})")

avg_confidence = sum(s.metadata.get("confidence", 0) for s in labeled_data) / len(labeled_data)
print(f"Average confidence: {avg_confidence:.2f}")

Praktische Anwendungen und Erweiterungen

Diese Pipeline hat zahlreiche praktische Anwendungen, die über die Klassifizierung medizinischer Symptome hinausgehen:

1. Inhaltsmoderation

Gemeinsam vom Benutzer gemeldete Inhalte
Fokus auf Hochrisikokategorien
Passen Sie die Vertrauensschwellenwerte basierend auf der Inhaltsart an

2. Kundenfeedback-Analyse

Identifizieren Sie dringende Kundenprobleme
Erfassen neu auftretender Produktprobleme
Leiten Sie Feedback an die entsprechenden Teams weiter

3. Dokumentenverarbeitung bei klinischen Studien

Extrahieren von Berichten über unerwünschte Ereignisse
klassifizieren vom Patienten berichtete Ergebnisse
Priorisieren Sie Sicherheitssignale

Sie können diese Implementierung erweitern durch:

Hinzufügen einer Feedbackschleife zur Verbesserung des Annotators
Umsetzung verschiedener Auswahlstrategien (Diversität, Clustering)
Erstellen einer Weboberfläche für die Human-in-the-Loop-Validierung
Der Weg zu Multi-Label-Klassifizierung bei komplexen Symptomen

Fazit

Die Integration von Adala und Google Gemini bietet ein leistungsstarkes Framework für den Aufbau intelligenter Annotationspipelines. Durch den Einsatz aktiver Lernstrategien können wir den manuellen Aufwand drastisch reduzieren und gleichzeitig eine hohe Qualität der Annotationen gewährleisten.

Die in diesem Tutorial vorgestellten modularen Entwurfsmuster ermöglichen eine einfache Anpassung an verschiedene Anwendungsbereiche und Annotationsaufgaben.

Für alle, die sich weiter damit auseinandersetzen möchten, bietet das Adala GitHub-Repository zusätzliche Beispiele und Dokumentationen, um diese Konzepte auf komplexere Annotationsszenarien auszuweiten.

Schreiben Sie bitte einen Kommentar.

Ihre E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit * gekennzeichnet.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden.

TRETEN SIE DEM Aimojo Stamm!

Werden Sie eines von über 76,000 Mitgliedern und erhalten Sie jede Woche Insidertipps! 
🎁 BONUS: Holen Sie sich unsere 200 $“AI „Mastery Toolkit“ KOSTENLOS bei der Anmeldung!

Trending AI Zubehör
Dreamz.ai

Erstellen Sie Ihren privaten Chat, chatten Sie mit anderen Nutzern und sehen Sie Ihren privaten Chat. AI Freundin, mit Videonachrichten, die in jedem Premium-Paket enthalten sind. Unzensiert ab 18 Jahren AI Begleit-Chat für Erwachsene, die die volle Kontrolle behalten wollen.

Fantasybox

AI Erstellung von Erwachsenenbildern und -videos ohne automatische Verlängerung Erstellung von nicht jugendfreien Inhalten (NSFW) auf Basis von Textvorgaben gegen Bezahlung pro Credit

Humata

Verwandeln Sie jedes Dokument in sofort verwertbare Erkenntnisse Das AI Leistungsstarker PDF- und Dokumentenanalyse-Assistent

Iris.ai

AI Wissensfundament, das Unternehmensdaten in vertrauenswürdige, nachvollziehbare Erkenntnisse verwandelt Präzision AI für regulierte Forschung und Entwicklung sowie Wissensmanagement in Unternehmen

Unterbewusstsein

AI Leistungsstarke Literatursuche, die die Arbeiten findet, die anderen entgehen. Der Forschungsassistent, entwickelt für Wissenschaftler, von Wissenschaftlern.

© Copyright 2023 - 2026 | Werden Sie ein AI Pro | Mit ♥ gemacht