58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
# backend/app/repositories/qdrant_repository.py
|
|
from typing import Optional, List
|
|
from qdrant_client import AsyncQdrantClient
|
|
from qdrant_client.http import models
|
|
from app.core.config import settings
|
|
|
|
class QdrantRepository:
|
|
def __init__(self):
|
|
# Initialisation du client asynchrone
|
|
self.client = AsyncQdrantClient(
|
|
url=settings.qdrant_url,
|
|
# api_key=getattr(settings, "qdrant_api_key", None) # Qdrant Cloud
|
|
)
|
|
self.collection_name = settings.qdrant_collection
|
|
|
|
async def init_collection(self, vector_size: int = 1024):
|
|
"""
|
|
Crée la collection si elle n'existe pas encore.
|
|
1024 correspond à la taille des vecteurs de Snowflake Arctic Embed 2.0 (large).
|
|
"""
|
|
exists = await self.client.collection_exists(collection_name=self.collection_name)
|
|
if not exists:
|
|
print(f"[Qdrant] Création de la collection '{self.collection_name}'...")
|
|
await self.client.create_collection(
|
|
collection_name=self.collection_name,
|
|
vectors_config=models.VectorParams(
|
|
size=vector_size,
|
|
distance=models.Distance.COSINE
|
|
)
|
|
)
|
|
print("[Qdrant] Collection créée avec succès.")
|
|
else:
|
|
print(f"[Qdrant] La collection '{self.collection_name}' existe déjà.")
|
|
|
|
async def search_similar_project(self, query_vector: List[float], limit: int = 1) -> Optional[dict]:
|
|
"""
|
|
Effectue la vraie recherche vectorielle.
|
|
Note : On passe un 'query_vector' (généré par ton embedding_service) et non du texte brut.
|
|
"""
|
|
try:
|
|
results = await self.client.search(
|
|
collection_name=self.collection_name,
|
|
query_vector=query_vector,
|
|
limit=limit
|
|
)
|
|
|
|
if results:
|
|
# On retourne le payload (les métadonnées du projet) du meilleur match
|
|
return results[0].payload
|
|
return None
|
|
|
|
except Exception as e:
|
|
print(f"[Qdrant] Erreur lors de la recherche : {e}")
|
|
return None
|
|
|
|
async def close(self):
|
|
"""Ferme proprement la connexion au client"""
|
|
await self.client.close() |