Автоматическая генерация кода с использованием 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
Следующие шаги
Улучшение normalize_filename
Сделать пути более гибкими и конфигурируемыми.
Расширение возможностей Code_Writer
Добавить возможность перезаписи файлов с предупреждением и логирование действий.
Улучшение промптов для LLM
Добавить примеры JSON payload, ожидаемый вывод и type_map в промпты.
Вопрос
В каком виде вы предлагаете передавать type_map в промпт? Как JSON строку или иначе?
Это позволит LLM лучше понимать, как транслировать типы данных в соответствующий код.