从写代码,到创作下一幕

探索 字节跳动 - 火山方舟 的 AI 编程与视频创作活动。

火山方舟 Agent Plan 与 Coding Plan 活动,价格 ¥9.9 起

Agent Plan & Coding Plan

一站体验多款热门模型,为 AI 编程与智能体开发提供更多选择。新用户可联系(微信: goo_lvyouyou)免费体验 9.9 agent plan。

查看套餐优惠
Seedance 2.5 视频创作活动:30 秒视频、多模态参考、局部编辑

Seedance 2.5

让创意,跃然成片。探索 30 秒视频、多模态参考与局部编辑,把脑海中的画面变成下一支作品。

探索视频创作

根据 CSV 回答问题

查看 Markdown

本应用使用 Grok API 构建 AI 数据分析助手,通过编写和运行 pandas 代码回答有关 CSV 的问题。对于必须准确的数值,回答依据程序实际算出的结果。

放入一份电子表格,然后提问,例如“调价后,哪个套餐的客户流失率上升了?”Grok 会编写 pandas 代码,使用代码执行工具在沙箱中运行,再用算出的数字和图表回答。答案旁会列出每个实际运行的程序及其输出,便于核对。可以在小型网页应用或终端中运行。

你将学到什么

  • 用代码执行工具得到计算结果,并要求 Grok 在作答前先运行代码

  • 使用 Files API 上传文件,并将它作为以下类型的附件送入沙箱:input_file

  • 根据流中的代码解释器事件和工具调用输出,展示生成答案的代码及其执行过程

  • 在执行代码的同一请求中以结构化输出返回答案和图表,并随数据到达绘图

  • 使用较低的推理强度,将答题耗时从接近两分钟缩短到一分钟以内

  • 通过服务器发送事件(SSE)将进度从 Node 服务器实时传至网页,并在网页关闭时取消请求

运行示例

需要 Node.js 22.13 或更高版本。将 API 密钥写入 .env(位于仓库根目录),或导出环境变量 XAI_API_KEY。

Bash

cd examples/csv-to-answers/typescript
npm install
npm run web

打开 http://localhost:3000,点击一个问题来询问示例数据,也可自行输入问题。每次回答下方都会再次显示示例问题,方便连续提问。页面类似数据分析笔记本。左侧列出问题和 Grok 的回答,包括简短答复、关键数据和图表。右侧显示 CSV,并实时展示 Grok 的思考过程、运行的各个程序及其输出。点击 Stop 或关闭页面即可取消。要使用自己的数据,将不超过 2 MB 的 CSV 拖到页面任意位置,或点击文件名。

也可从终端传入 CSV 和问题。未提供时,程序会针对示例数据提出上面的问题。

Bash

npm start -- ./your-data.csv "Which month had the most refunds?"

运行时会打印每个程序及其输出,随后显示答案和简短的文本图表,并将答案、图表数据和代码保存到 output/,格式为 Markdown 和 JSON。

示例文件 subscriptions.csv 使用虚构数据,含 756 行月度订阅记录,覆盖 2025 年 1 月至 2026 年 9 月,按套餐、地区及销售渠道组合分行,记录月度价格、客户数、取消数和收入。2026 年 4 月,Plus 从 19 美元涨到 25 美元,Pro 从 49 美元涨到 59 美元。实测每个问题耗时 15 秒至 1 分钟,运行一两次代码,按标价花费约 0.07 至 0.11 美元。每次代码执行收费 0.005 美元(每 1,000 次 5 美元),其余费用主要来自输入 token,因为 Grok 的每个轮次都会在上下文中带上 CSV:一个执行一次代码的问题用了约 42,000 个输入 token。结束后页面会显示 API 报告的费用。

工作原理

共享代码位于 src/answers.ts:

  1. uploadCsv() 使用以下方法上传 CSV:client.files.upload()。上传的文件会在一小时后自动删除。

  2. ask() 将问题发送给 grok-4.7,配合 codeExecution(),并将上传的文件作为附件传入:{ type: "input_file", file_id }。API 以文件上传时的名称,将其复制到沙箱的工作目录,因此提示词要求 Grok 用以下代码读取文件:pd.read_csv("subscriptions.csv")。没有这条说明时,Grok 会先去 attachments 目录查找,三次运行后才成功加载。沙箱没有网络,需要通过附件传入数据。以内联 file_data 方式发送也会把文件放到相同位置。将 CSV 粘贴到提示词中则不会在磁盘上创建文件:Grok 会把每行数据重写到代码中。对 63 行数据尚可行,但对本示例将需要数万个输出 token。

  3. API 还会将文件文本放入 Grok 的上下文。40 KB 的示例约需 19,000 个输入 token,167 KB 的文件则仅占用 50,000 个,而非根据体积推算的 80,000 个。这说明 Grok 在上下文中只能看到大文件的一部分。磁盘上的副本是完整的,代码数出了文件的全部 3,024 行。因为 Grok 可以直接阅读数据,它可能跳过代码:让它求该文件某列总和时,它未执行代码便作答,结果相差三倍以上。因此请求设置 tool_choice: "required",强制 Grok 在回答前至少执行一次代码;提示词要求所有数字都通过代码计算,并打印所有要报告的结果。

  4. 在流式响应中,每次代码运行对应几个事件。SDK 暂不识别代码解释器自身的事件,因此以 unknown 事件传递。response.code_interpreter_call_code.done 在 Grok 写完程序后立即提供代码。代码在运行前一次性完整返回,不会逐 token 发送。执行可能不到一秒,也可能持续几秒;结束时,server_tool_call 事件会返回已完成的 code_interpreter_call。只有请求通过 include: ["code_interpreter_call.outputs"] 明确要求时才会包含程序输出。每项输出的 logs 是一个 JSON 字符串,包含程序的 stdout、stderr 和 exit_code。

  5. 答案遵循 text.format 中的 JSON Schema,与执行代码共用同一请求。它包含简短回答、两至四项发现,以及图表的类型、数值格式、标签、序列和调价等事件标记。图表还会指出哪个序列回答了问题,页面会用强调色绘制该序列。如果答案是单一数值,提示词会要求提供细分数据,以便绘图。流式传输 JSON 时,json 事件会把截至当前的答案交给 ask(),页面因此能先显示回答,再显示各项发现,最后随着数值到达绘制图表的线条。

  6. 请求使用较低的推理强度。默认强度下,Grok 在两次运行间最多思考半分钟,执行了四个程序,共用 103 秒才得出相同数值。使用较低强度时,只需运行一两次。

src/server.ts 是一个小型 node:http 服务器。EventSource 只能发起 GET 请求,因此网页会先将 CSV 发送到 /api/datasets,由服务器保存在内存中,然后对每个问题打开 /api/answer 并传入返回的 ID。第一个问题会将 CSV 上传到 Files API,如果之后提问时距上次上传已接近一小时,就会重新上传。服务器通过服务器发送事件将每一步流式推送给网页,并将 AbortSignal 传入每次 API 调用。因此,关闭网页或点击 Stop 会取消请求。SDK 客户端使用 retryBeforeOutput,因为 API 繁忙时,请求有时会在 Grok 开始工作前就失败。

public/index.html 使用原生 HTML 和 JavaScript。网页自行读取 CSV 以显示预览,实时展示收到的每个事件,并以 SVG 绘制图表。src/index.ts 在终端中完成同样的工作。

SDK 覆盖本应用所需的所有调用。唯一尚未直接支持的是代码解释器的流式事件,SDK 会将它们以 unknown 事件形式连同原始载荷传递。