219 lines
9.4 KiB
Markdown
219 lines
9.4 KiB
Markdown
# Модуль rag_session
|
||
|
||
## 1. Функции модуля
|
||
- Создание и обслуживание сессионного RAG индекса по загруженным пользователем файлам.
|
||
- Индексация снапшота и инкрементальных изменений.
|
||
- Хранение чанков, retrieval контекста, трекинг статуса index jobs.
|
||
- Публикация прогресса индексации через SSE.
|
||
|
||
## 2. Диаграмма классов и взаимосвязей
|
||
```mermaid
|
||
classDiagram
|
||
class RagModule
|
||
class RagService
|
||
class RagRepository
|
||
class RagSessionStore
|
||
class IndexJobStore
|
||
class IndexingOrchestrator
|
||
class TextChunker
|
||
class GigaChatEmbedder
|
||
class EventBus
|
||
|
||
RagModule --> RagService
|
||
RagModule --> RagRepository
|
||
RagModule --> RagSessionStore
|
||
RagModule --> IndexJobStore
|
||
RagModule --> IndexingOrchestrator
|
||
RagService --> RagRepository
|
||
RagService --> TextChunker
|
||
RagService --> GigaChatEmbedder
|
||
IndexingOrchestrator --> IndexJobStore
|
||
IndexingOrchestrator --> RagService
|
||
IndexingOrchestrator --> EventBus
|
||
```
|
||
|
||
## 3. Описание классов
|
||
- `RagModule`: composition-root для сессионного RAG и его API.
|
||
Методы: `__init__` — собирает сервисы индексации/retrieval; `public_router` — публикует внешние endpoint'ы; `internal_router` — публикует внутренние endpoint'ы.
|
||
- `RagService`: доменный сервис индексации и retrieval.
|
||
Методы: `index_snapshot` — индексирует полный набор файлов; `index_changes` — индексирует только изменения; `retrieve` — возвращает релевантные чанки по запросу.
|
||
- `RagRepository`: слой доступа к БД для сессий, джобов и чанков.
|
||
Методы: `ensure_tables` — создает/обновляет схему; `upsert_session/get_session/session_exists` — операции по сессиям; `create_job/update_job/get_job` — операции по задачам индексации; `replace_chunks/apply_changes/retrieve/fallback_chunks` — операции по chunk-данным.
|
||
- `RagSessionStore`: управление жизненным циклом `rag_session`.
|
||
Методы: `create` — создает новую сессию; `put` — upsert с внешним id; `get` — читает сессию.
|
||
- `IndexJobStore`: управление `index_job` на уровне приложения.
|
||
Методы: `create` — создает задачу индексации; `get` — читает задачу; `save` — обновляет статус/ошибку.
|
||
- `IndexingOrchestrator`: асинхронный оркестратор index-jobs.
|
||
Методы: `enqueue_snapshot` — ставит полную индексацию в очередь; `enqueue_changes` — ставит инкрементальную индексацию в очередь.
|
||
- `TextChunker`: разбивает текст файла на чанки для embedding.
|
||
Методы: `chunk` — возвращает список чанков заданного текста.
|
||
- `GigaChatEmbedder`: адаптер embeddings-модели.
|
||
Методы: `embed` — возвращает векторы для набора текстов.
|
||
- `EventBus`: доставка событий прогресса индексации.
|
||
Методы: `publish` — отправляет событие; `subscribe/unsubscribe` — управляет подписками SSE.
|
||
|
||
## 4. Сиквенс-диаграммы API
|
||
|
||
### POST /api/rag/sessions
|
||
Назначение: создает новую `rag_session` и запускает фоновую индексацию полного набора файлов.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as RagModule.APIRouter
|
||
participant Sessions as RagSessionStore
|
||
participant Indexing as IndexingOrchestrator
|
||
|
||
Router->>Sessions: create(project_id)
|
||
Sessions-->>Router: rag_session_id
|
||
Router->>Indexing: enqueue_snapshot(rag_session_id, files)
|
||
Indexing-->>Router: index_job_id,status
|
||
```
|
||
|
||
### POST /api/rag/sessions/{rag_session_id}/changes
|
||
Назначение: ставит в очередь инкрементальную переиндексацию изменений для существующей `rag_session`.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as RagModule.APIRouter
|
||
participant Sessions as RagSessionStore
|
||
participant Indexing as IndexingOrchestrator
|
||
|
||
Router->>Sessions: get(rag_session_id)
|
||
Sessions-->>Router: session
|
||
Router->>Indexing: enqueue_changes(rag_session_id, changed_files)
|
||
Indexing-->>Router: index_job_id,status
|
||
```
|
||
|
||
### GET /api/rag/sessions/{rag_session_id}/jobs/{index_job_id}
|
||
Назначение: возвращает состояние и статистику конкретной задачи индексации.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as RagModule.APIRouter
|
||
participant Jobs as IndexJobStore
|
||
|
||
Router->>Jobs: get(index_job_id)
|
||
Jobs-->>Router: job_state
|
||
```
|
||
|
||
### GET /api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events
|
||
Назначение: дает SSE-поток событий прогресса по задаче индексации.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as RagModule.APIRouter
|
||
participant Jobs as IndexJobStore
|
||
participant Events as EventBus
|
||
|
||
Router->>Jobs: get(index_job_id)
|
||
Router->>Events: subscribe(index_job_id, replay=True)
|
||
loop until terminal
|
||
Events-->>Router: index event
|
||
end
|
||
Router->>Events: unsubscribe(index_job_id)
|
||
```
|
||
|
||
### POST /api/index/snapshot (legacy)
|
||
Назначение: legacy-вход для полной индексации проекта с автоматическим созданием сессии по `project_id`.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as LegacyAPIRouter
|
||
participant Sessions as RagSessionStore
|
||
participant Indexing as IndexingOrchestrator
|
||
|
||
Router->>Sessions: put(project_id, project_id)
|
||
Router->>Indexing: enqueue_snapshot(project_id, files)
|
||
Indexing-->>Router: index_job_id,status
|
||
```
|
||
|
||
### POST /api/index/changes (legacy)
|
||
Назначение: legacy-вход для инкрементальной индексации изменений по `project_id`.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as LegacyAPIRouter
|
||
participant Sessions as RagSessionStore
|
||
participant Indexing as IndexingOrchestrator
|
||
|
||
Router->>Sessions: get(project_id)
|
||
alt missing
|
||
Router->>Sessions: put(project_id, project_id)
|
||
end
|
||
Router->>Indexing: enqueue_changes(project_id, changed_files)
|
||
Indexing-->>Router: index_job_id,status
|
||
```
|
||
|
||
### GET /api/index/jobs/{index_job_id} (legacy)
|
||
Назначение: legacy-чтение статуса index-job по `index_job_id`.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as LegacyAPIRouter
|
||
participant Jobs as IndexJobStore
|
||
|
||
Router->>Jobs: get(index_job_id)
|
||
Jobs-->>Router: job_state
|
||
```
|
||
|
||
### GET /api/index/jobs/{index_job_id}/events (legacy)
|
||
Назначение: legacy-SSE поток событий по index-job.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as LegacyAPIRouter
|
||
participant Jobs as IndexJobStore
|
||
participant Events as EventBus
|
||
|
||
Router->>Jobs: get(index_job_id)
|
||
Router->>Events: subscribe(index_job_id, replay=True)
|
||
loop until terminal
|
||
Events-->>Router: index event
|
||
end
|
||
Router->>Events: unsubscribe(index_job_id)
|
||
```
|
||
|
||
### POST /internal/rag/index/snapshot
|
||
Назначение: внутренний синхронный запуск полной индексации для сервисных сценариев.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as InternalRagRouter
|
||
participant Sessions as RagSessionStore
|
||
participant RagService as RagService
|
||
|
||
Router->>Sessions: get(project_id)
|
||
alt missing
|
||
Router->>Sessions: put(project_id, project_id)
|
||
end
|
||
Router->>RagService: index_snapshot(project_id, files)
|
||
RagService-->>Router: indexed_files,failed_files
|
||
```
|
||
|
||
### POST /internal/rag/index/changes
|
||
Назначение: внутренний синхронный запуск индексации изменений.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as InternalRagRouter
|
||
participant RagService as RagService
|
||
|
||
Router->>RagService: index_changes(project_id, changed_files)
|
||
RagService-->>Router: indexed_files,failed_files
|
||
```
|
||
|
||
### GET /internal/rag/index/jobs/{index_job_id}
|
||
Назначение: внутреннее получение статуса и ошибки index-job для сервисов оркестрации.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as InternalRagRouter
|
||
participant Jobs as IndexJobStore
|
||
|
||
Router->>Jobs: get(index_job_id)
|
||
Jobs-->>Router: job_state
|
||
```
|
||
|
||
### POST /internal/rag/retrieve
|
||
Назначение: внутренний retrieval релевантных чанков из `rag_session` по текстовому запросу.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as InternalRagRouter
|
||
participant RagService as RagService
|
||
participant RagRepo as RagRepository
|
||
|
||
Router->>RagService: retrieve(rag_session_id, query)
|
||
RagService->>RagRepo: retrieve/fallback_chunks
|
||
RagRepo-->>RagService: chunks
|
||
RagService-->>Router: items
|
||
```
|