面向电商经营场景的智能经营分析 Agent
业务方问一个数要等数据同学排期;同一指标在不同报表里口径不一致,对数靠人工核对;大模型直接生成 SQL 既不可信、也过不了数据权限。日报长期靠人工拼表。
核心开发,5 人团队里后端 2 人之一。独立负责四块:RAG 检索链路、指标语义层、缓存与并发控制、LangGraph 编排;并落地 AST 白名单与权限下推的安全校验。
已上线交付业务方日常使用——智能问数、自动日报、异动归因、渠道诊断四类场景跑在真实业务数据上,覆盖运营 / 主管 / 分析师 / 经理四类角色;日报从人工拼表变成系统内直接出。
▸展开:架构 · 我负责的四块 · 三次真实故障
我负责的四块
- RAG 检索链路:以字段元数据、Few-shot 用例、指标别名三类向量集合(67 / 104 / 74 条)为检索源,最小检索单元是「一个字段 / 一条用例 / 一个别名」;用 Join 图 BFS 最小边集补全多表拓扑,用粒度对齐防止一对多 JOIN 把金额放大;以 score_threshold + payload 过滤 + 业务优先级剪枝替代两阶段 rerank,省掉一次模型调用。
- 指标语义层:12 个核心指标的口径(公式 / 过滤条件 / 时间归属 / 可用维度 / 权限标签)配置化落库,由统一取数规划器翻译成只读 SQL——口径变更不发版,代码侧零硬编码公式。
- 缓存与并发:缓存键强制包含权限范围哈希(否则 A 用户的结果会被 B 用户命中,这是最典型的数据泄露路径);single-flight 请求合并削峰;分布式锁 SET NX PX 原子获取 + Lua 校验持有者删除 + 长任务按锁时长 1/3 续期;「锁 + 幂等表」双层保证日报推送幂等。
- 多智能体编排:LangGraph StateGraph 把 15 节点主链路固化为代码控制流(仅 5 处条件边),取代自由 Agent 循环;会话状态经 Checkpointer 持久化。
三次真实故障(比成绩更能说明做事方式)
一次异动归因,系统把主因算到了品类上,与业务判断对不上。根因:品类维度 JOIN 明细表后仍沿用订单级金额求和,一个订单含多商品时金额被重复累加——数字量级「看起来像那么回事」、不报错,只有排名异常才暴露。改为明细金额聚合,并用造数保证「明细金额之和 == 订单实付金额」,实测整月差值 0。
根因是校验脚本自己拼了一遍权限条件再比数字——测试复述了设计意图,没有断言真实路径。重写为 28 个越权用例直接检查权限改写函数的产出,第一次运行就抓出 4 个真实缺陷,最终 100% 拦截。
声明为 async 的函数内部执行同步阻塞调用,事件循环被拖死——「看起来并发的代码」实际完全不并发。重建并发链路后 P95 从 26.6 s 降到 4.18 s,压测另外抓出 3 个并发缺陷。
一句话说清技术选型
- 为什么不用自由 Agent
- 业务链路固定,自由循环换来的是不可复现的失败;固化成状态机后每一次失败都能重放到具体节点。
- 为什么不让模型写 SQL
- 模型负责「理解问题 + 拼装结构」,SQL 由语义层编译;模型输出永远不直接进执行路径。
- 为什么不做 rerank
- 结构化检索的候选集很小且带业务标签,阈值 + payload 过滤已足够,省一次模型调用的延迟与成本。