
1. ChatGLM3 三条能力线到底解决什么问题ChatGLM3 是智谱AI推出的第三代基座大模型它在对话之外补上了三块拼图Code Interpreter 负责生成并执行代码WebGLM 负责联网检索增强CogVLM 负责图文多模态理解。如果你之前只用过 ChatGLM2 做纯文本问答会发现很多任务卡在模型知道但做不到这一步——比如让它算一组 CSV 的均值方差它只能给你一段代码却没法告诉你运行结果问它某个库的最新用法它可能给出过时答案。ChatGLM3 的思路是把想和做拆开让模型在需要时调用工具把执行结果再喂回上下文。这套链路对三类人最有用。第一类是数据分析场景的开发者手头有 Excel 或 CSV想让模型直接出结论而不是出代码第二类是知识问答类应用需要模型回答时带上可追溯的网页来源第三类是图文混合任务比如给一张图表让模型读出趋势。这三条线背后其实是同一个基座在支撑区别在于工具调用的编排方式不同。我实测下来ChatGLM3 的工具调用不是黑盒它通过结构化的 function call 协议把要不要调工具、调哪个、传什么参数暴露出来你可以在本地推理时打印中间结果看清楚每一步。这对调试非常关键因为很多模型答错了的情况其实是工具没被正确触发或者返回结果没被正确解析。下面按环境准备 → 三条线分别配置 → 验证 → 排障的顺序展开。所有配置片段都可以直接复制路径和参数保持和官方仓库一致。需要说明的是本地推理对显存有要求ChatGLM3-6B 的 BF16 权重加载大约需要 13GB 以上显存如果显存不够可以走量化版本或者把推理请求发到云端 API。我这边为了快速验证工具调用链路用的是 API 方式省去下载权重的等待。2. TaoToken 前置准备拿到可用的 Base URL 和 Key不管你是本地跑还是走云端工具调用链路要跑通第一步是有一个稳定的推理入口。本地部署适合做深度调试但每次改配置都要重启服务云端 API 适合快速验证三条能力线尤其是 Code Interpreter 这种需要反复试参数的场景。我这次验证用的是 TaoToken 的接口它的 Base URL 和 OpenAI 兼容格式一致ChatGLM3 的 function call 字段可以直接透传。先到官网注册并进入控制台。地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在左侧菜单找到 API Keys 页面点创建新密钥复制生成的 sk- 开头的字符串。这个 Key 只显示一次建议先存到本地环境变量里别直接写进代码提交到仓库。创建完 Key还需要确认两件事一是 Base URLAPI 调用统一走 https://taotoken.net/api 注意这个地址不带任何查询参数二是模型 IDChatGLM3 对应的模型标识在模型列表里能查到调用时填对就行。如果你要做 Coding Plan 相关的长期任务可以在控制台看下套餐额度避免验证到一半额度用完。把 Key 写进环境变量的命令如下Linux/macOS 用 exportWindows PowerShell 用 $env:export TAOTOKEN_API_KEYsk-你的密钥 export TAOTOKEN_BASE_URLhttps://taotoken.net/api验证环境变量是否生效echo $TAOTOKEN_API_KEY如果输出的是你的密钥字符串说明配置成功。这一步看起来简单但后面所有请求都依赖它建议先确认再往下走。另外提醒一句Key 不要贴在公开的 issue 或聊天记录里如果不小心泄露了回控制台删掉重新建一个。3. 可复制配置三条能力线的请求片段这一节给出三个可直接运行的配置片段分别对应 Code Interpreter、WebGLM 检索增强、CogVLM 多模态。每个片段都包含 Base URL、Key、Model ID 三件套你可以按需替换模型标识。3.1 Code Interpreter 的 function call 配置Code Interpreter 的核心是让模型输出一段可执行的代码然后你在沙箱里跑再把结果回传。请求体里需要声明 tools 字段告诉模型有哪些函数可用。下面是一个 Python 请求示例用 requests 库发送import os import json import requests API_KEY os.environ[TAOTOKEN_API_KEY] BASE_URL os.environ[TAOTOKEN_BASE_URL] tools [ { type: function, function: { name: execute_python, description: 执行一段 Python 代码并返回标准输出, parameters: { type: object, properties: { code: { type: string, description: 要执行的 Python 代码 } }, required: [code] } } } ] payload { model: chatglm3, messages: [ {role: user, content: 帮我算一下 [12, 7, 9, 15, 22] 的平均值和中位数} ], tools: tools, tool_choice: auto } resp requests.post( f{BASE_URL}/chat/completions, headers{ Authorization: fBearer {API_KEY}, Content-Type: application/json }, jsonpayload, timeout60 ) print(json.dumps(resp.json(), ensure_asciiFalse, indent2))运行后你会看到返回的 choices 里带 tool_calls 字段里面是模型生成的代码。你把这代码在本地 exec 或子进程里跑拿到结果后再发一轮请求把 tool 角色的消息追加进去。这就是完整的 Code Interpreter 闭环。3.2 WebGLM 检索增强的配置WebGLM 的检索增强需要在请求里带上搜索工具模型会先决定搜什么关键词你拿到关键词后去调搜索接口把摘要回传。配置片段和上面类似只是 tools 里换成 search_web{ model: chatglm3, messages: [ {role: user, content: ChatGLM3 的端侧模型支持哪些芯片平台} ], tools: [ { type: function, function: { name: search_web, description: 根据关键词搜索网页并返回摘要, parameters: { type: object, properties: { query: {type: string, description: 搜索关键词} }, required: [query] } } } ], tool_choice: auto }注意 tool_choice 设为 auto 时模型可能不触发搜索直接回答。如果你希望强制走检索可以设为 {type: function, function: {name: search_web}}。实测下来对于时效性强的问题强制检索的答案质量更稳。3.3 CogVLM 多模态的配置CogVLM 走的是图文输入请求体里 content 要改成数组包含 text 和 image_url 两部分。图片可以是公网 URL也可以是 base64 编码。配置片段{ model: cogvlm, messages: [ { role: user, content: [ {type: text, text: 这张图里有哪些主要元素}, {type: image_url, image_url: {url: https://example.com/chart.png}} ] } ] }如果你的图片在本地先转 base64格式是 data:image/png;base64,编码。CogVLM 在图文评测集上表现不错但要注意图片分辨率别太高否则 token 消耗会明显上升。4. 验证请求三类任务的成功结果长什么样配置写完接下来是验证。我按三条线分别跑一遍把成功返回的关键字段贴出来你可以对照自己的结果。4.1 Code Interpreter 验证发完 3.1 的请求后正常返回的 choices[0].message 里会有 tool_calls 数组结构大致是{ tool_calls: [ { id: call_abc123, type: function, function: { name: execute_python, arguments: {\code\: \import statistics\\ndata [12, 7, 9, 15, 22]\\nprint(statistics.mean(data))\\nprint(statistics.median(data))\} } } ] }把 arguments 里的 code 字段解析出来执行得到 13.0 和 12。然后构造第二轮请求messages 里追加 assistant 的 tool_calls 消息和 tool 角色的结果消息messages.append(resp.json()[choices][0][message]) messages.append({ role: tool, tool_call_id: call_abc123, content: 13.0\n12 })再发一次请求模型就会基于执行结果给出自然语言回答。这一步成功的话说明 Code Interpreter 链路通了。4.2 WebGLM 验证检索增强的验证看两点一是模型是否触发了 search_web二是回传搜索结果后答案里是否带了引用。触发时 tool_calls 的 arguments 里会有 query 字段比如 {query: ChatGLM3 端侧模型 芯片平台}。你拿这个 query 去调搜索把前几条摘要拼成字符串回传模型会在最终回答里标注来源。如果模型没触发搜索检查 tool_choice 是否设成了 auto 且问题不够时效敏感。4.3 CogVLM 验证多模态验证最直观返回的 content 里会直接描述图片内容。如果返回 400 错误多半是 image_url 格式不对检查是不是漏了 data:image 前缀或者图片 URL 无法公网访问。成功时你会看到模型准确说出图表类型、坐标轴含义、数据趋势。5. 常见报错排查401、local proxy failed、reading choices验证过程中最容易撞上几个报错我按实际遇到的顺序列出来对照排查。401 Unauthorized 通常有两个原因Key 没传对或者 Base URL 写错了。先确认请求头是 Authorization: Bearer sk-xxx注意 Bearer 后面有一个空格。再确认 Base URL 是 https://taotoken.net/api 不要多加 /v1 或结尾斜杠否则路径拼接会出错。如果 Key 是从环境变量读的打印一下确认没有多余换行。local proxy failed 这个报错一般出现在你本地配了代理但代理没启动的情况。检查环境变量里有没有 HTTP_PROXY 或 HTTPS_PROXY如果有但代理服务没开请求会直接失败。临时清掉这两个变量再试unset HTTP_PROXY unset HTTPS_PROXYreading choices 报错说明请求发出去了但返回体里没有 choices 字段。常见原因是模型 ID 填错比如把 chatglm3 写成了 chatglm3-6b 而接口不认。回控制台确认模型列表里的准确标识。另一个可能是请求体 JSON 格式错误比如 tools 字段写成了字符串而不是数组用 json.dumps 前先 print 一下 payload 确认结构。OAuth 相关报错多出现在你用第三方客户端接入时比如某些 IDE 插件走的是 OAuth 流程而不是 API Key。这种情况改用 API Key 方式配置Base URL 和 Key 填对即可。如果你用的是 CC Switch 或 Cline MCP 这类工具配置里同样要写全三件套Base URL 填 https://taotoken.net/api Key 填 sk- 开头的字符串Model ID 填 chatglm3。三件套缺一个都会报错。还有一个隐蔽的坑Code Interpreter 第二轮请求时tool_call_id 必须和第一轮返回的 id 完全一致复制时别漏字符。我踩过一次id 少了一位模型直接返回空 choices。6. 把三条线串起来从验证到日常使用三条线单独跑通后可以按任务类型组合。数据分析类任务走 Code Interpreter让模型出代码、你执行、回传结果知识问答类任务走 WebGLM强制检索保证时效图文类任务走 CogVLM图片转 base64 后直接发。如果你要做长期的编码或 Agent 任务可以在控制台看下 Coding Plan 的额度把高频调用集中管理。需要快速对比模型输出时模型对话页面可以直接试不用写代码https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的完整示例。API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite Key 泄露了及时在这里删掉重建。最后说一个实用技巧调试 function call 时把每轮请求和响应都写进日志文件尤其是 tool_calls 的 arguments 和 tool 角色的 content。这样出问题时能快速定位是模型没触发工具还是工具返回格式不对。我习惯用 logging 模块按天切分日志跑一周下来能积累不少真实 case比看文档管用。