核心思想:从"流程指令"到"能力描述"的转变

🌉 一个生动的比喻:餐厅后厨 vs 美食广场

传统编程 = 餐厅后厨

顾客点餐 → 按照固定菜谱步骤执行 → 出餐

想象一家传统餐厅:

  • 固定流程:厨师长制定了严格的菜谱(切菜→腌制→炒制→装盘)
  • 确定性:每个步骤都是预设的,不会根据顾客的心情改变
  • 预判所有可能:菜单上只有20道菜,顾客只能点这20道

代码体现:

if (userInput.contains("查物流")) {
    // 步骤1: 提取订单号
    String orderId = extractOrderId(userInput);
    // 步骤2: 调用物流接口
    String logistics = dubboService.query(orderId);
    // 步骤3: 格式化输出
    return "您的订单" + orderId + "状态是:" + logistics;
} else if (userInput.contains("退货流程")) {
    // 另一个固定流程...
}
AI编程 = 美食广场

顾客想吃什么 → 告诉商家有什么食材和厨具 → 商家根据需求现场创作

想象一个高端美食广场:

  • 提供能力描述:商家告诉顾客"我有新鲜海鲜、进口牛肉、专业烤箱、铁板"
  • 按需组合:顾客可以说"我想吃辣的、用铁板做的海鲜",商家现场创作
  • 不预判具体需求:商家不知道顾客会点什么,但知道自己的"能力范围"

AI代码体现:

// 只描述"有什么",不规定"怎么用"
@Tool(description = "查询指定订单号的物流状态")
public String queryOrderLogistics(String orderId) { ... }

@Tool(description = "从售后知识库检索退货流程、保修政策")
public String retrieveFromKnowledgeBase(String query) { ... }

// AI根据用户输入,自主决定调用顺序和组合方式

📊 对比表格:传统编码 vs AI编码

维度

传统程序编码

AI大模型编码

💡 核心差异

核心思想

写流程 - 告诉计算机每一步做什么

写能力 - 告诉AI你有什么,让它自己决定怎么用

从"how to do"到"what can do"

代码本质

指令式:if-else, for-loop, switch-case

声明式:@Tool描述,让AI决策

从"控制"到"赋能"

处理逻辑

预设所有分支路径

根据上下文动态决策

静态 vs 动态

扩展方式

增加新的if-else或switch case

增加新的@Tool方法

硬编码 vs 插拔式

流程控制

开发者预先编排

AI实时编排

预编排 vs 实时编排

应对未知

只能处理预设场景,超出则报错

可灵活组合能力应对新场景

封闭世界 vs 开放世界

典型代码

if(user says A) do X; else if(user says B) do Y

@Tool(description="当用户需要X时调用") doX()

过程式 vs 意图式

维护成本

需求变化需要修改流程代码

只需增加/优化工具描述

高耦合 vs 低耦合

🏗️ 架构思维的转变

传统三层架构:预先编排
用户输入 → 意图分类器(硬编码) → 执行预定流程 → 返回结果
                 ↓
         [查物流] → 调用物流接口 → 格式化 → 返回
         [退货咨询] → 查询知识库 → 格式化 → 返回
AI智能体架构:动态编排
用户输入 → AI大模型(理解意图) → 动态调用工具 → 整合结果 → 返回
                 ↓
          [自主决策调用哪些工具]
          ┌───┴───┐
     queryOrderLogistics  retrieveFromKnowledgeBase
          ↓                       ↓
     (订单系统)              (知识库)

💻 代码对比:同一个需求的不同实现

需求:处理"我想退货,顺便查一下订单OD123的物流"

传统方式(需要预判所有组合)
@RestController
public class CustomerServiceController {

    // 开发者必须预判所有可能的组合场景
    @GetMapping("/handle")
    public String handle(String input) {
        if (input.contains("退货") && input.contains("物流")) {
            // 组合场景1:同时问退货和物流
            String orderId = extractOrderId(input);
            String logistics = orderService.queryLogistics(orderId);
            String returnPolicy = knowledgeBase.query("退货流程");
            return returnPolicy + ",另外" + logistics;

        } else if (input.contains("退货") && input.contains("退款")) {
            // 组合场景2:退货和退款
            // 另一套逻辑...

        } else if (input.contains("物流") && input.contains("投诉")) {
            // 组合场景3:物流和投诉
            // 再一套逻辑...

        }
        // 需要预判所有组合?这不可能!
    }
}
AI方式(只描述能力,AI动态组合)
@RestController
public class AgentController {

    @GetMapping("/chat")
    public Flux<String> chat(String message) {
        return chatClient.prompt()
        .user(message)
        .defaultTools(serviceTools)  // 只告诉AI有什么工具
        .stream()
        .content();
    }
}

@Service
public class ServiceTools {

    // 只描述能力,不规定使用场景
    @Tool(description = "查询指定订单号的物流状态")
    public String queryOrderLogistics(String orderId) {
        return dubboService.query(orderId);
    }

    @Tool(description = "从售后知识库检索退货流程相关信息")
    public String retrieveFromKnowledgeBase(String query) {
        return vectorStore.similaritySearch(query);
    }

    // 未来新增能力,无需修改流程
    @Tool(description = "查询用户的积分余额")
    public String queryUserPoints(String userId) {
        return pointsService.getBalance(userId);
    }
}

🎭 现实场景的威力

当用户提出一个从未预料到的组合需求时:

"我想退货,查一下物流,顺便看看退货后我的积分会不会受影响"

  • 传统程序:😱 没写过这个组合,报错或返回"暂不支持"
  • AI程序:😎 我有三个工具(退货流程、物流查询、积分规则),组合一下就能回答

📝 一句话总结

传统编程是"告诉计算机每一步怎么做",而AI编程是"告诉AI你有什么能力,让它自己决定怎么做"。前者需要预判所有可能性,后者只需要描述好能力边界。

🎯 给技术决策者的建议

当向团队或领导阐述这个转变时,可以这样说:

"我们不再需要穷举所有用户可能问的问题组合,而是构建一套'能力工具箱',并让AI理解这些工具能做什么。AI会根据每个用户的实时需求,自主决定如何组合这些工具来解决问题。这就像从'开菜单'升级到了'开放厨房'——用户想吃什么,我们有食材和厨具,现场做。"

更多推荐