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:
- La primera ejecución descarga el modelo de HuggingFace (~2-8GB dependiendo del modelo)
- El modelo se guarda en caché localmente en
~/.cache/huggingface/ - 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:
| Nivel | Reducción de Memoria | Calidad | Mejor para |
|---|---|---|---|
Q4_0 | ~75% | Buena | RAM limitada (8GB) |
Q4_1 | ~70% | Mejor | Equilibrado |
Q8_0 | ~50% | Alta | Enfocado en calidad |
Q8_1 | ~50% | La más alta | Mejor 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
| Modelo | Tamaño | RAM Necesaria | Mejor Para |
|---|---|---|---|
microsoft/Phi-3.5-mini-instruct | 3.8B | 8GB | Rápido, propósito general |
microsoft/Phi-3.5-vision-instruct | 4.2B | 10GB | Visión + texto |
Qwen/Qwen2.5-3B-Instruct | 3B | 6GB | Multilingüe, codificación |
google/gemma-2-2b-it | 2B | 4GB | Ligero |
mistralai/Mistral-7B-Instruct-v0.3 | 7B | 16GB | Alta 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
- Model Providers - Proveedores de LLM en la nube
- Ollama - Servidor de modelos local alternativo
- LlmAgent - Uso de modelos con agents
Anterior: ← Ollama (Local) | Siguiente: Function Tools →