1. 为什么我觉得“CRUD内卷”真的该结束了
这两年我面试了上百个后端候选人,看过的简历里十个有八个写着“熟练使用Spring Boot完成业务CRUD”,聊下来发现干的活也高度相似:维护几张表,写一堆增删改查接口,再对着一张原型图把字段搬来搬去。不是说CRUD没价值,而是它已经成了后端开发里竞争最惨烈、差异最小、成长最慢的领域。你再怎么优化查询、加索引、拆表,本质上还是在做同一件事——把数据库里的数据以一种固定的方式搬进搬出。这个层面上的天花板非常明显,而且AI工具已经能自动生成相当大比例的CRUD代码,继续在上面堆人力,价值会越来越低。
我在2024年的时候就明显感觉到,身边团队对这个问题的讨论方向变了。大家不再纠结“用什么ORM能少写点CRUD”,而是开始琢磨“哪些业务逻辑根本不该用CRUD来表达”。到了现在这个时间节点,答案已经逐渐清晰:AI原生架构和服务编排是两条最确定性的出路。AI原生架构解决的问题是“系统的核心逻辑不再只是数据的存取,而是模型的调度、上下文的组装、结果的可靠化”;服务编排解决的问题是“业务系统不再只是一个单体或一堆微服务之间手工点对点调用,而是把跨系统流程变成可观测、可恢复、可视化的一条链路”。
这篇文章我想结合自己实践中的经验和观察,把这两件事拆开讲讲清楚。不整那些虚头巴脑的概念,就说清楚三件事:AI原生架构到底应该在哪些层面改底层设计,服务编排和普通API调用到底差在哪,以及一个后端工程师在2026年怎么调整自己的技术栈才不会被时代甩下。如果你已经写了两三年CRUD,开始觉得日常工作没意思,又不知道下一步往哪儿走,这篇文章应该能给你一个比较明确的方向。
我会尽量用真实项目里踩过的坑和验证过的方案来说话,不是告诉你“未来已来”那种口号,而是告诉你未来长什么样、从哪下手、注意什么。
2. AI原生架构不是“调用大模型API”那么简单
2.1 传统分层架构下插AI,坑在哪里
很多团队对AI原生架构的第一反应是,在现有的微服务架构里加一个AIGC服务,对外统一封装大模型接口,业务方需要时调用一下就行了。这种思路表面上看没错,做起来会发现处处别扭。
传统架构的分层逻辑是:Controller接收请求,Service做业务校验和流程控制,Mapper/Repository操作数据库,Model定义实体结构。这套体系假设的是数据世界是确定性的、逻辑是可穷举的。但引入大模型后,这个假设被打破了。大模型接口的返回结果是不确定的,同一套输入两次调用可能得到不同答案,还有不可控的延迟和失败率。如果你只是把它当成一个普通第三方HTTP服务去调,那上层业务代码会迅速被各种重试、熔断、解析逻辑、降级策略占满,业务代码和AI胶水代码混在一起,维护成本高到不敢想。
我见过一个真实的例子,某团队在订单系统里接了大模型来做售后工单的自动分类。最初的实现就是把大模型接口封装成普通Service方法,结果业务代码里散落着几十处try-catch、JSON解析和超时重试,一旦模型升级导致返回格式微变,整个售后链路跟着遭殃。这不是技术选型的问题,是架构模式没跟上。
所以AI原生架构的第一个设计原则是:把AI能力当成基础设施,而不是普通业务依赖。模型调用链路的细节,包括上下文组装、令牌管理、重试策略、结果校验、成本估算,都应该收敛在AI基础设施层,业务方拿到的应该是一个稳定、确定、可测试的接口。
2.2 我现在比较认可的分层方式
经过几个项目的迭代,我目前比较认可的一种AI原生后端分层方式是这样的:
第一层是模型网关层。这一层负责接入不同的大模型供应商,处理统一鉴权、限流、负载均衡、降级切换。你可以基于开源的one-api或New API这类网关项目做二次封装,也可以直接用云厂商的模型网关服务。核心要解决的是让上游业务不感知“今天用的是GPT-4o还是Claude 3.5或国产模型”,模型切换对业务透明。
第二层是上下文工程层。这一层处理的是“怎么把用户问题和业务数据组装成大模型能理解的上下文”。这里面包括检索增强生成(RAG)的检索管线、系统提示词模板的管理、历史会话的摘要策略、工具调用(Function Calling)的参数绑定。为什么要把这层单独拆出来?因为实际效果差异很多时候不是模型能力差异,而是上下文组装质量的差异。同样的模型,你给的上下文结构清晰、信息密度高、指令明确,输出质量就明显好;你直接把用户原始输入丢进去,效果就会很差。
第三层是业务语义层。这一层把业务规则和模型输出结合起来,做结果的结构化校验、业务约束检查、兜底处理。举个例子,AI生成了一段售后处理建议,但你的业务规则要求退款金额不能超过某个阈值,那这个规则不能指望模型自觉遵守,必须由这一层来强约束。我把这层理解为“给大模型套上业务缰绳”,没有这一步,AI系统在真实生产环境里会不停出小问题。
这三层架构的最大价值是让业务团队和算法/AI团队各管一段。业务团队负责定义校验规则和流程,AI团队负责优化模型调用质量,不用互相纠缠。这个思路跟当年把一个巨型单体拆成微服务很像——只不过现在拆的对象变成了“AI相关职责”。
2.3 还需要一个关键组件:AI可观测性与评估体系
很多团队把AI功能上线后,发现线上用起来效果时好时坏,用户投诉“回答变蠢了”,团队却不知道具体是哪里出了问题。原因很可能是没有建立AI层面的可观测性。
传统的监控指标关注的是QPS、响应时间、错误率这些基础设施指标,这些指标当然还要看,但对AI系统来说远远不够。还需要关注上下文命中率(RAG检索到的文档是不是真的有价值)、模型输出格式合法率、降级触发频率、单次请求Token消耗、用户反馈满意度等等。这些指标需要埋点采集并统一汇聚到日志或监控平台里。
更重要的是要建立一个离线的效果评估回归集。每换一次模型版本或修改提示词模板,都要拿一批固定的评测案例去跑,看输出效果是不是变好了。没有这个回归集,团队优化的方向全凭感觉,很多时候改了一版提示词自以为提升了,实际上只是对个别案例契合了。
正因为这些坑,我说的AI原生架构一定不是“接个API完事”,而是从工程层面把它当成一个需要稳定运行的基础设施来建设。
3. 服务编排的核心:把流程从硬编码里解放出来
3.1 编排和调度的区别你得先搞清楚
“服务编排”这个词这几年很热,但很多人的理解停留在“把多个接口按顺序串起来调用”。我把话说直白一点,这种理解只是自动化,不是编排。
真正的服务编排解决的是跨系统流程的建模、执行与治理。以电商下单为例,传统做法是在订单服务里硬编码调用库存服务、优惠券服务、支付服务、通知服务。每增加一个参与方,订单服务代码就要改一版,流程里任何一步失败的处理逻辑也得自己写。随着业务复杂,服务间的调用关系会变成一张蜘蛛网,没人说得清一笔订单完整走过的路径到底是什么。
用编排引擎之后,流程被显式地建模出来:先锁定库存,再扣减优惠券,然后创建支付单,等待支付回调,最后发通知。每一步是一个独立节点,节点之间的连接关系、条件分支、错误处理都在编排层声明出来。流程是可视的、可单步调试的、可暂停恢复的。这才是编排的定位。
我把服务编排理解为“给业务流程写一份可执行的说明书”,本质上是把流程逻辑从业务服务代码中彻底抽离,让代码只负责“做一件事并把结果交给引擎”,流程怎么走、失败怎么办,全部交给编排层。
3.2 什么时候该引入编排,什么时候不需要
不是说所有项目都要上编排引擎。如果一个流程只有两三个步骤,也不太可能变动,硬编码可能是最高效的。但当你出现下面几个信号时,就该认真考虑编排了:
- 流程涉及三个以上系统的协作,且流程经常要调整节点顺序;
- 流程存在多个分支条件,不同条件下的后续处理路径差异很大;
- 需要长时间运行的流程,可能跨小时甚至跨天,中间可能被暂停、恢复;
- 业务审计要求高,需要随时回溯某个流程实例每一步的执行情况和入参出参;
- 失败重试的策略并不是统一的“重试N次”,而是不同步骤要有不同的恢复策略。
我自己经历过的项目里最典型的就是审批流加外部系统同步的场景。一个审批通过后可能要同时触发ERP系统建单、通知第三方平台、更新多个内部系统状态,如果其中一个系统挂了,传统处理方式往往是记录错误后人工介入。而用编排之后,可以定义“审批通过后自动发起三个异步子流程,每个子流程独立重试,若ERP子系统连续失败3次则进入人工处理队列”——这样的逻辑清晰且可维护。
反之,如果你就两三个内部服务之间同步调用,没有复杂分支,引入编排引擎可能反而是负担。编排引擎本身也有部署运维成本和学习成本,过度设计一样是浪费。
3.3 编排引擎选型时要注意的几个点
市面上现成的编排方案不少,从重量级的Camunda、Temporal,到轻量级的自研状态机、甚至用消息队列加一组Worker也能实现类似效果。我个人的使用体会是:
选型时最核心要看三点。第一,流程定义是否支持版本管理。线上流程永远在跑,但你的流程定义不能只能改不能追。没有版本管理,改一次流程后旧的执行实例对不上号,排查问题能逼疯人。第二,是否支持长时间运行流程的持久化。很多流程不是几秒钟执行完的,中间可能要等人工审批、等外部回调,引擎需要能把流程状态持久化保存,实例挂掉后可以恢复执行。第三,可观测性是否做得充分。每个节点的执行状态、耗时、输入输出是否容易被查询到,这些信息在排障时价值极高。
我自己在项目里比较偏好Temporal这套方案。它把“流程执行”的状态管理做得非常扎实,用Go开发起来也不复杂,而且任务队列、定时器、信号机制都内置了。但它的上手门槛比硬编码高不少,团队需要有一个人先啃下来,其他人跟着模式写。如果你的团队没有这个精力,用直接的工作流框架加关系型数据库存储执行状态,配合一套后台管理页面,也能做出一个够用的轻量编排引擎。不要一上来就追求大而全,先跑起来,再逐步演进。
4. 从CRUD到AI原生服务编排,我的技术栈调整清单
4.1 后端语言没变,但重心变了
我在实际项目中仍然大量使用Java和Go,语言本身没变,变的是你要掌握的库和工具。
Java生态里,如果你要做AI原生应用,Spring AI这样的框架值得系统学一遍,它对模型接入、Prompt模板、结构化输出、向量数据库集成都做了封装。Go生态里,langchaingo是值得关注的,配合Temporal做服务编排,体验相当顺手。Python这边我更多只用于写数据处理和模型评估脚本,不用它做主业务后端。
但比语言框架更重要的是几个底层能力。一是向量数据库的基本概念与操作,包括Embedding模型怎么选、向量检索的相似度算法、混合检索(关键字加向量)怎么做,这几乎是AI原生后端的基础课。二是消息队列和事件驱动架构的熟练运用,服务编排里大量用到异步、重试、最终一致这些机制,不熟悉消息中间件的用法会很难受。三是分布式事务的取舍能力,编排流程里会有多个系统参与,你不可能再依赖本地事务包打天下,得清楚什么时候用Saga、什么时候用补偿、什么时候允许最终一致。
我之前用Java写CRUD时代的技术栈清单如果放在现在,明显不够用了。所以如果你准备转型,我的建议是别去追那些花里胡哨的新框架,先把上面三类底层能力补齐。
4.2 实操:一个AI原生服务编排的最小落地示例
空谈概念不如来点实际的东西。我用自己的Go技术栈写一个最小可运行的例子,帮你理解AI原生产品中服务编排和模型调用的配合方式。
场景假设:用户提交一个售后工单,系统需要做三件事——对工单内容做智能分类(调大模型)、根据分类查库存系统判断是否可退、把结论回写业务库并通知用户。按传统写法,你会顺序写三个函数硬调。用Temporal编排之后,代码更清晰,并且每一步失败的处理逻辑都独立。
type RefundWorkflowInput struct { OrderID string UserID string Description string } type RefundWorkflow struct{} func (w *RefundWorkflow) Execute(ctx workflow.Context, input RefundWorkflowInput) error { ctx = workflow.WithActivityOptions(ctx, workflow.ActivityOptions{ StartToCloseTimeout: 20 * time.Second, RetryPolicy: &temporal.RetryPolicy{ MaximumAttempts: 3, }, }) var classifyRes AIResponse err := workflow.ExecuteActivity(ctx, AIWorkflowActivities.ClassifyTicket, input.Description).Get(ctx, &classifyRes) if err != nil { return err } // 只有分类为“可退款”时才继续执行库存锁定 if classifyRes.Category == "refundable" { var lockRes StockLockResult err := workflow.ExecuteActivity(ctx, StockActivities.LockStock, input.OrderID).Get(ctx, &lockRes) if err != nil { return err } // 库存不足时走人工处理队列 if !lockRes.Locked { err := workflow.ExecuteActivity(ctx, NotificationActivities.NotifyManualProcess, input).Get(ctx, nil) return err } } return workflow.ExecuteActivity(ctx, NotificationActivities.NotifyUser, input).Get(ctx, nil) }这段代码的核心好处是,分类模型升级、库存系统接口变更、通知渠道变化,都只需要改动对应的Activity实现,流程本身不用大改。而且Temporal会自动记录每个Activity执行情况和重试状态,线上出问题可以按时间线排查。
这里我想特别提醒一点:不要在编排流程里写大段的模型提示词拼接逻辑。提示词拼接应该放在Activity内部,或者放到我前面提到的上下文工程层。编排引擎只负责控制流,不负责内容生产,职责分离清晰了才不容易乱。
4.3 数据层的变化也值得重视
最后再补一个数据层面的观察。CRUD时代的数据模型是围绕“表和字段”设计的,AI原生应用的数据模型则需要同时考虑“语义”和“关系”。
比如一个商品,以前只需要商品表和库存表就可以了,现在还需要它的Embedding向量、商品属性描述文本、关联图片等多模态信息。RAG应用后端的核心已经不是单表查询,而是文档的切片、索引、摘要、向量化这一整条处理管道。关系型数据库并没有被淘汰,依然承担着业务数据和状态记录的存储职责,但向量数据库、全文检索、缓存之间的配合变得同样重要。我还发现,用传统SQL去管理Embedding向量对比任务的批次状态,配合向量库做检索,这种组合往往是工程上最简单可靠的方案。
5. 转型途中容易踩的五个坑
5.1 把AI功能当成银弹,忽略了兜底设计
这是我在好几个项目里看到的问题。业务方提需求,产品经理说“用AI可以解决”,然后团队就把最难的那部分丢给大模型。大模型确实强,但它在业务规则一致性上并不能保证百分百准确。在做AI原生架构时,一定要给模型输出配一个规则引擎来兜底,或者设计人工审核流程。AI可以有“幻觉”,但业务系统不能。
5.2 服务编排一上来就追求可视化平台
有些团队对服务编排的第一反应是采购一个带拖拽画布的商业化平台,试图让业务人员自己去编排流程。我踩过这个坑后得出的结论是,流程定义是代码资产,不是画图资产。拖拽画布在展示层面很有价值,真正到了复杂分支和补偿逻辑的表达上,代码的精确度远高于图形化拖拽。建议的做法是先用代码定义流程,再用可视化工具和后台页面来展示执行状态和结果。
5.3 忽视流程执行的历史记录与回放能力
在外卖订单、支付、财务对账这类核心链路里,我经常需要回答一个问题:“这个单子当时为什么走到这一步?”如果编排系统没有完整保留每个节点的输入输出、执行耗时和重试记录,这个问题的回答成本极高。Temporal这类引擎天然支持这些数据的留存和查询,自研方案里一定要把流程审计日志当一等公民来设计,从第一天就要保留,后续才不至于抓瞎。
5.4 大模型上下文越拼越长,成本不受控
我见过一个RAG应用,为了追求回答质量,把用户历史消息全部拼进上下文,结果单次请求消耗的Token数暴涨,一个月成本直接翻了几倍。AI原生架构在用到一定程度时,瓶颈往往不是模型能力而是成本。所以上下文工程除了要考虑效果,还要考虑Token预算管理。合理做法是,对历史消息做摘要后只保留摘要和最近几条;检索到的文档切片做重排后只取最相关的几个片段;并在网关层配置单次请求Token上限和月度告警阈值,让成本随时可见。
5.5 评估体系建立得太晚
大胆一点说,建议在项目第一天就建立离线效果评估回归集。哪怕一开始只有二三十个Case,也足以在更换模型版本、调整提示词时快速给出量化结果。等系统上线后再补,你面对的将是没有基线可对比的混乱局面。我体会很深的一点是:没有评估集的AI系统,就像没有自动化测试的代码库,改一次怕一次,越改越不敢动。
6. 后端开发者自己该怎么调整思路
我见过不少后端同学焦虑,觉得AI时代后端要被淘汰了。我的判断恰恰相反,AI时代后端的重要性不降反升,因为模型能力越是强大,可靠的工程底座就越值钱。真正要淘汰的不是后端工程师,而是只做CRUD、不接触业务流程深度设计的开发方式。
落在能力建设上,我觉得自己这段时间最受益的三件事是:一是把RAG的完整链路亲手做了一遍,从文档解析切片到向量化再到检索排序和重排,每一环都试过各种方案,这才真正理解为什么检索质量比模型版本更影响最终效果;二是深入把一个工作流引擎用透,不只是入门示例,而是真正把一个复杂业务跑在上面,遇到各类可靠性问题后再回来理解它的设计思路;三是坚持写业务语义层的强约束代码,在做AI输出结构化时用JSON Schema、规则引擎等工具把模型的自由度关在笼子里,系统上线后才睡得着觉。
2026年的后端开发不会再以“能写接口”作为门槛,门槛会变成“能不能设计一套让AI靠谱工作的系统结构”。服务编排和AI原生架构不是两个孤立的概念,它们的共同本质是:用工程手段把不确定的智能变成可控的业务能力。这条路我也还在走,但方向上我觉得已经看得很清楚了。