Files
telegram-helper-bot/.cursor/prompt-stage-4-similar-posts.md

5.0 KiB
Raw Blame History

Промпт: Реализация Этапа 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:

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)

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)