Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save isaldin/5518c0ad02fb5139039ee63cc48ed022 to your computer and use it in GitHub Desktop.
Save isaldin/5518c0ad02fb5139039ee63cc48ed022 to your computer and use it in GitHub Desktop.

Декомпозиция задачи при разработке программного обеспечения с использованием больших языковых моделей (LLM)

— это ключевой подход для достижения более точных и надежных результатов. Вот как это можно реализовать, опираясь на методы промпт-инжиниринга:

Общие принципы декомпозиции

При работе с LLM для сложных задач, таких как разработка программного обеспечения, необходимо разбивать запрос на более мелкие и управляемые шаги. Этот процесс позволяет LLM активировать релевантные фоновые знания и процессы рассуждения, прежде чем пытаться решить конкретную проблему. Это также помогает избежать неясных или неточных ответов, которые могут возникнуть из-за недостаточно детализированных промптов.

Техники декомпозиции задач

  1. Цепочка рассуждений (Chain of Thought, CoT):
    • Суть: CoT промптинг заставляет LLM генерировать промежуточные шаги рассуждения, что помогает получить более точные ответы. Это особенно полезно для сложных задач, требующих логики, таких как математические проблемы или генерация кода.
    • Применение в разработке ПО:
      • Генерация кода: LLM может разбивать сложный запрос на несколько этапов, а затем сопоставлять их с конкретными строками кода.
      • Объяснение кода: Можно попросить LLM объяснить код шаг за шагом.
      • Решение проблем: При столкновении с проблемой, которая требует промежуточного мышления, попросите LLM "показать свою работу". Добавьте фразы вроде "Давайте подумаем шаг за шагом" ("Let's think step by step").
    • Особенности: CoT эффективен и работает с готовыми LLM без необходимости тонкой настройки. Он также обеспечивает интерпретируемость, позволяя видеть шаги рассуждений модели. Однако, он увеличивает количество токенов в ответе, что ведет к росту затрат и времени ответа. Для сложных задач рекомендуется использовать CoT с несколькими примерами (few-shot).
  2. Дерево мыслей (Tree of Thoughts, ToT):
    • Суть: ToT является обобщением CoT и позволяет LLM одновременно исследовать несколько различных путей рассуждения, а не следовать одной линейной цепочке. Это делает ToT особенно подходящим для сложных задач, требующих исследования и планирования, таких как разработка новых архитектур или детализация длинных документов.
    • Применение в разработке ПО:
      • Мозговой штурм архитектуры: Модель может исследовать несколько вариантов дизайна, оценивать их и выбирать лучший.
      • Детализация требований: Разложите проблему на несколько шагов мысли и сгенерируйте несколько вариантов мыслей для каждого шага.
    • Особенности: ToT работает, поддерживая дерево мыслей, где каждая "мысль" представляет собой связную языковую последовательность, служащую промежуточным шагом к решению проблемы. Модель может исследовать различные пути рассуждений, разветвляясь от разных узлов дерева. ToT требует больше ресурсов и затрат по сравнению с CoT.
  3. Reason and Act (ReAct):
    • Суть: ReAct сочетает рассуждение на естественном языке с использованием внешних инструментов (поиск, интерпретатор кода и т. д.). Это позволяет LLM выполнять действия, такие как взаимодействие с внешними API для получения информации, что является первым шагом к моделированию агентов.
    • Применение в разработке ПО:
      • Интеграция с инструментами: LLM может рассуждать о проблеме, генерировать план действий, выполнять действия (например, вызывать API, использовать интерпретатор кода), наблюдать результаты и обновлять свои рассуждения.
      • Автоматизация: Можно использовать LLM для выполнения задач, требующих взаимодействия с внешними системами, например, для поиска информации о библиотеках или API, или для выполнения тестов кода.
  4. Программно-ориентированные языковые модели (Program-aided Language Models, PAL) / Программа мыслей (Program of Thoughts, PoT):
    • Суть: Эти подходы заставляют LLM генерировать операторы языка программирования для решения проблем рассуждения на естественном языке, передавая этап решения исполняющей среде, такой как интерпретатор Python.
    • Применение в разработке ПО: Используются, когда CoT недостаточно эффективен для задач, требующих точных вычислений. LLM генерирует код, который затем выполняется внешним интерпретатором для получения точного ответа.
  5. Автоматизированный промпт-инжиниринг (Automatic Prompt Engineering, APE):
    • Суть: APE автоматизирует процесс создания и оптимизации промптов, снижая потребность в человеческом вводе и улучшая производительность модели.
    • Применение в разработке ПО:
      • Генерация вариантов запросов: LLM может генерировать различные формулировки запросов (например, для чат-бота веб-магазина).
      • Создание документации по требованиям (PRD): Можно попросить модель написать PRD на основе краткого описания функциональности, а затем использовать этот PRD для генерации кода.
  6. Промпты для работы с кодом:
    • Написание кода: LLM может помочь в написании кода на любом языке программирования, значительно ускоряя процесс разработки.
    • Объяснение кода: LLM могут помочь разобраться в чужом коде, генерируя его объяснения.
    • Перевод кода: LLM могут переводить код с одного языка программирования на другой.
    • Отладка и ревью кода: LLM могут помочь в отладке кода, выявлении ошибок и предложении улучшений.
    • Использование структурированного вывода (JSON, Schema): Для задач генерации кода или извлечения данных, требующих строгого формата, следует запрашивать вывод в структурированном виде, таком как JSON или XML. Это помогает модели создавать предсказуемую структуру и уменьшает галлюцинации. Использование JSON-схем для входных данных также может предоставить LLM четкий "чертеж" ожидаемых данных, помогая ей фокусироваться на релевантной информации и снижая риск неверной интерпретации ввода.
    • "List to Most" (разделение задач): Вместо того чтобы заставлять модель решать несколько задач за один вызов, декомпозируйте большую задачу на несколько более простых. Например, сначала отфильтруйте спам, а затем передайте очищенное сообщение основной логике обработки. Это улучшает качество каждого отдельного шага.
    • Избегайте ненужных вычислений в LLM: Если какая-то часть задачи, например, форматирование числовых значений (из килограммов в центнеры), может быть выполнена постобработкой, не заставляйте LLM выполнять эти вычисления. Это позволяет модели сосредоточиться на основной задаче и улучшает качество.

