Integración de mistral.rs

Ejecuta LLMs localmente con inferencia nativa de Rust, sin servidores externos ni claves de API.


¿Qué es mistral.rs?

mistral.rs es un motor de inferencia de Rust de alto rendimiento que ejecuta LLMs directamente en tu hardware. ADK-Rust lo integra a través del crate adk-mistralrs.

Características clave:

  • 🦀 Rust Nativo - Sin Python, sin servidores externos
  • 🔒 Totalmente offline - No se requieren claves API ni internet
  • Aceleración de hardware - CUDA, Metal, optimizaciones de CPU
  • 📦 Cuantización - Ejecuta modelos grandes en hardware limitado
  • 🔧 Adaptadores LoRA - Soporte para modelos ajustados con intercambio en caliente
  • 👁️ Modelos de visión - Capacidades de comprensión de imágenes
  • 🎯 Multi-modelo - Sirve múltiples modelos desde una instancia

Paso 1: Añadir Dependencias

Dado que adk-mistralrs depende de repositorios de git, no puede ser publicado en crates.io. Añádelo a través de git:

[package]
name = "my-local-agent"
version = "0.1.0"
edition = "2024"

[dependencies]
adk-mistralrs = { git = "https://github.com/zavora-ai/adk-rust" }
adk-agent = { git = "https://github.com/zavora-ai/adk-rust" }
adk-rust = { git = "https://github.com/zavora-ai/adk-rust" }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0"

Para la aceleración de hardware, añade los flags de características:

# macOS with Apple Silicon
adk-mistralrs = { git = "https://github.com/zavora-ai/adk-rust", features = ["metal"] }

# NVIDIA GPU (requires CUDA toolkit)
adk-mistralrs = { git = "https://github.com/zavora-ai/adk-rust", features = ["cuda"] }

Paso 2: Ejemplo Básico

Carga un modelo de HuggingFace y ejecútalo localmente:

use adk_agent::LlmAgentBuilder;
use adk_mistralrs::{Llm, MistralRsConfig, MistralRsModel, ModelSource};
use adk_rust::Launcher;
use std::sync::Arc;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Load model from HuggingFace (downloads on first run)
    let config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("microsoft/Phi-3.5-mini-instruct"))
        .build();

    println!("Loading model (this may take a while on first run)...");
    let model = MistralRsModel::new(config).await?;
    println!("Model loaded: {}", model.name());

    // Create agent
    let agent = LlmAgentBuilder::new("local_assistant")
        .description("Local AI assistant powered by mistral.rs")
        .instruction("You are a helpful assistant running locally. Be concise.")
        .model(Arc::new(model))
        .build()?;

    // Run interactive chat
    Launcher::new(Arc::new(agent)).run().await?;

    Ok(())
}

Qué sucede:

  1. La primera ejecución descarga el modelo de HuggingFace (~2-8GB dependiendo del modelo)
  2. El modelo se guarda en caché localmente en ~/.cache/huggingface/
  3. Las ejecuciones posteriores cargan desde la caché al instante

Paso 3: Reducir la memoria con cuantificación

Los modelos grandes necesitan mucha RAM. Usa ISQ (In-Situ Quantization) para reducir la memoria:

use adk_agent::LlmAgentBuilder;
use adk_mistralrs::{Llm, MistralRsConfig, MistralRsModel, ModelSource, QuantizationLevel};
use adk_rust::Launcher;
use std::sync::Arc;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Load model with 4-bit quantization for reduced memory
    let config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("microsoft/Phi-3.5-mini-instruct"))
        .isq(QuantizationLevel::Q4_0) // 4-bit quantization
        .paged_attention(true) // Memory-efficient attention
        .build();

    println!("Loading quantized model...");
    let model = MistralRsModel::new(config).await?;
    println!("Model loaded: {}", model.name());

    let agent = LlmAgentBuilder::new("quantized_assistant")
        .instruction("You are a helpful assistant. Be concise.")
        .model(Arc::new(model))
        .build()?;

    Launcher::new(Arc::new(agent)).run().await?;

    Ok(())
}

Niveles de cuantificación:

NivelReducción de MemoriaCalidadMejor para
Q4_0~75%BuenaRAM limitada (8GB)
Q4_1~70%MejorEquilibrado
Q8_0~50%AltaEnfocado en calidad
Q8_1~50%La más altaMejor calidad

Paso 4: Adaptadores LoRA (Modelos Ajustados)

Carga modelos con adaptadores LoRA para tareas especializadas:

