Open audetv opened 1 year ago
Наблюдения за время работы с большой библиотекой.
В принципе она многократно показала свою незаменимость, почти всю глобальную историческую, политическую и военную информацию я нахожу в ней, либо дублируя обычный поиск в интернете, либо обращаясь сразу в библиотеку. Самые большие недостатки библиотеки это во-первых невозможность работать с отдельной книгой, набором книг, разделом, жанром и так дале; во-вторых невозможность сохранить найденные результаты поиска; и в-третьих отсутствие возможности скопировать подходящий параграф и название книги одной кнопкой.
В качестве быстрого варианта работы с книгой можно расширить функционал контекста: показывать можно такую же страницу как сейчас (± параграфы до и после выбранного), но эта страница оснащается пагинатором, который в обе стороны ограничен размерами выбранной книги.
Другой сложностью является установление так сказать степени доверия выбранному источнику. Для начала хотя бы на уровне концепции — наша или чужая. Задача не вполне тривиальная, возможно что-то вроде https://github.com/terratensor/LLM-KOB-DOTU/issues/4 будет полезным.
Самые большие недостатки библиотеки это во-первых невозможность работать с отдельной книгой, набором книг, разделом, жанром и так дале; во-вторых невозможность сохранить найденные результаты поиска; и в-третьих отсутствие возможности скопировать подходящий параграф и название книги одной кнопкой.
Надо запланировать работы и провести обновление.
Я тоже замечал, что иногда необходимо ограничить поиск по одной книге, найти в книге, которую читал или упоминали, какую-то информацию, а не во все библиотеке. Необходимо найти какую-то книгу по заголовку, чтобы потом в этой книге найти информацию. Сценарий, когда читал какую-то книгу, позже увидел что-то и установилась связь, чтобы ее закрепить требуется вернуться в книгу найти фрагмент, изучить. Подтвердить связь или опровергнуть.
Технически поиск по отдельной книге, (книгам), по наименованию книги можно реализовать, но потребуется периндексация, просто надо будет это сделать.
С жанрами хуже, пока ничего для этого нет, кроме самих книг. Деления по категориям в текущей реализации отсутствует.
Сохранить результаты поиска для себя, чтобы потом легче воспользоваться прошлыми изысканиями. Логично, замечал, эту потребность, надо сделать. Вести некоторый лог запросов и дать возможность добавлять запросы в избранное. Формировать некий список ссылок на результаты поиска и дать возможность его просматривать, редактировать, удалять добавлять запросы/записи.
Реализация функционала копирование параграфа и названия книги, да согласен. Надо реализовать. https://github.com/terratensor/kob-library-app/issues/38
В качестве быстрого варианта работы с книгой можно расширить функционал контекста: показывать можно такую же страницу как сейчас (± параграфы до и после выбранного), но эта страница оснащается пагинатором, который в обе стороны ограничен размерами выбранной книги.
Я что-то подобное делал ранее в библиотеке КОБ, но после обсуждения убрал: https://github.com/terratensor/kob-library-app/pull/34 Да это можно реализовать.
Другой сложностью является установление так сказать степени доверия выбранному источнику. Для начала хотя бы на уровне концепции — наша или чужая. Задача не вполне тривиальная, возможно что-то вроде terratensor/LLM-KOB-DOTU#4 будет полезным.
Мысль интересная про степень доверия. Пока не понятно технически. Варится в котелке. Надо работать в этом направлении.
В итоге изменений на целую новую версию. Запланирую буду реализовывать.
Ранее ещё были мысли по изменению технической реализации запуска, хотя ничего существенно нового реализовать не смогу, все тот же докер. И снова предстоит возня с обновлением индекса много гигабайтной БД.
Ранее ещё были мысли по изменению технической реализации запуска, хотя ничего существенно нового реализовать не смогу, все тот же докер. И снова предстоит возня с обновлением индекса много гигабайтной БД.
Хотя здесь я возможно и не прав по поводу возни с БД. С учетом полученного уже после реализации библиотеки опыта есть мысль избавится от БД postgres вообще, и уйти от индексатора мантикоры. Т.е. сделать реализацию с RT таблицей. Так деланы комментарии на ФКТ. так сделан feed.svodd.ru. Так что скорее всего возни с БД уже не будет. Есть мысли как этого избежать. Более того я планирую улучшить код парсера, чтобы он в несколько потоков обрабатывал книги и записывал сразу в мантикору пачками по 10 000 записей. Если все сделать правильно, то процесс создания БД из файлов с нуля будет занимать примерно 20 минут. Это время может быть скорректировано, если не удастся реализовать некоторые задумки, но все же думаю, что это будет что-то в этом пределе.
Мысль направилась в новую реализацию, сделаю проще и функциональнее. Но пока от докера не избавится.
Мысль интересная про степень доверия. Пока не понятно технически. Варится в котелке. Надо работать в этом направлении.
Технически нужно направить вордовские файлы в сторону @terekon1 и посмотреть в итоге, в какой степени обучаемый LLM робот и можно ли формулировать задачи как нужно, и не формулировать как не нужно (с)
Сделал реализацию на коленке с workerpool. Каждый файл подается как задача на выполнение парсинга отдельному worker'у. При запуске можно указать разное количество воркеров в пуле. Протестировал на сете из 1000 файлов с разными значениями concurrency на компьютере Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz 2.90 GHz 6 процессоров 6 потоков. В идеале рекомендуют отдельную задачу выделять на один проток, но я пробовал значения больше чем количество процессоров. По монитору ресурсов процессоры заняты все на 100% при работе парсера.
concurreny 1
2024/05/01 18:56:16 books_djvu_prose_voronkova_lf04.docx #999 done
2024/05/01 18:56:16 all files done
2024/05/01 18:56:16 Обработка завершена за : 3m23.19880515s
concurreny 6
2024/05/01 18:59:33 books_djvu_prose_voronkova_lf04.docx #999 done
2024/05/01 18:59:33 all files done
2024/05/01 18:59:33 Обработка завершена за : 54.926487935s
concurreny 10
2024/05/01 19:01:02 books_djvu_prose_voronkova_lf04.docx #999 done
2024/05/01 19:01:02 all files done
2024/05/01 19:01:02 Обработка завершена за : 51.301609281s
concurreny 24
2024/05/01 19:02:27 books_djvu_prose_voronkova_lf04.docx #999 done
2024/05/01 19:02:27 all files done
2024/05/01 19:02:27 Обработка завершена за : 46.53749221s
concurreny 12
2024/05/01 19:04:40 books_djvu_prose_voronkova_lf04.docx #999 done
2024/05/01 19:04:40 all files done
2024/05/01 19:04:40 Обработка завершена за : 48.075617646s
Итого если пересчитать на 150 к, то парсер в 1 поток с записью в БД postgress будет работать 8 часов. Потом еще нужно примерно столько же времени на индексацию в мантикору из БД (хочу пропустить этот шаг) Я если честно и не помню как было на самом деле, надо поискать возможно где-то в issues есть статистика, но видимо да, примерно такое время, иначе зачем заморачиваться с передачей БД через торрент.
А вот если взять 12 workeroв / потоков. то это уже 48 сек на 1000 файлов, т. е. в пересчете на 150 к это всего 2 часа. 2 часа это точно не 20 минут, которые я объявил в начале темы, сильно ошибся. Но это не и 8 часов. Если вести запись сразу в мантикору, то по идее за эти же 2 часа можно получить готовую сборку, это уже проще, чем качать торрент.
Планирую сделать реализацию сразу в мантикору и поработаю над оптимизацией кода, возможно можно сократить еще, т.к. в этом тесте я пока лишь сделал запуск параллельно в потоках и вообще не трогал основной код парсера.
Протестировал на рабочем компьютере 12th Gen Intel(R) Core(TM) i7-12700 2.10 GHz Общее количество ядер 12 Максимальное число потоков 20
concurreny 40
Task books_djvu_prose_voronkova_lf04.docx processed
2024/05/01 20:30:52 all files done
2024/05/01 20:30:52 Обработка завершена за : 15.4410917s
concurreny 20
Task books_djvu_prose_voronkova_lf04.docx processed
2024/05/01 20:33:17 all files done
2024/05/01 20:33:17 Обработка завершена за : 16.408816s
Т. е. можно выставлять concurrency равное количеству потоков процессора и это будет оптимально, для ускорения можно поиграть параметром. Сделаю файл конфигурации или параметр командной строки для указания количества worker. По умолчанию надо сделать функцию, которая прочитает в системы доступное количество потоков и установит это число по умолчанию.
В общем скорость обработки будет зависеть от доступной мощности компьютера.
По жанрам. В наименованиях файлов содержится жанр/рубрика:
Биология, биофизика, биохимия _Ярбус А — Роль движений глаз в процессе зрения.docx Боевая фантастика_Tomon_1 — Выжившие.docx
Можно для начала выделить это из имени файла в отдельное поле в БД для фильтрации, есть в этом смысл?
Жанр в названии был изначально оставлен для подобной возможности, да. Неизвестно, насколько это будет полезно, но определённая классификация этим полем задаётся. Некоторые книги продублированы и присутствуют в нескольких жанрах.
Обработал 143 865 doc файлов 40,2 ГБ (43 206 465 029 байт) Получил БД postgres. 31 096 820 параграфов (65 Гб база)
Worker 10 processes task - рауль.docx
Task рауль.docx processed
2024/05/01 21:21:26 all files done
2024/05/01 21:21:26 Обработка завершена за : 32m45.2541254s
Результатом доволен. Очень сильно сокращает время сборки, если запустить в 20 потоков.
Так что в ближайшее время постараюсь сразу сделать запись в мантикору минуя БД и сравнить.
Жанр в названии был изначально оставлен для подобной возможности, да. Неизвестно, насколько это будет полезно, но определённая классификация этим полем задаётся. Некоторые книги продублированы и присутствуют в нескольких жанрах.
Хорошо, если пойти далее , в наименовании содержится и имя автора и наименование книги, может стоит их все разделить на 3 отдельных поля? Жанр, автор, наименование. Для поиска и фильтрации. Полезность пока не ясна, но технически эта задача не является сложной, можно сделать.
2024/05/01 21:21:26 Обработка завершена за : 32m45.2541254s
Огонь.
Хорошо, если пойти далее , в наименовании содержится и имя автора и наименование книги, может стоит их все разделить на 3 отдельных поля? Жанр, автор, наименование. Для поиска и фильтрации. Полезность пока не ясна, но технически эта задача не является сложной, можно сделать.
Да, да. Файлы назывались целенаправленно, с экспортом из базы, при экспорте из кучи архивов файлами присваивалась формула. В оригинале файлы имеют нечитаемые номера типа id в базе с датой или что-то вроде, и всё это запаковано в несколько сотен или тысяч архивов. Если пойти дальше, то ещё какие-то поля можно вынуть из оригинальной базы, там они есть. В простейшем виде так, но есть и более развёрнутые представления:
Сделал версию, которая пишет в мантикору, разделяет имя файла, на жанр, автора и наименование. Прогнал уже пару раз на всей библиотеке 150к, наметил улучшения, пока результат такой:
…
Worker 8 processes task - Язычество_Чуруксаев Олег — Тайная книга Волховства.docx
Task Язычество_Чуруксаев Олег — Тайная книга Волховства.docx processed
Worker 5 processes task - рауль.docx
Task рауль.docx processed
2024/05/03 13:57:23 all files done
2024/05/03 13:57:23 Обработка завершена за : 56m48.6198957s
20 потоков, 57 минут от док файлов до готовой базы. 167,3 Гб БД indexed_documents: 31 096 811
Пример ответа на запрос Монте-Альбан limit=2:
{
"index": "library",
"highlight": {
"fields": [
"genre",
"author",
"title",
"text"
],
"limit": 0,
"pre_tags": "<mark>",
"post_tags": "</mark>"
},
"query": {
"query_string": "Монте-Альбан"
},
"limit": 2,
"offset": 0,
"max_matches": 1000
}
``` { "took": 17, "timed_out": false, "hits": { "total": 543, "total_relation": "eq", "hits": [ { "_id": "4398164253416954104", "_score": 2893, "_source": { "genre": "История", "author": "Соди Деметрио", "title": "Великие культуры Месоамерики", "text": "
В случае если не удалось распознать жанр, автора и наименование регулярным выражением, то имя файла, без расширения полностью сохраняется в поле title, жанр и автор пустые.
Круто. А как получилось, что база мантикоры на 100 Гб меньше текущих 254 Гб?
Да, интересно, не обратил внимание, предполагаю, что это связано с тем, что я подключил RT Columnar таблицу https://manual.manticoresearch.com/Creating_a_table/Data_types#Row-wise-and-columnar-attribute-storages
Проверю позже просто на RT row-wise - traditional storage available in Manticore Search out of the box будет ли разница. Но получается, что разница по объему с локальной таблицей, а раньше была local table, очень ощутима.
Columnar рекомендуют использовать, если вся таблица не вмещается в память, наш объем не помещается и я использовал колоночный тип, получили бонусом уменьшения размера? из-за «the blocks are stored compressed. »
Проверю еще row-wise
With the columnar storage:
The columnar storage was designed to handle large data volume that does not fit into RAM, so the recommendations are:
После индексации колоночного типа получено было 3659 файлов, выглядит так:
![2024-05-03_16-03-13](https://github.com/terratensor/regular-library/assets/10896447/06dae1a0-6dcc-48df-8e89-c7af86356917)
Разбито на чанки и запаковано.
Да, похоже колоночная схема позволяет удачно компрессировать такие текстовые данные. В текущей базе всего 46 файлов, притом самый большой 110 Гб.
Результат для просто rowwise RT table не сильно отличается от колоночной, результат такой же по времени, на уровне погрешности +/- пара минут.
Worker 20 processes task - рауль.docx
Task рауль.docx processed
Worker 19 processes task - Язычество_Чуруксаев Олег — Тайная книга Волховства.docx
Task Язычество_Чуруксаев Олег — Тайная книга Волховства.docx processed
Worker 8 processes task - Язычество_Черкасов Илья — Зов Гипербореи.docx
Task Язычество_Черкасов Илья — Зов Гипербореи.docx processed
2024/05/03 17:30:26 all files done
2024/05/03 17:30:26 Обработка завершена за : 54m32.9639748s
168.2 Гб indexed_documents 31 096 811
Кол-во файлов в папке около 27 000 штук. После завершения видно, что мантикора работает и проводит какие то оптимизации с файлами, и через несколько минут их уже было около 25 000 штук. и пока процесс не завершен, но парсер отработал и все записи сохранены. Позже проверю, что с файлами, уменьшилось ли занимаемое место.
Возможно в колоночной было что-то подобное с количеством файлов, просто я не обратил внимание, т.к. уже видел результат после завершения, через некоторое время. Интересно, проверю потом.
Прогресс налицо. Интересно, какой вариант работает быстрее всего на слабых виртуальных машинах.
Спустя час уже около 5000 файлов, мантикора все это время работает фоном, я так понимаю, собирает несколько файлов, проиндексированных, которые ей будет проще закидывать целиком в память.
![2024-05-03_19-09-43](https://github.com/terratensor/regular-library/assets/10896447/1c420c42-240e-4078-8214-357058678f2f)
Прогресс налицо. Интересно, какой вариант работает быстрее всего на слабых виртуальных машинах.
Не знаю, можно придумать какой-нибудь сет запросов и проверить на разных базах, но по описанию, для малого количества памяти на поиск должна быстрее работать колоночная.
Конечный результат на диске в колоночном варианте получаем раньше, условно 3000+ файлов, в режиме rowwise похоже еще требуется более часа для оптимизации индекса. Надо будет сделать 2 варианта и потестировать. Но точно от локальной таблицы надо уходить. локальная таблица — это наш самый первый пилотный вариант.
Неожиданная разница во времени из-за оптимизации.
локальная таблица — это наш самый первый пилотный вариант
Было бы всё равно неплохо заменить локальную базу 250 Гб на 150 Гб в новом варианте ))
Работаю над новой версией, парсер уже протестировал несколько раз, прогонял на разных движках (таблиц мантикоры). Выделили поля жанр, автор и книга для фильтрации. Думаю в ближайшее время сделаю обновление. На компьютере с i7 12 процессора 20 потоков, парсер собирает БД за 50 мин - 1 час 10мин. на компьютере 6 проц. 6 потоков это уже происходит за 3-4 часа.
Плюс потом нужно какое-то время (~несколько часов), когда мантиокра работает фоном и оптимизирует индекс и файлы. Но в это время можно искать, искать можно сразу, как только запустил парсер (по мере добавления записей в БД). Но после операции оптимизации время поиска сокращается в разы.
Так что будет позже вопрос. Будем ли новый индекс БД раздавать через торрент или все же попробуем собрать на локальной машине из исходников. Но видимо все же надо в любом случае будет описать оба варианта в инструкции. Собрать из старых записей обновленную инструкцию.
В работе
Вообще судя по тому что я вижу, получается уже (близко, связь заметил) парсер, который можно использовать для создания индекса любой своей локальной библиотеки. С любыми своими наборами документов и книг. КОБ, военно-историческая, любая другая. Метод один и тот же. В планах в том числе допилить КОБ и обновить нашу онлайн КОБ библиотеку http://kob.svodd.ru по единому принципу с приведением длины параграфов к среднему значению в 3600 символов.
https://github.com/terratensor/svodd/issues/321#issuecomment-2283730242 Установим связь с оформлением карточки.
То есть callkeywords и qcallsuggest выполнять на входе индексатора базы из постгрес?
Надо бы к ней добавить все остальные базы — словари, географию и концептуальную.
По использованию пока заметил, что не хватает поиска по названию / автору книги, а также ограничения поиска конкретной книгой. А там и до жанров недалеко.
Originally posted by @iprst in https://github.com/terratensor/regular-library/issues/1#issuecomment-1742143077