Go и ChatGPT: создаем ИИ-ассистента для разработки на Golang

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Go встречает ИИ: почему это важно для разработчика

Мир разработки изменился. Если раньше мы писали код вручную и тратили часы на поиск багов, то сегодня нейросети берут на себя рутину. Но как это работает на практике? Можно ли объединить мощь Go и ChatGPT в одном проекте? Ответ — да, и это проще, чем кажется.

Golang — язык, созданный для производительности и параллелизма. А ChatGPT — модель, способная генерировать текст, отвечать на вопросы и даже писать код. Вместе они образуют тандем, который может автоматизировать документацию, генерировать тесты, анализировать ошибки и многое другое. В этой статье мы разберем, как использовать ChatGPT в разработке на Go с реальными примерами кода.

С чего начать: настройка окружения для работы с OpenAI API

Прежде чем писать код, нужно получить доступ к API OpenAI. Это стандартный REST-интерфейс, который легко вызывать из любого языка, включая Go.

Шаг 1. Получаем API-ключ

Зарегистрируйтесь на platform.openai.com, создайте новый секретный ключ в разделе API Keys. Сохраните его — он понадобится для всех запросов.

Шаг 2. Создаем базовую структуру проекта на Go

Создайте новый модуль и установите зависимости:

mkdir go-chatgpt
cd go-chatgpt
go mod init go-chatgpt

Нам понадобится HTTP-клиент. Можно использовать стандартный net/http, но для удобства добавим библиотеку для работы с JSON:

go get github.com/go-resty/resty/v2

Пишем первый запрос к ChatGPT на Go

Самый простой способ интегрировать ChatGPT — отправить POST-запрос к эндпоинту https://api.openai.com/v1/chat/completions. Рассмотрим пример, где мы просим модель объяснить, что такое горутина в Go.

Пример 1: простой запрос к модели

package main

import (
	"encoding/json"
	"fmt"
	"os"

	"github.com/go-resty/resty/v2"
)

type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type Request struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
}

type Response struct {
	Choices []struct {
		Message Message `json:"message"`
	} `json:"choices"`
}

func main() {
	apiKey := os.Getenv("OPENAI_API_KEY")
	if apiKey == "" {
		fmt.Println("Ошибка: установите переменную OPENAI_API_KEY")
		return
	}

	client := resty.New()

	req := Request{
		Model: "gpt-3.5-turbo",
		Messages: []Message{
			{Role: "user", Content: "Объясни, что такое горутина в Go простыми словами"},
		},
	}

	reqBody, _ := json.Marshal(req)

	var resp Response
	_, err := client.R().
		SetHeader("Authorization", "Bearer "+apiKey).
		SetHeader("Content-Type", "application/json").
		SetBody(string(reqBody)).
		SetResult(&resp).
		Post("https://api.openai.com/v1/chat/completions")

	if err != nil {
		fmt.Println("Ошибка запроса:", err)
		return
	}

	if len(resp.Choices) > 0 {
		fmt.Println("Ответ ChatGPT:")
		fmt.Println(resp.Choices[0].Message.Content)
	}
}

Запустите скрипт:

export OPENAI_API_KEY="sk-ваш_ключ"
go run main.go

Вы получите развернутый ответ от нейросети. Это основа, на которой строится любая интеграция ChatGPT с Go.

Продвинутые сценарии: создаем ИИ-ассистента для разработчика

Просто отправлять запросы — скучно. Давайте сделаем что-то полезное: напишем ассистента, который принимает на вход код на Go и возвращает его оптимизированную версию с комментариями.

Пример 2: ИИ-ревьюер кода на Golang

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strings"

	"github.com/go-resty/resty/v2"
)

type ChatRequest struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
	MaxTokens int      `json:"max_tokens"`
}

type ChatResponse struct {
	Choices []struct {
		Message Message `json:"message"`
	} `json:"choices"`
}

func askChatGPT(apiKey, prompt string) (string, error) {
	client := resty.New()

	req := ChatRequest{
		Model: "gpt-3.5-turbo",
		Messages: []Message{
			{Role: "system", Content: "Ты опытный Go-разработчик. Анализируй код и предлагай улучшения."},
			{Role: "user", Content: prompt},
		},
		MaxTokens: 1000,
	}

	reqBody, _ := json.Marshal(req)

	var resp ChatResponse
	_, err := client.R().
		SetHeader("Authorization", "Bearer "+apiKey).
		SetHeader("Content-Type", "application/json").
		SetBody(string(reqBody)).
		SetResult(&resp).
		Post("https://api.openai.com/v1/chat/completions")

	if err != nil {
		return "", err
	}

	if len(resp.Choices) > 0 {
		return resp.Choices[0].Message.Content, nil
	}
	return "", fmt.Errorf("пустой ответ от API")
}

func main() {
	apiKey := os.Getenv("OPENAI_API_KEY")
	if apiKey == "" {
		fmt.Println("Укажите API-ключ через переменную OPENAI_API_KEY")
		return
	}

	fmt.Println("Введите код на Go (для завершения введите END):")
	scanner := bufio.NewScanner(os.Stdin)
	var codeLines []string
	for scanner.Scan() {
		line := scanner.Text()
		if line == "END" {
			break
		}
		codeLines = append(codeLines, line)
	}

	code := strings.Join(codeLines, "\n")
	prompt := fmt.Sprintf("Проверь этот код на Go и предложи улучшения:\n\n```go\n%s\n```", code)

	answer, err := askChatGPT(apiKey, prompt)
	if err != nil {
		fmt.Println("Ошибка:", err)
		return
	}

	fmt.Println("\nРекомендации от ИИ-ассистента:")
	fmt.Println(answer)
}

Этот инструмент можно использовать как часть CI/CD пайплайна. Представьте: вы пушите код, а Go и ChatGPT автоматически проверяют его на соответствие best practices. Удобно, правда?

Практические кейсы: где пригодится связка Go и нейросетей

Мы разобрали базовую интеграцию. Теперь давайте посмотрим, какие реальные задачи решает разработка на Go с ChatGPT:

  • Генерация unit-тестов — передайте функции, и нейросеть напишет тесты с моками.
  • Автоматическая документация — ChatGPT превратит ваш код в красивую документацию с примерами.
  • Поиск уязвимостей — модель может найти потенциальные проблемы безопасности в коде.
  • Перевод кода — конвертируйте Python в Go или наоборот за секунды.

Блоги

Рекомендаций по книгам