Diseñe una tubería de recuperación y reclasificación de alta precisión con ZeroEntropy Zerank-2 Reranker
print(“\n” + “=”*70 + “\nPARTE 4: Evaluación NDCG@10\n” + “=”*70) eval_set = [
{“query”: “Where is most ATP produced in the cell?”,
“rels”: {0: 2, 2: 3, 4: 2, 6: 1, 8: 3}},
{“query”: “How do plants capture light energy?”,
“rels”: {1: 3, 9: 1}},
{“query”: “How are proteins made and packaged in a cell?”,
“rels”: {5: 3, 7: 2}},
]
def dcg(rels): rels = np.asarray(rels, dtype=float) return np.sum((2**rels – 1) / np.log2(np.arange(2, rels.size + 2))) def ndcg_at_k(ranked_doc_ids, rel_map, k=10): ganancias = [rel_map.get(d, 0) for d in ranked_doc_ids[:k]]ideal = ordenado (rel_map.values(), reverso = Verdadero)[:k]
idcg = dcg(ideal) devuelve dcg(ganancias) / idcg si idcg > 0 sino 0.0 base_scores, rr_scores = [], []
para ex en eval_set: q, rel_map = ex[“query”]ex[“rels”]
q_emb = bi.encode(q, convert_to_tensor=True, normalize_embeddings=True) visitas = util.semantic_search(q_emb, corpus_emb, top_k=len(corpus))[0]
orden_base = [h[“corpus_id”] para h en visitas]base_scores.append(ndcg_at_k(base_order, rel_map)) rr = reranker.rank(q, [corpus[i] para i en base_order]convert_to_tensor=True) rr_order = [base_order[r[“corpus_id”]]para r en rr]rr_scores.append(ndcg_at_k(rr_order, rel_map)) print(f”{‘Query’:45s} {‘bi-encoder’:>12s} {‘+ zerank-2’:>12s}”) para ex, b, r en zip(eval_set, base_scores, rr_scores): imprimir(f”{ex[‘query’][:43]:45s} {b:12.4f} {r:12.4f}”) print(“-“*72) print(f”{‘AVERAGE NDCG@10’:45s} {np.mean(base_scores):12.4f} {np.mean(rr_scores):12.4f}”) print(f”\nElevación de reclasificación: {np.mean(rr_scores)-np.mean(base_scores):+.4f} NDCG@10″)