尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

推理脚本跑 575M GLiFormer,结果汇总 LLM Key 来自 TaoToken

推理脚本跑 575M GLiFormer,结果汇总 LLM Key 来自 TaoToken 1. 从一次 GLiFormer 推理脚本说起575M 编码器与汇总 LLM 的分工跑 575M GLiFormer 的推理脚本时真正卡住我的不是权重加载而是结果汇总阶段的 LLM Key 该填哪里。这次我把 Key 统一换到 TaoToken官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_introBase URL 固定为https://taotoken.net/api推理端和汇总端彻底解耦。GLiFormer 是 Knowledgator 走的 schema 条件化编码器路线同一个模型在推理阶段接收标签集合与 schema 描述然后输出 NER、分类、关系抽取、嵌套 JSON 结构以及文本嵌入所需的结构化结果。它不按自回归方式生成 token而是通过编码器对输入文本和 schema 做条件化建模再在解码阶段把 span、label、关系映射成 JSON。对模型推理工程师来说这意味着推理脚本的重点不是generate()而是schema - logits - decode - validate这条链路。但真实生产里GLiFormer 只负责“结构化抽取”。抽出来的preds.jsonl还需要汇总把多段文本的实体、关系、嵌套字段合并成一份可读报告修复 schema 偏移统计字段缺失率最后输出summary.md。这一步通常交给 LLM。消耗 Token 的也正是这个结果汇总 LLM而不是 575M GLiFormer 本身。所以我的做法是GLiFormer 在本地或推理服务里跑汇总 LLM 的 Key 从 TaoToken 取Base URL 填https://taotoken.net/api推理命令与汇总输出一一对照保证换机器也能复现。下面从环境准备、推理命令、Claude Code / Codex / CC Switch 三件套配置、汇总脚本、报错排查几个部分展开。如果你只关心一个点到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_key 拿 KeyBase URL 不要写成别的路径汇总脚本就能跑通。2. 推理环境与 TaoToken 接入点Base URL 只填一次先明确边界GLiFormer 575M 推理脚本本身不调用 LLM API它只加载权重、读 schema、批量前向、解码 JSON。真正需要 Key 的是后面的汇总 LLM。因此我们只需要为汇总端准备一套兼容 OpenAI 风格的配置。TaoToken 的控制台里可以创建 Key官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_env 注册、创建 Key、查看模型列表都在这个域名下完成。Key 占位符统一写成YOUR_API_KEY不要提交到 Git。推荐的环境变量如下export TAOTOKEN_API_KEYYOUR_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEY$TAOTOKEN_API_KEY如果你用 OpenAI SDK 写汇总脚本base_url直接写https://taotoken.net/api。注意这里不需要再加 UTM 参数UTM 只用于官网入口API Base URL 保持干净。Python 侧可以这样初始化import os from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY], )为什么强调“Base URL 只填一次”因为很多排错最后都落在两个问题一是把 Claude Code 的ANTHROPIC_*环境变量套到 Codex 上二是把 Base URL 写成了官网首页而不是 API 路径。官网入口是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_envAPI Base URL 是https://taotoken.net/api两者用途不同。前者用来注册、看模型、创建 Key后者填进工具配置。推理机环境建议python -m venv .venv source .venv/bin/activate pip install torch transformers datasets jsonschema openaiGPU 机器上确认 CUDA 可用python -c import torch; print(torch.__version__, torch.cuda.is_available())如果这一步输出True就可以进入 GLiFormer 推理脚本部分。3. 可复现575M GLiFormer 推理命令与输出文件先约定目录后面命令都基于这个结构gliformer-demo/ data/ raw.jsonl schema/ schema.json scripts/ gliformer_infer.py summarize_preds.py outputs/ preds.jsonl summary.mdraw.jsonl每行一条待抽取文本{id: doc-001, text: 张三于 2023 年加入北京智源科技有限公司担任算法工程师负责 GLiFormer 推理优化。} {id: doc-002, text: 李四与王五合作发表了一篇关于嵌套 JSON 抽取的论文项目代号 Orion。}schema.json描述标签和嵌套结构{ type: object, properties: { persons: { type: array, items: {type: string} }, organizations: { type: array, items: {type: string} }, relations: { type: array, items: { type: object, properties: { head: {type: string}, relation: {type: string}, tail: {type: string} }, required: [head, relation, tail] } } }, required: [persons, organizations, relations] }推理脚本的核心不是model.generate()而是编码器前向加 schema 条件化解码。下面是一个可运行的骨架实际模型路径、tokenizer、label 映射按你的权重目录替换。重点看命令行参数和输出格式# scripts/gliformer_infer.py import argparse import json from pathlib import Path import torch from transformers import AutoTokenizer, AutoModel def load_schema(path: str) - dict: with open(path, r, encodingutf-8) as f: return json.load(f) def decode_to_json(logits, schema: dict, id_to_label: dict) - dict: # 这里根据你的 GLiFormer 输出结构做 span/label 解码 # 577M 编码器不生成 token输出的是 logits / hidden states result { persons: [], organizations: [], relations: [], } # 示例从 logits 中解析 label 与 span # 实际解码请按模型头的输出维度适配 return result def main(): parser argparse.ArgumentParser() parser.add_argument(--model-dir, requiredTrue) parser.add_argument(--schema, requiredTrue) parser.add_argument(--input, requiredTrue) parser.add_argument(--output, requiredTrue) parser.add_argument(--device, defaultcuda:0) parser.add_argument(--batch-size, typeint, default8) args parser.parse_args() schema load_schema(args.schema) tokenizer AutoTokenizer.from_pretrained(args.model_dir) model AutoModel.from_pretrained(args.model_dir) model.to(args.device) model.eval() id_to_label {0: O, 1: B-PER, 2: I-PER, 3: B-ORG, 4: I-ORG} lines Path(args.input).read_text(encodingutf-8).splitlines() records [json.loads(line) for line in lines if line.strip()] with open(args.output, w, encodingutf-8) as fout: with torch.no_grad(): for i in range(0, len(records), args.batch_size): batch records[i:i args.batch_size] texts [item[text] for item in batch] encoded tokenizer( texts, paddingTrue, truncationTrue, max_length512, return_tensorspt, ).to(args.device) outputs model(**encoded) # 如果你的模型返回 logits取 outputs.logits logits outputs.last_hidden_state if hasattr(outputs, last_hidden_state) else outputs[0] for j, item in enumerate(batch): pred decode_to_json(logits[j], schema, id_to_label) fout.write(json.dumps({ id: item[id], text: item[text], pred: pred, }, ensure_asciiFalse) \n) if __name__ __main__: main()运行命令python scripts/gliformer_infer.py \ --model-dir /models/gliformer-575m \ --schema schema/schema.json \ --input data/raw.jsonl \ --output outputs/preds.jsonl \ --device cuda:0 \ --batch-size 8跑完后outputs/preds.jsonl大致长这样{id: doc-001, text: 张三于 2023 年加入北京智源科技有限公司担任算法工程师负责 GLiFormer 推理优化。, pred: {persons: [张三], organizations: [北京智源科技有限公司], relations: [{head: 张三, relation: 就职于, tail: 北京智源科技有限公司}]}} {id: doc-002, text: 李四与王五合作发表了一篇关于嵌套 JSON 抽取的论文项目代号 Orion。, pred: {persons: [李四, 王五], organizations: [], relations: [{head: 李四, relation: 合作, tail: 王五}]}}这个阶段不消耗 LLM Token。你可以先用wc -l outputs/preds.jsonl确认条数再用jq抽查嵌套 JSON 是否合法wc -l outputs/preds.jsonl jq -c select(.pred.relations | length 0) outputs/preds.jsonl | head如果preds.jsonl里的 JSON 结构稳定下一步才进入汇总 LLM。4. 结果汇总 LLM 的最小配置Claude Code / Codex / CC Switch 三件套汇总 LLM 的作用是把preds.jsonl变成人类可读的summary.md比如统计每个文档抽出了多少实体、关系类型分布、哪些 schema 字段为空、是否存在嵌套层级不一致。这个阶段会消耗 Token所以 Key 从 TaoToken 取。下面分别给 Claude Code、Codex、CC Switch 三件套配置。注意Claude Code 用ANTHROPIC_*Codex 用config.toml不要把ANTHROPIC_*套到 Codex 上。4.1 Claude Codesettings.json 与 ANTHROPIC_*Claude Code 推荐用项目级或用户级settings.json。在项目根目录建.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-5 } }也可以用 shell 环境变量临时覆盖export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY export ANTHROPIC_MODELclaude-sonnet-4-5验证是否读到了配置claude --version claude 请用一句话总结 outputs/preds.jsonl 的字段结构如果 Claude Code 报 401先检查ANTHROPIC_API_KEY是否是YOUR_API_KEY占位符没替换再检查ANTHROPIC_BASE_URL是不是误写成了官网首页。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_claude 注册和创建 Key 在那里做API 请求只认https://taotoken.net/api。4.2 Codexconfig.tomlCodex 不要用ANTHROPIC_*。它读取~/.codex/config.toml配置 provider、base_url、env_key。示例model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后设置环境变量export TAOTOKEN_API_KEYYOUR_API_KEY运行codex 读取 outputs/preds.jsonl按 relation 类型统计数量输出 markdown 表格如果 Codex 提示找不到 provider检查model_provider的值是否和[model_providers.taotoken]一致。如果提示鉴权失败检查env_key指向的环境变量是否真的存在。不要把ANTHROPIC_API_KEY写进config.tomlCodex 不认。4.3 CC Switch 三件套统一管理供应商切换CC Switch 适合在多个 CLI 客户端之间切换供应商。三件套可以理解为三份 profileClaude Code profileBase URL 填https://taotoken.net/apiKey 填YOUR_API_KEY环境变量映射到ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。Codex profileBase URL 填https://taotoken.net/apiKey 填YOUR_API_KEY写入~/.codex/config.toml的model_providers.taotoken。OpenAI 兼容 CLI profile如果你还用其他兼容 OpenAI SDK 的客户端统一用OPENAI_BASE_URLhttps://taotoken.net/api和OPENAI_API_KEY$TAOTOKEN_API_KEY不要复用ANTHROPIC_*。在 CC Switch 里新增供应商时名称可以写TaoTokenBase URL 统一填https://taotoken.net/api。切换后建议分别跑一次最小请求# Claude Code claude ping # Codex codex ping如果 Claude Code 能通、Codex 不通优先看 Codex 的config.toml是否被 CC Switch 覆盖而不是去改ANTHROPIC_*。这一点在排障时非常省时间。5. 汇总脚本从 preds.jsonl 到 summary.md 的 LLM 调用现在写汇总脚本。它读取preds.jsonl构造一个受控 prompt调用 TaoToken 的兼容接口输出 markdown。这里只把必要字段传进去不要整篇原文无脑塞否则 Token 消耗会失控。# scripts/summarize_preds.py import argparse import json import os from pathlib import Path from openai import OpenAI PROMPT_TEMPLATE 你是一个结构化数据汇总助手。 下面是从 575M GLiFormer 推理结果中抽取的 preds.jsonl 片段。 请完成 1. 统计每个文档的 persons、organizations、relations 数量 2. 汇总 relation 类型分布 3. 标出 pred 为空的文档 id 4. 输出 markdown 表格和一个简短结论。 数据 {data} def main(): parser argparse.ArgumentParser() parser.add_argument(--input, requiredTrue) parser.add_argument(--output, requiredTrue) parser.add_argument(--model, defaultgpt-4.1-mini) parser.add_argument(--max-records, typeint, default50) args parser.parse_args() records [] with open(args.input, r, encodingutf-8) as f: for line in f: if line.strip(): records.append(json.loads(line)) records records[:args.max_records] client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY], ) prompt PROMPT_TEMPLATE.format( datajson.dumps(records, ensure_asciiFalse, indent2) ) resp client.chat.completions.create( modelargs.model, messages[ {role: system, content: 你只输出 markdown不要输出多余解释。}, {role: user, content: prompt}, ], temperature0.2, ) summary resp.choices[0].message.content Path(args.output).write_text(summary, encodingutf-8) print(fsummary written to {args.output}) if __name__ __main__: main()运行export TAOTOKEN_API_KEYYOUR_API_KEY python scripts/summarize_preds.py \ --input outputs/preds.jsonl \ --output outputs/summary.md \ --model gpt-4.1-mini \ --max-records 50如果你在 Claude Code 里直接用自然语言让它读文件也可以但生产脚本更推荐显式传参便于控制模型、温度、最大记录数。模型名以 TaoToken 模型对话页展示为准入口在 https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_chat 。先在那里确认可用模型再写进脚本的--model。6. 推理命令与汇总输出对照一次可复现的端到端跑通把命令和输出列成对照表方便你逐条复现。注意 Token 消耗只发生在第 3 步和第 4 步。步骤命令输出是否消耗 LLM Token1. 准备数据cat data/raw.jsonl待抽取文本否2. 加载 schemajq . schema/schema.json标签与嵌套结构否3. GLiFormer 推理python scripts/gliformer_infer.py --model-dir /models/gliformer-575m --schema schema/schema.json --input data/raw.jsonl --output outputs/preds.jsonl --device cuda:0 --batch-size 8outputs/preds.jsonl否4. LLM 汇总python scripts/summarize_preds.py --input outputs/preds.jsonl --output outputs/summary.md --model gpt-4.1-minioutputs/summary.md是5. 校验 JSONjq -c . outputs/preds.jsonlhead合法 JSON 行summary.md可能长这样# GLiFormer 推理结果汇总 | doc_id | persons | organizations | relations | | --- | --- | --- | --- | | doc-001 | 1 | 1 | 1 | | doc-002 | 2 | 0 | 1 | ## relation 类型分布 - 就职于1 - 合作1 ## 空 pred 文档 - 无 ## 结论 本次 2 条样本中GLiFormer 均输出了合法嵌套 JSON关系类型集中在“就职于”和“合作”。建议对 organizations 为空的 doc-002 做二次 schema 校验。如果你把--max-records调大汇总 LLM 的输入会变长Token 消耗上升。控制策略是只传id和pred不要传text全文。上面脚本默认把text也带进去了实际生产中可以改成compact_records [{id: r[id], pred: r[pred]} for r in records]这样汇总阶段消耗的 Token 会明显下降而 GLiFormer 的推理质量不受影响。7. 常见报错与排查401 Unauthorized第一检查YOUR_API_KEY是否替换第二检查 Base URL 是否为https://taotoken.net/api第三检查 SDK 是否错误地拼接了/v1。如果 OpenAI SDK 自动加路径保持base_url为https://taotoken.net/api不要手动再加。404 model not found模型名写错或者当前 Key 没有该模型权限。到模型对话页确认可用模型https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_model 。把--model改成页面上实际展示的名称。429 Too Many Requests汇总脚本并发太高。GLiFormer 推理可以批量但 LLM 汇总建议串行或小并发。把--max-records降低或在脚本里加time.sleep(1)。Claude Code 配置不生效检查.claude/settings.json是否在项目根目录检查 shell 里是否已有旧的ANTHROPIC_BASE_URL覆盖用env | grep ANTHROPIC查看实际值。Codex 配置不生效检查~/.codex/config.toml中model_provider与[model_providers.taotoken]是否拼写一致检查TAOTOKEN_API_KEY是否导出不要把ANTHROPIC_*写进 Codex。GLiFormer 输出不是合法 JSON先在推理脚本里用jsonschema校验再进入汇总。LLM 汇总不能替代结构校验否则会把错误结构写成看起来合理的报告。import json import jsonschema schema json.load(open(schema/schema.json, encodingutf-8)) for line in open(outputs/preds.jsonl, encodingutf-8): item json.loads(line) jsonschema.validate(item[pred], schema)Token 消耗异常在汇总脚本里打印resp.usage确认输入输出 Token。如果你用的是兼容接口usage字段通常可用print(resp.usage)8. 高转化 CTA把汇总 LLM 的 Key 固定下来到这一步575M GLiFormer 推理脚本已经能稳定产出preds.jsonl结果汇总 LLM 也能通过 TaoToken 的 Base URL 调用。接下来最省事的做法是把 Key、模型、Coding Plan 一次配好后面换机器只需要复制配置。推荐路径先在模型对话页确认可用模型https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_chat如果你要长期跑汇总脚本和 CLI 工具看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_plan创建或管理 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_keysClaude Code 用户直接对照文档配置ANTHROPIC_*https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_claudecode官网总入口再放一次注册、看模型、创建 Key 都从这里进https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgliformer_final最后再强调三个配置点GLiFormer 推理脚本本身不需要 LLM Key结果汇总 LLM 的 Base URL 填https://taotoken.net/apiKey 用YOUR_API_KEY占位不要提交到仓库。Claude Code 用ANTHROPIC_*Codex 用config.tomlCC Switch 三件套分别绑定不要把ANTHROPIC_*套到 Codex。这样从gliformer_infer.py到summarize_preds.py的链路就能一次跑通推理命令与汇总输出也能稳定对照。
返回列表