news 2026/8/29 6:44:14

大模型到AI Agent:开发者如何应对软件工程的三次变革

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型到AI Agent:开发者如何应对软件工程的三次变革

“奇点时刻已至”,这句话在过去两年频繁出现在各种技术讨论里。但对于真正写代码、部署系统、维护生产环境的开发者来说,奇点不是一个玄学概念,而是一系列已经发生、正在重构技术栈和工作方式的真实变化。如果把这轮AI发展看作一次持续进攻,我认为它已经完成了三次标志性攻击:第一次攻击的是“软件的能力边界”,第二次攻击的是“软件工程的生产关系”,第三次攻击的是“系统交互的控制权”。这三次攻击不是简单的新版本发布,而是每一轮都把上一轮的技术范式推翻了一部分。

这篇文章想做的是一次务实复盘:把“奇点”拆成工程上可理解的阶段,把“攻击”拆成能力、流程、架构三个层面。我不打算讨论AGI的终极形态,也不做宏大叙事,而是聚焦一个核心问题:AI正在如何改变开发者构建系统的方式,以及我们该如何应对。

如果你最近在关注AI大模型、AI编程、AI Agent、模型部署、AI应用开发这些关键词,那么这篇文章会比较适合你。看完之后,你应该能对“为什么AI值得关注”有一个更清晰的判断,也能直接上手跑通一个最小的大模型应用和一个不依赖框架的Agent示例。

1. 这篇文章真正要解决的问题

很多开发者在面对AI时,第一反应是“又多了一个工具”。但工具论容易让人停留在浅层:装一个IDE插件、聊一次Chat、生成几段代码,然后就没有然后了。真正值得关注的是,AI已经在几个底层维度上改变了软件的构建方式。

第一,软件的能力来源变了。过去,一个系统能做什么,完全取决于工程师写出了什么样的逻辑。现在,大模型把一部分“能力”从代码逻辑中剥离出来,变成了参数、权重和推理过程。开发者不再需要为每个新能力编写规则,而是选择模型、设计提示、准备数据、评估效果。

第二,软件工程的生产关系变了。过去,写代码是一个人对机器说话,编译器负责翻译。现在,AI编程助手、AI代码评审、AI生成测试,让开发者从“编码执行者”变成了“需求定义者和结果审阅者”。编码速度的差距被大幅压缩,真正的差距变成了“问题定义能力”和“系统判断能力”。

第三,系统的交互方式变了。过去,软件是“用户指令触发功能”。现在,AI Agent可以接收一个模糊目标,自行规划步骤、调用工具、观察结果、修正路径。控制流从“开发者写死的代码”转移到了“模型的推理过程”。这是架构层面的变化,也带来了新的工程问题:记忆怎么管理、工具怎么暴露、过程怎么观测、失败怎么兜底。

所以,这篇文章要解决的真正问题是:面对这三轮“攻击”,开发者应该用什么技术路径去回应。下文会分别复盘三次攻击的底层变化,并给出可落地的代码示例、工程建议和排错方法。

2. 第一次攻击:生成式AI改写了“能力边界”

第一次攻击的主角是大语言模型,也就是我们常说的GPT、Claude、国产开源模型这一类产物。表面上,它带来的是聊天、写作、问答,但在工程视角下,它真正改变的是“软件能力是如何被构建的”。

2.1 大模型为什么不是“更聪明的搜索引擎”

很多人容易把大模型理解成“更聪明的搜索引擎”,这是第一个误区。搜索引擎是基于倒排索引和排序算法,把已有的网页内容检索出来给你看。而大模型是经过海量文本训练后,在参数中编码了语言规律和知识模式,然后根据输入的上下文逐字生成新内容。它不是在找答案,而是在做概率预测和模式生成。

这个区别带来一个关键变化:软件系统第一次可以处理“没有标准答案”的问题。传统业务系统,比如订单系统、库存系统、支付系统,输入和输出都是结构化的,规则是明确的。但像“把这段用户反馈归纳成三个要点”“根据需求生成一段代码”“判断这份合同里有哪几条风险”,这些问题没有唯一的正确答案。过去这类任务要么依赖人工,要么退化成固定的规则模板,效果很差。大模型直接把这个边界向前推进了一大步。

