Skip to content

第 1 章:为什么不是普通聊天机器人

1. 先看业务问题

产品运营同学提了一个真实工作里很常见的需求:

text
帮我分析最近 7 天新用户留存下降的原因,并给我一份下周拉活活动方案。

如果我们把这句话直接丢给普通 ChatBot,它可能很快给出一段报告:

text
新用户留存下降可能和用户体验、渠道质量、活动吸引力有关。
建议优化新手引导,增加优惠券召回,并通过推送触达沉默用户。

这段话看起来像回事。

但产品运营真正会继续追问:

  • 你查了最近 7 天真实留存数据吗?
  • 是所有渠道都下降,还是某几个渠道下降?
  • 新用户激活率有没有一起下降?
  • 最近有没有改版、活动、投放或注册流程变化?
  • 历史上类似问题怎么处理?
  • 这个活动方案有没有合规风险?
  • 方案能不能保存,后续任务能不能创建?

普通 ChatBot 在这里就露馅了。

它能生成文字,但没有完成任务。

所以本章要先建立第一个核心判断:

text
产品运营要的不是一个会聊天的机器人,而是一个能围绕业务目标执行任务的 Agent 工作台。

2. 这一章为什么要学?

如果不先分清 ChatBot 和 Agent 工作台,后面代码会越写越偏。

常见错误是:

  • 接一个大模型接口,就以为做了 AI 系统。
  • 写几个 Prompt,就以为做了运营助手。
  • 模型能回答问题,就以为做了 Agent。

真实项目不是这样。

产品运营关心的是:

  • 数据准不准。
  • 分析有没有依据。
  • 方案能不能用。
  • 文案能不能直接改。
  • 风险有没有提醒。
  • 最后能不能形成报告。
  • 能不能少做重复劳动。

这些不是一个模型接口能单独解决的。

模型只是“语言理解和生成能力”。Agent 工作台还需要后端工具、知识库、权限、状态、流程和人工确认。

本章先把这个边界讲清楚。后面再接入 Spring AI Alibaba,才不会把系统写成“会聊天但不能办事”的 demo。

3. 这一章学完能做什么?

学完后,你能做到:

  1. 解释普通 ChatBot 为什么不能安全完成复杂运营任务。
  2. 说清楚 Agent 工作台需要补齐哪些后端能力。
  3. 跑通一个 JDK 17 + Spring Boot 接口,返回结构化业务分析。
  4. 看懂当前工程最小分层:apiapplicationdomain

本章不接入模型。

这不是偷懒,而是刻意设计。

第一章只解决边界问题:先知道为什么不能只靠 ChatBot,再进入模型调用。

4. 前置知识

需要:

  • JDK 17。
  • Maven。
  • Spring Boot 基础。
  • REST API 基础。
  • Java record。
  • Controller、Service、DTO 分层概念。

暂时不需要:

  • Spring AI Alibaba。
  • ChatClient。
  • Tool Calling。
  • MCP。
  • RAG。
  • Advisor。
  • Memory。
  • Skill。
  • Agent Framework。
  • Graph Core。

这些后面会按业务问题自然引入。

5. 本章涉及的核心组件

本章只用 Spring Boot 做一个业务认知接口。

涉及代码组件:

  • spring-boot-starter-web
  • Controller
  • Application Service
  • Request DTO
  • Response DTO
  • JUnit 5
  • MockMvc

本章只建立概念,不实现以下能力:

  • Spring AI Alibaba:后续负责模型接入。
  • Tool Calling:后续负责安全调用后端能力。
  • MCP:后续负责工具服务化和跨系统复用。
  • RAG:后续负责检索历史活动、SOP、风控规则。
  • Advisor:后续负责日志、权限、RAG、风控等横切增强。
  • Memory:后续负责多轮追问上下文。
  • Skill:后续负责沉淀运营业务能力包。
  • Agent Framework:后续负责单 Agent 和流程型 Agent。
  • Graph Core:后续负责企业级流程编排、状态恢复和失败重试。

6. 先写一个最小可运行版本

本章代码位置:

text
example/stage-01-operation-agent-workbench

本章新增接口:

text
POST /api/chapter-01/evaluate

这个接口不调用模型,只做结构化认知输出。

它接收运营需求:

json
{
  "demand": "帮我分析最近 7 天新用户留存下降的原因,并给我一份下周拉活活动方案。"
}

