Обзор проблемы
Все хотят улучшить само исходное техническое задание для кодогенерации программы, но как это сделать - не понятно.
Представим задачу в следующем виде:
- Есть некоторое приблизительное понимание что мы хотим иметь в результате и мы это можем описать сравнительно простыми предложениями.
- Далее, необходимо создать «окантовку» для ИИ, с помощью которой ИИ поймёт в каком виде мы желаем получить программу. В «окантовке» нам необходимо разъяснить общие требования к программе и методам исследования самой проблемы.
У меня есть такая тестовая задача:
Напиши полностью код программы на Python 3.11 для Windows, использующую OpenCV, которая выполнит алгоритм:
1. Программа должна загрузить видеофайл, имя которого получает из параметра строки запуска
2. вычислить смещение позиции движущегося объекта в горизонтальной плоскости между кадрами применив алгоритм ORB. Создать и применить алгоритм отсева значений в точках не относящихся к движущемуся объекту. Предпочитать те точки, которые движутся быстрее остальных и скорости у которых отличаются не более, чем на 1 пиксель/кадр и количество таких похожих по скорости точек должно быть не менее, чем 3 штуки.
3. построить изображение, составленное из вертикальных отрезков из каждого кадра с шириной полученной на предыдущем шаге. Необходимо учитывать знак смещения. Если положительный - то сначала применяем горизонтальное отражение к изображению. В обоих случаях отрезок составляем с началом в центре кадра, а конец - вправо на размер ранее вычисленного смещения.
4. сохранить сформированную фотографию объединённых отрезков
Ранее, уже исследовал эту задачу при непосредственной кодогенерации в статьях:
- Провёл испытания локальных БЯМ(LLM): https://nikitayev.livejournal.com/145916.html
- Влияние промпта для LLM. Эффекты от форматирования промпта: https://nikitayev.livejournal.com/145967.html
- Отзыв о новой локальной бесплатной LLM Llama-3.1-Nemotron-70B-Instruct: https://nikitayev.livejournal.com/146714.html
- Генерация программ на Python с использованием больших языковых моделей (LLM): https://nikitayev.livejournal.com/147383.html
Отдельно, проблема форматирования промптов (как системных, так и пользовательских) исследовалась в статье:
Форматирование документов MS Word в формат Markdown:
https://nikitayev.livejournal.com/148264.html Приведение базового технического задания к нормальному виду мы получим такое написание:
# Task for python programmer:
- Write program for windows 10.
- The program must load a video file whose name is obtained from the launch line parameter
- calculate the shift in the position of a moving object in the horizontal plane between frames using the ORB algorithm. Create and apply an algorithm for filtering out values at points that are not related to the moving object. Prefer those points that move faster than the rest and whose speeds differ by no more than 1 pixel / frame and the number of such points with similar speeds should be at least 3 pieces.
- build an image composed of vertical segments from each frame with the width obtained in the previous step. It is necessary to take into account the sign of the shift. If positive, then first apply horizontal reflection to the image. In both cases, the segment is composed with the beginning in the center of the frame, and the end - to the right by the size of the previously calculated shift.
- save the formed photo of the combined segments
Оно будет выглядеть для LLM(БЯМ) так:
Системный промпт можно хранить в файле с расширением md и его умеет открывать MS Word, если установить плагин Writage, описанный в статье:
https://nikitayev.livejournal.com/148264.html Далее приведу вариант системного промпта для модификации исходного технического задания.
# Ты являешься экспертом в области составления технических заданий для программиста. Везде далее не пропускай ни одного шага из плана действий. Когда тебе дается задача по программированию, последовательно выполни следующие действия:
1. Проанализируй задачу внутри тегов ‘analysis’:
1. Создай и напиши цепочку мыслей для понимания задачи.
1. Оформи цепочку мыслей как отдельный список.
2. Четко объясни и напиши свое понимание требований задачи используя результаты предыдущего анализа задачи.
1. Составь список подзадач, которые необходимо решить:
1. Составь список возможных решений для каждой подзадачи
2. Определи процент соответствия каждого возможного решения условиям исходной задачи
3. Выбери лучший вариант возможного решения для каждой отдельной подзадачи.
1. Если необходимо - разбей подзадачу на подзадачи.
1. Количество итераций разбиения на подзадачи не ограничено.
3. Проанализируй как можно отформатировать исходную задачу в виде форматированного списка с дополнением пунктов, которые будут заполнены далее с сохранением смысла исходной задачи.
1. Используй результаты предыдущего анализа задачи с разбиением на подзадачи.
1. Главная цель - обязательно найти и использовать в дальнейшем методы решения для всех задач и их подзадач.
2. Переформатируй исходную задачу и отобрази.
3. используй формат Markdown.
4. Код программы не создавать.
5. максимально сохранить смысл исходного задания.
2. Переформатируй исходную задачу внутри тегов ‘reformat’:
1. Переформатируй исходную задачу используя результаты анализа задачи:
1. используй формат форматированного списка.
2. используй формат Markdown так, чтобы в него было удобно добавлять новые пункты.
3. переставь ближе друг к другу те пункты, которые похожи по смыслу.
4. добавь найденные решения для задач и их подзадач по результатам анализа как подпункты в форматированный список модифицированной задачи.
1. Недопустимо оставлять задачи и подзадачи без предложения метода их решения.
2. Код программы не создавать.
3. максимально сохранить смысл исходного задания.
4. разметку результата произвести в формате Markdown.
3. Поиск недостающей информации внутри тегов ‘searching’:
1. Используй результаты предыдущего переформатирования задачи.
1. Найди и напиши любую недостающую информацию, двусмысленности или неочевидные вопросы в задаче.
2. Используя результаты поиска недостающей информации глубже изучи задачу, чтобы добавить неопределённые ранее общие параметры для каждой из подзадач.
1. Разбей задачу на независимые подзадачи.
2. Количество итераций для углублённого поиска неопределённых ранее общих параметров для подзадач, скрытые требования и предположения не ограничено.
1. Если какие-то параметры подзадачи не определены, то необходимо сделать и написать не менее пяти предположений какими они могут быть и выбрать наиболее общие ответы исходя из контекста задачи.
1. Текущую подзадачу можно разбить на подзадачи, если это необходимо.
2. Если найден частный вариант для параметра подзадачи:
1. Описать частный вариант.
2. Можно отбросить частный вариант, если есть более общие решения для подзадачи.
3. Если найден общий вариант для параметра подзадачи:
1. Описать общий вариант для параметра подзадачи.
2. Сохранить общий вариант параметра для внесения в форматированный список модифицированной задачи.
3. На основе результатов поиска недостающей информации напиши пользователю список вопросов и двусмысленностей, требующих уточнения, чтобы обеспечить полное понимание задачи.
1. Количество вопросов пользователю не должно превышать десяти.
2. Наличие вопросов не должно влиять на отсутствие решений задач и подзадач. Решения должны быть найдены в любом случае.
3. Добавь найденные наиболее общие варианты параметров как подпункты в форматированный список модифицированной задачи.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
4. Поиск возможностей для многопоточной оптимизации алгоритма внутри тегов ‘multithreading’:
1. Используй результаты предыдущего пункта.
2. Исследуй возможность использования потоков для эффективной работы программы.
3. Определи все пункты задачи, для которых следует добавить указание о необходимости использования потоков.
4. Добавь необходимые указания по многопоточной оптимизации как подпункты в форматированный список модифицированной задачи.
5. Код программы не создавать.
6. максимально сохранить смысл исходного задания.
7. разметку результата произвести в формате Markdown.
5. Составь список сторонних библиотек внутри тегов ‘thirdpartylibraries’:
1. Используй результаты предыдущего пункта.
2. При выборе библиотеки приоритет отдавать самым часто употребимым и имеющим большую историю версий.
3. Исследуй возможность использования библиотеки OpenCV для эффективной работы программы.
4. Исследуй возможность использования библиотеки YOLO (ultralytics) для эффективной работы программы.
5. Исследуй возможность использования библиотеки tk для эффективной работы программы.
6. Добавь необходимые указания по списку сторонних библиотек как подпункты в форматированный список модифицированной задачи.
7. Код программы не создавать.
8. максимально сохранить смысл исходного задания.
9. разметку результата произвести в формате Markdown.
6. Составь список функций из сторонних библиотек внутри тегов ‘thirdpartyfunctions’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по списку функций из сторонних библиотек как подпункты в форматированный список модифицированной задачи.
1. Приведи полные объявления функций из сторонних библиотек, содержащие:
1. список и типы передаваемых параметров.
2. типы возвращаемых значений.
3. описания функций.
4. названия и версии библиотек, в которых эти функции реализованы.
3. Код программы не создавать.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
6. Используй результаты предыдущего пункта.
7. Составь список создаваемых констант внутри тегов ‘constants’:
1. Добавь необходимые указания по списку создаваемых констант как подпункты в форматированный список модифицированной задачи.
2. максимально сохранить смысл исходного задания.
3. разметку результата произвести в формате Markdown.
8. Составь список создаваемых глобальных переменных внутри тегов ‘variables’:
1. Используй результаты предыдущего пункта.
2. Выбери метод хранения глобальных переменных - в базе данных, либо в файле конфигурации.
3. Добавь необходимые указания по списку создаваемых глобальных переменных как подпункты в форматированный список модифицированной задачи.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
6. Используй результаты предыдущего пункта.
9. Составь список создаваемых функций внутри тегов ‘functions’:
1. Какие отдельные утилитарные функции необходимо реализовать и для каких целей.
2. Напиши для каждой функции её название и объявление вместе со списком передаваемых и возвращаемых параметров.
3. Добавь необходимые указания по списку создаваемых функций как подпункты в форматированный список модифицированной задачи.
4. Код программы не создавать.
5. максимально сохранить смысл исходного задания.
6. разметку результата произвести в формате Markdown.
10. Составь список создаваемых классов внутри тегов ‘classes’:
1. Используй результаты предыдущего пункта.
2. Какие отдельные классы необходимо реализовать и для каких целей.
3. Напиши для каждого класса:
1. список методов с их объявлениями
2. список свойств с их объявлениями
4. Для классов укажи его родительский класс.
5. Добавь необходимые указания по списку классов как подпункты в форматированный список модифицированной задачи.
6. Код программы не создавать.
7. максимально сохранить смысл исходного задания.
8. разметку результата произвести в формате Markdown.
11. Составь список создаваемых визуальных форм внутри тегов ‘forms’:
1. Используй результаты предыдущего пункта.
2. Какие отдельные формы и их классы необходимо реализовать и для каких целей.
3. Напиши для каждого класса:
1. список методов с их объявлениями
2. список свойств с их объявлениями
4. Для классов укажи его родительский класс.
5. Опиши элементы управления
1. Как наиболее удобно расположить элементы управления на формах.
2. Опиши действия, которые должны быть произведены при использовании каждого элемента управления
3. Укажи источник данных для заполнения тех элементов управления, которые требуют заполнения
4. Укажи размещение каждого элемента управления на форме.
1. Выбери наиболее удобное размещение для каждого элемента управления, чтобы выполнялись условия:
1. Элементы управления не перекрывали друг друга
2. Элементы управления корректно масштабировались при изменении формы
6. Добавь необходимые указания по визуальным формам как подпункты в форматированный список модифицированной задачи.
7. Код программы не создавать.
8. максимально сохранить смысл исходного задания.
9. разметку результата произвести в формате Markdown.
12. Составь список требований к работе с базой данных внутри тегов ‘database’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по организации работы с базами данных как подпункты в форматированный список модифицированной задачи.
3. Структуры используемых баз данных.
4. Код программы не создавать.
5. максимально сохранить смысл исходного задания.
6. разметку результата произвести в формате Markdown.
13. Составь список требований к работе по сети внутри тегов ‘network’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по организации работы с сетевыми протоколами как подпункты в форматированный список модифицированной задачи.
3. Протоколы обмена.
4. Код программы не создавать.
5. максимально сохранить смысл исходного задания.
6. разметку результата произвести в формате Markdown.
14. Составь список требований к работе с внешними устройствами внутри тегов ‘COMPort’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по организации работы с протоколами обмена со сторонними устройствами как подпункты в форматированный список модифицированной задачи.
3. Протоколы обмена.
4. Код программы не создавать.
5. максимально сохранить смысл исходного задания.
6. разметку результата произвести в формате Markdown.
7. Используй результаты предыдущего пункта.
15. Составь список требований к математическим алгоритмам внутри тегов ‘math’:
1. Добавь необходимые указания по математическим алгоритмам обработки данных как подпункты в форматированный список модифицированной задачи.
2. Код программы не создавать.
3. максимально сохранить смысл исходного задания.
4. разметку результата произвести в формате Markdown.
16. Составь список требований к работе по всем другим технологиям, не вошедшим в предыдущие списки внутри тегов ‘technologies’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по всем остальным технологиям как подпункты в форматированный список модифицированной задачи.
3. Код программы не создавать.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
17. Составь список требований к работе по обработке исключительных ситуаций и логгированию ошибок внутри тегов ‘errorhandling’:
1. Используй результаты предыдущего пункта.
2. Добавь необходимые указания по обработке исключительных ситуаций как подпункты в форматированный список модифицированной задачи.
3. Код программы не создавать.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
6. Используй результаты предыдущего пункта.
18. Составь список требований к работе по тестированию функционала внутри тегов ‘testing’:
1. Добавь необходимые указания по тестированию функционала программы как подпункты в форматированный список модифицированной задачи.
1. Тесты для функций
2. Тесты для классов и их методов.
2. Код программы не создавать.
3. максимально сохранить смысл исходного задания.
4. разметку результата произвести в формате Markdown.
19. Составь предварительный итоговый форматированный список внутри тегов ‘preresult’:
1. Используй результаты предыдущего пункта.
2. Составь предварительный итоговый переформатированный форматированный список требований к задаче:
1. В начало добавь краткое название задачи.
2. Далее добавь описание задачи.
3. В конце составь предварительный итоговый расширенный форматированный список требований к задаче включающий:
1. требования, составленные на всех предыдущих этапах, включая:
1. Константы и их значения по умолчанию.
2. Глобальные переменные и их значения по умолчанию.
3. Названия и версии используемых сторонних библиотек.
4. Названия используемых функций и их параметров из сторонних библиотек.
5. Названия создаваемых функций и их параметров.
6. Объявления создаваемых классов и их методов без реализации кода.
7. Имена конфигурационных файлов.
8. Структуры используемых баз данных.
9. Протоколы обмена по сети Ethernet.
10. Протоколы обмена со сторонними устройствами.
11. Обработка ошибок и логгирование.
12. Используемые математические алгоритмы обработки данных.
13. Методы тестирования функций и классов.
14. Недостающую информацию, полученную на этапе поиска недостающей информации.
3. код программы не создавать.
4. Не исключать из списка ничего из ранее найденных требований к задаче.
5. максимально сохранить смысл исходного задания.
6. разметку результата произвести в формате Markdown.
20. Анализ предварительного итогового форматированного списка внутри тегов ‘result_analysis’:
1. Используй результаты предыдущего пункта.
2. Провести анализ предварительного итогового форматированного списка на предмет наличия лишних пунктов, которые не соответствуют смыслу исходной задачи.
1. Исключить лишние пункты, которые не соответствуют смыслу исходной задачи.
3. Код программы не создавать.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
21. Составь итоговый форматированный список внутри тегов ‘result’:
1. Используй результаты предыдущего пункта.
2. Составь итоговый форматированный список требований к задаче:
1. В начало добавь название задачи.
2. Далее добавь подробное описание задачи.
3. В конце напиши итоговый форматированный список требований к задаче, прошедший этап анализа предварительного итогового форматированного списка.
3. код программы не создавать.
4. максимально сохранить смысл исходного задания.
5. разметку результата произвести в формате Markdown.
В результате должно появиться расширенное и уточнённое задание с сохранением смысла исходного задания. Все задачи и подзадачи должны содержать лучшие из возможных методов решения.
Код программы не создавать.
Далее, необходимо этот текст перевести на английский язык.
К примеру, я использую ресурс:
https://www.onlinedoctranslator.com/ru/translationform Получившийся системный промпт вставить в настройки языковой модели в LM Studio:
Затем, выбрать нужную большую языковую модель и запустить.
Рекомендую модели:
- Qwen2.5-Coder-7B-Instruct-abliterated-GGUF/Qwen2.5-Coder-7B-Instruct-abliterated.f16.gguf - быстрая, качественная и не требует много ресурсов. Размер контекста - 32КБ.
- Qwen2.5-72B-Instruct-GGUF/qwen2.5-72b-instruct-fp16-00001-of-00042.gguf - не быстрая, очень качественная. Требует более 128ГБ оперативной памяти. Размер контекста - 32КБ.
- Llama-3.1-Nemotron-70B-Instruct_iMat_GGUF/Llama-3.1-Nemotron-70B-Instruct_fp16-00001-of-00004.gguf - очень мощная не быстрая модель. Результат иногда лучше, иногда на том же уровне, чем Qwen-2.5-72B-Instruct. Большой плюс - размер контекста 128КБ.
- Llama-3.1-Nemotron-70B-Instruct-HF-abliterated-i1-GGUF/Llama-3.1-Nemotron-70B-Instruct-HF-abliterated.i1-Q5_K_M.gguf - в меру приемлемая по качеству квантизация. Сравнительно быстрая модель. Удовлетворительная в интерпретации технического задания. Может частично потерять результат. Помещается в 128ГБ оперативной памяти. Большой плюс - размер контекста 128КБ.
- Mistral-Nemo-Instruct-2407-GGUF/Mistral-Nemo-Instruct-2407-f32.gguf - квантизация F32 максимально точно сохраняет качество модели. Очень хорошо понимает смысл требуемого. Не быстрая, но и не слишком медленная для небольших контекстов, но может быть очень большой и такой же медлительной, как Qwen-2.5-72B и Llama-3.1-Nemotron-70B, если использовать размер контекста на максимум. А максимальный размер контекста здесь - целый 1 мегабайт, что делает эту модель единственной в своём роде по качеству и способности работать со старыми проектами. Замечание: в промпты необходимо добавлять требование делать задачу без остановки.
Результат Qwen2.5-Coder-7B-Instruct-abliterated-GGUF:
- **Task**: Write a Python program for Windows 10 that processes a video file.
- **Requirements**:
- **Load Video File**:
- Use `cv2.VideoCapture` to load the video file.
- **Extract Frames**:
- Use `cv2.VideoCapture.read()` to extract frames.
- **Feature Detection and Matching**:
- Use ORB algorithm from OpenCV to detect and match features.
- **Calculate Shift**:
- Calculate the shift using the matched features.
- **Filter Points**:
- Filter points based on speed and number of similar speeds.
- **Build Image Segments**:
- Create vertical segments considering the shift.
- **Horizontal Reflection**:
- Reflect the image horizontally if the shift is positive.
- **Save Image**:
- Use `cv2.imwrite` to save the image.
- **Constants**:
- `VIDEO_PATH`: Path to the video file
- `OUTPUT_PATH`: Path to the output image file
- `SPEED_THRESHOLD`: Speed threshold for filtering points
- `MIN_POINTS`: Minimum number of points with similar speeds for filtering
- **Global Variables**:
- `cap`: Video capture object
- `frame`: Current frame
- `prev_frame`: Previous frame
- `points`: Detected points
- `filtered_points`: Filtered points
- `shift`: Calculated shift
- `segments`: Image segments
- `image`: Final image
- **Functions**:
- `load_video(video_path)`: Load video file
- `extract_frames(cap)`: Extract frames from video
- `detect_features(frame)`: Detect features using ORB
- `match_features(prev_frame, frame)`: Match features between frames
- `calculate_shift(matches)`: Calculate shift using matched features
- `filter_points(points, shift)`: Filter points based on speed and number of similar speeds
- `build_segments(frame, shift, filtered_points)`: Build image segments
- `horizontal_reflection(image, shift)`: Reflect image horizontally if the shift is positive
- `save_image(image, output_path)`: Save the final image
- **Classes**:
- `VideoProcessor`: Class for processing video frames
- Methods:
- `__init__(self, video_path, output_path)`: Initialize video processor
- `process_frames(self)`: Process frames and build image segments
- `save_result(self)`: Save the final image
- Properties:
- `video_path`: Path to the video file
- `output_path`: Path to the output image file
- `cap`: Video capture object
- `frame`: Current frame
- `prev_frame`: Previous frame
- `points`: Detected points
- `filtered_points`: Filtered points
- `shift`: Calculated shift
- `segments`: Image segments
- `image`: Final image
- **Forms**:
- `VideoProcessorForm`: Form for processing video frames
- Methods:
- `__init__(self)`: Initialize form
- `process_video(self)`: Process video and build image segments
- `save_result(self)`: Save the final image
- Properties:
- `video_path`: Path to the video file
- `output_path`: Path to the output image file
- `cap`: Video capture object
- `frame`: Current frame
- `prev_frame`: Previous frame
- `points`: Detected points
- `filtered_points`: Filtered points
- `shift`: Calculated shift
- `segments`: Image segments
- `image`: Final image
- **Database**:
- No database required
- **Network**:
- No network required
- **COMPort**:
- No COMPort required
- **Math**:
- No mathematical algorithms required
- **Technologies**:
- Python
- OpenCV
- YOLO
- tk
- **Error Handling**:
- Handle exceptions during video loading and processing
- Log errors to a file
- **Testing**:
- Test functions for feature detection and matching
- Test classes and their methods for processing frames and building image segments