Skip to content

范式转变:AI原生应用与不确定性编程

"The hottest new programming language is English." — Andrej Karpathy

过去五十年,软件工程师一直在学习用机器听得懂的语言(C++、Java、Python)与计算机交流。随着大语言模型的崛起,自然语言正在成为新的编程语言——这不只是语法的改变,而是软件开发范式的根本性转移。本篇合并了系列原稿中「自然语言编程」「AI 原生定义」「不确定性编程」三篇的核心内容,回答三个问题:开发者的角色变成了什么?什么才算 AI 原生应用?概率性组件之上如何构建可靠系统?

一、开发者角色的三次跃迁

时代角色核心能力关注点
1.0 汇编与底层Bit Manipulator内存管理、寄存器操作、算法优化如何让机器跑得更快
2.0 高级语言与框架Framework Architect设计模式、系统架构、API 设计如何构建可维护可扩展的系统
3.0 AI 原生工程Prompt Engineer / AI Architect提示词工程、上下文管理、Evals、模型编排如何精准描述意图并验证 AI 输出

在 3.0 时代,Coding(编码)本身变成低价值劳动,Specification(需求定义)和 Verification(验证)成为核心竞争力。两个立即可用的实践:

伪代码 Prompting:直接写自然语言往往啰嗦且有歧义,用函数签名 + docstring 约束需求,结合代码的结构化优势与自然语言的表达力,能显著降低幻觉。

python
def find_max_custom(lst: List[int]) -> Optional[int]:
    """
    Requirements:
    1. Iterate through list manually.
    2. Do NOT use max() or sort().
    3. Handle empty list case -> return None.
    4. Time Complexity: O(n).
    """
    # implementation here

TDD 复兴:你不再逐行写代码,就必须通过测试用例来约束 AI 的行为——先写 test_find_max(),再让 AI 生成通过测试的实现。在 AI 生成代码的时代,TDD 不再是可选项。

工具链也在同步进化:Cursor 的核心优势是 Codebase RAG(检索项目中的现有代码,生成符合项目规范的实现);Devin 类自主编码 Agent 则完成「读 Issue → 规划 → 修改 → 跑测试 → 自行 Debug → 提 PR」的完整循环。架构师的新职责随之变为定义 System Prompts 与 Context Boundaries:设计上下文压缩与检索策略,用 Linting 等静态分析工具做 AI 输出的第一道防线。

二、什么才算 AI 原生(AI-Native)?

当福特发明汽车时,人们说想要「一匹更快的马」。现在很多 AI 应用就是「装了引擎的马车」:Chatbot 把命令行变成自然语言输入框,Copilot 在侧边栏加个聊天窗口——这些是 AI-Enhanced(AI 增强),不是 AI-Native(AI 原生)。

判断标准很简单:如果把 AI 拿掉,这个产品就不复存在或体验彻底崩塌,才是 AI 原生。核心特征:

  1. 自然语言是一等公民:不仅是输入,更是控制逻辑。
  2. 生成式 UI:界面不是预定义的,而是根据用户意图动态生成。
  3. 多模态融合:视觉、听觉、触觉无缝切换。
  4. 主动性:不仅响应指令,更能预测需求并主动行动。

五种颠覆性交互范式

范式代表产品核心机制
生成式界面 Generative UIVercel v0、Galileo AILLM 输出组件树 JSON,前端引擎动态渲染,千人千面
无限画布 Infinite CanvasMiro AI、Figma Jam圈选区域 AI 总结、拖拽文件 AI 解析关联
隐式交互 Zero-UIRewind、MemContext Aware + 预测式准备(打开会议软件自动备好纪要模板)
拟人化代理Character.ai、Pi情感计算 + 长期记忆的数字生命
混合控制 Hybrid ControlCursor、Copilot WorkspaceIntent to Code、Diff Review、Auto-Fix,人类从 Operator 变成 Supervisor

架构三层的对应变化

  • 数据层:从关系型数据库到向量数据库,核心资产是用户的 Embedding(兴趣、行为、历史)。
  • 逻辑层:从 if condition: action 的规则引擎到 Prompt -> LLM -> Probability -> Action 的概率模型。
  • 交互层:从命令式(点击按钮 A 触发事件 B)到声明式(用户表达意图,系统自动规划步骤)。

三、不确定性编程:在概率组件上构建确定性系统

逻辑层变成概率模型后,第一个工程难题就来了:调用 completion.create() 时,你无法确切知道模型会输出什么。LLM 输出的本质是预测下一个 Token 的概率分布,即使 Temperature = 0(贪婪解码),浮点数精度也会带来微小波动。

不同业务对确定性的容忍度截然不同:创意写作、闲聊可以接受高方差;数据提取、API 调用、金融分析则要求严格输出。对低容忍场景,有四种成熟的架构模式。

模式一:结构化输出强制(Schema Enforcement)

不让 LLM 自由发挥,强制其输出符合 Schema 的数据,把自然语言的模糊输出「坍缩」为强类型结构化数据。

python
class UserInfo(BaseModel):
    name: str
    age: int
    email: str

response = client.chat.completions.create(
    model="gpt-4-turbo",
    messages=[...],
    tools=[{
        "type": "function",
        "function": {
            "name": "extract_user_info",
            "parameters": UserInfo.model_json_schema()
        }
    }]
)

更底层的做法是语法约束解码(Constrained Decoding):在推理阶段直接干预 Token 选择——Schema 要求整数时,模型只能从 [0-9] 的 Token 集合中采样。工具:Guidance、Outlines、LMQL。

模式二:防御性重试与自愈循环

拿到 LLM 输出后立即跑验证器:格式(JSON 是否合法)、类型(字段类型匹配)、逻辑(数值范围合理)、事实(RAG 场景引用是否存在)。验证失败不直接报错,而是把错误信息喂回 LLM 让它自我修正:

python
def robust_completion(prompt, max_retries=3):
    for i in range(max_retries):
        response = llm.generate(prompt)
        try:
            validate(response)
            return response
        except ValidationError as e:
            prompt += f"\nPrevious output was invalid: {e}. Please fix it."
    raise Exception("Max retries exceeded")

这正是自主编码 Agent 的核心循环:生成代码 → 运行测试 → 报错 → 错误日志喂回模型 → 重新生成。

模式三:多路投票与集成(Ensembling)

一次调用不可靠,就调用多次。Self-Consistency:让模型生成多条推理路径,对最终答案做多数投票(路径 A→42、路径 B→42、路径 C→43,取 42)。混合模型集成:用不同架构的模型(GPT-4 + Claude + Llama)并行处理同一任务,结果一致则可信度极高,不一致则引入更强的仲裁者评判。

模式四:评估驱动开发(EDD)

在不确定性系统中,单元测试变成了评估集(Evals)。传统的 assert result == expected 不再适用,取而代之的是:

  • 语义相似度匹配:Embedding Cosine Similarity > 0.9。
  • 关键点包含assert "revenue" in response
  • LLM-as-a-Judge:用强模型给弱模型的输出打分。

每次修改 Prompt 或更换模型后必须跑一遍 Evals,量化地看到准确率变化。这是应对不确定性的终极保障。

不确定性并不可怕,它是 AI 创造力的来源。架构师的任务不是消除不确定性,而是管理它:用结构化强制收窄输出空间,用防御性重试兜底,用多路投票提升置信度,用 Evals 体系保证迭代不回退。想清楚「如果这个产品今天从零开始做,有了 LLM 的能力,它应该长什么样」,再用这套工程方法把概率模型驯化为可靠的业务组件——这就是 AI 原生架构的起点。