当前 LLM 与 AI 应用交互的三大范式:从工具调用到自主智能的进化之路

前两天,Manus 爆火,其邀请码一度被炒到上万元(道听途说的)。紧随其后,开源社区迅速推出了 OpenManus,短短两天内 GitHub Star 数量突破 15K+(开始写文章前还是 14.5 K),且仍在持续增长。这不仅反映了用户对 Manus 这种 AI Agent 的极大兴趣,更体现了 AI 应用在交互范式上的新趋势。

长期以来,我们主要通过 云端大模型(如 ChatGPT、Claude)与 AI 进行交互,但云端 AI 也存在一些不可忽视的局限性:

  • 隐私问题:云端模型需要上传数据,部分用户对数据安全存疑。
  • 响应速度:本地 AI 可以减少延迟,提供更流畅的用户体验。
  • 个性化:本地 AI 可以更深入理解用户需求,而云端模型通常是通用的,个性化能力有限。

Manus 可能是人们想象中的 AI Agent。但更深层次来看,Manus 及其开源替代 OpenManus 的大火,反映了 AI 应用的三种核心交互范式正在逐步演进:
Function Calling → MCP(Model Context Protocol)→ AI Agent

这三种范式代表了 AI 助手从简单 API 调用,到标准协议,再到完全自主智能体的演进路径

1. Function Calling:AI 作为「插件调用器」

Function Calling 是 AI 与外部系统交互最开始的一种机制,它允许 LLM 在对话过程中自动调用 预定义的函数(API) 来执行某些任务。换句话说,Function Calling 让 AI 不仅仅是回答问题的助手,而是能够主动调用外部服务,执行特定功能的智能体。

Function Calling 充当了 AI 模型与外部系统之间的桥梁,不同的 AI 平台对 Function Calling 有不同的实现方式。例如:

  • OpenAI 的 GPTs:允许开发者定义自定义函数,GPT 在需要时调用这些函数。
  • Anthropic Claude 的 Tool Use:支持类似的工具调用机制,Claude 可以基于用户请求自动选择合适的工具。
  • 阿里百炼(Qwen)的插件:提供插件机制,让 LLM 能够调用外部 API 执行任务。

1.1 Function Calling 的基本流程

实现 Function Calling 需要以下几个步骤:

  1. 定义可调用的函数

    • 由开发者提供 API,并定义函数的名称、描述、输入参数和返回值。
  2. AI 识别何时调用函数

    • 当用户的请求涉及函数相关的任务时,AI 需要决定是否调用函数,并填充参数。
  3. AI 生成函数调用请求

    • AI 生成结构化的 JSON 格式请求,向外部 API 发送调用指令。
  4. 外部 API 执行任务并返回结果

    • 服务器或插件执行任务,并返回结果给 AI。
  5. AI 解析结果并回复用户

    • AI 结合 API 返回的数据,生成最终的用户响应。

1.2 Function Calling 的优缺点

Function Calling 的优势

低开发成本
开发者只需定义 API,AI 便可调用,无需训练新模型。

可控性强
开发者可以严格规定 AI 能调用的函数,确保安全性。

适用于单步任务
适合天气查询、数据库查询、发送邮件等任务。

Function Calling 的局限性

缺乏上下文管理

  • Function Calling 不具备记忆能力,每次调用都是独立的,无法跨会话存储调用历史。
  • 例如,用户问:“昨天查的天气怎么样?” AI 可能不会记得之前的查询。

不适用于复杂任务

  • Function Calling 适用于边界清晰、描述明确的任务,但对多步骤任务、推理任务支持较差。
  • 例如:“帮我订一个符合我过去偏好的酒店,并用公司邮箱发确认邮件。” 这个任务涉及搜索、筛选、邮件发送,Function Calling 很难完成。

不同 AI 平台互不兼容

  • OpenAI、Claude、Qwen 的 Function Calling 机制不同,开发者需要针对不同平台编写不同的 API 适配逻辑

以 Claude 官方描述为例子,大概是这样:

1.3 Claude 工具调用示

以 Anthropic 官方文档 使用 Claude 的工具功能 为例,使用 Claude Tool Use API 进行工具调用的完整示例如下:

1. 定义工具

在 API 请求中,我们需要定义 Claude 可调用的工具。例如,我们定义一个 天气查询工具 get_weather,用于获取指定城市的天气信息。

示例工具定义 (tools 参数):

{
  "tools": [
    {
      "name""get_weather",
      "description""获取指定城市的当前天气",
      "input_schema": {
        "type""object",
        "properties": {
          "location": {
            "type""string",
            "description""城市名称,例如 '北京' 或 'San Francisco'"
          },
          "unit": {
            "type""string",
            "enum": ["celsius""fahrenheit"],
            "description""温度单位,'celsius' 或 'fahrenheit'"
          }
        },
        "required": ["location"]
      }
    }
  ]
}

2. 发送用户请求

在 API 请求中,我们可以提供用户的输入,例如:

