В мире машинного обучения и генеративного контента одними из самых востребованных инструментов стали 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.
ссылка на оригинал статьи https://habr.com/ru/articles/946316/
Добавить комментарий