从脚本到系统:构建生产级AI应用的工程素养
引言AI开发的成人礼2022年底ChatGPT横空出世时无数开发者体验过这样的快感输入一段PromptAI瞬间生成一个能跑起来的Demo效果惊艳到让人感觉超级智能助手触手可及。但当我们试图把这个Demo塞进真实业务系统时问题接踵而至AI忘记上下文、无法访问企业内部数据、一次只能做一件事、接入生产环境后各种延迟和错误处理不完善。这就是AI开发的成人礼——从脚本到系统的跨越。在原型阶段模型即系统核心任务是验证想法而在工程化阶段模型只是系统的组件之一需要提供可靠、可维护、可扩展的业务能力。这个转变正是本文要讨论的核心命题如何构建生产级AI应用的工程素养。一、Harness EngineeringAgent ≠ Model首先需要厘清一个核心公式Agent Model HarnessHarness的原意是马具——马匹力大无穷但如果没有马具的控制与牵引就无法拉动车辆。大语言模型也是如此它本身只是一个具备理解与生成能力的智力引擎而Harness则是包裹在模型外层的全部工程化基础设施上下文管理、工具调度、事件拦截、状态持久化。一个关键认知同一模型在不同Harness下的表现差异远大于不同模型在同一Harness下的差距。在TerminalBench基准测试中仅通过对Harness层的优化同一个模型的能力就能从基线以下跃升至Top 5。这意味着把模型调好只是起点真正决定AI系统成败的是Harness层的工程能力。二、五层架构从地基到塔尖一个可持续运行的AI系统需要像盖楼一样设计清晰的分层架构。结合行业实践我将AI工程化架构分为五层第一层基础能力层这一层封装可复用的AI能力组件大模型调用与Tool Calling让AI能调用数据库、执行脚本、访问外部API。当它要回答上个月销售额是多少时用定义好的查询函数拉取数据而不是靠记忆胡猜。Prompt Engineering企业项目中的Prompt不是随手写的而是要根据场景定义风格、格式、容错方案。核心框架用LangChain/LlamaIndex等框架把AI能力模块化封装便于快速重组工作流。第二层数据与知识层光有模型不够它必须拥有企业知识。这一层的核心技术是RAG检索增强生成当用户提问时系统先检索企业知识库再把精准信息提供给模型生成答案。工程化重点是知识库构建、知识追踪评估、安全与合规。第三层系统架构层复杂场景往往需要多个Agent协作。这一层涉及有状态的Agent设计、多Agent协作机制如Autogen/CrewAI、插件化与分布式部署、任务失败时的自动重试和容错。第四层部署与运维层保证系统在生产环境稳定运行容器化与集群Docker Kubernetes、监控系统Prometheus Grafana、性能优化vLLM推理加速、异步并发。第五层业务应用层所有技术努力的最终目的让业务价值落地并可量化形成从需求分析到持续迭代的完整闭环。三、工程化核心能力代码展示3.1 从脚本到系统模块化设计下面是一个生产级AI系统的模块化设计示例我们将模型调用、工具注册、Agent编排和系统配置解耦# config/settings.py - 系统配置层fromdataclassesimportdataclassfromtypingimportOptionaldataclassclassLLMConfig:model_name:strqwen2.5:7bbase_url:strhttp://localhost:11434/v1temperature:float0.7max_tokens:int4096timeout:int30dataclassclassRetryConfig:max_attempts:int3backoff_base:float1.0max_backoff:float10.0# core/llm_client.py - 基础能力层importhttpxfromtypingimportDict,Any,Optionalfromtenacityimportretry,stop_after_attempt,wait_exponentialclassLLMClient:封装LLM调用的基础客户端具备重试和超时机制def__init__(self,config:LLMConfig):self.configconfig self.clienthttpx.Client(timeoutconfig.timeout)retry(stopstop_after_attempt(3),waitwait_exponential(multiplier1,min1,max10))defgenerate(self,messages:list,tools:Optional[list]None)-Dict[str,Any]:带重试机制的生成调用payload{model:self.config.model_name,messages:messages,temperature:self.config.temperature,max_tokens:self.config.max_tokens}iftools:payload[tools]tools payload[tool_choice]autoresponseself.client.post(f{self.config.base_url}/chat/completions,jsonpayload)response.raise_for_status()returnresponse.json()3.2 工具调用Tool Calling让AI成为懂工具的员工生产级AI系统必须让模型能够调用外部工具完成真实任务而不是靠记忆胡猜。以下是工具注册和执行的完整实现# core/tool_registry.py - 工具注册与执行fromtypingimportDict,Any,Callable,ListimportinspectimportjsonclassToolRegistry:工具注册中心管理所有AI可调用的外部工具def__init__(self):self._tools:Dict[str,Callable]{}self._schemas:Dict[str,Dict]{}defregister(self,func:Callable)-Callable:装饰器将函数注册为可调用工具self._tools[func.__name__]func self._schemas[func.__name__]self._generate_schema(func)returnfuncdef_generate_schema(self,func:Callable)-Dict:生成OpenAI风格的function schemasiginspect.signature(func)params{}forname,paraminsig.parameters.items():params[name]{type:string,description:fParameter:{name}}return{type:function,function:{name:func.__name__,description:func.__doc__or,parameters:{type:object,properties:params,required:list(params.keys())}}}defget_tool_schemas(self)-List[Dict]:返回所有工具的schema列表供LLM调用returnlist(self._schemas.values())defexecute(self,tool_name:str,arguments:Dict)-Any:执行指定的工具iftool_namenotinself._tools:raiseValueError(fTool {tool_name} not found)returnself._tools[tool_name](**arguments)# 使用示例注册业务工具registryToolRegistry()registry.registerdefquery_sales(month:str)-Dict:查询指定月份的销售数据# 实际实现中会查询数据库return{month:month,total:125000,top_product:AI-DevKit}registry.registerdefget_customer_feedback(product_id:str)-List[Dict]:获取产品客户评价return[{customer:企业A,rating:4.5,comment:质量可靠}]3.3 Dual-State架构将不确定性纳入系统设计生产级AI系统的核心挑战是模型的不确定性——同样的输入每次输出都可能不同。AtomicGuard框架提出了一个优雅的解决方案Dual-State架构将生成动作与验证守卫绑定为原子动作对⟨A_generator, G_guard⟩。以下是一个精简实现# core/guarded_agent.py - 守卫验证的Agent架构fromtypingimportGeneric,TypeVar,OptionalfromabcimportABC,abstractmethod TTypeVar(T)classGuard(ABC):守卫接口验证生成结果是否合格abstractmethoddefvalidate(self,content:str)-tuple[bool,str]:返回 (是否通过, 错误信息)passclassSyntaxGuard(Guard):语法检查守卫验证代码是否可编译defvalidate(self,content:str)-tuple[bool,str]:try:compile(content,string,exec)returnTrue,exceptSyntaxErrorase:returnFalse,fSyntax error:{e}classTestGuard(Guard):测试守卫运行单元测试验证功能def__init__(self,test_code:str):self.test_codetest_codedefvalidate(self,content:str)-tuple[bool,str]:try:# 将生成的内容与测试代码合并执行combinedf{content}\n\n{self.test_code}exec(combined,{})returnTrue,exceptExceptionase:returnFalse,fTest failed:{e}classCompositeGuard(Guard):组合守卫多个守卫依次验证def__init__(self,guards:list[Guard]):self.guardsguardsdefvalidate(self,content:str)-tuple[bool,str]:forguardinself.guards:passed,errorguard.validate(content)ifnotpassed:returnFalse,errorreturnTrue,classAtomicActionPair:原子动作对生成 验证def__init__(self,generator,guard:Guard):self.generatorgenerator# LLM生成器self.guardguarddefexecute(self,prompt:str)-tuple[Optional[str],str]:执行一次生成-验证循环contentself.generator.generate(prompt)passed,errorself.guard.validate(content)ifpassed:returncontent,returnNone,errorclassDualStateAgent:双状态Agent守卫验证循环带有最大重试次数def__init__(self,action_pair:AtomicActionPair,max_retries:int3):self.action_pairaction_pair self.max_retriesmax_retriesdefexecute(self,task:str)-str:执行任务失败时自动重试promptfComplete the following task:\n{task}forattemptinrange(self.max_retries):result,errorself.action_pair.execute(prompt)ifresultisnotNone:returnresult# 将错误反馈加入prompt让LLM自我修正promptfPrevious attempt failed with error:{error}\nPlease fix the issue and try again.\nTask:{task}raiseRuntimeError(fFailed after{self.max_retries}attempts)效果验证根据AtomicGuard的基准测试对于生成模板函数任务基线成功率仅35%而引入守卫验证循环后成功率跃升至90%。这就是脚本与系统的差距——用确定性流程约束不确定性模型。四、从Demo到产线的关键转变维度脚本阶段系统阶段核心目标验证想法提供可靠业务能力调用方式单次模型调用复杂编排、多轮交互容错机制人工介入自动重试、降级、回滚可观测性无全链路日志、指标、追踪扩展性修改代码模块替换、插件化总结构建生产级AI应用的工程素养核心在于三点分层架构将AI系统拆分为基础能力层、数据知识层、系统架构层、部署运维层和业务应用层每一层都有清晰的职责和接口。约束而非控制不要试图在Prompt里穷尽所有规则。Rule是软约束告诉AI必须做什么而Script是硬关卡用可执行的校验阻止不合格产出过关。守卫验证循环将生成与验证绑定为原子操作用确定性的门禁机制约束不确定的模型行为。失败时反馈错误让模型自愈形成闭环。AI工程化的本质不是堆模型而是把AI像传统软件一样做成可靠、可维护、可扩展的系统。这条路充满挑战但只有走完AI才能真正变成企业的生产力而不是一时的风口玩具。

