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