当然,概率生成也意味着它可能出错、可能胡编乱造、可能不稳定。这引出了大模型应用最基本的工程原则:在创造性任务上用生成,在关键业务上用规则兜底。

2.2 工程上发生了什么变化

从工程角度看,第一次攻击让系统架构中多了一个新角色——“模型服务”。以前架构图里是应用服务、数据库、缓存、消息队列。现在多了一个“大模型API”或“本地推理服务”。这个角色带来了三个新问题:

第一是成本。大模型按Token计费,一次复杂的调用可能消耗几千甚至几万Token。开发者需要像管理数据库连接池一样管理Token消耗,控制Prompt长度,设置模型调用上限。

第二是延迟。大模型推理速度比普通接口慢得多,从几百毫秒到几秒不等。如果业务需要实时响应,就必须设计异步任务、流式输出或缓存机制。

第三是不可控性。同样的Prompt在不同时间调用,结果可能不同。这要求开发者在接入时设计“结果校验”和“重试机制”,而不是直接把模型输出当作可靠数据写入核心库。

这些变化第一次让AI不再只是实验室玩具,而成为一个需要认真对待的工程组件。

3. 第一次攻击的工程落地:从调用API到构建AI应用

理解了第一次攻击的本质,接下来需要一个最小示例把流程跑通。目前主流大模型厂商普遍提供OpenAI兼容接口,这意味着代码可以比较通用。下面以Python为例,演示一个最基础的对话调用。

3.1 最小调用示例

import os from openai import OpenAI client = OpenAI( api_key=os.environ.get("LLM_API_KEY"), base_url=os.environ.get("LLM_BASE_URL", "https://api.openai.com/v1"), ) def chat(prompt: str, system: str = "") -> str: response = client.chat.completions.create( model=os.environ.get("LLM_MODEL", "your-model"), messages=[ {"role": "system", "content": system}, {"role": "user", "content": prompt}, ], temperature=0.7, ) return response.choices[0].message.content if __name__ == "__main__": print(chat("用一句话解释什么是大模型"))

这段代码的关键点有三个:

  • 使用环境变量保存API Key和模型名称,避免把密钥硬编码在代码里。
  • 通过base_url兼容不同服务商。
  • temperature控制creative程度,0表示偏确定,1表示偏随机。

首次运行前需要安装依赖:

pip install openai

然后设置环境变量:

export LLM_API_KEY="你的API Key" export LLM_MODEL="你的模型ID"

运行之后,程序会打印大模型返回的文本。如果这一步能跑通,说明你已经拥有构建AI应用最基础的能力。

3.2 关键参数与工程化注意事项

ChatCompletion接口里有很多参数,新手容易忽略几个:

  • max_tokens:限制生成长度,防止模型无限输出导致费用飙升。
  • top_p:和temperature类似,控制采样范围,工程上通常两者只调一个。
  • finish_reason:返回结束原因。如果经常是length,说明输出被截断,需要调整max_tokens
  • messages中的system:用来设定模型角色和行为边界,是Prompt工程最常用的入口。

另外,很多平台用“Credits”作为计量单位。Credits可以理解为API的预付费额度,每次调用按Token消耗一定Credits,不同模型价格不同。开发时要关注每次请求消耗的Token数量,尤其是复杂Prompt和长文档场景。

工程化建议是:把模型调用封装成一个独立的Service,统一处理日志、重试、超时和Token统计。不要散落在业务代码里,否则后期排查问题会非常痛苦。

4. 第二次攻击:AI编程把开发者推向“审阅者”角色

第二次攻击发生在软件开发流程内部。以GitHub Copilot、Cursor、通义灵码等一系列AI编程工具为代表,AI从“对话伙伴”变成了“结对程序员”。这一轮攻击没有改变编程语言本身,但改变了开发者的日常动作。

