Проектирование запросов в .NET

В этой статье описаны основные понятия проектирования запросов. Многие модели ИИ основаны на запросах, что означает, что они реагируют на текст ввода пользователем ( запрос) с ответом, созданным прогнозными алгоритмами ( завершением). Новые модели также часто поддерживают завершение в форме чата с сообщениями на основе ролей (системных, пользователей, помощников) и журнала чатов для сохранения бесед.

Работа с запросами

Рассмотрим этот пример создания текста, в котором запрос — входные данные пользователя и завершение — это выходные данные модели:

Запрос: "Президент, который служил самым коротким сроком, был "

Завершение: "Педро Ласкурейн".

Появляется правильное завершение, но что делать, если ваше приложение должно помочь учащимся истории США? 45-минутный срок Педро Ласкурена является самым коротким сроком для любого президента, но он служил президентом Мексики. Студенты истории США, вероятно, ищут "Уильям Генри Харрисон" Очевидно, что приложение может быть более полезным для своих предполагаемых пользователей, если вы дали ему определенный контекст.

Инженерия запросов добавляет контекст к запросу, предоставляя инструкции, примеры и подсказки, помогающие модели создавать лучшие завершения.

Модели, поддерживающие создание текста, часто не требуют определенного формата, но вы должны упорядочить запросы, поэтому ясно, что такое инструкция и пример. Модели, поддерживающие приложения на основе чата, используют три роли для упорядочивания завершений: системная роль, управляющая чатом, роль пользователя для представления входных данных пользователей и роль помощника для реагирования на пользователей. Разделите запросы на сообщения для каждой роли:

  • Системные сообщения предоставляют инструкции по модели помощника. Запрос может иметь только одно системное сообщение, и оно должно быть первым сообщением.
  • Сообщения пользователей включают запросы от пользователя и показывать примеры, исторические запросы или содержать инструкции для помощника. Пример завершения чата должен иметь по крайней мере одно сообщение пользователя.
  • Сообщения помощника показывают примеры или исторические завершения и должны содержать ответ на предыдущее сообщение пользователя. Сообщения помощника не требуются, но если вы включаете его, необходимо связать с сообщением пользователя, чтобы сформировать пример.

Инструкции по улучшению завершения

Инструкция — это текст, который сообщает модели, как реагировать. Инструкция может быть директивой или императивом:

  • Директивы говорят модели о том, как вести себя, но не являются простыми командами— думайте о настройке символов для импровного актера: "Вы помогаете учащимся узнать об истории США, поэтому говорить о США, если они специально не спрашивают о других странах".
  • Императивы являются однозначными командами для выполнения модели. "Перевод в Tagalog:"

Директивы являются более открытыми и гибкими, чем императивы:

  • В одной инструкции можно объединить несколько директив.
  • Инструкции обычно лучше работают при их использовании с примерами. Тем не менее, поскольку императивы являются однозначной командой, модели не нуждаются в примерах для их понимания (хотя вы можете использовать пример для отображения модели форматирования ответов). Так как директива не сообщает модели точно, что делать, каждый пример может помочь модели работать лучше.
  • Обычно лучше разбить сложную инструкцию на ряд шагов, которые можно сделать с последовательностью директив. Вы также должны сообщить модели выводить результат каждого шага, чтобы можно было легко вносить детализированные корректировки. Несмотря на то что вы можете разбить инструкцию на шаги самостоятельно, проще просто сообщить модели, чтобы сделать это, и вывести результат каждого шага. Этот подход называется цепочкой подсказок мысли.

Основной и вспомогательный контекст добавления содержимого

Вы можете предоставить содержимое, чтобы добавить дополнительный контекст в инструкции.

Основное содержимое — это текст, который требуется обработать модель с помощью инструкции. Независимо от того, какие действия влечет за собой инструкция, модель будет выполнять ее на основном содержимом для создания завершения.

Вспомогательное содержимое — это текст, на который ссылается инструкция, но не целевой объект инструкции. Модель использует вспомогательное содержимое для выполнения инструкции, что означает, что поддержка содержимого также отображается в завершениях, как правило, в виде какой-либо структуры (например, в заголовках или метках столбцов).

Используйте метки с учебным содержимым, чтобы помочь модели выяснить, как использовать ее с инструкцией. Не беспокойтесь слишком много о точности. Метки не должны соответствовать инструкциям именно потому, что модель будет обрабатывать такие вещи, как форма слова и заглавная буква.

Предположим, вы используете инструкцию "Суммирование президентских достижений США" для создания списка. Модель может упорядочивать и упорядочивать ее различными способами. Но что делать, если вы хотите, чтобы список группировать достижения по определенному набору категорий? Используйте вспомогательное содержимое, чтобы добавить эти сведения в инструкцию.

