Нейросети как инструмент для написания кода на 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)
При низкой температуре модель выбирает наиболее вероятные токены, код становится предсказуемым.