# Промпт: Реализация Этапа 4 — RAG сервис (похожие посты) Скопируй этот промпт нейросети для реализации фичи «похожие посты» в RAG сервисе. > Подключение к Telegram боту описано в `.cursor/implementation-plan-features.md` (Этап 4, раздел 4.2). --- ## Задача Добавить в RAG сервис третью коллекцию для submitted-постов. Endpoints: - `POST /similar` — поиск похожих постов за N часов (threshold, text) - `POST /submitted` — добавление поста в коллекцию (для индексации ботом) --- ## Контекст **Путь:** `/Users/andrejkatyhin/Work/PycharmProjects/rag-service` RAG уже имеет: - `VectorStore` с `_positive_vectors` / `_negative_vectors` — для модерации (score) - `RAGService` с `get_embedding`, `calculate_score`, `add_positive_example`, `add_negative_example` - API: `POST /score`, `POST /examples/positive`, `POST /examples/negative`, `GET /stats` Нужно добавить **третью коллекцию** для submitted-постов (с `created_at`, `text`, `rag_score`). --- ## 1. VectorStore (`app/storage/vector_store.py`) Добавь коллекцию submitted: ```python self._submitted_vectors: list = [] self._submitted_hashes: list = [] self._submitted_created_at: list = [] # Unix timestamps self._submitted_post_ids: list = [] self._submitted_texts: list = [] self._submitted_rag_scores: list = [] ``` **Методы:** - `add_submitted(vector, text_hash, created_at, post_id=None, text="", rag_score=None)` — добавить пост. FIFO при превышении `max_submitted` (новый параметр в конструкторе, default 5000). - `find_similar_submitted(vector, threshold, hours)` — вернуть `List[dict]` с полями `similarity`, `created_at`, `post_id`, `text`, `rag_score`. Фильтр: `created_at >= now - hours*3600`. Сравнение через `np.dot` (как для positive/negative). Только те, где similarity >= threshold. **Персистентность:** Сохранять/загружать submitted в отдельный файл (например, `submitted_embeddings.npz`). Поля: `vectors`, `hashes`, `created_at`, `post_ids`, `texts`, `rag_scores`. Используй `np.array(..., dtype=object)` для строк и `allow_pickle=True` при необходимости. --- ## 2. Config (`app/config.py`) Добавь: - `RAG_MAX_SUBMITTED` (default 5000) - `RAG_SUBMITTED_PATH` (default `data/vectors/submitted.npz`) --- ## 3. RAGService (`app/services/rag_service.py`) - `add_submitted_post(text, post_id=None, rag_score=None)` — очистить текст, получить embedding, вызвать `vector_store.add_submitted` с `created_at=int(time.time())`, `text`, `rag_score`. - `find_similar_posts(text, threshold=0.9, hours=24)` — получить embedding, вызвать `vector_store.find_similar_submitted`, вернуть результат. --- ## 4. Схемы (`app/schemas.py`) ```python class SimilarRequest(BaseModel): text: str = Field(..., min_length=1) threshold: float = Field(default=0.9, ge=0.0, le=1.0) hours: int = Field(default=24, ge=1, le=168) class SimilarPostItem(BaseModel): similarity: float created_at: int post_id: Optional[int] = None text: str rag_score: Optional[float] = None class SimilarResponse(BaseModel): similar_count: int similar_posts: List[SimilarPostItem] class SubmittedRequest(BaseModel): text: str = Field(..., min_length=1) post_id: Optional[int] = None rag_score: Optional[float] = None class SubmittedResponse(BaseModel): success: bool message: str submitted_count: int ``` --- ## 5. API (`app/api/routes.py`) - `POST /api/v1/similar` — принять `SimilarRequest`, вызвать `service.find_similar_posts`, вернуть `SimilarResponse`. - `POST /api/v1/submitted` — принять `SubmittedRequest`, вызвать `service.add_submitted_post`, вернуть `SubmittedResponse`. --- ## 6. Автосохранение В `autosave_loop` или при `save_vectors` — сохранять submitted-коллекцию. При загрузке — загружать submitted из файла в `_load_from_disk` или отдельном методе. --- ## Требования - Не ломать существующий функционал: score, examples, stats работают как раньше. - Следовать стилю кода проекта (Black, isort, type hints). - Добавить тесты для новых методов и endpoints. --- ## Файлы для изменения - `app/storage/vector_store.py` - `app/services/rag_service.py` - `app/api/routes.py` - `app/schemas.py` - `app/config.py` - `app/main.py` (при необходимости — lifespan для autosave submitted)