Автоматическая генерация кода с использованием LLM

Современные подходы к разработке позволяют автоматизировать создание базовых классов, миграций и других элементов кода с помощью генераторов, основанных на искусственном интеллекте.

Класс Code_Writer

Класс Code_Writer обеспечивает функциональность для записи сгенерированного кода в файлы системы. Он создает необходимые директории и записывает код в соответствующие файлы.

class Code_Writer {
    protected $_base_path;

    public function __construct(string $base_path = APPPATH)
    {
        $this->_base_path = rtrim($base_path, '/');
    }

    public function write(string $filename, string $code): void
    {
        $filepath = $this->_base_path . '/' . $filename;
        $dir = dirname($filepath);
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }
        file_put_contents($filepath, $code);
        echo "Successfully written to: " . $filepath . PHP_EOL;
    }

    public function normalize_filename(string $entity_name, string $type): string
    {
        $entity_name = ucfirst($entity_name);
        switch ($type) {
            case 'sql_migration':
                return 'migrations/' . $this->generate_migration_filename($entity_name) . '.php';
            case 'model':
                return 'classes/Model/' . $entity_name . '.php';
            case 'repository':
                return 'classes/Repository/' . $entity_name . '.php';
            default:
                throw new InvalidArgumentException("Unknown generation type: {$type}");
        }
    }

    protected function generate_migration_filename(string $entity_name): string
    {
        $table_name = Inflector::plural(strtolower($entity_name));
        return date('YmdHis') . '_create_' . $table_name;
    }
}

Этот класс обеспечивает гибкость в структуре файловой системы и позволяет легко расширять его возможности.

Обновление Task_Db_Generate_Entity

Задача Task_Db_Generate_Entity отвечает за генерацию файлов модели, репозитория и миграции на основе заданных параметров.

class Task_Db_Generate_Entity extends Minion_Task {
    protected function _execute(array $params)
    {
        // Парсинг полей
        $fields_description = $this->parse_fields($fields_string);
        
        // Создание JSON payload
        $payload = [
            'entity_name' => $entity_name,
            'table_name' => $table_name,
            'fields_description' => $fields_description,
            'types' => ['sql_migration', 'model', 'repository'],
        ];
        
        // Генерация кода с помощью LLM
        $generated_code = $llm_service->generate($payload);
        
        // Запись кода в файлы
        foreach ($generated_code as $type => $code) {
            try {
                $filename = $code_writer->normalize_filename($entity_name, $type);
                $code_writer->write($filename, $code);
            } catch (Exception $e) {
                echo "Error writing {$type} to file: " . $e->getMessage() . PHP_EOL;
            }
        }
    }

    protected function parse_fields(string $fields_string): array
    {
        // Парсинг строки полей в массив
        // Поддержка различных форматов опций
    }
}

Этот подход обеспечивает автоматическую генерацию кода с минимальным вмешательством разработчика.

Пример запуска

Для запуска генерации используется команда, которая передает параметры для создания сущности:

php index.php db/generate-entity User users --fields="id:INT:primary_key,auto_increment,comment('User ID');email:VARCHAR(255):nullable,comment('User Email');created_at:DATETIME:default('CURRENT_TIMESTAMP'),comment('Creation Timestamp')"

В результате будет сгенерирована структура данных и соответствующие файлы в системе.

Ожидаемый результат

  • Вывод JSON payload для LLM
  • Пути к файлам, куда записывается сгенерированный код
  • Создание файлов в директориях: application/classes/Model, application/classes/Repository и application/migrations
  • Обработка ошибок при записи файлов без прерывания процесса

Примечания

  • Убедитесь в правах на запись в директорию application
  • В реальных приложениях используйте логирование вместо echo
  • Возможно использование другого базового пути для Code_Writer

Следующие шаги

1

Улучшение normalize_filename

Сделать пути более гибкими и конфигурируемыми.

2

Расширение возможностей Code_Writer

Добавить возможность перезаписи файлов с предупреждением и логирование действий.

3

Улучшение промптов для LLM

Добавить примеры JSON payload, ожидаемый вывод и type_map в промпты.

Вопрос

В каком виде вы предлагаете передавать type_map в промпт? Как JSON строку или иначе?

Это позволит LLM лучше понимать, как транслировать типы данных в соответствующий код.