传统编码与基于AI大模型的编码区别
核心思想:从"流程指令"到"能力描述"的转变
🌉 一个生动的比喻:餐厅后厨 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 开放世界 |
|
典型代码 |
|
|
过程式 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会根据每个用户的实时需求,自主决定如何组合这些工具来解决问题。这就像从'开菜单'升级到了'开放厨房'——用户想吃什么,我们有食材和厨具,现场做。"
更多推荐

所有评论(0)