Привет! Меня зовут Антон Фролов — я ведущий менеджер продукта в Content AI. В этой статье расскажу, как мы превратили корпоративный поисковый портал Intelligent Search в платформу для создания цифровых ассистентов с поддержкой LLM.

Если у вас уже есть прототип ассистента на базе open-source компонентов, платформа может помочь оперативно разработать решение production-уровня для автоматизации различных процессов с внутренними документами.

Эволюция продукта как поискового решения

История продукта началась в 2016 году, когда в нашу компанию поступил сразу ряд запросов от разных клиентов на обеспечение возможности сквозного поиска по разным корпоративным источникам (сетевым папкам, корпоративным порталам и другим). 

На тот момент у нас уже была разработана и активно применялась технология глубокого семантического анализа текста, которую мы интегрировали в новый продукт. Целью было обеспечение умного поиска с учетом смысла введенного запроса, а не только по точному совпадению слов в запросе и документе. В частности, внедренная технология позволила расширить область поиска на:

  • синонимы;

  • гипонимы (более частные понятия);

  • варианты перевода искомого слова на русский/английский языки.

Например, по запросу «аграрные предприятия» находился текст «птицеводческая ферма», а по запросу «увольнение руководства» — «отставка гендиректора». С одной стороны, это позволило повысить полноту поиска, а с другой — такой поиск работал более точно и прогнозируемо, чем обычный подход с векторами (embeddings). Кроме того, мы сразу интегрировали в продукт нашу собственную технологию OCR, уже проверенную многолетними продажами на мировом рынке. Это позволило включить в область поиска графические файлы в разных форматах, в частности TIFF, PDF и другие.

В качества стека технологий мы выбрали: 

  • ElasticSearch как поисковый движок;

  • Kibana как средство построения отчетов по обходу источников и статистики поиска;

  • Apache Zookeeper для хранения состояния  поискового кластера; 

  • Apache Tomcat как веб-сервер;

  • Java как основной язык разработки.

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

  • сетевым папкам;

  • 1С:Документообороту;

  • Битрикс24;

  • Сonfluence;

  • Jira;

  • MS Sharepoint;

  • MS Azure DevOps (TFS);

  • MS Active Directory;

  • СУБД (PostgreSQL, MySQL и другим);

  • почтовому серверу MS Exchange;

  • сервис-деск системе HelpDeskEddy.

Интеграция с каталогом пользователей на базе Active Directory позволила решить задачу аутентификации на базе протокола Kerberos и обеспечить сквозной вход в систему (SSO). Позже мы стали использовать каталог пользователей для фильтрации найденных документов не только по имени автора, но и по его должности или отделу. Также появилась возможность перехода между документами и профилями их авторов или отделов по аналогии с переходами между постами и профилями пользователей в соцсетях. 

При необходимости на стороне клиента можно поддержать поиск по любому источнику данных, разработав модуль его обхода на основе открытого Java API и примеров исходников готовых модулей.

К обычным форматам документов MS Office, OpenOffice и изображений мы со временем добавили все виды архивов, аудио- и видео-файлов, а также чертежи в форматах DWG/DXF.

Внешне решение мы сделали похожим на интернет-поисковик, чтобы пользователи могли легче на него перестроиться. Язык запросов также был сделан близким к языку интернет-поисковика и поддержан на базе парсера ANTLR. Несмотря на кажущуюся простоту, задача корректного поиска по указанной фразе даже в режиме точного совпадения является нетривиальной. Дело в том, что искомые слова в тексте могут идти не рядом, а на расстоянии друг от друга, немного в другом порядке, не все из них нужно учитывать с одинаковым весом (например, предлоги или союзы). Также для некоторых слов или фраз нужно поддержать автоматическое раскрытие на указанные пользователем синонимы. 

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

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

Отдельным вызовом является корректный учет прав доступа в разных источниках. В некоторых источниках, например, сетевых папках или MS Sharepoint, доступ определяется на уровне доменных групп. В других источниках используется своя ролевая модель, никак не связанная с доменной, как в случае с 1С или «Битрикс24». 

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

Со временем по запросам клиентов в нашем решении появились: 

  • группировка дублей документов;

  • иерархические фильтры по источникам;

  • поиск похожих документов;

  • классификация документов;

  • предпросмотр текста документа с сохранением форматирования;

  • переход между найденными документами по атрибутивным связям;

  • выборочная подсветка найденных терминов. 

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

Текущий интерфейс продукта с панелью фильтров, списком найденных и диалогом предпросмотра выбранного документа на примере поиска по чертежам в формате DWG
Текущий интерфейс продукта с панелью фильтров, списком найденных и диалогом предпросмотра выбранного документа на примере поиска по чертежам в формате DWG

