手写 ReAct Agent 时 llm(prompt) 没通道?TaoToken 这样改 Base URL
手写 ReAct Agent 时 llm(prompt) 没通道先解决模型接入这一层在上一篇文章里我们用run_react_agent(question, tools, llm, max_steps5)把 ReAct 的 Thought → Action → Observation 循环完整走了一遍。伪代码里response llm(prompt)这一行看起来最轻巧但它其实是整个 Agent 里唯一真正“烧钱”的地方——每一轮循环都要把不断增长的 prompt 重新送进模型Token 消耗随步数线性上涨。问题也恰恰出在这里伪代码只写了llm(prompt)却没交代这个llm的模型通道从哪来。很多同学把parse_action、工具分发、Observation 拼接都写对了一运行却卡在第一轮报的错五花八门——Connection error、401 Unauthorized、model not found。这篇就专门补上这个接入配置槽用 TaoToken 提供 Key 和 Base URL让llm(prompt)真正有通道可走其余循环逻辑仍按原文写。TaoToken 官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 Key把代码里的 Base URL 指向https://taotoken.net/api即可。它只负责模型通道这一层不碰你的 Agent 逻辑。一、原问题与场景循环写对了llm 却是空的先把场景还原清楚。原文的 ReAct 伪代码结构是这样的def run_react_agent(question, tools, llm, max_steps5): prompt build_prompt(tools, question) for i in range(max_steps): response llm(prompt) # ← 通道缺失点 action, action_input parse_action(response) if action Finish: return action_input if action Search: observation search_tool(action_input) elif action Calculate: observation calc_tool(action_input) else: observation 未知工具 prompt f\nObservation: {observation}\n return 达到最大步数任务失败run_react_agent的签名里llm是一个被传进来的可调用对象。也就是说这个函数本身不关心模型怎么连它只要求你传一个“输入 prompt、输出文本”的东西进来。真正需要你补的是llm这个函数的实现——它内部要有一个 HTTP 客户端指向某个兼容 OpenAI 协议的模型服务带上 API Key指定模型 ID。常见的三种“没通道”表现llm直接是None或未定义运行到response llm(prompt)抛TypeError: NoneType object is not callable。这是最直白的说明你只抄了循环没写客户端。客户端写了但 Base URL 是默认的 OpenAI 地址报401或insufficient_quota因为你的 Key 不是 OpenAI 的或者根本没有官方额度。Base URL 写成了网页地址比如把https://taotoken.net/直接填进去请求会打到 HTML 页面上返回一堆标签parse_action解析出空字符串循环空转。这三种错误的根因是同一个llm(prompt)缺少一个明确的、可用的模型通道。下面用 TaoToken 把这一层补齐。二、TaoToken 前置拿 Key、认 Base URL在改代码之前先把两样东西准备好。第一步注册并创建 Key。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 完成注册后进入控制台在 API Keys 页面创建一个新 Key。这个 Key 就是后面环境变量里的YOUR_API_KEY。创建后立即复制保存页面刷新后通常不再完整显示。第二步确认 Base URL。TaoToken 的 API 端点是https://taotoken.net/api注意这里有两个容易踩的坑。其一不要把 UTM 参数拼到 API 地址上https://taotoken.net/api就是干净的端点UTM 只用于官网跳转统计。其二很多 OpenAI SDK 会自动在 Base URL 后面拼/chat/completions所以 Base URL 填到/api这一层即可不要自己再补/v1或/chat/completions否则会变成/api/v1/chat/completions这类重复路径。第三步选一个模型 ID。在控制台的模型列表里挑一个用于 Agent 循环的模型。ReAct 循环对模型的指令遵循能力要求较高因为它必须严格按Thought:/Action:的格式输出还要能被parse_action稳定解析。建议选一个输出格式稳定、支持较长上下文的模型因为 prompt 会随 Observation 不断追加。拿到这三样东西后llm通道的原料就齐了。三、可复制配置把 llm(prompt) 接上通道下面给出一个最小可运行的llm实现用 OpenAI 兼容的 Python SDK。先安装依赖pip install openai然后设置环境变量Linux / macOSexport TAOTOKEN_API_KEYYOUR_API_KEYWindows PowerShell$env:TAOTOKEN_API_KEYYOUR_API_KEY接着实现llm函数并把它传进原来的run_react_agentimport os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) MODEL_ID 你的模型ID # 从控制台模型列表选择 def llm(prompt: str) - str: resp client.chat.completions.create( modelMODEL_ID, messages[{role: user, content: prompt}], temperature0, stop[\nObservation:], # 关键卡住边界防止模型自己编 Observation ) return resp.choices[0].message.content这里有两个细节值得展开。temperature0ReAct 循环需要稳定的输出格式parse_action依赖固定的Action:前缀。温度调高会让模型偶尔换一种写法解析就失败了。stop[\nObservation:]这正是原文“停止关键词 Stop Sequence”那一条的落地。模型在生成Action: Search[...]之后如果不加停止词它可能顺手把Observation: ...也编出来——这就是幻觉编造工具返回结果。加上停止词后模型输出到Action行结束就停Observation必须由你的search_tool真实执行后拼接保证工具调用交给程序执行。把llm接进主循环调用方式不变answer run_react_agent( question2024年奥斯卡最佳影片是什么作者是谁, toolsTOOLS, llmllm, max_steps5, ) print(answer)注意run_react_agent内部完全不用改。parse_action、Search/Calculate分发、prompt f\nObservation: {observation}\n、Finish判断全部按原文写。TaoToken 只替换了llm这一层的通道没有侵入 Agent 逻辑。如果你用的是其他语言的客户端思路一致把 Base URL 设为https://taotoken.net/apiKey 从环境变量读模型 ID 填控制台里的值。Node.js 用openai包时baseURL同样填这个地址。四、验证请求先跑通第 1 轮再验证 Observation 写回配置改完后不要一上来就跑完整的多轮任务。按下面的顺序分步验证出问题时定位范围最小。第 1 步单独验证通道。先不跑 Agent直接调一次llmprint(llm(请只回复两个字收到))如果这一步就报错说明 Key、Base URL 或模型 ID 有问题跟 Agent 逻辑无关。常见返回是401Key 错、404Base URL 或模型 ID 错、Connection error网络或地址拼错。第 2 步跑通循环第 1 轮。让run_react_agent只跑一轮确认llm(prompt)能返回带Thought和Action的文本且parse_action能解析出action和action_input。可以在循环里加一行临时打印response llm(prompt) print(RAW RESPONSE:, response) # 临时调试 action, action_input parse_action(response) print(PARSED:, action, action_input)期望看到类似RAW RESPONSE: Thought: 用户想知道2024年奥斯卡最佳影片我需要先搜索。 Action: Search[2024年奥斯卡最佳影片] PARSED: Search 2024年奥斯卡最佳影片如果RAW RESPONSE有内容但PARSED是空的问题在parse_action的正则或格式匹配不在通道。第 3 步验证 Observation 写回。确认search_tool返回结果后prompt被正确追加了Observation:行。打印追加后的 prompt 尾部prompt f\nObservation: {observation}\n print(PROMPT TAIL:, prompt[-200:])期望看到Observation: 《奥本海默》这样的真实工具结果。如果这里出现的是模型自己编的内容说明停止词没生效回到第三步检查stop参数。第 4 步跑完整循环。前三步都通过后再放开max_steps5跑完整任务观察是否在第 3 轮命中Finish并返回最终答案。整个过程中每一轮llm(prompt)都在消耗 Tokenprompt 随 Observation 增长而变长这是 ReAct 的固有成本属于正常现象。五、本篇常见错排查把上面流程里最容易卡住的几个点集中列一下方便对照。错误一401 Unauthorized/invalid api key。Key 没读到或读错。检查环境变量名是否和代码里一致os.environ[TAOTOKEN_API_KEY]的键名大小写敏感。另外确认 Key 没有多余空格复制时容易带上换行。错误二404 Not Found或返回 HTML。Base URL 拼错。正确值是https://taotoken.net/api不要写成官网首页https://taotoken.net/也不要自己补/v1。如果 SDK 报错信息里出现html基本就是打到了网页上。错误三model not found/invalid model。模型 ID 填错。模型 ID 必须和控制台模型列表里的完全一致不能凭记忆写。不同模型的 ID 命名规则不同复制粘贴最稳妥。错误四parse_action解析为空循环空转。模型输出格式不稳定。三个检查点temperature是否为 0prompt 里的 Few-shot 示例是否完整原文强调的示例提示词就是干这个的stop停止词是否设置。如果模型偶尔输出Action中文冒号而不是Action:需要在parse_action里兼容。错误五模型自己编造 Observation。停止词缺失或写错。stop[\nObservation:]里的换行符和冒号都要对。有些模型对停止词不敏感可以在 prompt 里再强调一句“不要自行生成 Observation”。错误六循环跑满max_steps仍未 Finish。不一定是通道问题可能是任务本身需要更多步或者模型在评估环节判断失误。先确认前几轮的 Observation 是否真实写回再考虑调大max_steps或优化 prompt 里的评估指令。错误七Token 消耗异常快。ReAct 每轮都把完整历史 prompt 重发这是设计使然。如果消耗远超预期检查是否在prompt里重复拼接了工具描述或者max_steps设得过大。控制成本的正道是优化 prompt 长度和步数上限而不是换通道。六、语义一致通道归通道循环归循环回到这篇的定位。原文讲的是 ReAct 设计模式本身——Thought 思考、Action 行动、Observation 观察的循环parse_action的解析工具分发Finish判断停止词和 Few-shot 这些工程要点。这些逻辑一个字都不用改。本篇补的只是llm(prompt)背后的模型通道用 TaoToken 拿 Key把 Base URL 指向https://taotoken.net/api让每一次循环调用都有真实的模型响应。如果你在接入过程中卡在 Key 或 Base URL 上可以直接去 API Keys 页面重新创建一个 Key并对照接入文档确认端点写法创建和管理 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content通道跑通后建议先在模型对话里手动发一条带Thought:/Action:格式要求的 prompt确认模型能稳定按格式输出再回到 Agent 循环里跑多轮模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content如果你不只是跑一次演示而是要把这个 ReAct Agent 长期用于编码、文档生成或数据分析这类多步任务循环调用会持续消耗 Token可以考虑用 Coding Plan 来覆盖长期编码场景Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content把llm这一层接上之后run_react_agent里的循环就能真正转起来第 1 轮拿到 Thought 和 Actionsearch_tool执行后写回 Observation第 2 轮模型基于新事实继续推理直到命中Finish返回答案。通道和循环各司其职这才是手写 ReAct Agent 该有的样子。