Настройте инструкцию, чтобы группы моделей по категориям и добавляли вспомогательное содержимое, указывающее эти категории:

prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: 'George Washington
- First president of the United States.
- First president to have been a military veteran.
- First president to be elected to a second term in office.
- Received votes from every presidential elector in an election.
- Filled the entire body of the United States federal judges; including the Supreme Court.
- First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ...' ///Text truncated
""";

Использование примеров для руководства по модели

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

Пример начинается с запроса и может дополнительно включать завершение. Завершение в примере не должно включать подробный ответ— он может просто содержать отформатированное слово, первый маркер в неупорядоченном списке или что-то подобное, чтобы указать, как каждое завершение должно начинаться.

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

  • Примеры обучения с нуля включают запрос без подробного завершения. Этот подход проверяет ответы модели, не предоставляя пример выходных данных. Запросы нулевого снимка могут иметь завершение, включающее подсказки, например, указывая, что модель должна выводить упорядоченный список, включая "1". в качестве завершения.
  • Примеры обучения с несколькими выстрелами включают несколько пар запросов с подробными завершениями. Небольшое обучение может изменить поведение модели, добавив в существующие знания.

Общие сведения о подсказках

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

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

prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: George Washington
First president of the United States.
First president to have been a military veteran.
First president to be elected to a second term in office.
First president to receive votes from every presidential elector in an election.
First president to fill the entire body of the United States federal judges; including the Supreme Court.
First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ...  /// Text truncated

DOMESTIC POLICY
- George Washington: 
- John Adams:
""";
  • ВНУТРЕННЯЯ ПОЛИТИКА показывает модель, которую вы хотите запустить каждую группу с категорией во всех ограничениях.
  • - Джордж Вашингтон: показывает модель, чтобы начать каждый раздел с достижениями Джорджа Вашингтона, перечисленных в одной строке.
  • - Джон Адамс: показывает модель, которую она должна перечислить оставшихся президентов в хронологическом порядке.

Пример запроса с помощью .NET

.NET предоставляет различные средства для запроса и чата с различными моделями ИИ. Использование семантического ядра для подключения к различным моделям и службам ИИ, а также другим пакетам SDK, таким как официальная библиотека OpenAI .NET. Семантический ядро включает средства для создания запросов с разными ролями и поддержания журнала чата, а также многих других функций.

Рассмотрим следующий пример кода.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

// Create a kernel with OpenAI chat completion
#pragma warning disable SKEXP0010
Kernel kernel = Kernel.CreateBuilder()
                    .AddOpenAIChatCompletion(
                        modelId: "phi3:mini",
                        endpoint: new Uri("http://localhost:11434"),
                        apiKey: "")
                    .Build();

var aiChatService = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.Add(
    new ChatMessageContent(AuthorRole.System, "You are a helpful AI Assistant."));

while (true)
{
    // Get user prompt and add to chat history
    Console.WriteLine("Your prompt:");
    chatHistory.Add(new ChatMessageContent(AuthorRole.User, Console.ReadLine()));

    // Stream the AI response and add to chat history
    Console.WriteLine("AI Response:");
    var response = "";
    await foreach (var item in
        aiChatService.GetStreamingChatMessageContentsAsync(chatHistory))
    {
        Console.Write(item.Content);
        response += item.Content;
    }
    chatHistory.Add(new ChatMessageContent(AuthorRole.Assistant, response));
    Console.WriteLine();
}

Приведенный выше код содержит примеры следующих понятий:

  • Создает службу журнала чата для запроса модели ИИ для завершения на основе ролей автора.
  • Настраивает ИИ с сообщением AuthorRole.System .
  • Принимает входные данные пользователя, чтобы разрешить различные типы запросов в контексте AuthorRole.Userобъекта.
  • Асинхронно передает завершение из ИИ, чтобы обеспечить динамический чат.

Расширение методов разработки запросов

Вы также можете увеличить мощность ваших запросов с более сложными методами разработки запросов, которые подробно рассматриваются в своих собственных статьях.

  • LLMs имеют ограничения ввода маркеров, которые ограничивают объем текста, который можно поместить в запрос. Используйте решения для внедрения и векторных баз данных, чтобы уменьшить количество маркеров, которые необходимо представить в данном фрагменте текста.
  • LLM не обучаются на ваших данных, если вы не обучаете их самостоятельно, что может быть дорогостоящим и трудоемким. Используйте получение дополненного поколения (RAG), чтобы сделать данные доступными для LLM без обучения.