{
  "model""claude-3-opus-20240229",
  "messages": [
    {
      "role""user",
      "content""旧金山现在的天气如何?请使用 get_weather 工具获取信息。"
    }
  ],
  "tools": [
    {
      "name""get_weather",
      "description""获取指定城市的当前天气",
      "input_schema": {
        "type""object",
        "properties": {
          "location": {
            "type""string",
            "description""城市名称,例如 '北京' 或 'San Francisco'"
          },
          "unit": {
            "type""string",
            "enum": ["celsius""fahrenheit"],
            "description""温度单位,'celsius' 或 'fahrenheit'"
          }
        },
        "required": ["location"]
      }
    }
  ],
  "tool_choice""auto"
}

3. Claude 触发工具调用

Claude 识别到 get_weather 工具可用于回答用户问题,并返回 tool_use 事件:

{
  "role""assistant",
  "content": [
    {
      "type""tool_use",
      "id""toolu_01A09q90qw90lq917835lq9",
      "name""get_weather",
      "input": {
        "location""San Francisco",
        "unit""celsius"
      }
    }
  ]
}

此时,Claude 等待外部工具执行,然后返回结果。

4. 服务器执行工具逻辑

在后端,我们接收到 get_weather 的调用信息,并查询天气 API(如 OpenWeatherMap),然后返回结果:

{
  "role""user",
  "content": [
    {
      "type""tool_result",
      "tool_use_id""toolu_01A09q90qw90lq917835lq9",
      "content""当前温度为 15°C,晴朗。"
    }
  ]
}

5. Claude 处理工具结果并回复

Claude 解析 tool_result 并向用户提供最终回答:

{
  "role""assistant",
  "content""旧金山目前的温度是 15°C,天气晴朗。"
}

最终,用户收到的回复可能是:

“旧金山目前的温度是 15°C,天气晴朗。”

Function Calling 解决了 AI 访问外部工具的问题,但它无法管理上下文、无法执行多步骤任务。因此,MCP 作为 Function Calling 的进化版本,提供了 更强的上下文管理能力,使 AI 可以在多个 API 之间进行协作,从而完成更复杂的任务。

2. MCP:AI 时代的协议标准

MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 在 2024 年 11 月推出的开放协议,旨在提供一种标准化方式,让 LLM 访问外部 API 和数据源。相较于 Function Calling,MCP 具备 更强的上下文管理能力,使 AI 能够在多个 API 之间进行协作,从而完成更复杂的任务。

2.1 为什么 MCP 可能会是一个突破?

在过去的一年里,AI 模型(如 GPT-4.5、Claude Sonnet 3.7、DeepSeek R1)在推理能力和减少幻觉方面取得了显著进步。然而,尽管 AI 应用爆发式增长,它们仍然主要作为独立服务,而不是无缝集成到现有系统中

例如:

  • AI 仍然无法同时完成 联网搜索、发送邮件、发布博客 等多个任务,尽管单个任务的实现并不难。
  • AI 无法直接与 IDE、数据库、云服务 等现有工具集成,开发者仍需手动操作。

设想一个真实的开发环境,如果 IDE 具备 AI 能力,它应当能够:

  • 查询本地数据库,辅助开发者理解数据结构。
  • 搜索 GitHub Issue,判断某个问题是否是已知 bug。
  • 自动 Code Review,并将 PR 反馈发送到 Slack 或邮件。
  • 查询并修改 AWS、Azure 配置,实现自动化部署。

然而,这些功能的实现并非易事,因为:

  • 企业级数据敏感,需要严格的访问控制和权限管理。
  • 缺乏开放、通用的协议,导致 AI 很难与不同的服务对接。

MCP 提供了一个 开放、通用、可扩展 的协议,解决了 AI 无法高效集成现有系统 的问题。

在 MCP 之前,OpenAI 曾推出 Function Calling,但它仍然是封闭的 API 机制,无法形成通用标准。而 MCP 作为 行业标准,被多个技术社区和企业采纳,推动了 AI 在 IDE、云服务、数据库、API 生态 等多个领域的应用。

但是最终成不成,还得看社区的接受程度以及大厂是否加入。

2.2 MCP 组成

MCP 由以下五个部分组成:

组件 作用
MCP Host 运行 AI 模型的应用,如 Claude Desktop、Cursor
MCP Client 在 Host 内部,管理与 MCP 服务器的通信
MCP Server 提供 工具、数据源、API,供 AI 调用
Local Data Sources 本地数据,如 文件系统、数据库
Remote Services 远程 API,如 GitHub、Slack、AWS

下图是官方提供的 MCP 架构图:

2.3 MCP 如何与 AI Agent 交互?

MCP Server 作为 AI Agent 的工具接口,告诉 AI 有哪些可用的服务,并提供 调用 API 的能力

例如:

  1. AI 需要搜索 GitHub 代码库并创建 Issue。
  2. MCP Server 提供 search_repositoriescreate_issue API。
  3. AI 代理根据任务需求决定调用顺序。
  4. AI 通过 MCP 查询本地日志搜索 GitHub Issue创建新 Issue发送 Slack 通知,形成完整的自动化工作流。

2.4 为什么 MCP 比 Function Calling 更强?

1. Function Calling 的局限性