От поискового портала к платформе цифровых ассистентов

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

Стало понятно, что Intelligent Search можно использовать не просто как корпоративный поисковик, а как универсальную платформу для доступа и автоматической обработки корпоративных данных на базе LLM. С помощью набора  промптов можно не только получить ответ на вопрос, но и выполнить ряд действий с документом, такие как извлечение атрибутов или суммаризацию, с недоступным ранее качеством и гибкостью.

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

NLP-модули как ключевой элемент открытой архитектуры

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

Для продукта NLP-модуль — черный ящик, который он вызывает на ряде этапов своей работы. Например, при обходе источника или анализе поискового запроса: на вход в модуль передается набор полей документа или текст запроса, а на выходе модуль возвращает JSON с результатами анализа.

Внутри реализация модуля может быть произвольной — от поиска ИНН в тексте по регексу до вызова LLM для генерации ответа на вопрос или перевода документа на другой язык. Так как архитектурно NLP-модуль является плагином, он может подкладываться в каталог продукта в виде JAR-файла и далее использоваться для кастомизации нужного этапа обработки документа или запроса. Диалог настройки его параметров в административном интерфейсе продукта формируется автоматически на основе аннотаций в коде модуля. Это позволяет развивать функциональность продукта без участия нас как вендора.

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

Пример извлечения полей из договора в формате PDF: справа рамкой выделены новые поля по документу, слева — построенные по ним фильтры
Пример извлечения полей из договора в формате PDF: справа рамкой выделены новые поля по документу, слева — построенные по ним фильтры

Самым популярным сценарием использования LLM на корпоративном поисковом портале, безусловно, остается сценарий вопросно-ответного режима или RAG.

В сценарии вопросно-ответного режима есть возможность оперативной фильтрации выдачи для сужения области поиска и повторной генерации ответа. Справа отображается подсвеченный текст документа, который был использован для формирования ответа
В сценарии вопросно-ответного режима есть возможность оперативной фильтрации выдачи для сужения области поиска и повторной генерации ответа. Справа отображается подсвеченный текст документа, который был использован для формирования ответа

Технология RAG включает в себя ряд этапов, каждый из которых реализован в нашем продукте в виде NLP-модуля и может быть кастомизирован на стороне клиента:

  • нарезка текста документа на фрагменты (chunking);

  • получение вектора по каждому фрагменту (embedding);

  • ранжирование и фильтрация найденных контекстов по степени релевантности запросу пользователя (re-ranking);

  • генерация ответа на основе релевантных контекстов;

  • валидация корректности ответа (другой LLM).

Пример настройки модуля получения векторов
Пример настройки модуля получения векторов
Пример настройки модуля нарезки на фрагменты (используем реализацию из LangChain)
Пример настройки модуля нарезки на фрагменты (используем реализацию из LangChain)
Пример реализации NLP-модуля извлечения атрибутов на базе LLM
Пример реализации NLP-модуля извлечения атрибутов на базе LLM

Модуль реализует общий интерфейс INlpGenericModule<I,O>, что позволяет работать с различными типами входных и выходных данных. Приведенная в примере реализация возвращает NlpEntitiesResult, но может быть адаптирована для других форматов ответов.

Созданные и настроенные под каждый этап NLP-модули указываются в настройках векторного поиска и поиска на естественном языке.

Если у вас уже есть собственная реализация RAG на open-source компонентах, и ее требуется расширить под новые источники или форматы, но ресурсов не хватает, наш продукт может выступить готовой платформой для такого масштабирования.

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

Сценарии автоматизации на базе NLP-модулей

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

Ассистент по проверке документов на соответствие регламентам

В качестве первого примера рассмотрим проверку документа на соответствие внутренним регламентам. Она обычно проводится вручную и для объемных документов занимает приличное количество времени, но ее можно автоматизировать, подключив ассистента на базе нашего продукта. 

Пример отчета ассистента по проверке договора NDA (о неразглашении конфиденциальной информации) на соответствие внутренним требованиям
Пример отчета ассистента по проверке договора NDA (о неразглашении конфиденциальной информации) на соответствие внутренним требованиям

Регламенты, задающие правила проверки, находятся в некотором источнике (например, сетевой папке или корпоративном портале) и регулярно обновляются. Поэтому на первом этапе нужно обеспечить: 

  • автоматический мониторинг данного источника; 

  • анализ содержимого каждого регламента;

  • извлечение из него атомарных (максимально кратких и простых) требований для дальнейшей проверки.