Лучшие практики для декомпозиции и работы со сложными задачами

  • Простота в дизайне: Делайте промпты лаконичными, ясными и легкими для понимания. Разбейте сложные запросы на более простые предложения.
  • Будьте конкретны относительно вывода: Четко указывайте желаемый формат, стиль и содержание ответа.
  • Используйте инструкции, а не ограничения: Вместо того чтобы говорить модели, чего не делать, указывайте, что делать. Это может избежать путаницы и повысить точность вывода.
  • Предоставляйте примеры (Few-shot): Используйте высококачественные, разнообразные примеры, особенно если вы хотите, чтобы вывод соответствовал определенной структуре или шаблону.
  • Итеративный процесс: Промпт-инжиниринг — это итеративный процесс. Создавайте и тестируйте различные промпты, анализируйте и документируйте результаты, а затем уточняйте промпты на основе производительности модели.
  • Документирование: Тщательно документируйте все попытки промптов, чтобы учиться на опыте и облегчать отладку.
  • Человек в контуре: Всегда проверяйте результаты и проверяйте информацию, сгенерированную LLM, чтобы минимизировать галлюцинации и предвзятости.
  • Системные и ролевые промпты: Присваивайте модели определенную роль (например, "старший разработчик", "технический архитектор"), чтобы направлять ее поведение и тон. Используйте системные инструкции для установки общего контекста.
  • Контекстуальный промптинг: Предоставляйте специфическую фоновую информацию, релевантную текущей задаче.
  • Эмоциональная мотивация (по опыту): Некоторые пользователи сообщают, что добавление "эмоциональной мотивации" в промт (например, "ты главный агроном, твоя семья больна, выполни задачу без единой ошибки") может улучшить результаты мощных моделей. Однако это не подтверждено научными исследованиями и является скорее наблюдаемым эффектом.
  • Избегайте избыточного CoT для "думающих" моделей: Для новейших, продвинутых моделей со встроенными механизмами рассуждения, явное добавление инструкций "подумай шаг за шагом" или CoT-демонстраций может быть избыточным, потенциально замедляя процесс или увеличивая стоимость. Эти модели уже выполняют внутренние рассуждения.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment