Создать ассистента для поиска с указанием метаданных исходных файлов и индексов
Функциональность AI Assistant API находится на стадии Preview.
AI Assistant API — это инструмент создания AI-ассистентов. С его помощью можно создать персонализированных помощников, реализовывать сценарий генеративного ответа с учетом информации из внешних источников (RAG, Retrieval Augmented Generation), присваивая файлам-источникам и поисковым индексам наборы метаданных, которые позволят более эффективно ориентироваться во внешних источниках.
Перед началом работы
Чтобы воспользоваться примером:
-
Создайте сервисный аккаунт и назначьте ему роли
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. -
Создайте файл
search-assistant.py
и добавьте в него следующий код:import pathlib from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.search_indexes import ( VectorSearchIndexType, ) # Локальный путь, по которому расположены файлы-источники. mypath = "<путь_к_файлам_с_примерами>" # Переменная file_labels содержит метаданные, # которые будут присвоены файлам-источникам. file_labels = [ {"bali": "Файл с описанием туров на Бали"}, {"kazakhstan": "Файл с описанием предложения по Казахстану"}, ] # Переменная index_label содержит метаданные, # которые будут присвоены поисковому индексу. index_label = { "promo": "Индекс содержит общую информацию о Бали и Казахстане", "visas": "Индекс содержит информацию о визовой политике при въезде на Бали и в Казахстан", } def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) # Загрузим файлы-источники и присвоим им метаданные из переменной file_labels. # Файлы будут храниться 5 дней. paths = pathlib.Path(mypath).iterdir() files = [] file_count = 0 for path in paths: file = sdk.files.upload( path, ttl_days=5, expiration_policy="static", name=str(path), labels=file_labels[file_count] ) files.append(file) file_count += 1 # Создадим индекс для векторного поиска, присвоим индексу метаданные. operation = sdk.search_indexes.create_deferred( files, index_type=VectorSearchIndexType(), name="the-bali-and-kazakhstan-index", labels=index_label, ) # Дождемся создания поискового индекса. search_index = operation.wait() # Создадим инструмент для работы с поисковым индексом. # Или даже с несколькими индексами, если бы их было больше. tool = sdk.tools.search_index(search_index) # Создадим ассистента для модели YandexGPT Pro Latest. # Он будет использовать инструмент поискового индекса. assistant = sdk.assistants.create("yandexgpt", tools=[tool]) thread = sdk.threads.create() input_text = input( 'Введите ваш вопрос ассистенту ("exit" - чтобы завершить диалог): ' ) while input_text.lower() != "exit": thread.write(input_text) # Отдаем модели все содержимое треда. run = assistant.run(thread) # Чтобы получить результат, нужно дождаться окончания запуска. result = run.wait() # Выводим ответ на экран. print(f"Answer: {result.text}") input_text = input( 'Введите ваш вопрос ассистенту ("exit" - чтобы завершить диалог): ' ) # Выводим на экран часть атрибутов свойства citations — информацию # об использованных файлах-источниках, их содержимое и присвоенные # метаданные, а также информацию об индексе и его метаданные. # С помощью присвоенных метаданных (labels) вы можете применять # к полученным значениям дополнительные фильтры. print("Citations:") for citation in result.citations: for source in citation.sources: print(f" {source.text=}") print(f" {source.file.name=}") print(f" {source.file.labels=}") print(f" {source.search_index.name=}") print(f" {source.search_index.labels=}") # Удаляем все ненужное. search_index.delete() thread.delete() assistant.delete() for file in files: file.delete() if __name__ == "__main__": main()
Где:
mypath
— переменная, содержащая путь к директории, в которой сохранены скачанные ранее файлы. Например:/Users/myuser/tours-example/
.
-
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт. -
<API-ключ>
— API-ключ сервисного аккаунта, полученный ранее и необходимый для аутентификации в API.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
Выполните созданный файл:
python3 search-assistant.py
В примере реализован простейший вариант чата: вводите с клавиатуры запросы ассистенту и получайте ответы на них. Чтобы прекратить диалог, введите
exit
.Примерный результат выполнения
Введите ваш вопрос ассистенту ("exit" - чтобы завершить диалог): Сколько стоит виза на Бали? Answer: 300 рублей. Введите ваш вопрос ассистенту ("exit" - чтобы завершить диалог): А как попасть в Казахстан? Answer: Чтобы попасть в Казахстан из России, вам потребуются следующие документы: * Загранпаспорт, срок действия которого составляет не менее 3 месяцев на момент окончания поездки. * Миграционная карта (выдаётся в самолёте или на границе). * Медицинская страховка (не обязательна, но рекомендуется). Введите ваш вопрос ассистенту ("exit" - чтобы завершить диалог): exit Citations: source.text='**Казахстан: путешествие в сердце Евразии**\n\nОткройте для себя Казахстан — удивительную страну, где встречаются Восток и Запад. Здесь вы сможете насладиться бескрайними степями, величественными горами, историческими памятниками и гостеприимством местных жителей. **Что нужно для поездки?** Чтобы попасть в Казахстан из России, вам потребуются следующие документы:\n* Загранпаспорт, срок действия которого составляет не менее 3 месяцев на момент окончания поездки. * Миграционная карта (выдаётся в самолете или на границе). * Медицинская страховка (не обязательна, но рекомендуется). Не упустите возможность посетить эту прекрасную страну и получить массу положительных эмоций! Бронируйте свой отдых в Казахстане уже сегодня! **Мы ждём вас!**' source.file.name='/Users/myuser/tours-example/kazakhstan.md' source.file.labels={'kazakhstan': 'Файл с описанием предложения по Казахстану'} source.search_index.name='the-bali-and-kazakhstan-index' source.search_index.labels={'promo': 'Индекс содержит общую информацию о Бали и Казахстане', 'visas': 'Индекс содержит информацию о визовой политике при въезде на Бали и в Казахстан'} source.text='**Бали — райский уголок, где вас ждут незабываемые впечатления!**\n\nПриглашаем вас провести незабываемый отпуск на Бали! Этот волшебный остров в Индонезии славится своими прекрасными пляжами, уникальной культурой и гостеприимными жителями. Здесь вы сможете насладиться красотой природы, попробовать местную кухню и познакомиться с новыми людьми. **Что нужно для поездки?** Для въезда на территорию Индонезии вам потребуется виза. Вот список документов, которые необходимы для её оформления:\n* Загранпаспорт, срок действия которого составляет не менее 6 месяцев на момент въезда в страну. * Две фотографии, соответствующие требованиям консульства. * Подтверждение бронирования отеля или письмо другого жилья. * Бронь или билеты туда и обратно. * Анкета, заполненная на английском языке. Обратите внимание, что требования могут меняться, поэтому перед поездкой рекомендуется проверить актуальную информацию на сайте консульства или визового центра. Стоимость визы 300 рублей. Не упустите возможность посетить этот прекрасный остров и получить массу положительных эмоций! Бронируйте свой отдых на Бали уже сегодня! **Мы ждём вас!**' source.file.name='/Users/myuser/tours-example/bali.md' source.file.labels={'bali': 'Файл с описанием туров на Бали'} source.search_index.name='the-bali-and-kazakhstan-index' source.search_index.labels={'promo': 'Индекс содержит общую информацию о Бали и Казахстане', 'visas': 'Индекс содержит информацию о визовой политике при въезде на Бали и в Казахстан'}
В свойстве
run.text
AI-ассистент вернул ответ модели, который был сгенерирован с использованием загруженной базы знаний. Свойствоrun.citations
содержит ссылки на источники — информацию об использованных при генерации ответа файлах базы знаний и поисковых индексах, в том числе, метаданные файлов-источников (свойствоcitation.sources.file.labels
) и индексов (свойствоcitation.sources.search_index.labels
).