Мы часто сталкиваемся с ситуацией, когда команда из 4–5 разработчиков тратит 4–6 часов на создание одного стандартного CRUD-эндпоинта с тестами. При этом бизнес требует 3–5 новых эндпоинтов в неделю — рутина занимает 70% времени, а на бизнес-логику и архитектуру остаётся минимум. Это проблема, которую решает AI-система генерации кода: она берёт на себя шаблонные куски, оставляя инженеру творческие задачи.
Как AI-генерация кода ускоряет разработку?
Кастомный AI-агент не просто вставляет код из шаблона — он понимает контекст вашей кодовой базы: схемы БД, существующие классы, API-контракты, стиль кода. На основе этого он генерирует production-качественный код, проверяет синтаксис, запускает тесты и итеративно исправляет ошибки. Архитектурно такая система включает:
- Context Manager — сбор релевантного контекста: схема БД, API-интерфейсы, существующие модели, code style guide.
- Generation Engine — LLM-агент с инструментами для чтения файлов, выполнения тестов, поиска по кодовой базе.
- Verification Layer — синтаксическая проверка, запуск тестов, линтер.
- Feedback Loop — итерации на основе ошибок тестов.
Code Generation агент на LangGraph
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from typing import TypedDict, Annotated, Optional
import subprocess
import ast
import operator
llm = ChatOpenAI(model="claude-opus-4-5", temperature=0.1)
class CodeGenState(TypedDict):
task_description: str
existing_code_context: str
generated_code: Optional[str]
test_results: Annotated[list, operator.add]
iteration: int
max_iterations: int
errors: Annotated[list, operator.add]
final_code: Optional[str]
@tool
def read_file(file_path: str) -> str:
"""Прочитать файл из кодовой базы для получения контекста."""
try:
with open(file_path) as f:
return f.read()
except FileNotFoundError:
return f"Файл {file_path} не найден"
@tool
def search_codebase(query: str, directory: str = "./src") -> str:
"""Поиск по кодовой базе с помощью grep для нахождения похожего кода."""
result = subprocess.run(
["grep", "-r", "--include=*.py", "-n", query, directory],
capture_output=True, text=True
)
return result.stdout[:3000] if result.stdout else "Ничего не найдено"
@tool
def run_python_syntax_check(code: str) -> str:
"""Проверить синтаксис Python-кода."""
try:
ast.parse(code)
return "Синтаксис корректен"
except SyntaxError as e:
return f"Синтаксическая ошибка: {e}"
@tool
def run_tests(test_file_path: str) -> str:
"""Запустить pytest тесты и вернуть результаты."""
result = subprocess.run(
["python", "-m", "pytest", test_file_path, "-v", "--tb=short"],
capture_output=True, text=True, timeout=60
)
output = result.stdout + result.stderr
return output[-3000:] # Последние 3000 символов
@tool
def write_file(file_path: str, content: str) -> str:
"""Записать код в файл."""
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
return f"Файл {file_path} записан ({len(content)} символов)"
CODE_GEN_SYSTEM = """Ты — Senior Software Engineer. Генерируй production-quality код.
Принципы:
- Следуй существующим паттернам кодовой базы
- Пиши типизированный код (type hints)
- Каждая функция — один уровень абстракции
- Обрабатывай ошибки явно
- Минимальные зависимости от внешних библиотек если есть стандартные аналоги
Процесс:
1. Читай существующий код для контекста
2. Генерируй код соответствующего стиля
3. Проверяй синтаксис
4. Запускай тесты
5. Исправляй ошибки итеративно"""
from langgraph.prebuilt import create_react_agent
code_gen_agent = create_react_agent(
llm.bind_tools([read_file, search_codebase, run_python_syntax_check, run_tests, write_file]),
tools=[read_file, search_codebase, run_python_syntax_check, run_tests, write_file],
state_modifier=CODE_GEN_SYSTEM,
)
Почему важен контекст кодовой базы?
Без контекста LLM генерирует код, который не вписывается в существующую архитектуру — другой стиль, неверные имена, несовместимые импорты. Наш Context Aware Code Generator автоматически собирает релевантные файлы: модели данных, базовые классы, code style guide. Это критично для проектов на FastAPI + SQLAlchemy с кастомными паттернами. Пример реализации:
class ContextAwareCodeGenerator:
def __init__(self, project_root: str):
self.project_root = project_root
self.context_cache = {}
async def gather_context(self, task: str) -> str:
"""Собирает релевантный контекст для задачи"""
# Поиск похожих файлов через LLM
relevant_files = await self.identify_relevant_files(task)
context_parts = []
# Читаем схему БД
if await self.file_exists("models.py"):
models = await read_file_async(f"{self.project_root}/models.py")
context_parts.append(f"## Модели данных\n{models[:2000]}")
# Читаем базовые классы и интерфейсы
for file_path in relevant_files[:3]:
content = await read_file_async(file_path)
context_parts.append(f"## {file_path}\n{content[:1500]}")
# Добавляем code style guide
if await self.file_exists(".codestyle.md"):
style = await read_file_async(f"{self.project_root}/.codestyle.md")
context_parts.append(f"## Code Style\n{style[:1000]}")
return "\n\n".join(context_parts)
async def generate(self, task: str, output_file: str) -> dict:
context = await self.gather_context(task)
result = await code_gen_agent.ainvoke({
"messages": [{
"role": "user",
"content": f"""Задача: {task}
Контекст кодовой базы:
{context}
Выходной файл: {output_file}
Сгенерируй код, проверь его и запиши в файл."""
}]
})
return {
"task": task,
"output_file": output_file,
"iterations": result.get("iteration", 1),
"tests_passed": self.extract_test_status(result),
}
Template-based генерация с LLM-наполнением
Для типовых задач (CRUD, миграции, тесты) эффективен гибридный подход: шаблон с заполнителями, которые LLM раскрывает. Это даёт предсказуемую структуру и контроль над критическими частями.
class CRUDGenerator:
"""Генерирует CRUD-модули по схеме сущности"""
CRUD_TEMPLATE = """
# Модуль для работы с сущностью {entity_name}
from sqlalchemy import Column, Integer, String, DateTime, func
from sqlalchemy.orm import Session
from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime
# ЗАГЛУШКИ ДЛЯ ЗАМЕНЫ LLM:
# COLUMNS - список колонок SQLAlchemy
# PYDANTIC_FIELDS - поля Pydantic схем
# BUSINESS_LOGIC - специфическая бизнес-логика
"""
async def generate_crud_module(self, entity_spec: dict) -> str:
"""entity_spec: {name, fields, business_rules, relationships}"""
# LLM заполняет специфические части
columns = await self.generate_sqlalchemy_columns(entity_spec["fields"])
schemas = await self.generate_pydantic_schemas(entity_spec["fields"])
business_logic = await self.generate_business_logic(entity_spec.get("business_rules", []))
# Собираем итоговый модуль
result = await llm.ainvoke(f"""Создай полный CRUD-модуль для сущности {entity_spec['name']}.
Спецификация: {json.dumps(entity_spec, ensure_ascii=False)}
Стек: FastAPI + SQLAlchemy 2.0 + Pydantic v2
Включи: модель, pydantic схемы, CRUD-функции, FastAPI роутер с dependency injection
Стандарты кода: async/await, type hints, docstrings""")
return result.content
Кейс из нашей практики: финтех-стартап
Наш клиент — финтех-компания с 4 разработчиками, которые тратили 4–6 часов на стандартный CRUD-эндпоинт с тестами. После внедрения AI-генерации время сократилось до 50 минут (15 мин генерация + 35 мин ревью). Сравнение метрик до и после:
| Метрика | До AI | После AI | Улучшение |
|---|---|---|---|
| Время на CRUD-эндпоинт | 5 часов | 50 минут | В 6 раз быстрее |
| Test coverage новых эндпоинтов | 45% | 82% | +37 п.п. |
| Единообразие кода | Низкое (разные паттерны) | Высокое (один паттерн) | Значительно |
| Потребность в доработках после генерации | — | 14% PR | 86% приняты без правок |
Ситуация позволила сэкономить команде существенные средства на рутинных задачах, а стоимость одного PR снизилась в несколько раз. Система генерировала CRUD-модули из OpenAPI-спецификации, автоматически создавала pytest-тесты и Alembic-миграции. AI Code Review агент давал предложения на этапе ревью. Единственная сложность — бизнес-логика в 14% случаев требовала существенной доработки, что решается добавлением правил в контекст.
Сравнение моделей для code generation
| Модель | Латенсия (p99) | Качество кода | Стоимость |
|---|---|---|---|
| GPT-4o | 2.1 с | Отличное | Средняя |
| Claude 3.5 Sonnet | 3.8 с | Выдающееся | Высокая |
| LLaMA 3 (70B, INT4) | 0.9 с | Хорошее | Низкая |
| Mistral (7B, INT4) | 0.4 с | Среднее | Очень низкая |
Выбор модели зависит от бюджета и требований к качеству. Для production-задач рекомендуем Claude 3.5 Sonnet или GPT-4o с контекстным окном.
Что входит в работу
При заказе нашей услуги вы получаете:
- Аудит кодовой базы и архитектуры — оценка зрелости CI/CD, код-стайла, тестового покрытия.
- Проектирование и реализацию AI-агента — с учётом вашего стека и требований.
- Интеграцию с IDE (VS Code, JetBrains) и CI/CD (GitHub Actions, GitLab CI, Jenkins).
- Обучение команды — воркшопы по работе с системой, best practices промптинга.
- Документацию и гарантийную поддержку 1 месяц.
Закажите внедрение AI-генерации и ускорьте разработку.
Сроки ориентировочно
- Базовый генератор с контекстом: 2–3 недели
- Агентный цикл с тестами и итерациями: 2–3 недели
- Интеграция в CI/CD и IDE: 2–3 недели
- Итого: 6–9 недель
Стоимость рассчитывается индивидуально, исходя из объёма и сложности. Свяжитесь с нами для оценки вашего проекта — предложим оптимальное решение. Наш LangGraph агент уже работает в нескольких продакшен-системах, гарантируем стабильность и поддержку.