Эти требования извлекаются LLM и сохраняются в отдельный поисковый индекс. Далее проверяемые документы также поступают в некоторый источник (например, почту или СЭД) и по ним нужно оперативно подготовить отчет по проверке. Для этого на втором этапе настраивается мониторинг источника с входящими документами, и для каждого нового документа запускается проверка по всем ранее извлеченным требованиям. Таким образом, для решения задачи потребуется два NLP-модуля: первый будет извлекать базовые требования из набора регламентов, а второй — проверять их для входящего документа и формировать отчет о проверке. 

Целевой сценарий разбивается на следующие этапы:

  • Мониторинг источника с требованиями и регламентами: через коннектор к сетевой папке или корпоративному порталу.

  • Извлечение требований для проверки: для каждого регламента NLP-модуль на базе LLM определяет набор атомарных требований для последующей проверки.

  • Мониторинг источника, куда поступают документы на проверку: с помощью коннектора к почтовому серверу или сетевой папке.

  • Проверка входящего документа на соответствие требованиям: выполняется NLP-модулем, который проверяет соответствие документа набору ранее извлеченных требований.

  • Просмотр результата проверки документа: на поисковом портале после получения уведомления по электронной почте.

Ассистент по сверке позиций в смете на закупку со справочником товаров

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

Выходом может стать отчет ассистента по каждой позиции в смете с указанием имеющихся позиций на складе или возможных аналогов.

Для этого на первом этапе с помощью коннектора к СУБД следует загрузить в продукт содержимое справочника товаров из системы складского учета, при котором каждая запись станет отдельным документом. Затем для каждой проверяемой позиции в смете найти похожие в справочнике и оценить с помощью LLM степень близости и правильную формулировку названия. В данном случае будет достаточно одного NLP-модуля, который выполнит данные действия для входящей сметы и по каждой позиции предложит соответствующие позиции в справочнике.

Целевой сценарий разбивается на следующие этапы: 

  • Мониторинг справочника товаров в MDM-системе: через коннектор к СУБД или кастомный коннектор через API MDM-системы.

  • Мониторинг источника, в который приходят сметы: через коннектор к почтовому серверу или сетевой папке.

  • Извлечение товарных позиций и поиск соответствующих им товаров в справочнике: выполняется NLP-модулем, который на базе LLM определяет искомые товарные позиции и выполняет их поиск в справочнике.

  • Просмотр результата анализа сметы: на поисковом портале после получения уведомления по электронной почте.

Ассистент по определению максимальной цены для тендера

В качестве третьего примера рассмотрим задачу определения начальной максимальной цены контракта (НМЦК) при подготовке тендерной документации. Заказчику некоторого товара нужно предварительно собрать рыночные предложения по его стоимости и далее использовать среднее значение как максимальное. Для этого ряду поставщиков отправляется запрос на предоставление коммерческого предложения, а затем полученные КП вручную сводятся в общую таблицу и анализируются. 

Этот процесс можно автоматизировать, сделав автоматическую рассылку запроса на КП по заранее определенному шаблону, а после применив LLM для извлечения товарных позиций из полученных ответов. 

Целевой сценарий разбивается на следующие этапы:

  • Рассылка запросов на КП: выполняется NLP-модулем в начале обхода указанного почтового ящика (с учетом ранее отправленных писем), которому на вход передаются параметры подключения к почтовому серверу, шаблон письма и список рассылки.

  • Мониторинг почтового ящика, на который приходят ответы: через коннектор к почтовому серверу.

  • Анализ ответов поставщиков и выделение товарных позиций из КП: с помощью NLP-модуля в процессе мониторинга почтового ящика, который с помощью локальной LLM выделяет из ответов поставщиков товарные позиции и их стоимость в отдельный поисковый индекс.

  • Фильтрация по выбранным товарным позициям и определение средней стоимости через экспорт в XLS-файл.

Таким образом, сейчас в рамках нашего продукта закрыт вопрос доступа к данным (форматы, источники и права доступа) и вопрос базовых инструментов на базе LLM — поиск, RAG, извлечение атрибутов, транскрибация, суммаризация и другие функции. 

Следующий этап развития — переход к агентной модели. В ней созданные инструменты будут доступны через MCP-протокол, а логика и параметры их вызова будут определяться агентом на базе LLM в зависимости от контекста и целевого сценария автоматизации. Об этом мы расскажем уже в следующих статьях.


Это блог компании Content AI. Мы помогаем работать с информацией умнее — автоматизировать обработку документов, извлекать данные и повышать качество бизнес-процессов с помощью технологий и AI. Здесь рассказываем, как строим собственные продукты и делимся опытом, архитектурными решениями и кейсами внедрения интеллектуальной автоматизации.

Наш Telegram-канал со всеми новостями: https://t.me/content_ai

Комментарии (0)