ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

压 CAD 批量生成:1.5B 模型和 TaoToken base_url 的配合

压 CAD 批量生成:1.5B 模型和 TaoToken base_url 的配合 1. 批量 CAD 参数生成先定入口TaoToken 拿 Key 与 base_url 落位如果你正在用批量脚本跑 CAD 参数生成最常见的拦路虎不是模型不会画而是并发一上来就 429、JSON 被截断、任务输出缺字段。我的做法是先把请求入口统一到 TaoToken到 TaoToken 官网 创建 Key再把 Base URL 写成https://taotoken.net/api让 1.5B 级别的 CAD 参数生成模型也能被同一套脚本压测。最近 1.5B 模型在 CAD 参数级生成上的讨论很热但真正把它放进批量任务里问题和单条对话完全不是一回事。单条对话里模型偶尔漏一个字段你手动补一下就行批量任务里一次跑几百个零件只要 JSON 里少一个constraints后面的解析、入库、审图流程就会断。更麻烦的是很多脚本把模型地址、Key、并发参数散落在不同文件里压测时根本不知道是模型侧慢还是网关侧限流还是自己的脚本重试策略有问题。所以这篇不讨论 CAD 模型本身多强而是站在“批量任务压测”的视角把一条可复制的工程链路搭起来先用 TaoToken 拿到统一入口再配置 Claude Code、Codex、CC Switch最后写一个能批量调用 CAD 参数生成模型的 Python 脚本。重点看三件事批量脚本怎么写并发参数怎么压输出完整性怎么检查。这里再强调一次顺序先到 TaoToken 官网 创建 Key再在工具或脚本里写 Base URLhttps://taotoken.net/api。Base URL 本身不需要加 UTM 参数UTM 只用于官网和 deep link 的访问统计。Key 统一用占位符YOUR_API_KEY不要硬编码进仓库。2. 接入 TaoTokenAPI Key、Base URL 与最小连通性压测第一步不是直接上并发而是做最小连通性压测。你需要确认三件事Key 能不能过认证Base URL 有没有写错模型名能不能被识别。很多 401 和 404 不是网络问题而是把控制台地址、文档地址、API 地址混在一起了。先在 TaoToken 官网控制台创建 API Key复制后放到环境变量里export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后用一个最小 curl 请求验证。注意下面的完整端点是在 Base URL 后追加/v1/chat/completions但你在工具配置里填写的 Base URL 仍然是https://taotoken.net/apicurl -sS $TAOTOKEN_BASE_URL/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: YOUR_CAD_MODEL, messages: [ { role: user, content: 只返回一个 JSON 对象字段包含 part_name, units, dimensions, features, constraints, assumptions。 } ], temperature: 0.2, max_tokens: 512 }如果返回 401优先检查 Key 是否复制完整、是否多了空格、是否在请求头里写成了Bearer YOUR_API_KEY但环境变量没有真正导出。如果返回 404检查 Base URL 是否写成了控制台页面地址或者末尾多写了/v1、/chat、/models之类的路径。工具里只填https://taotoken.net/api如果返回 429说明连通性没问题但已经触发限流或并发保护。这时候不要继续加并发先把脚本的并发降到 1 或 2确认单请求稳定性再按后面的阶梯压测逐步放大。最小连通性通过后建议再跑一次“模型名探测”。不同工具对模型名大小写、别名、版本号的要求不同批处理脚本里最好把模型名也做成环境变量export CAD_MODELYOUR_CAD_MODEL这样后面切换 1.5B 模型或其他 CAD 参数生成模型时不需要改脚本只改环境变量即可。对于批量任务稳定入口比单次极致效果更重要因为你要的是可重复、可校验、可重跑。3. Claude Code、Codex、CC Switch 三件套配置别串线很多排障最后都会落到同一个问题配置串线。Claude Code 读的是ANTHROPIC_*相关环境变量或settings.jsonCodex 读的是config.tomlCC Switch 负责在多个供应商之间切换。你如果把ANTHROPIC_BASE_URL写进 CodexCodex 不会因为多了一个环境变量就自动识别反过来把 Codex 的model_provider配置塞给 Claude Code也不会生效。Claude Code 配置Claude Code 可以用settings.json管理环境变量。示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_CLAUDE_MODEL } }这里写的是ANTHROPIC_*适用于 Claude Code 体系。ANTHROPIC_BASE_URL填https://taotoken.net/api不要带 UTM 参数也不要带/v1/chat/completions这种完整端点。ANTHROPIC_AUTH_TOKEN用你在 TaoToken 创建的 Key 替换YOUR_API_KEY。Codex 配置Codex 走config.toml不要套用ANTHROPIC_*。示例model_provider taotoken model YOUR_CODEX_MODEL [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在终端里导出同一个 Keyexport TAOTOKEN_API_KEYYOUR_API_KEYCodex 的认证入口是env_key指向的环境变量不是ANTHROPIC_AUTH_TOKEN。如果 Codex 报认证失败先检查TAOTOKEN_API_KEY是否存在再检查config.toml里的env_key拼写是否一致。CC Switch 三件套CC Switch 可以理解成“多供应商切换面板”。我一般配三件套Claude Code 条目Base URL 填https://taotoken.net/apiAPI Key 填YOUR_API_KEY模型名填 Claude Code 要用的模型写入settings.json对应的ANTHROPIC_*。Codex 条目Base URL 填https://taotoken.net/api认证变量填TAOTOKEN_API_KEYmodel_provider指向taotoken写入config.toml。OpenAI Compatible 条目Base URL 填https://taotoken.net/apiAPI Key 填YOUR_API_KEY供批量脚本、Postman、临时压测使用。三件套的核心不是多装一个工具而是把“供应商名、Base URL、Key、模型名”统一管理。切换后要重启对应终端或工具进程因为很多 CLI 只在启动时读取环境变量和配置文件。排障时先确认当前激活的是哪一套再看日志里的请求地址能省很多时间。4. CAD 批量脚本参数表、并发、重试、JSONL 落盘批量 CAD 参数生成不建议直接循环发请求。你需要一个任务文件、一个并发池、一个重试策略、一个成功输出和一个失败隔离文件。下面这个脚本使用 OpenAI 兼容的/v1/chat/completions端点Base URL 从环境变量读取Key 用YOUR_API_KEY占位。你可以把它保存为cad_batch.py。输入任务用 JSONL每行一个任务{task_id:cad-001,part_type:bracket,requirements:L 型支架两个安装孔孔距 40mm板厚 3mm,units:mm} {task_id:cad-002,part_type:flange,requirements:圆形法兰中心通孔四个均布螺栓孔外径 120mm,units:mm}脚本代码如下import argparse import json import os import random import time from concurrent.futures import ThreadPoolExecutor, as_completed from pathlib import Path import requests BASE_URL os.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api).rstrip(/) API_KEY os.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY) MODEL os.getenv(CAD_MODEL, YOUR_CAD_MODEL) ENDPOINT f{BASE_URL}/v1/chat/completions REQUIRED_FIELDS [ part_name, units, dimensions, features, constraints, assumptions, ] def build_prompt(task): return f你是一个 CAD 参数生成助手。请根据需求输出一个 JSON 对象不要 Markdown不要解释。 字段必须包含 - part_name: 字符串 - units: 字符串优先使用任务单位 - dimensions: 对象键为尺寸名值为数字或带单位的字符串 - features: 数组每个元素描述一个特征 - constraints: 数组每个元素描述一个约束 - assumptions: 数组每个元素是必要的假设 任务 ID{task.get(task_id)} 零件类型{task.get(part_type)} 需求描述{task.get(requirements)} 单位{task.get(units, mm)} def extract_json(text): text text.strip() if text.startswith(): lines [ line for line in text.splitlines() if not line.strip().startswith() ] text \n.join(lines).strip() start text.find({) end text.rfind(}) if start 0 and end start: text text[start:end 1] return json.loads(text) def validate_payload(obj): if not isinstance(obj, dict): return False, not_object for field in REQUIRED_FIELDS: if field not in obj: return False, fmissing_{field} if not isinstance(obj[dimensions], dict) or not obj[dimensions]: return False, dimensions_empty if not isinstance(obj[features], list) or not obj[features]: return False, features_empty if not isinstance(obj[constraints], list): return False, constraints_not_list if not isinstance(obj[assumptions], list): return False, assumptions_not_list for key, value in obj[dimensions].items(): if isinstance(value, (int, float)): if value 0: return False, fdimension_non_positive_{key} elif isinstance(value, str): if not value.strip(): return False, fdimension_blank_{key} else: return False, fdimension_type_{key} return True, ok def call_model(task, retries, timeout, temperature, max_tokens): last_error for attempt in range(retries 1): try: payload { model: MODEL, messages: [ {role: system, content: 只输出合法 JSON。}, {role: user, content: build_prompt(task)}, ], temperature: temperature, max_tokens: max_tokens, } resp requests.post( ENDPOINT, headers{ Authorization: fBearer {API_KEY}, Content-Type: application/json, }, jsonpayload, timeouttimeout, ) if resp.status_code 429: raise RuntimeError(rate_limited) resp.raise_for_status() content resp.json()[choices][0][message][content] obj extract_json(content) ok, reason validate_payload(obj) if not ok: raise ValueError(reason) return { task_id: task.get(task_id), status: ok, result: obj, } except Exception as exc: last_error str(exc) if attempt retries: break sleep_s (1.5 ** attempt) random.random() time.sleep(sleep_s) return { task_id: task.get(task_id), status: error, error: last_error, } def main(): parser argparse.ArgumentParser() parser.add_argument(--tasks, requiredTrue) parser.add_argument(--out, requiredTrue) parser.add_argument(--err, requiredTrue) parser.add_argument(--workers, typeint, default8) parser.add_argument(--batch-size, typeint, default20) parser.add_argument(--retries, typeint, default3) parser.add_argument(--timeout, typeint, default120) parser.add_argument(--temperature, typefloat, default0.2) parser.add_argument(--max-tokens, typeint, default1024) args parser.parse_args() tasks [ json.loads(line) for line in Path(args.tasks).read_text(encodingutf-8).splitlines() if line.strip() ] out_f open(args.out, a, encodingutf-8) err_f open(args.err, a, encodingutf-8) for i in range(0, len(tasks), args.batch_size): batch tasks[i:i args.batch_size] with ThreadPoolExecutor(max_workersargs.workers) as pool: futures [ pool.submit( call_model, task, args.retries, args.timeout, args.temperature, args.max_tokens, ) for task in batch ] for fut in as_completed(futures): item fut.result() target out_f if item[status] ok else err_f target.write(json.dumps(item, ensure_asciiFalse) \n) target.flush() print(fbatch {i // args.batch_size 1} done) out_f.close() err_f.close() if __name__ __main__: main()这个脚本有几个工程化点任务按 batch 提交避免一次性创建过多 future每个任务内做指数退避和随机抖动成功写out.jsonl失败写err.jsonl每次写入后 flush方便压测中途查看结果。对于 CAD 参数生成temperature默认 0.2减少尺寸和约束的随机漂移。max_tokens一开始给 1024如果模型输出结构较长可以调大但不要无脑开到很大否则截断和成本都不好控制。运行方式export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export CAD_MODELYOUR_CAD_MODEL python cad_batch.py \ --tasks tasks.jsonl \ --out out.jsonl \ --err err.jsonl \ --workers 8 \ --batch-size 20 \ --retries 3 \ --timeout 120 \ --max-tokens 1024先确认out.jsonl能稳定产生结果再考虑加并发。不要一上来把--workers拉到 64因为 CAD 参数生成往往输出较长高并发下更容易遇到限流、超时和 JSON 截断。5. 并发参数怎么压从 8 并发开始的阶梯与观察指标批量任务压测不要只看“跑完了没有”要看成功率、延迟、限流、完整率。我给 CAD 参数生成任务的初始并发是 8原因不是 8 一定最优而是它足够让问题暴露又不至于一上来就把失败样本淹掉。建议按下面的阶梯做并发观察重点如果正常如果异常1认证、模型名、单条 JSON 完整性进入 4先查 401/404/模型名4P95 延迟、输出长度进入 8查超时和截断8429 比例、完整率进入 12降回 4查重试12吞吐是否线性、错误是否集中进入 16降回 8加 jitter16稳定性、失败隔离是否生效可用于小批次不要继续加压测时至少记录这些指标成功率statusok的任务数除以总任务数。P50 / P95 延迟从提交到拿到完整 JSON 的时间。429 比例如果超过 3%优先降并发或加退避不要盲目重试。JSON 完整率通过validate_payload的比例。截断率模型输出被max_tokens截断的比例。重复 task_id输出文件里是否出现重复防止脚本重跑导致覆盖或重复入库。单位冲突任务要求mm输出却出现inch或空单位。一个典型的压测命令如下python cad_batch.py \ --tasks tasks_500.jsonl \ --out out_500_w8.jsonl \ --err err_500_w8.jsonl \ --workers 8 \ --batch-size 20 \ --retries 3 \ --timeout 120 \ --max-tokens 1024跑完后统计wc -l out_500_w8.jsonl err_500_w8.jsonl如果err中大量是rate_limited把并发降到 4 或 6并把重试退避从 1.5 倍调到 2 倍。如果大量是missing_constraints、dimensions_empty那不是并发问题是 prompt 和校验规则问题应该先改 prompt再压并发。如果大量是JSONDecodeError先看是不是模型输出了 Markdown 代码围栏或者max_tokens太小导致 JSON 尾部丢失。对于 CAD 参数级结果我建议把“完整率”放在吞吐之前。批量任务看起来跑得很快但输出缺字段后面还是要人工返工。工程上更稳的做法是8 并发下完整率达到 99% 以上再尝试 12 并发12 并发下 P95 没有明显恶化再尝试 16。任何时候只要 429 比例升高或完整率下降就回退到上一档。6. 输出完整性检查让 CAD 参数结果可批次验收脚本能跑通只是第一步真正决定能不能批量化的是输出完整性检查。CAD 参数生成结果至少要做六类检查JSON 可解析、必填字段齐全、尺寸值合法、单位一致、特征非空、约束可追踪。可以单独写一个check_output.pyimport json import sys REQUIRED { part_name, units, dimensions, features, constraints, assumptions, } seen set() ok bad dup 0 missing_counter {} for line in open(sys.argv[1], encodingutf-8): item json.loads(line) task_id item.get(task_id) if task_id in seen: dup 1 seen.add(task_id) result item.get(result, {}) missing REQUIRED - set(result.keys()) for field in missing: missing_counter[field] missing_counter.get(field, 0) 1 dimensions result.get(dimensions) features result.get(features) constraints result.get(constraints) if ( missing or not isinstance(dimensions, dict) or not dimensions or not isinstance(features, list) or not features or not isinstance(constraints, list) ): bad 1 else: ok 1 print({ ok: ok, bad: bad, dup: dup, total: len(seen), missing_counter: missing_counter, })运行python check_output.py out_500_w8.jsonl如果bad大于 0先看missing_counter。如果大量缺constraints在 prompt 里把约束字段提到更靠前并给一个简短示例。如果大量缺assumptions可以把假设字段改成允许空数组但必须存在。如果dimensions为空说明模型没有按“键值对”输出应该在 prompt 里明确写“dimensions 必须是对象不要输出数组”。单位一致性也要检查。任务里写的是mm结果里却出现inch或者 dimensions 里混用mm和cm都会给后续 CAD 脚本带来隐患。可以在检查脚本里增加expected_units item.get(task, {}).get(units) actual_units result.get(units) if expected_units and actual_units and expected_units ! actual_units: bad_units 1约束可追踪则更严格一点constraints里的每个约束最好能引用dimensions或features中的名称。如果约束里出现一个不存在的特征名就标记为“约束悬空”。这类问题在单条对话里不明显但批量跑 500 个零件时会形成大量不可用结果。我建议的批次门禁是JSON 解析失败为 0必填字段缺失为 0重复 task_id 为 0单位冲突为 0完整率不低于 99%。达不到就不扩并发先修 prompt、校验和重试策略。通过门禁后再从out.jsonl中随机抽 10 到 20 条到 TaoToken 的模型对话页面里人工对比需求看参数是否合理。批量脚本负责一致性人工抽检负责语义合理性两者不能互相替代。7. 常见报错与排障401、404、429、截断、Codex 认证批量任务卡住时按下面顺序排基本能覆盖大多数问题。401 认证失败检查TAOTOKEN_API_KEY是否已经导出Key 是否复制完整请求头是否是Authorization: Bearer YOUR_API_KEY。Claude Code 看ANTHROPIC_AUTH_TOKENCodex 看TAOTOKEN_API_KEY两者不要互相套用。如果刚在 TaoToken 官网 创建 Key先跑最小 curl不要直接上批量脚本。404 路径错误绝大多数是把 Base URL 写错。工具配置里只填https://taotoken.net/api不要填控制台地址也不要手动拼/v1/chat/completions。批量脚本里虽然会拼完整端点但 Base URL 本身仍然保持干净。注意 Base URL 不加 UTMUTM 只用于官网链接。429 限流先降并发再加退避。脚本里已经有指数退避和随机抖动但如果你把--workers设得太高429 还是会集中出现。建议从 8 并发开始观察 429 比例。如果 429 超过 3%降到 4 或 6。不要用无限重试硬顶批量任务里无限重试会把失败放大。JSON 截断表现是JSONDecodeError、Unterminated string、Expecting value。优先检查max_tokens是否太小CAD 参数结果如果特征多输出会超过预期。其次检查 prompt 是否要求“只输出 JSON不要 Markdown”。如果模型仍然输出代码围栏extract_json会尝试剥离但最稳的是在 system prompt 里再次强调只输出合法 JSON。Codex 认证失败检查config.toml中env_key TAOTOKEN_API_KEY并确认终端里export TAOTOKEN_API_KEYYOUR_API_KEY。不要把ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKEN写进 Codex 配置Codex 不会按 Claude Code 的变量读取。Claude Code 连接失败检查settings.json中的ANTHROPIC_BASE_URL是否为https://taotoken.net/apiANTHROPIC_AUTH_TOKEN是否为YOUR_API_KEY对应的真实 Key。修改后重启 Claude Code 进程避免旧环境变量残留。CC Switch 切换后不生效先确认当前激活的是 Claude Code 条目、Codex 条目还是 OpenAI Compatible 条目。然后检查对应配置文件是否被写入。CLI 工具通常只在启动时读配置切换后重开终端最稳。输出字段偶发缺失不要只靠重试。重试只能解决网络抖动和临时限流不能解决 prompt 歧义。把必填字段、字段类型、单位要求写进 system prompt并在脚本里用validate_payload做硬校验。校验失败的任务进入err.jsonl批次结束后单独重跑而不是混在成功结果里。8. 把批量 CAD 生成跑稳从试跑到生产化 CTA把 1.5B 模型用于 CAD 参数级批量生成真正有价值的不是单条效果而是可重复的工程链路统一入口、批量脚本、并发阶梯、完整性门禁、失败隔离。TaoToken 在这里承担的是入口统一和 Key 管理Base URL 固定为https://taotoken.net/api工具配置和批处理脚本都围绕它展开。你可以按这个顺序落地到 模型对话 先试一条 CAD 参数 prompt确认模型能返回结构化 JSON。如果批量任务量开始上来看 Coding Plan把日常调用和压测任务分开管理。到 创建 Key 生成YOUR_API_KEY写入环境变量不要硬编码。Claude Code 的配置细节看 Claude Code 文档Codex 则按config.toml单独配置。最后再回到批量脚本先用 8 并发跑 100 条检查成功率和完整率再跑 500 条看 P95 和 429最后把失败样本单独重跑。只要输出完整性门禁能守住CAD 参数级批量生成就不是“能跑一次”的演示而是可以持续迭代的工程任务。
返回列表