特性 Function Calling MCP
调用方式 由 AI 直接调用 API 通过标准化协议与多个服务交互
上下文管理 仅支持单次调用 具备 多轮交互任务编排 能力
适用场景 简单任务(如查询天气) 复杂任务(如 DevOps 自动化)
可扩展性 需要为每个 API 定制代码 通用协议,可复用

MCP 不仅能调用 API,还支持:

  • 跨服务任务管理(如 AI 在 IDE 内操作代码,同时管理云端资源)。
  • 持久化上下文(AI 可记住任务状态,避免重复操作)。
  • 标准化 API 交互(不同 AI 平台可共用 MCP 服务器)。

2. MCP 解决了 AI Agent 的碎片化问题

在 MCP 之前,AI Agent 需要手动整合多个 API,开发者必须:

  1. 定义 Function Calling API,并为每个 API 编写调用逻辑。
  2. 管理 API 之间的上下文,确保多步任务正确执行。
  3. 处理不同 API 返回的数据格式,防止解析错误。

MCP 通过 标准化协议 解决了这些问题,使 AI Agent 可以自动发现、调用、管理 API,无需开发者手动配置。

3. AI Agent:完全闭环的智能体

3.1 什么是 AI Agent?

AI Agent(人工智能代理)是当前可见的AI 交互范式的终极形态,它不仅仅是一个调用 API 的助手,而是一个 能够自主决策、执行任务,并持续优化自身行为 的自治智能体。相比 Function Calling 和 MCP,AI Agent 不再依赖用户的逐步指令,而是能够 自主规划任务,并动态调整执行方案

我们可以用一个简单的对比来理解这三者的区别:

交互范式 Function Calling MCP AI Agent
AI 角色 API 调用助手 任务编排器 自主智能体
任务执行 需要用户明确指示调用 API 可管理多个 API 交互 可自主决策、迭代任务
上下文管理 无记忆,每次调用独立 具备多轮交互能力 具备长期记忆,能适应变化
适用场景 单步 API 任务 跨 API 任务编排 复杂、多阶段任务(如自动化运营、智能助手)

换句话说,AI Agent 具备真正的「智能」,它可以:

  • 自主规划任务:无须手动指定 API 调用顺序,AI Agent 可根据目标自动生成执行步骤。
  • 动态调整策略:如果 API 失败或结果不符合预期,Agent 可以自主尝试其他方法,而不是直接报错。
  • 长期记忆 & 适应性:Agent 具备 长期记忆,可以在不同任务之间保持上下文,甚至学习用户的偏好。

3.2 AI Agent 的核心能力

AI Agent 具备四项关键能力,使其区别于 Function Calling 和 MCP:

1. 任务分解与规划

Agent 在接收到用户指令后,首先会进行 任务分解,确定达成目标所需的各个步骤。例如:

用户需求:帮我预订一间符合我过去偏好的酒店,并用公司邮箱发送确认邮件。

传统 Function Calling 方式:

  1. 需要用户手动调用 search_hotels API,查询符合条件的酒店列表。
  2. 需要用户手动筛选酒店,并调用 book_hotel API 进行预订。
  3. 需要用户手动调用 send_email API 发送确认邮件。

AI Agent 方式:

  1. 自动查询用户历史预订偏好(如价格区间、酒店品牌、地理位置)。
  2. 调用 search_hotels API 并筛选合适选项,根据历史数据自动推荐最优解。
  3. 调用 book_hotel API 自动完成预订,无需用户干预。
  4. 调用 send_email API 发送确认邮件,附带订单详情。

Agent 无需用户手动执行每一步,而是自主规划整个任务链

2. 动态 API 调用 & 失败恢复

AI Agent 具备 动态 API 调用能力,它可以:

  • 根据需求,动态选择最优 API(无须用户手动指定)。
  • 在 API 失败时,自动尝试替代方案,而不是直接报错。
  • 根据实时数据调整策略,例如价格变动、库存变化等。

示例:

任务:用户让 AI 预订一张去巴黎的机票,并选择最便宜的航班。

如果 get_flight_prices API 失败:

  • Function Calling:直接报错,用户需要手动重试。
  • MCP:可能会调用 get_backup_prices API,但仍需用户介入。
  • AI Agent:会 自动重试或切换至备用 API,如 Skyscanner、Google Flights,甚至尝试不同日期。

Agent 具备 自适应能力,可以 动态应对变化和失败情况

3. 记忆 & 长期学习

Function Calling 和 MCP 都是「短期记忆」系统,每次请求都是独立的,而 AI Agent 具备 长期记忆能力,它可以:

  • 记住用户偏好(如常住城市、喜欢的航司、预算范围)。
  • 根据历史交互优化决策(例如某个用户偏好五星级酒店,Agent 会优先推荐)。
  • 跨任务共享信息(预订航班后,Agent 还会提醒用户预订酒店)。

示例:

任务:用户让 AI 预订一张去巴黎的机票,并选择最便宜的航班。

  • Function Calling / MCP:会查询机票,但不会记住用户的航班偏好。
  • AI Agent:会记住用户过去的航班选择,例如:

    • 偏好直飞,而非转机。
    • 偏好下午航班,而非早晨航班。
    • 偏好特定航司(如国航或法航)。

