【S1W3 交叉评测】AdPilot 广告投放助手 — 评测意见 #2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
AdPilot 项目交叉评测报告
1. 技术架构评估
1.1 架构设计文档质量 ★★★★☆
AdPilot 的文档体系非常完整,呈现出清晰的三层架构设计:
docs/ARCHITECTURE.zh-CN.md(L9-59)docs/SPECS.zh-CN.md(L94-153)docs/ROADMAP.zh-CN.md(L7-30)架构文档中描述的核心设计决策(
docs/ARCHITECTURE.zh-CN.mdL84-89):backend/config.pyL6-8),未见适配器抽象frontend/index.htmlL251, L286-287)backend/agent/core.pyL155-181),非文档描述的 Router 模式1.2 实际代码架构 ★★★☆☆
项目实际代码结构清晰,模块分离合理:
亮点:
backend/agent/core.pyL20-204:Agent 核心实现了完整的 OpenAI-compatible function calling 流程,工具定义(L33-133)→ LLM 调用(L136-141)→ 工具执行(L146-187)→ 最终回复(L189-193)backend/skills/ad_ops.pyL62-106:_fetch_performance方法体现了"智能数据层"核心理念——从 Mock API 获取基础指标(spend/clicks/impressions),本地计算派生指标(ROAS、CPC、CTR、CVR、ROI),这是 AdPilot 相比浏览器 UI 节省 100 倍数据量的关键设计不足:
Skill 路由是硬编码的 if/elif(
backend/agent/core.pyL155-181),与文档描述的"Skill Router"模式差距大:文档声称的 9 个 Skill 实际只实现了 2 个:
docs/ARCHITECTURE.zh-CN.mdL27-36 列出 S1-S9 共 9 个 Skill,但代码中仅有ad_ops.py和account_acquisition.py,缺失:效果查询(独立 Skill)、ML 预测、规则自动化、报告生成、账户评估、用户反馈技术栈与文档不符:
docs/ARCHITECTURE.zh-CN.mdL188-190 声称前端技术栈为 "React 18+, TypeScript, Vite",实际frontend/index.html是一个 396 行的单个 HTML 文件,使用原生 JavaScript + Chart.js CDNMongoDB 未实际使用:
compose.ymlL3、backend/config.pyL16 和backend/pyproject.tomlL12-13 均配置了 MongoDB/Beanie,但代码中data_layer/sync_service.pyL11-12 的db参数始终为 None,无任何 MongoDB 读写操作智能数据层核心能力未实现:文档描述的增量同步调度器(
docs/ARCHITECTURE.zh-CN.mdL41)、TTL 响应缓存(L40)、非高峰调度策略(L154-158)在代码中均无对应实现。SyncService(backend/data_layer/sync_service.py)仅生成随机模拟历史数据2. 广告投放业务闭环评估
2.1 已实现的业务能力
根据
docs/WAVE2_USE_CASES.zh-CN.md(L43-50) 的能力矩阵和实际代码验证:get_my_ad_accountsGET /mock/fb/v21.0/me/adaccountsad_ops.pyL14-41;mock_platforms.pyL9-17get_ad_performanceGET /mock/fb/v21.0/{ad_id}/insightsad_ops.pyL43-49;mock_platforms.pyL27-44create_campaignPOST /mock/fb/v21.0/{account_id}/campaignsad_ops.pyL110-125;mock_platforms.pyL19-25update_ad_budgetPOST /mock/fb/v21.0/{ad_id}ad_ops.pyL127-143;mock_platforms.pyL46-52get_account_balanceGET /mock/fb/v21.0/{account_id}?fields=balancead_ops.pyL145-160;mock_platforms.pyL54-61get_required_materialsaccount_acquisition.pyL31-45check_website_complianceaccount_acquisition.pyL47-75get_account_performanceGET /mock/fb/v21.0/{account_id}/insightsad_ops.pyL51-60pause_adad_ops.pyL162-1702.2 业务闭环完整度 ★★★☆☆
已实现的核心闭环:查询账户 → 查看效果 → 创建广告 → 调整预算 → 查询余额
这覆盖了
docs/USER_SCENARIOS.zh-CN.md中 5 个场景中的 2 个半:rule_automationSkill关键缺失:
广告创建过于简化(
backend/skills/ad_ops.pyL110-125):create_campaign仅接受account_id、budget、product_desc三个参数,缺少定向参数(地区、年龄、性别、兴趣)、广告素材、出价策略、投放目标等。Mock API(backend/api/mock_platforms.pyL19-25)也仅返回随机 ID,不做任何参数校验。这远未达到文档描述的 "Campaign → AdSet → Ad 三级创建" 闭环无批量操作能力:场景五(创建 5 个 Campaign × 10 个 Ad)需要批量创建,当前代码无任何批量支持
派生指标计算存在 Bug(
backend/skills/ad_ops.pyL78-81):Mock 数据中
value字段存的是转化数而非收入金额(mock_platforms.pyL42:"value": str(conversions)),导致 revenue 永远等于 conversions 值,ROAS/ROI 计算失去意义。此外,多个 action 时会被覆盖只保留最后一个预算调整逻辑硬编码(
backend/skills/ad_ops.pyL138-139):假设基础预算固定为 $100,而非从实际广告获取当前预算,在生产环境中会导致预算设置错误
3. Agent/Skill 设计评估
3.1 Agent 设计 ★★★☆☆
Function Calling 模式(
backend/agent/core.pyL33-133):Agent 通过 OpenAI-compatible function calling 实现意图识别与工具调用,定义了 7 个 tool:get_my_ad_accounts— 查询广告账户列表get_account_performance— 账号级表现create_campaign— 创建广告活动update_ad_budget— 调整预算get_account_balance— 余额查询get_required_materials— 开户材料清单get_ad_performance— 单广告效果优点:
AsyncOpenAI兼容接口绑定 Stepfun,core.pyL12-15),切换模型只需改配置不足:
Tool 定义与 Skill 实现耦合松散:Agent 中定义 tool schema 是手动 JSON,而非从 Skill 元数据自动生成。文档描述的 Skill 模块化设计(
docs/ARCHITECTURE.zh-CN.mdL97-108)——每个 Skill 自带 metadata(name, description, parameters)——未实现无意图分类/任务分解:Agent 完全依赖 LLM 的 function calling 做判断,没有文档描述的 "Intent Parsing → Classify → Route" 流水线(
docs/ARCHITECTURE.zh-CN.mdL64-80)无真实对话记忆:记忆仅靠前端传递 history 数组(
frontend/index.htmlL286-287),Agent 内部无记忆管理。这意味着长时间对话会因 context window 限制丢失早期上下文3.2 Skill 设计 ★★★☆☆
AdOpsSkill(
backend/skills/ad_ops.py):/mock/fb/前缀来修正 URL,在生产环境切换真实 API 时容易出错。应使用 adapter 模式AccountAcquisitionSkill(
backend/skills/account_acquisition.py):get_required_materials提供了详细的开户指引和代理商推荐(L44)check_website_compliance方法未被任何 Agent tool 注册,无法通过对话触发3.3 Mock 平台层 ★★★★☆
backend/api/mock_platforms.py(L1-76) 设计良好:actions数组、account_status等)POST /mock/fb/v21.0/{account_id}/campaigns(L19-25) 未使用请求 body 中的budget和desc参数,无法验证 Skill 传入的参数4. 工程化水平评估
4.1 代码质量 ★★★☆☆
Dict[str, Any]等泛型,但无 Pydantic model 定义 API 契约{"error": "..."}dict,无统一异常类型backend/config.pyL1-23)具体问题:
无 Pydantic 模型定义:API 请求/响应无 schema 验证。
main.pyL36 用Dict = Body(...)裸接收。Skill 返回值全为Dict[str, Any],无类型安全测试极简(
backend/tests/test_scenarios.pyL1-68):test_api.py仅 2 个测试用例,同样是 print-only代码重复:
ad_ops.py中 URL 拼装逻辑在get_my_ad_accounts(L17-23)、get_account_performance(L53-58)、create_campaign(L112-117)、update_ad_budget(L129-134)、get_account_balance(L147-152) 中重复出现 5 次无日志系统:整个项目无任何 logging 调用,生产环境排查困难
4.2 部署与运维 ★★★☆☆
Dockerfile(L1-20):Python 3.12-slim 基础镜像,合理分层(依赖安装 → 源码拷贝)compose.yml(L1-35):MongoDB + Agent 双容器编排.env文件但项目中.env未被纳入版本管理(容器内依赖但未通过环境变量注入)——compose.yml 仅传了MONGODB_URL4.3 前端实现 ★★★☆☆
frontend/index.html(L1-396):单个 HTML 文件实现聊天界面 + 数据看板:5. 综合评估与建议
5.1 总体评分
5.2 核心优势
问题定义精准:AdPilot 聚焦跨境电商广告主的真实痛点(跨境网络慢、平台 UI 臃肿、时区浪费),产品定位清晰。
docs/SPECS.zh-CN.mdL19-27 对痛点的分析具体且有数据支撑(5-8 MB vs 50 KB,5-15s vs <1s)智能数据层理念正确:本地计算派生指标而非请求平台已计算好的指标——这是 AdPilot 相比浏览器 UI 可实现 100x 数据量缩减的关键技术差异化(
docs/SPECS.zh-CN.mdL211-218)面向中国卖家的实用设计:
AccountAcquisitionSkill的开户材料清单(营业执照、独立站政策页面)、代理商推荐(蓝标/鲁班)体现了对目标用户群体的深度理解可演示性强:通过 Mock API 可以在无真实广告账号的情况下展示完整交互流程,Demo 已上线 https://ad-pilot.lprintf.com/
5.3 关键风险
文档与代码差距过大:文档描述的 9 个 Skill、ML 管线、React 前端、增量同步调度等在代码中均不存在。如果评委对照
docs/ARCHITECTURE.zh-CN.md审查代码,会发现大量落差。这是最大的扣分风险WAVE2_USE_CASES 标记"开发中"的功能过多(
docs/WAVE2_USE_CASES.zh-CN.mdL47-50):6 个核心场景中 4 个标记为 🚧,且提交截止临近时仍未完成无自动化/ML 能力:文档反复强调这是 AdPilot 的核心差异化(夜间守护、ROAS 预测、异常检测),但代码中完全没有实现。这使 AdPilot 目前更接近一个"API wrapper + Chat UI"而非 "AI Agent"
生产就绪度低:无日志、无监控、无真实数据库集成、无认证授权、错误处理粗糙
5.4 改进建议(按优先级)
P0 — 赛前必做:
ARCHITECTURE.zh-CN.md的技术栈声明,移除未实现的 React/TypeScript/Vite(L188-190),明确标注当前实现范围mock_platforms.pyL42 中value字段应为收入金额而非转化数create_campaign应支持定向参数(国家、年龄、性别),至少在前端请求中可传递P1 — 短期优化:
4. 抽象 Skill Registry:将
core.pyL155-181 的 if/elif 链替换为字典映射或注册表模式5. 实现至少 1 个自动化规则:展示 "花费>$X 且 ROAS<$Y 时暂停广告" 的规则引擎闭环
6. 添加 Pydantic schema:为
/chat接口和 Skill 返回值定义类型安全的请求/响应模型7. 添加日志:使用 Python logging 模块替代静默失败
P2 — 中期规划:
8. 集成 MongoDB:实现真实的缓存读写和增量同步
9. 重构前端:如计划使用 React,应开始迁移;如不计划,应更新文档声明
10. 补全 Skill:优先实现效果查询(独立)、报告生成、账户健康评估
5.5 结论
AdPilot 是一个方向正确、文档出色但代码实现尚在半途的项目。其核心洞察——通过 AI Agent + 精简 API 替代臃肿的广告平台 UI——抓住了跨境电商的真实痛点。文档体系完整(中英双语、mermaid 图表丰富),问题定义和产品思路清晰有力。
但 Wave 2 阶段的代码交付与 Wave 1 阶段的文档承诺之间存在显著落差:9 个 Skill 只实现了 2 个,ML 预测和自动化规则完全缺失,架构文档中的 React 前端实际上是一个单 HTML 文件。如果评委严格对照文档审查代码,项目将面临严重的"过度承诺"扣分。
建议在答辩中坦诚说明当前为原型验证阶段(README 中已有的 "Prototype Phase Note"),并重点展示已实现的端到端闭环(查账户→看效果→建广告→调预算→查余额)以及智能数据层的本地派生计算理念,而非过度强调文档中尚未实现的高级功能。
收到,感谢您的详细评审。目前ml预测规则,自动化,数据缓存等功能在依然停留在旧传统项目中,未集成到agent中,后续会根据建议补充完善项目。