📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Преврати ЛЮБОЙ Документ в Данные для ИИ Локально и Бесплатно (Docling, Парсинг)

ИИшенка | AI Automation12:44

Transcription

Друзья, всем привет.

Когда мы говорим про использование нейронок для наших бизнесов, для наших проектов, мы всегда подразумеваем, что знания ограничены в части понимания нашего собственного контекста. Когда мы говорим про ограниченность знаний, мы быстро переходим к теме RAG, теме подгрузки наших собственных файлов, наших собственных знаний в нейронку различными методами. Иногда мы говорим про файнтюнинг моделей, но в общем и целом мы хотим предоставить нейронке наши собственные знания для того, чтобы она использовала их как долговременную память.

И когда мы говорим про перенос таких знаний, мы чаще всего оперируем файлами: PDF-ками, HTML-ками, DOCX или Word-файлами. Но проблема в том, что эти файлы в девяти случаях из десяти не структурированы. У них нет чёткой, понятной структуры, которую нейронки будут хорошо понимать. Да, конечно, мы всегда можем использовать какие-то внешние парсеры. Например, мы часто с вами обсуждали мира CR, либо просто извлекали тексты с помощью встроенных инструментов NCMN или других построителей-агентов.

Но у нас всегда возникал вопрос: а можно ли делать обработку наших файлов локально, что чаще всего означает секюрно, без утечки наших данных куда-то вовне? И что, конечно же, всегда важно, либо дёшево, либо совершенно бесплатно. Да, ещё и с таким уровнем качества, чтобы такие сложные таблицы, PDF-ки со встроенными графиками превращались в прекрасный Markdown, который легко читается нейронками. И более того, чтобы внутренние картинки и графика в этих PDF-ках сохраняли свои позиции и даже описывались прямо на лету.

Да, такое делать можно. И я даже скажу больше. Есть инструменты, которые позволяют отрабатывать сложные кейсы, когда картинки сложно встроены в наши файлы и даже умеют понимать кейсы, когда наши таблицы разбиты по разным страницам, они могут держать общий контекст и понимать, что это единая таблица, и воспринимать это единым объектом.

Здесь в игру вступает такой open source проект, как Docling. Это проект с открытым исходным кодом, который умеет парсить огромное количество форматов: PDF-ки, Word-файлы, даже картинки HTML. И распаршенные ответы также выдавать в огромном количестве форматов. Ну что, такое? Интересно. Смотрим до конца, ставим лайк, подписываемся и оставляем какой-то коммент. Обязательно спасибо.

Если почитать документацию Docling, то можно найти информацию о том, что у него очень интересная архитектура. Во-первых, это набор парсеров. Каждый парсер задействуется в зависимости от типа документа, который вы ему даёте. Во-вторых, это определение структуры распаршенного контента. То есть он определяет объекты внутри документа и пытается соединить их в единые логические блоки. И более того, эти логические блоки потом используются для векторизации вашего документа. Для того, чтобы ваши чанки для векторизации образовывались строго в соответствии со структурой документа и у вас не было частичных чанков, которые потом попадают в вашу векторную базу данных и понижают качество векторного поиска.

Этот проект уже несколько месяцев на слуху. У него огромное количество звёзд на GitHub, поэтому в интернете можно найти массу способов использования Docling для своих проектов. Здесь прекрасная документация, и мы можем увидеть, что, чтобы распарсить наш первый документ, достаточно инициализировать конвертер, отдать ему документ и задать некоторый выходной формат, который нам требуется. В данном случае Markdown. Давайте попробуем сделать прямо вот этот простой пример.

Ну и самая сладкая часть. Нам понадобится написать немного кода, но особо не переживайте, потому что код будет простой, и мы будем медленно проходить по каждой части и обсуждать нюансы этого кода. Давайте в интернете найдём какой-нибудь реализованный пример. Вот, наверное, всем вам известный репозиторий. И здесь есть несколько примеров готового кода на Python, где происходит именно то, что мы только что проговорили. Здесь происходит инициализация конвертера, передача файла в этот конвертер и экспорт результата в виде Markdown. Отлично, нам это подходит. Давайте прямо здесь заберём этот код, перейдём в наш курсор и давайте сделаем вот такую вещь.

