Шаблоны запросов с небольшим набором примеров

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

Пример:

Q: Что такое Бэтмен?
A: Бэтмен - вымышленный комиксовый персонаж.

Q: Что такое торсальная плексия?
A: Неизвестно.

Q: Что такое языковая модель?
A:

Сообщите модели, что Q - это вопрос, а A - это ответ, и взаимодействуйте в этом формате.

Ниже представлено объяснение класса инструментов, предоставляемого Lanchain, для вставки небольшого количества интерактивных образцов в запрос.

Использование набора примеров

Создание набора образцов

Определите массив examples ниже, который содержит набор примеров Q&A.

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate

examples = [
  {
    "question": "Чья продолжительность жизни длиннее, Мухаммед Али или Алан Тьюринг?",
    "answer":
"""
Нужно ли задать дополнительные вопросы по данному вопросу: Да.
Дополнительный вопрос: Сколько лет было Мухаммеду Али, когда он умер?
Промежуточный ответ: Мухаммеду Али было 74 года, когда он умер.
Дополнительный вопрос: Сколько лет было Алану Тьюрингу, когда он умер?
Промежуточный ответ: Алану Тьюрингу было 41 год, когда он умер.
Итак, окончательный ответ: Мухаммед Али
"""
  },
  {
    "question": "Когда родился основатель craigslist?",
    "answer":
"""
Нужно ли задать дополнительные вопросы по данному вопросу: Да.
Дополнительный вопрос: Кто основатель craigslist?
Промежуточный ответ: craigslist был основан Крейгом Ньюмарком.
Дополнительный вопрос: Когда родился Крейг Ньюмарк?
Промежуточный ответ: Крейг Ньюмарк родился 6 декабря 1952 года.
Итак, окончательный ответ: 6 декабря 1952 года
"""
  },
  {
    "question": "Кто была матерью бабушки и дедушки Джорджа Вашингтона?",
    "answer":
"""
Нужно ли задать дополнительные вопросы по данному вопросу: Да.
Дополнительный вопрос: Кто была матерью Джорджа Вашингтона?
Промежуточный ответ: Мать Джорджа Вашингтона - Мэри Болл Вашингтон.
Дополнительный вопрос: Кто был отцом Мэри Болл Вашингтон?
Промежуточный ответ: Отец Мэри Болл Вашингтон - Джозеф Болл.
Итак, окончательный ответ: Джозеф Болл
"""
  },
  {
    "question": "Режиссеры фильмов 'Челюсти' и 'Казино Рояль' из одной страны?",
    "answer":
"""
Нужно ли задать дополнительные вопросы по данному вопросу: Да.
Дополнительный вопрос: Кто режиссер 'Челюсти'?
Промежуточный ответ: Режиссер 'Челюсти' - Стивен Спилберг.
Дополнительный вопрос: Откуда Стивен Спилберг?
Промежуточный ответ: Соединенные Штаты.
Дополнительный вопрос: Кто режиссер 'Казино Рояль'?
Промежуточный ответ: Режиссер 'Казино Рояль' - Мартин Кэмпбелл.
Дополнительный вопрос: Откуда Мартин Кэмпбелл?
Промежуточный ответ: Новая Зеландия.
Итак, окончательный ответ: Нет
"""
  }
]

Создание форматировщика для небольших примеров

Просто вставьте примеры в шаблон запроса, используя объект PromptTemplate.

example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Вопрос: {question}\\n{answer}")

print(example_prompt.format(**examples[0]))

Результат:

Вопрос: Чья продолжительность жизни длиннее, Мухаммед Али или Алан Тьюринг?

Нужно ли задать дополнительные вопросы по данному вопросу: Да.
Дополнительный вопрос: Сколько лет было Мухаммеду Али, когда он умер?
Промежуточный ответ: Мухаммеду Али было 74 года, когда он умер.
Дополнительный вопрос: Сколько лет было Алану Тьюрингу, когда он умер?
Промежуточный ответ: Алану Тьюрингу было 41 год, когда он умер.
Итак, окончательный ответ: Мухаммед Али

Предоставление образцов и форматирования для FewShotPromptTemplate

С объектом FewShotPromptTemplate вы можете массово вставлять образцы контента.

prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="Вопрос: {input}",
    input_variables=["input"]
)

print(prompt.format(input="Кто является отцом Джорджа Вашингтона?"))

Возвращает:

Вопрос: Чья продолжительность жизни длиннее, Мухаммед Али или Алан Тьюринг?

Нужно ли продолжить работу над этим вопросом: Да.
Продолжить: Каков возраст Мухаммеда Али на момент смерти?
Промежуточный ответ: Мухаммед Али умер в 74 года.
Продолжить: Каков возраст Алана Тьюринга на момент смерти?
Промежуточный ответ: Алан Тьюринг умер в 41 год.
Итак, окончательный ответ: Мухаммед Али

