AI图鉴

AI图鉴首页 › AI 资讯 › 16-Agent实战:生鲜超市 52 周 MD 与智慧出清

16-Agent实战:生鲜超市 52 周 MD 与智慧出清

来源:掘金 · 发布时间:11-01 · 由 AI图鉴每小时自动聚合

前 15 篇把 Agent 的单点能力逐个拆开讲解:从跑通第一个 Agent、工具调用、结构化输出,到 PlanMode、记忆与 RAG,再到多 Agent、MCP、A2A,最后是 HarnessAg

系列第 16 篇 · 实战篇

前 15 篇把 Agent 的单点能力逐个拆开讲解:从跑通第一个 Agent、工具调用、结构化输出,到 PlanMode、记忆与 RAG,再到多 Agent、MCP、A2A,最后是 HarnessAgent、Workspace、Context 与权限容错可观测。但"零件齐全"不等于"装好能跑"——本篇要把它们串成一台真正的生产 Agent。

笔者从事软件行业多年,见过太多企业信息化建设的"拼凑"过程,拿传统零售商来说,ERP、CRM、WMS、电商中台由不同供应商拼装而成,数据模型和接口各说各话,要把它们打通、协同起来格外费劲。而这,恰恰是 Agent 最值得落地去解决的一类场景。

先介绍本文相关的两个真实零售场景,后续的实战将围绕这两个场景展开:

- 场景一 · 52 周 MD 周计划(以"周"为尺度的经营规划):店长一句话提出下一季度MD 诉求,Agent 以历史销量(同周同期、近周趋势)为实证基础,结合顾客生活节奏/季节/节气/节日/场景(辅以天气、客群、竞品情报),选出重点商品、产出周经营建议,并直接落实促销、生成文案、圈选会员。

- 场景二 · 智慧出清(以"日"为尺度的经营执行):每天傍晚闭店前的几个小时,是生鲜出清的主战场,Agent 需要按当晚天气、当日实时销售,并对照该品类历史销量(同天气/同时段去化基线),动态定出清折扣力度与最佳出清时段,落价前走人工确认。

一、项目背景与两个场景

1.1 零售信息化的"拼凑"现状

前面说的"拼凑",带来的不是某个单点问题,而是系统间天然异构、割裂:数据模型不一、接口协议各异、口径各说各话。门店想要"基于全局经营数据做一件小事"(比如选本周重点商品、定今晚出清折扣),都要先跨好几套系统取数、对齐、再判断。这件事人工做费时且靠经验,正好是 Agent + MCP 统一接入 + Harness 稳定编排最能发挥价值的地方。

1.2 场景一:52 周 MD 周计划

52 周 MD是生鲜超市以"年"为完整时间跨度的经营活动管理方法:把 1 年 52 周作为完整时间轴,根据顾客生活节奏、季节、节气、节日、场景,以周为单位推进执行,提前规划每周主推商品、陈列、促销、卖场主题,周周打造销售小高潮;采购‑营运‑营销‑门店全部门协同落地,并且每周复盘迭代优化。在这条时间轴上,重点商品的选择同样以时间为节点,结合顾客生活节奏、季节、节气、节日、场景等因素,选出既贴合消费者当下需求、又满足企业经营目标的商品,再据此安排一周的陈列、促销与营销。

一份 52 周 MD 周计划长这样:

本周(2026-W34,8 月第三周)52 周 MD

主轴:立秋末伏 · 开学前备货

历史销量参考:莲藕近 4 周周销 120kg、绿豆 90kg;去年同期(2025-W34)莲藕 +18%、绿豆 +12%——需求稳中有升

重点商品:

1. 应季鲜食:凉拌藕带、冰镇绿豆沙原料(莲藕 / 绿豆)—— 契合”立秋吃藕”习俗 + 高温消暑

2. 开学季组合:半成品早餐(馒头 / 包点)+ 学生奶 —— 临近开学,社区家庭客群

