过去这一两年,AI 相关的话题几乎占据了技术社区的半壁江山。从大模型的参数竞赛,到 AI Agent、AI 编程助手、本地化部署,再到最近热起来的 AI 视频和短剧生成,技术更新的速度已经快到了“稍不留神就落后半年”的程度。
但和很多开发者交流之后,我有一个很明显的感受:大家不缺信息,缺的是把 AI 落到工程项目里的系统化思路。收藏了几十个开源项目,却不知道哪个适合自己业务;看了一堆 Agent 概念文章,真到自己写代码时又不知道从哪里下手。这篇文章我想换一个角度,不追热点,不做新闻整理,而是从“反思”的视角,把当前 AI 应用开发中最核心的技术栈、落地路径、代码示例和工程问题讲透。
本文适合以下几类读者:
- 想从“只会调用 ChatGPT 网页”进阶到“自己写 AI 应用”的后端开发者。
- 准备在 Java/Python 项目中集成大模型能力的工程团队成员。
- 对 AI Agent 开发感兴趣,但对概念和代码边界都比较模糊的学习者。
- 正在评估本地部署模型、需要做服务器选型和环境准备的运维或全栈开发者。
读完这篇文章,你会得到一套完整的 AI 工程化实践地图:从模型选型、接口调用、框架集成,到 Agent 工具调用、本地部署排错,最后是工程落地时真正需要注意的坑点。
1. 背景回顾:AI 开发到底改变了什么
1.1 大模型解决了什么,没有解决什么
先问一个问题:大模型真正解决了什么问题?
从工程视角看,大模型(LLM)本质上是把“自然语言到计算机行为的转换”能力,以接口调用的方式开放给了开发者。过去我们做意图识别、实体抽取、对话管理,需要训练好几个模型,还要处理槽位填充、多轮上下文等复杂问题。现在,一个预训练好的大模型就能完成大部分基础理解任务,开发者只需要关注业务逻辑和提示词设计。
但大模型没有解决的问题也很明显:
- 可靠性问题:模型输出的内容具有概率性,同一个问题可能在不同时间给出不同答案。
- 知识边界问题:训练数据有截止日期,超出范围的领域知识无法准确回答。
- 成本与延迟问题:模型规模和推理速度之间存在矛盾,不是所有场景都适合调用大模型。
- 工程集成问题:大模型只是“大脑”,它还需要连接数据库、文件系统、外部 API 和业务系统,才能真正完成工作。
这些没有解决的问题,恰恰是 AI 工程化、Agent、本地部署等技术方向存在的底层原因。
1.2 从“聊天机器人”到“AI 原生应用”
过去我们提到 AI 应用,第一反应是“聊天机器人”。但现在的 AI 应用已经远远超出了“对话框”的范畴:
- AI 编程助手:Cursor、PyCharm AI 插件等工具,把大模型嵌入到了 IDE 的完整工作流中。
- AI 内容生产:AI 文案、AI 短视频、AI 短剧生成,背后涉及文本、图像、视频多种模型的组合调用。
- AI 知识库助手:基于 RAG(检索增强生成)架构,把企业内部文档变成可问答的智能助手。
- AI Agent:不只是回答问题,还能拆解任务、调用工具、自主完成复杂操作。
这些应用的共性是:不再把大模型当作一个独立服务,而是把它作为整个业务系统中的一个组件。这种转变要求开发者必须掌握从模型接口到业务集成的全链路能力。
1.3 开发者需要建立的新技术地图
很多后端开发者面对 AI 时会有一个误区:以为要学很多新语言、新框架。实际上,当前主流 AI 开发仍然集中在 Python 和 Java(Spring)这两个技术栈上,核心是把原来的业务系统与大模型接口连接起来。
一个完整 AI 工程化项目,通常会涉及以下几层:
| 层级 | 典型技术/工具 | 主要负责的内容 |
|---|---|---|
| 模型层 | OpenAI、国内大模型、开源模型 | 文本生成、语义理解、图像生成等基础能力 |
| 框架层 | Spring AI、LangChain、LlamaIndex | 统一模型接入、提示词管理、链路编排 |
| 应用层 | 业务系统、Web 服务、自动化脚本 | 面向用户的最终功能 |
| 部署层 | Docker、Ollama、云服务器、GPU 主机 | 模型运行环境、服务部署、资源调度 |
有了这个地图,学习方向就会清晰很多。下面逐个展开。
2. 核心概念:大模型、Agent 与智能体的边界
2.1 大语言模型(LLM)的基本原理
大语言模型是基于海量文本数据训练的深度学习模型,核心能力是通过预测下一个 token 来生成文本。你可以把它理解成一个“概率性文本生成器”:模型根据已经输入的所有文本,计算下一个词最可能是什么,然后不断重复这个过程,最终生成完整回复。
这个原理带来了两个关键特性:
- 生成能力极强:能写代码、写文章、做翻译、做总结,也能理解上下文。
- 结果不完全可控:模型每次生成都带有采样概率,相同的输入可能得到不完全相同的输出。
所以工程上有一条基本原则:不要把大模型当作确定性计算引擎。凡是对准确性有严格要求的场景(比如金额计算、日期计算),都应该由代码完成,而不是让模型生成。
2.2 什么是 AI Agent
AI Agent(智能体)是当前 AI 应用开发中最热的方向之一。与大模型“单轮对话”不同,Agent 有一个更完整的自主工作循环:
- 理解任务:接收用户的目标,把模糊需求拆解成可执行步骤。
- 规划步骤:决定先做什么、后做什么,需要调用哪些工具。
- 执行动作:调用外部工具或 API 获取结果。
- 观察反馈:根据工具返回结果判断是否达到目标。
- 循环迭代:如果目标未达成,继续调整方案,直到完成。
换句话说,Agent 让大模型从一个“能说话的顾问”变成了“能做事的下属”。
2.3 智能体的关键技术:工具调用与规划
Agent 能“做事”的关键在于工具调用(Function Calling / Tool Use)。大模型本身无法访问外部系统,但通过工具调用机制,模型可以生成一个结构化的调用指令,告诉业务系统“请调用某个函数,参数是什么”。业务系统执行函数后,把结果返回给模型,模型再基于结果生成下一步输出。
一个最小可用的工具调用流程通常包括:
用户输入 -> 大模型生成工具调用指令 -> 业务系统执行函数 -> 返回结果给大模型 -> 大模型生成最终回复规划能力则更复杂一些。简单的 Agent 用“固定流程”实现,复杂一点的 Agent 需要模型自己决定调用顺序,甚至使用 ReAct(Reasoning + Acting)框架来交替进行推理和行动。
2.4 提示词、RAG、微调之间的关系
很多新手分不清这三者,这里用一个表格来说明:
| 技术 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 提示词工程 | 通过设计输入内容引导模型输出 | 成本低、见效快 | 对模型能力上限之外的任务无效 | 日常业务场景、快速验证 |
| RAG(检索增强生成) | 先从知识库检索相关内容,再拼接到提示词中 | 知识可更新、减少幻觉 | 需要搭建向量库和检索链路 | 企业知识库问答、文档助手 |
| 微调 | 用业务数据继续训练模型参数 | 能改变模型风格和能力 | 成本高、需要数据标注 | 特定领域风格、私有知识固化 |
简单来说:提示词是用好模型的“开关”,RAG 是让模型“看到更多资料”,微调是让模型“本身变得不一样”。绝大多数业务场景,组合使用提示词和 RAG 就能解决问题,不要轻易上微调。
3. AI 技术栈分层:从模型选择到应用落地
3.1 模型层:选型时考虑什么
先看模型层。如果你所在地区可以直接使用 OpenAI 等海外模型服务,可以直接使用官方接口;如果需要国内服务或私有化部署,可以选择国内大模型服务或开源模型。这里不过多展开,给出一个通用的选型维度:
- 任务类型:纯文本对话选通用对话模型;需要摘要、改写选能力均衡的模型;需要视觉理解选多模态模型。
- 上下文长度:长文档分析需要支持 128K 甚至更长上下文的模型。
- 推理速度:实时客服、AI 编程助手等场景要求低延迟,需要选推理快的模型。
- 成本控制:高并发业务需要平衡模型能力和 token 成本。
- 部署方式:数据敏感场景更倾向于本地部署或私有化部署。
3.2 框架层:Java 和 Python 阵营
在实际项目中,框架的作用是屏蔽不同模型服务的差异,提供统一 API。当前最常见的是两个阵营:
Java/Spring 阵营:Spring AI
Spring AI 是 Spring 官方推出的 AI 应用开发框架,目的是把 AI 能力融入 Spring Boot 生态。它的价值在于:Java 后端团队不需要重学语言,用熟悉的依赖注入、配置管理方式就能接入大模型。
Python 阵营:LangChain、LlamaIndex
LangChain 更偏重 Agent 和多工具协同,提供了链式调用、记忆管理、工具集成等能力。LlamaIndex 则专注于知识库索引和检索,在 RAG 场景下表现很好。
选择哪个阵营,更多取决于团队现有技术栈,而不是哪个更“火”。Java 项目团队用 Spring AI 更平滑,Python 数据团队用 LangChain 更顺手。
3.3 应用层:场景决定价值
应用层是真正产生价值的地方。2025 年的 AI 应用已经非常丰富:
- AI + 编程开发(代码生成、代码解释、测试用例生成)
- AI + 知识管理(企业内部文档问答、客服助手)
- AI + 内容创作(文案生成、视频脚本、AI 短剧)
- AI + 数据决策(报表解读、指标异常分析)
- AI + 自动化办公(会议纪要、邮件撰写)
一个值得记住的判断标准是:AI 应用的价值,不在于用了多强的模型,而在于是否解决了业务中的真实问题。很多看起来“技术含量不高”的场景(比如周报生成、会议纪要整理),实际带来的效率提升非常明显。
3.4 部署与运维层:从云端 API 到本地模型
部署层按依赖方式可以分成两种:
- 纯 API 调用:直接调用云端模型服务,开发简单、成本按量计费,但数据需要经过第三方,且无法自定义模型细节。
- 本地/私有化部署:在自有服务器上运行开源模型,数据不出内网、可控性强,但需要 GPU 服务器或优化后的 CPU 推理方案,运维成本高。
环境选型层面,如果团队刚起步,建议从云端 API 开始,跑通业务后再根据数据合规和成本要求,评估是否本地部署。下面两个章节会分别演示这两条路径的工程实现。
4. 工程实践第一步:用代码调用大模型接口
4.1 准备一个 OpenAI 兼容的模型服务
现在很多开源模型和本地推理工具都提供 OpenAI 兼容接口。这意味着,无论你最终用的是哪个模型服务,只要它支持 OpenAI 兼容格式,客户端代码就可以复用。
本节示例以openaiPython 库为例,调用一个兼容接口。接口地址可以指向本地部署的 Ollama 服务(默认端口 11434),也可以指向云端兼容服务。
环境准备:
# 推荐 Python 3.10 以上 pip install openai如果你本机已经安装了 Ollama 并拉取了模型,可以先启动服务:
ollama serve然后确认模型已经拉取:
ollama pull qwen2.5:7bqwen2.5:7b是目前本地部署中比较常用的开源模型,7B 参数级别在消费级显卡或 16G 内存的机器上可以跑起来。如果你使用的是其他模型,替换名称即可。
4.2 Python 完整示例
下面是一个完整的调用示例,代码里包含了系统提示词、用户输入和基本的参数控制:
# 文件路径:llm_demo.py import os from openai import OpenAI # 优先从环境变量读取配置,本地测试时也可以直接写死 client = OpenAI( api_key=os.getenv("LLM_API_KEY", "sk-xxxx"), base_url=os.getenv("LLM_BASE_URL", "http://localhost:11434/v1") ) def chat(prompt: str, model: str = "qwen2.5:7b") -> str: """发送对话请求,返回模型回复文本。""" resp = client.chat.completions.create( model=model, messages=[ { "role": "system", "content": "你是一名技术助手,回答问题时请分点说明,保持简洁。" }, {"role": "user", "content": prompt} ], temperature=0.7, max_tokens=2048 ) return resp.choices[0].message.content if __name__ == "__main__": result = chat("请用三句话说明 AI Agent 和普通聊天机器人有什么区别。") print(result)运行方式:
python llm_demo.py预期输出一段分点说明的文字,具体内容由模型生成。如果控制台没有任何输出,需要检查服务地址和模型名称是否正确。
4.3 关键参数说明与常见误区
上面的示例中有几个参数需要解释:
model:模型名称。使用 Ollama 本地部署时,名称是创建模型时的名字,比如qwen2.5:7b。messages:对话消息列表,按角色区分。system用于设定模型行为,user是用户输入,后续还可以加assistant消息实现多轮对话。temperature:控制随机性。值越低,输出越稳定;值越高,回答越有创造性。代码类任务建议 0.2 左右,文案创作可以调到 0.8 以上。max_tokens:限制生成的最大 token 数。注意 token 不是汉字数,一个汉字大约对应 1 到 2 个 token。
一个常见误区是:很多人把“温度调低”当作让模型“不犯错”的手段。实际上temperature=0只能让输出更稳定,并不能保证事实正确。要保证准确,应该在代码层面做校验,或者引入 RAG 给模型提供可靠知识来源。
5. 工程实践升级:Java 项目中集成 Spring AI
5.1 Spring AI 是什么
对于 Java 后端团队来说,Spring AI 是目前最值得关注的 AI 集成框架。它提供了一套统一的接口来对接不同大模型服务,同时支持提示词模板、结构化输出、函数调用等高级能力。
Spring AI 的核心价值在于:
- 平滑集成:使用 Spring Boot 的自动配置机制,配置项集中在
application.properties中。 - 对象封装:开发者可以像使用 Spring MVC 那样使用
ChatClient对象,而不必直接处理 HTTP 请求。 - 生态复用:与 Spring Cloud、Spring Security 等组件天然兼容,方便在现有微服务架构中引入 AI。
需要注意,Spring AI 目前版本迭代较快,不同版本的 API 会有一点差异。以下示例基于 Spring AI 1.0.x,具体使用请以你项目中的实际版本为准。
5.2 添加依赖与配置
创建一个标准的 Spring Boot 项目,然后在pom.xml中添加依赖:
<!-- 文件路径:pom.xml --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> <!-- 请根据你的 Spring Boot 版本选择合适的版本,以下示例为 1.0.x --> <version>1.0.0</version> </dependency>然后在application.properties中配置模型接口:
# 文件路径:src/main/resources/application.properties spring.application.name=ai-demo # 这里配置 OpenAI 兼容接口,本地 Ollama 默认地址为 http://localhost:11434/v1 spring.ai.openai.base-url=http://localhost:11434/v1 spring.ai.openai.api-key=sk-xxxx spring.ai.openai.chat.options.model=qwen2.5:7b如果你的项目使用的是 OAUTH2 或其他认证方式,需要额外添加对应的请求头配置。本节展示的是最小化配置,适合本地开发。
5.3 编写一个简单的聊天接口
新建一个 Controller 类,注入ChatClient,就能实现一个最简单的问答接口:
// 文件路径:src/main/java/com/example/ai/controller/ChatController.java package com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient = builder.build(); } @GetMapping("/api/chat") public String chat(@RequestParam(defaultValue = "你好,介绍一下自己") String message) { return chatClient.prompt(message) .call() .content(); } }启动 Spring Boot 应用后,在浏览器中访问:
http://localhost:8080/api/chat?message=用一句话介绍Spring AI就会得到一个模型生成的回答。
5.4 Java 工程集成中的注意事项
在真实 Java 项目中集成 Spring AI,有几点值得注意:
- 超时设置:大模型接口响应比较慢,默认 HTTP 客户端超时时间可能不够,需要自定义配置。
- 日志脱敏:发送给模型的内容可能包含用户输入或业务数据,日志打印时要注意脱敏,避免敏感信息泄漏。
- 错误处理:模型接口可能返回限流、超时、解析失败等异常,建议在 Service 层做统一异常处理。
- 配置管理:
api-key、base-url不应该直接写在代码库中,推荐放到环境变量或配置中心。
Java 项目的优势是工程化能力强,适合把 AI 能力嵌入到已有业务系统中。
6. Agent 开发入门:从单轮对话到工具调用
6.1 Agent 的最小工作流
如果说前面两章是“让程序会说话”,那么 Agent 就是“让程序会干活”。Agent 与普通对话的区别在于它能访问外部工具并采取行动。
一个最小的 Agent 工作流可以这样拆解:
用户输入(目标任务) ↓ 大模型分析:需要调用哪个工具、传入什么参数 ↓ 业务系统执行工具函数(查天气、查库存、发邮件等) ↓ 把工具执行结果返回给大模型 ↓ 大模型生成最终回复 / 下一步计划这个循环会一直持续,直到大模型认为任务已经完成。
6.2 工具调用(Function Calling)原理
工具调用的核心是:在请求接口时,额外传入一组“工具定义”。每个工具定义包含函数名称、功能描述和参数结构。大模型根据用户问题判断需要调用哪个函数,并输出结构化的调用参数。
业务系统拿到参数后,执行真实的函数代码,再把执行结果作为新的消息回传给模型。最终模型参考工具返回结果,生成面向用户的回答。
这种设计最大的好处是:模型不需要“学会”执行某个操作,只需要学会“决定”调用哪个操作。具体业务逻辑仍然由我们的代码执行,保证结果的准确性和安全性。
6.3 一个最小 Agent 示例
下面用 Python 写一个“天气查询”Agent。示例中的get_weather函数只是一个模拟实现,实际项目中可以替换为真实天气 API 调用。
# 文件路径:agent_demo.py import json from openai import OpenAI client = OpenAI( api_key="sk-xxxx", base_url="http://localhost:11434/v1" ) # 定义工具:描述函数名称、作用、参数 tools = [ { "type": "function", "function": { "name": "get_weather", "description": "查询指定城市当前的天气情况", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称,例如北京、上海"} }, "required": ["city"] } } } ] def get_weather(city: str) -> str: """模拟天气查询函数,实际项目中可替换为第三方天气 API。""" weather_map = { "深圳": "晴,29℃", "上海": "多云,26℃", "北京": "阴,22℃" } return weather_map.get(city, f"暂无 {city} 的天气数据") def run_agent(user_input: str) -> str: messages = [{"role": "user", "content": user_input}] # 第一轮:让模型判断是否需要调用工具 resp = client.chat.completions.create( model="qwen2.5:7b", messages=messages, tools=tools, tool_choice="auto" ) msg = resp.choices[0].message # 如果模型要求调用工具 if msg.tool_calls: # 把模型生成的工具调用消息追加到对话记录中 messages.append(msg) for tool_call in msg.tool_calls: args = json.loads(tool_call.function.arguments) if tool_call.function.name == "get_weather": result = get_weather(args["city"]) # 把工具执行结果作为 tool 角色消息追加 messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": str(result) }) # 第二轮:让模型基于工具结果生成最终回答 final_resp = client.chat.completions.create( model="qwen2.5:7b", messages=messages ) return final_resp.choices[0].message.content # 如果模型不需要调用工具,直接返回回复 return msg.content if __name__ == "__main__": print(run_agent("深圳今天天气怎么样?"))运行这个脚本,模型会先判断需要调用get_weather函数,拿到结果后生成一段自然语言回复。
6.4 Agent 工程化的难点
上面示例看起来简单,但到真实项目中,Agent 工程化会遇到很多问题:
- 工具数量膨胀:当工具数量超过十几个时,模型容易选错工具,需要做工具分组或简化描述。
- 多轮调用状态管理:每一步工具调用的结果都需要保存,一旦会话中断,恢复起来比较麻烦。
- 成本不可控:Agent 的循环次数增多,token 消耗成倍上涨,需要设计预算上限。
- 安全边界:让 Agent 操作数据库、发送邮件等高危动作前,必须设置审批节点,避免不可逆操作。
所以在生产环境中,相比“全自主 Agent”,更推荐的是“人工审批 + 半自动 Agent”:Agent 负责生成操作建议,由人来执行最终确认。这样既保留效率,又控制风险。
7. 本地模型部署:环境选型与实战
7.1 什么时候需要本地部署
本地部署大模型是很多企业关注的方向,但它并不适合所有场景。比较典型的本地部署诉求有:
- 数据合规要求:部分业务数据不能出内网,必须本地处理。
- 成本优化:高频调用场景下,云端按 token 计费的成本高于自有服务器推理成本。
- 定制化需求:需要对模型做微调或特殊配置,云端服务无法满足。
- 离线保障:网络条件受限或要求高可用,不希望依赖外网接口。
但如果你的业务还处于验证阶段,数据量不大,完全可以先用云端 API 快速验证,不要一上来就采购 GPU 服务器。
7.2 云主机/服务器选型建议
本地部署模型的环境选型,重点看模型规模和你想要达到的推理速度。
如果部署 7B 级别的模型:
- 内存建议 16G 以上,模型加载后还需要预留 KV Cache 空间。
- 有 GPU 更好,没有 GPU 也可以勉强用 CPU 跑,但速度会比较慢。
- 系统建议 Ubuntu 22.04 LTS 或更高版本,Python 3.10+,Docker 可选。
如果部署 70B 级别的大模型:
- 建议 48G 以上显存的 GPU(如多卡 A100/H100 或单卡 A6000 级别)。
- 需要评估推理框架(如 vLLM、TensorRT-LLM)和量化方案。
在选云主机时,优先关注几个指标:CPU 核数、内存大小、GPU 型号与显存、磁盘 IO(模型文件通常有 4G 到 15G 以上)。至于具体品牌,国内主流的云厂商都能满足需求,根据自己的资源包预算选择即可。
7.3 使用 Ollama 快速部署一个模型
对于开发者个人学习和中小团队验证,Ollama 是最简单的本地部署方案。它封装了模型下载、加载、推理、API 提供的完整流程,一条命令就能跑起一个 OpenAI 兼容服务。
安装 Ollama(Linux 示例):
curl -fsSL https://ollama.com/install.sh | sh也可以使用 Docker 方式:
docker run -d --name ollama -p 11434:11434 ollama/ollama启动服务并拉取模型:
# 启动服务(通常安装后已自动启动,也可以手动执行) ollama serve # 拉取模型 ollama pull qwen2.5:7b # 快速测试 ollama run qwen2.5:7b "你好,介绍一下你自己"测试完成后,Ollama 会在11434端口提供 OpenAI 兼容接口,也就是前面 Python 示例中base_url指向的那个地址。
7.4 部署完成后的验证
部署完成后,可以用一个简单的curl请求验证接口是否正常:
curl http://localhost:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [{"role": "user", "content": "用一句话解释什么是大模型"}], "stream": false }'如果返回 JSON 中包含choices字段,说明服务正常。这种验证方式比写代码更快,适合部署完成后快速做健康检查。
8. 常见问题与排查思路
下面整理几个本地模型部署和接口调用过程中最常遇到的问题。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 调用接口报连接超时 | 服务未启动 / 端口被占用 / 防火墙限制 | 先确认ollama serve是否运行,再用curl测试端口 |
| 返回 404 或 model not found | 模型名称错误或未拉取 | 执行ollama list查看已拉取模型,确认名称完全一致 |
| 生成速度非常慢 | CPU 推理、无显卡或模型过大 | 降低模型规模、使用量化版模型,或增加 GPU 资源 |
| 输出乱码或中文异常 | 模型 tokenizer 不支持 / 参数配置错误 | 检查模型是否支持中文,调大max_tokens,确认编码为 UTF-8 |
| 请求报 401 认证失败 | api-key 不匹配 | 本地 Ollama 通常接受任意非空 key,云端服务需要真实有效的 key |
| Spring AI 启动失败 Bean 注入错误 | 版本不匹配 / 缺少依赖 | 检查 Spring AI 与 Spring Boot 版本兼容性,参照官方示例调整 |
8.1 接口调用链路排查清单
遇到问题不要慌,按下面的顺序排查通常能快速定位:
- 先确认模型服务本身是否正常:直接命令行调用
ollama run。 - 再确认 HTTP 接口是否正常:用
curl请求一次接口。 - 然后确认客户端配置是否正确:
base_url、api_key、model是否完全一致。 - 最后检查业务代码:入参 messages 格式是否正确、是否有字段拼写错误。
大多数“调用失败”问题,最后都出在第 3 步:地址写错、端口写错、模型名大小写不一致。
9. 工程落地的最佳实践与反思
9.1 不要把大模型当作确定性计算引擎
这是 AI 工程化中最容易踩的坑。不少人会把大模型输出的结果直接当作准确数据去写库、做计算,一旦模型输出不稳定,就会出现线上事故。
正确的思路是:
- 需要强逻辑和精确计算的场景,用代码实现,让模型只做自然语言理解与生成。
- 模型输出必须做格式校验和范围校验,必要时二次确认。
- 关键业务操作(转账、删除、发布)需要人工审批或多重验证。
9.2 可观测性与成本控制
AI 项目上线后,可观测性非常重要。你需要能回答这几个问题:
- 每个请求用了多少 token?占多少成本?
- 模型平均响应延迟是多少?哪些环节耗时最长?
- 调用了哪些工具?有没有出现循环调用?
建议在应用层统一添加日志和监控埋点,记录模型名称、token 消耗、耗时、工具调用链路等关键指标。成本控制上,可以设置单用户调用上限、单会话 token 上限,避免异常流量产生巨额费用。
9.3 数据安全与合规边界
AI 应用天然要处理用户输入和业务数据,安全合规是不可绕过的环节:
- 传输加密:接口必须走 HTTPS,key 不要出现在前端代码中。
- 数据脱敏:发送给模型前,对手机号、身份证、地址等敏感信息做脱敏处理。
- 日志脱敏:日志中不要打印完整的用户输入和模型输出,特别是涉及隐私的内容。
- 权限控制:涉及 Agent 工具调用时,必须做用户权限校验,防止越权操作。
9.4 AI 辅助开发的正确姿势
最近经常听到“用 AI 写文章骗不了人了”这类讨论。在代码开发中也有类似情况:AI 生成的代码表面上能用,但隐藏着逻辑漏洞和安全隐患。作为一个技术博主,我的看法是:
AI 辅助开发的正确姿势,不是让 AI 替代你思考,而是让 AI 承担重复劳动,把时间留给你做方案设计、代码审查和业务把关。在代码层面,应该做到:
- 让 AI 生成代码后,逐行审查,理解每个函数的作用。
- 测试用例不能省,要让 AI 补测试,而不是补代码。
- 涉及核心逻辑和资金操作的代码,不要直接用 AI 生成结果,不要直接上线。
10. 下一步学习路线与建议
这篇文章从“Reflections on AI”这个角度,梳理了当前 AI 应用开发的完整技术路径。总结一下核心要点:
- 大模型是概率性生成引擎,不能替代确定性计算逻辑。
- Agent 通过工具调用让模型从“能说”变成“能做”,但工程化需要关注安全和成本。
- 云端 API 适合快速验证,本地化部署适合数据敏感和高频调用场景。
- Java 团队选 Spring AI,Python 团队选 LangChain/KLamaIndex,不要太纠结于框架热度。
- 数据安全、成本控制、可观测性,才是 AI 项目上线的真正门槛。
下一步的学习路线,可以按三个阶段推进:
第一阶段:跑通接口调用。用 Python 或 Java 调用大模型 API,完成一个简单的问答机器人。重点理解 messages、token、temperature 这些基础概念。
第二阶段:做 RAG 应用。选择一个垂直领域(比如企业制度问答),把文档切分、向量化、检索、拼接提示词的完整链路跑通,熟悉 Embedding 和向量数据库。
第三阶段:实现 Agent。从单工具调用入手,逐步增加工具数量,理解规划、记忆、循环调用等高级话题,最后再谈多 Agent 协同。
如果你现在正准备在项目里引入 AI,建议先从一个小场景开始,跑通一条链路,再去扩展复杂度。也不要执着于收集各种新模型和新框架——真正让你脱颖而出的,是你能把 AI 能力和业务问题结合到什么程度。找一个身边的真实场景,把今天文章里的代码跑一遍,你的体会会比读十篇文章都深。