相关新闻

基于Python Flask的房价预测系统开发实践

基于Python Flask的房价预测系统开发实践

1. 项目背景与核心价值商品房价格预测分析系统是我在房地产数据挖掘领域的一次完整实践。这个基于Python Flask框架的系统,整合了网络爬虫、数据清洗、可视化分析和机器学习预测等多项技术,为购房者、投资者和行业分析师提供了一个直观的数据决策工具。在…

2026/9/21 2:47:05 阅读更多 →
用VBA与ADO将Excel变成SQL查询终端:连接串与执行对象详解

用VBA与ADO将Excel变成SQL查询终端:连接串与执行对象详解

简介:面向需要在 Excel 中通过 VBA 连接 SQL 数据库的办公自动化人员与数据分析师,这份梳理文档聚焦 ADO 技术的实际落地,内容深浅适中,适合已掌握 Excel 基础操作、希望进一步提升数据自动化处理能力的读者。包内含 1 个 doc 文件…

2026/9/20 0:38:03 阅读更多 →
QTextEdit HTML 丢格式?用 TaoToken Key 让 Codex 对照 QTextDocument

QTextEdit HTML 丢格式?用 TaoToken Key 让 Codex 对照 QTextDocument

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

2026/9/21 2:47:29 阅读更多 →