3. 社区中老年:低糖杂粮、时令梨(润燥)—— 客群画像驱动

经营建议:

- 陈列:入口端架做”开学早餐 + 消暑”主题堆头

- 促销:莲藕 / 绿豆组合 8.8 折,学生奶第二件半价

- 社群:周三推”立秋养生”文案,圈选 25–45 岁家庭会员

1.3 场景二:智慧出清

生鲜保质期短,闭店前几小时把卖不动的货出清掉,是每家超市每天的"硬仗"。难点在于:折扣定深了亏毛利,定浅了卖不完报损;时段定早了扰乱正价,定晚了来不及。智慧出清的做法是——每天傍晚闭店前数小时,依据当晚天气(影响客流)、当日实时销售(剩余库存与动销率),并对照该品类历史销量(同天气 / 同时段的常规去化水平)设定合理去化基线,动态算出出清折扣力度与最佳出清时间段,落价前交店长确认。

一份出清方案长这样:

闭店前 3 小时出清方案(当日 19:00 触发)

天气:阵雨转凉,晚高峰客流回落

实时动销:叶菜售出率 62%(剩 38kg)、鲜奶售出率 55%(剩 120 盒)

历史参考:叶菜近 7 日同天气傍晚 21:00 前平均去化 78%,今晚 21:00 前预计仅能去化 55% → 需加深折扣

建议:

- 叶菜:20:30 起 7 折,21:00(闭店前 1h)起 5 折清完

- 鲜奶:20:00 起第二件 1 元,21:00 起 6 折

预估:较店长经验出清,动销去化 +12%,报损 -15%

1.4 两个场景的关系

| 维度 | 场景一 · 52 周 MD(周) | 场景二 · 智慧出清(日) | | --- | --- | --- | | 经营尺度 | 周计划,事前规划 | 日执行,事中应变 | | 触发方式 | 主动提出 / 按周定时 | 每天傍晚定时 | | 核心输入 | 历史销量 / 行事历 / 节气 / 天气 / 客群 / 竞品 | 当晚天气 / 历史销量(同天气同时段基线) / 当日实时销售 / 闭店倒计时 | | 核心产出 | 重点商品 + 经营建议 + 促销 / 文案 / 圈选 | 出清折扣力度 + 出清时段 + 降价 | | 是否写操作 | 是(创建促销 / 发券) | 是(执行降价) | | 都需要 | 意图识别、MCP 取数、权限确认、可观测 | 意图识别、MCP 取数、权限确认、可观测 |

二、遗留问题与解决思路

|

遗留疑难问题

|

根因

|

AgentScope 解法(由 Harness 统一编排)

|

| --- | --- | --- |

|

重点商品选品靠经验、常脱节时令

|

选品凭经验,难系统结合节气 / 天气 / 客群 / 竞品

|

MCP 取行事历 / 节气 / 天气 / 会员 / 竞品情报,Agent 生成 52 周 MD 周计划

|

|

促销活动效果难评估

|

多系统数据割裂,口径不一

|

MCP 统一取数,结构化输出算 ROI,LLM 生成归因报告

|

|

会员触达不精准

|

标签分散、画像陈旧

|

Agent 检索长期记忆 + 生成个性化文案并圈选人群

|

|

营销内容产出慢、落地难

|

文案 / 促销方案靠人工,跨系统创建费时

|

多 Agent 生成文案与方案,执行专员经 HITL 创建促销、发放优惠券

|

|

生鲜出清靠拍脑袋、闭店前手忙脚乱

|

折扣与时段凭经验,不看实时天气与销售

|

MCP 取天气 + 当日实时销售,Agent 动态定出清折扣与时段,落价前走 HITL 确认

|

|

数据权限混乱

|

各系统自建权限,越权风险

| PermissionEngine

四态 + 自定义 Middleware 工具级拦截

|

|

运营数据口径不一致

|

