Шаблоны запросов (Prompt templates)

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

Что такое шаблон запроса?

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

Шаблон запроса может содержать следующее содержимое:

  • Инструкции, отправленные большой языковой модели (LLM).
  • Набор примеров вопросов и ответов для напоминания ИИ о предполагаемом формате возвращения запросов.
  • Вопросы, отправленные языковой модели.

Создание шаблона запроса

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

from langchain.prompts import PromptTemplate

prompt_template = PromptTemplate.from_template(
    "Расскажи мне {прилагательное} шутку про {содержимое}."
)

prompt_template.format(прилагательное="смешную", содержимое="куры")

Результат вывода шаблона:

'Расскажи мне смешную шутку про куры.'

Шаблоны запросов для сообщений в чате

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

Например, в API завершения чата OpenAI OpenAI определяет три типа ролей для различных сообщений в чате: ассистент, человек и система:

  • Сообщения ассистента относятся к ответам ИИ.
  • Сообщения человека - это сообщения, отправленные пользователем ИИ.
  • Системные сообщения обычно используются для описания идентичности ИИ.

Пример создания шаблона сообщений в чате:

from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        ("system", "Ты - полезный бот ИИ. Тебя зовут {имя}."),
        ("human", "Привет, как дела?"),
        ("ai", "Всё хорошо, спасибо!"),
        ("human", "{ввод_пользователя}"),
    ]
)

сообщения = chat_template.format_messages(имя="Боб", ввод_пользователя="Как тебя зовут?")

Еще один пример форматирования сообщения:

from langchain.prompts import HumanMessagePromptTemplate
from langchain_core.messages import SystemMessage
from langchain_openai import ChatOpenAI

chat_template = ChatPromptTemplate.from_messages(
    [
        SystemMessage(
            content=(
                "Ты - полезный ассистент, который переписывает текст пользователя, чтобы он звучал более бодро."
            )
        ),
        HumanMessagePromptTemplate.from_template("{текст}"),
    ]
)

сообщения = chat_template.format_messages(текст="Мне не нравится есть вкусные вещи")
print(сообщения)

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