下次用户预订机票,Agent 无需用户重复输入这些偏好,而是 自动优化查询条件

4. 自主决策 & 反馈迭代

AI Agent 具备 自主决策能力,它可以:

  • 根据环境变化调整策略(如价格变动、天气影响)。
  • 在多种可能性中选择最优解(如多个 API 返回不同结果时,Agent 可权衡选择)。
  • 与用户交互,智能迭代(如果用户不满意推荐,Agent 会优化结果)。

示例:

任务:用户让 AI 规划一次日本旅行,包括机票、酒店和活动推荐。

Function Calling:

  • 需要用户手动调用 search_flightssearch_hotelssearch_activities API,并自己整合信息。

MCP:

  • 可以让 AI 代理协调多个 API,但仍然需要用户逐步确认

AI Agent:

  1. 查询用户偏好(如预算、喜欢的景点、过往旅行记录)。
  2. 生成最佳行程方案(自动选择航班、酒店、活动)。
  3. 主动与用户交互(如果用户不喜欢某个选项,Agent 会自动调整)。
  4. 动态优化计划(如果机票涨价,Agent 会推荐更便宜的替代方案)。

Agent 具备的 自主决策能力,让 AI 真正具备“智能”

3.3 OpenManus 的 4 个能力体现

OpenManus 是一个框架,当前还是是一个简单的框架,简单的实现了 AI Agent 的这 4 个能力。

1. 任务分解与规划

OpenManus 通过 PlanningAgent 管理任务规划,其本身也是一个 LLM 的 API 请求,其 Prompt 翻译成中文,大概如下:

你是一名专家级的规划代理,负责通过创建和管理结构化计划来解决复杂问题。

你的工作包括:

  1. 分析请求,理解任务范围;
  2. 使用 planning 工具 创建清晰、可执行的计划;
  3. 根据需要执行步骤,使用可用工具完成任务;
  4. 跟踪进度并动态调整计划,确保任务顺利进行;
  5. 使用 finish 结束任务,当任务完成时正式收尾。

可用工具将根据任务不同而变化,但可能包括:

  • **planning**:创建、更新和跟踪计划(可执行命令:create、update、mark_step 等)。
  • **finish**:任务完成时用于结束任务。

请将任务拆解为逻辑清晰、循序渐进的步骤,并考虑任务的依赖关系及验证方法

2. 动态 API 调用 & 失败恢复

在 OpenManus 的 toolcall 的调用中,如下:

async def act(self) -> str:
    try:
        result = await self.execute_tool(command)
        self.step_execution_tracker[tool_call_id]["status"] = "completed"
    except Exception as e:
        logger.warning(f"Failed to execute tool: {e}")
        # 失败恢复机制
        self.step_execution_tracker[tool_call_id]["status"] = "failed"

  • 支持动态工具调用
  • 包含错误处理和恢复机制
  • 工具执行状态追踪

3. 记忆 & 长期学习

schema.py 中通过 Memory 类实现:

class Memory(BaseModel):
    messages: List[Message] = Field(default_factory=list)
    max_messages: int = Field(default=100)

    def add_message(self, message: Message) -> None:
        self.messages.append(message)
        if len(self.messages) > self.max_messages:
            self.messages = self.messages[-self.max_messages :]

    def get_recent_messages(self, n: int) -> List[Message]:
        return self.messages[-n:]
  • 维护对话历史
  • 支持消息存储和检索
  • 实现上下文记忆管理

4. 自主决策 & 反馈迭代

agent/base.py 中实现:

async def step(self) -> str:
    # 思考和决策
    should_continue = await self.think()
    
    if not should_continue:
        self.state = AgentState.FINISHED
        return "Task completed"
        
    # 执行动作
    result = await self.act()
    
    # 检查是否陷入循环
    if self.is_stuck():
        self.handle_stuck_state()
  • 自主思考和决策能力
  • 循环检测和处理
  • 状态管理和迭代优化
  • 支持反馈调整

这四个核心能力通过不同的模块协同工作,形成了一个完整的智能代理系统:

  • 规划模块负责任务分解
  • 工具调用模块处理动态执行
  • 记忆模块维护上下文
  • 基础代理类实现决策逻辑 这种设计使得系统能够灵活应对各种任务,并在执行过程中不断优化和调整。

3.4 AI Agent 的应用场景

随着 AI Agent 技术的发展,它可能会在多个领域发挥作用:

  • 智能办公助手:自动处理会议安排、邮件回复、文档整理、报告输出。
  • 自动化 DevOps:监控服务器状态、自动执行 CI/CD、处理告警。
  • AI 财务顾问:分析用户消费习惯,提供投资建议。
  • 个性化 AI 助手:根据用户习惯优化推荐,如智能家居控制、健康管理等。

AI Agent 将彻底改变人机交互方式,从 被动响应 变为 主动辅助,甚至 完全自主执行任务

4. 从 Function Calling 到 AI Agent,AI 交互范式的最终进化

