快速使用
pip install -r requirements.txt
直接加载仓库根目录
import jsonimport torchfrom transformers import AutoModelForCausalLM, AutoTokenizer repo = "li-ovo/NER_Game"tokenizer = AutoTokenizer.from_pretrained(repo)model = AutoModelForCausalLM.from_pretrained( repo, torch_dtype=torch.bfloat16, device_map="auto").eval() text = "孙悟空打野"messages = [ {"role": "system", "content": "你是游戏 UGC 评论的语义单元抽取器。只判断连续字符片段的边界与出现序号,不做任何分类。只输出严格 JSON,不输出 Markdown、解释或思考过程。"}, {"role": "user", "content": ( 'game_name: "王者荣耀"\n' 'context.parent_text(仅消歧,禁止从中输出 span): ""\n' f"text: {json.dumps(text, ensure_ascii=False)}\n" "请抽取 text 中的全部语义单元,输出 JSON:\n" '{"semantic_units": [{"mention": "...", "occurrence": 1}]}\n' "每个单元只能包含 mention 和 occurrence。occurrence 表示 mention 在当前 text 中从左到右精确、" "区分大小写、非重叠出现的第几次,从 1 开始;禁止从 context 计数。" "不要分类,不要输出任何分类字段或 start/end。没有语义单元时输出空数组。" )},]prompt = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False)inputs = tokenizer(prompt, return_tensors="pt").to(model.device)with torch.inference_mode(): generated = model.generate(**inputs, do_sample=False, max_new_tokens=2048)content = tokenizer.decode( generated[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)print(json.loads(content))
不要只发送普通聊天文本:应使用上面的抽取提示词,或使用随仓库提供的 SDK。
SDK 与旧目录兼容
hf download li-ovo/NER_Game --local-dir NER_Gamecd NER_Gamepython example.py
import syssys.path.insert(0, "sdk")from extraction_sdk import SemanticUnitExtractor extractor = SemanticUnitExtractor("model", dtype="bf16")result = extractor.extract( "原神抽卡,原神更新后卡顿", record_id="demo", game_name="原神")print(result)
仓库根目录和 model/ 中的模型文件同步更新且内容一致。旧代码使用 subfolder="model" 仍可加载同一 R27 权重。extract_batch 当前是逐条执行,不是连续批处理引擎。
契约与失败处理
Table with columns: 契约, 版本| 契约 | 版本 |
|---|
| 提示词 | reasoningner-lite-sft-v5-extraction-only |
| 模型输出 | semantic-units-occurrence-v3-extraction-only |
| SDK 输出 | semantic-units-span-v3-extraction-only |
occurrence 从 1 开始,严格区分大小写,按正文中非重叠出现计数;上下文仅用于消歧,不能从中提取词。输出必须是原文连续片段,禁止纠错、标准化和生成不存在的词。
ok=False 表示格式、原文定位、重复单元或输出截断校验失败。此时 semantic_units 仅保留合法子集;不能将失败当作可靠空标签。业务应重试、降级或人工处理。
验证范围与评测说明
- 合并后的默认非思考模型在 8 条合成样本上均直接输出合法 JSON;与相同非思考输入下的基座加 LoRA 抽取结果 8/8 一致。
- 这只是冒烟测试,不能证明合并与解码配置变化在全量数据上完全等价。
- 历史 R27 离线结果:旧口径人工
old_dev(298 条)词面 F1 76.41%;Pro 银标 seen_dev(418 条)词面 F1 66.08%;Pro 银标 unseen_test(399 条有效参考)词面 F1 63.98%。
- 上述指标来自原 R27 adapter 离线预测,不是本次合并 release 的全量重评成绩。Pro 银标不是人工金标;没有已验证覆盖全品类的人工基准。
- 本版本未改用后续 v21 新抽取口径,不应混入不同版本的规则或使用旧标签宣称新口径成绩。
- 以往 R27 离线延迟门槛未通过,本次 release 的线上时延与吞吐仍需重新验收。
A10 部署起始配置
建议单张 A10、BF16、不量化、上下文上限 4096、初始 max_num_seqs=4、显存比例 0.85。这些是初始建议,不是 A10 实测保证。A10 显存、长文本峰值与 P95 延迟尚未验证。
可使用支持 Qwen3 的 vLLM,设置 temperature=0、max_tokens=2048、enable_thinking=False,不要启用将最终输出送入推理通道的 reasoning parser。最终结果从标准 content 读取。
T4 等不支持 BF16 的硬件须显式使用 FP16;精度转换和更换推理引擎都可能改变结果,需重新做一致性与质量验证。
训练与限制
- 基座:
Qwen/Qwen3-4B;LoRA rank 16、alpha 32、dropout 0.05,现已合并。
- 训练样本计数:19,003(包含锚点重采样,不代表同等数量独立样本),1 epoch、1,188 优化步。
- R27 训练包剔除了调用失败的教师标签;成功空标签保留。训练标注含教师银标,不代表全部由人工审核。
- 训练最大序列为 1,117 tokens;更长文本、多游戏长尾和跨领域效果需额外验证。部署上下文 4096 不等于长文本准确率已经验证。
- 本仓库不发布训练语料、评测正文、凭据或内部服务配置。
- 许可证:Apache-2.0,沿用 Qwen/Qwen3-4B 基座许可证。
版本细节见 RELEASE.md、manifest.json。文件完整性可用 SHA256SUMS.txt 校验。旧版可通过 Hugging Face 提交历史访问。