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

В итоге мы решили попробовать Swirl - поисковую платформу с открытым исходным кодом, созданную на Python и Django, позволяющую легко объединить поиск в базах данных (SQL и NoSQL), облачных сервисах, поисковых провайдерах, хранилищах данных и таких инструментах, как Miro, Jira, GitHub и т.д., а на выходе получать результаты с аналитикой от ChatGPT.

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

Она позволила нам реализовать поиск по нашим корпоративным данным прямо из коробки.

Коротко о том, что дальше расскажем подробно:

  • Какие задачи мы решали с Swirl

  • Как настраивали и интегрировали систему

  • Какие преимущества получили в итоге

Ну что, поехали!

Почему именно Swirl?

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

Мы оценили популярные решения типа Solr и некоторые другие open source системы. Однако они обрабатывают копии всех исходных данных и индексируют их, что может быть дорогим и трудоемким для небольших компаний. 

В итоге мы обратили внимание на Swirl - поисковую платформу с открытым исходным кодом на базе Python и фреймворка Django. Её архитектура включала несколько важных для нас компонентов.

В Swirl были гибкие модули подключения к данным через API, интеграция с GPT для генерации текстовых ответов и опции мониторинга.

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

Но это были только первые впечатления от работы с системой. 

Поиск в условиях информационного хаоса

По мере роста нашей компании объемы данных стремительно увеличивались. При этом они хранились в самых разных форматах и источниках:

  • Базы данных SQL для структурированных данных

  • Различные базы данных NoSQL для неструктурированных данных

  • Репозитории исходного кода (Git)

  • Корпоративная электронная почта

  • Облачные хранилища 

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

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

Чтобы решить эту проблему, мы внедрили Swirl - систему поиска с открытым исходным кодом. Благодаря гибким API Swirl может интегрироваться практически с любым источником данных:

  • Подключается к базам данных SQL и NoSQL

  • Интегрируется с репозиториями кода 

  • Связывается с облачными хранилищами по API

  • Запросы пользователей распространяются Swirl одновременно на все источники. 

  • Результаты ранжируются с помощью встроенной в Swirl модели косинусно-векторного сходства, основанной на spaCy, а также с помощью увеличения числа терминов и фраз.

Swirl также позволяет расширять функционал с помощью самописных коннекторов.

К примеру, вот так выглядит стандартный connector для PostgreSQL:

{

    "name": "Company Funding Records - PostgreSQL)",

    "default": false,

    "connector": "PostgreSQL",

    "url": "host:port:database:username:password",

    "query_template": "select {fields} from {table} where {field1} ilike '%{query_string}%' or {field2} ilike '%{query_string}%';",

    "query_processors": [

        "AdaptiveQueryProcessor"

    ],

    "query_mappings": "fields=*,sort_by_date=fundedDate,table=funding,field1=city,field2=company",

    "result_processors": [

        "MappingResultProcessor",

        "CosineRelevancyResultProcessor"

    ],

    "result_mappings": "title='{company} series {round}',body='{city} {fundeddate}: {company} raised usd ${raisedamt}\nThe company is headquartered in {city} and employs {numemps}',date_published=fundeddate,NO_PAYLOAD",

    "tags": [

        "Company",

        "PostgreSQL",

        "Internal"

    ]

}

Все это позволило нам организовать единую точку поиска по всем корпоративным данным и оптимизировать этот процесс.

Интеллектуальный поиск с генерацией ответов на естественном языке

В ходе внедрения Swirl мы изучили подход Retrieval Augmented Generation (RAG) для интеллектуального поиска. Его суть - сначала система выполняет контекстный поиск релевантной информации, а затем генерирует развёрнутый ответ на естественном языке на основе найденных данных. 

Так, при поисковом запросе "отчётность за 2023 год" система сначала выполняет поиск по базам данных и выявляет релевантные отчёты. Затем передаёт найденную информацию в модуль ИИ, который генерирует краткое резюме в формате (примерный текст):

"В текущем квартале объем продаж компании вырос на 15% по сравнению с предыдущим и составил Х рублей. Подробная информация представлена в отчётах за 1-3 кварталы 2023 года: Q1 - ссылка раз, Q2 - ссылка два".

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

При запросе "Отчеты о продажах за 2023" Swirl определяет тематику, выделяет временной период и показывает именно подходящие отчеты. Работа системы с контекстом выходит на уровень. Это реально экономит массу времени по сравнению с ручным анализом сырых данных! 

Мы протестировали этот подход на различных типах запросов и получили следующие результаты:

  • Точность и релевантность ответов оценивается специалистами на 4,7 балла из 5.

  • Время получения ответа снизилось в среднем на 58% по сравнению с ручным поиском.

А теперь давайте рассмотрим подробный алгоритм поиска:

  1. Пользователь формулирует запрос на естественном языке.

  2. Swirl распространяет запрос на интегрированные данные через встроенный или самописный connector.

  3. Источники возвращают набор первичных результатов.

  4. Результаты объединяются и ранжируются по релевантности.

  5. Наиболее подходящие отправляются в LLM вместе с контекстом запроса.

  6. LLM анализирует результаты и генерирует ответ пользователю.

Какие перспективы?

Внедрив Swirl, мы увидели большие перспективы использования возможностей ИИ для оптимизации работы с данными. Swirl является подходящим быстрым для небольших компаний вроде нашей.

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

В целом, решения наподобие Swirl позволяют компаниям эффективнее использовать накопленную информацию для развития бизнеса.

Безусловно, поисковые системы с элементами ИИ - это будущее работы с данными, и мы рады быть частью этого увлекательного пути!

Желаем удачи в работе и приглашаем в комментарии! Очень интересно услышать ваше мнение и рассказы о похожем опыте!

Если после нашего рассказа, вас заинтересовал Swirl, то вот все необходимые для начала работы ссылки:

GitHub: Swirl on GitHub 

Инструкция по установке: Getting started with Swirl

Документация: Swirl Wiki

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


  1. Sunny_Space
    11.10.2023 07:00
    +1

    Идея интересная, спасибо, что поделились опытом!


  1. sergbe
    11.10.2023 07:00

    Мое видение, что для поиска внутренних БД лучше Elasticsearch. Поддерживает формы неструктурированных и структурированных данных в отличие от Swirl. Но Elastic заметно сложнее в настройке.


  1. ovsale
    11.10.2023 07:00
    +2

    При запросе "Отчеты о продажах за 2023" Swirl определяет тематику, выделяет временной период

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


  1. rajce
    11.10.2023 07:00
    +1

    Какие альтернативные решения были рассмотрены перед выбором Swirl и почему они были отклонены?


    1. Lithium_vn Автор
      11.10.2023 07:00
      +1

      Рассматривали elasticsearch, который упоминали выше в комментах, но он нам не подошел из-за высокой затратности. Swirl в этом плане больше подходит для компаний нашего размера)


  1. podvox23
    11.10.2023 07:00
    +1

    Локальные LLM использовать можно?


  1. Academy128
    11.10.2023 07:00
    +2

    Спасибо за информацию.