Комментарии 8
Хакатон место интересное и сложное. Тоже один раз принимал участие на EKF хакатоне. Электрические компоненты искали по фотке и возращали документ. Это типо как смету посчитать для работы. Заняли десятое место поделив его с несколькими командами по очкам одинаково. В общем не хватило рук. Я писал бекенд и фронтенд на Flask и внедрял модель yolo v8. Второй учасник делал обучение модели. Наш код работал и находил элементы, но остальную часть не успел доделать не хватило времени. Однако наше решение зачли и мы попали в финал. Там нужно прям очень много опыта и времени.
С каждым разом всё лучше будет получаться продолжай и ты победишь рано или поздно.
Этот проект очень хорошо показывает разницу между: “RAG, который красиво выглядит на демо” и “RAG, который выдерживает строгую метрику, дедлайн и требования к воспроизводимости”. Такие задачи очень полезны, они быстро убирают иллюзии.
У вас не описан самый первый шаг - парсинг.
Сперва нужно определить формат и сложность документа а потом выбрать правильный инструмент для парсинга. Для pdf-сканов - это один инструмент, для сложных pdf (колонки, таблицы, сноски и пр.) с текстовым слоем - другой, для простых pdf - третий, для doc - четвертый и т.д. Я бы приводил все к одному формату - например к маркдауну.
Правильный парсинг - залог успеха чанкинга ))
По чанкингу - вы пробовали использовать Late Chuncking?
В юридических документах часто определения терминов часто даются в начале а конкретные условия следуют в конце. Late Chuncking позволяет поисковому движку находить нужный параграф, даже если в нем самом не упоминаются ключевые субъекты договора, но они были упомянуты раньше. SOTA-векторайзеры умеют это делать.
Не знаю применимо ли это к данному соревнованию, но в энтерпрайз-РАГах можно улучшить результат за счет предобработки квери пользователя. Пользователи очень часто криво строят вопросы. Препроцессинг запроса позволяет сделать несколько перефразов оригинального запроса и подать их все вместе в квери-векторизатор.
Спасибо большое за развернутый комментарий! Надеялся что таких будет больше.
Да, совершенно верно, про парсинг забыл. Пробовал использовать unstructured , docling. Второй лучше воспроизводил структуру таблиц, но как показала практика, llm вполне себе понимал и ту мешанину, которую выдавала первая библиотека. Зато unstructured в автоматическом режиме распознавал сканы и включал ocr. Документы у нас были на английском, распознавалось всё достаточно хорошо.
Про late chunking читал когда исследовал современные методы. Не очень понял как это работает. Нашел только одну модель эмбеддингов под это. В условиях ограниченного времени, решил новую технологию не применять
Было ограничение на использование только локальных парсеров? Если нет - попробуйте LlamaParse или MistralOCR.
Late Chanking - сохранение (подмешивание) глобальный контекст документа в эмбеддингах каждого отдельного чанка. Технологию предложила и активно продвигает Jina AI. Voyage AI тоже умеет так делать, но называет это "Contextualized Embeddings". Cohere Embed так не умеет т.к. у нее маленькое контекстное окно. (Чтобы "пропитать" эмбединг каждого чанка содержанием всего документа нужно большое контекстное окно),
ИМХО: сейчас самый качественный (и самый дорогой ))) - Agentic Chunking. Вы просите сильную модель прочитать текст и расставить метки там, где, по её мнению, заканчивается одна мысль и начинается другая. А потом можно еще поверх заполировать Лейт-чанкингом, т.е. домешать немного глобального контекста в эмбединг каждого чанка.
Мощной ллм накладно перелопачивать тысячу документов ) я читал про семантический чанкинг, где для этого используются легковесные трансформеры. Но это советуют использовать для документов без структуры, ну либо когда в одной главе часто мысль меняется.
С late chunking обязательно поэкспериментирую как нибудь

Agentic RAG Challenge. Я знаю что вы искали прошлым летом…