Pembelajaran Aktif untuk Anotasi Data: Panduan Gemini + Adala

Rangka Kerja Adala- Pembelajaran Aktif untuk Anotasi Data

Pembelajaran aktif mengubah cara kita berlatih AI model dengan bijak memilih data yang paling berharga untuk anotasi. Apabila digandingkan dengan LLM yang berkuasa seperti Google Gemini, ia mencipta saluran paip anotasi yang cekap yang mengurangkan usaha manual sambil mengekalkan kualiti data yang tinggi.

Panduan ini meneroka cara membina saluran paip sedemikian menggunakan rangka kerja Adala – alat yang berkuasa tetapi kurang digunakan untuk pelabelan data autonomi.

Kami akan melaksanakan pengelas simptom perubatan yang memanfaatkan Gemini's keupayaan melalui aliran kerja pembelajaran aktif berstruktur.

Memahami Pembelajaran Aktif untuk Anotasi Data

Memahami Pembelajaran Aktif untuk Anotasi Data

Pembelajaran aktif menangani cabaran utama dalam pembelajaran diselia : memperoleh sejumlah besar data berlabel. Daripada memilih titik data secara rawak untuk anotasi, algoritma pembelajaran aktif mengenal pasti sampel paling bermaklumat yang akan menyumbang paling banyak kepada penambahbaikan model.

Mengapa pembelajaran aktif penting:

Mengurangkan kos anotasi dengan memfokuskan usaha manusia di tempat yang paling penting.
Meningkatkan ketepatan model dengan lebih sedikit contoh berlabel.
Menangani ketidakseimbangan kelas dengan mengutamakan kategori yang kurang diwakili.
Mencipta gelung pembelajaran berterusan antara model dan anotasi.

Rangka kerja Adala membawa manfaat ini ke dalam aliran kerja pengeluaran dengan menyediakan komponen modular yang memperkemas proses pembelajaran aktif . Sebelum menyelami pelaksanaan, mari kita kaji apa yang menjadikan Adala sangat sesuai untuk penyepaduan dengan LLM moden seperti Google Gemini.

Apa itu Adala? Pengenalan kepada Rangka Kerja

Adala (Agen Pelabelan Data Autonomi) ialah rangka kerja sumber terbuka yang direka khusus untuk melaksanakan ejen khusus untuk pemprosesan data . Tidak seperti alat anotasi tradisional, Adala menerima pakai pendekatan berasaskan ejen yang menggabungkan:

Seni bina berasaskan kemahiran: Tentukan keupayaan khusus yang diperlukan oleh ejen anotasi anda.
Fleksibiliti masa jalan: Bertukar antara LLM yang berbeza atau masa jalan tersuai.
Sambungan persekitaran: Berinteraksi dengan pelbagai sumber data.
Gelung pembelajaran terbina dalam: Latih ejen untuk bertambah baik dari semasa ke semasa.

Melihat contoh permulaan pantas Adala, kita dapat melihat bagaimana ia menstrukturkan klasifikasi sentimen :

ular sawa

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)

Untuk tugasan pengelasan simptom perubatan kami, kami akan menyesuaikan seni bina ini untuk mengintegrasikan Google Gemini sambil melaksanakan strategi pembelajaran aktif tersuai.

Sediakan Persekitaran Anda

Mari's mulakan dengan memasang Adala dan kebergantungan yang diperlukan:

ular sawa

# 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

Kami juga perlu mengklon repositori untuk akses terus kepada komponennya:

ular sawa

# 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

Mengintegrasikan Google Gemini sebagai Anotasi Tersuai

Tidak seperti pelaksanaan asal yang menggunakan pembalut asas di sekitar Google Gemini, kami akan membina anotator yang lebih mantap yang mengikuti corak reka bentuk Adala. Ini menjadikan penyelesaian kami lebih mudah diselenggara dan diperluas.

Pertama, kita perlu menyediakan Google Generative AI pelanggan:

ular sawa

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)

Sekarang, kami akan membuat anotasi tersuai dengan melanjutkan Adala's Kelas BaseAnnotator:

ular sawa

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

Pelaksanaan ini memberikan peningkatan yang ketara berbanding yang asal:

  1. Ia mengikuti warisan kelas yang betul daripada Adala's BaseAnnotator
  2. Melaksanakan kaedah pembantu peribadi untuk membina segera dan penghuraian respons
  3. Menggunakan berstruktur pengendalian ralat dan taip petunjuk
  4. Menyediakan dokumentasi lengkap

Membina Talian Paip Klasifikasi Gejala