Function CallingMCP,再到 AI Agent,我们即将见证了 AI 交互模式的重大演进:

  1. Function Calling(工具调用):AI 作为 API 调用助手,适用于简单任务(如天气查询、数据库查询)。
  2. MCP(模型上下文协议):AI 具备上下文管理能力,可协调多个 API 执行复杂任务(如 DevOps 自动化)。
  3. AI Agent(自主智能体):AI 具备自主决策、长期记忆、任务规划能力,实现真正的智能交互。

AI 未来的发展方向,已经从「回答问题」向「主动执行任务」转变

随着 AI Agent 技术的成熟,未来,我们可能会看到:

  • AI Agent 的崛起:Manus 只是开始,未来会有更多类似的 AI Agent 出现,并针对不同场景进行优化。
  • 云+本地混合模式:本地 AI 负责隐私数据处理,云端 AI 负责复杂推理,两者结合提供最佳体验。
  • AI 操作系统的雏形:AI 不再只是一个聊天助手,而是一个真正的「数字助理」,能够管理用户的日常任务、自动执行操作,并与各种应用无缝集成。

以上。

AI 编程后,软件的本质复杂度会有变化吗?

最近一直在深度使用 AI 编程,从完全无代码的开发哥网站,到 AI 生成后台代码;从 Cursor 到 Trae AI,能明显感受到 AI 可以帮我写大量代码。最多的时候,5 个小时写了超过 2000 行可以运行的代码。但一个奇怪的感受是,尽管 AI 让代码生产更快了,软件开发的复杂度却没有降低,项目的构建需要的心力依然和以前一样。

这让我不禁思考:AI 真的在降低软件开发的复杂度吗?还是说,复杂度只是被转移了?


1. AI 编程 ≠ 复杂度消失,而是复杂度转移

在《人月神话》中,布鲁克斯提出了软件开发的四大本质复杂度:复杂度、一致性、可变性、不可见性。即使 AI 能够自动生成代码,这些复杂性依旧存在。

  • 业务复杂性:AI 可以帮我们写代码,但它无法自动理解业务规则的变化。例如,一个 AI 生成的电商促销规则,可能在逻辑漏洞下导致「满 100 减 200」这样的错误,造成严重损失。
  • 技术复杂性:AI 可以优化 SQL 查询、生成索引,但 AI 生成的代码仍然可能隐藏性能瓶颈,甚至带来更高的架构耦合度。
  • 治理复杂性:AI 代码的可维护性、可解释性,仍然是一个巨大的挑战。AI 生成的代码往往不是“最优解”,而是“看起来能跑”的解。

AI 并没有消除软件开发的复杂度,而是将其转移到了其它的层面:

传统复杂度 AI 时代的复杂度转移
人工编写 CRUD 代码 提示工程(Prompt Engineering)
手动优化数据库索引 AI 生成索引,但需要人类调优
代码逻辑的可读性 AI 生成的代码可能变成「黑盒」
需求沟通的精确表达 需要用更严谨的自然语言指导 AI

2. AI 让开发更快,但项目建设更复杂

布鲁克斯认为,软件开发的困难分为根本困难(Essential Complexity)和次要困难(Accidental Complexity):

  • 根本困难:软件本身的固有复杂性,不会因技术进步而消失。
  • 次要困难:开发过程中人为引入的复杂性,如编程语言、工具、调试方式等,可以通过技术优化。

AI 编程 主要解决的是「次要困难」,但无法消除「根本困难」。让我们来看看布鲁克斯提出的软件开发四大根本困难,以及 AI 编程是否真的能克服它们。

2.1 复杂度(Complexity)

布鲁克斯认为,软件的复杂度源自以下几个因素:

  • 组件交互的指数级增长(比如微服务架构)。
  • 代码状态的激增(如并发编程)。
  • 业务逻辑的无限变化(如金融风控规则)。
  • 缺乏对整个系统的全局掌控能力。

AI 确实能快速生成代码,但它无法减少软件的业务复杂性。 例如:

  • AI 可以帮你写一个支付系统的 API,但它无法理解跨境支付的法律法规,仍然需要人类去设计合规架构。
  • AI 生成的代码可能没有考虑到以前没有见过异常情况,导致后期维护困难。

结论:AI 不会减少软件的复杂度,只是让代码生产更快,但架构和业务逻辑的复杂性依然存在。

2.2 一致性(Consistency)

软件必须兼容历史系统、旧数据、第三方 API 和用户习惯,这导致:

  • 新系统必须适配旧架构。
  • 代码风格和 API 设计必须保持一致。
  • 数据格式、协议、接口规范不能随意更改。

AI 可能会破坏一致性,而不是增强一致性。

  • AI 生成的代码风格可能不统一,团队成员需要额外时间进行重构。
  • AI 可能会引入隐性的兼容性问题,导致老系统无法正常运行。

结论:AI 不能自动保证代码和系统的一致性,反而可能引入新的不兼容问题。

2.3 可变性(Changeability)

