RoCodex / src /scraper /retriever.py
Razvanix's picture
Upload 12 files
83892b0 verified
Raw
History Blame Contribute Delete
2.43 kB
"""
retriever.py
────────────
Given a Romanian question, finds the most relevant legal articles
using semantic search over the FAISS index.
Usage:
python retriever.py
"""
import sys
import json
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
MODEL_NAME = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
INDEX_FILE = "data/faiss.index"
METADATA_FILE = "data/metadata.jsonl"
TOP_K = 5
def load_metadata(path: str) -> list[dict]:
metadata = []
with open(path, encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
metadata.append(json.loads(line))
return metadata
def search(query: str, index, metadata: list[dict], model, k: int = TOP_K):
query_vector = model.encode(
[query],
convert_to_numpy=True,
normalize_embeddings=True,
).astype("float32")
scores, positions = index.search(query_vector, k)
results = []
for score, pos in zip(scores[0], positions[0]):
if pos == -1: # FAISS returns -1 for unfilled slots
continue
article = metadata[pos]
results.append({
"score": float(score),
"law_title": article["law_title"],
"article_number": article["article_number"],
"text": article["text"],
})
return results
def main():
print("Loading model and index...")
model = SentenceTransformer(MODEL_NAME)
index = faiss.read_index(INDEX_FILE)
metadata = load_metadata(METADATA_FILE)
print(f"Ready. Index has {index.ntotal} articles.\n")
while True:
try:
query = input("Intrebare (sau 'exit'): ").strip()
except (EOFError, KeyboardInterrupt):
print("\nLa revedere!")
break
if query.lower() == "exit":
break
if not query:
continue
results = search(query, index, metadata, model)
print(f"\nTop {TOP_K} rezultate pentru: '{query}'\n")
for i, r in enumerate(results, 1):
print(f"[{i}] scor={r['score']:.3f} | {r['law_title']} | {r['article_number']}")
print(f" {r['text'][:200]}")
print()
if __name__ == "__main__":
main()