|
| 1 | +""" |
| 2 | +File: backend/workers/tasks/vectorize_post.py |
| 3 | +Task: 6.4.1 - RAG Feedback Loop (Continuous Learning via OpenAI) |
| 4 | +""" |
| 5 | + |
1 | 6 | 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 |
2 | 16 |
|
| 17 | +from backend.config.settings import settings |
3 | 18 | from backend.workers.broker import broker |
4 | 19 |
|
5 | 20 | logger = structlog.get_logger() |
6 | 21 |
|
| 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 | + |
7 | 30 |
|
8 | 31 | @broker.task(task_name="vectorize_published_post") |
9 | 32 | async def vectorize_published_post_task(content: str, platform: str) -> None: |
10 | 33 | """ |
11 | | - Фонова задача для векторизації опублікованого посту. |
12 | | - Додає текст до колекції `doctor_style`, щоб покращувати тон майбутніх генерацій. |
| 34 | + Векторизує опублікований пост через OpenAI та зберігає його у Qdrant. |
13 | 35 | """ |
14 | 36 | logger.info("vectorization_started", platform=platform) |
15 | 37 |
|
16 | 38 | 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 | + ) |
21 | 60 |
|
22 | 61 | logger.info("vectorization_success", platform=platform) |
23 | 62 | except Exception as e: |
|
0 commit comments