Перейти к основному содержанию

База знаний AI-чата

Около 4 мин

База знаний AI-чата (RAG)

База знаний позволяет загрузить справочные документы вашего сервиса (статьи хелпа, регламенты, инструкции), и AI-чат будет отвечать пользователям, опираясь на их содержимое, а не выдумывая. Технически это RAG — Retrieval-Augmented Generation.

Только при включённом AI-модуле

База знаний — часть AI-модуля. Раздел доступен, если AI-модуль входит в вашу лицензию и включён. Если лицензия активна, но AI-модуль не подключён, вкладка «База знаний» в админке показывается только для ознакомления — настройки видны, но изменять их нельзя (отмечены замком). Чтобы пользоваться — подключите AI-модуль.

Как это работает

При загрузке документа:

  1. Документ режется на небольшие фрагменты (чанки) с нахлёстом.
  2. Каждый фрагмент превращается в вектор (эмбеддинг) — локальной моделью прямо на сервере, без обращения к внешним сервисам (текст документов никуда не уходит).
  3. Векторы и оригинал сохраняются в базе (Postgres + расширение pgvector).

Нужно расширение pgvector

Векторный движок (на нём же — быстрый универсальный поиск платформы) требует расширение pgvector в PostgreSQL — без него бэкенд не запустится. Это базовое требование, а не часть AI-модуля. Стандартный образ postgres pgvector не содержит: используйте pgvector/pgvector:pg17 или установите pgvector в свою сборку/DBaaS. Подробнее — «Требования к PostgreSQL».

Когда пользователь пишет в чат:

  1. По его вопросу система ищет наиболее подходящие фрагменты — гибридно: и по смыслу (векторный поиск), и по точным словам (полнотекстовый поиск). Векторный ловит синонимы, словесный — точные термины, коды, аббревиатуры.
  2. Подходящие фрагменты подкладываются модели как справочный материал.
  3. Модель формирует ответ по ним и, при необходимости, ссылается на источник.

Справка ≠ действие

Если пользователь просит выполнить действие («создай роль X»), чат выполняет его через инструменты, а не пересказывает инструкцию. База знаний используется для ответов на вопросы («как создать роль?»), а не вместо действий.

Параметры и значения по умолчанию

Параметры задаются в админке и применяются без перезапуска.

ПараметрПо умолчаниюЧто делаетНужна переиндексация?
Размер чанка320На сколько токенов резать документ при индексации. Меньше — точнее, но обрывистее; больше — размывает смысл.да
Нахлёст чанков48Перекрытие соседних фрагментов (≈10–15 %) — сохраняет смысл на стыках.да
Порог релевантности0.84Минимальная близость фрагмента, чтобы попасть в ответ чата. Ниже порога — в ответ не идёт.нет
Фрагментов в ответ (topK)4Сколько фрагментов подкладывать модели. Обычно 3–5.нет
Гибридный поисквклСовмещать смысловой и словесный поиск. Рекомендуется оставить включённым.нет

Размер чанка измеряется в условных токенах

Размер чанка считается во внутренних токенах индексатора, а не в токенах модели эмбеддингов. На русском они расходятся: значение 320 ≈ 230–275 токенов модели при её лимите 512 — то есть с запасом. Безопасный потолок — около 600. Не поднимайте размер чанка к 512 «потому что модель держит 512» — это разные единицы, иначе часть текста будет обрезана при индексации.

Что и где менять

Всё — в админке (нужны права полного доступа):

  • Администрирование → вкладка «База знаний» — основной экран:
    • Загрузка / обновление документов (.md, .txt). Кнопка-«глаз» — просмотр оригинала, кнопка обновления — заменить файл, корзина — удалить (с подтверждением).
    • «Проверить поиск» — вводите запрос и смотрите, какие фрагменты и с какой близостью поднимаются, ещё до ответа модели. Бейдж «по словам» означает точное словесное совпадение. Главный инструмент отладки.
    • Параметры — размер чанка, нахлёст, порог, topK, гибрид + кнопка «Переиндексировать».
  • Администрирование → «Настройки приложения» — те же параметры доступны и здесь (раздел AI), как обычные настройки.

