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

资讯详情

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

John Schulman 谈递归自我改进:TaoToken 放在摘要脚本的 base_url 里

John Schulman 谈递归自我改进:TaoToken 放在摘要脚本的 base_url 里 1. 从 John Schulman 谈递归自我改进到摘要脚本的 base_url 配置John Schulman 等三位研究者聊了递归自我改进RSI我想把长对谈整理成 Markdown 笔记于是先在 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentrsi_intro 申请 Key并把摘要脚本的 base_url 设为 https://taotoken.net/api。这场对谈由 Dwarkesh Patel 主持嘉宾包括 Zyphra CTO Beren Millidge、Thinking Machines 首席科学家 John Schulman、Baseten 模型训练负责人 Charlie ONeill信息密度很高。作为 AI 应用开发者我没有急着写评论而是更关心怎么把转写稿变成可检索的笔记。真正消耗 Token 的是后台摘要脚本它要分段读取、逐段生成中文要点再合并成结构化摘要。本文记录的就是这条可复现路径摘要脚本 base_url 配置、Markdown 笔记模板以及 401、404、429 这类常见报错的排查。先说明本文的产出物。第一一个可以复制运行的摘要脚本核心是把 OpenAI SDK 的base_url指向https://taotoken.net/apiKey 使用YOUR_API_KEY占位符实际值从 TaoToken 控制台创建。第二一份 Markdown 笔记模板包含元数据、一句话总结、核心观点、关键分歧、术语表和待核实事项。第三Claude Code、Codex、CC Switch 三种常见工具链的配置示例方便后续用它们修改摘要脚本或检查配置。第四一份排障清单覆盖鉴权失败、路径错误、限流、模型 ID 写错、流式输出中断等问题。这里要强调一个边界本文不会把 RSI 对谈原文大段搬过来也不会复述未核实的数字。热点只是入口真正要落地的是“AI 应用开发者如何把长文本摘要任务接进稳定 API”。摘要脚本消耗 Token所以 Key 管理、Base URL、重试策略、用量记录都要一次做对。2. 摘要脚本的最小目录与依赖先给出一个最小目录结构方便你直接复制。这个结构把配置、提示词、转写稿、输出笔记分开避免 Key 写进代码后误提交。rsi-summary/ ├── .env ├── .env.example ├── requirements.txt ├── config.py ├── prompts/ │ ├── map.txt │ └── reduce.txt ├── input/ │ └── transcript.txt ├── output/ │ └── john-schulman-rsi-notes.md └── summarize.pyrequirements.txt只装必要依赖openai1.30.0 python-dotenv1.0.1 tenacity8.2.3 tiktoken0.7.0.env.example不要写真实 Key只写占位符TAOTOKEN_API_KEYYOUR_API_KEY TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELYOUR_MODEL_ID实际使用时把.env.example复制成.env然后填入真实 Key。Key 从哪里来去 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentenv_key 注册并创建或者直接打开 API Keys 页面。注意Base URL 在工具配置里不要加 UTM 参数统一写https://taotoken.net/apiUTM 只用于官网入口链接。config.py负责读取环境变量并做一次基础校验import os from dotenv import load_dotenv load_dotenv() TAOTOKEN_API_KEY os.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY) TAOTOKEN_BASE_URL os.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) TAOTOKEN_MODEL os.getenv(TAOTOKEN_MODEL, YOUR_MODEL_ID) def validate_config(): if not TAOTOKEN_API_KEY or TAOTOKEN_API_KEY YOUR_API_KEY: raise RuntimeError(请先在 .env 中填写 TAOTOKEN_API_KEY) if not TAOTOKEN_BASE_URL.startswith(https://taotoken.net/api): raise RuntimeError(Base URL 建议使用 https://taotoken.net/api) if not TAOTOKEN_MODEL or TAOTOKEN_MODEL YOUR_MODEL_ID: raise RuntimeError(请先确认模型 ID不要保留占位符)这段代码解决三个常见问题Key 忘填、Base URL 写错、模型 ID 没改。很多 401 和 404 其实不是服务端问题而是本地配置没有被正确加载。3. 核心配置base_url 只认 https://taotoken.net/api摘要脚本用 OpenAI SDK 是最省事的写法。关键点只有一个base_url写https://taotoken.net/api不要在后面乱加/v1或其它路径。SDK 会自动拼接请求路径。import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, timeout120.0, max_retries2, ) def summarize_once(text: str) - str: response client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[ { role: system, content: 你是一名技术内容编辑负责把长对谈整理成结构化中文笔记。保留发言人、关键术语和观点分歧不要编造数字。, }, { role: user, content: f请整理下面这段对谈内容输出要点、术语和待核实项\n\n{text}, }, ], temperature0.2, max_tokens1800, ) return response.choices[0].message.content如果你不想用 SDK也可以手动发 HTTP 请求。此时需要注意路径拼接Base URL 仍然是https://taotoken.net/api手动请求时补上/v1/chat/completions。import os import requests url https://taotoken.net/api/v1/chat/completions headers { Authorization: fBearer {os.environ[TAOTOKEN_API_KEY]}, Content-Type: application/json, } payload { model: os.environ[TAOTOKEN_MODEL], messages: [ {role: system, content: 你是技术笔记整理助手。}, {role: user, content: 把这段 RSI 对谈整理成 Markdown 要点。}, ], temperature: 0.2, max_tokens: 1800, } resp requests.post(url, headersheaders, jsonpayload, timeout120) resp.raise_for_status() data resp.json() print(data[choices][0][message][content])模型 ID 不要靠猜。可以先打开模型对话页面测一下确认当前可用的模型名称再填进.env。模型对话入口https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_pick 。如果模型 ID 写错通常会返回“模型不存在”或 400而不是 401。还要提醒一点Claude Code 使用的是ANTHROPIC_*环境变量Codex 使用的是config.toml两者不要混用。把ANTHROPIC_BASE_URL套到 Codex 里或者把 Codex 的 provider 配置写进 Claude Code都会导致工具读不到配置。4. 长对谈分段摘要Map-Reduce 写法RSI 这类对谈通常很长直接塞进一次请求容易超上下文也会让单次 Token 消耗不可控。更稳的做法是分段摘要再做一次合并。下面是一个可运行的 Map-Reduce 骨架。import os import json from pathlib import Path from tenacity import retry, stop_after_attempt, wait_exponential from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, timeout180.0, ) MAP_PROMPT 你正在整理一场关于递归自我改进RSI的技术对谈。 请从下面片段中提取 1. 发言人及其核心观点 2. 涉及的关键术语 3. 与其他观点可能存在的分歧 4. 需要回看原文才能确认的内容。 不要编造数字不要补充原文没有的信息。 REDUCE_PROMPT 你是一名技术编辑。请把多段摘要合并成一份 Markdown 笔记。 要求 - 保留 John Schulman、Beren Millidge、Charlie ONeill 的区分 - 合并重复观点 - 单独列出“关键分歧”和“待核实” - 输出 Markdown不要输出解释。 def chunk_text(text: str, size: int 6000, overlap: int 400): start 0 while start len(text): yield text[start:start size] start size - overlap retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min2, max20)) def call_model(system_prompt: str, user_content: str) - tuple[str, dict]: resp client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[ {role: system, content: system_prompt}, {role: user, content: user_content}, ], temperature0.2, max_tokens2000, ) usage { prompt_tokens: resp.usage.prompt_tokens, completion_tokens: resp.usage.completion_tokens, total_tokens: resp.usage.total_tokens, } return resp.choices[0].message.content, usage def summarize_transcript(path: str) - str: raw Path(path).read_text(encodingutf-8) partials [] total_usage {prompt_tokens: 0, completion_tokens: 0, total_tokens: 0} for idx, chunk in enumerate(chunk_text(raw), start1): content, usage call_model(MAP_PROMPT, f片段 {idx}\n{chunk}) partials.append(content) for k in total_usage: total_usage[k] usage[k] print(f片段 {idx} 完成累计 Token{total_usage[total_tokens]}) merged_input \n\n---\n\n.join(partials) final, usage call_model(REDUCE_PROMPT, merged_input) for k in total_usage: total_usage[k] usage[k] meta { source: Dwarkesh Patel 对谈, speakers: [Beren Millidge, John Schulman, Charlie ONeill], usage: total_usage, } return final \n\n!-- usage: json.dumps(meta, ensure_asciiFalse) --这个脚本有几个实用点。第一chunk_text带重叠避免观点在分块边界被切断。第二tenacity对 429 和临时网络错误做指数退避。第三每次调用都记录 usage最后写入笔记注释。第四合并阶段使用单独的 system prompt避免模型把“片段摘要”直接拼成流水账。如果你希望进一步控制成本可以在 Map 阶段使用更小的max_tokens只让它输出要点在 Reduce 阶段再放宽。摘要脚本消耗 Token 的大头通常在 Map 阶段所以分块大小和重叠长度要按实际转写稿长度调整。5. Claude Code 配置settings.json 与 ANTHROPIC_*摘要脚本写完只是第一步后面你可能想用 Claude Code 来改脚本、补类型、写测试。Claude Code 的配置走ANTHROPIC_*环境变量通常放在项目或用户级settings.json里。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID, ANTHROPIC_SMALL_FAST_MODEL: YOUR_SMALL_MODEL_ID } }把这段保存为settings.json或者合并到你已有的 Claude Code 配置中。注意ANTHROPIC_AUTH_TOKEN填真实 Key不要保留YOUR_API_KEY。Key 可以在 API Keys 页面创建https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentkey_create 。更完整的 Claude Code 接入说明在官方文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_code_setup 。这里再强调一次ANTHROPIC_*只适用于 Claude Code 这类工具。不要把它写进 Codex 的config.toml也不要指望 Codex 会读取ANTHROPIC_BASE_URL。两个工具的配置模型不同混用只会让排障变复杂。如果你在 Claude Code 里遇到 401先检查三件事Key 是否从 TaoToken 控制台创建、ANTHROPIC_AUTH_TOKEN是否被其它环境变量覆盖、ANTHROPIC_BASE_URL是否被改成了带/v1的地址。正确做法仍然是 Base URL 写https://taotoken.net/api。6. Codex 配置config.toml 不要套 ANTHROPIC_*Codex 使用config.toml管理模型提供方。你需要声明一个 provider并把base_url指向 TaoToken。model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在 shell 里设置环境变量export TAOTOKEN_API_KEYYOUR_API_KEYWindows PowerShell 可以这样写$env:TAOTOKEN_API_KEYYOUR_API_KEYCodex 读取的是TAOTOKEN_API_KEY不是ANTHROPIC_AUTH_TOKEN。wire_api写chat表示使用对话补全接口。保存后重启 Codex再用一个简单请求验证。如果返回 404优先检查base_url是否被误写成https://taotoken.net/api/v1/chat/completionsconfig.toml里只写https://taotoken.net/api。如果你同时用 Claude Code 和 Codex建议把 Key 放在系统环境变量或密钥管理工具里而不是在多个配置文件里重复硬编码。这样轮换 Key 时只需要改一处。7. CC Switch 三件套统一切换供应商CC Switch 这类工具的价值是把多个 AI 编码工具的供应商配置集中管理。可以把它理解成三件套供应商配置、密钥引用、默认模型。下面是一个概念性 JSON 示例字段名请按你本地版本的实际 schema 映射但核心信息是baseUrl、apiKeyEnv、defaultModel。{ providers: { taotoken: { name: TaoToken, baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, defaultModel: YOUR_MODEL_ID, wireApi: chat } }, activeProvider: taotoken, apiKeys: { TAOTOKEN_API_KEY: YOUR_API_KEY } }配置完成后摘要脚本、Claude Code、Codex 都可以指向同一个供应商。切换时只需要改activeProvider不用逐个修改.env、settings.json、config.toml。但要注意CC Switch 只负责配置切换不能替代工具本身的字段差异。Claude Code 仍然需要ANTHROPIC_*映射Codex 仍然需要model_providers结构。如果你没有使用 CC Switch也完全可以手动维护三份配置。关键是保证 Base URL 一致、Key 来源一致、模型 ID 一致。只要这三个一致排障时就能快速判断问题出在工具侧还是请求侧。8. 排障清单401、404、429、模型不存在、流式中断下面这份清单按错误码和现象整理命令都由你在本地执行不需要连接任何生产库。401 Unauthorized先检查请求头。手动请求时应该是curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer YOUR_API_KEY \ -H Content-Type: application/json \ -d {model:YOUR_MODEL_ID,messages:[{role:user,content:ping}]}如果 401优先确认 Key 是否完整、是否有多余空格、是否从正确项目创建。创建入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentkey_create 。如果 Key 曾经泄露直接删除重建不要继续用旧 Key 排查。404 Not Found404 通常不是 Key 的问题而是路径问题。OpenAI SDK 的base_url写https://taotoken.net/api不要写https://taotoken.net/api/v1。手动 HTTP 请求才拼/v1/chat/completions。另外检查模型 ID 是否存在于你的账户可用列表模型对话页面可以快速验证https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_check 。429 Too Many Requests摘要脚本最容易触发 429因为它会连续调用多次。处理方式有三层第一用tenacity做指数退避第二降低并发Map 阶段串行执行第三减少max_tokens把不重要的片段摘要压缩得更短。示例from tenacity import retry, wait_exponential, stop_after_attempt retry( waitwait_exponential(multiplier1, min2, max30), stopstop_after_attempt(5), ) def safe_call(): ...模型不存在去模型对话页面确认模型 ID不要凭记忆填写。把.env里的TAOTOKEN_MODEL改成实际可用值后重启脚本。如果 Claude Code 或 Codex 报模型不存在检查它们各自的模型字段不要只改.env。流式输出中断如果使用streamTrue给足timeout并在本地逐块落盘。示例stream client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[{role: user, content: 整理这段对谈}], streamTrue, timeout300.0, ) with open(output/stream.md, w, encodingutf-8) as f: for event in stream: delta event.choices[0].delta.content or f.write(delta) f.flush()这样即使中途网络抖动已经生成的内容也不会丢。重新运行时可以从断点继续。配置排查顺序建议按这个顺序检查Key 是否存在 → Base URL 是否为https://taotoken.net/api→ 模型 ID 是否可用 → 请求路径是否被重复拼接 → 是否触发限流 → 本地网络或代理是否影响 HTTPS。每换一个变量只改一处否则很难定位。9. 产出 Markdown 笔记模板摘要脚本跑完后最终要产出可检索的 Markdown。下面这份模板可以直接保存为output/john-schulman-rsi-notes.md也可以让 Reduce 阶段按这个结构输出。# John Schulman 谈递归自我改进摘要笔记 ## 元数据 - 对谈主持Dwarkesh Patel - 对谈嘉宾Beren Millidge、John Schulman、Charlie ONeill - 主题递归自我改进RSI离我们还有多远 - 整理时间2025-XX-XX - 使用模型YOUR_MODEL_ID - Token 用量prompt_tokens / completion_tokens / total_tokens ## 一句话总结 用一句话概括这场对谈对 RSI 时间线的判断以及主要分歧点。 ## 核心观点 1. 观点一说明发言人和逻辑。 2. 观点二说明与其它观点的关系。 3. 观点三说明对 AI 应用开发者的实际影响。 ## 关键分歧 - 分歧一谁更乐观谁更保守依据是什么。 - 分歧二递归自我改进的定义边界是否一致。 - 分歧三工程实现与理论可能性之间的差距。 ## 术语表 - RSI递归自我改进。 - 自我改进系统基于自身输出调整后续行为。 - 能力跃迁在较少外部干预下出现的能力提升。 ## 待核实 - 对谈中提到的具体时间点需要回看原文。 - 涉及具体数字、倍数、排名的内容暂不写入结论。 - 发言人的完整表述需要结合上下文确认。 ## 对 AI 应用开发者的启示 - 长对谈整理适合用 Map-Reduce 摘要不要一次性塞入。 - 摘要脚本要记录 Token 用量便于控制成本。 - 配置统一走 TaoToken 的 Base URL减少工具切换成本。这份模板的重点是“待核实”和“对开发者的启示”。RSI 是前沿话题很多表述带有推测性质。摘要脚本不应该把推测写成事实也不应该把未核实数字写进结论。技术博客可以讨论热点但落地部分必须是可复现的配置和代码。10. 下一步把摘要脚本、Claude Code、Codex 都接到同一个入口到这里摘要脚本的 base_url 配置、Claude Code 的settings.json、Codex 的config.toml、CC Switch 三件套和 Markdown 笔记模板都已经给出。你可以先跑一个最小版本准备一段转写稿配置.env运行summarize_transcript观察输出和 Token 用量。确认无误后再把脚本接到你的笔记仓库或静态站点构建流程里。如果你还没有 Key先去官网入口注册https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentfinal_cta 。想先验证模型输出可以打开模型对话https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentcta_chat 。如果准备长期跑摘要脚本建议看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcta_plan 。需要创建或轮换 Key直接进 API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcta_keys 。Claude Code 的完整接入说明在https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentcta_claude_code 。最后回到 John Schulman 这场 RSI 对谈。热点会过去但摘要脚本会一直用。把 Base URL 固定为https://taotoken.net/api把 Key 放进环境变量把每次调用的 Token 用量写进笔记元数据你就能在讨论递归自我改进之前先拥有一套稳定、可复现的长文本处理流程。
返回列表