Создать ассистента для RAG с перефразированием запросов пользователя
В AI Assistant API вы можете подключить дополнительную модель перефразирования, чтобы точнее находить информацию из поисковых индексов. Перефразирование исправит ошибки и опечатки и поможет, если ответ требует больших объемов данных из индексов и сильно зависит от контекста переписки.
Перед началом работы
Чтобы воспользоваться примерами:
-
Создайте сервисный аккаунт и назначьте ему роли
ai.assistants.editor
иai.languageModels.user
. -
Получите и сохраните API-ключ сервисного аккаунта.
В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
С помощью менеджера пакетов pip
установите библиотеку ML SDK:pip install yandex-cloud-ml-sdk
Создайте ассистента
Этот пример основан на примере с информацией о турах и показывает, как создать ассистента с поисковым индексом и подключенной моделью перефразирования.
-
Скачайте и распакуйте архив
с примерами файлов, которые будут использоваться как дополнительный источник информации. В файлах содержатся рекламные тексты для туров на Бали и в Казахстан, сгенерированные YandexGPT Pro. -
Создайте файл
rephraser.py
и добавьте в него следующий код, указав идентификатор каталога и данные для аутентификации:#!/usr/bin/env python3 from __future__ import annotations import pathlib from yandex_cloud_ml_sdk import YCloudML LABEL_KEY = 'yc-ml-sdk-example' PATH = pathlib.Path(__file__) NAME = f'example-{PATH.parent.name}-{PATH.name}' def local_path(path: str) -> pathlib.Path: return pathlib.Path(__file__).parent / path def get_search_index(sdk): # Функция для получения или создания объекта search_index for search_index in sdk.search_indexes.list(): if search_index.labels and search_index.labels.get(LABEL_KEY) == NAME: print(f'using {search_index=}') break else: print('no search indexes found, creating new one') file = sdk.files.upload( local_path('turkey_example.txt') ) operation = sdk.search_indexes.create_deferred(file, labels={LABEL_KEY: NAME}) search_index = operation.wait() print(f'new {search_index=}') file.delete() return search_index def delete_labeled_entities(iterator): # Функция очистки. Удаляет все объекты итератора с атрибутом .labels for entity in iterator: if entity.labels and entity.labels.get(LABEL_KEY) == NAME: print(f'deleting {entity.__class__.__name__} with id={entity.id!r}') entity.delete() def main() -> None: sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) sdk.setup_default_logging(log_level='WARNING') search_index = get_search_index(sdk) labels = {LABEL_KEY: NAME} # Инструмент с поисковым индексом tool = sdk.tools.search_index(search_index) # Инструмент перефразирования rephraser = sdk.tools.rephraser('rephraser', model_version='latest') tool_with_rephraser = sdk.tools.search_index(search_index, rephraser=rephraser) # Создаем два ассистента — с перефразированием и без него assistant_wo_rephraser = sdk.assistants.create('yandexgpt', labels=labels, tools=[tool]) assistant_with_rephraser = sdk.assistants.create('yandexgpt', labels=labels, tools=[tool_with_rephraser]) # Следующий код отправляет запросы с перефразированием и без него, # чтобы показать эффект перефразирования. # Вы можете использовать другие запросы. thread = sdk.threads.create(labels=labels) def run(query, rephrase: bool) -> None: assistant = assistant_with_rephraser if rephrase else assistant_wo_rephraser thread.write(query) run = assistant.run(thread) result = run.wait() print(f"Question: {query}") preposition = 'with' if rephrase else 'without' print(f"Answer {preposition} rephraser:\n {result.text!r}") print() # Возьмем два корректных и два некорректных запроса: run('Куда yбежать?', rephrase=False) # 1 run('Гиде атттапыриццца?', rephrase=False) # 2 run('Где отдохнуть?', rephrase=False) # 3 run('Куда сбежать?', rephrase=False) # 4 # Первый и второй запросы нуждаются в перефразировании: run('Куда убежать?', rephrase=True) run('Гиде атттапыриццца?', rephrase=True) # Удалим все запросы и потоки, # но оставим поисковый индекс, потому что его создание — медленная операция. # Созданный поисковый индекс может быть использован повторно. delete_labeled_entities(sdk.assistants.list()) delete_labeled_entities(sdk.threads.list()) if __name__ == '__main__': main()
Где:
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт.<API-ключ>
— API-ключ сервисного аккаунта для аутентификации в API.
-
Выполните созданный файл:
python3 rephraser.py
Результат
Question: Куда yбежать? Answer without rephraser: 'Вопрос «куда убежать?» может иметь разные интерпретации в зависимости от контекста. Если вы ищете место для отдыха или переезда, то выбор может зависеть от ваших предпочтений, интересов и финансовых возможностей. Вот несколько идей:\n\n1. **Природные места:** если вы любите природу, рассмотрите возможность посещения национальных парков, заповедников или горных курортов.\n\n2. **Исторические города:** если вас привлекает история и культура, исследуйте города с богатым историческим наследием, такие как Рим, Париж, Стамбул и другие.\n\n3. **Пляжные направления:** если вы предпочитаете отдых на море, рассмотрите пляжные курорты в различных странах, таких как Таиланд, Испания, Греция и другие.\n\n4. **Творческие места:** если вы творческая личность, возможно, вам понравятся города с активной культурной жизнью, такие как Нью-Йорк, Лондон, Берлин и другие.\n\n5. **Экзотические направления:** если вы ищете что-то необычное и экзотическое, рассмотрите возможность посещения стран с уникальной культурой и природой, таких как Индия, Перу, Индонезия и другие.\n\nВажно помнить, что выбор места для «побега» зависит от ваших личных предпочтений и интересов. Перед принятием решения о поездке или переезде рекомендуется провести исследование, изучить информацию о месте, его культуре, безопасности и других аспектах.\n\nЕсли ваш вопрос имеет другой контекст, пожалуйста, уточните его, и я постараюсь помочь вам более конкретно.' Question: Гиде атттапыриццца? Answer without rephraser: 'Похоже, что ваш вопрос написан с ошибкой или опечаткой. Пожалуйста, переформулируйте его, и я постараюсь вам помочь.' Question: Где отдохнуть? Answer without rephraser: 'Отдохнуть можно на Бали — острове в Индонезии. Этот остров славится своими прекрасными пляжами, уникальной культурой и гостеприимными жителями. Здесь вы сможете насладиться красотой природы, попробовать местную кухню и познакомиться с новыми людьми.' Question: Куда сбежать? Answer without rephraser: 'Вопрос «куда сбежать?» может иметь разные ответы в зависимости от ваших целей и предпочтений. Вот несколько идей:\n\n1. **Загородный отдых:** если вы хотите сбежать от городской суеты, рассмотрите возможность отдыха в загородном доме, на даче или в кемпинге. Это может быть отличным способом насладиться природой и свежим воздухом.\n\n2. **Путешествия по России:** Россия — большая страна с разнообразными регионами, каждый из которых имеет свои уникальные достопримечательности и природные красоты. Вы можете исследовать исторические города, такие как Санкт-Петербург или Казань, или отправиться в путешествие по Золотому кольцу России.\n\n3. **Международные путешествия:** если вы ищете что-то более экзотическое, рассмотрите возможность поездки в другую страну. Выберите место, которое соответствует вашим интересам, будь то пляжный отдых, горные лыжи или культурные достопримечательности.\n\n4. **Отдых на природе:** если вы любите активный отдых, рассмотрите возможность похода, рыбалки или пикника на природе. Это может быть отличным способом провести время на свежем воздухе и насладиться красотой природы.\n\n5. **Санаторий или курорт:** для тех, кто ищет спокойный и расслабляющий отдых, санаторий или курорт могут быть хорошим выбором. Здесь вы сможете отдохнуть, поправить здоровье и насладиться спа-процедурами.\n\nВажно помнить, что выбор места зависит от ваших индивидуальных предпочтений и целей. Перед принятием решения проведите исследование, изучите информацию о месте, которое вас интересует, и убедитесь, что оно соответствует вашим ожиданиям.' Question: Куда убежать? Answer with rephraser: 'Вопрос «куда убежать?» может подразумевать поиск места для временного уединения или долгосрочного переезда. Выбор зависит от ваших целей, интересов и возможностей. Вот несколько идей:\n\n1. **Тихие уголки природы:** если вы ищете уединение с природой, рассмотрите возможность посещения национальных парков, заповедников или уединённых островов. Это может быть отличным местом для отдыха от городской суеты и восстановления сил.\n\n2. **Исторические города:** если вас привлекает история и культура, исследуйте города с богатым наследием, такие как Санкт-Петербург, Прага, Рим или Токио. Здесь вы можете погрузиться в атмосферу прошлого, посетить музеи, замки и другие исторические достопримечательности.\n\n3. **Пляжный отдых:** если вы предпочитаете пляжный отдых, рассмотрите тропические острова или побережья с красивыми пляжами и тёплым климатом. Примеры включают Сейшелы, Гавайи, Мальдивы и другие.\n\n4. **Активный отдых:** для любителей активного отдыха есть множество вариантов, таких как горные лыжи, сёрфинг, рафтинг и другие виды спорта. Выберите место, которое предлагает возможности для вашего любимого вида активности.\n\n5. **Переезд в другую страну:** если вы рассматриваете возможность долгосрочного переезда, изучите различные страны, которые предлагают хорошие условия для жизни, работы и учёбы. Учитывайте факторы, такие как климат, стоимость жизни, безопасность и культурные особенности.\n\nВажно помнить, что выбор места зависит от ваших индивидуальных предпочтений и целей. Перед принятием решения проведите исследование, изучите информацию о месте, которое вас интересует, и убедитесь, что оно соответствует вашим ожиданиям.' Question: Гиде атттапыриццца? Answer with rephraser: 'Похоже, что ваш вопрос написан с ошибкой или опечаткой. Пожалуйста, переформулируйте его, и я постараюсь вам помочь. Если вы имели в виду «где отдохнуть», то я могу предложить несколько идей:\n\n* **Природные заповедники и национальные парки** — для любителей природы и активного отдыха.\n* **Исторические города** — для тех, кто интересуется культурой и историей.\n* **Пляжный отдых** — для тех, кто хочет расслабиться на солнце и насладиться морским воздухом.\n* **Горнолыжные курорты** — для любителей зимних видов спорта.\n\nВыбор места для отдыха зависит от ваших интересов и предпочтений.'
В результате после перефразирования модели удалось ответить на вопрос
Гиде атттапыриццца?
, а вопросКуда убежать?
получил более подробный ответ.