返回四类内容:

  • 普通 ChatBot 的问题。
  • ChatBot 不能完成哪些动作。
  • Agent 工作台应该补齐哪些能力。
  • 下一步为什么要进入 Spring AI Alibaba。

6.1 工程目录

text
stage-01-operation-agent-workbench/
  pom.xml
  README.md
  src/
    main/
      java/com/zhixing/operationagent/
        OperationAgentWorkbenchApplication.java
        api/
          ChapterOneController.java
          OperationDemandRequest.java
          StageOneController.java
          StageOneHealthResponse.java
        application/
          ChapterOneEvaluationService.java
          StageOneArchitectureService.java
        domain/
          ChapterOneEvaluation.java
          StageOneArchitecture.java
      resources/
        application.yml
    test/
      java/com/zhixing/operationagent/
        api/
          ChapterOneControllerTest.java
          StageOneControllerTest.java
        application/
          ChapterOneEvaluationServiceTest.java

6.2 pom.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/>
    </parent>

    <groupId>com.zhixing</groupId>
    <artifactId>stage-01-operation-agent-workbench</artifactId>
    <version>0.1.0-SNAPSHOT</version>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

6.3 application.yml

yaml
server:
  port: 18081

spring:
  application:
    name: stage-01-operation-agent-workbench

6.4 启动类

java
package com.zhixing.operationagent;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OperationAgentWorkbenchApplication {

    public static void main(String[] args) {
        SpringApplication.run(OperationAgentWorkbenchApplication.class, args);
    }
}

6.5 Request DTO

java
package com.zhixing.operationagent.api;

public record OperationDemandRequest(String demand) {
}

6.6 Response DTO

java
package com.zhixing.operationagent.domain;

import java.util.List;

public record ChapterOneEvaluation(
        String demand,
        String ordinaryChatbotConclusion,
        List<String> chatbotLimitations,
        List<String> agentWorkbenchCapabilities,
        List<String> nextLearningSteps
) {
}

6.7 Service

java
package com.zhixing.operationagent.application;

import com.zhixing.operationagent.api.OperationDemandRequest;
import com.zhixing.operationagent.domain.ChapterOneEvaluation;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ChapterOneEvaluationService {

    public ChapterOneEvaluation evaluate(OperationDemandRequest request) {
        String demand = normalizeDemand(request);

        return new ChapterOneEvaluation(
                demand,
                "普通 ChatBot 只能生成一段看似合理的话,不能安全完成这个运营任务。",
                List.of(
                        "拿不到真实业务数据",
                        "无法判断任务类型和执行顺序",
                        "不会调用受控后端能力",
                        "不能检索历史活动、运营 SOP 和风险规则",
                        "缺少人工确认、状态记录和失败兜底",
                        "无法保存方案和创建后续任务"
                ),
                List.of(
                        "任务识别",
                        "Tool Calling",
                        "MCP 工具服务化",
                        "RAG 知识库",
                        "Advisor 与 Memory",
                        "Skill 能力包",
                        "多智能体团队",
                        "Graph Core 编排"
                ),
                List.of(
                        "先跑通第 1 章业务认知接口",
                        "下一章再接入 Spring AI Alibaba 对话入口"
                )
        );
    }

    private String normalizeDemand(OperationDemandRequest request) {
        if (request == null || request.demand() == null || request.demand().isBlank()) {
            return "分析最近 7 天新用户留存下降原因,并生成拉活活动方案";
        }

        return request.demand().trim();
    }
}

6.8 Controller

java
package com.zhixing.operationagent.api;

import com.zhixing.operationagent.application.ChapterOneEvaluationService;
import com.zhixing.operationagent.domain.ChapterOneEvaluation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api/chapter-01", produces = "application/json;charset=UTF-8")
public class ChapterOneController {

    private final ChapterOneEvaluationService evaluationService;

    public ChapterOneController(ChapterOneEvaluationService evaluationService) {
        this.evaluationService = evaluationService;
    }

    @PostMapping("/evaluate")
    public ChapterOneEvaluation evaluate(@RequestBody OperationDemandRequest request) {
        return evaluationService.evaluate(request);
    }
}

6.9 测试

java
package com.zhixing.operationagent.application;

