Claude Code SubAgents:基于多智能体协作的企业级开发自动化实战
最近在尝试把一些重复性的开发任务自动化,比如批量生成接口文档、统一格式化代码、检查依赖版本、生成测试用例。一开始觉得,不就是写个脚本吗?但真动手才发现,问题比想象中复杂:一个任务往往包含多个步骤,每个步骤需要不同的工具和上下文,脚本越写越长,逻辑越来越绕,最后变成了一团难以维护的“面条代码”。
更麻烦的是,当我想把这种自动化能力分享给团队,或者应用到稍微不同的场景时,几乎都要推倒重来。我开始意识到,真正的自动化难点,不在于写一个能跑通的脚本,而在于如何把一个复杂的、模糊的需求,拆解成一系列清晰、独立、可组合、可复用的子任务,并且让这些子任务能像流水线上的工人一样,有序、高效、可靠地协作。
这让我开始关注“多智能体”(Multi-Agent)这个方向。它听起来很前沿,但核心思想其实很朴素:与其让一个“全能”但臃肿的AI去处理所有事,不如把工作分给多个“专精”的小助手。每个小助手只负责自己最擅长的那部分,它们之间通过明确的规则和接口进行沟通和协作。这不正是我们做软件工程时追求的“高内聚、低耦合”和“单一职责原则”吗?
而Claude Code SubAgents的出现,恰好为这种思路提供了一个非常具体、可落地的实现方案。它不是一个遥不可及的学术概念,而是一个能直接集成到VSCode里,帮你把复杂开发任务自动化的工作流引擎。这篇文章,我们就来彻底搞懂它:从它解决的核心问题出发,一步步拆解它的工作原理,并通过实战,看看如何用它来构建一个真正“企业级”的、可维护的自动化开发流程。
1. 为什么“单智能体”搞不定复杂的开发自动化?
在深入SubAgents之前,我们先要理解它要解决的“真问题”。很多人对AI自动化的想象还停留在“给一个需求,吐出一段完整代码”的阶段。但现实中的开发任务,远比这复杂和模糊。
1.1 复杂任务的“模糊性”与“多步骤”特性
假设你接到一个任务:“为项目里的用户模块添加完整的CRUD接口,并生成对应的API文档和单元测试。” 这个需求对AI来说信息量巨大且模糊:
- CRUD接口:需要定义哪些实体?字段是什么?需要哪些查询参数?分页怎么做?权限如何控制?
- API文档:用Swagger还是Markdown?格式标准是什么?要不要包含示例请求和响应?
- 单元测试:测试框架用Jest、Pytest还是别的?要覆盖哪些边界情况?Mock策略是什么?
一个“单智能体”模型(比如一个普通的代码补全AI)面对这种任务,很容易陷入两种困境:
- “大而全”的混乱输出:它试图一次性生成所有文件,结果可能是代码结构混乱、风格不一致、遗漏关键逻辑(如错误处理),或者生成大量需要你手动清理的“废话代码”。
- “无从下手”的卡壳:因为任务过于庞大和模糊,AI可能直接回复“这个任务太复杂,我无法完成”,或者给出一个极其笼统、无法直接执行的建议。
问题的根源在于,单智能体缺乏将宏观目标分解为可执行微观动作的“规划”能力。它更像一个反应迅速的“执行者”,而不是一个善于策划的“项目经理”。
1.2 SubAgents的核心思想:分而治之,专业分工
Claude Code SubAgents的核心理念,就是引入“分而治之”和“专业分工”。
- 分而治之:它内置了一个“规划器”(Planner)角色。当你给出一个高层级任务时,规划器会首先分析这个任务,并将其拆解成一个有序的、有依赖关系的子任务列表。比如上面的任务,可能被拆解为:
- 分析现有项目结构,确定用户模块位置。
- 定义用户实体(User Entity)的数据模型(DTO/Model)。
- 生成用户控制器(User Controller)的CRUD方法骨架。
- 实现用户服务层(User Service)的业务逻辑。
- 编写用户数据访问层(User Repository)的代码。
- 为控制器编写单元测试。
- 为服务层编写单元测试。
- 生成基于OpenAPI规范的API文档。
- 专业分工:SubAgents允许你定义不同的“子智能体”(Sub-Agent),每个子智能体专注于某一类任务。例如:
- 架构师Agent:擅长分析项目结构、设计模块和接口。
- 后端开发Agent:擅长编写控制器、服务、数据访问层代码。
- 测试开发Agent:擅长编写各种测试用例。
- 文档工程师Agent:擅长生成结构清晰的API文档。
规划器拆解出子任务后,会根据任务类型,将其分派给最专业的子智能体去执行。每个子智能体在完成任务后,会将结果返回,规划器再协调后续任务。这就形成了一个清晰的、可追溯的自动化流水线。
1.3 从“一次性的脚本”到“可复用的工作流”
传统的自动化脚本是“一次性”的。任务稍有变化,脚本就要大改。而基于SubAgents构建的自动化流程,其价值在于“工作流”的沉淀。
- 模块化:每个子智能体都是独立的模块。今天用它生成用户模块,明天同样的“后端开发Agent”稍作调整就能用来生成商品模块。
- 可配置:你可以通过修改提示词(Prompt)来调整某个子智能体的行为,而不影响其他部分。
- 可观测:整个任务的拆解、分发、执行过程是透明的。你可以清楚地看到每个步骤是谁执行的、输入是什么、输出是什么。这极大地便利了调试和优化。
- 可扩展:当你需要支持新的任务类型(比如生成前端组件),你只需要训练或配置一个新的子智能体,并将其注册到工作流中即可,无需重写整个系统。
理解了这些,我们再去看Claude Code SubAgents,它就不再是一个神秘的“黑科技”,而是一个帮助你实现“软件工程最佳实践”的AI协作框架。
2. 环境搭建与核心概念零基础入门
理论讲完了,我们动手把它跑起来。Claude Code SubAgents的安装和配置比想象中简单,核心是理解几个关键概念和它们之间的关系。
2.1 安装与基础配置
Claude Code是一个VSCode扩展,而SubAgents是它的一个核心功能特性。因此,你的起点是VSCode。
安装VSCode与Claude Code扩展:
- 如果你还没有VSCode,先去官网下载安装。
- 在VSCode的扩展市场(Ctrl+Shift+X)中搜索“Claude Code”。
- 找到由Anthropic官方发布的扩展并安装。确保你安装的是最新版本,以支持完整的SubAgents功能。
配置API密钥:
- 安装后,你需要一个可用的Claude API密钥。前往Anthropic的开发者平台注册并获取。
- 在VSCode中,按下
Ctrl+Shift+P打开命令面板,输入 “Claude Code: Set API Key”,然后将你的API密钥粘贴进去。 注意:妥善保管你的API密钥,避免泄露。Claude Code会在本地存储它,用于后续的所有请求。
验证安装:
- 在VSCode中新建一个文件,尝试使用Claude Code的基础功能,比如代码补全或解释代码。如果能正常工作,说明基础环境配置成功。
2.2 理解核心工作流:Planner, Sub-Agent, Skill
SubAgents功能围绕着三个核心概念运转,理解它们就等于理解了整个系统。
Planner(规划器):
- 角色:项目总指挥/项目经理。
- 职责:接收你的原始任务指令,进行分析和拆解,生成一个详细的子任务执行计划(Plan)。这个计划明确了先做什么、后做什么,以及每个任务由谁(哪个Sub-Agent)来执行。
- 触发:通常在你给Claude Code下达一个复杂指令时自动激活。
Sub-Agent(子智能体):
- 角色:各领域的专家工程师。
- 职责:接收来自Planner的、具体的、边界清晰的子任务,并利用自身专长(由Skill和Prompt定义)完成任务,将结果返回给Planner。
- 类型:系统内置了一些常见的Sub-Agent,如
CodeWriter(写代码)、CodeReviewer(审查代码)、Tester(写测试)等。你也可以创建自定义的Sub-Agent。
Skill(技能):
- 角色:Sub-Agent的工具箱和知识库。
- 职责:定义了一个Sub-Agent“能做什么”和“怎么做”。一个Skill通常包含:
- 描述:这个技能是干什么的。
- Prompt模板:指导AI如何执行此类任务的提示词。这是Skill的灵魂,决定了AI输出的质量和风格。
- 示例:(可选)提供一些输入输出的例子,供AI参考学习。
- 关系:一个Sub-Agent可以具备多个Skill。例如,一个“全栈开发Agent”可能同时拥有“前端组件生成”和“后端API生成”两个Skill。
它们如何协作?一个典型的工作流如下:
- 你输入:“为这个Spring Boot项目创建一个用户注册的REST API。”
- Planner启动,分析你的项目结构(如
pom.xml),然后将任务拆解为:- 子任务1:分析项目,确定包结构和依赖。 -> 分配给
AnalyzerSub-Agent。 - 子任务2:创建用户实体(User)和注册请求/响应DTO。 -> 分配给
CodeWriterSub-Agent (使用EntityGenerationSkill)。 - 子任务3:创建用户注册服务(UserService)。 -> 分配给
CodeWriterSub-Agent (使用ServiceGenerationSkill)。 - 子任务4:创建用户注册控制器(UserController)。 -> 分配给
CodeWriterSub-Agent (使用ControllerGenerationSkill)。 - 子任务5:为控制器编写单元测试。 -> 分配给
TesterSub-Agent。
- 子任务1:分析项目,确定包结构和依赖。 -> 分配给
- 每个Sub-Agent接收到任务后,调用其对应的Skill中的Prompt,结合当前代码上下文,生成代码或执行操作。
- 所有子任务完成后,Planner汇总结果,向你汇报任务完成。
2.3 你的第一个SubAgents任务:体验自动化拆解
让我们用一个最简单的例子,直观感受一下这个过程。
在VSCode中打开或创建一个简单的项目文件夹(比如一个空的Node.js或Python项目)。
在Claude Code的聊天界面(通常位于侧边栏)中,输入一个稍微复杂点的任务,而不是一句简单的代码问题。例如:
“请为这个项目创建一个简单的待办事项(Todo)应用的后端。需要包含Todo模型、获取所有Todo、创建新Todo、更新Todo状态、删除Todo这几个基本的RESTful端点。使用Express(如果JS)或FastAPI(如果Python)框架。”
发送指令。观察Claude Code的响应。
- 你可能会看到它的“思考”过程,显示它正在“规划任务”。
- 接着,它会开始一项一项地执行:创建模型文件、创建路由文件、编写具体的端点函数、可能还会创建配置文件。
- 整个过程是自动的、顺序的。它会向你汇报每一步做了什么,并生成对应的代码文件。
这个简单的体验展示了SubAgents的自动化拆解和执行能力。虽然生成的结果可能需要你稍作调整,但整个框架、基础代码和结构已经搭建完毕,节省了大量重复性劳动。
3. 从单次任务到企业级流程:自定义与深度配置
内置的Sub-Agent和Skill能处理很多通用场景,但真正的威力在于自定义。企业级的开发流程自动化,必须贴合自己团队的技术栈、编码规范和业务逻辑。
3.1 创建自定义Skill:固化团队最佳实践
假设你的团队使用特定的代码风格(如Airbnb ESLint规则)、特定的项目结构、或者需要对生成的代码进行一些通用处理(如自动添加版权注释)。你可以通过创建自定义Skill来固化这些要求。
实战:创建一个“添加标准文件头注释”的Skill
- 定位Skill配置:Claude Code的Skill配置通常以文件形式存在。你需要找到扩展的配置目录,或者通过扩展的设置界面进行管理。查阅官方文档找到创建自定义Skill的方法(例如,在项目根目录创建
.claude/skills/文件夹)。 - 定义Skill文件:创建一个JSON或YAML文件,例如
add_file_header.yaml。
/*# .claude/skills/add_file_header.yaml name: "add_standard_file_header" description: "为所有新生成的代码文件添加团队标准的文件头注释,包含版权、作者、创建日期和描述。" prompt: | 你是一个代码生成助手。在生成任何代码文件时,必须在文件最顶部添加以下格式的注释块:- Copyright (c) {{current_year}} [你的公司名称]. All rights reserved.
- File: {{file_name}}
- Author: Auto-generated by Claude Code
- Created: {{current_date}}
- Description: {{brief_description}} */
请根据上下文,自动填充 `{{current_year}}`、`{{file_name}}`、`{{current_date}}` 和 `{{brief_description}}` 变量。 `{{brief_description}}` 应该是对本文件功能的简短一句话描述。 注释块之后,再开始编写正式的代码。 examples: - input: "创建一个名为 `UserService.js` 的用户服务文件,用于处理用户相关的业务逻辑。" output: | /* * Copyright (c) 2023 AwesomeTech. All rights reserved. * File: UserService.js * Author: Auto-generated by Claude Code * Created: 2023-10-27 * Description: 用户服务,处理用户注册、登录、信息查询等业务逻辑。 */ const db = require('./database'); class UserService { // ... 具体代码 } module.exports = UserService; - 关联Skill到Sub-Agent:你需要修改或创建一个自定义的
CodeWriterSub-Agent的配置,将add_standard_file_header这个skill加入其技能列表中,并设置较高的优先级,确保它在生成代码时首先被调用。
通过这个自定义Skill,无论哪个开发人员(或AI)使用这个Sub-Agent生成代码,都会自动带上统一、规范的文件头,保证了代码库的一致性。
3.2 配置自定义Sub-Agent:打造专属专家
当内置的Sub-Agent不能满足需求时,你可以创建全新的。比如,你的项目使用GraphQL而非REST,你需要一个“GraphQL专家”。
实战:配置一个GraphQLSchemaGenerator Agent
- 定义Agent配置:创建一个Agent配置文件,例如
graphql_specialist.yaml。# .claude/agents/graphql_specialist.yaml name: "GraphQLSchemaGenerator" description: "专精于根据需求和数据模型生成GraphQL Schema(类型定义、查询、变更)的智能体。遵循Apollo Server最佳实践。" skills: - "analyze_requirements" # 假设有一个分析需求的通用skill - "generate_graphql_types" - "generate_graphql_queries" - "generate_graphql_mutations" - "add_standard_file_header" # 复用我们上面创建的skill default_skill: "generate_graphql_types" instructions: | 你是一个GraphQL专家。当被要求生成GraphQL相关代码时: 1. 首先分析需求,确定需要哪些对象类型(Object Types)、输入类型(Input Types)。 2. 使用 `generate_graphql_types` skill 生成类型定义。 3. 使用 `generate_graphql_queries` skill 生成查询(Query)定义。 4. 使用 `generate_graphql_mutations` skill 生成变更(Mutation)定义。 5. 所有生成的代码文件都必须符合团队规范(已通过skill实现)。 6. 最终输出应该是完整的、可运行的 `schema.graphql` 或相应的模块文件。 - 为其配置专属Skills:你需要为上面提到的
generate_graphql_types等skills创建具体的Prompt定义,教导AI如何写出符合Apollo风格和团队约定的GraphQL SDL(模式定义语言)。 - 注册Agent:在Planner的配置中,将这个
GraphQLSchemaGenerator注册进去。告诉Planner,当遇到“生成GraphQL API”或类似任务时,优先考虑或必须使用这个自定义Agent。
3.3 编排复杂工作流:Fan-Out与顺序执行
企业级任务往往是网状而非线性的。SubAgents支持更复杂的工作流编排。
- 顺序执行:这是默认模式,A任务完成后再做B任务。适合有强依赖关系的任务,比如“先建表,再写操作表的代码”。
- Fan-Out(扇出/并行):这是SubAgents一个强大的特性。Planner可以将一个任务拆解成多个独立的子任务,然后同时分发给多个相同或不同的Sub-Agent并行执行,最后收集结果。
- 场景:为一个大型项目中的多个相似模块生成代码。例如,“为
user,product,order三个模块分别生成CRUD控制器”。 - 优势:极大提升自动化效率。原本需要串行生成3个控制器,现在可以并行生成。
- 配置:通常在你的复杂指令中体现,或者通过Planner的智能识别。你也可以在自定义Agent的指令中提示Planner:“如果遇到为多个同类实体生成代码的任务,建议采用Fan-Out模式并行处理。”
- 场景:为一个大型项目中的多个相似模块生成代码。例如,“为
工作流配置示例(概念性): 你甚至可以定义一个更高级的orchestrator.yaml工作流文件,明确描述一个端到端自动化流程:
workflow_name: "generate_microservice" steps: - name: "analyze_requirements" agent: "ArchitectAgent" input: "{{user_input}}" - name: "generate_entities" agent: "CodeWriter" skill: "entity_generation" depends_on: ["analyze_requirements"] fan_out: true # 如果需求分析出多个实体,则并行生成 input: "{{analyze_requirements.output.entities}}" - name: "generate_apis" agent: "CodeWriter" skill: "api_generation" depends_on: ["generate_entities"] input: "{{generate_entities.output}}" - name: "generate_tests" agent: "Tester" depends_on: ["generate_apis"] input: "{{generate_apis.output}}"这种声明式的工作流定义,将自动化流程变成了可版本化、可共享的资产。
4. 实战:构建一个完整的“需求到测试”自动化流水线
现在,我们综合运用以上知识,设计一个贴近真实企业场景的自动化流水线。我们的目标是:输入一个简单的功能描述,自动生成符合规范的代码、文档和测试,并完成初步的代码审查。
场景:在一个Spring Boot项目中,需要增加一个“文章评论”功能。
4.1 阶段一:需求分析与任务规划
输入指令:
“在当前的Spring Boot博客项目中,需要增加文章评论功能。评论属于某篇文章,包含评论内容、评论人、评论时间。需要提供发布评论、获取某篇文章下的评论列表、删除评论(仅评论者或管理员可删)的REST API。请使用本项目现有的技术栈(Spring Boot, JPA, MySQL, Lombok, Swagger)。请遵循团队的代码规范(包结构为
com.xxx.blog,使用@RestControllerAdvice进行全局异常处理)。”Planner工作:
- Claude Code的Planner会读取你的指令,并结合当前打开的VSCode工作区上下文(已有的
pom.xml、项目结构等)进行分析。 - 它会识别出这是一个“后端功能开发”任务,并调用内置的或你自定义的“需求分析”Skill。
- 最终,Planner输出一个详细的开发计划,可能包括:
- 创建
Comment实体类。 - 创建
CommentRepository接口。 - 创建
CommentService接口及其实现类。 - 创建
CommentController类。 - 更新
SwaggerConfig或添加API注解。 - 创建
CommentControllerTest单元测试类。 - 创建
CommentServiceTest单元测试类。 - (可选)生成初步的API文档片段。
- 创建
- Claude Code的Planner会读取你的指令,并结合当前打开的VSCode工作区上下文(已有的
4.2 阶段二:并行化代码生成与审查
Planner开始执行计划。这里可以优化为“生成-审查”小循环。
并行生成实体和仓库层:
- Planner将“创建Comment实体”和“创建CommentRepository”这两个相对独立的任务,Fan-Out给两个
CodeWriter实例(或同一个Agent并行处理)。 - 两个
CodeWriter分别使用EntityGeneration和RepositoryGenerationSkill,生成代码。 - 生成完成后,Planner立即将生成的代码交给一个
CodeReviewerSub-Agent进行审查。CodeReviewer的Skill里定义了团队的代码规范检查清单(如:是否正确使用Lombok注解、JPA关联关系是否正确、命名是否符合约定等)。 CodeReviewer提出修改建议,CodeWriter根据建议自动或经你确认后修改代码。这一步是关键,它将质量保障左移,在生成环节就引入检查。
- Planner将“创建Comment实体”和“创建CommentRepository”这两个相对独立的任务,Fan-Out给两个
顺序生成服务和控制器:
- 由于服务和控制器依赖实体和仓库,Planner会等待前两步完成后再启动。
- 同样,生成后立即触发代码审查。
4.3 阶段三:自动化测试与文档生成
生成单元测试:
- 当
CommentController和CommentService生成并通过审查后,Planner将任务分派给TesterSub-Agent。 Tester使用SpringUnitTestGenerationSkill,基于生成的代码,自动编写测试用例。它会尝试覆盖正常流程和关键异常流程(如删除非自己评论的权限错误)。- 生成的测试代码同样会经过
CodeReviewer的审查。
- 当
生成API文档:
- 最后,一个
DocGeneratorSub-Agent被调用。它扫描所有@RestController中的注解,结合Swagger配置,生成或更新OpenAPI规范文件(openapi.yaml),并确保Comment相关的API被正确描述。
- 最后,一个
4.4 阶段四:汇总与交付
所有子任务完成后,Planner向你做最终汇报:
- 展示了所有创建和修改的文件列表。
- 提供了生成的API端点URL和示例请求。
- 提示你运行测试(
mvn test或gradle test)来验证功能。 - 可能还会给出后续步骤建议,如“需要手动配置数据库迁移脚本(如Flyway)来创建
comments表”。
至此,一个从需求描述到生成可运行代码、包含测试和文档的自动化流水线基本完成。你从重复性的脚手架代码编写中解放出来,只需要关注最核心的业务逻辑调整和最终的集成测试。
5. 避坑指南与长期维护建议
将SubAgents用于企业级开发,兴奋之余也必须冷静看待其局限性和维护成本。以下是一些关键的避坑点和长期建议。
5.1 常见问题与排查思路
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| Planner不拆解任务,直接生成代码 | 1. 任务描述过于简单或模糊。 2. Planner配置未启用或能力限制。 | 1. 尝试更详细、结构化地描述任务,明确输入、输出、约束条件。 2. 检查Claude Code扩展和SubAgents功能是否已正确启用最新版本。 |
| 生成的代码不符合项目规范 | 1. 自定义Skill的Prompt未正确定义或未生效。 2. 上下文信息不足(未打开关键配置文件)。 | 1. 检查并优化自定义Skill的Prompt,加入更具体的规范示例。 2. 确保在运行任务前,VSCode中打开了项目关键文件(如 pom.xml,package.json),让AI了解上下文。 |
| 子任务执行顺序错误或循环依赖 | Planner的依赖分析出现错误。 | 1. 在指令中明确任务间的依赖关系。 2. 考虑使用更声明式的工作流定义(如3.3节示例)来精确控制流程。 3. 将大任务拆分成几个顺序执行的小任务,手动控制节奏。 |
| 并行(Fan-Out)任务结果混乱 | 并行任务访问了共享资源(如同一个文件)导致冲突。 | 1. 确保Fan-Out的任务是真正独立的,输出到不同的文件。 2. 如果必须操作共享资源,考虑使用顺序执行,或引入更复杂的协调机制(这已超出当前SubAgents的简单能力)。 |
| API调用超时或失败 | 1. 网络问题。 2. API密钥额度不足或失效。 3. 生成内容过长。 | 1. 检查网络连接。 2. 验证API密钥状态。 3. 尝试将任务进一步拆解,减少单次请求的复杂度。 |
5.2 长期维护:将AI协作流程工程化
- Skill和Agent的版本化管理:将自定义的Skill和Agent配置文件(YAML/JSON)像管理代码一样,放入Git仓库。这保证了团队所有成员使用同一套自动化标准,也便于迭代和回滚。
- 建立Prompt知识库:不要满足于一次调通的Prompt。将效果好的Prompt、处理特定边界情况的Prompt、针对不同技术栈的Prompt都收集起来,形成团队的“Prompt知识库”。这是比代码模板更高级的资产。
- 人机协同,而非完全替代:明确SubAgents的定位是“高级助手”和“效率倍增器”,而非“替代者”。它的价值在于处理模式固定、重复性高、创造性要求相对较低的任务(如脚手架、样板代码、简单测试、格式化文档)。对于复杂的业务逻辑、算法设计、架构决策,仍然需要工程师的深度参与和审核。
- 定期评审与优化:定期(如每两周)回顾SubAgents生成代码的质量。收集误判、低质生成的案例,分析是Prompt问题、上下文问题还是任务拆解问题,并持续优化你的Skill和Agent配置。
- 成本与效率的平衡:使用Claude API会产生费用。对于非常简单的任务,手动操作可能更快更经济。建立简单的准则:预估手动完成时间超过5-10分钟,且模式固定的任务,才考虑使用SubAgents自动化。同时,利用好并行(Fan-Out)来提升单次任务请求的“性价比”。
Claude Code SubAgents代表的不仅仅是一个工具,更是一种新的工作范式:将软件开发中的重复性、模式化工作抽象成可编排、可复用、可观测的智能工作流。它要求我们从“写代码”的思维,部分转向“设计工作流”和“训练AI助手”的思维。
入门的第一步,是勇敢地用起来,从一个具体的、小而明确的任务开始。感受它如何拆解任务,观察它生成的代码,思考哪里可以改进。然后,着手创建你的第一个自定义Skill,固化一项团队规范。当你发现团队里某个重复性的代码片段可以通过一个定义良好的Skill来自动生成时,你就已经踏上了企业级开发流程自动化的正轨。这条路不是一蹴而就的,但每一次对流程的优化和固化,都会在未来的项目中带来持续的回报。