4.1 AI编程工具改变了什么

传统开发流程是:需求分析 → 设计 → 编码 → 测试 → 评审 → 上线。AI编程工具的介入,首先压缩的是“编码”这个环节。过去写一个功能模块,从搭建结构到写完核心逻辑可能需要一两天,现在AI可以在几分钟内生成初版代码。

但代价是,开发者需要花更多时间做“审阅”。因为AI生成的代码大概率能跑,但不一定符合业务约束、不一定处理了边界条件、不一定考虑了性能和安全。于是,开发者的核心能力从“写代码”变成了“判断代码是否正确”。这要求你比以往更熟悉代码审查、测试设计和系统设计。

AI编程真正改变的不是“代码行数”,而是“错误发生的位置”。以前,错误主要来自自己手写时的笔误和逻辑漏洞;现在,错误的来源变成了“模型对需求的误解”。所以,Prompt写得越清楚,AI生成的代码就越接近预期。

4.2 开发流程重排

一个典型的AI辅助开发流程可以这样重新组织:

  1. 需求拆解:把大需求拆成小任务,每个任务都有一句明确的验收标准。
  2. 生成代码:让AI根据任务描述生成代码,也可以先生成测试用例。
  3. 代码审查:逐行检查AI生成的内容,重点关注边界条件、异常处理、资源释放。
  4. 自动验证:运行单元测试和集成测试,用结果代替人工判断。
  5. 修正迭代:把测试失败信息回传给AI,让它修复缺陷。

这套流程并不是让开发者变懒,而是把精力从“敲代码”转移到“定义问题和验证结果”。这也是为什么我认为AI编程的底层逻辑是“生产关系的调整”。

5. 第二次攻击的工程落地:用最小工作流跑通AI辅助开发

下面用一个最小示例演示AI辅助开发工作流。假设你有一个需求描述文件,希望AI生成代码并附带单元测试。

5.1 一个可复制的AI编程工作流

import os from openai import OpenAI client = OpenAI(api_key=os.environ.get("LLM_API_KEY")) def generate_code(requirement: str) -> str: prompt = f""" 请根据以下需求生成Python代码,并附上对应的单元测试。 需求: {requirement} 要求: 1. 代码简洁,包含必要的异常处理。 2. 单元测试使用pytest。 3. 输出格式为: ```python # 正文代码 ... # 测试代码 ...

""" response = client.chat.completions.create( model=os.environ.get("LLM_MODEL", "your-model"), messages=[{"role": "user", "content": prompt}], temperature=0.2, ) return response.choices[0].message.content

ifname== "main": with open("requirement.txt", "r", encoding="utf-8") as f: req = f.read() generated = generate_code(req) with open("generated_code.md", "w", encoding="utf-8") as f: f.write(generated) print("代码已生成,请人工审查后复制到项目中使用")

这个流程的关键是“需求文件”驱动。把需求写成文件的好处是方便迭代、方便记录、方便让AI理解上下文。`temperature=0.2`是为了让输出更稳定,减少随机性。 ### 5.2 提示词与评审清单 AI编程的Prompt不需要太复杂,但要有边界。一个合格的描述应该包含:功能需求、输入输出格式、异常情况、技术栈约束、测试要求。 ```text 请用Python实现一个函数,输入是字符串列表,输出是合并后的字符串,用逗号分隔。 要求: - 空列表返回空字符串。 - 元素包含逗号时,用双引号包裹该元素。 - 使用标准库,不要引入第三方依赖。 - 附上pytest单元测试。

生成之后,人工审查重点看几个地方:

审查点检查内容
边界条件空输入、空字符串、特殊字符是否处理
异常处理输入类型错误时是否抛出合理异常
资源释放文件、网络连接是否安全关闭
安全风险是否使用了eval、exec等危险函数
测试覆盖是否覆盖了正常路径和异常路径

在项目中,AI生成的代码必须经过测试才能合入。不做验证直接把生成代码推上生产,是第二轮“攻击”里最大的隐性风险。