use adk_agent::LlmAgentBuilder;
use adk_mistralrs::{AdapterConfig, Llm, MistralRsAdapterModel, MistralRsConfig, ModelSource};
use adk_rust::Launcher;
use std::sync::Arc;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Load base model with LoRA adapter
    let config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("meta-llama/Llama-3.2-3B-Instruct"))
        .adapter(AdapterConfig::lora("username/my-lora-adapter"))
        .build();

    println!("Loading model with LoRA adapter...");
    let model = MistralRsAdapterModel::new(config).await?;
    println!("Model loaded: {}", model.name());
    println!("Available adapters: {:?}", model.available_adapters());

    let agent = LlmAgentBuilder::new("lora_assistant")
        .instruction("You are a helpful assistant with specialized knowledge.")
        .model(Arc::new(model))
        .build()?;

    Launcher::new(Arc::new(agent)).run().await?;

    Ok(())
}

Intercambio de adaptadores en tiempo de ejecución:

model.swap_adapter("another-adapter").await?;

Paso 5: Modelos de Visión (Comprensión de Imágenes)

Procesa imágenes con modelos de visión-lenguaje:

use adk_mistralrs::{Llm, MistralRsConfig, MistralRsVisionModel, ModelSource};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("microsoft/Phi-3.5-vision-instruct"))
        .build();

    println!("Loading vision model...");
    let model = MistralRsVisionModel::new(config).await?;
    println!("Model loaded: {}", model.name());

    // Analyze an image
    let image = image::open("photo.jpg")?;
    let response = model.generate_with_image("Describe this image.", vec![image]).await?;

    Ok(())
}

Paso 6: Servicio Multi-Modelo

Sirva múltiples modelos desde una única instancia:

use adk_mistralrs::{MistralRsConfig, MistralRsMultiModel, ModelSource};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let multi = MistralRsMultiModel::new();

    // Add models
    let phi_config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("microsoft/Phi-3.5-mini-instruct"))
        .build();
    multi.add_model("phi", phi_config).await?;

    let gemma_config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("google/gemma-2-2b-it"))
        .build();
    multi.add_model("gemma", gemma_config).await?;

    // Set default and route requests
    multi.set_default("phi").await?;
    println!("Available models: {:?}", multi.model_names().await);

    // Route to specific model
    // multi.generate_with_model(Some("gemma"), request, false).await?;

    Ok(())
}

Fuentes del Modelo

HuggingFace Hub (Por Defecto)

ModelSource::huggingface("microsoft/Phi-3.5-mini-instruct")

Directorio Local

ModelSource::local("/path/to/model")

GGUF Pre-Cuantificado

ModelSource::gguf("/path/to/model.Q4_K_M.gguf")

Modelos Recomendados

ModeloTamañoRAM NecesariaMejor Para
microsoft/Phi-3.5-mini-instruct3.8B8GBRápido, propósito general
microsoft/Phi-3.5-vision-instruct4.2B10GBVisión + texto
Qwen/Qwen2.5-3B-Instruct3B6GBMultilingüe, codificación
google/gemma-2-2b-it2B4GBLigero
mistralai/Mistral-7B-Instruct-v0.37B16GBAlta calidad

Aceleración por Hardware

macOS (Apple Silicon)

adk-mistralrs = { git = "https://github.com/zavora-ai/adk-rust", features = ["metal"] }

La aceleración Metal es automática en Macs con M1/M2/M3.

NVIDIA GPU

adk-mistralrs = { git = "https://github.com/zavora-ai/adk-rust", features = ["cuda"] }

Requiere CUDA toolkit 11.8+.

Solo CPU

No se necesitan características - la CPU es el valor por defecto.


Ejecutar Ejemplos

# Basic usage
cargo run --bin basic

# With quantization
cargo run --bin quantized

# LoRA adapters
cargo run --bin lora

# Multi-model setup
cargo run --bin multimodel

# Vision models
cargo run --bin vision

Solución de Problemas

Falta de Memoria

// Enable quantization
.isq(QuantizationLevel::Q4_0)
// Enable paged attention
.paged_attention(true)

Primera Carga Lenta

  • La primera ejecución descarga el modelo (~2-8GB)
  • Las ejecuciones posteriores utilizan el modelo en caché

Modelo No Encontrado

  • Compruebe que el ID del modelo de HuggingFace sea correcto
  • Asegúrese de tener conexión a internet para la primera descarga

Relacionados


Anterior: ← Ollama (Local) | Siguiente: Function Tools →