Вопрос: Когда родился основатель craigslist?

Нужно ли продолжить работу над этим вопросом: Да.
Продолжить: Кто является основателем craigslist?
Промежуточный ответ: Основателем craigslist является Крейг Ньюмарк.
Продолжить: Когда родился Крейг Ньюмарк?
Промежуточный ответ: Крейг Ньюмарк родился 6 декабря 1952 года.
Итак, окончательный ответ: 6 декабря 1952 года

Вопрос: Кто является матерью бабушки и дедушки Джорджа Вашингтона?

Нужно ли продолжить работу над этим вопросом: Да.
Продолжить: Кто является матерью Джорджа Вашингтона?
Промежуточный ответ: Мать Джорджа Вашингтона - Мэри Болл Вашингтон.
Продолжить: Кто является отцом Мэри Болл Вашингтон?
Промежуточный ответ: Отец Мэри Болл Вашингтон - Джозеф Болл.
Итак, окончательный ответ: Джозеф Болл

Вопрос: Режиссеры фильмов "Челюсти" и "Казино Рояль" родом из одной страны?

Нужно ли продолжить работу над этим вопросом: Да.
Продолжить: Кто является режиссером фильма "Челюсти"?
Промежуточный ответ: Режиссер фильма "Челюсти" - Стивен Спилберг.
Продолжить: Откуда родом Стивена Спилберга?
Промежуточный ответ: Соединенные Штаты.
Продолжить: Кто является режиссером фильма "Казино Рояль"?
Промежуточный ответ: Режиссер фильма "Казино Рояль" - Мартин Кэмпбелл.
Продолжить: Откуда родом Мартина Кэмпбелла?
Промежуточный ответ: Новая Зеландия.
Итак, окончательный ответ: Нет

Вопрос: Кто является отцом Джорджа Вашингтона?

Использование селекторов образцов

Предоставление примеров для ExampleSelector

Здесь мы повторно используем набор примеров и шаблон запроса из предыдущего раздела. Однако вместо непосредственного предоставления примеров объекту FewShotPromptTemplate и вставки всех примеров в запрос, мы предоставим их объекту ExampleSelector для вставки части примеров.

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

  • Примечание: Это включает в себя векторные вычисления и векторную базу данных, которые главным образом используются в области искусственного интеллекта для поиска сходства данных, таких как запросы сходного содержания статьи, изображений, видео и т. д. Просто получите здесь общее понимание на сейчас.
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=1
)

question = "Кто является отцом Джорджа Вашингтона?"
selected_examples = example_selector.select_examples({"question": question})
print(f"Наиболее похожий пример: {question}")
for example in selected_examples:
    print("\\n")
    for k, v in example.items():
        print(f"{k}: {v}")

Здесь подобраны примеры, похожие на вопрос, и возвращается следующее:

Запуск Chroma непосредственно с использованием локального API.
    Использование базы данных в памяти DuckDB. Данные будут временными.
    Наиболее похожий пример: Кто является матерью бабушки и дедушки Джорджа Вашингтона?

    question: Кто является матерью Джорджа Вашингтона?
    answer: 
    Нужно ли продолжить работу над этим вопросом: Да.
    Продолжить: Кто является матерью Джорджа Вашингтона?
    Промежуточный ответ: Мать Джорджа Вашингтона - Мэри Болл Вашингтон.
    Продолжить: Кто является отцом Мэри Болл Вашингтон?
    Промежуточный ответ: Отец Мэри Болл Вашингтон - Джозеф Болл.
    Итак, окончательный ответ: Джозеф Болл

Предоставление селектора примера для FewShotPromptTemplate

Наконец, создайте объект FewShotPromptTemplate. Основываясь на селекторе примера из предыдущего примера, выберите пример, похожий на заданный вопрос.

prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="Вопрос: {input}",
    input_variables=["input"]
)

print(prompt.format(input="Кто является отцом Джорджа Вашингтона?"))

Результат:

Вопрос: Кто является матерью дедушки Джорджа Вашингтона?

Нужно ли задать продолжающий вопрос: Да.
Продолжение: Кто является матерью Джорджа Вашингтона?
Промежуточный ответ: Мать Джорджа Вашингтона - Мэри Болл Вашингтон.
Продолжение: Кто является отцом Мэри Болл Вашингтон?
Промежуточный ответ: Отец Мэри Болл Вашингтон - Джозеф Болл.
Итак, окончательный ответ: Джозеф Болл

Вопрос: Кто является отцом Джорджа Вашингтона?