import com.zhixing.operationagent.api.OperationDemandRequest;
import com.zhixing.operationagent.domain.ChapterOneEvaluation;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class ChapterOneEvaluationServiceTest {

    private final ChapterOneEvaluationService evaluationService = new ChapterOneEvaluationService();

    @Test
    void evaluateReturnsBusinessReasonsAndAgentCapabilities() {
        ChapterOneEvaluation evaluation = evaluationService.evaluate(
                new OperationDemandRequest("分析最近 7 天新用户留存下降原因,并生成拉活活动方案")
        );

        assertThat(evaluation.demand()).contains("新用户留存下降");
        assertThat(evaluation.ordinaryChatbotConclusion()).contains("不能安全完成");
        assertThat(evaluation.chatbotLimitations())
                .contains("拿不到真实业务数据", "无法保存方案和创建后续任务");
        assertThat(evaluation.agentWorkbenchCapabilities())
                .contains("任务识别", "Tool Calling", "RAG 知识库", "Graph Core 编排");
        assertThat(evaluation.nextLearningSteps())
                .containsExactly(
                        "先跑通第 1 章业务认知接口",
                        "下一章再接入 Spring AI Alibaba 对话入口"
                );
    }
}

7. 运行一下,看现象

进入工程目录:

powershell
Set-Location D:\codex_space\personal-docs-site\example\stage-01-operation-agent-workbench

先跑测试:

powershell
mvn.cmd test

启动服务:

powershell
mvn.cmd spring-boot:run

发送请求:

powershell
$body = @{
  demand = "帮我分析最近 7 天新用户留存下降的原因,并给我一份下周拉活活动方案。"
} | ConvertTo-Json

