В мире машинного обучения и генеративного контента одними из самых востребованных инструментов стали foundation models — большие модели, способные создавать текст, изображения и другой контент по запросу пользователя. Yandex активно развивает собственные foundation models, предоставляя их через сервисы Yandex GPT и Yandex ART. Когда мне потребовалось использовать модели в рамках своих проектов, я обнаружил, что не существует готовых библиотек на Rust по работе с Yandex ART и Yandex GPT.

Отсюда и родилась идея создать собственные библиотеки, способные взаимодействовать с API этого сервиса и реализующие их сложные структуры ответов и запросов. Должен сказать, что программирование - не моя профессия, работаю я в другой отрасли, хотя и хочу перейти в IT. Поэтому библиотеки могут показаться сырыми, недоработанными или содержащими "слабый" код. Здесь бы мне хотелось получить профессиональные комментарии по тому, что я сделал хорошо, что плохо. Заранее благодарю за здравую критику и полезные комментарии и предложения.

nn_yandex_gpt

Библиотека nn_yandex_gpt предназначена для работы с текстовыми моделями Yandex GPT. Она поддерживает несколько моделей, включая GPT Lite, GPT PRO и Llama, а также различные версии моделей — Deprecated, Latest и RC.

С помощью этой библиотеки можно:

  • Отправлять текстовые запросы к Yandex GPT и получать сгенерированные ответы.

  • Управлять параметрами генерации текста, такими как температура, максимальное количество токенов и потоковая генерация.

  • Получать структурированные результаты и корректно обрабатывать возможные ошибки API или сети.

Пример использования:

use nn_yandex_gpt::{TextGenerator, ModelType, Version};
use nn_yandex_gpt::models::request::{Request as TextRequest, CompletionOptions};
use nn_yandex_gpt::models::message::{Message, Role};

#[tokio::main]
async fn main() {
    const BUCKET: &str = "your-bucket-id";
    const API_KEY: &str = "your-api-key";

    let generator = TextGenerator::new(API.to_string(), BUCKET.to_string());

    let messages = vec![
        Message {
            role: Role::System,
            text: Some("You are a professional mathematician".to_string()),
            tool_call_list: None,
            tool_result_list: None,
        },
        Message {
            role: Role::User,
            text: Some("Write a fictional proof that 2 + 2 = 5".to_string()),
            tool_call_list: None,
            tool_result_list: None,
        }
    ];

    let mut req = TextRequest::new(messages);

    let mut completion_options = CompletionOptions::new();
    completion_options.temperature = Some(0.3);
    completion_options.max_tokens = Some(500);
    completion_options.reasoning_options = None;

    req.completion_options = Some(completion_options);

    match generator.complete(ModelType::GptPro, Version::RC, req).await {
        Ok(res) => println!("Text generation result: {:?}", res.result.alternatives[0].message.text),
        Err(e) => eprintln!("Error during text generation: {}", e),
    }
}

nn_yandex_art

Библиотека nn_yandex_art позволяет генерировать изображения с помощью модели Yandex ART. Она обеспечивает удобный асинхронный API для создания запросов, проверки статуса операции и получения результата в виде Base64-кода, который можно легко записать в файл.

С помощью этой библиотеки можно:

  • Генерировать изображения по текстовому описанию.

  • Настраивать соотношение сторон, формат и другие параметры.

  • Проверять состояние генерации и получать финальный результат после завершения работы модели.

Пример использования:

use nn_yandex_art
use std::fs::File;
use std::io::Write;
use base64::engine::general_purpose::STANDARD;
use base64::Engine;
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    const BUCKET: &str = "your-bucket-id";
    const API_KEY: &str = "your-api-key";

    let generator = yandex_art::Art::new(API.to_string(), BUCKET.to_string());

    let messages = vec![yandex_art::models::request::Message {
        text: "Dog".to_string(),
        weight: "1".to_string(),
    }];

    let options = yandex_art::models::request::GenerationOptions {
        mime_type: "image/png".to_string(),
        seed: None,
        aspect_ratio: yandex_art::models::request::AspectRatio {
            width_ratio: 1,
            height_ratio: 1,
        },
    };

    let req = yandex_art::models::request::Request::new(messages, options);

    let mut yandex_res = match generator.generate_image(req).await {
        Ok(res) => res,
        Err(e) => {
            eprintln!("Error generating image: {e}");
            return;
        }
    };

    let id = yandex_res.id.clone();

    while !yandex_res.done {
        sleep(Duration::from_secs(1)).await;
        yandex_res = match generator.check_operation(&id).await {
            Ok(res) => res,
            Err(e) => {
                eprintln!("Error checking operation: {e}");
                continue;
            }
        };
    }

    if let Some(resp) = yandex_res.response {
        match STANDARD.decode(&resp.image) {
            Ok(bytes) => {
                match File::create("Image.png") {
                    Ok(mut file) => {
                        if let Err(e) = file.write_all(&bytes) {
                            eprintln!("Error writing file: {e}");
                        } else {
                            println!("Image successfully saved as Image.png");
                        }
                    }
                    Err(e) => eprintln!("Error creating file: {e}"),
                }
            }
            Err(e) => eprintln!("Error decoding Base64: {e}"),
        }
    } else {
        eprintln!("Response is missing image data");
    }
}

Зачем я вообще это все написал?

Цель библиотек - упростить мои разработки на Rust, использующие модели от Яндекса. А статью я написал в первую очередь для того, чтобы получить полезный опыт от более опытных разработчиков. Я и дальше планирую развивать эти библиотеки, а также хочу реализовать библиотеки для взаимодействия с другими моделями Yandex Foundation. В дальнейшей перспективе - реализация взаимодействия с Yandex SpeechKit.

Все библиотеки доступны на GitHub и опубликованы на crates.io под названиями nn_yandex_gpt и nn_yandex_art.

GitHub репозиторий

Комментарии (1)


  1. KanuTaH
    12.09.2025 09:35

    В мире машинного обучения и дегенеративного контента

    Поправил, не благодарите.