File size: 1,685 Bytes
6ae5c6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"""Minimal FactGuard-8B inference: returns label probabilities for one claim against evidence lines."""
import json, torch
from transformers import AutoTokenizer, AutoModelForCausalLM

REPO = "ThakiCloud/FactGuard-8B"
HEAD = ("공식 근거 사실(F1~F9)과 AI 답변의 주장 하나를 대조해, 보여 준 근거만으로 주장을 판정한다(조건부 함의).\n"
        "A=지지(근거가 주장 전체를 함의: 대상 제품·플랜·수치·조건·기간이 모두 근거에 있다) B=모순(근거가 주장과 양립할 수 없다고 명시) "
        "C=확인불가(근거가 말하지 않거나 플랜·열 귀속·조건을 확정할 수 없다. 빈 칸·흐린 칸·헤더와 안 맞는 행은 근거가 아니다) D=과거 근거로만 지지\n"
        "결정 근거: a=없음 b..j=F1..F9\n\n")
LABELS = ["SUPPORTED", "CONTRADICTED", "NOT_VERIFIABLE", "STALE"]

tok = AutoTokenizer.from_pretrained(REPO)
model = AutoModelForCausalLM.from_pretrained(REPO, dtype=torch.bfloat16, device_map="auto").eval()
label_ids = [tok.encode(" " + t, add_special_tokens=False)[0] for t in "ABCD"]

packet = ("대상 브랜드: ExampleSaaS\n근거:\n"
          "F1: [Pricing | ExampleSaaS] Pro — $20 / month, billed monthly\n"
          "F2: [Pricing | ExampleSaaS] Pro — Up to 10 projects\n"
          "주장: ExampleSaaS Pro 플랜은 월 결제 시 월 20달러이다.")
ids = tok.encode(HEAD + packet + "\n\n판정:", add_special_tokens=False)[-1024:]
with torch.no_grad():
    logits = model(torch.tensor([ids], device=model.device)).logits[0, -1, label_ids].float()
probs = torch.softmax(logits, -1).tolist()
print(dict(zip(LABELS, [round(p, 4) for p in probs])))