5.0 KiB
Промпт: Реализация Этапа 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(defaultdata/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.pyapp/services/rag_service.pyapp/api/routes.pyapp/schemas.pyapp/config.pyapp/main.py(при необходимости — lifespan для autosave submitted)