Создать AI-ассистента с RAG по PDF-файлам со сложным форматированием
Примечание
Функциональность AI Assistant API не рекомендуется использовать в новых проектах. Для создания AI-агентов используйте Responses API.
В этом практическом руководстве приведен пример создания AI-ассистента, который выполняет поиск по информации в источнике, содержащем сложное форматирование и табличные данные, и анализирует полученные данные с помощью модели генерации текста YandexGPT Pro RC.
В качестве примера исходного файла со сложным форматированием приведен файл в формате PDF
Обращаться к AI Assistant API и Text Generation API вы будете через Yandex Cloud ML SDK для Python.
Перед началом работы
Примечание
Рекомендуется выполнять руководство на машине, имеющей не менее 4 ГБ RAM и 12 ГБ свободного места на диске.
Для подготовки окружения может потребоваться до 1 часа.
-
Создайте сервисный аккаунт и назначьте ему роли
ai.assistants.editorиai.languageModels.user. -
Получите и сохраните API-ключ сервисного аккаунта, указав для него область действия
yc.ai.foundationModels.execute.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
Примечание
Если вы используете ОС Windows
, рекомендуем предварительно установить оболочку WSL и выполнять дальнейшие действия в этой оболочке. -
Установите Python версии 3.10
или выше. -
Установите библиотеку 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 AI Studio: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 AI Studio).
Создайте 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%. Такой рост свидетельствует об эффективности работы сегмента и улучшении его финансовых показателей.