AACsearch
Knowledge RAG

Источники знаний

Поддерживаемые типы источников, lifecycle ingest-а, стратегии чанкинга и поведение синхронизации в модуле Knowledge.

Data source описывает, откуда берутся документы Knowledge space. Сейчас поддерживается два варианта из коробки — upload файла и URL fetch — а коннекторы (Confluence, Notion, Google Drive) — в roadmap.

Типы источников

sourceTypeСтатусЧто ingest-итПоведение синка
FILE_UPLOAD✅ AvailablePDF, DOCX, TXT, MarkdownOne-shot — повторная загрузка для обновления
URL_FETCH✅ AvailableОдна веб-страница (HTML → text)One-shot — re-ingest для обновления
CONFLUENCE⏳ RoadmapСтраницы Confluence (per space / label)Scheduled, инкрементальный
NOTION⏳ RoadmapСтраницы и базы NotionScheduled, инкрементальный
GOOGLE_DRIVE⏳ RoadmapПапки Drive (docs, slides, sheets)Scheduled, инкрементальный
SHAREPOINT⏳ RoadmapSharePoint document librariesScheduled, инкрементальный

Полный enum — KnowledgeSourceType в packages/database/prisma/schema.prisma. Roadmap-значения — заглушки: нет ни DataSource-записей, ни парсеров, ни sync-воркеров.

Поддерживаемые форматы (FILE_UPLOAD)

ФорматСтатусЗаметки
application/pdfЧерез pdf-parse в parsers.ts
application/vnd.openxmlformats-…-document (DOCX)mammoth-адаптер
text/plain (TXT)UTF-8 по умолчанию. Latin-1 / Windows-1251 — эвристическое декодирование.
text/markdownMarkdown режется chunk-aware (см. стратегии ниже).
application/msword (legacy .doc)Сначала конвертируйте в DOCX.
application/rtfСначала конвертируйте в TXT / DOCX.
Сканированный PDF (только изображения)OCR — roadmap. PDF должен иметь текстовый слой.

Лимит размера файла — из тарифа org (MAX_KNOWLEDGE_FILE_SIZE_BYTES). По умолчанию — 25 MB для платных, 5 MB для free.

Lifecycle ingest-а

DataSource ──► IngestionJob (QUEUED)


            IngestionJob (RUNNING)

              parse + chunk + embed

        ┌───────────┴───────────┐
        ▼                       ▼
KnowledgeDocument         (graph build)


KnowledgeChunk × N (+ embedding)


            IngestionJob (SUCCEEDED / FAILED)

Каждая запись IngestionJob:

  • statusQUEUED → RUNNING → SUCCEEDED или FAILED.
  • totalItems — оценка парсера в единицах работы (страницы / секции).
  • processedItems, failedItems — нарастающие счётчики.
  • errorMessage — на провал. Видно в дашборде Ingestion Jobs.

Список — knowledge.listIngestionJobs. Для диагностики смотрите inputMeta (имя файла, mime, размер).

Retry-семантика

Провалившиеся job-ы не ретраятся автоматически. Рекомендованный flow:

  1. Смотрим errorMessage в дашборде.
  2. Чиним источник (перекодируем PDF, расширяем URL, заменяем кривой DOCX) или окружение (квота LLM исчерпана).
  3. Повторно запускаем — переуплоадом или повторным ingestFile / ingestUrl. Создаётся новая IngestionJob, существующий DataSource переиспользуется.

Re-ingest заменяет предыдущий KnowledgeDocument по ключу (knowledgeSpaceId, externalId) и пересоздаёт чанки + эмбеддинги. Старые чанки удаляются каскадом по documentId.

Стратегии чанкинга

Реализация — packages/api/modules/knowledge/lib/chunking.ts. Стратегия определяет, как распарсенный текст режется перед эмбеддингом:

StrategyКогдаКак режет
fixedПо умолчанию. Смешанные форматы.Фиксированное число слов на чанк с настраиваемым overlap.
semanticДлинная проза, статьи.Разрезает по абзацам/предложениям; fallback на fixed при слишком длинном.
markdownMarkdown / Confluence-стиль.Режет по уровням заголовков; старается держать секцию целой.
codeДокументация по коду, API-референсы.Режет по границам функций/классов; знает про тройные fenced-блоки.

Параметризуется per call (или per space, Beta):

{
  strategy: "semantic",
  chunkSize: 350,      // целевое число слов
  minChunkSize: 60,    // слить меньше этого
  maxChunkSize: 600,
  overlap: 50,         // overlapping слов между соседями
}

Правило: 250–400 слов на чанк, 30–50 слов overlap — покрывает большинство прозы. Большие чанки — меньше retrieval-ов, но слабее сигнал; маленькие — лучше relevance, но дороже эмбеддинги.

Эмбеддинги

Каждый embeddingJson массив floats размером под выбранную модель:

Модельnum_dimСтатус
text-embedding-3-small1536✅ Default
text-embedding-3-large3072🟡 Beta — per-space выбор
Локальный hashing fallback128✅ Available — без API-ключа (только dev)

KnowledgeSpace.ragConfig.embeddingModel переопределяет дефолт per space. Локальный 128-dim fallback (embedTextLocally в chunking.ts) — только dev: бесполезен для retrieval-а, до продакшена настройте реальную модель.

Смена модели эмбеддингов инвалидирует все существующие эмбеддинги чанков. После смены — full re-ingest каждого источника в space.

Ingest файла

const job = await orpc.knowledge.ingestFile.call({
  spaceId: "ks_…",
  fileName: "handbook.pdf",
  mimeType: "application/pdf",
  bytes: pdfArrayBuffer,
});
// → { ingestionJobId, dataSourceId }

Опрос — knowledge.listIngestionJobs, либо SSE в дашборде.

Ingest URL

await orpc.knowledge.ingestUrl.call({
  spaceId: "ks_…",
  url: "https://example.com/docs/payments",
  cssSelector: "main article",   // опционально — сузить экстракцию
});

Только публичные HTML-URL — без JS-исполнения, без auth-хедеров, без SPA-render-а. Страницы за логином — roadmap (коннекторы).

Удаление source-ов и файлов

ДействиеAPIЭффект
Удалить один файл/документknowledge.deleteFile({ documentId })Каскад по KnowledgeChunk.
Удалить data sourceknowledge.deleteSource({ dataSourceId })Каскад по всем KnowledgeDocument и чанкам под ним.
Удалить spaceknowledge.deleteSpace({ spaceId })Каскад по всем sources, документам, чанкам, graph node/edge.

Каскады — на уровне Postgres FK (onDelete: Cascade в schema.prisma). Удаление durable и необратимое. Подтверждайте в UI.

Квоты

Per-org квоты — из entitlements:

КвотаПоле плана
Max spaces per orgentitlements.knowledge.maxSpaces
Max documents per spaceentitlements.knowledge.maxDocsPerSpace
Max bytes per fileentitlements.knowledge.maxBytesPerFile
Месячный бюджет эмбеддинговentitlements.knowledge.monthlyEmbeddingKopecks

Исчерпание квоты → 402 Payment Required и активити-эвент quota_warning при 80% месячного бюджета.

Связанные страницы

On this page