软件必须不断适应需求变化:

  • 政策法规变化(如 GDPR 隐私保护要求)。
  • 新业务功能增加(比如直播带货)。
  • 技术栈升级或迁移(比如从 MySQL 迁移到 PostgreSQL 等)。

AI 确实可以加速代码变更,但它无法理解业务变更的深层逻辑

  • AI 可能会机械地替换代码,但不会思考整体架构是否需要调整
  • AI 可能会优化单个函数,但不会考虑整个系统的长期演进

结论:AI 可以加速代码变更,但无法主动适应业务变化,反而可能增加技术债务

2.4 不可见性(Invisibility)

软件不像建筑或者机械产品那样,可以从物理空间上直观理解。软件的结构是逻辑性的,导致:

  • 沟通困难:不同开发者对系统的理解可能不同。
  • 调试困难:AI 生成的代码可能变成「黑盒」,难以分析问题。
  • 架构复杂化:AI 生成代码可能会引入隐形的设计缺陷。

结论:AI 代码的「黑盒性」可能让软件的可见性更差,导致调试和维护的挑战更大。

3. AI 编程的真正价值:降低「次要困难」

虽然 AI 无法消除软件的根本复杂度,但它确实在减少次要复杂度(Accidental Complexity),包括: ✔ 代码生成:AI 可以帮你写 CRUD、API、测试代码,提高开发效率。
调试辅助:AI 可以自动分析日志、找出潜在 Bug。
文档生成:AI 可以自动补充代码注释,提升可读性。
代码优化:AI 可以推荐更优的算法或 SQL 查询,提高性能。

但与此同时,AI 也引入了新的复杂度: ❌ Prompt 设计复杂度:如何写出好的 Prompt,才能让 AI 生成高质量代码?AI 代码质量很大程度上依赖于输入的提示(Prompt),这意味着开发者需要掌握新的技能,比如如何编写高质量的 Prompt。 ❌ AI 代码治理:如何审查 AI 生成的代码,防止安全漏洞?
技术债务:AI 可能会生成「能跑但难维护」的代码,如何管理长远的架构演进? AI 可以帮助我们快速生成大量代码,但如何组织这些代码、保证架构的可维护性,仍然是开发者的责任。

4. 未来开发者的核心竞争力:驾驭 AI,而不是被 AI 取代

AI 编程时代,开发者的角色正在改变:

  • 过去,开发者的价值在于写代码
  • 未来,开发者的价值在于驾驭代码复杂度,利用 AI 高效开发

开发者的三大新技能

语义工程:如何用精准的 Prompt 让 AI 生成高质量代码?

  • AI 代码质量的高低,取决于开发者如何设计 Prompt。
  • 但 AI 无法判断哪种方案最适合当前业务场景,这仍然需要开发者的经验与判断。

AI 代码治理:如何审核 AI 代码,防止技术债务?

  • AI 代码可能会引入新的技术债务,比如:

    • 代码结构混乱,缺乏一致性
    • 逻辑错误难以发现
    • AI 生成的代码难以调试
  • 未来,AI 代码审查(AI Code Review)可能会成为开发流程的新标准。

架构思维:如何让 AI 代码符合长期可维护的架构设计?

  • 未来的开发者,需要具备更强的系统思维

    • 如何拆解业务需求?
    • 如何设计可扩展的架构?
    • 如何管理 AI 代码的质量?
  • 开发者需要从「被动写代码」转变为「主动设计系统」

5. 结尾

AI 让代码生成变得简单,但软件架构仍然需要人类设计。

未来,AI 编程会让开发变得更加高效,但开发者的核心竞争力将不再是写代码,而是驾驭复杂度

未来,AI 可能会替代低端的代码搬运工,但无法替代深刻理解复杂度的架构师

「AI 不会取代开发者,但懂得驾驭 AI 的开发者,将取代那些不懂 AI 的人。」

以上。

从 DeepSeek R1 的联网搜索和 RAG 聊起

在最早 ChatGPT 应用到 Bing 时我们就体验到了联网搜索的能力,最近大火的 DeepSeek R1 在其官网或者腾讯元宝的版本中部署了带有联网搜索的版本,甚至私有化部署的版本也可能通过 Page Assist 实现联网功能。

当用户勾选 联网搜索 功能时,可以将其视为一个 能够理解任何自然语言问题的智能搜索引擎,相比传统搜索引擎仅支持关键词匹配,LLM 结合联网搜索可以更智能地解析问题,并返回更精准的结果。特别是在 R1 的推理加持下,整个过程显得更为丝滑。

联网搜索不仅能够提升模型的实时信息获取能力,还能与 RAG 技术结合,使模型在回答问题时参考最新的搜索结果,提高准确性和可靠性。

之所以要增加联网搜索,增加 RAG 的逻辑,这些都是由大模型本身的问题造成的。

1. 大模型的问题

大语言模型(LLM)的知识来源于海量的离线数据训练,因此其信息具有时效性滞后问题。

一般来讲,主流 LLM 的训练数据通常滞后于其发布时间半年到一年以上。例如,GPT-4o-latest 的训练数据截止于 2024 年 6 月,而 DeepSeek-R1 的最新数据截止于 2024 年 7 月(问 DeepSeek-R1,它自己回答的)。这意味着 LLM 无法直接获取训练完成后发生的最新事件、科技进展或行业动态。