У нас совершенно пустая папка в курсоре, и нам нужно настроить наш проект. Давайте сделаем максимально ленивый вариант. Прямо так и напишем: "Настрой мне новый Python проект, который использует Docling, и я тебе дам пример другого рабочего проекта. Сделай мне подобно". И здесь вставляем пример, который мы только что нашли. Запускаем исполнение. Смотрите, как курсор хорошо отрабатывает. Он сразу себе создаёт to-do list и по коду, который мы ему отдали, он видит, что документы должны забираться откуда-то из папочки input и результаты должны складываться в папочку output. И посмотрите, как выглядит структура. Есть папочка документы, есть папочка output и даже есть уже созданный скрипт, который очень похож на тот, что мы ему дали. Давайте посмотрим. Да, здесь задаётся путь до файла некоторого. Дальше в консоль выводятся результаты работы. Дальше есть инициализация конвертера. И, в принципе, сохранение результатов в Markdown.

Ну что, давайте попробуем исполнить этот скрипт. Друзья, если вы до этого никогда не настраивали Python проекты, но делать это с курсором, не переживайте. Вы, когда попробуете запустить его, у вас наверняка с первого раза будут ошибки. Что-то будет недоустановлено, что-то нужно будет инициализировать. Вам курсор подскажет все базовые вещи, все базовые первые шаги, которые вы должны будете пройти для того, чтобы запустить этот проект. Просто следуйте рекомендациям курсора. И для таких задач курсор очень хорошо работает, поэтому вы точно запустите свой проект.

Кстати, вот эти все ссылки, которыми мы сейчас пользуемся, я помещу в свою бесплатную Telegram-группу. Заходите туда, забирайте, потому что тут прямо исходные коды и ссылки на документацию, которые полезно будет почитать.

Так, ну а мы открываем терминал и здесь пишем вот такую команду. То есть это запуск нашего скрипта предварительно. Смотрите, я положил PDF-ку в папку документы, потому что скрипт оттуда будет забирать. И здесь прописал путь как раз до этого файла. Давайте откроем этот файл, как он выглядит. Здесь всего лишь несколько страниц, но мы видим, что довольно сложные таблицы тут присутствуют и даже график. Ну что, давайте попробуем запустить наш скрипт. Запускаем. Смотрим, как он исполняется. В консоль выводятся все текущие шаги, которые мы проходим. Отлично. Ждём что-то в папочке.

Так, смотрите, нам тут выявился наш Markdown. Первые несколько строчек. И здесь у нас есть в аутпуте полный наш Markdown. Давайте закроем терминал. Какие-то левые тут слова, но потом, смотрите, применение этих корректировок. Давайте откроем наш оригинальный файл. Он начинается с применения этих корректировов. Является сокращения. И дальше, смотрите, он сохранил на хорошем уровне наши списки. И смотрите, даже с первого раза прекрасные таблицы в Markdown с проставленными хедерами. И, в принципе, всё выглядит довольно достойно. И обратите внимание, здесь определено, в каком месте была картинка. И даже видно, что это график, который называется "Состав доходов, полученных в двадцать первом году". Вот он, "Состав доходов, полученных в двадцать первом году". Но никакой обработки картинок здесь нет, к сожалению.

Так, давайте перейдём обратно в скрипт. Меня вот не очень устраивает, что он забирает файлы чётко по их имени. Давайте попробуем создать второй скрипт, но сделаем так, чтобы все файлы, которые содержатся в папке документы, забирались на автомате и результаты складывались в папку Output. И пишу: "А сделай так, чтобы он вместо списка просто брал все доступные документы в папке documents, у которых формат подходящий". Запускаем отработку и давайте посмотрим, что он написал. То есть мы видим, что только что создался второй скрипт, который называется multiple_formats. И видим здесь правильную конструкцию. Он забирает из папочки документы все файлы, которые соответствуют форматам вот таким, с которыми, в принципе, работает Docling, и передаёт их на процессинг.

Давайте попробуем добавить ещё один какой-то файл и посмотрим, каким образом это отрабатывает. Вот я добавил ещё какой-то файл. То есть рядом с оригинальным файлом будет ещё какой-то странненький файл лежать, но нам, в принципе, для нашего тестирования подходит. И давайте опять вернёмся в наш курсор, откроем терминал и теперь уже запустим второй скрипт. Так называется. Давайте запускаем наш скрипт и смотрим на папочку output. Что там окажется?

Так, смотрите, у нас тут появилось два аута. Output_file, тот самый оригинальный файл, который мы уже до этого отрабатывали. И смотрите, второй output как раз второго файла, где у нас есть прямо вот тот текст, сам текст рабарщина, но он всё прямо хорошо распознал и сохранил все списки, все булетпоинты, расставил заголовки. Я хочу напомнить, что это всё происходит 100% локально, только на вашем компьютере.

