Skip to content

Commit c99a456

Browse files
committed
feat(worker): implement vectorization logic and resolve linting issues
1 parent 9a3c0e4 commit c99a456

1 file changed

Lines changed: 45 additions & 6 deletions

File tree

backend/workers/tasks/vectorize_post.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,62 @@
1+
"""
2+
File: backend/workers/tasks/vectorize_post.py
3+
Task: 6.4.1 - RAG Feedback Loop (Continuous Learning via OpenAI)
4+
"""
5+
16
import structlog
7+
from llama_index.core import Document, StorageContext, VectorStoreIndex
8+
from llama_index.core.settings import Settings
9+
from llama_index.embeddings.openai import ( # type: ignore[reportMissingTypeStubs]
10+
OpenAIEmbedding,
11+
)
12+
from llama_index.vector_stores.qdrant import ( # type: ignore[reportMissingTypeStubs]
13+
QdrantVectorStore,
14+
)
15+
from qdrant_client import AsyncQdrantClient
216

17+
from backend.config.settings import settings
318
from backend.workers.broker import broker
419

520
logger = structlog.get_logger()
621

22+
# Витягуємо токен безпечно (Pydantic SecretStr)
23+
_raw_key = settings.OPENAI_API_KEY
24+
openai_key: str = _raw_key.get_secret_value() if hasattr(_raw_key, "get_secret_value") else str(_raw_key)
25+
26+
# Налаштовуємо глобальну модель для векторизації
27+
embed_model = OpenAIEmbedding(model=settings.OPENAI_MODEL_EMBEDDING, api_key=openai_key)
28+
Settings.embed_model = embed_model
29+
730

831
@broker.task(task_name="vectorize_published_post")
932
async def vectorize_published_post_task(content: str, platform: str) -> None:
1033
"""
11-
Фонова задача для векторизації опублікованого посту.
12-
Додає текст до колекції `doctor_style`, щоб покращувати тон майбутніх генерацій.
34+
Векторизує опублікований пост через OpenAI та зберігає його у Qdrant.
1335
"""
1436
logger.info("vectorization_started", platform=platform)
1537

1638
try:
17-
# TODO: Інтегруй сюди свій сервіс LlamaIndex.
18-
# Тобі потрібно:
19-
# 1. Зробити Document(text=content, metadata={"platform": platform})
20-
# 2. Передати його у твій VectorStoreIndex, підключений до колекції `doctor_style`.
39+
# 1. Підключаємось до Qdrant
40+
qdrant_url = getattr(settings, "QDRANT_URL", "http://127.0.0.1:6333")
41+
client = AsyncQdrantClient(url=qdrant_url)
42+
43+
vector_store = QdrantVectorStore(aclient=client, collection_name="doctor_style")
44+
storage_context = StorageContext.from_defaults(vector_store=vector_store)
45+
46+
# 2. Створюємо документ із метаданими
47+
doc = Document(
48+
text=content,
49+
metadata={
50+
"platform": platform,
51+
"source": "n8n_feedback_loop",
52+
"type": "published_post",
53+
},
54+
)
55+
56+
# 3. Векторизуємо та зберігаємо у БД
57+
VectorStoreIndex.from_documents(
58+
[doc], storage_context=storage_context, show_progress=False
59+
)
2160

2261
logger.info("vectorization_success", platform=platform)
2362
except Exception as e:

0 commit comments

Comments
 (0)