1.1 知识局限性

由于 LLM 依赖于静态数据集进行训练,其知识范围受到以下限制:

  • 无法获取最新信息:模型的知识仅限于训练数据中的内容,因此对于训练完成后发生的事件,它无法直接回答或提供准确的分析。
  • 缺乏实时数据支持:LLM 无法访问最新的网络信息,如新闻报道、财务数据、政策变动等。
  • 受限于训练数据的覆盖范围:即便是训练数据范围内的知识,LLM 也可能因为数据筛选、公开性限制等原因而无法掌握某些领域的最新进展。

为了解决这一问题,许多 LLM 引入了 联网搜索 机制,使得模型能够动态检索最新的网络信息,从而提供更具时效性的回答。

联网只解决了部分大模型的信息实时性的问题,除此之外, LLM 还面临 幻觉问题、私有数据匮乏、内容不可追溯、长文本处理能力受限以及数据安全性 等挑战。

1.2 模型幻觉

由于 LLM 的底层原理是基于 数学概率 进行文本生成,其回答并不是基于事实推理,而是对最可能的词序列进行预测。因此,LLM 可能会在自身知识缺乏或不擅长的领域 一本正经地胡说八道,即产生 幻觉。这种现象在 事实性要求较高的业务应用(如法律、医疗、金融等)中尤其需要被关注,因为错误信息可能导致严重后果。同时,区分 LLM 生成的正确与错误信息 需要使用者具备相应领域的知识,这也提高了使用门槛。

1.3 私有数据匮乏

LLM 主要依赖 互联网公开数据 进行训练,而在 垂直行业、企业内部 等场景中,很多专属知识并未包含在模型的训练集中。这意味着 LLM 无法直接回答涉及 企业内部文档、行业专属知识库 或其他非公开信息的问题,导致其在 专业化应用场景 中的表现受限。

1.4 内容不可追溯

LLM 生成的内容通常 缺乏明确的信息来源,用户难以验证其答案的准确性和可靠性。这种不可追溯性影响了 内容的可信度,尤其是在需要引用权威信息的场景(如学术研究、法律咨询等)。

1.5 长文本处理能力较弱

LLM 受限于 上下文窗口的长度,在处理长文本时 容易丢失关键信息,并且 输入文本越长,处理速度越慢。这对需要分析 长文档、长对话或复杂背景信息 的应用场景构成了挑战。

1.6 数据安全性

对于企业而言,数据安全至关重要,没有企业愿意将私有数据上传到第三方平台 进行训练或推理,以避免数据泄露的风险。因此,完全依赖 通用大模型 进行知识问答和分析,往往需要在 数据安全性与模型能力之间 做权衡。

2. RAG 的出现

随着大语言模型(LLM)在各类任务中的广泛应用,人们逐渐发现它们的局限性,如时效性滞后、幻觉问题、私有数据匮乏、内容不可追溯、长文本处理能力受限,以及数据安全性等挑战。为了解决这些问题,Retrieval-Augmented Generation, RAG 技术应运而生。

2.1 什么是 RAG?

RAG(检索增强生成)是一种结合信息检索文本生成的 AI 方案,旨在利用外部知识库或文档存储,实现更准确、实时且可追溯的内容生成。其核心思想是:

  1. 检索(Retrieval):在 LLM 生成答案之前,首先从外部知识库或数据库中检索相关信息。
  2. 增强(Augmented):将检索到的信息与用户的原始问题结合,形成一个更丰富的输入。
  3. 生成(Generation):将增强后的输入提供给 LLM,使其基于最新信息进行回答,而不是仅依赖于模型固有的知识。

2.1.1 RAG 的发展历史

RAG 由 Meta AI 团队于 2020 年提出,最初是为了提高 LLM 在特定任务中的表现。随着 LLM 在各类应用中的扩展,RAG 技术逐渐成为提升模型响应质量的重要手段。

在 RAG 之前,主要有三种方式来提升 LLM 的能力:

  • 微调:通过额外训练数据调整 LLM 的参数,使其更适应特定任务。
  • 提示工程:通过优化输入提示(Prompt)来影响 LLM 的输出。
  • 知识注入:在 LLM 训练阶段直接加入结构化知识,以增强其知识覆盖范围。

然而,这些方案都有各自的局限性,例如微调成本高昂、提示工程 在复杂任务下效果有限,而知识注入无法解决最新信息的获取问题。因此,RAG 逐渐成为一种更灵活、高效的解决方案。

