本项目是一个基于开源项目的学习型教程:在参考
spring-ai-alibaba/DataAgent的基础上,结合个人理解进行拆解、复现与讲解。
目标是帮助开发者从 0 到 1 系统掌握 StateGraph 图编排、双重 RAG 检索、自我纠错、HITL 人机协同 等 Text2SQL Agent 关键能力。
这篇只做一件事:创建一个能启动的后端骨架。
1. 环境准备
- JDK 21
- Gradle(可用 wrapper)
- PostgreSQL(后续 Jimmer/JPA 访问)
2. 创建工程
可以先用 Spring Initializr 创建 Kotlin + Spring Boot 项目,然后补依赖。
也可以直接手建目录,这里给一份与你当前项目一致的 build.gradle.kts 示例。
如果你是直接用 IDEA 新建 Kotlin 工程,建议参数按你这套配置来:
这篇目标:创建一个能跑、能请求后端的 Vue3 工程。
1. 环境准备
- Node.js 20+
- pnpm
2. 创建 Vue3 项目
pnpm create vue@latest data-agent-frontend
学习目标
- 从 0 创建 Kotlin + Gradle + Jimmer 后端骨架。
- 从 0 创建 Vue3 前端骨架并接入基础工程配置。
- 完成一次前后端启动与联调冒烟,确保后续章节可直接实操。
文章列表
这篇只做一件事:
搭一个不依赖业务知识的 A2A 最小服务,让前端能收流式事件。
本文内容对照提交:
data-agent-backend/src/main/kotlin/io/github/qifan777/server/a2a/A2AConfiguration.ktdata-agent-backend/src/main/kotlin/io/github/qifan777/server/a2a/A2AController.ktdata-agent-backend/src/main/kotlin/io/github/qifan777/server/a2a/ToyAgentExecutor.kt
这一篇只关心前端交互:
- 调 A2A
- 收事件
- 渲染一个最小组件
本文内容对照提交:
data-agent-frontend/src/App.vuedata-agent-frontend/src/components/toy-hello-node.vue
1. 本文目标
- 前端通过 Agent Card 建立 A2A 客户端
- 发送一条消息并消费流式事件
- 把
TOY_HELLO_NODE渲染为一个独立 Vue 组件
学习目标
- 10 分钟跑通 A2A 最小链路(服务发现 + JSON-RPC + 流式事件)。
- 前端完成一次最小调用,并把返回渲染成一个组件。
- 先建立“协议与交互”心智,再进入业务编排。
文章列表
如果说上一章的 A2A Demo 只是一个“自娱自乐”的静态回声(Echo),那么这一篇,我们将正式把大模型的灵魂注入进来。
我们将搭建一个极简的单节点执行图:
START -> TOY_HELLO_NODE -> END
虽然只有仅仅一个业务节点,但它打通了现代 AI Agent 架构中最核心的三层壁垒:
- 模型层:Spring AI Alibaba 接入真实大模型,产出响应式数据流(Flux)。
- 编排层:Graph 引擎接管流的生命周期。
- 协议层:A2A 执行器将图引擎内部的抽象事件,精准翻译成前端可消费的标准协议。
在上一篇中,我们跑通了 Agent 的最小链路:START -> TOY_HELLO_NODE -> END。但这顶多算是一个“套着 Graph 壳的普通大模型调用”。
真正的复杂业务,绝对不是一个 Prompt 就能解决的。这一篇,我们将把 Toy Graph 升级成一个真正具备**逻辑编排(Orchestration)**意味的多节点图:
START -> ROUTE -> (TRAVEL_PLAN | STUDY_PLAN) -> WRAP_UP -> END
在复杂的 Agent 工作流中,我们往往不希望 AI 一口气把所有事情做完,特别是涉及敏感操作(如:付款、发送邮件、或者执行最终方案)时。这就引入了 Human-in-the-loop (HITL,人工在环) 的概念。
上一篇我们已经把 Graph 做成了双分支多节点:
START -> ROUTE -> (TRAVEL_PLAN | STUDY_PLAN) -> WRAP_UP -> END
这一篇继续往前走一步,把它升级成一个真正可交互的流程:
START -> ROUTE -> INTERRUPT -> (TRAVEL_PLAN | STUDY_PLAN | END) -> WRAP_UP -> END
