¿Por qué Go y ChatGPT son el tándem ideal?
\n¿Alguna vez se ha preguntado qué tan rápido puede "enseñar" a su programa Go a comunicarse con el usuario como una persona real? ¿O tal vez desea automatizar la generación de contenido, crear un asistente inteligente o simplemente agregar un "toque especial" a su servicio? La integración con la API de ChatGPT en Go no es solo una tendencia moderna, sino una herramienta poderosa que abre las puertas al mundo de la inteligencia artificial. Go, con su velocidad y simplicidad, es ideal para crear solicitudes rápidas y confiables a redes neuronales. En este artículo no solo analizaremos la teoría, sino que escribiremos código real que puede usar de inmediato en sus proyectos.
\n\nPreparando el terreno: ¿qué necesitas para empezar?
\nAntes de sumergirnos en el código, asegurémonos de tener todo lo necesario. Necesitará:
\n- \n
- Go instalado (versión 1.21 o superior, para usar todas las capacidades modernas). \n
- Clave API de OpenAI. Puede obtenerla en la plataforma de OpenAI. Trátela como la contraseña de su tarjeta bancaria: ¡manténgala en secreto! \n
- Comprensión básica de solicitudes HTTP y estructuras de datos en Go. \n
Todo el código del artículo lo escribiremos en un solo archivo main.go para no complicar la estructura. ¡Allá vamos!
Paso 1: Creamos un cliente HTTP y enviamos la primera solicitud
\nEl corazón de nuestra integración será el paquete estándar net/http. Es ligero, rápido y no requiere dependencias externas. Nuestra tarea es enviar una solicitud POST al endpoint https://api.openai.com/v1/chat/completions con el cuerpo y los encabezados correctos.
Estructura de la solicitud
\nLa API de ChatGPT espera un JSON con un formato específico. Creemos estructuras de Go que coincidan exactamente con ese formato:
\npackage main\n\nimport (\n "bytes"\n "encoding/json"\n "fmt"\n "io"\n "net/http"\n "os"\n)\n\ntype ChatMessage struct {\n Role string `json:"role"`\n Content string `json:"content"`\n}\n\ntype ChatRequest struct {\n Model string `json:"model"`\n Messages []ChatMessage `json:"messages"`\n}\n\ntype ChatResponse struct {\n Choices []struct {\n Message ChatMessage `json:"message"`\n } `json:"choices"`\n}\nObserve las etiquetas json:"...". Garantizan que Go "empaquete" (serialice) correctamente nuestros datos en el JSON que OpenAI entenderá.
Función de envío
\nAhora escribamos una función que se encargue de todo el "trabajo sucio": formar la solicitud, enviarla y analizar la respuesta.
\nfunc askChatGPT(apiKey, prompt string) (string, error) {\n reqBody := ChatRequest{\n Model: "gpt-3.5-turbo",\n Messages: []ChatMessage{\n {Role: "user", Content: prompt},\n },\n }\n\n jsonData, err := json.Marshal(reqBody)\n if err != nil {\n return "", fmt.Errorf("error de marshaling: %w", err)\n }\n\n request, err := http.NewRequest("POST", "https://api.openai.com/v1/chat/completions", bytes.NewBuffer(jsonData))\n if err != nil {\n return "", fmt.Errorf("error al crear la solicitud: %w", err)\n }\n\n request.Header.Set("Content-Type", "application/json")\n request.Header.Set("Authorization", "Bearer "+apiKey)\n\n client := &http.Client{}\n response, err := client.Do(request)\n if err != nil {\n return "", fmt.Errorf("error al ejecutar la solicitud: %w", err)\n }\n defer response.Body.Close()\n\n body, err := io.ReadAll(response.Body)\n if err != nil {\n return "", fmt.Errorf("error al leer la respuesta: %w", err)\n }\n\n // Verificamos el código de estado\n if response.StatusCode != http.StatusOK {\n return "", fmt.Errorf("la API devolvió un error: %s, cuerpo: %s", response.Status, string(body))\n }\n\n var chatResp ChatRes