Первые Rust-библиотеки для работы с Yandex GPT и Yandex ART

от автора

В мире машинного обучения и генеративного контента одними из самых востребованных инструментов стали 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 репозиторий


ссылка на оригинал статьи https://habr.com/ru/articles/946316/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *