news 2026/9/18 2:11:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
推理脚本跑 575M GLiFormer,结果汇总 LLM Key 来自 TaoToken

1. 从一次 GLiFormer 推理脚本说起:575M 编码器与汇总 LLM 的分工

跑 575M GLiFormer 的推理脚本时,真正卡住我的不是权重加载,而是结果汇总阶段的 LLM Key 该填哪里。这次我把 Key 统一换到 TaoToken(官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_intro),Base 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_source=taotoken_aicg_blog_end&utm_content=gliformer_key 拿 Key,Base URL 不要写成别的路径,汇总脚本就能跑通。

2. 推理环境与 TaoToken 接入点:Base URL 只填一次

先明确边界:GLiFormer 575M 推理脚本本身不调用 LLM API,它只加载权重、读 schema、批量前向、解码 JSON。真正需要 Key 的是后面的汇总 LLM。因此我们只需要为汇总端准备一套兼容 OpenAI 风格的配置。TaoToken 的控制台里可以创建 Key,官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_env ,注册、创建 Key、查看模型列表都在这个域名下完成。Key 占位符统一写成YOUR_API_KEY,不要提交到 Git。

推荐的环境变量如下:

export TAOTOKEN_API_KEY=YOUR_API_KEY export OPENAI_BASE_URL=https://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_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"], )

为什么强调“Base URL 只填一次”?因为很多排错最后都落在两个问题:一是把 Claude Code 的ANTHROPIC_*环境变量套到 Codex 上,二是把 Base URL 写成了官网首页而不是 API 路径。官网入口是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_env,API Base URL 是https://taotoken.net/api,两者用途不同。前者用来注册、看模型、创建 Key,后者填进工具配置。

推理机环境建议:

python -m venv .venv source .venv/bin/activate pip install torch transformers datasets jsonschema openai

GPU 机器上确认 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.md

raw.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", encoding="utf-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", required=True) parser.add_argument("--schema", required=True) parser.add_argument("--input", required=True) parser.add_argument("--output", required=True) parser.add_argument("--device", default="cuda:0") parser.add_argument("--batch-size", type=int, default=8) 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(encoding="utf-8").splitlines() records = [json.loads(line) for line in lines if line.strip()] with open(args.output, "w", encoding="utf-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, padding=True, truncation=True, max_length=512, return_tensors="pt", ).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_ascii=False) + "\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 Code:settings.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_URL=https://taotoken.net/api export ANTHROPIC_API_KEY=YOUR_API_KEY export ANTHROPIC_MODEL=claude-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_source=taotoken_aicg_blog_end&utm_content=gliformer_claude ,注册和创建 Key 在那里做;API 请求只认https://taotoken.net/api

4.2 Codex:config.toml

Codex 不要用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_KEY=YOUR_API_KEY

运行:

codex "读取 outputs/preds.jsonl,按 relation 类型统计数量,输出 markdown 表格"

如果 Codex 提示找不到 provider,检查model_provider的值是否和[model_providers.taotoken]一致。如果提示鉴权失败,检查env_key指向的环境变量是否真的存在。不要把ANTHROPIC_API_KEY写进config.toml,Codex 不认。

4.3 CC Switch 三件套:统一管理供应商切换

CC Switch 适合在多个 CLI 客户端之间切换供应商。三件套可以理解为三份 profile:

  1. Claude Code profile:Base URL 填https://taotoken.net/api,Key 填YOUR_API_KEY,环境变量映射到ANTHROPIC_BASE_URLANTHROPIC_API_KEY
  2. Codex profile:Base URL 填https://taotoken.net/api,Key 填YOUR_API_KEY,写入~/.codex/config.tomlmodel_providers.taotoken
  3. OpenAI 兼容 CLI profile:如果你还用其他兼容 OpenAI SDK 的客户端,统一用OPENAI_BASE_URL=https://taotoken.net/apiOPENAI_API_KEY=$TAOTOKEN_API_KEY,不要复用ANTHROPIC_*

在 CC Switch 里新增供应商时,名称可以写TaoToken,Base 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", required=True) parser.add_argument("--output", required=True) parser.add_argument("--model", default="gpt-4.1-mini") parser.add_argument("--max-records", type=int, default=50) args = parser.parse_args() records = [] with open(args.input, "r", encoding="utf-8") as f: for line in f: if line.strip(): records.append(json.loads(line)) records = records[:args.max_records] client = OpenAI( base_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"], ) prompt = PROMPT_TEMPLATE.format( data=json.dumps(records, ensure_ascii=False, indent=2) ) resp = client.chat.completions.create( model=args.model, messages=[ {"role": "system", "content": "你只输出 markdown,不要输出多余解释。"}, {"role": "user", "content": prompt}, ], temperature=0.2, ) summary = resp.choices[0].message.content Path(args.output).write_text(summary, encoding="utf-8") print(f"summary written to {args.output}") if __name__ == "__main__": main()

运行:

export TAOTOKEN_API_KEY=YOUR_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_source=taotoken_aicg_blog_end&utm_content=gliformer_chat 。先在那里确认可用模型,再写进脚本的--model

6. 推理命令与汇总输出对照:一次可复现的端到端跑通

把命令和输出列成对照表,方便你逐条复现。注意 Token 消耗只发生在第 3 步和第 4 步。

步骤命令输出是否消耗 LLM Token
1. 准备数据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. 校验 JSON`jq -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 消耗上升。控制策略是:只传idpred,不要传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_urlhttps://taotoken.net/api,不要手动再加。

404 model not found:模型名写错,或者当前 Key 没有该模型权限。到模型对话页确认可用模型:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_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.tomlmodel_provider[model_providers.taotoken]是否拼写一致;检查TAOTOKEN_API_KEY是否导出;不要把ANTHROPIC_*写进 Codex。

GLiFormer 输出不是合法 JSON:先在推理脚本里用jsonschema校验,再进入汇总。LLM 汇总不能替代结构校验,否则会把错误结构写成看起来合理的报告。

import json import jsonschema schema = json.load(open("schema/schema.json", encoding="utf-8")) for line in open("outputs/preds.jsonl", encoding="utf-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 一次配好,后面换机器只需要复制配置。

推荐路径:

  1. 先在模型对话页确认可用模型:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_chat
  2. 如果你要长期跑汇总脚本和 CLI 工具,看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_plan
  3. 创建或管理 API Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_keys
  4. Claude Code 用户直接对照文档配置ANTHROPIC_*:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_claudecode

官网总入口再放一次,注册、看模型、创建 Key 都从这里进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=gliformer_final

最后再强调三个配置点:GLiFormer 推理脚本本身不需要 LLM Key;结果汇总 LLM 的 Base URL 填https://taotoken.net/api;Key 用YOUR_API_KEY占位,不要提交到仓库。Claude Code 用ANTHROPIC_*,Codex 用config.toml,CC Switch 三件套分别绑定,不要把ANTHROPIC_*套到 Codex。这样从gliformer_infer.pysummarize_preds.py的链路就能一次跑通,推理命令与汇总输出也能稳定对照。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 2:07:36

开小吃店需要几个人?长沙小吃店人力配置的三种情形

【本篇要点】 单人档口要选备餐前置率高、出品快的品类。 夫妻档口按"备餐线加出餐线"分工,两条线并行能提高营业额上限。 人力成本通常占营收两到三成,超过警戒线要从菜单结构找原因。开店前算清人力,比算清设备清单更重要——人手…

作者头像 李华
网站建设 2026/9/18 2:01:11

【ComfyUI】Wan2.2 SmoothMix 文生视频自动扩写

今天给大家演示一个基于 Wan2.2 与 SmoothMix 的 ComfyUI 文生视频自动扩写工作流。这个工作流围绕单张图片展开,通过多阶段文本扩写、图像理解、动态脚本生成和视频生成模型协同,让输入画面自动延展成完整的 5 秒镜头脚本,再由 Wan 系列 T2V 模型生成稳定、连贯、细节丰富的…

作者头像 李华
网站建设 2026/9/18 1:58:49

kohya_ss Stable Diffusion LoRA 训练:5 张图跑出自己的风格模型

kohya_ss Stable Diffusion LoRA 训练:5 张图跑出自己的风格模型 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 输入提示词点生成,出来的图带着和你自己作品一样的色调、光影和笔触——这就是训练完成后…

作者头像 李华
网站建设 2026/9/18 1:58:32

SecureCRT中文乱码终极解决方案:UTF-8编码协同配置指南

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

作者头像 李华