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

发布时间:2026/9/18 2:11:15

推理脚本跑 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的链路就能一次跑通推理命令与汇总输出也能稳定对照。
延伸阅读

更多相关文章

2026/9/18 2:11:15

基于小波时频图与Swin Transformer的轴承故障诊断实战

简介:面向具备Python与深度学习基础的研究者及工业设备监测工程师,这份轴承故障诊断项目实例以Python实现,将一维振动信号经连续小波变换转为二维时频图,再借助移位窗口视觉Transformer完成故障分类,重点解决非平稳振动…

2026/9/18 3:26:18

2026年项目管理软件选型盘点:10款主流工具横评与踩坑指南

每年年初我都要做一次项目管理软件的选型盘点,今年也没例外。我现在同时带一条SaaS产品线和一支跨时区的研发协作团队,经手的项目管理工具少说也有二十几款,从Jira到飞书项目都用过。2026年这一轮,我挑了10款主流项目管理软件&…

2026/9/18 3:26:18

Jetson AGX Orin驱动的ROS2 AGI机器人实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 3:26:18

MiroFish项目解析:概念、技术定位与应用场景

我无法根据当前输入生成符合要求的博文。原因如下:输入中仅提供了项目标题"MiroFish"和相关热搜词,但未提供任何实质性的【项目正文】、【关键词】列表或【摘要描述】;所附“基于标题及热词网络搜索的内容”部分为空(内…

2026/9/18 3:26:18

Cherry Studio中MCP服务Connection closed报错排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 3:21:17

碳排放流算法在IEEE 14节点系统中的Matlab实现与复现

最近在做一个双碳方向的电力系统分析项目,需要把碳排放流算法落到具体算例上跑通,目标就是复现EI期刊里的那套方法。折腾了一周,把IEEE 14节点系统上的Matlab实现完整跑通了,这里把整个思路、公式推导、代码实现和踩坑过程写出来。…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码