Нейросети как инструмент для написания кода на Python: от простых запросов до сложных решений

Раздел: Машинное обучение -> Нейросети и ИИ

Современные нейросети могут создавать код на Python по текстовому описанию. В статье рассматриваются способы использования таких моделей, от готовых API до локальных решений.

Основные подходы к генерации Python-кода нейросетями

Использование OpenAI API

Наиболее эффективное решение на сегодня - обращение к моделям OpenAI (GPT-4, Codex) через API. Это даёт доступ к мощной нейросети без необходимости обучать или запускать модель локально.

Как сгенерировать код с помощью OpenAI API?


import openai
openai.api_key = "YOUR_API_KEY"

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "Ты эксперт по Python. Отвечай только кодом."},
        {"role": "user", "content": "Напиши функцию, которая принимает список чисел и возвращает их сумму."}
    ],
    temperature=0.7
)

print(response.choices[0].message.content)

нейросеть для генерации кода python (нейросеть для генерации кода на python)

Шаги: установка библиотеки openai (pip install openai), получение API-ключа, отправка запроса с системным и пользовательским сообщением, вывод ответа.

Проблемы: стоимость API (плата за токены), ограничение длины ответа (макс 4096 токенов), необходимость наличия интернета. Типичная ошибка: превышение квоты или неверный формат сообщения.

Локальная модель CodeLlama через Hugging Face

Как запустить генерацию кода без интернета?


from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_name = "codellama/CodeLlama-7b-Python-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")

prompt = "def fibonacci(n):\n    # Вычисляет n-е число Фибоначчи\n"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(inputs.input_ids, max_new_tokens=100, temperature=0.2)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Python нейросеть с нуля (создание нейросети с нуля на python)

Пояснение: загружается модель и токенизатор, формируется промпт (начало функции), генерируется продолжение.

Проблемы: требует мощную видеокарту (минимум 16 ГБ VRAM для 7B модели), долгая загрузка, качество ниже GPT-4. Типичная ошибка: нехватка памяти, неправильное устройство.

GitHub Copilot

Как получить подсказки кода прямо в редакторе?

Copilot встраивается в VS Code, JetBrains и другие IDE. Он анализирует контекст и предлагает код. Не требует написания промптов - достаточно начать печатать.

Проблемы: платная подписка (для бизнеса или индивидуальная), зависимость от интернета (облачное выполнение), иногда предлагает небезопасный код.

Tabnine

Какая альтернатива Copilot с возможностью локального запуска?

Tabnine поддерживает локальные модели (на основе GPT, но меньшего размера). Есть бесплатная версия с ограничениями. Можно обучить на своём коде.

Проблемы: бесплатная версия имеет ограничения по объёму, модель менее точна, чем Copilot.

Fine-tuning своей модели на основе GPT-2

Как обучить собственную нейросеть для генерации кода под специфические задачи?


from transformers import GPT2LMHeadModel, GPT2Tokenizer, Trainer, TrainingArguments, TextDataset, DataCollatorForLanguageModeling

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")

# Загрузка датасета с Python-кодом (например, CodeSearchNet)
train_dataset = TextDataset(tokenizer=tokenizer, file_path="python_code.txt", block_size=128)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

training_args = TrainingArguments(
    output_dir="./gpt2-python",
    overwrite_output_dir=True,
    num_train_epochs=3,
    per_device_train_batch_size=4,
    save_steps=1000,
)

trainer = Trainer(model=model, args=training_args, data_collator=data_collator, train_dataset=train_dataset)
trainer.train()

Пояснение: используется GPT-2 small, датасет из текстовых файлов с кодом. Обучение длительное (часы на GPU).

Проблемы: требует больших объёмов данных и вычислительных ресурсов; результат может быть посредственным без специальной архитектуры (например, CodeGPT). Типичная ошибка: недостаточный датасет или неправильный формат.

Расширенные примеры использования

Генерация класса с методами и док-строками

Пример

import openai

openai.api_key = "YOUR_API_KEY"

prompt = "Создай класс Python для управления библиотекой книг.\nКласс должен содержать:\n- атрибуты: список книг\n- методы: добавить книгу, удалить книгу, найти по названию, вывести все книги\n- каждая книга - объект с полями title, author, year\n- док-строки для методов\n\nТолько код, без пояснений."

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "Ты опытный Python-разработчик."},
        {"role": "user", "content": prompt}
    ],
    temperature=0.7
)

print(response.choices[0].message.content)
class Book:
    def __init__(self, title, author, year):
        self.title = title
        self.author = author
        self.year = year

class Library:
    def __init__(self):
        self.books = []

    def add_book(self, book):
        """Добавляет книгу в библиотеку."""
        self.books.append(book)

    def remove_book(self, title):
        """Удаляет книгу по названию."""
        self.books = [b for b in self.books if b.title != title]

    def find_by_title(self, title):
        """Ищет книгу по названию."""
        for book in self.books:
            if book.title == title:
                return book
        return None

    def list_books(self):
        """Выводит все книги."""
        for book in self.books:
            print(f"{book.title} by {book.author} ({book.year})")

Пояснение: запрос сформулирован детально, модель сгенерировала полный код с классами и док-строками.

Генерация юнит-тестов для существующей функции

Пример

import openai

openai.api_key = "YOUR_API_KEY"

function_code = "def factorial(n):\n    if n < 0:\n        raise ValueError(\"Factorial not defined for negative numbers\")\n    return 1 if n == 0 else n * factorial(n-1)\n"

prompt = "Напиши набор тестов pytest для следующей функции:\n" + function_code + "\nТесты должны покрывать нормальные случаи, граничные и ошибочные."

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": prompt}],
    temperature=0.5
)

print(response.choices[0].message.content)
import pytest

def test_factorial_zero():
    assert factorial(0) == 1

def test_factorial_one():
    assert factorial(1) == 1

def test_factorial_positive():
    assert factorial(5) == 120
    assert factorial(3) == 6

def test_factorial_negative():
    with pytest.raises(ValueError):
        factorial(-1)

def test_factorial_large():
    assert factorial(10) == 3628800

Использование стриминга для пошагового вывода кода

Пример

import openai

openai.api_key = "YOUR_API_KEY"

stream = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Напиши функцию сортировки списка пузырьком с пояснениями в комментариях."}],
    stream=True,
    temperature=0.3
)

for chunk in stream:
    if 'content' in chunk['choices'][0]['delta']:
        print(chunk['choices'][0]['delta']['content'], end='')

Результат выводится постепенно, удобно для отображения длинных ответов.

Генерация кода с использованием локальной модели StarCoder

Пример

from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "bigcode/starcoder"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")

prompt = "def read_csv_file(filename):\n    import csv\n    with open(filename, 'r') as f:\n        reader = csv.reader(f)\n        data = list(reader)\n    return data\n\ndef write_json(data, filename):\n    import json\n"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(inputs.input_ids, max_new_tokens=150, temperature=0.4)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Пояснение: модель StarCoder специализирована на коде, может генерировать большие фрагменты.

Настройка параметров генерации для уменьшения случайности

Пример

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Напиши функцию, которая проверяет, является ли строка палиндромом"}],
    temperature=0.1,
    top_p=0.95,
    frequency_penalty=0.0,
    presence_penalty=0.0,
    max_tokens=200
)
print(response.choices[0].message.content)

При низкой температуре модель выбирает наиболее вероятные токены, код становится предсказуемым.

Нейросеть для генерации кода на Python - comments

En
нейросеть для генерации кода python (python)