最新新闻

Roc 语言 `if` 表达式缺失 `else` 分支的编译诊断深度解析:基于 `expr_if_missing_else` 快照测试

Roc 语言 `if` 表达式缺失 `else` 分支的编译诊断深度解析:基于 `expr_if_missing_else` 快照测试

【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 点击查看 免费下载 Roc(A fast, friendly, functional language)是一门函数式语言,其 if 是表达式而非语句…

2026/9/21 2:47:32 阅读更多 →
Boss直聘岗位数据抓取实战:requests+代理IP池搭建与反爬应对

Boss直聘岗位数据抓取实战:requests+代理IP池搭建与反爬应对

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

2026/9/21 2:47:32 阅读更多 →
伺服电机通信协议选型指南:Modbus、CANopen与EtherCAT对比

伺服电机通信协议选型指南:Modbus、CANopen与EtherCAT对比

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

2026/9/21 2:47:32 阅读更多 →
VitePress 部署完全指南:从本地构建、Base 路径到各平台生产发布

VitePress 部署完全指南:从本地构建、Base 路径到各平台生产发布

VitePress 部署完全指南:从本地构建、Base 路径到各平台生产发布 【免费下载链接】vitepress Vite & Vue powered static site generator. 项目地址: https://gitcode.com/gh_mirrors/vi/vitepress VitePress 是 Vite 与 Vue 驱动的静态站点生成器&#…

2026/9/21 2:47:32 阅读更多 →
K8s环境下GPU虚拟化切分与算力调度实践指南

K8s环境下GPU虚拟化切分与算力调度实践指南

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

2026/9/21 2:47:32 阅读更多 →
KC 60227-1标准解析:韩国KC认证与PVC电缆关键

KC 60227-1标准解析:韩国KC认证与PVC电缆关键

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

2026/9/21 2:46:31 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →