ByteNoteByteNote
DataAgent:让 Agent 替你跑数据分析
字

字节笔记本

2026年10月24日 · 约 10 分钟读完

DataAgent:让 Agent 替你跑数据分析

API中转
¥120

专业知识的杠杆效应

本文是《从 0 写 Agent》系列第 46 章。这个系列基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版),用 Go 从零实现一个生产级 Agent 运行时;本章讲「实战二:数据分析 Agent(DataAgent)」。

客服 Agent 偏"流程执行",数据分析 Agent 偏"推理探索",用户问"华东区为什么销售下滑",Agent 要查数据库、分析异常、生成带证据的报告。

这个案例用到 MCP(连数据库)+ Sandbox(跑分析代码)+ 结构化输出,是前面 Part V 工具生态的综合应用。


需求

一个数据分析 Agent 要能:

  1. 理解分析意图,用户说"分析销售异常",知道要查销售数据
  2. 查数据库,通过 MCP 数据库工具执行 SQL
  3. 跑分析代码,复杂分析(统计、可视化)用 Sandbox 跑 Python
  4. 生成报告,结构化输出,带数据、图表、结论
  5. 权限控制,只能查自己有权限的数据

用量与成本

架构设计

go
// 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](),
}

一次分析流程

text
用户:"分析华东区上周销售下滑的原因"

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 移植版)。全系列目录见总览。

相关文章

分享: