基于 Spring Boot 与 Spring AI Alibaba(通义 DashScope)的教程向演示项目:对新闻文本执行多智能体流水线处理——去广告、情境建议、摘要生成与质检循环。
本仓库面向教程与上手练习,只保留:
- 基础 Web:
spring-boot-starter-web提供 REST,便于用curl联调; - 必须的 Spring AI Alibaba 能力:DashScope 对话模型 + Agent 框架(
spring-ai-alibaba-starter-dashscope、spring-ai-alibaba-agent-framework); - 最小工程配套:Lombok、Spring Boot Actuator(健康与指标占位)。
未引入数据库、缓存、消息队列、注册中心等中间件,也没有分层仓储、用户认证等业务模块,避免教程被基础设施带偏,读者可专注「如何编排 Agent 工作流」。
| 步骤 | 说明 |
|---|---|
| 去广告 | 移除推广、软文、引流话术,保留事实性新闻内容 |
| 情境建议 | 结合天气、交通、健康等场景给出简短生活提示 |
| 摘要 + 质检循环 | 生成 50~300 字中文摘要,并由质检 Agent 校验;未通过则根据反馈重试,最多 3 轮 |
本 demo 没有使用最基础的「Graph + 手动 addNode / 连边」方式拼装图,而是采用 Spring AI Alibaba Agent 框架中面向工作流的组合 API:
**ReactAgent**:单步智能体(去广告、情境建议、摘要、质检各一个);**SequentialAgent**:顺序执行子 Agent(摘要 → 质检 一段;整条管线「去广告 → 情境建议 → 循环」又是一段);**LoopAgent**:对子流程做条件循环(质检未通过则带着quality_result再跑摘要+质检,直到通过或达到最大轮次)。
这样与官方示例一致:声明「代理 + 顺序 + 循环」,由框架负责状态传递与调度;仅在 NewsWorkflowService.process 末尾用 OverAllState 读取各 outputKey 组装返回。若你需要极致可控的图拓扑,再考虑下沉到 Graph 细粒度 API。
下图从 HTTP 进入到各 Agent 职责,括号内为类与函数/构建块(逻辑均在 NewsWorkflowService.process 内构建与调用,除非另行标注)。
flowchart TD
%% 样式定义(与项目 Mermaid 约定一致)
classDef start_end fill:#37474f,stroke:#263238,color:#fff,stroke-width:2px;
classDef node_box fill:#ffffff,stroke:#1565c0,stroke-width:2px;
classDef tool_box fill:#e3f2fd,stroke:#1e88e5,stroke-dasharray: 5 5;
E1["HTTP 请求<br/>POST /api/news/process 或 GET /api/news/demo"] --> C["校验/样例文本<br/>NewsController.process / NewsController.demo"]
C --> S["编排入口<br/>NewsWorkflowService.process(String newsText)"]
S --> P["顺序管线 SequentialAgent<br/>news_processing_pipeline"]
P --> R1["去广告<br/>ReactAgent strip_ads_agent → outputKey cleaned_body"]
R1 --> R2["情境建议<br/>ReactAgent context_advice_agent → outputKey situation_hints"]
R2 --> L["质检循环 LoopAgent quality_loop<br/>LoopMode.condition 最多 3 轮"]
L --> SC["顺序子流程 SequentialAgent summarize_and_check"]
SC --> SM["摘要<br/>ReactAgent summarize_agent → outputKey summary"]
SM --> QC["质检<br/>ReactAgent quality_check_agent → outputKey quality_result"]
QC --> D{"通过或达上限?"}
D -->|否 继续循环| SC
D -->|是 结束循环| S2["组装结果<br/>extractText / isQualityPassed<br/>异常时 fallbackResult"]
S2 --> OUT["返回 NewsProcessingResult<br/>NewsController → HTTP JSON"]
class E1,OUT start_end;
class C,D,L,P,SC node_box;
class S,R1,R2,SM,QC,S2 tool_box;
调用链(可选对照):客户端 → NewsController → NewsWorkflowService.process → pipeline.invoke(...) → 上述 Agent 链 → NewsProcessingResult。
sequenceDiagram
participant U as Client
participant C as NewsController
participant S as NewsWorkflowService
U ->> C: POST /process 或 GET /demo
C ->> S: process(text)
S -->> C: NewsProcessingResult
C -->> U: JSON
| 文件 | 目的 |
|---|---|
pom.xml |
Maven 依赖与插件:Spring Boot、Spring AI / Alibaba BOM、DashScope、Agent 框架、Lombok 等。 |
src/main/resources/application.yml |
服务端口、DashScope api-key(建议用环境变量 DASHSCOPE_API_KEY)。 |
DemoSpringAiAlibabaApplication.java |
Spring Boot 启动入口。 |
controller/NewsController.java |
暴露 /api/news/process 与 /api/news/demo,参数校验后调用工作流服务。 |
service/NewsWorkflowService.java |
核心:用 ReactAgent / SequentialAgent / LoopAgent 组装新闻处理管线并执行,解析 OverAllState 为 NewsProcessingResult。 |
dto/NewsRequest.java |
POST 请求体:text 字段。 |
dto/NewsProcessingResult.java |
统一响应:清洗正文、情境建议、摘要、质检是否通过、循环次数、质检说明。 |
test/.../DemoSpringAiAlibabaApplicationTests.java |
默认 Spring Boot 上下文加载测试。 |
mvnw / mvnw.cmd |
Maven Wrapper,无全局 Maven 时也可构建。 |
.gitignore |
忽略构建产物、IDE 配置等。 |
- Java 17
- Spring Boot
3.5.13 - Spring AI BOM
1.1.2+ Spring AI Alibaba BOM1.1.2.0(含spring-ai-alibaba-agent-framework、spring-ai-alibaba-starter-dashscope) - Lombok、Spring Web、Spring Boot Actuator
- JDK 17+
- Maven 3.6+(或使用项目自带的
mvnw/mvnw.cmd) - 有效的阿里云 DashScope(通义)API Key(控制台 申请)
在 src/main/resources/application.yml 中配置 DashScope:
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
server:
port: 8080启动前请先设置环境变量(示例):
# Windows PowerShell(当前会话)
$env:DASHSCOPE_API_KEY = "你的DashScope_API_Key"# Linux / macOS(当前会话)
export DASHSCOPE_API_KEY="你的DashScope_API_Key"默认服务地址:http://localhost:8080。
curl -s -X POST http://localhost:8080/api/news/process ^
-H "Content-Type: application/json" ^
-d "{\"text\":\"某地今日降雪,出行请注意安全。【广告】点击领券\"}"(Linux / macOS 请将 ^ 换为 \ 并写成一行或使用单引号包裹 JSON。)
src/main/java/cn/lc/demo_spring_ai_alibaba/
├── DemoSpringAiAlibabaApplication.java
├── controller/NewsController.java
├── service/NewsWorkflowService.java
└── dto/NewsRequest.java、NewsProcessingResult.java