相关新闻

第25章:Mongo分片集群入门——数据太大时怎么水平扩展

第25章:Mongo分片集群入门——数据太大时怎么水平扩展

1. 项目背景 业务场景:本地生活电商上线 18 个月,订单表突破 500GB、日均写入 200 万条。复制集虽然保证了高可用,但单台服务器的磁盘和 IOPS 已经到达物理上限——磁盘使用率 92%、写 IOPS 逼近极限、高峰期 CPU 100%。运维升级服务器配置&…

2026/10/8 1:58:15 阅读更多 →
别再盲目接单了!用波特五力模型重估你的AI副业定位——90%的人根本没看清替代品威胁指数已飙升至6.8

别再盲目接单了!用波特五力模型重估你的AI副业定位——90%的人根本没看清替代品威胁指数已飙升至6.8

更多请点击: https://kaifayun.com 第一章:别再盲目接单了!用波特五力模型重估你的AI副业定位——90%的人根本没看清替代品威胁指数已飙升至6.8 当ChatGPT-4o、Claude 3.5和通义千问Qwen2.5以零成本API调用涌入市场,你还在靠“写…

2026/10/5 20:01:48 阅读更多 →
【Runway动作捕捉实战指南】:20年CG专家亲授5大避坑法则与实时优化技巧