Invoke-RestMethod `
  -Uri "http://localhost:18081/api/chapter-01/evaluate" `
  -Method Post `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

预期响应:

json
{
  "ordinaryChatbotConclusion": "普通 ChatBot 只能生成一段看似合理的话,不能安全完成这个运营任务。",
  "chatbotLimitations": [
    "拿不到真实业务数据",
    "无法判断任务类型和执行顺序",
    "不会调用受控后端能力",
    "不能检索历史活动、运营 SOP 和风险规则",
    "缺少人工确认、状态记录和失败兜底",
    "无法保存方案和创建后续任务"
  ],
  "agentWorkbenchCapabilities": [
    "任务识别",
    "Tool Calling",
    "MCP 工具服务化",
    "RAG 知识库",
    "Advisor 与 Memory",
    "Skill 能力包",
    "多智能体团队",
    "Graph Core 编排"
  ]
}

观察重点:

  • 普通 ChatBot 的问题不是“不会写字”,而是“不能执行受控业务动作”。
  • 本章返回的是结构化结果,方便后续前端或下一步流程读取。
  • 响应头显式声明 UTF-8,避免中文乱码。

失败现象:

  • 端口占用:Port 18081 was already in use
  • JDK 不匹配:Maven 编译阶段提示版本不支持。
  • 请求体不是 JSON:Spring 无法解析 OperationDemandRequest

关键断点:

  • ChapterOneController#evaluate
  • ChapterOneEvaluationService#evaluate
  • ChapterOneEvaluationService#normalizeDemand

8. 代码讲解

调用链:

text
运营需求 JSON

ChapterOneController#evaluate

OperationDemandRequest

ChapterOneEvaluationService#evaluate

ChapterOneEvaluation

JSON 响应

ChapterOneController 只做 HTTP 接入。

它不写判断逻辑,因为 Controller 不应该变成业务逻辑堆放处。

OperationDemandRequest 是请求模型。

现在只有一个字段 demand。后续章节会把它升级成结构化任务单。

ChapterOneEvaluationService 是应用层。

这一层负责组织“普通 ChatBot 为什么不够”和“Agent 工作台需要补什么能力”。

ChapterOneEvaluation 是响应模型。

它没有返回一段大文本,而是返回结构化字段。这样后续前端、测试、日志和流程编排都更容易处理。

9. 为什么要这样设计?

为什么本章不用 ChatClient

因为本章要建立业务边界。模型调用是下一章的主题。

为什么不用 Tool Calling?

因为 Tool 是给模型调用后端能力用的。现在还没有模型,也没有要查询的数据接口。

为什么不用 MCP?

MCP 是工具服务化。只有当工具能力需要跨 Agent、跨系统复用时,才需要进入 MCP。

为什么不用 RAG?

RAG 解决的是“查资料再回答”。本章只证明未来为什么需要查资料。

为什么不用 Skill?

Skill 是可复用业务能力包。第一章还没有沉淀运营分析、活动策划、文案生成这些能力。

为什么不用 Agent Framework 和 Graph Core?

因为复杂流程还没出现。Graph Core 应该在分支、并行、人工确认、重试、恢复这些需求出现后再引入。

本章的正确姿势是:

text
先分清业务边界
再接模型
再接工具
再接知识库
再做 Agent 和 Graph

10. 画出流程图

text
运营提出复杂需求

普通 ChatBot 生成泛泛建议

运营追问数据依据、历史案例、风险和执行动作

发现普通 ChatBot 不能完成任务

拆出 Agent 工作台必须具备的能力

用 Spring Boot 先搭建最小业务认知接口

下一章接入 Spring AI Alibaba 对话入口

11. 真实项目怎么落地?

真实项目里,不要让模型直接承担所有事情。

建议边界:

  • Controller:接收请求、返回响应。
  • Application Service:编排业务流程。
  • Domain DTO:表达业务语义。
  • Tool:封装具体安全动作。
  • MCP Server:把通用工具服务化。
  • RAG:检索历史活动、运营 SOP、风控规则。
  • Advisor:统一处理日志、权限、RAG、风控增强。
  • Memory:保存多轮上下文。
  • Skill:沉淀可复用运营能力。
  • Agent:执行一类智能任务。
  • Graph Core:编排复杂长流程。

本章代码是教学 Demo,不是生产方案。

生产环境还需要:

  • 请求参数校验。
  • 统一异常处理。
  • 接口鉴权。
  • 日志追踪。
  • 操作审计。
  • 配置分环境管理。
  • 更完整的测试。

这些后续章节会逐步补。

12. 常见坑

坑一:把“能回答”误认为“能办事”。

  • 现象:模型能写报告,但没有真实依据。
  • 原因:没有接入数据、工具、知识库和状态。
  • 解决办法:把文本生成和任务执行拆开。
  • 如何提前避免:先定义 Agent 工作台能力边界。

坑二:一上来就接模型。

  • 现象:demo 很快能聊,但后面接 Tool、RAG、Graph 时结构混乱。
  • 原因:没有先设计业务分层。
  • 解决办法:先跑通 Spring Boot 骨架和业务认知接口。
  • 如何提前避免:第一章不接模型。

坑三:让模型直接判断业务事实。

  • 现象:模型说“渠道质量下降”,但没有数据支撑。
  • 原因:模型没有访问真实业务指标。
  • 解决办法:后续通过 Tool 或 MCP 查询受控后端数据。
  • 如何提前避免:所有业务事实都要能追溯来源。

坑四:把教学 Demo 当生产方案。

  • 现象:接口能跑,就想直接接到业务系统。
  • 原因:忽略鉴权、校验、异常、审计和观测。
  • 解决办法:明确 Demo、工程可用版、生产级版本的差距。
  • 如何提前避免:每章都写工程边界。

坑五:一次引入太多概念。

  • 现象:ChatClient、Tool、RAG、Agent、Graph 全写在一章里,能跑但讲不清。
  • 原因:缺少问题驱动的迭代节奏。
  • 解决办法:每章只解决一个主要问题。
  • 如何提前避免:让下一章由上一章不足自然引出。

13. 本章小结

这一章必须掌握:

  • 普通 ChatBot 只能生成文本,不能安全执行复杂运营任务。
  • Agent 工作台需要后端工具、知识库、权限、状态、流程和人工确认。
  • 当前工程采用 api → application → domain 的最小分层。
  • 第 1 章代码只服务业务认知,不提前实现后续能力。

需要能解释:

  • 为什么第一章不接模型。
  • 为什么结构化响应比一段文本更适合工程演进。
  • 为什么后续会自然进入 Spring AI Alibaba。

暂时了解即可:

  • Tool、MCP、RAG、Advisor、Memory、Skill、Agent、Graph 的名字和大致职责。

下一章要解决:

text
如何让这个工作台真正调用大模型,生成第一版运营回复?

14. 课后练习

基础练习:

把请求中的需求改成:

text
帮我生成一份双 11 活动复盘报告。

观察返回结果是否仍然能解释普通 ChatBot 的限制。

改造练习:

ChapterOneEvaluation 增加字段:

text
riskWarnings

返回至少 3 条风险提示:

  • 没有数据依据。
  • 没有人工确认。
  • 没有保存执行状态。

综合练习:

找一个你公司真实的运营任务,写出普通 ChatBot 不能完成它的 5 个原因,并标出后续应该由 Tool、MCP、RAG、Skill、Agent、Graph Core 中哪个能力解决。

Built with VitePress. Deployed on Cloudflare Pages.