Por que Rust e IA não são ficção científica, mas sim uma ferramenta de trabalho
\n\nQuando ouvimos "inteligência artificial" e "Rust" na mesma frase, geralmente imaginamos redes neurais complexas escritas em Python. Mas e se eu lhe disser que o Rust pode ser um excelente backend para interagir com o ChatGPT? Sem o Python lento, sem dependências como TensorFlow — apenas código puro, rápido e seguro que se comunica com a OpenAI API.
\n\nNeste artigo, não vamos ensinar uma rede neural do zero — faremos algo mais prático: escreveremos um programa em Rust que envia requisições para o ChatGPT e recebe respostas. E então, ensinaremos ele a gerar código, documentação e até corrigir erros. Parece mágica? Na verdade, são apenas alguns crates e uma chave de API correta.
\n\nSe você sempre quis adicionar "cérebros" ao seu projeto Rust na forma de um modelo de linguagem — você veio ao lugar certo. Vamos nessa!
\n\nO que vamos precisar: ferramentas e preparação
\n\nAntes de escrever código, vamos entender o que é necessário para integrar o ChatGPT em uma aplicação Rust.
\n\nComponentes necessários
\n- \n
- Rust — compilador instalado (rustc) e gerenciador de pacotes Cargo. Se você ainda não tem o Rust —
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n - Chave de API da OpenAI — registre-se em platform.openai.com, crie uma chave e coloque-a na variável de ambiente
OPENAI_API_KEY\n - Bibliotecas Rust — usaremos os crates
reqwest(para requisições HTTP),serdeeserde_json(para trabalhar com JSON),tokio(runtime assíncrono) \n
Criando o projeto
\ncargo new rust_chatgpt\ncd rust_chatgpt\n\nAdicionaremos as dependências no Cargo.toml:
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\nAgora podemos executar cargo build — as dependências serão baixadas automaticamente.
Escrevendo a primeira requisição para o ChatGPT em Rust
\n\nA maneira mais simples de "conversar" com o ChatGPT é enviar uma requisição POST para o endpoint https://api.openai.com/v1/chat/completions. Rust, com sua tipagem forte, é ideal para esta tarefa: descreveremos claramente a estrutura da requisição e da resposta, e o compilador nos verificará a cada passo.
Estruturas de dados para a API
\nA OpenAI API espera um JSON com um esquema específico. Vamos descrevê-lo usando serde:
use serde::{Deserialize, Serialize};\n\n#[derive(Serialize)]\nstruct ChatRequest {\n model: String,\n messages: Vec<Message>,\n temperature: f32,\n}\n\n#[derive(Serialize, Deserialize, Clone)]\nstruct Message {\n role: String,\n content: String,\n}\n\n#[derive(Deserialize)]\nstruct ChatResponse {\n choices: Vec<Choice>,\n}\n\n#[derive(Deserialize)]\nstruct Choice {\n message: Message,\n}\n\nObserve: Message é usado tanto para envio quanto para recebimento — por isso adicionamos ambos os atributos Serialize e Deserialize.
Requisição assíncrona
\nAgora vamos escrever uma função que envia uma mensagem e retorna a resposta do ChatGPT:
\n\nuse std::env;\n\nasync fn ask_chatgpt(prompt: &str) -> Result<String, Box<dyn std::error::Error>> {\n let api_key = env::var("OPENAI_API_KEY")\n .expect("Variável OPENAI_API_KEY não definida");\n\n let client = reqwest::Client::new();\n\n let request_body = ChatRequest {\n model: "gpt-4o-mini".to_string(), // modelo rápido e barato\n messages: vec![\n Message {\n role: "system".to_string(),\n