2.2 RAG 解决了哪些问题?

  • 解决知识局限性:RAG 通过外部检索,可以动态获取最新的信息,而不像 LLM 仅依赖静态训练数据。例如,在金融、法律、医疗等领域,LLM 需要访问最新法规、市场动态或医学研究,RAG 能够提供这些最新信息,从而提高回答的准确性。

  • 缓解模型幻觉:LLM 生成的内容基于概率计算,当其遇到没有见过的内容时,会凭空捏造不存在的信息。RAG 通过提供真实的外部数据作为参考,降低了模型「胡说八道」的风险。例如,在法律咨询场景中,RAG 可以直接引用相关法规,而不是让 LLM 「猜测」答案。

  • 访问私有数据:企业通常拥有大量的内部专有数据,如客户档案、财务报表、技术文档等,RAG 可以让 LLM 在不重新训练的情况下,动态查询这些私有数据并提供个性化回答。例如,企业可以使用 RAG 让 LLM 访问内部知识库,实现智能客服或决策支持。

  • 提高内容可追溯性:LLM 生成的内容通常无法溯源,而 RAG 允许模型在回答时引用具体的数据来源,例如检索到的网页、论文或数据库记录,使用户可以验证答案的真实性。这在医疗、法律等领域尤为重要。

  • 优化长文本处理能力:LLM 的上下文窗口有限,难以处理超长文本,而 RAG 可以分段检索相关信息,并将重要片段提供给 LLM,从而提高长文档的分析能力。例如,在法律案件分析中,RAG 可以从海量判例中检索关键案例,而不是让 LLM 直接处理整个数据库。

  • 增强数据安全性:企业往往不愿意将私有数据上传到第三方 LLM 平台,而 RAG 允许模型在本地或私有云环境中访问内部数据,避免数据泄露风险。例如,某些金融机构可以利用 RAG 构建私有化的 AI 助手,而无需担心数据安全问题。

2.3 RAG 与其他方案的对比

技术
适用场景
优势
劣势
微调
需要针对特定任务优化 LLM
提高任务适应性
训练成本高,难以适应变化快的知识
提示工程
通过优化输入提示提升输出质量
无需重新训练模型
适用性有限,难以解决知识更新问题
知识注入
在模型训练阶段加入额外知识
提高 LLM 的知识覆盖范围
训练数据越多,计算成本越高
RAG
需要动态获取最新信息、私有数据或长文本分析
低成本、高灵活度,解决时效性和私有数据问题
依赖高质量的检索系统,检索速度可能影响响应时间

从对比可以看出,RAG 结合了信息检索的强大能力,为 LLM 赋能,使其能够访问最新、权威的信息,同时避免了高昂的训练成本。

2.4 RAG 的核心技术

RAG 主要由以下三个模块组成:

  1. 增强数据处理

    • 对文本、图片、音频等多模态数据进行预处理。如 OCR 解析 png、jpg、PDF,文本解析 docx、pptx、html、json 等。
    • 进行数据切分、去重、向量化转换,提高检索效率。如文本向量化,多模态支持(clip 等图片 Embedding)
  2. 增强语义检索

    • 采用向量搜索(Vector Search)提高检索精准度。
    • 结合混合搜索(Hybrid Search)实现关键词和语义匹配。
  3. 增强召回

    • 通过精细排序算法优化检索结果。
    • 结合知识图谱、推理引擎增强答案的准确性。

除此之外,一般 RAG 的服务商还会支持私有化部署、多租户隔离和访问控制等安全控制能力。

以在阿里云 PAI 平台构建 RAG 问答系统为例,有以下 4 种方案:

  • Retrieval:直接从向量数据库中检索并返回 Top K 条相似结果。
  • LLM:直接使用LLM回答。
  • Chat(Web Search):根据用户提问自动判断是否需要联网搜索,如果联网搜索,将搜索结果和用户问题一并输入大语言模型服务。使用联网搜索需要给EAS配置公网连接。
  • Chat(Knowledge Base):将向量数据库检索返回的结果与用户问题合并填充至已选择的 Prompt 模板中,一并输入大语言模型服务进行处理,从中获取问答结果。

2.5 RAG 的应用场景

RAG 适用于需要高精准度、实时性、可追溯性的 AI 任务,广泛应用于 智能搜索、知识管理、内容生成、教育培训、法律/医疗检索等领域。例如:

  • 智能客服:结合企业知识库,实现实时检索 + LLM 生成,提供更精准、动态的客服回复。如银行客服可以基于最新政策,提供个性化贷款咨询,而非仅限于静态文档。
  • 内容创作:结合外部数据源,自动生成高质量内容,提升创作效率。如电商平台可利用 RAG 生成符合 SEO 规则的商品描述,提高搜索排名。
  • 知识管理:结合全文检索 + 语义搜索,快速查找相关文档,并生成摘要。如律师事务所可基于以往案例库,高效检索相关判例,提高办案效率。
  • 教育培训:结合课程内容,自动生成个性化练习题、案例分析、教学材料。如在线教育平台可根据学生的知识点掌握情况,动态调整练习内容。
  • 智能搜索引擎:结合 LLM 和 RAG,实现更自然的搜索体验。

3. 小结

RAG 作为 LLM 的重要补充,极大地扩展了大模型的能力边界,使其能够动态获取最新信息、降低幻觉、支持私有数据访问,并增强内容的可追溯性。随着 AI 技术的不断发展,RAG 预计将在搜索、问答、智能助手等领域发挥越来越重要的作用,为 LLM 提供更强的知识支撑和应用落地能力。

以上。