mirror of
https://github.com/instructkr/claude-code.git
synced 2026-05-25 15:06:44 +00:00
5.8 KiB
5.8 KiB
RAG и веб‑UI: архитектура и фазы
Цель: не раздувать claw-analog и основной claw — вынести индексацию и (позже) UI в отдельные процессы с явными HTTP/MCP контрактами.
Принципы
- RAG как сервис — отдельный бинарь (сейчас
claw-rag-service), свой жизненный цикл, свои секреты (embedding API), своё хранилище. - Агент только вызывает retrieval — в
claw-analogинструментretrieve_context→ HTTPPOST {RAG_BASE_URL}/v1/query(база без суффикса/v1); лимитыrag_timeout_secs,rag_top_k_maxв.claw-analog.toml; ответ для модели — фрагменты сpath+snippet+score. - Веб‑UI — минимальная страница
GET /вclaw-rag-service(stats + формаPOST /v1/query); чат с моделью и «переиндексировать» из браузера — при необходимости позже.
Компоненты (целевая картина)
┌─────────────────┐ POST /v1/query ┌──────────────────────┐
│ claw-analog │ ──────────────────────►│ claw-rag-service │
│ (+ tool) │◄──────────────────────│ (embed + vector DB) │
└─────────────────┘ JSON hits └──────────┬───────────┘
│
ingest (watch / CLI)
▼
workspace files / git tree
- Индексация: отдельная команда или воркер (chunking, хеш файла, инкремент). Хранилище: на старте SQLite +
sqlite-vec/ файловый эмбеддинг-кэш; при росте — Qdrant/Chroma в Docker. - Эмбеддинги: HTTP к OpenAI/Anthropic-совместимому embedding endpoint или локальная модель (отдельное решение по лицензии и размеру).
- Веб‑UI: авторизация (минимум: токен + reverse proxy), SSE или WebSocket для стрима ответа модели; UI не владеет секретами провайдера, если продукт так решит — прокси через бэкенд.
Текущая реализация
Крейт rust/crates/claw-rag-service (из каталога rust/):
HTTP
GET /— одностраничный UI (встроенныйstatic/index.html): счётчики из/v1/stats, поиск через/v1/query.GET /health—ok.GET /v1/stats—{ "chunks": N, "phase": "1-sqlite" }(если БД ещё нет:chunks: 0,phase:1-sqlite-no-db).POST /v1/query— тело{"query":"...", "top_k":8}; ответ{"hits":[{"path","snippet","score"}], "phase":"1-sqlite"|"1-sqlite-empty"|"1-sqlite-no-db"}.
Поиск: линейный обход всех векторов в SQLite (MVP; для больших репозиториев планировать Qdrant/sqlite-vec или батчевый ANN).
Индексация (фаза 1)
cd D:\path\to\claw-code-main\rust
$env:OPENAI_API_KEY = "sk-..."
cargo run -p claw-rag-service -- ingest -w D:\path\to\repo --db D:\path\to\index.sqlite
cargo run -p claw-analog -- ... # при RAG_BASE_URL или rag_base_url в TOML — инструмент retrieve_context
Переменные окружения:
OPENAI_API_KEYилиCLAW_RAG_OPENAI_API_KEY— для вызоваPOST …/embeddings.CLAW_RAG_EMBEDDING_BASE_URL— по умолчаниюhttps://api.openai.com/v1.CLAW_RAG_EMBEDDING_MODEL— по умолчаниюtext-embedding-3-small.CLAW_RAG_DB— путь к SQLite (у ingest/serve; уserveесть default.claw-rag/index.sqlite).CLAW_RAG_PORT— порт HTTP (по умолчанию8787).CLAW_RAG_MOCK_PROVIDERS=1— детерминированные вектора без сети (для тестов CI).
Запуск сервера: cargo run -p claw-rag-service или cargo run -p claw-rag-service -- serve --db path\to\index.sqlite.
Дальше по фазам
| Фаза | Содержание |
|---|---|
| 1 | |
| 2 | retrieve_contextRAG_BASE_URL / rag_base_url, rag_timeout_secs, rag_top_k_max в .claw-analog.toml. |
| 3 | GET / + те же /v1/* (дальше: чат, кнопка re-index из UI). |
Риски и ограничения
- Секреты и PII в индексе; размер индекса и стоимость эмбеддингов.
- Согласованность с symlink/jail как в
claw-analog— retrieval не должен «утекать» за пределы workspace. - Локаль на UI: i18n отдельно от
AnalogLanguageв CLI.
Связанные документы
- Локальный запуск контейнеров (если поднимете векторку):
container.md. - Обзор
claw-analog:how_to_run.md.