|
|
|
|
|
from fastapi import APIRouter |
|
|
import numpy as np |
|
|
from consensus.topo import TopologicalConsciousness |
|
|
from api.schemas import RerankRequest |
|
|
from adapters.hf_sentence_tfm_adapter import SentenceTransformerAdapter |
|
|
|
|
|
router = APIRouter(prefix="/rerank", tags=["rag"]) |
|
|
|
|
|
@router.post("") |
|
|
def rerank(req: RerankRequest): |
|
|
model = SentenceTransformerAdapter() |
|
|
q = np.array(model.embed_text(req.query)) |
|
|
doc_embs = [np.array(model.embed_text(d)) for d in req.docs] |
|
|
tc = TopologicalConsciousness(n_anyons=len(doc_embs), central_charge=627) |
|
|
pc = tc.calculate_coherence(doc_embs) |
|
|
alpha, beta, lamb = 1.0, 0.3, 0.2 |
|
|
scores = [] |
|
|
qn = q / (np.linalg.norm(q) + 1e-12) |
|
|
for e in doc_embs: |
|
|
en = e / (np.linalg.norm(e) + 1e-12) |
|
|
sim = float(qn @ en) |
|
|
energy = tc.cardy_boundary_energy(e) |
|
|
scores.append(alpha*sim + beta*pc - lamb*energy) |
|
|
order = np.argsort(scores)[::-1].tolist() |
|
|
return {"order": order, "scores": [float(s) for s in scores], "coherence": pc} |
|
|
|