微信扫码
添加专属顾问
我要投稿
Cursor-Agent 如何让数据团队告别手动取数烦恼?探索从SQL生成到自动执行的AI Agent完整解决方案。 核心内容: 1. 传统取数流程的三大痛点:SQL编写门槛高、LLM无法自动执行、缺乏环境反馈机制 2. Cursor-Agent的突破性能力:端到端自动化执行与智能纠错 3. 实际案例展示:从需求输入到结果输出的完整Agent工作流
在数据驱动的时代,快速、准确地获取数据是企业决策和业务发展的基石。然而,对于许多技术团队而言,日常的取数工作往往充满了挑战,耗时耗力。
我们团队也曾深陷其中,直到开始探索 AI Agent 在这一领域的应用,特别是通过实践 Cursor-Agent,我们看到了一条从手动取数到自动化"数据大师"的进化之路。
日常取数的问题
近年来,大型语言模型(LLM)如 ChatGPT、Claude 在 SQL 生成方面展现了惊人能力,确实在一定程度上提升了效率。比如,我们可以将需求"统计不同商家类目在新渠道订单量、GMV" 输入给LLM,它能快速给出一个SQL草稿。
然而,我们很快发现,LLM 距离真正的"全自动化"取数还有关键的"最后一公里":
我们意识到,我们需要的不只是一个"SQL代码生成器",而是一个能够理解需求、规划步骤、与真实数据环境交互、处理反馈并自主完成任务的智能体 (Agent)。
正是在这样的背景下,我们开始探索和实践 Cursor-Agent。基于 Cursor-Agent 构建了一套完整的 Agentic Workflow,旨在实现从需求输入到结果输出的端到端自动化。
这里使用 测试库表 演示 Agent 处理数据需求的能力
Agent 数据权限说明:
明确需求下的"零干预": 当业务方提供口语化的取数需求时(例如:统计25年多渠道的经营状况),Agent 能够自动完成需求分析、查找资料、编写SQL、使用工具访问数据库执行SQL,甚至在遇到一些简单执行问题(如轻微的SQL语法调整、字段格式不匹配时)时能自行修正,最终直接返回数据结果。整个过程几乎无需人工干预。
模糊需求下的"自主探索": 更令人印象深刻的是,即使面对相对原始和模糊的需求, Agent 也能展现出强大的自主探索能力。 如我们内部真实需求: "统计24年每月储值支付的换货订单", 在订单表数据中没有明确标记是否使用了储值支付,且领域知识文档没有支付方式的介绍, Agent 通过订单表中pay_tool_id
字段的备注 "支付方式参见 pay_tool_table_name
", 自动探索支付方式表,关联查询出储值支付方式。 这个重要技能在后续迭代中被补充进了提示案例中。
效率提升的惊人数据: 复杂取数需求 从传统的4-6小时,缩短到10-15分钟。 更重要的是,这种效率提升不仅仅是速度上的突破,更是让非技术人员也能直接进行数据探索,彻底打破了"取数需要排期"的传统协作模式。
.cursorrules
的内容是领域知识的重要组成部分, 是 Agent 的行动指南和思考框架,它包含了一系列预设的规则、指令、流程和技巧, 其中最重要的工作流部分是来自于编写SQL的真实流程和 最佳实践。
具体内容见底部附录
# role
# workflow
# instruction
# checkpoint-validation
# troubleshooting-guide
# performance-tips
# tool-use
# example
作为 Agent 的"手脚",Local Tools (主要是 Node.js
脚本) 负责与真实数据环境交互。
query(sql_statement)
:接收一个SQL语句字符串,通过HTTP请求访问数据平台,并返回查询结果(如CSV格式数据或错误信息)。table-info(table_name)
:接收一个表名,通过HTTP请求访问数据平台,返回该表的字段列表、数据类型、字段注释等。metadata(keyword)
:接收一个业务关键词(如"店铺"、"交易"),使用数据平台元数据搜索功能, 搜索关键字关联的数据表。由于数据平台的一些现存问题,导致 Agent 直接访问数据平台获取数据定义时,内容是有缺失的,从而导致查询效率非常低,甚至陷入死循环中。
所以知识库的出现是对数据平台数据定义的补充, 为 Agent 提供领域相关的知识, 加快 Agent 解决需求的速度
1. 字段值域定义的缺失
payment_method int
- 只能看到是数字,不知道有哪些有效值, 具体的含义payment_method字段值域:1=微信支付,2=支付宝,3=银行卡,4=余额支付,5=等等
2. JSON/TEXT字段内容结构缺失
order_extra text COMMENT '订单扩展信息'
- 看不到JSON内部结构order_extra字段结构:{"channel":"渠道来源","promotion_id":"活动ID","coupon_info":{"type":"优惠券类型","amount":"金额"}}
3. 表名、指标搜索能力不足
dw_order dw_order_ext dw_trade_xx dw_trade_xx 等等
,库表太多难以直接和销售、交易精确关联#交易 ##订单 表名: dw_order(订单主表)、dw_order_ext(订单扩展表)、dw_refund(退款表)等
领域知识文档通过 Markdown 格式组织业务、技术知识, 目前来看,最重要内容是:
dim_user_profile
存储用户画像基础信息,fact_order_details
存储订单明细。"orders.order_type
字段,1=普通订单,2=拼团订单,3=秒杀订单。"具体内容见底部附录
我们的 Agent 并非一蹴而就,而是经历了一个不断探索、试错和优化的迭代过程,每个版本都带来了能力的提升和体验的优化。
思前想后,最核心的问题应该是 Agent 行为可控性,它直接关乎项目能否成功。 而其他的也非常重要的问题, 业务理解能力、执行效率、性能等都可以根据工程经验优化,但这些优化生效的前提是Agent要"听话", 如果它不按照你精心设计的规则和策略执行,那么再好的优化策略也没用,再完善的知识库也发挥不了作用。
在 v0.3 时, Agent 的表现尽管已经非常智能, 可以0干预处理简单的查询需求,但是稍微复杂的需求,执行流程有很大随机性,它不完全按预设指令行动,可能导致最终结果有错误,甚至陷入逻辑死循环中,跑不出最终结果。
解决办法:cursorrules (workflow + example)
cursorrules
本质是系统提示词workflow
), 而工作流程是模拟一名技术处理真实取数需求的过程, 按流程执行大概率能得到最终结果。example
), 案例中的执行过程应该和工作流中内容是对应起来的。通过在 Cursor-Agent 上的实践,我们坚信 AI Agent 将在数据处理领域扮演越来越重要的角色。特别是,与业务功能的深度融合方面,Agent 的角色将从单纯的取数工具,向更广泛的业务流程延伸,同时将突破现有的产品交互形式,迈向更智能、更自然的人机协作模式。
如果要完成未来的产品化,肯定要脱离 Cursor-Agent,基于通用的 LLM API 或开源 Agent 框架进行二次开发,构建更开放、更易于集成的 Agent 服务。这无疑会带来更大的想象空间,但也需要攻克模型适配、提示词优化、上下文存储优化、垂直知识库高效集成等技术挑战。
技术发展太快,早期积累的工程优势,在下一阶段变革到来时,往往顷刻化为乌有,甚至成为前进的桎梏。 LLM/Agent 领域的发展速度令人咋舌,技术项目的生命周期被极度压缩。
几周就是一个时代:
技术积累的脆弱性:
更深层的思考:
当我们还在为这个月的技术选择沾沾自喜时,下个月可能就需要完全推倒重来。这既让人焦虑,也让人兴奋 - 这就是我们所处的时代。
# workflow
必须严格按顺序执行以下步骤,不得跳过任何步骤:
1. 需求解构:
- 必须提取需求中的业务对象、筛选条件、时间范围、字段需求
- 必须使用表格形式列出提取的内容
- 必须标识哪些是已知概念,哪些是需要确认的概念
- 必须使用表格形式列出期望的结果
2. 业务知识搜索:
- 必须在领域知识文档(domain-knowledge.md)中搜索关键的表和字段 "关键词1|关键词2|关键词3"
- 必须记录相关的业务定义、业务表、判断条件
- 必须整理并输出所有找到的信息,表名加粗显示
3. 信息汇总与缺口识别:
- 必须列出:已知信息(表名、字段、条件)和未知信息(缺失表、缺失字段、未明确条件)
- 必须标记探索优先级:高(影响查询成败)、中(影响结果准确性)、低(可选)
4. 数据探索-表结构:
- 对每个相关表必须执行:`node index.js table-info "table_name"`
- 必须记录:主键、关键业务字段、索引字段、字段备注、表注释、表行数
- 如发现关键字段缺失,必须使用 metadata 搜索替代表:`node index.js metadata "业务"`
- 禁止使用 query 工具探索表结构
5. 数据探索-数据验证:
- 必须对每个关键表执行:`node index.js query "SELECT * FROM table_name WHERE 时间字段 >= '最近一天日期' AND 时间字段 < '最近一天日期+1' ORDER BY 主键字段 DESC LIMIT 3"`
- 必须验证关键字段值:`node index.js query "SELECT DISTINCT 关键字段 FROM table_name WHERE 时间字段 >= '最近一天日期' AND 时间字段 < '最近一天日期+1' LIMIT 10"`
- 必须检查日期格式:`node index.js query "SELECT DISTINCT DATE_FORMAT(时间字段, '%Y-%m-%d') FROM table_name WHERE 时间字段 >= '最近一天日期' AND 时间字段 < '最近三天日期' LIMIT 5"`
- 所有查询必须包含时间范围,从最小开始,如果没有数据,逐步放大:1天→1周→1个月
- 禁止在验证数据阶段使用聚合函数和GROUP BY、Order By语句
- 禁止执行无时间限制的查询
6. 查询构建-单表筛选:
- 只有在无数据时才扩大时间范围,有数据则继续添加其他筛选条件
- 必须逐个添加条件并验证:`node index.js query "SELECT * FROM table_name WHERE 条件1 AND 条件2 LIMIT 5"`
- 只在必要时使用COUNT:`node index.js query "SELECT COUNT(1) FROM table_name WHERE conditions"`
7. 查询构建-表关联:
- 必须在关联前记录各表行数:`node index.js table-info "table_name"`
- 只有在无数据或数据不足以验证关联正确性时才扩大时间范围
- 如关联后返回结果异常,必须立即停止并检查关联条件
- 必须确保:小表(行数少的表)在FROM,大表(行数多的表)在JOIN
8. 查询构建-聚合计算:
- 只有在无数据或数据不足以验证聚合结果正确性时才扩大时间范围
- 在添加GROUP BY前验证:`node index.js query "SELECT * FROM base_query LIMIT 5"`
- 验证聚合计算的合理性:`node index.js query "SELECT 维度字段, COUNT(1) FROM base_query GROUP BY 维度字段 LIMIT 10"`
9. 结果完整性验证:
- 必须检查结果是否涵盖所有需求维度
- 必须确认各维度汇总数据与总量的一致性
- 必须验证结果集中是否存在意外的空值或异常值
- 必须与原始需求进行对照,确保所有问题都已解答
10. 最终查询与验证:
- 必须为最终SQL添加注释:说明业务逻辑、特殊处理、预估结果集大小
# example
input: 统计2024年每月使用储值支付换货订单数量
## 1. 需求解构
|组成部分|内容|是否需要确认|
|-------|-------|-------|
|业务对象|换货订单|需要确认判断条件|
|筛选条件|储值支付|需要确认判断条件|
|时间范围|2024年每月|已知|
|需求指标|订单数量|已知|
期望的结果表格形式:
┌────────┬────────────┬────────────┬──────────┐
│ 月份 │ 网店换货数 │ 门店换货数 │ 总换货数 │
├────────┼────────────┼────────────┼──────────┤
│ 2024-01│ 123 │ 456 │ 789 │
└────────┴────────────┴────────────┴──────────┘
## 2. 业务知识搜索
执行: `grep -i "换货\|储值\|支付\|订单" domain-knowledge.md`
结果整理:
- 换货订单:
* 门店: ods.exchange.order_no
* 网店: dw.refund.refund_demand=3
- 订单信息: dw.order
- 储值支付: 未找到直接定义,需进一步探索
## 3. 信息汇总与缺口识别d
已知信息:
- 换货订单判断方式(门店和网店不同)
- 订单主表: dw.order
- 时间范围: 2024年全年按月统计
未知信息(优先级):
- 储值支付的判断条件(高): 需要确定字段和值
- 订单表中的时间字段(高): 需确认用于按月统计的日期字段
- 不同订单表之间的关联关系(高): 如何关联门店和网店订单
## 4. 数据探索-表结构
执行: `node index.js table-info "dw.order"`
执行: `node index.js table-info "dw.refund"`
执行: `node index.js table-info "ods.exchange"`
关键发现:
- dw.order:
* 主键: order_id 订单id
* 时间字段: created_time 订单创建时间
* 支付相关字段:
字段名|备注|业务口径
tc_pay_tool_id|支付工具id|查看dw.pay_tool 维表 标记支付、储值支付等信息
payment_type|支付类型|
pay_type|支付方式|
order_extra|订单扩展信息|
- ods.exchange:
* 主键: id 数据库自增id
* 关联字段: order_no 订单id
* 时间字段: created_at 换货订单创建时间
关键字段备注了新表:
- dw.pay_tool 支付工具扩展表
执行: `node index.js table-info "dw.pay_tool"`
关键发现:
- 支付工具id: tc_pay_tool_id
- 支付工具名称: tc_pay_tool_name
## 5. 数据探索-数据验证
执行: `node index.js query "SELECT tc_pay_tool_id, tc_pay_tool_name FROM dw.pay_tool Where tc_pay_tool_name like '%储值%' limit 10"`
结果: 储值支付工具名称包含"储值" (根据实际情况)
---- 返回结果
tc_pay_tool_id|tc_pay_tool_name
1|储值支付
2|储值卡
3|赠送储值
4|会员储值
---
验证日期格式:
执行: `node index.js query "SELECT DISTINCT DATE_FORMAT(created_time, 'yyyy-MM-dd') FROM dw.order LIMIT 5"`
从最小时间范围开始查询:
执行: `node index.js query "SELECT * FROM dw.order WHERE created_time >= '2024-01-01' AND created_time < '2024-01-02' LIMIT 5"`
结果: 0条记录 - 没有数据,需要扩大时间范围
扩大时间范围:
执行: `node index.js query "SELECT * FROM dw.order WHERE created_time >= '2024-01-01' AND created_time < '2024-01-08' LIMIT 5"`
结果: 5条记录 - 找到数据,可以继续下一步
## 6. 查询构建-单表筛选
先用最小时间范围验证换货订单:
执行: `<<SQL>>`
结果: 2条记录 - 有数据,无需扩大时间范围
验证储值支付订单内容(同样使用小时间范围):
执行: `<<SQL>>`
结果: 5条记录 - 有数据,无需扩大时间范围
添加多个筛选条件:
执行: `<<SQL>>`
结果: 3条记录 - 条件筛选符合预期
## 7. 查询构建-表关联
使用最小时间范围验证表关联:
执行: `<<SQL>>`
结果: 3条记录 - 有足够数据验证关联正确性,关联没有产生笛卡尔积
验证关联结果与预期一致,无需扩大时间范围,可以继续下一步。
## 8. 查询构建-聚合计算
先用最小时间范围验证聚合:
执行: `<<SQL>>`
结果: 3条记录 - 有足够数据验证聚合计算,无需扩大时间范围
验证按月聚合的正确性(全期间):
执行: `<<SQL>>`
结果: 12条记录(1-12月),行数合理
## 9. 结果完整性验证
-- 2024年每月使用储值支付的换货订单数量统计
-- 业务定义: 换货订单(refund_demand=3)且使用储值支付(tc_pay_tool_id in (1,2,3,4))
<<SQL>>
action:
1. 维度缺失,没有统计门店渠道的换货订单
2. 回到数据探索-表结构步骤,增加门店渠道的统计。
## 10. 最终查询与验证
-- 最终查询SQL,需要使用中文列名展示,并分页拉取数据
-- 业务定义: 统计2024年每月使用储值支付的换货订单数量,区分网店和门店
<<SQL>>
# tool-use
## query
> 执行SQL, 并保存结果到csv中, 所以不需要再导出数据了。
* base case ,SQL不允许包含换行符 `node index.js query "SELECT * FROM dw.orders LIMIT 10"`
* 执行带中文列名的SQL, 使用safe-alias选项 `node index.js query "SELECT field1 AS col1, field2 AS col2 FROM table" --safe-alias '{"col1":"中文名1","col2":"中文名2"}'`
* 执行key-set分页查询,SQL中需要添加占位符#{field},再指定排序字段和最大行数 `node index.js query "SELECT * FROM table WHERE id > #{id} ORDER BY id" --key-set-by 'id' --max-rows 3000`
## table-info
* 获取表结构 `node index.js table-info "dw.orders"`
## metadata
* 按业务分类搜索表名, 禁止连接head命令, `node index.js metadata "订单"`
## viz-sql
> 对SQL查询结果生成数据摘要并创建可视化图表,必须指定分组字段和度量字段
* 基本用法 `node index.js viz-sql <CSV文件路径> --group-by <分组字段> --measure <度量字段> --aggregation sum --type bar`
* 自定义图表 `node index.js viz-sql <CSV文件路径> --group-by <分组字段> --measure <度量字段> --aggregation avg --type line --title "标题" --x-axis-title "X轴" --y-axis-title "Y轴"`
* 支持的聚合方式: sum, avg, count, min, max
* 支持的图表类型: bar, line, pie, doughnut
<!--
- 文档规范
- 二级标题是业务域, 三级标题是子业务功能
- 参考现有格式增加新内容,主要描述这块业务的表和判断字段, 包括但不限于,文字描述、已有的SQL、代码片段。
-->
## 店铺
### 店铺知识
### 店铺表
### 渠道
## 交易
### 订单
#### 扩展字段 *extra*
#### 履约方式 (预订单)
#### 三方服务商配送方式
### 外卖通,三方订单
### 售后
- END -53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-06-20
超越Gemini和Qwen!3B小模型横扫中英文文档识别,表格公式识别提升超15%
2025-06-20
「LLM企业实战03」三大引擎对决:Ollama、Xinference与VLLM服务框架实测
2025-06-20
AI的认知象限:浅谈一下我们与AI的边界
2025-06-20
从模板到指标服务:解锁AI时代的数据新可能
2025-06-20
Al代码审查实践:从构想到快速落地
2025-06-20
AI智能地址识别实践:小帅的优化日记
2025-06-20
从概念到落地:有赞 Agent 应用与探索
2025-06-20
四大AI Agent平台横评:GPTBots、Dify、Coze、FastGPT谁更能打?
2025-05-29
2025-04-11
2025-04-01
2025-04-12
2025-04-29
2025-04-12
2025-04-06
2025-04-13
2025-04-15
2025-04-17
2025-06-20
2025-06-20
2025-06-19
2025-06-19
2025-06-18
2025-06-17
2025-06-17
2025-06-16