تكامل mistral.rs

تشغيل LLMs محليًا باستخدام استدلال Rust الأصلي - لا توجد خوادم خارجية، ولا مفاتيح API.


ما هو mistral.rs؟

mistral.rs هو محرك استدلال Rust عالي الأداء يقوم بتشغيل LLMs مباشرة على أجهزتك. يدمجه ADK-Rust من خلال crate adk-mistralrs.

أبرز الميزات:

  • 🦀 Rust الأصلي - لا يوجد Python، ولا خوادم خارجية
  • 🔒 يعمل بالكامل بدون اتصال - لا يتطلب مفاتيح API أو إنترنت
  • تسريع الأجهزة - تحسينات CUDA، Metal، CPU
  • 📦 Quantization - تشغيل نماذج كبيرة على أجهزة محدودة
  • 🔧 LoRA adapters - دعم النماذج المضبوطة بدقة مع التبديل السريع
  • 👁️ نماذج الرؤية - قدرات فهم الصور
  • 🎯 نماذج متعددة - خدمة نماذج متعددة من مثيل واحد

الخطوة 1: إضافة التبعيات

نظرًا لأن adk-mistralrs يعتمد على مستودعات git، فلا يمكن نشره على crates.io. أضفه عبر 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"

لتسريع الأجهزة، أضف feature flags:

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

الخطوة 2: مثال أساسي

قم بتحميل model من HuggingFace وتشغيله محليًا:

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

ماذا يحدث:

  1. أول تشغيل يقوم بتنزيل الـ model من HuggingFace (حوالي 2-8 جيجابايت حسب الـ model)
  2. يتم تخزين الـ Model مؤقتًا محليًا في ~/.cache/huggingface/
  3. التشغيلات اللاحقة يتم تحميلها من الـ cache على الفور

الخطوة 3: تقليل الذاكرة باستخدام التحويل الكمي

تحتاج النماذج الكبيرة إلى الكثير من ذاكرة الوصول العشوائي (RAM). استخدم ISQ (التحويل الكمي الموقعي) لتقليل الذاكرة:

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<()> {
    // تحميل النموذج باستخدام التحويل الكمي 4 بت لتقليل الذاكرة
    let config = MistralRsConfig::builder()
        .model_source(ModelSource::huggingface("microsoft/Phi-3.5-mini-instruct"))
        .isq(QuantizationLevel::Q4_0) // تحويل كمي 4 بت
        .paged_attention(true) // انتباه فعال للذاكرة
        .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(())
}

مستويات التحويل الكمي:

المستوىتقليل الذاكرةالجودةالأفضل لـ
Q4_0~75%جيدذاكرة وصول عشوائي محدودة (8 جيجابايت)
Q4_1~70%أفضلمتوازن
Q8_0~50%عالييركز على الجودة
Q8_1~50%الأعلىأفضل جودة

الخطوة 4: محولات LoRA (نماذج معدلة بدقة)

تحميل النماذج باستخدام محولات LoRA للمهام المتخصصة:

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<()> {
    // تحميل النموذج الأساسي باستخدام محول LoRA
    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(())
}

تبديل المحولات السريع أثناء التشغيل:

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

الخطوة 5: نماذج الرؤية (فهم الصور)

معالجة الصور باستخدام نماذج الرؤية واللغة:

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

    // تحليل صورة
    let image = image::open("photo.jpg")?;
    let response = model.generate_with_image("Describe this image.", vec![image]).await?;

    Ok(())
}

الخطوة 6: تقديم نماذج متعددة

خدمة نماذج متعددة من مثيل واحد:

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

مصادر النماذج

HuggingFace Hub (افتراضي)

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

دليل محلي

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

GGUF مكمم مسبقًا

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

النماذج الموصى بها

ModelSizeRAM NeededBest For
microsoft/Phi-3.5-mini-instruct3.8B8GBسريع، للأغراض العامة
microsoft/Phi-3.5-vision-instruct4.2B10GBرؤية + نص
Qwen/Qwen2.5-3B-Instruct3B6GBمتعدد اللغات، برمجة
google/gemma-2-2b-it2B4GBخفيف الوزن
mistralai/Mistral-7B-Instruct-v0.37B16GBجودة عالية

تسريع الأجهزة

macOS (Apple Silicon)

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

تسريع Metal تلقائي على أجهزة Mac بمعالج M1/M2/M3.

NVIDIA GPU

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

يتطلب CUDA toolkit 11.8+.

CPU Only

لا توجد ميزات مطلوبة - CPU هو الافتراضي.


تشغيل الأمثلة

# 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

استكشاف الأخطاء وإصلاحها

نفاد الذاكرة

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

بطء التحميل الأول

  • التشغيل الأول يقوم بتنزيل النموذج (~2-8GB)
  • التشغيلات اللاحقة تستخدم النموذج المخزن مؤقتًا

لم يتم العثور على النموذج

  • تحقق من صحة HuggingFace model ID
  • تأكد من اتصال الإنترنت للتنزيل الأول

ذات صلة


السابق: ← Ollama (محلي) | التالي: Function Tools →