Por qué Rust e IA no son ciencia ficción, sino una herramienta de trabajo
\n\nCuando escuchamos «inteligencia artificial» y «Rust» en la misma frase, normalmente imaginamos redes neuronales complejas escritas en Python. Pero ¿y si te dijera que Rust puede ser un excelente backend para interactuar con ChatGPT? Sin Python lento, sin dependencias como TensorFlow, solo código limpio, rápido y seguro que se comunica con la API de OpenAI.
\n\nEn este artículo no vamos a enseñar a una red neuronal desde cero; haremos algo más práctico: escribiremos un programa en Rust que envía solicitudes a ChatGPT y recibe respuestas. Luego, le enseñaremos a generar código, documentación e incluso corregir errores. ¿Suena a magia? En realidad, solo son un par de crates y la clave API correcta.
\n\nSi alguna vez quisiste agregar «cerebro» a tu proyecto Rust en forma de modelo de lenguaje, has llegado al lugar indicado. ¡Allá vamos!
\n\nQué necesitamos: herramientas y preparación
\n\nAntes de escribir código, analicemos qué se necesita para integrar ChatGPT en una aplicación Rust.
\n\nComponentes necesarios
\n- \n
- Rust — compilador instalado (rustc) y gestor de paquetes Cargo. Si aún no tienes Rust —
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n - Clave API de OpenAI — regístrate en platform.openai.com, crea una clave y colócala en la variable de entorno
OPENAI_API_KEY\n - Bibliotecas de Rust — usaremos los crates
reqwest(para solicitudes HTTP),serdeyserde_json(para trabajar con JSON),tokio(entorno de ejecución asíncrono) \n
Creando el proyecto
\ncargo new rust_chatgpt\ncd rust_chatgpt\n\nAgreguemos las dependencias en 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\nAhora podemos ejecutar cargo build — las dependencias se descargarán automáticamente.
Escribiendo la primera solicitud a ChatGPT en Rust
\n\nLa forma más sencilla de «conversar» con ChatGPT es enviar una solicitud POST al endpoint https://api.openai.com/v1/chat/completions. Rust, con su tipado estricto, es ideal para esta tarea: describiremos claramente la estructura de la solicitud y la respuesta, y el compilador nos verificará en cada paso.
Estructuras de datos para la API
\nLa API de OpenAI espera un JSON con un esquema específico. Describámoslo 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\nObserva: Message se usa tanto para enviar como para recibir, por lo que agregamos ambos atributos Serialize y Deserialize.
Solicitud asíncrona
\nAhora escribamos una función que envíe un mensaje y devuelva la respuesta de 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("La variable OPENAI_API_KEY no está configurada");\n\n let client = reqwest::Client::new();\n\n let request_body = ChatRequest {\n model: "gpt-4o-mini".to_string(), // modelo rápido y económico\n messages: vec![\n Message {\n role: "system".to_string(),\n