【Runway动作捕捉实战指南】:20年CG专家亲授5大避坑法则与实时优化技巧

更多请点击: https://codechina.net 第一章:Runway动作捕捉技术全景概览 Runway ML 作为面向创意工作者的AI原生平台,其动作捕捉(Motion Capture)能力并非依赖传统光学标记点或惯性传感器,而是基于纯视觉的…

2026/10/4 0:34:49 阅读更多 →

最新新闻

MATLAB常用信号处理函数清单:从FFT到滤波器实战指南

MATLAB常用信号处理函数清单:从FFT到滤波器实战指南

1. 项目概述:为什么要单独整理一份信号处理函数清单做信号处理这几年,我最大的感受就是:MATLAB的功能强大到让人眼花缭乱,但真正高频使用的函数翻来覆去就那么几十个。很多初学者最容易犯的毛病,是一上来就抱着几百页的…

2026/10/15 17:18:28 阅读更多 →
拓扑优化入门:99行与88行程序对比及OC与MMA算法解析

拓扑优化入门:99行与88行程序对比及OC与MMA算法解析

简介:这份资源面向拓扑优化初学者与结构优化方向的学生、研究人员,提供一套可直接运行的MATLAB入门程序,涵盖优化准则法(OC)与移动渐近线法(MMA)两种主流求解思路,帮助读者理解如何在…

2026/10/15 17:18:28 阅读更多 →
Agent Skills 标准实战:用 SKILL.md 让 AI Agent 真正学会干活

Agent Skills 标准实战:用 SKILL.md 让 AI Agent 真正学会干活

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 17:18:28 阅读更多 →
开题报告写到崩溃?这份“保姆级”通关攻略请收好

开题报告写到崩溃?这份“保姆级”通关攻略请收好

每到毕业季,无数本科生的第一道坎往往不是毕业论文答辩,而是开题报告。选题不知道从哪下手,研究思路理不清,格式改了又改还是被导师打回重写,不少同学一提到“开题报告”四个字就头皮发麻。其实,过来人都清…

2026/10/15 17:18:28 阅读更多 →
CANopen协议栈源码拆解:从对象字典到PDO映射的嵌入式实现

CANopen协议栈源码拆解:从对象字典到PDO映射的嵌入式实现

简介:CANopen完整源码是一套面向嵌入式控制开发者的开源协议栈实现,基于CAN总线构建,适合从事工业自动化、运动控制、汽车电子等领域的工程师与学习者研究和使用。资源包共77个文件,以C语言源文件与头文件为主体(28个.…

2026/10/15 17:18:28 阅读更多 →
STM32驱动MAX6675测温:SPI时序解析与避坑实战

STM32驱动MAX6675测温:SPI时序解析与避坑实战

简介:这份资源是面向嵌入式初学者与STM32开发者的MAX6675测温驱动测试例程,基于STM32F103与K型热电偶专用芯片MAX6675搭建,重点解决SPI通信配置、冷端补偿读取与温度数据解析等实际问题,适合用于温度采集类课程设计、实验验证或工…

2026/10/15 17:17:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →