"""对固定候选执行真实交叉编码器重排；首次会下载权重，本轮未执行。"""
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

MODEL = "BAAI/bge-reranker-base"
question = "P-205 电池签收二十天，质量问题退货运费谁承担？"
# 这里把召回候选固定下来，只观察重排。真实系统用检索结果替换这个列表。
documents = [
    ("p204", "P-204 电池经核实质量问题，签收三十天内由商家承担退货运费。"),
    ("p205", "P-205 电池经核实质量问题，签收十五天内由商家承担退货运费。"),
    ("invoice", "订单完成后可申请电子发票。"),
]
tokenizer = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForSequenceClassification.from_pretrained(MODEL).eval()
pairs = [[question, text] for _, text in documents]
# 联合输入的问题与文档共享模型长度预算；显式拒绝过长内容，避免条件静默丢失。
for query, text in pairs:
    if len(tokenizer(query, text, truncation=False)["input_ids"]) > 512:
        raise ValueError("问题与候选超过本例长度预算，请先保留条件并重新组织")
inputs = tokenizer(pairs, padding=True, truncation=False, return_tensors="pt")
with torch.inference_mode():
    # 每对问题/文档得到一个相关性 logit，不把它直接解释为事实正确概率。
    scores = model(**inputs, return_dict=True).logits.view(-1).float().tolist()
ranked = sorted(zip(documents, scores), key=lambda item: (-item[1], item[0][0]))
for (doc_id, text), score in ranked:
    print(doc_id, score, text)
# 即使 p205 排第一，二十天仍超出十五天；最终回答必须再判断适用条件。
