336 lines
12 KiB
Markdown
336 lines
12 KiB
Markdown
# Модуль rag
|
||
|
||
## 1. Функции модуля
|
||
- Единое ядро RAG для индексации и retrieval по документации и коду проекта.
|
||
- Поддержка двух семейств индексации: `DOCS` и `CODE`, с разными слоями и разными pipeline.
|
||
- Хранение `rag_session`, index-jobs, многослойных документов, cache-слоев и retrieval-запросов.
|
||
- Поддержка индексации snapshot и changes с переиспользованием cache по `blob_sha`.
|
||
- Предоставление контекста для agent/chat, где `DOCS` используется по умолчанию, а `CODE` включается для явных вопросов по реализации.
|
||
|
||
## 2. Диаграмма классов и взаимосвязей
|
||
```mermaid
|
||
classDiagram
|
||
class RagService
|
||
class RagRepository
|
||
class RagSchemaRepository
|
||
class RagDocumentUpserter
|
||
class DocsIndexingPipeline
|
||
class CodeIndexingPipeline
|
||
class RagQueryRouter
|
||
class GigaChatEmbedder
|
||
|
||
RagService --> RagRepository
|
||
RagService --> DocsIndexingPipeline
|
||
RagService --> CodeIndexingPipeline
|
||
RagService --> RagQueryRouter
|
||
RagService --> GigaChatEmbedder
|
||
RagRepository --> RagSchemaRepository
|
||
RagService --> RagDocumentUpserter
|
||
```
|
||
|
||
## 3. Описание классов
|
||
- `RagService`: основной application-service модуля.
|
||
Методы: `index_snapshot` — индексирует полный набор файлов; `index_changes` — применяет инкрементальные изменения; `retrieve` — возвращает релевантный контекст из `DOCS` или `CODE`.
|
||
- `RagRepository`: фасад persistence-слоя RAG.
|
||
Методы: `ensure_tables` — создает/обновляет схему; `upsert_session/get_session/session_exists` — операции по `rag_session`; `create_job/update_job/get_job` — операции по index jobs; `replace_documents/apply_document_changes` — операции по документам; `get_cached_documents/cache_documents` — работа с cache; `retrieve/fallback_chunks` — retrieval.
|
||
- `RagSchemaRepository`: управление схемой БД для RAG.
|
||
Методы: `ensure_tables` — создает таблицы и индексы; `_ensure_columns` — добавляет новые поля; `_ensure_indexes` — поддерживает индексы для retrieval и фильтрации.
|
||
- `RagDocumentUpserter`: батчевый writer многослойных `RagDocument`.
|
||
Методы: `replace` — полностью заменяет документы сессии; `apply_changes` — применяет upsert/delete по измененным путям.
|
||
- `DocsIndexingPipeline`: pipeline индексации документации.
|
||
Методы: `supports` — определяет, относится ли файл к docs; `index_file` — строит документы слоев `D1-D4` для одного файла.
|
||
- `CodeIndexingPipeline`: pipeline индексации Python-кода.
|
||
Методы: `supports` — определяет, относится ли файл к code; `index_file` — строит документы слоев `C0-C3` для одного файла.
|
||
- `RagQueryRouter`: выбирает retrieval mode и активные слои.
|
||
Методы: `resolve_mode` — определяет `docs` или `code`; `layers_for_mode` — возвращает набор слоев для retrieval.
|
||
- `GigaChatEmbedder`: адаптер embeddings-модели.
|
||
Методы: `embed` — возвращает embeddings для списка текстов.
|
||
|
||
## 4. Сиквенс-диаграммы API и выполнения
|
||
|
||
### Индексация snapshot через текущий `rag_session` facade
|
||
Назначение: создать/обновить `rag_session` и построить многослойный индекс по переданным файлам проекта.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Router as RagModule.APIRouter
|
||
participant Sessions as RagSessionStore
|
||
participant Indexing as IndexingOrchestrator
|
||
participant Rag as RagService
|
||
participant Docs as DocsIndexingPipeline
|
||
participant Code as CodeIndexingPipeline
|
||
participant Repo as RagRepository
|
||
|
||
Router->>Sessions: create(project_id)
|
||
Sessions-->>Router: rag_session_id
|
||
Router->>Indexing: enqueue_snapshot(rag_session_id, files)
|
||
Indexing->>Rag: index_snapshot(rag_session_id, files)
|
||
loop for each file
|
||
Rag->>Docs: supports/index_file
|
||
Rag->>Code: supports/index_file
|
||
Rag->>Repo: cache_documents(...)
|
||
end
|
||
Rag->>Repo: replace_documents(...)
|
||
Indexing-->>Router: index_job_id,status
|
||
```
|
||
|
||
### Retrieval для agent/chat
|
||
Назначение: вернуть релевантный контекст из нужного семейства слоев.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Agent as GraphAgentRuntime
|
||
participant Rag as RagService
|
||
participant Router as RagQueryRouter
|
||
participant Repo as RagRepository
|
||
|
||
Agent->>Rag: retrieve(rag_session_id, query)
|
||
Rag->>Router: resolve_mode(query)
|
||
Router-->>Rag: docs|code + layers
|
||
Rag->>Repo: retrieve(query_embedding, query_text, layers)
|
||
Repo-->>Rag: ranked items
|
||
Rag-->>Agent: items
|
||
```
|
||
|
||
### Retrieval + project/qa reasoning
|
||
Назначение: `RAG` вызывается не в начале runtime, а внутри отдельного graph-шага `context_retrieval` для `project/qa`.
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Agent as GraphAgentRuntime
|
||
participant Orch as OrchestratorService
|
||
participant G1 as conversation_understanding
|
||
participant G2 as question_classification
|
||
participant G3 as context_retrieval
|
||
participant Rag as RagService
|
||
participant G4 as context_analysis
|
||
participant G5 as answer_composition
|
||
|
||
Agent->>Orch: run(task)
|
||
Orch->>G1: execute
|
||
G1-->>Orch: resolved_request
|
||
Orch->>G2: execute
|
||
G2-->>Orch: question_profile
|
||
Orch->>G3: execute
|
||
G3->>Rag: retrieve(query)
|
||
Rag-->>G3: rag_items
|
||
G3-->>Orch: source_bundle
|
||
Orch->>G4: execute
|
||
G4-->>Orch: analysis_brief
|
||
Orch->>G5: execute
|
||
G5-->>Orch: final_answer
|
||
Orch-->>Agent: final_answer
|
||
```
|
||
|
||
Для `project/qa` это означает:
|
||
- ранний глобальный retrieval больше не нужен;
|
||
- `RAG` возвращает записи только для конкретного шага `context_retrieval`;
|
||
- оркестратор управляет цепочкой graph-шагов;
|
||
- пользовательский ответ собирается после анализа, а не напрямую из сырого retrieval.
|
||
|
||
## 5. Слои, фиксируемые в RAG
|
||
|
||
### 5.1. Слои DOCS
|
||
|
||
#### `D1_MODULE_CATALOG`
|
||
Назначение: каталог модулей документации и граф связей между ними.
|
||
|
||
Основные атрибуты:
|
||
- `module_id`
|
||
- `type`
|
||
- `domain`
|
||
- `title`
|
||
- `status`
|
||
- `version`
|
||
- `tags`
|
||
- `owners`
|
||
- `links`
|
||
- `calls_api`
|
||
- `called_by`
|
||
- `uses_logic`
|
||
- `used_by`
|
||
- `reads_db`
|
||
- `writes_db`
|
||
- `integrates_with`
|
||
- `emits_events`
|
||
- `consumes_events`
|
||
- `source_path`
|
||
- `summary_text`
|
||
|
||
#### `D2_FACT_INDEX`
|
||
Назначение: атомарные факты `subject-predicate-object` с evidence.
|
||
|
||
Основные атрибуты:
|
||
- `fact_id`
|
||
- `subject_id`
|
||
- `predicate`
|
||
- `object`
|
||
- `object_ref`
|
||
- `source_path`
|
||
- `anchor`
|
||
- `line_start`
|
||
- `line_end`
|
||
- `confidence`
|
||
- `tags`
|
||
|
||
#### `D3_SECTION_INDEX`
|
||
Назначение: семантические секции документации, нарезанные по заголовкам.
|
||
|
||
Основные атрибуты:
|
||
- `chunk_id`
|
||
- `module_id`
|
||
- `section_path`
|
||
- `section_title`
|
||
- `content`
|
||
- `source_path`
|
||
- `order`
|
||
- `tags`
|
||
- `domain`
|
||
- `type`
|
||
- `embedding`
|
||
|
||
#### `D4_POLICY_INDEX`
|
||
Назначение: глобальные правила и конвенции проекта.
|
||
|
||
Основные атрибуты:
|
||
- `policy_id`
|
||
- `applies_to`
|
||
- `rules`
|
||
- `default_behaviors`
|
||
- `source_path`
|
||
|
||
### 5.2. Слои CODE
|
||
|
||
#### `C0_SOURCE_CHUNKS`
|
||
Назначение: сырой код как источник истины для цитирования и evidence.
|
||
|
||
Основные атрибуты:
|
||
- `lang`
|
||
- `repo_id`
|
||
- `commit_sha`
|
||
- `path`
|
||
- `span`
|
||
- `title`
|
||
- `text`
|
||
- `module_or_unit`
|
||
- `chunk_type`
|
||
- `symbol_id`
|
||
- `hash`
|
||
|
||
#### `C1_SYMBOL_CATALOG`
|
||
Назначение: каталог символов кода и их деклараций.
|
||
|
||
Основные атрибуты:
|
||
- `lang`
|
||
- `repo_id`
|
||
- `commit_sha`
|
||
- `symbol_id`
|
||
- `qname`
|
||
- `kind`
|
||
- `decl.path`
|
||
- `decl.start_line`
|
||
- `decl.end_line`
|
||
- `text`
|
||
- `visibility`
|
||
- `signature`
|
||
- `decorators_or_annotations`
|
||
- `docstring_or_javadoc`
|
||
- `parent_symbol_id`
|
||
- `package_or_module`
|
||
- `is_entry_candidate`
|
||
- `lang_payload`
|
||
|
||
#### `C2_DEPENDENCY_GRAPH`
|
||
Назначение: связи между сущностями кода.
|
||
|
||
Основные атрибуты:
|
||
- `lang`
|
||
- `repo_id`
|
||
- `commit_sha`
|
||
- `edge_id`
|
||
- `edge_type`
|
||
- `src_symbol_id`
|
||
- `dst_symbol_id`
|
||
- `dst_ref`
|
||
- `evidence.path`
|
||
- `evidence.start_line`
|
||
- `evidence.end_line`
|
||
- `text`
|
||
- `resolution`
|
||
- `callsite_kind`
|
||
- `lang_payload`
|
||
|
||
#### `C3_ENTRYPOINTS`
|
||
Назначение: точки входа приложения и их обработчики.
|
||
|
||
Основные атрибуты:
|
||
- `lang`
|
||
- `repo_id`
|
||
- `commit_sha`
|
||
- `entry_id`
|
||
- `entry_type`
|
||
- `framework`
|
||
- `route_or_command`
|
||
- `handler_symbol_id`
|
||
- `evidence.path`
|
||
- `evidence.start_line`
|
||
- `evidence.end_line`
|
||
- `text`
|
||
- `http.methods`
|
||
- `http.auth`
|
||
- `request_model`
|
||
- `response_model`
|
||
- `cli.args_schema`
|
||
- `task.queue`
|
||
- `task.cron`
|
||
- `tags`
|
||
- `lang_payload`
|
||
|
||
#### `C4_PUBLIC_API`
|
||
Назначение: публичная поверхность API/экспортируемых символов.
|
||
|
||
Основные атрибуты:
|
||
- `api_id`
|
||
- `symbol_id`
|
||
- `stability`
|
||
- `source_of_truth`
|
||
- `versioning_tags`
|
||
- `lang_payload`
|
||
|
||
#### `C5_BEHAVIOR_SUMMARIES`
|
||
Назначение: поведенческие summary с обязательными evidence links.
|
||
|
||
Основные атрибуты:
|
||
- `target_type`
|
||
- `target_id`
|
||
- `text`
|
||
- `claims`
|
||
- `evidence_links`
|
||
- `confidence`
|
||
- `generated_by`
|
||
- `generated_at`
|
||
|
||
#### `C6_RUNTIME_TRACES`
|
||
Назначение: runtime/trace слой для связи кода и реального исполнения.
|
||
|
||
Основные атрибуты:
|
||
- `env`
|
||
- `trace_id`
|
||
- `span_id`
|
||
- `symbol_id`
|
||
- `entry_id`
|
||
- `text`
|
||
- `timings`
|
||
- `service`
|
||
- `host`
|
||
- `labels`
|
||
|
||
## 6. Правила retrieval
|
||
- По умолчанию retrieval идет в `DOCS`.
|
||
- `CODE` используется только для явных вопросов по реализации, устройству кода, endpoint'ам, handler'ам и документации “из кода”.
|
||
- Для `DOCS` приоритет слоев: `D1 -> D2 -> D3 -> D4`.
|
||
- Для `CODE` приоритет слоев: `C3 -> C1 -> C2 -> C0`.
|
||
|
||
## 7. Текущий статус реализации
|
||
- В первой итерации реализованы `DOCS D1-D4`.
|
||
- В первой итерации реализованы `CODE C0-C3`.
|
||
- `C4-C6` зафиксированы в контракте и зарезервированы под следующие этапы.
|
||
- Текущие `rag_session` и `rag_repo` работают как facade/adapter поверх нового пакета `rag`.
|