"""用真实句向量观察编号过滤与条件丢失；不调用生成模型。"""
import json
import re
from sentence_transformers import SentenceTransformer

# 复用 R1 的真实编码器；这些政策全部是虚构实验材料。
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", device="cpu")
docs = [
    {"id": "P204", "product": "P-204", "text": "P-204 电池：签收三十天内，经核实属于质量问题的退货，运费由商家承担。"},
    {"id": "P205", "product": "P-205", "text": "P-205 电池：签收十五天内，经核实属于质量问题的退货，运费由商家承担。"},
    {"id": "invoice", "product": None, "text": "订单完成后，可申请电子发票。"},
]
texts = [doc["text"] for doc in docs]
vectors = model.encode(texts, normalize_embeddings=True, convert_to_numpy=True)
results = []
for question in ["P-204 电池签收十天，质量问题退货运费谁出？", "P-205 电池签收二十天，质量问题退货运费谁出？"]:
    # 相同模型编码问题后进行精确全量向量排序，作为可检查的基线。
    query = model.encode([question], normalize_embeddings=True, convert_to_numpy=True)[0]
    scores = vectors @ query
    ranking = sorted(range(len(docs)), key=lambda i: -float(scores[i]))
    # 编号是业务标识：只在有明确编号时限定产品范围，不猜测没有出现的编号。
    match = re.search(r"P-\d+", question)
    filtered = [i for i in ranking if match and docs[i]["product"] == match.group()]
    results.append({
        "question": question,
        "vector_top": docs[ranking[0]]["id"],
        "exact_scope_top": docs[filtered[0]]["id"] if filtered else None,
        # 返回原文供读者检查期限；高分不能证明二十天满足十五天条件。
        "evidence": [docs[i]["text"] for i in filtered],
    })

# 条件丢失实验：比较残缺结论与完整条款，而不是预设哪段分数必须更高。
question = "签收四十天后有质量问题，退货运费谁承担？"
chunks = ["退货运费由商家承担。", "签收三十天内，经核实属于商品质量问题的退货，运费由商家承担。"]
chunk_vectors = model.encode(chunks, normalize_embeddings=True, convert_to_numpy=True)
query = model.encode([question], normalize_embeddings=True, convert_to_numpy=True)[0]
chunk_scores = chunk_vectors @ query
results.append({
    "question": question,
    "chunks": [{"text": text, "score": round(float(score), 4)} for text, score in zip(chunks, chunk_scores)],
    "observation": "无论排名如何，残缺片段都缺少三十天和核实条件，不能用于资格判断。",
})
print(json.dumps(results, ensure_ascii=False, indent=2))
