Spring AI + 自研DSL设计Multi-Agent协作机制基础:架构全景与核心抽象
Spring AI + 自研DSL设计Multi-Agent协作机制基础:架构全景与核心抽象
作者:资深Java架构师
版本基准:Spring AI 1.0.0 GA / Spring AI Alibaba 1.0.0
适用场景:企业级智能体编排、审批流自动化、合同智能审查
一、为什么需要Multi-Agent架构?
2024年,大模型从"聊天工具"走向"自主执行"。单个LLM能回答问题,但无法独立完成"合同审查→法律风险识别→修订建议→人工确认→电子签章"这类有状态、多步骤、需要外部工具的复杂任务。
Multi-Agent(多智能体)架构的核心价值在于:分治。把一个复杂目标拆解成多个职责清晰的子Agent,每个Agent聚焦自己的领域,通过协作完成人工智能无法单独驾驭的企业级任务。
但问题随之而来:Agent如何协调?任务如何编排?状态如何管理?这正是本系列文章要解决的工程问题。
二、Spring AI核心抽象全景
Spring AI的设计哲学是面向接口编程,屏蔽底层差异。无论底层是OpenAI、通义千问还是本地Ollama,上层代码保持一致。
2.1 三大核心客户端
+--------------------------------------------------+
| Spring AI 核心抽象层 |
+--------------------------------------------------+
| |
| ChatClient EmbeddingModel ImageModel |
| (对话交互) (文本向量化) (图像生成) |
| | | | |
| ChatModel VectorStore SpeechModel|
| (模型驱动层) (向量存储) (语音合成) |
| |
+------------------+--+----------------------------+
| |
+----------+ +----------+
| |
OpenAI/Anthropic 通义/文心/讯飞
Gemini/Bedrock Ollama本地模型
ChatClient 是日常开发中用得最多的入口,它是一个流式Builder API:
@Configuration
public class AgentConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
// 全局系统提示词
.defaultSystem("你是一位专业的企业法务助手,擅长合同风险识别与条款分析。")
// 全局Advisor链(拦截器模式)
.defaultAdvisors(
new MessageChatMemoryAdvisor(new InMemoryChatMemory()),
new SimpleLoggerAdvisor()
)
// 全局工具注册
.defaultTools("contractAnalyzer", "riskScorer")
.build();
}
}
调用时非常简洁:
// 同步调用
String result = chatClient.prompt()
.user("分析这份合同第7条款的违约责任是否合理")
.call()
.content();
// 流式调用(SSE推送场景)
Flux<String> stream = chatClient.prompt()
.user(userMessage)
.stream()
.content();
// 结构化输出(直接映射到Java对象)
ContractRisk risk = chatClient.prompt()
.user(analysisPrompt)
.call()
.entity(ContractRisk.class);
EmbeddingModel 负责将文本转换为向量,是RAG和语义搜索的基础:
@Service
public class ContractIndexService {
private final EmbeddingModel embeddingModel;
private final VectorStore vectorStore;
public void indexContract(String contractText) {
// 文档分块
List<Document> docs = new TokenTextSplitter(512, 50)
.split(List.of(new Document(contractText)));
// 批量向量化并存储
vectorStore.add(docs);
}
public List<Document> searchSimilar(String query) {
return vectorStore.similaritySearch(
SearchRequest.query(query).withTopK(5).withSimilarityThreshold(0.75)
);
}
}
2.2 Advisor拦截器链
Spring AI引入了AOP风格的Advisor机制,在请求发出前后执行横切逻辑。这是构建Multi-Agent记忆、RAG、日志等能力的基础:
用户输入
|
v
+---------------------------+
| Advisor Chain (有序执行) |
+---------------------------+
| 1. SimpleLoggerAdvisor | <- 日志记录
| 2. QuestionAnswerAdvisor | <- RAG知识检索
| 3. MessageChatMemoryAdvisor| <- 对话历史注入
| 4. SafeGuardAdvisor | <- 内容安全检查
+---------------------------+
|
v
LLM调用
|
v
+---------------------------+
| 响应后处理 |
+---------------------------+
| 4. SafeGuardAdvisor | <- 输出过滤
| 3. MessageChatMemoryAdvisor| <- 历史存储
| 2. QuestionAnswerAdvisor | <- 引用追踪
| 1. SimpleLoggerAdvisor | <- 响应日志
+---------------------------+
|
v
最终响应
2.3 VectorStore与文档ETL
Spring AI提供了完整的文档处理流水线:
原始文档(PDF/Word/HTML)
|
v
+-------------------+
| DocumentReader | PdfReader / TextReader / JsonReader
+-------------------+
|
v
+-------------------+
| DocumentTransformer| TextSplitter / TokenTextSplitter
+-------------------+ MetadataEnricher / KeywordEnricher
|
v
+-------------------+
| VectorStore.add() | Redis / PgVector / Milvus / Chroma
+-------------------+ Pinecone / Weaviate / Qdrant
|
v
+-------------------+
| 索引完成,可供检索 |
+-------------------+
三、Spring AI Alibaba Graph框架
Spring AI本身提供了ChatClient、Tool Calling等基础能力,但缺乏工作流编排能力。Spring AI Alibaba通过Graph框架填补了这一空白。
3.1 Graph框架核心概念
Graph框架基于有向无环图(DAG),将Agent的执行过程建模为图中的节点和边:
+--------+ +----------+ +---------+ +--------+
| START | --> | 信息提取 | --> | 风险分析 | --> | 人工审核|
+--------+ | Agent | | Agent | | (HITL) |
+----------+ +---------+ +--------+
| |
[风险>0.7] [拒绝修改]
| |
+----------+ +----------+
| 人工审核 | | 修订Agent|
+----------+ +----------+
| |
+-------+-------+
|
+--------+
| END |
+--------+
核心API设计:
// 定义图状态(贯穿整个执行流的共享数据)
public class ContractReviewState extends AgentState {
public ContractReviewState(Map<String, Object> initData) {
super(initData);
}
public String getContractText() {
return (String) data().get("contractText");
}
public List<RiskItem> getRiskItems() {
return (List<RiskItem>) data().getOrDefault("riskItems", new ArrayList<>());
}
public double getRiskScore() {
return (double) data().getOrDefault("riskScore", 0.0);
}
}
// 构建执行图
StateGraph<ContractReviewState> graph = new StateGraph<>(ContractReviewState::new)
.addNode("extractor", new ExtractorAgent())
.addNode("riskAnalyzer", new RiskAnalyzerAgent())
.addNode("humanReview", new HumanReviewNode())
.addNode("revisionAgent",new RevisionAgent())
.addEdge(START, "extractor")
.addEdge("extractor", "riskAnalyzer")
.addConditionalEdges("riskAnalyzer",
state -> state.getRiskScore() > 0.7 ? "humanReview" : "revisionAgent",
Map.of("humanReview", "humanReview", "revisionAgent", "revisionAgent"))
.addEdge("humanReview", "revisionAgent")
.addEdge("revisionAgent", END);
// 编译并执行
CompiledGraph<ContractReviewState> compiled = graph.compile();
ContractReviewState result = compiled.invoke(
Map.of("contractText", contractContent)
);
3.2 Spring AI Alibaba的DSL转换器
Spring AI Alibaba提供了与Dify低代码平台兼容的DSL转换能力,将Dify导出的YAML格式工作流直接转换为Spring AI Graph执行图,实现"低代码设计、高代码运行":
Dify可视化设计器
|
| 导出YAML DSL
v
+------------------+
| DslConverter | 解析Dify DSL规范
+------------------+
|
| 转换
v
+------------------+
| StateGraph构建 | 映射为Spring AI Graph节点/边
+------------------+
|
| 编译
v
+------------------+
| CompiledGraph | 可直接执行的运行时图
+------------------+
四、Multi-Agent四大支柱
在工程实践中,一个成熟的Multi-Agent系统必须解决四个核心问题:
+---------------------------------------------------+
| Multi-Agent 四大支柱 |
+-------------------+-------------------------------+
| | |
| 规划(Planning) | 记忆(Memory) |
| ・预定义计划 | ・短期:对话上下文窗口 |
| ・动态ReAct生成 | ・长期:向量数据库持久化 |
| ・层次分解 | ・工作记忆:当前任务状态 |
| | |
+-------------------+-------------------------------+
| | |
| 工具使用(Tools)| 推理(Reasoning) |
| ・Function Call | ・ReAct推理框架 |
| ・MCP协议集成 | ・思维链(CoT) |
| ・工具权限控制 | ・自我反思(Reflection) |
| | |
+-------------------+-------------------------------+
4.1 规划支柱
规划解决"任务怎么拆解、步骤如何排序"的问题。有三种核心规划模式:
| 规划模式 | 适用场景 | 实现方式 | 优缺点 |
|---|---|---|---|
| 预定义计划 | 审批流、固定流程 | DSL静态定义DAG | 可预测性强,无法应对异常 |
| 动态ReAct | 开放式任务 | LLM自主推理生成步骤 | 灵活,但结果不可预测 |
| 层次分解 | 大型复杂项目 | 主Agent拆解→子Agent执行 | 可扩展,协调成本高 |
4.2 记忆支柱
记忆解决"Agent如何记住过去,利用历史知识"的问题:
// 短期记忆:InMemory对话历史
ChatMemory shortTermMemory = new InMemoryChatMemory();
// 长期记忆:向量数据库持久化
VectorStoreChatMemoryAdvisor longTermAdvisor =
new VectorStoreChatMemoryAdvisor(
vectorStore,
"user-001", // 用户级隔离
20 // 最近20轮历史
);
4.3 工具使用支柱
工具赋予Agent操纵真实世界的能力:
@Component
public class ContractTools {
@Tool(description = "解析PDF合同文件,提取结构化条款数据")
public ContractStructure parsePdf(
@ToolParam(description = "PDF文件路径或URL") String filePath
) {
// 调用PDF解析服务
return pdfParserService.parse(filePath);
}
@Tool(description = "查询历史合同数据库,搜索相似案例")
public List<ContractCase> searchHistoricalCases(
@ToolParam(description = "搜索关键词") String keywords,
@ToolParam(description = "最大返回数量,默认5") int topK
) {
return contractRepository.searchByKeywords(keywords, topK);
}
@Tool(description = "发起电子签章请求")
public SignatureResult requestESign(
@ToolParam(description = "合同ID") String contractId,
@ToolParam(description = "签署人列表,逗号分隔") String signers
) {
return eSignService.initiate(contractId, signers.split(","));
}
}
4.4 推理引擎支柱
ReAct(Reasoning + Acting)框架是Agent推理的核心范式:
用户问题
|
v
+----------+
| Thought | 分析当前状态,决定下一步行动
+----------+
|
v
+----------+
| Action | 调用工具或生成输出
+----------+
|
v
+----------+
| Observe | 观察工具执行结果
+----------+
|
v
+----------+
| 达到目标? |
+----------+
是 | 否 |
| +---> 返回Thought继续迭代
v
最终答案
五、九种多智能体设计模式
5.1 模式总览
+----------------------------------------------------------+
| 九种多智能体设计模式 |
+----------------------+-----------------------------------+
| 协调器/分发器模式 | 一个主Agent统筹分配任务 |
| 并行扇出/聚合模式 | 多Agent并行处理,结果汇总 |
| 层次分解模式 | 多层Agent树,逐级分解执行 |
| 生成器与评判器模式 | 一个生成,一个审查,迭代提升 |
| 迭代精进模式 | 单Agent反复自我优化到满足条件 |
| 顺序流水线模式 | Agent串行处理,结果逐步精化 |
| 人工介入模式 | 关键节点暂停,人工审核后继续 |
| 语义路由模式 | 根据输入内容智能路由到专属Agent |
| 复合模式 | 以上模式的组合应用 |
+----------------------+-----------------------------------+
5.2 协调器/分发器模式(Orchestrator)
这是最常用的企业级模式。一个"主控Agent"负责理解任务全局,将子任务分发给专业Agent执行:
@Component
public class OrchestratorAgent {
private final ChatClient orchestratorClient;
private final Map<String, Agent> agentRegistry;
public String execute(String complexTask) {
// 主控Agent分解任务
TaskPlan plan = orchestratorClient.prompt()
.system("""
你是任务协调器,负责将复杂任务分解为子任务并分配给合适的Agent。
可用Agent:extractor(提取)、analyzer(分析)、writer(撰写)、reviewer(审核)
请以JSON格式返回执行计划。
""")
.user(complexTask)
.call()
.entity(TaskPlan.class);
// 按计划调度子Agent执行
Map<String, String> results = new LinkedHashMap<>();
for (SubTask subTask : plan.getTasks()) {
Agent agent = agentRegistry.get(subTask.getAgentType());
String result = agent.execute(subTask.getInstruction(), results);
results.put(subTask.getId(), result);
}
return aggregateResults(results);
}
}
5.3 并行扇出/聚合模式(Parallel Fan-out)
多个Agent同时处理不同部分,最后汇总结果:
// 合同多维度并行审查
public ContractReport parallelReview(String contractText) {
CompletableFuture<LegalRisk> legalFuture = CompletableFuture.supplyAsync(
() -> legalAgent.analyze(contractText)
);
CompletableFuture<FinancialRisk> financialFuture = CompletableFuture.supplyAsync(
() -> financialAgent.analyze(contractText)
);
CompletableFuture<ComplianceRisk> complianceFuture = CompletableFuture.supplyAsync(
() -> complianceAgent.analyze(contractText)
);
// 等待所有Agent完成,汇总报告
return CompletableFuture.allOf(legalFuture, financialFuture, complianceFuture)
.thenApply(v -> ContractReport.builder()
.legalRisk(legalFuture.join())
.financialRisk(financialFuture.join())
.complianceRisk(complianceFuture.join())
.build())
.join();
}
5.4 生成器与评判器模式(Generator & Critic)
这是提升输出质量的关键模式,在合同修订场景中极为实用:
public String generateWithCritic(String originalClause) {
String draft = generatorAgent.generate(originalClause);
for (int iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
// 评判器审查草稿
CriticFeedback feedback = criticAgent.review(draft);
if (feedback.getScore() >= 90) {
return draft; // 达到质量标准
}
// 根据反馈优化
draft = generatorAgent.revise(draft, feedback.getSuggestions());
}
return draft;
}
5.5 人工介入模式(Human-in-the-Loop)
企业合规场景必须支持人工干预,这在后续章节将深入展开:
Agent执行中
|
| 检测到高风险或关键决策点
v
+----------------+
| 暂停执行 |
| 保存图状态快照 |
+----------------+
|
| 通知人工审核员
v
+----------------+
| 人工审核界面 |
| - 查看Agent输出 |
| - 批准/拒绝/修改|
+----------------+
|
| 人工决策结果
v
+----------------+
| 恢复执行 |
| 加载状态快照 |
| 从断点继续 |
+----------------+
六、自研DSL的定位与价值
6.1 现有方案的局限
Spring AI Graph框架功能强大,但纯Java编程方式对业务人员不友好。每次修改工作流都需要重新编译部署。Dify等低代码平台虽然提供可视化设计,但DSL格式专有,与Spring AI的绑定深度不足。
自研DSL的核心价值:
+----------------------------------+
| 业务人员 |
| - 通过可视化编辑器设计流程 |
| - 导出/修改YAML DSL |
+----------------------------------+
|
| YAML DSL
v
+----------------------------------+
| DSL解析引擎(自研) |
| - 词法/语法解析 |
| - AST生成 |
| - 验证与优化 |
+----------------------------------+
|
| StateGraph对象
v
+----------------------------------+
| Spring AI Alibaba Graph运行时 |
| - 节点调度 |
| - 状态管理 |
| - 分布式执行 |
+----------------------------------+
6.2 DSL设计原则
经过多个企业项目实践,我们总结出自研DSL的六大设计原则:
| 原则 | 说明 | 反例(规避) |
|---|---|---|
| 可读性优先 | 业务人员能读懂每行含义 | 引入过多技术符号 |
| 最小惊讶 | 行为与字面意思一致 | 隐式默认值导致混淆 |
| 渐进复杂度 | 简单场景写法简单 | 强制声明所有可选项 |
| 类型安全 | 编译期/解析期发现错误 | 运行时才暴露类型不匹配 |
| 可组合性 | 子流程可被主流程引用 | 每个流程都是孤立的 |
| 版本可控 | 支持Git管理,可回滚 | 仅支持数据库存储 |
6.3 与Dify DSL的兼容策略
Dify是目前国内最流行的低代码AI平台,其DSL格式已成为事实标准。我们的自研DSL在结构上与Dify保持兼容,同时扩展了Spring AI特有的能力:
# 自研DSL示例(兼容Dify格式,扩展Spring AI特性)
workflow:
name: "合同审查标准流程"
version: "1.2.0"
description: "适用于B2B标准合同的智能审查流程"
# Spring AI特有:全局变量注入
environment:
model: "${spring.ai.openai.model:gpt-4o}"
vectorStore: "contractKnowledgeBase"
agents:
- id: "extractor"
name: "合同信息提取Agent"
type: "llm"
model: "${environment.model}"
system_prompt: |
你是合同信息提取专家,负责从合同文本中提取结构化信息。
输出格式严格按照ContractStructure JSON Schema。
tools:
- "pdfParser"
- "ocrService"
output_schema: "ContractStructure"
- id: "riskAnalyzer"
name: "风险分析Agent"
type: "llm"
model: "${environment.model}"
memory:
type: "vector_store"
store: "${environment.vectorStore}"
top_k: 5
tools:
- "legalKnowledgeSearch"
- "riskScorer"
- id: "humanReview"
name: "法务经理审核"
type: "human_in_the_loop"
# 动态断点:风险评分超阈值触发
trigger_condition: "riskScore > 0.7"
timeout: "P2D" # ISO 8601 duration: 2天
escalation:
after: "P1D" # 1天后升级
to: "legalDirector"
- id: "revisionAgent"
name: "合同修订Agent"
type: "llm"
model: "${environment.model}"
edges:
- from: "extractor"
to: "riskAnalyzer"
- from: "riskAnalyzer"
to: "humanReview"
condition: "state.riskScore > 0.7"
- from: "riskAnalyzer"
to: "revisionAgent"
condition: "state.riskScore <= 0.7"
- from: "humanReview"
to: "revisionAgent"
condition: "humanDecision == 'approved_with_changes'"
- from: "humanReview"
to: "__end__"
condition: "humanDecision == 'rejected'"
- from: "revisionAgent"
to: "__end__"
七、整体技术架构
将上述所有组件整合,整体架构如下:
+--------------------------------------------------------------+
| 客户端层(Client Tier) |
| Web UI / 微信小程序 / REST API / WebSocket / 企业内网 |
+-------------------------------+------------------------------+
|
+-------------------------------v------------------------------+
| API网关层(Gateway Tier) |
| Spring Cloud Gateway + JWT认证 + 限流熔断 |
+-------------------------------+------------------------------+
|
+-------------------------------v------------------------------+
| Multi-Agent编排层(Orchestration Tier) |
| |
| +------------------+ +-------------------+ |
| | DSL解析引擎 | | StateGraph执行引擎 | |
| | YAML → AST | | 节点调度/状态管理 | |
| +------------------+ +-------------------+ |
| | | |
| +------------------+ +-------------------+ |
| | Agent注册中心 | | 工具注册与发现 | |
| | 动态实例化 | | MCP协议客户端 | |
| +------------------+ +-------------------+ |
+-------------------------------+------------------------------+
|
+-------------------------------v------------------------------+
| Spring AI基础设施层(AI Infra Tier) |
| |
| ChatClient EmbeddingModel VectorStore ChatMemory |
| QuestionAnswerAdvisor MessageChatMemoryAdvisor |
| |
+-------------------------------+------------------------------+
|
+-------------------------------v------------------------------+
| 基础设施层(Infrastructure Tier) |
| |
| +----------+ +----------+ +----------+ +----------+ |
| | LLM服务 | |向量数据库 | |消息队列 | | 关系数据库| |
| | OpenAI | | Milvus | | Kafka | | PostgreSQL| |
| | 通义千问 | | Pinecone | | RabbitMQ | | MySQL | |
| +----------+ +----------+ +----------+ +----------+ |
+--------------------------------------------------------------+
八、技术选型决策
在真实企业项目落地时,技术选型会面临几个关键抉择:
8.1 LLM选型矩阵
| 维度 | OpenAI GPT-4o | 通义千问Max | 文心一言4.0 | 本地Ollama |
|---|---|---|---|---|
| 推理能力 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 中文理解 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 数据安全 | 需合规评估 | 国内合规 | 国内合规 | 完全私有 |
| 调用成本 | 较高 | 中等 | 中等 | 硬件成本 |
| 工具调用 | 完善 | 完善 | 完善 | 部分支持 |
| 推荐场景 | 国际化业务 | 国内企业首选 | 金融/政务 | 安全敏感 |
8.2 向量数据库选型
| 数据库 | 适用规模 | 部署方式 | 核心优势 |
|---|---|---|---|
| Milvus | 亿级以上 | 独立集群 | 高性能,生产级 |
| PgVector | 千万级 | PostgreSQL插件 | 运维简单,事务支持 |
| Chroma | 百万级 | 嵌入式/独立 | 开发友好 |
| Redis | 百万级 | 内存优先 | 极低延迟 |
| Pinecone | 无上限 | 云服务 | 全托管,免运维 |
推荐方案:开发环境用Chroma,生产环境据数据量选Milvus(亿级)或PgVector(千万级)。
九、本系列文章路线图
本文建立了整体架构认知。后续文章将逐层深入:
本文(已读):架构全景与核心抽象
|
+-- 第2篇:规划层 - 如何设计任务分解与DAG编排
|
+-- 第3篇:记忆层 - 短期上下文 + 长期向量记忆
|
+-- 第4篇:工具层 - Function Calling + MCP协议集成
|
+-- 第5篇:人机协同层 - HITL六大模式
|
+-- 第6篇:DSL层 - 完整语法规范与解析器实现
|
+-- 第7篇:运行时 - 执行引擎与分布式调度
|
+-- 第8篇:落地实战 - 审批流 + 合同审查完整案例
十、总结
Multi-Agent架构不是把大模型API包一层就算完。真正的企业级Multi-Agent系统需要解决:状态管理(每个Agent的执行结果如何传递)、协调机制(谁来调度谁)、记忆设计(历史知识如何复用)、工具安全(外部调用如何管控)、人机边界(何时交给人类决策)。
Spring AI提供了坚实的基础设施,Spring AI Alibaba的Graph框架提供了编排能力,而我们的自研DSL则在二者之上搭建了"低代码可视化设计、高代码精确执行"的桥梁。
理解了这套架构全景,后续每一层的设计决策都有了清晰的坐标系。
关注博主,持续更新Spring AI企业实战系列
如有问题欢迎评论区讨论,技术细节见后续章节深入解析
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)