| """ |
| Valida el pipeline de retrieval: embebe una pregunta y consulta pgvector. |
| Uso: python scripts/validate_query.py "tu pregunta aquí" |
| """ |
| import sys |
| import os |
| from dotenv import load_dotenv |
| import psycopg2 |
| from pgvector.psycopg2 import register_vector |
| from sentence_transformers import SentenceTransformer |
|
|
| load_dotenv() |
|
|
| EMBED_MODEL = "BAAI/bge-m3" |
| DATABASE_URL = os.getenv("DATABASE_URL") |
| TOP_K = 5 |
|
|
| def main(): |
| question = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else "How many copies of the same card can I include in my deck?" |
|
|
| print(f"\nPregunta: {question}\n") |
|
|
| print("Cargando modelo...") |
| model = SentenceTransformer(EMBED_MODEL) |
| embedding = model.encode(question, normalize_embeddings=True).tolist() |
|
|
| print("Conectando a Supabase...") |
| conn = psycopg2.connect(DATABASE_URL) |
| register_vector(conn) |
|
|
| with conn.cursor() as cur: |
| cur.execute( |
| """ |
| SELECT section, source_type, source_document, |
| LEFT(content, 300) AS preview, |
| 1 - (embedding <=> %s::vector) AS similarity |
| FROM corpus_chunks |
| ORDER BY embedding <=> %s::vector |
| LIMIT %s |
| """, |
| (embedding, embedding, TOP_K), |
| ) |
| rows = cur.fetchall() |
|
|
| conn.close() |
|
|
| print(f"\nTop {TOP_K} resultados:\n" + "=" * 60) |
| for i, (section, source_type, source_doc, preview, sim) in enumerate(rows, 1): |
| print(f"\n[{i}] {section} ({source_type}/{source_doc}) — similitud: {sim:.4f}") |
| print(f" {preview.strip()[:200]}...") |
|
|
| if __name__ == "__main__": |
| main() |
|
|