6. 第三次攻击:Agent从“回答问题”到“完成任务”

第三次攻击的主角是AI Agent。如果说大模型是“嘴”,会说话但不会动手;AI编程是“手”,能帮你写代码但仍然依赖你指挥;那么Agent就是“大脑+手脚”的初步组合——它接收目标,自己规划步骤,调用外部工具,观察结果,决定下一步动作。

6.1 Agent的核心机制

Agent的核心机制可以拆成四个词:规划、工具、记忆、反馈。

规划是Agent把大目标拆成小步骤。比如“帮我查一下本周销售额并生成周报”,Agent需要拆成“查询数据接口”“分析数据”“生成报告”三个子任务。工具是Agent调用外部系统的方式,通过定义的Function或API,它才能访问数据库、搜索引擎、文件系统、业务系统。记忆分为短期记忆和长期记忆。短期记忆是当前任务的上下文,长期记忆是跨会话保存的用户偏好和历史事实。反馈是Agent执行完一个步骤后,把结果交给模型,模型决定下一步是继续还是结束。

这四个部分组合起来,就是现代Agent的基本循环:模型推理 → 执行工具 → 返回结果 → 再次推理。

6.2 为什么这轮和以前的“自动化”不一样

以前我们也有自动化,比如调度系统、工作流引擎、BPM。但那些自动化是预先定义好的流程:如果A事件发生,执行B动作,然后跳到C。控制权完全在开发者手里。

Agent的差异在于:流程不是预定义的,而是模型在运行时生成的。目标由人设定,路径由模型动态规划。这意味着系统可以在没有事先枚举分支的情况下处理新的、不确定的情况。这是巨大的功能提升,也是巨大的工程挑战。

挑战包括:模型可能规划错步骤、可能调用错误的工具、可能陷入循环、可能产生不可预期成本。所以,Agent落地到生产环境时,必须设边界:最大轮数、白名单工具、预算上限、人工审批节点、全程日志。没有这些约束的Agent,本质上是一个不可控的新接口。

7. 第三次攻击的工程落地:不依赖框架实现一个最小Agent

现在很多框架比如LangChain、Spring AI都在做Agent抽象。但对于理解原理,自己手写一个最小循环往往更有效。下面用OpenAI的Function Calling机制实现一个Agent,不依赖额外框架。

7.1 场景设计

我们设计一个简单场景:用户输入一个数学计算需求,Agent判断需要调用计算工具,执行后把结果返回给用户。这个例子虽然简单,但完整展示了Agent的核心循环。

7.2 代码实现