Mari kita cipta set data simptom perubatan untuk tugasan pengelasan kita. Tidak seperti pelaksanaan asal, kita akan menggunakan set data yang lebih pelbagai dengan perwakilan seimbang merentasi kategori:

ular sawa

# 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]

Melaksanakan Strategi Pembelajaran Aktif Lanjutan

Pelaksanaan asal menggunakan mekanisme pemarkahan keutamaan yang mudah. Kami akan meningkatkan ini dengan pelbagai strategi untuk menunjukkan Adala's fleksibiliti:

ular sawa

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)

Sekarang, biarkan's melaksanakan gelung pembelajaran aktif kami yang dipertingkatkan:

ular sawa

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()

Menjalankan Saluran Paip Hujung ke Hujung

Kini kami boleh menjalankan saluran pembelajaran aktif kami yang lengkap:

ular sawa

# 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}")

Aplikasi dan Sambungan Praktikal

Saluran paip ini mempunyai banyak aplikasi praktikal di luar klasifikasi gejala perubatan:

1. Kesederhanaan Kandungan

Mengutamakan kandungan yang dilaporkan pengguna
Fokus pada kategori berisiko tinggi
Sesuaikan ambang keyakinan berdasarkan kandungan ty

2. Analisis Maklum Balas Pelanggan

Kenal pasti segera isu pelanggan
Tangkap masalah produk yang muncul
Halakan maklum balas kepada pasukan yang sesuai

3. Pemprosesan Dokumen Percubaan Klinikal

Ekstrak laporan kejadian buruk
Klasifikasi hasil yang dilaporkan oleh pesakit
Utamakan isyarat keselamatan

Anda boleh melanjutkan pelaksanaan ini dengan:

Menambah gelung maklum balas untuk penambahbaikan annotator
Melaksanakan strategi pemilihan yang berbeza (kepelbagaian, Clustering)
Mencipta antara muka web untuk pengesahan manusia dalam gelung
Mendayakan klasifikasi pelbagai label untuk gejala yang kompleks

Kesimpulan

Integrasi Adala dan Google Gemini menyediakan rangka kerja yang ampuh untuk membina saluran anotasi pintar. Dengan memanfaatkan strategi pembelajaran aktif , kita dapat mengurangkan usaha manual yang diperlukan secara mendadak sambil mengekalkan anotasi berkualiti tinggi.

Corak reka bentuk modular yang ditunjukkan dalam tutorial ini membolehkan penyesuaian mudah kepada domain dan tugas anotasi yang berbeza.

Bagi mereka yang berminat untuk meneroka lebih lanjut, repositori Adala GitHub menawarkan contoh dan dokumentasi tambahan untuk melanjutkan konsep ini kepada senario anotasi yang lebih kompleks.

Sila tinggalkan balasan anda

Alamat e-mel anda tidak akan disiarkan. Medan yang diperlukan ditanda *

Laman ini menggunakan Akismet untuk mengurangkan spam. Ketahui cara data komen anda diproses.

Menyertai Aimojo Puak!

Sertai 76,000+ ahli untuk mendapatkan petua orang dalam setiap minggu! 
🎁 BONUS: Dapatkan $200 kamiAI Mastery Toolkit” PERCUMA apabila anda mendaftar!

tren AI Alatan
Dreamz.ai

Bina, bersembang dengan dan lihat peribadi anda AI teman wanita, dengan mesej video yang digabungkan ke dalam setiap pelan premium. Tidak ditapis 18+ AI sembang teman untuk orang dewasa yang mahukan kawalan penuh.

Kotak Fantasi

AI Penjanaan Imej dan Video Dewasa Tanpa Pembaharuan Automatik Penciptaan kandungan NSFW bayar setiap kredit daripada gesaan teks

Humata

Tukarkan Mana-mana Dokumen Menjadi Kecerdasan Segera dan Boleh Ditindaklanjuti . AI Pembantu Analisis PDF dan Dokumen Berkuasa

Iris.ai

AI Asas Pengetahuan Yang Menukar Data Perusahaan Menjadi Kecerdasan Yang Dipercayai Dan Boleh Diaudit Kepersisan AI untuk R&D yang Dikawal Selia dan Pengurusan Pengetahuan Perusahaan

Lemah

AI Carian Literatur Berkuasa Yang Menemui Kertas Kerja Yang Terlepas Orang Lain Pembantu penyelidik yang dibina untuk saintis, oleh saintis.

© Hak Cipta 2023 - 2026 | Menjadi seorang AI Pro | Dibuat dengan ♥