ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从模型接入到稳定运行:后端视角的AI应用工程化实战

从模型接入到稳定运行:后端视角的AI应用工程化实战 腾讯AI不再“观望”这则表态放在大模型竞争进入深水区的当下释放出的信号比字面意思更值得推敲。早期不少企业对待大模型的态度是“先围观、再跟进”怕投入太早选错方向也怕投入太晚错过窗口。但从公开讨论和行业动作来看腾讯AI已经开始把重点从模型能力展示转向业务落地和工程化建设。这件事对普通开发者的直接影响是AI应用开发不再只是算法团队的课题而是后端、前端、测试、运维都要参与的真实工程任务。这篇文章不讨论哪家大模型更强也不预测市场份额。我想从一名后端开发者的视角把AI应用从“调接口”走向“可稳定运行的生产系统”时需要关注的问题串起来包括模型接入方式选型、Spring AI与Agent开发、本地部署、测试与可观测性、常见问题排查以及一套可以复用的工程化建议。如果你正在做AI应用开发、AI Agent、大模型本地部署或者刚接手一个AI项目但发现坑比想象得多这篇内容值得读到最后。1. 为什么“腾讯AI不再观望”会成为值得关注的技术信号1.1 从观望到投入大模型竞争进入工程化阶段前两年大家讨论AI更多是在聊模型参数、榜单分数、生成效果。那个阶段的特点是“模型即产品”谁家模型效果好谁就能拿到关注。但到了实际业务场景模型效果好只是起点距离稳定上线还有很长一段路。模型怎么接入现有系统、怎么控制成本、怎么保证响应时间、怎么处理内容安全、怎么在高峰期不被打挂这些问题不是模型本身能解决的。腾讯AI从“观望”转向“投入”本质上反映的是行业共识的变化单点模型能力已经不能构成壁垒真正拉开差距的是把模型嵌入业务系统的工程能力。一个企业可以选择闭源API、开源模型、私有化部署也可以选择多种模型混合使用。不同选择对应不同的成本、延迟、数据合规和运维复杂度没有统一答案只有结合场景做权衡。对开发者来说这意味着AI相关岗位的要求也在变化。以前会调Prompt、会调API就能做AI演示现在做AI应用还需要懂系统设计、缓存、限流、降级、日志追踪、自动化测试、模型评测。这不是理论上的“全栈化”而是AI应用本身已经变成普通分布式系统的一部分。1.2 开发者真正需要的不是模型榜单而是可落地的AI工程能力很多初学者接触AI应用开发时第一反应是去找“哪个模型最强”。但真实项目里模型选型只是众多决策中的一个。群里经常有人问“为什么我调用大模型接口经常超时”“为什么同样Prompt有时候好有时候差”“为什么本地部署了一个模型并发一上来就卡死”这些问题大多和模型本身无关而是工程链路出了问题。从我的实践看AI应用开发的核心链路可以分成六段需求定义、模型选型、接入方式、业务逻辑、部署运行、评测迭代。任何一段做不好整体体验都会崩。模型榜单只能帮你解决第一段里的一个小分支后续五段全部要靠工程手段。所以与其盯着“腾讯AI不再观望”这个新闻本身不如关注它背后的技术趋势AI正在从Demo走向生产而生产级AI应用需要一套完整的工程方法论。这也是这篇文章要展开的主线。2. 搭建AI应用前先搞清楚模型接入的几种方式2.1 直接调用API和私有化部署的取舍在开始写代码之前先要回答一个问题模型从哪里来目前最常见的有两种路径。第一种是直接调用云端API。这种方式的好处是接入成本低、模型迭代快、不需要关心GPU运维。缺点也很明显数据会离开内部环境、每次调用按Token计费、网络延迟会引入额外耗时、依赖服务商的稳定性。适合原型验证、非敏感数据场景、以及对模型版本更新速度要求高的业务。第二种是私有化部署。把开源模型部署在自己的服务器或内网上数据不出域调用成本主要变成硬件成本和运维成本。缺点是硬件投入大、模型版本相对滞后、需要自己处理并发和推理优化。适合数据敏感、调用量大且稳定、网络隔离要求高的业务。还有一种混合方式核心敏感数据走私有化部署非敏感高并发场景走云端API再用统一接口层屏蔽差异。很多企业实际采用的是这种模式。下表列一下三种方式的典型对比接入方式接入成本数据安全延迟表现运维复杂度适用场景云端API低数据出域需评估受网络影响低原型验证、非敏感场景私有化部署高数据不出域内网可控高敏感数据、高频稳定调用混合接入中可分级按路由策略中生产环境常见方案2.2 用统一的抽象层屏蔽模型差异无论选哪种方式都建议在业务代码和模型之间加一层抽象。不要直接在业务代码里写死某一家API的SDK调用否则后面换模型或切换部署方式时要改的地方会非常多。抽象层的核心职责有三个统一输入输出格式把不同模型的请求参数和响应结构转换成业务层统一的对象。统一异常处理把超时、限流、内容审核、模型不可用等情况映射成业务异常。统一配置管理把模型地址、Token、超时时间、最大重试次数放在配置中心而不是写在代码里。实际开发时我会先定义一个类似这样的接口public interface AiChatService { AiResponse chat(AiRequest request); }AiRequest里包含用户消息、系统提示词、历史消息、温度等基础参数AiResponse里包含回复内容、Token消耗、结束原因等。所有模型接入都实现同一个接口业务层只依赖接口。这样做的好处是今天用云端API明天换私有化模型只需要新增一个实现类再通过配置切换不需要动业务代码。2.3 选型前后要确认的几个关键参数很多人在接入模型时只关心模型名称忽略了几个直接影响系统表现的参数。Temperature温度控制输出的随机性。取值通常在0到2之间。做知识问答、代码生成时建议调低比如0.1到0.3做创意写作、头脑风暴时再适当调高。不要所有场景都用默认值。Max Tokens最大输出长度限制单次回复的最长Token数。设置太小会导致回复被截断设置太大会增加延迟和成本。要根据业务内容长度估算不能随意填一个很大的值。Top P核采样控制候选词的概率累积范围。和Temperature作用类似一般调一个即可不建议同时大幅调整。Timeout超时时间大模型接口的响应时间波动很大。默认的几秒超时很可能不够但又不能设置成无限等待。建议把连接超时和读取超时分开设置并且结合重试策略。Retry重试策略遇到限流和瞬时错误时可以重试但要避免所有请求同时重试造成雪崩。建议使用指数退避加上随机抖动。下表给出一个参考配置参数常见范围调低的效果调高的效果推荐做法Temperature0 - 1.5输出更稳定输出更多样知识问答用0.2左右Max Tokens根据场景延迟更低输出更完整按回复长度下限设置Timeout10s - 60s快速失败容忍慢响应连接超时5s读取超时30sRetry最多2 - 3次可能错过恢复可能放大压力指数退避最多3次3. Spring AI与AI Agent开发的工程实践3.1 Spring AI在Java项目中的定位如果项目是Java技术栈又希望把AI能力快速集成进来Spring AI是一个值得关注的框架。它的定位类似Spring生态对数据源的抽象提供一套统一的接口来接入不同的大模型服务让业务代码不需要关心底层是哪个模型。Spring AI主要帮我们做了几件事统一ChatClient、EmbeddingModel、ImageModel等接口。内置常见的模型服务适配。支持提示词模板可以在Java代码中组合系统提示词和用户参数。支持结构化输出可以把模型返回的文本映射成Java对象。为工具调用和Agent编排提供基础能力。需要注意Spring AI还在快速演进版本之间API可能变化比较大。实际项目里要锁定版本并参考对应版本文档不要拿着老版本示例直接套到新版本上。3.2 最小可运行示例通过Spring AI接入大模型先写一个最简单的Spring Boot项目目标是让用户输入一个问题返回模型生成的回答。在pom.xml中加入依赖dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId version1.0.0-M6/version /dependency这里以OpenAI兼容接口为例因为很多云端模型和本地推理服务都提供兼容接口。版本号只是示例落地前请到Maven中央仓库确认最新稳定版本。配置文件spring: ai: openai: base-url: https://api.example.com/v1 api-key: ${AI_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.2然后创建一个ServiceService public class AiAssistant { private final ChatClient chatClient; public AiAssistant(ChatClient.Builder chatClientBuilder) { this.chatClient chatClientBuilder.build(); } public String ask(String question) { return chatClient.prompt() .system(你是一个专业的Java开发助手回答要简洁、准确。) .user(question) .call() .content(); } }再写一个ControllerRestController public class AiController { private final AiAssistant aiAssistant; public AiController(AiAssistant aiAssistant) { this.aiAssistant aiAssistant; } GetMapping(/ask) public String ask(RequestParam String question) { return aiAssistant.ask(question); } }启动项目后请求curl http://localhost:8080/ask?questionJava%E9%87%8C%E7%9A%84String%E6%98%AF%E5%8F%AF%E5%8F%98%E5%AF%B9%E8%B1%A1%E5%90%97正常会返回模型生成的回答。这里要注意ChatClient.Builder在Spring AI 1.0版本中推荐用构造器注入比直接注入ChatClient更灵活方便后续配置自定义超时、拦截器等。3.3 从单次调用走向Agent工具调用与上下文管理很多业务场景不满足于“问一句答一句”比如让AI帮忙查天气、查订单、操作数据库。这时候就需要Agent的能力模型根据用户意图决定调用哪个工具再根据工具返回结果生成最终回答。工具调用的核心机制是在请求中给模型描述可用工具和参数格式模型在需要时返回一个工具调用请求而不是直接生成最终答案。应用层收到请求后执行真实函数把结果回传给模型模型再综合上下文生成回答。Spring AI中可以使用Tool注解简化工具定义Component public class WeatherTool { Tool(name get_weather, description 查询指定城市的天气情况) public String getWeather(String city) { // 实际项目中这里会调用天气服务 return city 今天晴气温25摄氏度; } }把这个Bean注册到ChatClient的Tool回调里Bean ChatClient chatClient(ChatClient.Builder builder, WeatherTool weatherTool) { return builder.defaultTools(weatherTool).build(); }当用户问“北京天气怎么样”时模型会自动判断需要调用get_weather并把参数填充为“北京”。这里容易踩的坑有三个工具描述不清晰模型不知道该在什么场景下调用导致工具形同虚设。描述里要写清楚触发条件和参数含义。参数类型不匹配模型把日期填成字符串但接口要求时间戳。工具定义里要尽量用明确类型并在函数内部做参数校验。忘记处理工具执行失败模型在工具返回异常时可能胡编结果。工具内部要捕获异常并返回结构化错误信息让模型知道调用失败而不是生成一个看似合理的答案。Agent的上下文管理同样重要。会话越长Token消耗越大响应越慢还可能超出模型上下文窗口。常用做法是保留最近的N轮对话同时对历史消息做Token截断或摘要压缩。不要无限制地往会话里塞消息。4. 本地部署AI模型时最容易踩的坑4.1 本地部署的价值与适用场景本地部署通常指把开源大模型部署到自己控制的服务器上通过本地推理接口对外提供服务。它最大的价值不是省钱而是数据可控和自主运维。对于金融、医疗、企业内部信息查询等场景数据不出域往往是硬性要求。另外当调用量已经足够大、云端API费用高出一截时本地部署也可能成为成本优化手段。但本地部署并不适合所有团队。它要求团队至少会处理GPU驱动、显存管理、模型量化、推理框架、并发控制、模型版本管理等问题。如果只是偶尔调用几次直接使用云端API明显更合适。4.2 显存、内存和并发量的估算方法本地部署最常见的失败方式不是模型选错而是硬件估算错误。很多人只看了模型参数量忽略了实际显存占用。以一个大语言模型为例模型权重占用的显存可以用公式粗略估算显存占用约等于 参数量 × 每个参数占用的字节数如果使用FP16半精度每个参数大约占2字节。一个70亿参数的模型权重部分大约需要7B × 2 Byte 14GB但这只是权重。推理时还需要KV Cache、中间激活值等额外显存实际占用通常会更高。如果还需要支持一定并发显存消耗会进一步上升。因此建议至少预留20%到30%的冗余。内存方面主要考虑加载模型时的峰值、数据处理和推理框架自身的开销。不要只看模型体积要在目标机器上做压测。下面是一个粗略的容量参考表模型参数量量化方式权重占用估算适合场景7BFP16约14GB显存充足追求效果7BINT8约7GB平衡效果与资源7BINT4约4GB资源有限可接受一定损失13BFP16约26GB高显存机器70B多卡量化40GB以上企业级服务4.3 量化、推理服务与API封装在本地部署中量化是降低资源占用最常用的手段。把FP16模型转换成INT8或INT4可以显著减少显存占用但会带来一定效果损失尤其在复杂推理和数学题上。选择哪个量化等级应该用真实业务数据集做对比而不是只看模型能不能加载起来。部署模型后通常还需要一个推理服务框架来承载请求并对外提供API。常见方案有vLLM、Ollama等。以Ollama为例先下载模型然后启动服务ollama pull qwen2.5:7b ollama serve确认服务启动后可以用命令行验证curl http://localhost:11434/api/generate -d { model: qwen2.5:7b, prompt: 用一句话解释什么是反向代理, stream: false }正常会返回JSON结构里面包含回复内容、Token数量、耗时等字段。这里要注意Ollama默认不开启认证生产环境不能直接暴露到公网必须在前面加网关或认证层。另一个常见坑是“裸模型直接给业务用”。本地模型没有限流和超时保护一旦请求量上来GPU显存不足会导致OOM甚至崩掉。建议在推理框架外面再包一层服务统一管理并发数、排队、超时、告警。比如使用请求队列限制同时推理的请求数量超过阈值直接返回系统繁忙而不是让请求全部打到GPU上。5. AI应用的测试、可观测性与幻觉治理5.1 给AI应用写测试输入输出、回归和断言传统后端测试讲究稳定断言AI应用测试最大的痛点是输出不稳定。同一个Prompt模型每次回答可能不一样导致断言经常失败。解决思路不是放弃测试而是分层设计。第一层是接口级测试验证请求参数校验、鉴权、超时、错误码等不关心模型输出内容。第二层是业务级测试用固定Prompt验证业务逻辑是否完整断言可以放宽为“包含关键字段”或“符合JSON Schema”。第三层是回归集准备一组经过标注的标准问答对每次升级模型或修改Prompt后跑一遍对比整体通过率。一个简单的回归测试示例Test void shouldAnswerCompanyPolicyQuestion() { String response aiAssistant.ask(公司年假政策是什么); assertNotNull(response); assertTrue(response.contains(年假)); assertTrue(response.contains(天数)); }这里不追求输出完全一致而是检查关键业务信息是否出现。如果你的系统允许模型自由发挥这类测试可能会失败所以回归集要选择事实性强、Expected信息稳定的问题。5.2 日志链路追踪记录prompt、响应和Token消耗AI应用的排错比普通接口难很多。普通接口报错有堆栈AI应用“报错”可能只是回复了错误内容或者回答被截断或者绕开了系统提示词。如果没有日志几乎无法定位。生产环境至少要记录这些信息请求ID用于关联一次完整调用。用户原始输入。系统提示词和最终发送给模型的完整消息列表。模型名称、Temperature、Max Tokens等参数。模型返回的完整内容。Token消耗输入Token、输出Token、总Token。耗时从收到请求到返回响应的耗时以及模型接口耗时。结束原因正常停止、长度限制、内容审核命中等。需要注意日志里会包含用户敏感信息需要做脱敏处理不能直接原样打印。建议使用日志框架的mdc来透传请求ID把大模型调用日志单独拆到一个文件或一个Topic里方便按时间检索。5.3 幻觉问题不能只靠换大模型解决“AI一本正经地胡说八道”是大模型落地最头疼的问题。很多人以为换一个更大的模型就能解决其实幻觉只能被缓解不能被完全消除。工程上比较有效的做法是给模型提供“知识依据”而不是让它凭记忆输出。最常用的是RAG检索增强生成思路先根据用户问题检索相关资料把检索到的内容作为上下文一起交给模型并明确要求模型只基于提供的资料回答资料里没有的信息要回答“不知道”。一个简化的RAG流程用户输入问题。系统把问题转成向量表示。在知识库中做相似度检索找出最相关的片段。把片段拼进Prompt同时附上来源。模型基于片段生成回答。这样做还有一个好处当回答错误时可以追溯到是哪段资料导致的而不是只能面向模型“问罪”。另外也可以在应用层加一道事实校验模型生成回答后检查回答中的关键实体是否在检索结果中出现不出现就打回重新生成。6. AI应用常见问题排查清单6.1 接口报错、响应慢、内容截断等典型现象AI应用的故障现象往往不像普通Web应用那么明确。下面整理几种常见现象及排查方向。现象可能原因检查方式处理建议接口报401API Key错误检查配置和密钥是否过期更换密钥并确认配置来源接口报429触发限流查看返回值与响应头加重试退避限制并发响应特别慢网络延迟大或模型参数量大分阶段统计耗时拆出模型耗时必要时换模型或降级回答被截断Max Tokens设置太小检查结束原因是否为length调大Max Tokens或拆分回答本地模型OOM显存不足或量化不够查看GPU日志降低并发、减少上下文、提高量化等级回答与事实不符模型幻觉或缺少知识依据分析Prompt和上下文引入RAG或做事实校验6.2 从输入到输出的排查顺序当AI应用返回异常时不要一上来就怀疑模型按下面的顺序排查效率更高。第一步检查请求是否到达。看应用日志确认用户输入、系统提示词是否和预期一致。很多时候是上游传参错误。第二步检查模型调用是否成功。看模型接口的HTTP状态码、返回结构、结束原因。如果返回内容为空看Token消耗是否为0。第三步检查后处理逻辑。很多AI应用拿到模型输出后还会做JSON解析、内容过滤、格式化。回复异常可能是解析失败导致而不是模型问题。第四步检查数据与上下文。如果是RAG方案问题大概率出在检索结果上检索不到资料、检索结果太杂、排序不对都会影响最终回答。建议把每一步的关键中间结果都记到日志里。排错时从日志里直接看到“模型返回了什么”和“用户看到什么”就能快速定位问题在哪一层。7. AI工程化的几条落地建议7.1 学习环境怎么快速跑通如果你是刚开始接触AI应用开发不要一上来就搭复杂的生产架构。建议先用最小闭环理解核心链路用一个模型API或本地小模型做一个“接收问题、调用模型、返回回答”的Web接口。在这个最小项目里重点体会几个变化模型返回是流式的还是非流式的、不同参数会怎样影响输出、调用超时怎么表现、异常怎么处理。学习阶段可以使用本地模型降低实验成本比如通过Ollama跑7B模型。这样不依赖外部API也可以随时看模型在本地环境的真实表现。确认自己能跑通最小闭环后再逐步加入Spring AI、工具调用、RAG和部署优化。7.2 生产环境还要补哪些能力生产环境和学习环境的差异非常大。从学习环境到生产环境至少要补齐以下能力配置外置化API Key、模型地址、超时、限流阈值不要写在代码里放到配置中心或环境变量中。限流与熔断单用户或单个应用都有调用上限触发限流时要快速失败而不是全部积压。日志与监控记录输入输出、Token消耗、耗时、错误率并配置告警。内容安全对输入和输出做合规校验避免敏感内容进入模型或返回给用户。回滚方案模型升级不是简单的版本替换需要通过灰度发布让一部分流量先走新模型效果不佳时能快速切回旧模型。成本控制为不同业务设置Token预算对异常消耗做监控。7.3 长期要做的事把AI能力沉淀为可复用组件很多团队做了三五个AI功能后发现每个功能都联一次模型、各写一套Prompt、各存一套日志复用性很差。更合理的方式是把AI能力抽象成公共组件比如统一模型网关、统一会话管理、统一知识库服务、统一评测平台。以模型网关为例它可以负责路由、限流、重试、监控业务方只需要申请一个API就能调用不需要关心背后用的是哪家模型。当模型调整或切换时网关层重新配置即可业务代码不用改。AI工程化不是一次性任务而是持续演进的过程。每上线一个AI功能都要沉淀出可复用的模块、可复用的评估集、可复用的排错工具。等到团队积累了足够多的工程组件再拿出来一个新需求时拼装速度会快很多系统稳定性也能真正立住。回到开头那句“腾讯AI不再观望”我理解它背后是AI竞争从“秀模型”进入“拼落地”阶段的明确信号。对开发者而言现在是最好的时间点模型能力已经足够支撑大量真实业务而工程化短板恰恰是大多数团队的瓶颈。谁能把Prompt、模型、代码、数据、监控这套链路跑顺谁就能真正把AI变成生产力。最后给一个简单的行动建议从今天的一个小需求开始不用追求用上所有新技术先做一个能回答业务问题的AI接口记录完整日志跑通回归测试再逐步扩展。这个最小闭环会是你理解AI工程化的第一块基石。
返回列表