import json import os from openai import OpenAI client = OpenAI(api_key=os.environ.get("LLM_API_KEY")) def calculate(expression: str) -> str: """执行一个简单的四则运算表达式,例如 1+2*3。""" try: return str(eval(expression, {"__builtins__": {}}, {})) except Exception as e: return f"计算失败: {e}" TOOLS = [ { "type": "function", "function": { "name": "calculate", "description": "计算一个数学表达式的结果", "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "四则运算表达式" } }, "required": ["expression"] } } } ] def run_agent(user_input: str, max_rounds: int = 5) -> str: messages = [{"role": "user", "content": user_input}] for _ in range(max_rounds): response = client.chat.completions.create( model=os.environ.get("LLM_MODEL", "your-model"), messages=messages, tools=TOOLS, ) msg = response.choices[0].message if not msg.tool_calls: return msg.content or "" messages.append(msg) for tool_call in msg.tool_calls: args = json.loads(tool_call.function.arguments) result = calculate(args["expression"]) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": result, }) return "已达最大轮次" if __name__ == "__main__": print(run_agent("帮我计算 (12+34)*2 的结果"))

这段代码值得仔细看一遍,因为它是Agent原理的浓缩版:

  • 先调用模型,把用户输入和工具列表传进去。
  • 模型返回的tool_calls不为空时,说明它决定调用工具。
  • 把模型返回的消息追加到messages,这是为了让模型知道“我已经发起了一次调用”。
  • 执行工具后,把结果以role=tool的消息回传给模型。
  • 模型看到结果后,如果不再调用工具,就返回最终回答。

max_rounds用来防止死循环,这是Agent生产化最基本的保险丝。

7.3 运行与验证

运行前同样需要设置LLM_API_KEYLLM_MODEL。运行后,预期流程是:

  1. 模型接收到数学表达式。
  2. 模型返回calculate的工具调用。
  3. 程序执行计算并返回结果。
  4. 模型把计算结果组织成自然语言回答。

如果一切正常,输出类似:

(12+34)*2 的结果是 92。

如果Agent没有调用工具,而是直接编了一个答案,说明模型没有正确理解工具描述,或者模型能力不足。这时需要优化description,让工具描述更明确。

需要特别提醒:示例代码中使用eval只是为了演示,生产环境不要直接使用。更稳妥的做法是用ast解析或实现白名单运算符函数。

8. 常见问题与排查思路

AI应用开发和传统后端有一个很大的不同:问题不一定出在代码里,可能出在模型行为、Prompt、Token、工具调用这些新维度上。下面整理几个高频问题。

问题现象可能原因排查方式解决方案
调用API返回401API Key无效或未设置检查环境变量和密钥状态重新配置环境变量,确认密钥未被禁用
模型返回空内容max_tokens设置过小或模型拒绝回答查看返回的finish_reason增加max_tokens,检查system提示词是否限制了输出
Agent循环不调用工具工具描述不清晰,模型能力不足打印messages日志,观察模型输出优化工具description,换更强模型
Agent陷入死循环缺少轮次上限,或工具返回结果不稳定给循环增加max_rounds设置最大轮次,工具返回固定结构数据
Token消耗过快Prompt过长或循环未终止查看日志中的Token统计压缩Prompt,加缓存,设置成本上限
生成代码运行报错AI理解需求有误,或环境依赖缺失先看报错堆栈,再检查生成代码把错误信息回传给AI,要求修复
生产环境结果不稳定temperature设置过高对比多次调用结果降低temperature,增加规则校验

排查AI应用问题,我建议遵循一条原则:先看模型返回的原始响应,再看代码逻辑。大多数诡异问题都来自模型输出不是预期格式,而报错发生在下游解析时。

9. 最佳实践与工程建议

面对AI的三次攻击,开发者的应对方式不是拒绝,也不是无脑接入,而是建立一套工程原则。这里给出几条我在实际项目中验证过的建议。

9.1 用环境隔离和配置管理保护密钥

AI应用的密钥泄漏往往比普通应用更危险,因为模型API直接对应费用。无论使用什么服务,都应该把API Key放在环境变量或密钥管理系统中,禁止提交到Git仓库。同时,给API Key绑定最小权限,限制可调用的模型和额度。

9.2 所有模型调用都要有日志和可观测性

模型返回的内容不稳定,所以必须记录输入Prompt、输出结果、Token消耗、延迟、是否触发工具。这些日志是调试和成本优化的基础。如果没有日志,生产环境出了Anomaly几乎无法排查。

9.3 设计清晰的工具边界

Agent引入工具后,系统安全边界从“应用层”扩展到了“模型层”。每个Agent能调用的工具必须经过白名单控制。工具函数的入参要做校验,返回值要标准化。不要让Agent直接执行高危操作,比如删除数据库、修改配置,这类操作必须走人工审批。

9.4 用测试集评估模型行为

普通应用的测试断言是确定的,AI应用则要引入“评估集”。准备一批典型输入和期望输出,每次修改Prompt或切换模型时,都跑一遍评估集,看通过率有没有下降。这样至少能避免“改完Prompt后模型在某些场景下悄悄退化”。

9.5 成本和性能要前置设计

模型调用不是无限廉价的。在架构设计阶段就要考虑:哪些请求走大模型,哪些请求走规则或缓存。很多场景根本不需要调用模型,用传统方法就能解决。把大模型用在最需要语义理解的地方,才能控制成本和延迟。

9.6 保留回滚能力

依赖模型的新功能,最好通过配置开关控制。上线时先小流量灰度,出现问题立刻降级到旧逻辑。模型服务是动态的,同一个模型ID也可能在服务商侧更新参数,必须在客户端预留版本切换能力。

10. 总结:奇点之后,开发者该做什么

回看这三轮“攻击”,它们并不是互相替代,而是层层叠加。大模型让软件拥有了语义理解和生成能力,AI编程让这些能力渗透进开发流程本身,Agent让能力从“对话”延伸到“行动”。三者叠加,正在把软件开发从“人工编写所有逻辑”推向“人类定义目标、AI生成路径”的新阶段。

这确实称得上工程意义上的“奇点时刻”。但奇点不是终点,而是一系列新问题的起点。模型稳定性、成本控制、工具安全、流程规范、结果评估,这些都会在未来很长一段时间内定义AI应用开发的复杂度。

对开发者个人来说,我认为最有价值的事情是:亲手跑通一个大模型调用,亲手写完一个Agent循环,亲手设计一套评估用例。这些动作看起来不大,但能帮你把“AI概念”转成“工程直觉”。当你真正理解模型推理循环、工具调用、结果校验这些机制之后,再回头看各类AI框架和平台,就不会被术语和包装绕晕。

建议下一步可以沿着三条线深入:一是继续研究Prompt工程和模型评估,这是所有AI应用的地基;二是学习LangChain、Spring AI等框架的源码设计,看看成熟的Agent抽象如何解决状态、记忆、工具注册问题;三是研究模型部署和推理优化,理解模型从训练完成到生产服务的全过程。每一条线都能单独展开成一个系列,但无论如何,都建议从今天这篇最小示例开始动手。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 6:41:54

天融信技术支持售后工程师笔试考点全解析

说实话,第一次看到“天融信技术支持&售后工程师笔试试卷”这个标题的时候,我第一反应是:这不是一份普通的笔试题,而是一张“入场券考试”。很多做网络工程、系统运维的朋友,干了三五年,设备调试没问题&…

作者头像 李华
网站建设 2026/8/29 6:41:39

Python零基础学习路线:从爬虫到数据分析的实战指南

Python 零基础入门到进阶,一条包含爬虫和数据分析的高效学习路径,其实比想象中清晰。很多初学者最大的困惑不是“要不要学 Python”,而是“从哪开始、按什么顺序学、学到什么程度能找工作”。本文整理了一条经过验证的 Python 学习路线&#…

作者头像 李华
网站建设 2026/8/29 6:39:24

单片机毕业设计-基于 STM32 的运动体征采集与跌倒预警装置设计 基于 STM32 的便携式体温心率监测终端与 APP 联动系统(013305)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/29 6:36:20

鸿蒙生态中的WordPress博客客户端Mopost:功能解析与开发实践

在当前的鸿蒙生态里,除了一线大厂的应用在快速适配,还有一批小而美的独立开发者作品,也在持续丰富着鸿蒙原生应用的版图。这些应用往往不追求大而全,而是聚焦某一个细分场景,把体验做到极致。Mopost 就是其中比较有代表…

作者头像 李华
网站建设 2026/8/29 6:36:14

程序员面试全流程复盘:从项目深挖到场景设计的关键经验

刚出面试现场,趁记忆还是热乎的,赶紧把今天的面试全过程记录下来。我尽量还原面试官问了什么、我是怎么答的、哪些地方答崩了,以及在准备阶段我觉得真正有用的东西。整理出来主要给自己做复盘,也希望能给正在准备面试的朋友们一点…

作者头像 李华
网站建设 2026/8/29 6:35:51

Paper2Slides:基于NLP与动态排版的文档自动化演示生成工具

简介:Paper2Slides是一款面向科研人员、高校教师及学术汇报者的开源自动化演示文稿生成工具,解决论文成果向高质量幻灯片与学术海报转化耗时费力的痛点,特别适用于会议报告、课题答辩与课堂教学等场景。资源包共96个文件,含52个Py…

作者头像 李华