
字节笔记本
2026年10月24日 · 约 10 分钟读完
DataAgent:让 Agent 替你跑数据分析

本文是《从 0 写 Agent》系列第 46 章。这个系列基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版),用 Go 从零实现一个生产级 Agent 运行时;本章讲「实战二:数据分析 Agent(DataAgent)」。
客服 Agent 偏"流程执行",数据分析 Agent 偏"推理探索",用户问"华东区为什么销售下滑",Agent 要查数据库、分析异常、生成带证据的报告。
这个案例用到 MCP(连数据库)+ Sandbox(跑分析代码)+ 结构化输出,是前面 Part V 工具生态的综合应用。
需求
一个数据分析 Agent 要能:
- 理解分析意图,用户说"分析销售异常",知道要查销售数据
- 查数据库,通过 MCP 数据库工具执行 SQL
- 跑分析代码,复杂分析(统计、可视化)用 Sandbox 跑 Python
- 生成报告,结构化输出,带数据、图表、结论
- 权限控制,只能查自己有权限的数据

架构设计
// 1. 数据库 MCP server(连公司的分析库)
dbServer, _ := mcp.NewStdioServer(ctx, "analytics_db",
exec.Command("mcp-server-postgres", "--connection-string=..."),
mcp.Options{
AllowedTools: []string{"query_sql", "list_tables", "get_schema"},
RequireApproval: func(toolName string) bool {
return toolName == "query_sql" // 查询要审批(防恶意 SQL)
},
})
// 2. Python Sandbox(跑分析代码)
sb, _ := sandbox.NewLocal() // 生产用 Docker
analysisTool := sandbox.CodeTool(sb, sandbox.CodeToolConfig{
Name: "run_analysis",
})
// 3. 结构化输出,分析报告
type AnalysisReport struct {
Summary string `json:"summary" jsonschema:"description=一句话总结"`
Findings []Finding `json:"findings" jsonschema:"description=发现列表"`
Data []DataPoint `json:"data" jsonschema:"description=支撑数据"`
Charts []ChartRef `json:"charts" jsonschema:"description=图表引用"`
Conclusion string `json:"conclusion" jsonschema:"description=结论和建议"`
}
// 4. DataAgent
dataAgent := &agents.Agent{
Name: "数据分析师",
Instructions: agents.StaticInstructions(`你是数据分析师。
- 先理解分析目标
- 用 MCP 工具查数据(query_sql 等)
- 需要复杂分析时,用 run_analysis 跑 Python
- 每个结论都要有数据支撑
- 输出结构化的分析报告`),
Model: "openai/gpt-4o",
MCPServers: []agents.MCPServer{dbServer},
Tools: []agents.Tool{analysisTool},
OutputType: agents.OutputType[AnalysisReport](),
}一次分析流程
用户:"分析华东区上周销售下滑的原因"
Agent Thought: 需要先看华东区上周销售数据
Agent Action: query_sql("SELECT * FROM sales WHERE region='华东' AND week=last_week")
Observation: 销售额 500 万,环比 -15%
Agent Thought: 下降明显,看品类细分
Agent Action: query_sql("SELECT category, SUM(amount) ... GROUP BY category")
Observation: 电子产品 -40%,其他平稳
Agent Thought: 电子产品暴跌,可能是断货。跑 Python 做趋势分析
Agent Action: run_analysis(代码:画电子产品销售趋势图,检测断货点)
Observation: 图表显示第 4 天销售归零,持续 5 天 → 断货
Agent Thought: 确认是断货。生成报告
Final Output: AnalysisReport{
Summary: "华东区销售下滑因电子产品主力型号断货 5 天",
Findings: [{Title: "电子产品暴跌 40%", Evidence: "..."},
{Title: "主力型号断货", Evidence: "第4天起库存为0"}],
Conclusion: "建议补货主力型号,预计可恢复 30% 销售额"
}关键设计点
MCP 连数据库,第 28 章
用 MCP server 提供 SQL 查询工具,而不是自己写。好处,同一个 MCP server 可以被多个 Agent 框架复用(Claude Code、Cursor 都能用)。
Sandbox 跑分析代码,第 32 章
复杂分析(统计检验、可视化)SQL 做不了,要跑 Python。Sandbox 让 Agent 生成的 Python 代码安全执行,即使代码有 bug 或恶意,不伤宿主。
结构化输出,第 3 章
OutputType[AnalysisReport]() 保证输出是结构化报告,不是一段散文字。下游可以解析 Findings 渲染成卡片,解析 Charts 显示图表。
RequireApproval,第 29 章
SQL 查询要审批,防止恶意 SQL(DROP TABLE、查敏感数据)。这是 MCP 工具的 HITL 应用。
DataAgent 的特殊挑战
挑战一:NL2SQL 准确性
用户说"华东区上周销售",Agent 要转成正确的 SQL。NL2SQL 是 DataAgent 的核心难点,错误率高。缓解措施:
- 提供数据库 schema(让 Agent 知道表结构)
- 用语义层(统一指标口径)
- SQL 执行前校验(防语法错、防危险操作)
《企业级 Agent 平台工程》Part VI 专门讲 DataAgent 的这些挑战。
挑战二:证据可追溯
分析结论必须有数据支撑,"下滑 15%"必须能追溯到哪条 SQL、哪个数据点。agents-go 的 Tracing(第 25 章)记录了每次工具调用,是证据链的基础。
挑战三:权限
不同用户能看到不同范围的数据。MCP server 的 query_sql 工具里要带用户身份,只返回有权限的数据。这是工具层的安全责任。
小结
DataAgent 是 Agent 价值最高的场景之一,把"人查数据分析"变成"Agent 自动分析"。它综合用了 MCP(连数据)、Sandbox(跑代码)、结构化输出(报告),是 Part V 的集大成应用。
和客服 Agent 的区别,客服偏流程(固定步骤),DataAgent 偏推理(开放式探索)。两者的 Agent 设计侧重不同。
下一篇
第 47 章,实战三:代码助手 Agent。Agent 不只能查数据,还能读代码、改代码、跑测试。类似 Claude Code / Codex 的迷你版。
本文是《从 0 写 Agent》系列第 46 章,案例代码基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版)。全系列目录见总览。