Когда нажимать «Переиндексировать»

После изменения размера чанка или нахлёста нужно переиндексировать — система заново разрежет и пересчитает все документы (из сохранённых оригиналов). Порог, topK и гибрид применяются сразу, без переиндексации.

Наполнение по API (программно)

Кроме ручной загрузки через админку, базу знаний можно наполнять программно — например, синхронизировать её со своей вики, хелпдеском или CMS внешним пайплайном (n8n, скрипт, CI). Документы доставляются батчами; обновление и удаление — идемпотентные.

Требуется AI-модуль

Ручка работает только при включённом AI-модуле (как и вся база знаний).

Аутентификация. Заголовок X-Api-Key — ключ интеграции команды (тот же механизм, что и у остального публичного API). Писать в базу знаний может только команда с полным доступом.

Базовый путь: /api/v1/integration/kb-documents

Загрузка / обновление — POST /batch

Тело — набор документов одного источника. sourceSystem — ваш код источника (любая строка до 64 символов, кроме зарезервированного manual), externalId — идентификатор документа в вашей системе. Пара (sourceSystem, externalId)ключ идемпотентности: повторная заливка того же документа обновит его, а не создаст дубль.

curl -X POST https://<ваш-сервер>/api/v1/integration/kb-documents/batch \
  -H "X-Api-Key: <ключ-команды>" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceSystem": "my-wiki",
    "items": [
      {
        "externalId": "article-42",
        "title": "Как создать роль",
        "content": "# Создание роли\n\nЧтобы создать роль, откройте…",
        "moreUrl": "https://wiki.example.com/articles/42"
      },
      { "externalId": "article-7", "deleted": true }
    ]
  }'
ПолеОбязательноНазначение
sourceSystemдаКод источника (на весь батч). До 64 символов, кроме manual.
items[].externalIdдаИдентификатор документа в источнике. До 256 символов.
items[].titleдля upsertЗаголовок (если пуст — подставится externalId).
items[].contentдля upsertТекст (Markdown / plain), UTF-8.
items[].moreUrlнетСсылка «подробнее» — чат покажет её пользователю рядом с ответом.
items[].deletedнетtrue → снять документ с публикации (нужен только externalId).

Ответ — счётчики created / updated / tombstoned / skipped и список errors по конкретным элементам: один кривой документ не валит весь батч. Неизменившиеся документы пропускаются (skipped) — повторная заливка того же контента ничего не пересчитывает.

До 500 документов в запросе

Лейте крупными батчами (200–300 — нормально). На очень больших объёмах режьте на пачки по ≤500.

Полная синхронизация — POST /prune

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

curl -X POST https://<ваш-сервер>/api/v1/integration/kb-documents/prune \
  -H "X-Api-Key: <ключ-команды>" \
  -H "Content-Type: application/json" \
  -d '{ "sourceSystem": "my-wiki", "keepExternalIds": ["article-42", "article-7"] }'

Защита от случайного сноса

Если keepExternalIds пуст, а в источнике есть живые документы, запрос отклоняется — чтобы упавший пайплайн (приславший пустой список) не снёс весь источник. Чтобы намеренно очистить источник, передайте "force": true.

Индексация — фоновая

Ручка принимает документы и отвечает сразу; векторизация идёт фоном (обычно в пределах нескольких минут). Поэтому только что залитый документ появляется в поиске чата с небольшой задержкой — это нормально. Жать «Переиндексировать» при этом не нужно: новые и изменённые документы индексируются автоматически.

Как подобрать параметры

Тюнить «на глаз» бесполезно — используйте «Проверить поиск»:

  1. Соберите 10–15 типичных вопросов пользователей.
  2. Прогоняйте их, меняя один параметр за раз.
  3. Смотрите: попадает ли нужная статья в топ и выше ли её близость, чем у нерелевантной.
  4. Сменили размер чанка/нахлёст — нажмите «Переиндексировать».

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

Модель эмбеддингов

Используется компактная многоязычная модель (multilingual-e5-small), которая работает локально на сервере. Она поставляется вместе с системой — отдельная настройка не требуется. Данные документов при индексации и поиске не покидают сервер.