Но меня, естественно, очень сильно зацепляет вот эта история. Мы видим, что он определяет прекрасно места, где были картинки. Вот мы видим, да, что в самом верху есть картинка, но мне интересно, а может ли он описывать эти картинки таким образом, чтобы это всё вместе хранилось в едином Markdown, в едином контексте?

Мы возвращаемся в документацию Docling, идём в на вкладку Enrichment features и видим, что тут есть отдельный пункт, который называется Picture Description. И здесь сказано, что если вы хотите описывать картинки в документах, то всё это можно делать с помощью визуальных моделей. Более того, тут сказано, что модели могут быть локальные, а могут подключаться извне. То есть удалённые vision модели. Меня, на самом деле, интересует возможность описывать картинки с помощью коммерческих моделей, потому что мы знаем, что локальные модели могут это делать на довольно низком уровне, если, особенно у нас не хватает ресурсов на наших серверах.

Давайте попробуем подключить коммерческую модель от OpenAI для того, чтобы она нам описывала наши картинки и вставляла описание сразу же обратно в документ для того, чтобы сохранять контекст этого документа вместе с исходным текстом. Я забираю вот этот код и возвращаюсь обратно в курсор и пишу максимально прямолинейно. Я вижу в документации, что он может сразу же обрабатывать картинки из файлов. Добавь эту возможность мне. Я бы хотел использовать коммерческую модель от OpenAI для этого. Вот выдержки из их документаций. И вставляю ниже всю документацию, которая мне понадобится, и запускаю процесс.

Вижу, что он работает с правильными переменными в соответствии с документацией и создаёт мне третий скрипт. Давайте посмотрим на сам третий скрипт. Обратите внимание, что здесь уже как раз импортируется Picture Description API Options и заданы правильные pipeline options для того, чтобы использовать внешние модели. И дальше уже подключается наш API от OpenAI, где мы задаём нужную нам модель, которая умеет анализировать картинки, и задаём правильный промт. Описываем графики или картинки максимально подробно, используя все доступные данные. Я вам даю все ссылки и промты для того, чтобы вы могли воспроизвести этот процесс у себя на компьютере.

Ну, а если вам нужен будет исходный код именно вот этих скриптов, то я его положу в свою прогруппу. Кстати, посмотрите на неё тоже, потому что мы там мегаглубоко изучаем искусственный интеллект, инструменты и, в принципе, подходы автоматизации для своего бизнеса, для своей карьеры. Там очень интересно.

Ну, сейчас давайте попробуем запустить наш третий скрипт и посмотрим, каким образом отработается наш файл. Файл у нас остаётся прежним, но меня очень интересует как раз первая страница и момент, где у нас представлен график. Мы-то знаем, как бывает критически важно векторизовать графики и их смысловую часть для того, чтобы RAG работал корректно. Переходим и запускаем скрипт. Смотрим, как отрабатывается скрипт. И когда он выполнится, я к вам вернусь.

Так, ну что, скрипт только что выполнился. Давайте переходим на наш Markdown и ищем именно первую страницу. Смотрите, вот у нас определилось, где у нас содержится картинка. И дальше здесь написано: "На представленном графике есть круговая диаграмма, показывающая распределение различных категорий доходов или сборов". И, например, видим "Пошлины мадридской системы", у которой объём составляет 82,4, что есть 17,3%. Давайте откроем и посмотрим: "Пошли мадридской системы 82,4 17,3%".

На самом деле я хочу сказать, что это, в принципе, умопомрачительно, если мы рассматриваем то условие, что большинство этих операций происходит у нас локально на нашем компьютере, и только лишь описательная часть самих графиков делается с помощью коммерческих нейронок. При том, что это же можно делать с помощью и локальных нейронок, в том числе.

На этом мы будем завершать видео, но в конце я вам хочу сказать, что эта же библиотека Docling интегрирована с самыми популярными RAG-фреймворками, например, Langchain и LlamaIndex. И здесь же есть сериализации chunking. Например, здесь есть очень перспективный гибридный чанкинг, который разбивает ваш документ на чанки по логическим блокам и векторизует поблоково эти данные и помещает их в векторную базу данных. Это помогает сохранять на очень высоком уровне векторный поиск и получение чанков обратно. Когда вы пользуетесь векторной базой данных, эта тема для отдельного видео. Если такое интересно, обязательно пишите в комментариях. Можно будет развивать эту тематику, изучать дальше, как работает open source библиотеки, в частности Docling, потому что возможностей здесь намного больше, чем покрыто в этом видео. Опять же, все прямые ссылки ищите в нашей бесплатной прогруппе. Если вам нужен исходный код вот этой автоматизации, то его забирайте в прогруппе. А на этом всё. Хорошего вам дня. M.