指标定义分散

|

口径沉淀为统一 @Tool 指标 API,Agent 只调用、不重算

|

三、总体架构设计

3.1 分层架构

采用分层 + 模块化架构:接入层把请求交给 HarnessAgent 做应用编排,MCP 作为基础设施集成协议。

┌─────────────────────────────────────────────────────────────┐

│ 接入层 / Interface │

│ REST API | WebSocket

└───────────────────────────┬─────────────────────────────────┘

│

┌───────────────────────────▼─────────────────────────────────┐

│ 应用编排层 / Application(HarnessAgent 运行层) │

│ HarnessAgent(编排总控) │

│ ├─ SubagentDeclaration:意图/选品规划/营销执行/出清专/权限 │

│ ├─ Toolkit:@Tool 业务工具 + 注册自零售 MCP Server 的工具 │

│ ├─ Middleware:权限拦截(RBAC/ABAC)+ OtelTracing 观测 │

│ └─ Plan Mode / Memory / Workspace / Sandbox │

└───────────────────────────┬─────────────────────────────────┘

│

┌───────────────────────────▼─────────────────────────────────┐

│ 业务服务层 / Service(@Tool 工具实现体,被 AgentScope 编排调用 │

│ 选品 / 营销 / 会员 等业务服务实现(经由 @Tool 暴露) │

└───────────────────────────┬─────────────────────────────────┘

│

┌───────────────────────────▼─────────────────────────────────┐

│ 基础设施层 / Infrastructure │

│ AgentScope-Java 2.0 Runtime | MCP Client/Server │

│ OpenTelemetry | Micrometer | Redis | DB │

│ Legacy ERP/WMS/POS/CRM 适配器 │

└─────────────────────────────────────────────────────────────┘

3.2 AgentScope-Java 2.0 提供了哪些支撑

- Agent 运行时:HarnessAgent 作为编排总控,内部用无状态的 ReActAgent 跑推理循环;多 Agent 用 SubagentDeclaration 声明式编排。

- LLM 接入:字符串模型 + ModelRegistry,如 "dashscope:qwen-max",自动读环境变量里的 Key。

- 工具抽象:@Tool + Toolkit 注册业务工具;结构化输出用 agent.call(msgs, Class, ctx)。

- MCP 支持:作为 MCP Client 调用外部 MCP Server(McpClientBuilder / workspace/tools.json);也可把内部能力暴露为 MCP Server。

- 可观测扩展点:Middleware 通道(5 个钩子:onAgent/onReasoning/onActing/onModelCall/onSystemPrompt)与内置 OtelTracingMiddleware,外加 streamEvents() 的 28 种类型化事件流。

- 与业务系统集成:自定义 @Tool、自定义 Middleware、自定义 Memory 都通过标准扩展点接入,确定性业务逻辑留在工具实现里。

3.3 编排总控:把多智能体、工具、中间件拼起来

使用HarnessAgent.builder() 把子 Agent、工具集(含 MCP)、中间件一次性挂上去,推理循环、多 Agent 调度、权限与观测全由框架接管。先声明五个专员(subAgent):

import io.agentscope.harness.HarnessAgent;

import io.agentscope.harness.agent.subagent.SubagentDeclaration;

// 意图专员:拿到结构化意图,决定走哪条业务线

SubagentDeclaration intentAgent = SubagentDeclaration.builder()

.name(”intent_agent”)

.description(”意图专员:把用户问句识别为 md_plan(规划)/ md_execute(落实)/ clearance(出清)/ query(问询)之一并抽取槽位”)

.inlineAgentsBody(”你是意图专员,只输出结构化意图与槽位,不展开业务计算。”)

.build();

// 选品规划专员:把复合 MD 诉求拆成有序步骤(如 选品规划 → 营销方案 → 落实执行)

SubagentDeclaration mdPlannerAgent = SubagentDeclaration.builder()

.name(”md_planner_agent”)

.description(”选品规划专员:以历史销量(同周同期、近周趋势)为实证基础,结合顾客生活节奏/季节/节气/节日/场景(辅以天气、客群、竞品情报),选出本周重点商品并产出 52 周 MD 周计划”)

.inlineAgentsBody(”你是选品规划专员,先取历史销量做需求基线(同周同期、近周趋势),再结合顾客生活节奏/季节/节气/节日/场景选重点商品,给出一周经营建议。”)

.build();

// 营销执行专员:持有 MCP + @Tool 工具集,生成文案并落地执行

SubagentDeclaration marketingAgent = SubagentDeclaration.builder()

.name(”marketing_agent”)

.description(”营销执行专员:调用 weather/calendar/member/competitor/promotion 等 MCP 工具,生成营销文案并创建促销、发放优惠券”)

.inlineAgentsBody(”你是营销执行专员,严格按步骤调用工具生成文案、创建促销与发券,不臆造数据。”)

.build();

// 出清专员:每天傍晚按天气与当日实时销售,动态定出生鲜出清折扣力度与最佳出清时间段

SubagentDeclaration clearanceAgent = SubagentDeclaration.builder()

.name(”clearance_agent”)

.description(”出清专员:调取 weather.query 与当日实时销售,对照该品类历史销量(同天气/同时段去化基线),结合闭店倒计时,给出生鲜出清折扣与最佳出清时段建议”)

.inlineAgentsBody(”你是出清专员,根据天气、实时动销、历史销量基线(同天气/同时段)与闭店剩余时间,给出折扣力度与出清时机,不臆造数据。”)

.build();

// 权限专员:调用前做 RBAC/ABAC 校验,高危操作发起 HITL 确认

SubagentDeclaration guardAgent = SubagentDeclaration.builder()

.name(”guard_agent”)

.description(”权限专员:对工具调用做权限与数据范围校验,越权或高危时要求人工确认”)

.inlineAgentsBody(”你是权限专员,任何调用前先校验角色与数据范围。”)

.build();

五个专员声明好后,用总控 Agent 把它们和工具集、中间件搭建好整个经营助手的完整骨架:

import io.agentscope.harness.HarnessAgent;

import io.agentscope.core.tool.Toolkit;

import io.agentscope.core.middleware.MiddlewareBase;

import io.agentscope.core.tracing.OtelTracingMiddleware;

import io.agentscope.core.memory.MemoryConfig;

import io.agentscope.core.context.CompactionConfig;

import io.agentscope.core.context.ToolResultEvictionConfig;

import java.nio.file.Path;

import java.util.List;

HarnessAgent assistant = HarnessAgent.builder()

.name(”store-ops-assistant”) // 总控(主编)

.model(”dashscope:qwen-max”)

.workspace(Path.of(”./store-ops-workspace”))

.sysPrompt(”””

你是门店经营智能助手的 52 周 MD 总控。流程:

1. agent_spawn intent_agent 识别意图(规划 or 落实 or 出清)与槽位;

2. agent_spawn md_planner_agent 先取历史销量做实证基线(同周同期、近周趋势),再结合顾客生活节奏/季节/节气/节日/场景(辅以天气、客群、竞品情报),选重点商品并出周计划;

3. agent_spawn marketing_agent 生成营销文案与促销方案,并调用工具落地;

4. 创建促销/发券等高危操作交给 guard_agent 校验,必要时发起人工确认;

5. 每天傍晚闭店前数小时,agent_spawn clearance_agent 按天气与实时销售动态定出清折扣与时段,落价前交 guard_agent 校验;

6. 汇总 52 周 MD 周计划与出清执行结果,输出可观测链路。

”””)

.subagent(intentAgent).subagent(mdPlannerAgent) // 多智能体声明式编排

.subagent(marketingAgent).subagent(clearanceAgent)

.subagent(guardAgent)

.toolkit(toolkit) // 已注册 MCP 工具 + @Tool 业务工具

.middlewares(List.of(

new PermissionMiddleware(rbacService), // 权限拦截

new OtelTracingMiddleware())) // 可观测

.memory(MemoryConfig.builder().build()) // 长期记忆

.compaction(CompactionConfig.builder()

.triggerMessages(30).keepMessages(10)

.truncateArgs(CompactionConfig.TruncateArgsConfig.builder()

.maxArgLength(2000).build()).build()) // 上下文工程

.toolResultEviction(ToolResultEvictionConfig.defaults()) // 大结果卸载

.build();

四、代码细化:两个场景的落地实现

第三章(3.3)已经把 HarnessAgent 总控、五个子 Agent 和 MCP 通路搭好,本章 4.4 给出 Harness 的装配代码,第五章再用运行时视角讲清一次请求在 Harness 里怎么流转。这一节不再罗列"能力有哪些",而是把两个场景真正写进代码:4.1、4.2 分别是 52 周 MD 与智慧出清的业务落地,4.3 是两个场景共用的能力模块(意图 / MCP / 权限 / 可观测 / 记忆)代码。读这段代码,你看到的就是门店助手每天在跑的东西——"为什么这么做"都写在注释里。

4.1 场景一:52 周 MD 周计划代码落地

一句话提出下季度 MD 诉求,Agent 要:识别意图 → 取历史销量做实证基线 → 结合节气 / 天气 / 客群 / 竞品选品 → 出周计划 → 落地促销与发券(人工确认)。业务落地代码如下:

// 场景一入口:店长提交 52 周 MD 周计划诉求

public Mono planWeeklyMd(String utterance, SessionContext ctx) {

// ① 意图识别(三层漏斗 + 结构化输出,见 4.3):把自然语言变成强类型意图,不让 LLM 自由发挥

IntentResult intent = intentAgent.call(

List.of(new UserMessage(”user”, utterance)),

IntentResult.class,

RuntimeContext.builder().sessionId(ctx.sid).userId(ctx.uid).build())

.block().getStructuredData(IntentResult.class);

// 预期 intent = { intent:”md_plan”, slots:{ week:”2026-W34”, season:”立秋”,

// weather:”高温”, segment:”社区中老年”, event:”开学季” } }

// ② 选品规划:交给 md_planner_agent,它在 4.3 注册好的 MCP 通路上取数

// —— 以「历史销量」为实证基线,不让模型凭空编选品;权限/数据范围由 PermissionMiddleware 在 onActing 拦截(见 4.3)

return mdPlannerAgent.call(

List.of(new UserMessage(”user”,

”为 ” + intent.slots.get(”week”) + ” 做 52 周 MD:” +

”先 sales.history 取同周同期+近周趋势,再 calendar.solar_terms 取节气、” +

”weather.query 取天气、member.segment 取客群、competitor.intel 取竞品,” +

”最后 md.weekly_plan 出周计划”)),

MdPlanReply.class,

RuntimeContext.builder().sessionId(ctx.sid).userId(ctx.uid).build())

.flatMap(reply -> {

MdPlanReply r = reply.getStructuredData(MdPlanReply.class);

// ③ 落地执行:营销执行专员创建促销 + 发券,属于高危写操作

// tools.json 已把 promotion.create / coupon.issue 标 ASK,框架调用前暂停并抛

// REQUIRE_USER_CONFIRM,前端用 getReplyId() 回传批准(见 4.3 权限 / 可观测)

marketingAgent.call(List.of(new UserMessage(”user”,

”基于周计划创建促销、生成社群文案、圈选会员:” + r.toBrief())),

Void.class, RuntimeContext.builder()

.sessionId(ctx.sid).userId(ctx.uid).build()).block();

// ④ 可观测:整条链路用 streamEvents 把工具调用/人工审批/文本增量实时流出(见 4.3)

return Mono.just(r);

});

}

选品工具本身用 @Tool 暴露,历史销量作为输入:

public class MdPlanningTools {

private final MdPlanningService mdService;

public MdPlanningTools(MdPlanningService svc) { this.mdService = svc; }

@Tool(name = ”md_weekly_plan”,

description = ”以历史销量(同周同期、近周趋势)为实证基础,结合时间节点(顾客生活节奏/季节/节气/节日/场景),为指定周生成 52 周 MD 重点商品与经营建议”)

public MdWeeklyPlanResult weeklyPlan(

@ToolParam(name = ”week”, description = ”ISO 周,如 '2026-W34'”) String week,

// 历史销量:指定周近 N 周销量与去年同期,用于实证选品与需求基线 —— 这是 52 周 MD 的”地基”

@ToolParam(name = ”historySales”, description = ”历史销量:同周同期/近周趋势,用于实证选品与需求基线”) String historySales,

@ToolParam(name = ”context”, description = ”上下文摘要:顾客生活节奏/季节/节气/节日/场景”) String context) {

return mdService.plan(new MdPlanCommand(week, historySales, context));

}

}

场"确定性"来自两点:选品有 sales.history 实证、落价有REQUIRE_USER_CONFIRM 把关。

4.2 场景二:智慧出清代码落地

每天傍晚闭店前的出清是"定时触发 + 实时应变":到点由调度器拉起,按当晚天气、当日实时销售,并对照该品类历史销量(同天气 / 同时段去化基线)动态定折扣与时段,落价前交店长确认。

// 场景二入口:调度器在闭店前 3 小时触发(cron / 调度框架),sessionId 固定便于崩溃恢复(见 4.3 记忆)

public Mono runClearance(SessionContext ctx) {

// ① 意图识别为 clearance(复用 4.3 同款三层漏斗),这里直接进入出清专员

return clearanceAgent.call(

List.of(new UserMessage(”user”,

”执行今晚出清:weather.query 取当晚天气,sales.history 取该品类同天气/同时段去化基线,” +

”sales.realtime 取当日实时动销,结合闭店倒计时算 出清折扣力度 与 最佳出清时段”)),

ClearanceReply.class,

RuntimeContext.builder()

.sessionId(”clearance-daily”) // 固定 sessionId:日清任务各自可恢复(保障三,见 4.3)

.userId(ctx.uid).build())

.flatMap(reply -> {

ClearanceReply r = reply.getStructuredData(ClearanceReply.class);

// ② 落价执行:clearance.apply 是高危写操作,tools.json 标 ASK,框架抛 REQUIRE_USER_CONFIRM,

// 等待店长在终端/App 确认(见 4.3 权限);折扣过深(< 6 折)时 PermissionMiddleware 还会要求区域经理审批

clearanceAgent.call(List.of(new UserMessage(”user”,

”按建议执行落价:” + r.toBrief())),

Void.class, RuntimeContext.builder()

.sessionId(”clearance-daily”).userId(ctx.uid).build()).block();

// ③ 可观测:出清全程 streamEvents 流出,落 AgentStateStore 可恢复(见 4.3)

return Mono.just(r);

});

}

出清的落价与建议同样用 @Tool 暴露,核心是"历史基线 + 实时动销 + 闭店倒计时"三者的差值决策:

public class ClearanceTools {

private final ClearanceService clearanceService;

public ClearanceTools(ClearanceService svc) { this.clearanceService = svc; }

@Tool(name = ”clearance_suggest”,

description = ”结合当晚天气、当日实时动销与历史销量(同天气/同时段去化基线)、闭店倒计时,给出生鲜出清折扣力度与最佳出清时段”)

public ClearanceSuggestion suggest(

@ToolParam(name

本文由 AI图鉴自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(juejin.cn)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI图鉴首页 · 提交工具 · 商务合作 · 关于本站 · 604 款 AI 工具分类导航 · 每日 AI 热门项目与动态