Создать AI-ассистента с поиском по PDF-файлам со сложным форматированием
Функциональность AI Assistant API находится на стадии Preview.
В данной инструкции приведен пример создания AI-ассистента, который выполняет поиск по информации в источнике, содержащем сложное форматирование и табличные данные, и анализирует полученные данные с помощью модели генерации текста YandexGPT Pro RC.
В качестве примера исходного файла со сложным форматированием приведен файл в формате PDF
Обращаться к AI Assistant API и Text Generation API вы будете через Yandex Cloud ML SDK для Python.
Перед началом работы
-
Создайте сервисный аккаунт и назначьте ему роли
ai.assistants.editor
иai.languageModels.user
. -
Получите и сохраните API-ключ сервисного аккаунта.
В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
Установите утилиту Python venv
для создания изолированных виртуальных окружений в Python. -
Создайте и войдите в новое виртуальное окружение Python:
python3 -m venv new-env source new-env/bin/activate
-
С помощью менеджера пакетов pip
установите библиотеку docling для преобразования документов из формата PDF в формат Markdown:pip install docling
-
Установите библиотеку Yandex Cloud ML SDK
для работы с инструментами Yandex Foundation Models:pip install yandex-cloud-ml-sdk
-
Скачайте
файлassistant-example.pdf
с документом, который будет использоваться в качестве источника информации для AI-ассистента, и преобразуйте его в формат Markdown с помощью установленной ранее библиотекиdocling
:-
Создайте файл
convert.py
, содержащий следующий код:from docling.document_converter import DocumentConverter converter = DocumentConverter() result = converter.convert("assistant-example.pdf") content = result.document.export_to_markdown() with open("assistant-example.md", "wt") as f: f.write(content)
-
Выполните файл
convert.py
:python3 convert.py
В результате в текущей директории будет сохранен файл
assistant-example.md
, содержащий контент из исходного PDF-файла в формате Markdown.
-
Необходимые платные ресурсы
В стоимость использования AI-ассистента входит плата за генерацию текста (см. тарифы Yandex Foundation Models).
Создайте AI-ассистента и протестируйте его работу
Вы создадите поисковый индекс, источником для которого будет служить файл в формате Markdown. Затем вы зададите созданному ассистенту несколько вопросов, основанных на источнике информации:
Создайте AI-ассистента с текстовым поисковым индексом
-
Создайте файл
assistant-text.py
, содержащий следующий код:from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.search_indexes import ( HybridSearchIndexType, TextSearchIndexType, StaticIndexChunkingStrategy, ReciprocalRankFusionIndexCombinationStrategy, ) queries = [ "Какие сервисы входят в Райдтех?", "Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений?", "На сколько млрд рублей выдал Яндекс займов за 9 месяцев до 30 сентября 2024?", ] def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) file = sdk.files.upload("<путь_к_файлу>") operation = sdk.search_indexes.create_deferred( [file], index_type=TextSearchIndexType() ) text_index = operation.wait() text_tool = sdk.tools.search_index(text_index) model = sdk.models.completions("yandexgpt", model_version="rc") assistant = sdk.assistants.create(model, tools=[text_tool]) text_index_thread = sdk.threads.create() for query in queries: text_index_thread.write(query) print(query) run = assistant.run(text_index_thread) result = run.wait().message for part in result.parts: print(part) print("\n") if __name__ == "__main__": main()
Где:
folder_id
— идентификатор каталога, в котором вы создали сервисный аккаунт.auth
— созданный ранее API-ключ сервисного аккаунта. API-ключ используется для аутентификации в API Yandex Cloud. Подробнее о способах аутентификации в Yandex Cloud ML SDK см. в разделе Аутентификация.<путь_к_файлу>
— путь к файлуassistant-example.md
с исходными данными для поискового индекса.
-
Выполните файл
assistant-text.py
, чтобы создать ассистента и получить от него ответы на вопросы:python3 assistant-text.py
Результат:
Какие сервисы входят в Райдтех? В Райдтех входят: * сервис онлайн-заказа такси; * сервис каршеринга Яндекс Драйв; * сервис аренды самокатов; * другие перспективные сервисы. Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений? Рентабельность скорректированного показателя EBITDA у сервисов объявлений составляет 51,3%. На сколько млрд рублей выдал Яндекс займов за 9 месяцев до 30 сентября 2024? В предоставленном контексте нет информации о том, сколько миллиардов рублей Яндекс выдал займов за 9 месяцев до 30 сентября 2024 года.
Как видно из результата, текстовый поиск справился только с первым, самым простым вопросом. На второй вопрос ответ неверный, а на третий вопрос ответ совсем не представлен.
Создайте AI-ассистента с гибридным поисковым индексом
-
Создайте файл
assistant-hybrid.py
, содержащий следующий код:from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.search_indexes import ( HybridSearchIndexType, TextSearchIndexType, StaticIndexChunkingStrategy, ReciprocalRankFusionIndexCombinationStrategy, ) queries = [ "Какие сервисы входят в Райдтех?", "Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений?", "На сколько млрд рублей выдал Яндекс займов за 9 месяцев до 30 сентября 2024?", ] def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) file = sdk.files.upload("<путь_к_файлу>") operation = sdk.search_indexes.create_deferred( [file], index_type=HybridSearchIndexType( chunking_strategy=StaticIndexChunkingStrategy( max_chunk_size_tokens=512, chunk_overlap_tokens=256, ), combination_strategy=ReciprocalRankFusionIndexCombinationStrategy(), ), ) hybrid_index = operation.wait() hybrid_tool = sdk.tools.search_index(hybrid_index) model = sdk.models.completions("yandexgpt", model_version="rc") assistant = sdk.assistants.create(model, tools=[hybrid_tool]) hybrid_index_thread = sdk.threads.create() for query in queries: hybrid_index_thread.write(query) print(query) run = assistant.run(hybrid_index_thread) result = run.wait().message for part in result.parts: print(part) print("\n") if __name__ == "__main__": main()
Где:
folder_id
— идентификатор каталога, в котором вы создали сервисный аккаунт.auth
— созданный ранее API-ключ сервисного аккаунта. API-ключ используется для аутентификации в API Yandex Cloud. Подробнее о способах аутентификации в Yandex Cloud ML SDK см. в разделе Аутентификация.<путь_к_файлу>
— путь к файлуassistant-example.md
с исходными данными для поискового индекса.
-
Выполните файл
assistant-hybrid.py
, чтобы создать ассистента и получить от него ответы на вопросы:python3 assistant-hybrid.py
Результат:
В Райдтех входят: * сервис онлайн-заказа такси и дистрибуция таких технологий за рубежом; * сервис каршеринга Яндекс Драйв; * сервис аренды самокатов; * другие перспективные сервисы. Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений? Рентабельность скорректированного показателя EBITDA у сервисов объявлений за третий квартал 2024 года составила 6,5%. На сколько млрд рублей выдал Яндекс займов за 9 месяцев до 30 сентября 2024? За девять месяцев до 30 сентября 2024 года Яндекс выдал займов на сумму 6,5 млрд рублей.
Как видно из результата, гибридный поиск обеспечил более качественный результат: ответы на все три вопроса — верные.
Усовершенствуйте ассистента
Расширьте возможности созданного ассистента, превратив его из простого информатора в умного помощника, анализирующего найденные данные и на их основе предоставляющего оценочные суждения.
-
Создайте файл
assistant-analyst.py
, содержащий следующий код:from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.search_indexes import ( HybridSearchIndexType, TextSearchIndexType, StaticIndexChunkingStrategy, ReciprocalRankFusionIndexCombinationStrategy, ) query = ( "Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений?" ) instruction = """ Ты высококвалифицированный инвестиционный помощник. Твоя задача помогать пользователю на основе финансовых отчетов для инвесторов анализировать компании. На вход тебе будет дан пользовательский запрос и кусочки отчетов, на основе отчетов нужно дать ответ на вопрос пользователя, а также добавить оценочное суждение как инвестиционного помощника. Если в ответ на запрос пользователя требуется выдать значение какой-либо метрики, стоит проинтерпретировать значение. Желательно кратко пояснить смысл метрики, а также дать оценку относительно того большое / небольшое ли значение у метрики. """ def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) file = sdk.files.upload("<путь_к_файлу>") operation = sdk.search_indexes.create_deferred( [file], index_type=HybridSearchIndexType( chunking_strategy=StaticIndexChunkingStrategy( max_chunk_size_tokens=1024, chunk_overlap_tokens=512, ), combination_strategy=ReciprocalRankFusionIndexCombinationStrategy(), ), ) hybrid_index = operation.wait() hybrid_tool = sdk.tools.search_index(hybrid_index) model = sdk.models.completions("yandexgpt", model_version="rc") assistant = sdk.assistants.create( model, tools=[hybrid_tool], instruction=instruction ) hybrid_index_thread = sdk.threads.create() hybrid_index_thread.write(query) print(query) run = assistant.run(hybrid_index_thread) result = run.wait().message for part in result.parts: print(part) print("\n") if __name__ == "__main__": main()
Где:
folder_id
— идентификатор каталога, в котором вы создали сервисный аккаунт.auth
— созданный ранее API-ключ сервисного аккаунта. API-ключ используется для аутентификации в API Yandex Cloud. Подробнее о способах аутентификации в Yandex Cloud ML SDK см. в разделе Аутентификация.<путь_к_файлу>
— путь к файлуassistant-example.md
с исходными данными для поискового индекса.
-
Выполните файл
assistant-analyst.py
, чтобы создать ассистента и получить от него ответы на вопросы:python3 assistant-analyst.py
Результат:
Какая рентабельность скорректированного показателя EBITDA у сервисов объявлений? Рентабельность скорректированного показателя EBITDA у сервисов объявлений за третий квартал 2024 года составила 6,5%. Это значительное улучшение по сравнению с аналогичным периодом прошлого года, когда рентабельность была 3,3%. Такой рост свидетельствует об эффективности работы сегмента и улучшении его финансовых показателей.