链载Ai

标题: Cursor-Agent 实战:构建端到端自动化取数工具的探索与思考 [打印本页]

作者: 链载Ai    时间: 昨天 18:43
标题: Cursor-Agent 实战:构建端到端自动化取数工具的探索与思考

在数据驱动的时代,快速、准确地获取数据是企业决策和业务发展的基石。然而,对于许多技术团队而言,日常的取数工作往往充满了挑战,耗时耗力。

我们团队也曾深陷其中,直到开始探索 AI Agent 在这一领域的应用,特别是通过实践 Cursor-Agent,我们看到了一条从手动取数到自动化"数据大师"的进化之路。

1. 取数之痛与 LLM 的"未尽全功"?

1.1 取数需要排期?


日常取数的问题

1.2 LLM 提高了效率,但"最后一公里"仍是挑战

近年来,大型语言模型(LLM)如 ChatGPT、Claude 在 SQL 生成方面展现了惊人能力,确实在一定程度上提升了效率。比如,我们可以将需求"统计不同商家类目在新渠道订单量、GMV" 输入给LLM,它能快速给出一个SQL草稿。

然而,我们很快发现,LLM 距离真正的"全自动化"取数还有关键的"最后一公里":

我们意识到,我们需要的不只是一个"SQL代码生成器",而是一个能够理解需求、规划步骤、与真实数据环境交互、处理反馈并自主完成任务的智能体 (Agent)

2. 新思路:基于 Cursor-Agent 的端到端自动化实践

正是在这样的背景下,我们开始探索和实践 Cursor-Agent。基于 Cursor-Agent 构建了一套完整的 Agentic Workflow,旨在实现从需求输入到结果输出的端到端自动化。

2.1 视频演示 📢📢📢

这里使用测试库表演示 Agent 处理数据需求的能力


Agent 数据权限说明

2.2 核心优势

3. 整体架构与核心组件

3.1 整体架构


3.2 Cursor-Agent 介绍

3.3 灵魂所在:.cursorrules (指令与流程引擎)

核心作用

.cursorrules的内容是领域知识的重要组成部分, 是 Agent 的行动指南和思考框架,它包含了一系列预设的规则、指令、流程和技巧, 其中最重要的工作流部分是来自于编写SQL的真实流程和最佳实践

.cursorrules 核心结构

具体内容见底部附录

# role
# workflow
# instruction
# checkpoint-validation
# troubleshooting-guide
# performance-tips
# tool-use
# example

3.4 连接现实:本地工具 (Local Tools)

核心作用

作为 Agent 的"手脚",Local Tools (主要是Node.js脚本) 负责与真实数据环境交互。

3.5 快速索引:知识库

核心作用

由于数据平台的一些现存问题,导致 Agent 直接访问数据平台获取数据定义时,内容是有缺失的,从而导致查询效率非常低,甚至陷入死循环中。

所以知识库的出现是对数据平台数据定义的补充, 为 Agent 提供领域相关的知识, 加快 Agent 解决需求的速度

举例数据定义的一些缺陷

1. 字段值域定义的缺失

2. JSON/TEXT字段内容结构缺失

3. 表名、指标搜索能力不足

领域知识文档通过 Markdown 格式组织业务、技术知识, 目前来看,最重要内容是:

具体内容见底部附录

4. 我们的探索与进化

我们的 Agent 并非一蹴而就,而是经历了一个不断探索、试错和优化的迭代过程,每个版本都带来了能力的提升和体验的优化。

迭代花絮 (V0.1 -> V0.4)

v0.1

v0.2 顿悟时刻

v0.3

v0.4 技术预览版

迭代过程中最核心的问题

思前想后,最核心的问题应该是 Agent 行为可控性,它直接关乎项目能否成功。 而其他的也非常重要的问题, 业务理解能力、执行效率、性能等都可以根据工程经验优化,但这些优化生效的前提是Agent要"听话", 如果它不按照你精心设计的规则和策略执行,那么再好的优化策略也没用,再完善的知识库也发挥不了作用。

在 v0.3 时, Agent 的表现尽管已经非常智能, 可以0干预处理简单的查询需求,但是稍微复杂的需求,执行流程有很大随机性,它不完全按预设指令行动,可能导致最终结果有错误,甚至陷入逻辑死循环中,跑不出最终结果。

解决办法:cursorrules (workflow + example)

5. 展望:产品化的可能

通过在 Cursor-Agent 上的实践,我们坚信 AI Agent 将在数据处理领域扮演越来越重要的角色。特别是,与业务功能的深度融合方面,Agent 的角色将从单纯的取数工具,向更广泛的业务流程延伸,同时将突破现有的产品交互形式,迈向更智能、更自然的人机协作模式。

  1. 交互形式的根本转变:从UI操作到自然对话;告别复杂的下拉菜单和指标筛选,用户只需在客户端说"看下某商品在各渠道一个月的销售情况",
  2. 图表解读的突破:任何图表都能继续追问和深度分析针对近期的用户漏斗图,用户可以继续问"为什么第3天流失这么严重?"
  3. 决策辅助升级:从数据展示到行动建议不再只是告诉你"这周GMV下降了20%",而是直接给出建议:"主要因为A款T恤库存不足,检测到近3天有126人浏览但因缺货未下单,预计损失订单金额1.8万元。建议立即补货"。

如果要完成未来的产品化,肯定要脱离 Cursor-Agent,基于通用的 LLM API 或开源 Agent 框架进行二次开发,构建更开放、更易于集成的 Agent 服务。这无疑会带来更大的想象空间,但也需要攻克模型适配、提示词优化、上下文存储优化、垂直知识库高效集成等技术挑战。

6. 思考:技术变革的焦虑与兴奋

技术发展太快,早期积累的工程优势,在下一阶段变革到来时,往往顷刻化为乌有,甚至成为前进的桎梏。 LLM/Agent 领域的发展速度令人咋舌,技术项目的生命周期被极度压缩。

几周就是一个时代

技术积累的脆弱性

更深层的思考

当我们还在为这个月的技术选择沾沾自喜时,下个月可能就需要完全推倒重来。这既让人焦虑,也让人兴奋 - 这就是我们所处的时代。

7. 附录

cursorrules 片段 - workflow

# 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添加注释:说明业务逻辑、特殊处理、预估结果集大小

cursorrules 片段 - example

# 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>>

cursorrules 片段 - tool-use

# 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

领域知识.md 片段

<!--
- 文档规范
- 二级标题是业务域, 三级标题是子业务功能
- 参考现有格式增加新内容,主要描述这块业务的表和判断字段, 包括但不限于,文字描述、已有的SQL、代码片段。
-->

## 店铺
### 店铺知识
### 店铺表
### 渠道

## 交易
### 订单
#### 扩展字段 *extra*
#### 履约方式 (预订单)
#### 三方服务商配送方式
### 外卖通,三方订单
### 售后
- END -






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5