Автоматизация множества задач с помощью искусственного интеллекта стала реальностью. С момента появления ChatGPT в 2022 году на рынке появилось все больше продуктов на базе больших языковых моделей (LLM). Тем не менее, подходы к использованию этих моделей все еще требуют доработки. Например, применение инструментов для улучшения промптов и использование кэшированных токенов — это два доступных способа, которые позволяют существенно повысить эффективность приложений на базе LLM.
В этой статье рассматриваются конкретные методы, которые можно применять при создании и организации промптов. Эти подходы помогают снижать задержки и затраты, а также повышать качество генерируемых ответов. Цель — ознакомить с этими методами, чтобы их можно было сразу внедрить в собственные приложения на базе LLM.

Зачем оптимизировать промпты
Часто промпт работает с определенной LLM и дает приемлемые результаты. Однако обычно на его доработку тратится мало времени, что упускает значительный потенциал.
Применение методов, описанных в статье, позволяет без особых усилий повысить качество ответов и снизить расходы. Даже если промпт и модель функционируют, это не гарантирует оптимальной работы, и небольшие изменения могут привести к заметным улучшениям.
Конкретные методы оптимизации
В этом разделе описываются методы, которые можно использовать для доработки промптов.
Размещайте статический контент в начале
Первый метод заключается в том, чтобы всегда помещать статический контент в начало промпта. Под статическим контентом понимается информация, которая не меняется при последовательных вызовах API.
Причина такого размещения связана с тем, что крупные провайдеры LLM, включая Anthropic, Google и OpenAI, применяют кэшированные токены. Это токены, уже обработанные в предыдущем запросе к API, которые можно обрабатывать быстрее и дешевле. Стоимость варьируется в зависимости от провайдера, но обычно кэшированные входные токены стоят около 10% от цены обычных входных токенов.
Кэшированные токены — это элементы, уже обработанные в предшествующем запросе к API, которые можно обрабатывать дешевле и быстрее обычных токенов.
Таким образом, если отправить один и тот же промпт дважды подряд, входные токены второго запроса обойдутся всего в 1/10 от стоимости первого. Это происходит благодаря кэшированию обработки входных токенов провайдерами LLM, что ускоряет и удешевляет новый запрос.
На практике кэширование входных токенов реализуется путем размещения переменных в конце промпта.
Например, если есть длинный системный промпт с вопросом, который меняется от запроса к запросу, следует действовать так:
prompt = f""" {длинный статический системный промпт} {промпт пользователя} """Пример:
prompt = f""" Вы — эксперт по документам ... Всегда отвечайте в этом формате ... Если пользователь спрашивает о ... отвечайте ... {вопрос пользователя} """Здесь статический контент промпта предшествует переменному (вопросу пользователя).
В случаях, когда нужно включать содержимое документов, и обрабатывается множество разных документов, содержимое документа следует размещать в конце промпта:
# при обработке разных документов prompt = f""" {статический системный промпт} {переменная инструкция промпта 1} {содержимое документа} {переменная инструкция промпта 2} {вопрос пользователя} """Однако, если одни и те же документы обрабатываются несколько раз, можно обеспечить кэширование токенов документа, избегая вставки переменных перед ним:
# при многократной обработке одних и тех же документов prompt = f""" {статический системный промпт} {содержимое документа} # размещайте это перед любыми переменными {переменная инструкция промпта 1} {переменная инструкция промпта 2} {вопрос пользователя} """Важно отметить, что кэшированные токены активируются обычно только если первые 1024 токена в двух запросах совпадают. Например, если статический системный промпт в приведенном примере короче 1024 токенов, кэширование не сработает.
# НЕ делайте так prompt = f""" {переменный контент} < --- это устраняет использование кэшированных токенов {статический системный промпт} {содержимое документа} {переменная инструкция промпта 1} {переменная инструкция промпта 2} {вопрос пользователя} """Промпты следует строить начиная с наиболее статического контента (который меняется реже всего от запроса к запросу), переходя к наиболее динамичному (который меняется чаще всего).
- Если есть длинный системный и пользовательский промпт без переменных, размещайте их в начале, а переменные — в конце промпта.
- Если извлекаете текст из документов, например, и обрабатываете один и тот же документ дважды, следует
использовать кэширование для содержимого документов или длинных промптов.
Размещайте вопрос в конце
Еще один способ повысить производительность LLM — всегда ставить вопрос пользователя в конец промпта. Идеально, если системный промпт содержит все общие инструкции, а пользовательский промпт состоит только из вопроса пользователя, как показано ниже:
system_prompt = "<общие инструкции>" user_prompt = f"{вопрос_пользователя}"В документации Anthropic по инженерии промптов указано, что размещение пользовательского промпта в конце может улучшить производительность до 30%, особенно при работе с длинными контекстами. Это помогает модели четче понимать задачу, что часто приводит к более качественным результатам.
Применение оптимизатора промптов
Промпты, написанные людьми, нередко бывают хаотичными, непоследовательными, содержат избыточную информацию и лишены структуры. Поэтому их стоит пропускать через оптимизатор промптов.
Самый простой оптимизатор — это запрос к LLM с формулировкой улучшите этот промпт {промпт}, после чего модель выдаст более организованную версию с меньшим количеством повторов.
Более эффективный вариант — использовать специализированные оптимизаторы, доступные в консолях OpenAI или Anthropic. Эти инструменты представляют собой LLM, специально настроенные для доработки промптов, и обычно дают лучшие результаты. Кроме того, рекомендуется добавлять:
- Описание задачи, которую нужно выполнить.
- Примеры успешных задач с входными и выходными данными.
- Примеры неудачных задач с входными и выходными данными.
Такая дополнительная информация обычно приводит к существенно лучшим результатам, и в итоге получается гораздо более эффективный промпт. На это уйдет около 10-15 минут, но промпт станет заметно производительнее. Это один из самых простых способов улучшить работу LLM.
Тестирование LLM с помощью бенчмарков
Выбор LLM существенно влияет на эффективность приложения. Разные модели лучше справляются с разными задачами, поэтому стоит протестировать несколько вариантов на конкретной области применения. Рекомендуется получить доступ к основным провайдерам, таким как Google Gemini, OpenAI и Anthropic. Настройка доступа проста, а смена провайдера занимает минуты при наличии учетных данных. Также можно рассмотреть открытые LLM, хотя они требуют больше усилий.
Необходимо создать бенчмарк для конкретной задачи и определить, какая модель работает лучше. Кроме того, следует периодически проверять производительность моделей, поскольку крупные провайдеры иногда обновляют их без выпуска новых версий. Конечно, стоит тестировать и любые новые модели от ведущих провайдеров.
Заключение
В статье рассмотрены четыре метода для повышения эффективности приложений на базе LLM. Обсуждены использование кэшированных токенов, размещение вопроса в конце промпта, применение оптимизаторов промптов и создание специализированных бенчмарков для LLM. Эти методы относительно просты в реализации и могут привести к значительному росту производительности. Существуют и другие подобные подходы, и стоит всегда искать их. Такие темы часто освещаются в блогах, где материалы от Anthropic особенно полезны для улучшения работы с LLM.