
你写的代码被同事问过“这是AI生成的吧”你发出去的技术文章下面有人评论“这内容一看就是AI写的”就连你在群里发一段项目复盘都会有人半开玩笑地说“有AI味”。这类对话在近两年已经非常普遍。与其纠结“是不是AI”不如换一个更实际的角度如果AI真的能高效生成内容、代码甚至完整应用那我们应该怎样把它变成可靠的生产力这篇文章就从“有人会说这是AI”这个现象出发沿着一条清晰的工程路径展开。我们会先理解生成式AI到底在做什么为什么它会一本正经地胡说八道然后分别用 Python 和 Spring AI 搭建两个可运行的AI应用示例再到 RAG、Agent 等进阶主题最后给出AI应用开发过程中最常见的坑和工程化建议。无论你是刚开始接触AI的新手还是准备把大模型接入业务系统的后端工程师都能从里面找到可以直接使用的内容。1. 当“有人会说这是AI”从质疑到掌握1.1 你看到的那些“AI痕迹”现在很多人能一眼辨认出AI生成的内容。文章里出现“首先、其次、总之”的工整结构代码里出现注释比代码还详细的情况聊天记录里语气永远平稳、没有情绪波动这些都可能被归结为“AI味”。这个现象本身并不新鲜。每次新工具出现都会改变人们对“人类产出”的判断标准。真正值得思考的是为什么AI生成的内容越来越难分辨答案在于大模型已经学会了人类语言中绝大部分的统计规律它可以模仿风格、组织逻辑、生成符合上下文的内容。这对内容生产是好事但对技术判断能力提出了更高要求。对开发者的启示不是去训练“AI识别眼”而是搞清楚AI生成内容的底层机制。只有知道模型怎么工作你才知道它的能力边界在哪里哪些环节需要人工兜底哪些环节可以让它自动化。1.2 技术人员应该追问的问题当你拿到一段“可能是AI写的”代码时与其判断作者是谁不如问下面几个问题这段代码能不能编译、能不能运行边界条件是否覆盖完整是否存在 SQL 注入、越权访问等安全问题注释是否和实际逻辑一致有没有引入不必要的依赖这些问题才是技术评审中真正重要的东西。AI 可以写出看起来很完整的代码但这些代码未必经过真实场景验证。反过来如果你能利用 AI 快速生成初稿再把精力集中在审查、测试和优化上你的产出效率会明显高于只用传统方式写代码的人。1.3 本文你能得到什么这篇文章会给你一条从“会用AI”到“会开发AI应用”的完整路径。你不仅能看懂大模型的基本概念还能亲手跑起来两个真实项目Python 调用大模型API实现一个命令行问答助手Spring AI Spring Boot实现一个Web问答接口。这两个示例虽然简单但覆盖了AI应用开发中最核心的链路服务配置、接口调用、参数调整、结果输出。最后的进阶部分还会解释 RAG 和 Agent 的区别帮你判断自己在项目中到底需要哪种方案。2. 生成式AI的基础原理2.1 从“文字接龙”理解大模型大模型的全称是“大型语言模型”它最朴素的工作方式可以理解为“文字接龙”。给定前面的一段文字模型预测下一个最可能出现的词是什么然后把预测出来的词拼接到原文后面再预测下一个词不断重复直到输出完整的回答。例如你输入“中国的首都是”模型会计算每个候选词出现概率选择概率最高的“北京”于是输出“中国的首都是北京”。在实际实现中模型的预测单位不是完整词语而是 Token。一个 Token 可能是一个字、一个词也可能是一个标点。不同模型的 Token 切分方式不同中文场景下通常一个汉字对应一到两个 Token。这个机制解释了为什么大模型能说会道也解释了它为什么会有幻觉它生成的不是经过验证的“事实”而是概率上最合理的“文字序列”。当训练数据中缺少某个知识时模型不会诚实地说“不知道”而会编造一个看起来合理的答案。2.2 Token、上下文窗口与参数在实际开发中你会频繁遇到几个概念。Token 是模型计费的基本单位也是上下文窗口的计算单位。用户输入的问题、系统提示词、模型输出的回答最终都会换算成 Token 数。上下文窗口决定了一次对话中模型能“看到”多少内容。早期的模型上下文窗口只有 2048 或 4096 Token现在的模型可以达到 128K 甚至更多。上下文窗口越大能一次性传入的文档内容就越多RAG 方案的可用性也就越高。常见的生成参数会对模型行为产生明显影响。temperature 控制随机性取值越低输出越稳定取值越高输出越发散。top_p 也类似控制候选词累计概率。做代码生成、数据提取等确定性任务时temperature 建议调低一些做文案创作、头脑风暴时可以适当调高。2.3 幻觉为什么无法完全消除幻觉是大模型最出名的问题指的是模型生成的内容与事实不符但表达得非常自信。比如你问某个冷门框架的API用法模型没在训练数据里见过它会根据相似框架的规律推测出一个接口名。这个接口名看起来完全合理但编译时才发现根本不存在。又比如分析财务报表时模型可能会根据输入格式“推测”出一个并不存在的数字。幻觉不能完全消除只能缓解。常见手段包括给模型提供外部知识来源也就是 RAG在提示词中明确要求“不确定时回答不知道”用较低的温度参数减少随机性对重要输出进行二次校验。理解幻觉的存在是写出可靠AI应用的前提。你不可能把业务结果完全交给大模型而是要在模型和用户之间增加校验、兜底、人工审核等环节。3. AI应用开发的三种主流模式3.1 模式一直接调用大模型API这是最简单的模式也是今天两个实战案例的基础。你的业务系统通过 HTTP 请求调用大模型服务商提供的 API把用户问题、系统提示词、历史对话等内容组装成请求体然后解析模型返回的文本。这种模式适合通用对话、文本摘要、翻译、代码解释等场景。优点是开发成本低一个小时代就能完成接入缺点是无法获取模型训练数据之外的知识也无法直接影响模型的推理过程。3.2 模式二RAG检索增强生成RAG 的全称是 Retrieval-Augmented Generation意思是“检索增强生成”。它把外部知识库接入到大模型生成流程中先根据用户问题检索最相关的文档片段再把检索结果和问题一起拼进提示词让模型基于这些材料回答。这种模式非常适合企业内部文档问答、产品说明书客服、法律条款查询等场景。模型的回答可以引用真实资料幻觉问题明显减少。RAG 不要求你重新训练模型只要做好文档切分、向量化、检索这些工程环节即可。3.3 模式三AI Agent智能体编排Agent 可以理解为“会使用工具的 AI”。大模型本身只能输出文字但 Agent 可以让模型决定“下一步该调用哪个函数、访问哪个数据库、请求哪个 API”然后根据工具返回结果继续推理直到完成任务。比如一个客服 Agent可以查询订单状态、发起退款申请、生成工单一个运维 Agent可以读取监控指标、分析日志、给出告警建议。Agent 是当前AI应用开发中最热的方向但工程复杂度也最高需要处理工具调用、状态管理、异常恢复、内容安全等一系列问题。3.4 AI编程工具与框架的定位除了开发AI应用AI也在改变软件开发本身。Cursor、通义灵码、GitHub Copilot 这类AI编程工具可以把自然语言需求转换成代码片段。很多项目里AI甚至能完成单元测试生成、接口文档编写、SQL优化等重复性工作。框架层面Spring AI 的出现让 Java 开发者可以用熟悉的 Spring Boot 风格集成大模型。它屏蔽了不同模型服务商的 API 差异提供了统一的 ChatClient、EmbeddingModel、向量数据库抽象适合在现有 Java 技术栈中快速落地AI能力。Python 生态则有 LangChain、LlamaIndex 等框架功能更丰富但版本迭代也更快。4. 环境准备与版本说明4.1 开发环境本文示例用到两种技术栈你可以根据自己的情况选择其中一种运行。建议都准备好因为 Python 脚本适合快速验证Spring AI 工程适合集成到后端系统。JDK 17 或更高版本Maven 3.6 以上Spring Boot 3.2 以上Spring AI 1.x 稳定版本Python 3.9 以上任意支持 Python 的 IDE推荐 PyCharm 或 VS Code后端开发 IDE 推荐 IntelliJ IDEASpring AI 版本迭代比较快示例中的 API 以当前 1.x 稳定版为准。如果你的版本不同编译报错时优先参考官方文档中的迁移说明。4.2 大模型服务准备国内可以访问的大模型服务商基本都提供 OpenAI 兼容接口例如 DeepSeek、通义千问、智谱等。你需要做两件事在服务商平台注册账号创建一个 API Key并确保账户有可用余额。不同的服务商base_url 和 model 名称会不一样。例如 DeepSeek 的 OpenAI 兼容地址是https://api.deepseek.com模型名deepseek-chat。其他服务商以官方文档为准。为了让示例通用代码中我都会保留一个 base_url 参数你只需要替换成自己服务商的实际值。这里要特别提醒API Key 是敏感凭证不要把 Key 硬编码到代码中。项目里应通过环境变量或配置中心读取并且对 Key 设置调用额度限制避免泄露后产生损失。4.3 工程结构规划实战案例的规划如下ai-demo-python ├── chat_demo.py ai-demo-spring ├── pom.xml ├── src/main/java/com/example/aidemo/AiDemoApplication.java ├── src/main/java/com/example/aidemo/controller/AiController.java └── src/main/resources/application.properties两个项目互不影响你可以根据自己需要选择其中一个完整跑通。5. 实战一Python调用大模型API快速验证5.1 安装依赖Python 示例使用 OpenAI 官方 SDK因为它可以连接大多数兼容 OpenAI 协议的服务商。在命令行中执行pip install openai安装完成后建议验证一下版本python -c import openai; print(openai.__version__)能输出版本号说明安装成功。如果你的 Python 环境里同时存在多个版本注意 pip 和 python 是否对应同一套环境。5.2 编写调用代码新建一个文件chat_demo.py输入以下内容# 文件路径chat_demo.py from openai import OpenAI client OpenAI( api_key你的API-KEY, base_urlhttps://api.deepseek.com ) def chat_with_ai(user_input: str) - str: response client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是一名Java技术博主擅长用通俗语言解释复杂技术概念。}, {role: user, content: user_input} ], temperature0.7 ) return response.choices[0].message.content if __name__ __main__: question input(请输入你的问题) print(AI回答) print(chat_with_ai(question))这段代码做的事情很清晰创建 OpenAI 客户端设置 API Key 和目标服务地址定义chat_with_ai方法组装 system 和 user 两条消息调用chat.completions.create发送请求从返回结果中取出第一条回答内容并返回主函数中读取用户输入打印AI回答。5.3 运行与结果说明在项目目录下执行python chat_demo.py输入一个问题例如“什么是RAG”你会看到类似下面的输出请输入你的问题什么是RAG AI回答 RAGRetrieval-Augmented Generation检索增强生成是一种把外部知识检索和大模型生成结合起来的方案。它先根据用户问题从知识库中检索相关文档再把检索结果作为上下文交给大模型让模型基于这些资料生成回答...不同的服务商、不同模型回答内容会有差异。这很正常因为我们用的模型和参数不同。5.4 关键参数解释model参数决定使用哪个模型。同一个服务商下可能有多种模型不同模型的价格、上下文长度、推理能力都不一样。建议先阅读服务商文档选择性价比最高的。messages是对话消息列表每条消息包含role和content两个字段。system消息用于设定模型角色和行为user消息是用户输入。如果需要多轮对话可以把之前的问答历史也放进messages中模型才能感知对话上下文。temperature控制回答的随机性。填 0.2 时回答更稳定填 1.0 时回答更发散。如果你的业务对格式要求严格建议填 0.2 到 0.5。6. 实战二Spring AI构建Web问答接口Python 脚本适合本机验证但真实业务系统通常是 Java 后端。下面我们用 Spring AI 构建一个 Web 问答接口这个接口会接收用户的 GET 请求调用大模型然后返回 AI 回答。6.1 创建项目与依赖你可以通过 Spring Initializr 创建项目也可以手动创建 Maven 工程。这里给出pom.xml的核心依赖配置!-- 文件路径pom.xml -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.1/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement说明spring-ai-starter-model-openai的作用是让 Spring AI 连接到任何兼容 OpenAI 协议的接口服务因此它也适用于 DeepSeek、通义千问等国内服务商。Spring AI 版本更新较频繁如果你在引入依赖时遇到版本冲突建议查看 Spring AI 官方 Release Notes。6.2 配置文件在src/main/resources/application.properties中加入spring.application.nameai-demo server.port8080 spring.ai.openai.api-key${DEEPSEEK_API_KEY} spring.ai.openai.base-urlhttps://api.deepseek.com spring.ai.openai.chat.options.modeldeepseek-chat spring.ai.openai.chat.options.temperature0.7这里采用${DEEPSEEK_API_KEY}引用环境变量避免把密钥写在代码仓库里。你需要在运行程序前设置环境变量或者直接用真实 Key 临时替换但不要提交到 Git。如果你的服务商不是 DeepSeek只需把base-url和model改成服务商文档提供的值即可。6.3 编写核心代码首先是启动类// 文件路径src/main/java/com/example/aidemo/AiDemoApplication.java package com.example.aidemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class AiDemoApplication { public static void main(String[] args) { SpringApplication.run(AiDemoApplication.class, args); } }然后是 Controller它负责接收前端请求并调用 AI// 文件路径src/main/java/com/example/aidemo/controller/AiController.java package com.example.aidemo.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ai) public class AiController { private final ChatClient chatClient; public AiController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam(defaultValue 请用一句话介绍Spring AI) String message) { return chatClient.prompt(message) .call() .content(); } }这里的核心是ChatClient。它是 Spring AI 提供的统一客户端入口我们通过ChatClient.Builder构建一个实例然后调用prompt(message)传入用户消息call()执行调用content()取出模型返回的文本。如果你不希望用默认系统提示词也可以在builder构建时设置默认系统消息或者在每个 prompt 中传入 System 参数。项目复杂后还可以把 System 提示词抽到配置文件或数据库中方便业务人员调整。6.4 启动与测试在项目根目录执行mvn spring-boot:run看到Started AiDemoApplication日志后浏览器访问http://localhost:8080/ai/chat?message什么是AI Agent如果一切正常页面会显示模型生成的文本回答。你也可以用 curl 测试curl http://localhost:8080/ai/chat?message什么是RAG返回结果是一段纯文本这正是 Spring AI 默认返回的格式。如果你需要返回 JSON可以进一步开发 DTO 和统一响应体。6.5 预期输出访问接口后你看到的内容大致会是AI Agent 是能够感知环境、做出决策并执行动作的智能体。在大模型时代AI Agent 通常由大模型充当“大脑”通过调用工具来完成具体任务...到这里你已经拥有了一个完整的AI Web接口。接下来可以把前端页面、对话历史、权限控制逐步加进来就能变成一个可用的AI聊天功能。7. 进阶从Demo走向RAG与Agent7.1 一个最小的RAG实现思路直接调用大模型API模型只能回答训练数据里已有的知识。如果用户问了企业内部文档、最新产品手册、私有数据库里的内容模型就会哑火或编造。RAG 的思路可以拆成三步离线准备把文档切分成小块用 Embedding 模型转成向量存入向量数据库在线检索用户提问后把问题转成向量从向量库中找出语义最相似的TopK文档增强生成把检索到的文档拼接到提示词中让模型基于这些材料回答。这里不需要你从零实现向量检索可以使用现成的向量数据库也可以在小规模场景下用文本相似度做简单检索。核心代码思路如下String context searchSimilarDocs(userQuestion); String prompt 请根据下面的资料回答问题。如果资料中没有答案请直接说不知道。\n\n资料\n context \n\n问题 userQuestion; String answer chatClient.prompt(prompt).call().content();这种方案最大的优点是不需要训练模型却能显著提升回答准确率。缺点是工程链路变长文档更新、向量更新、检索质量评估都需要额外做。7.2 Agent的核心能力Agent 比 RAG 更进一步。RAG 只是把资料喂给模型Agent 则允许模型自己决定“接下来做什么”。举个实际例子。传统客服机器人只能按照预设流程回答。Agent 客服机器人可以这样做用户输入“帮我查订单”模型判断需要调用订单查询工具模型生成工具调用参数系统执行查询工具返回订单状态模型根据返回结果组织回答。每一步都由模型推理但你必须在工程层面约束它可以调用哪些工具并给每个工具设计清晰的入参和返回结构。Agent 的能力上限取决于工具质量工具越丰富、返回越规范Agent 能完成的任务就越复杂。7.3 适用场景与实现成本结合上面的分析你可以在项目开始前先判断需求类型需求类型推荐方案理由通用问答、翻译、文本生成直接调用API开发成本最低效果足够私有文档问答、客服知识库RAG引入外部知识减少幻觉多步骤任务、需要操作业务系统Agent可调用工具自主完成任务复杂业务场景RAG Agent 组合既增强知识又能执行动作对于刚开始接触AI的团队不建议一上来就做整套 Agent 系统。先把 API 调用、提示词调优、RAG 检索跑通再逐步增加工具调用这样每一步的效果都可验证风险也更容易控制。8. 常见问题与排查思路AI应用开发和传统开发不一样很多错误提示不如 Spring Boot 报错那么明确。这里整理一份高频问题排查表可以保存在项目 wiki 里备用。问题现象常见原因解决思路调用报401错误API Key错误或没有配置环境变量检查 Key 是否正确确认环境变量能否被读取报404错误base-url 或接口路径不匹配核对服务商文档确认 OpenAI 兼容地址报 invalid model 错误模型名写错或账户没有该模型权限换成服务商提供的模型名检查账户权限请求超时网络问题或模型推理时间过长增加超时时间换轻量模型优化提示词长度回答内容为空模型返回了空 content可能触发了内容审核查看返回完整响应中的 finish_reason上下文过长报错输入超过模型上下文窗口上限精简提示词做历史消息截断或使用长上下文模型回答明显错误模型幻觉或检索知识不充分加上“不知道就回答不知道”的约束优化 RAGJava 编译报错找不到 ChatClientSpring AI 版本过旧或过高检查 BOM 版本参考官方迁移文档调整同一问题每次回答不同temperature 设置较高调低 temperature用确定性参数8.1 API连接与鉴权问题这类问题最多。首先要确认 Key 是你自己的而且账户余额充足。其次检查 base_url 是否写错。很多服务商把“API地址”和“控制台地址”混在一起容易填错。建议先在 Python 脚本里验证 API 连通性。一旦 Python 能通Java 端的配置就是照抄地址和 Key。Java 端如果报 401可以打开 Spring 的日志级别查看实际发送的请求头是否正确。在application.properties中可以临时调整日志级别logging.level.org.springframework.aiDEBUG看到日志中Authorization头和请求 URL 后问题基本就能定位。8.2 Token与上下文问题Token 问题是真实项目中最容易遇到的成本问题。每次多轮对话都会累积历史 Token导致两个结果一是费用变高二是上下文窗口被占满。解决方案有几种只保留最近N轮对话将历史对话摘要后放入上下文用 RAG 替代长文本输入对不同用户设置不同的历史长度。8.3 回答质量与幻觉问题回答质量差最可能的原因是提示词不够具体。直接问“帮我写一段文案”和问“帮我写一段面向Java开发者的AI课程介绍要求突出实战案例300字以内语气亲切”效果完全不同。如果加了 RAG 后回答仍然有误需要检查检索质量。可能文档切分太粗导致语义混合可能是向量模型和问题领域不匹配也可能是TopK取值太小漏掉了关键文档。这部分需要建立评估集拿一批典型问题反复测试才能量化改进。9. AI应用工程化最佳实践9.1 提示词工程规范化提示词是AI应用的灵魂但很多人都是把提示词直接写在代码里维护起来非常痛苦。更推荐的做法是做到提示词和代码分离。Spring AI 中可以通过ChatClient设置默认 System 消息也可以在 Controller 中读取配置ai.prompt.system你是一名严谨的Java技术专家回答问题时优先给出代码示例并说明潜在风险。Value(${ai.prompt.system}) private String systemPrompt;这样产品经理或运营也能参与调优不需要改代码。提示词本身要版本化保存到 Git。比较新旧版本效果时可以用 AI 自动化测试批量生成测试问题用评分脚本输出对比结果。9.2 内容安全与合规审核AI 应用上线后用户会输入各种内容也可能诱导模型输出违规内容。你必须在应用层面对输入和输出都做审核。输入侧要过滤掉可能包含恶意指令的内容输出侧要对接内容安全服务比如文本审核接口检测涉政、色情、暴力、违禁词等。注意这里说的“违禁词过滤”是为了合规不是为了绕过任何机制。另一个重要原则是不要在生产环境使用来路不明的模型或服务避免数据被不可控地使用。涉及用户隐私的数据先做脱敏再交给大模型。9.3 性能、成本与可观测性性能上大模型的响应时间通常在几百毫秒到几秒。如果业务要求高并发低延迟需要考虑使用推理性能更强的模型对相同问题做缓存用流式输出提升首字延迟体验在业务侧做超时控制避免模型异常拖垮接口。成本上Token 就是钱。每个调用都要监控 Token 消耗。建议在网关层统一统计每次请求的输入 Token、输出 Token按用户和应用维度做报表。成本异常时可以及时做限流和预警。可观测性上每次AI调用都应该记录请求内容、响应内容、耗时、Token数、错误信息。这样出了问题才能复盘。9.4 用AI测试AIAI应用测试是近几年很热的话题。传统测试用例大多是固定话术而大模型输出本身具有随机性无法用“断言字符串相等”来做验证。一种可行的思路是构造一个测试集合里面包含多个标准问题然后用规则和模型两种方式共同评价回答质量。比如历史遗留项目里用 AI 生成单元测试代码再让模型审查代码规范这其实就是“用AI测试AI”的落地形式。建议从简单场景开始先让 AI 生成测试输入数据和预期结果然后人工检查再集成到 CI 中。10. 总结与学习路线10.1 本文核心收获回看开头的问题“有人会说这是AI”。这句话在当下更多是一种提示提醒我们AI能力正在被广泛应用。作为技术人员最重要的是理解AI的工作原理掌握把大模型接入系统的能力。本文从生成式AI的基本原理出发解释了 Token、上下文窗口、温度参数、幻觉等关键概念然后通过 Python 和 Spring AI 两个实战案例带你完成了AI应用从0到1的开发再用 RAG 和 Agent 两个进阶方向帮你判断不同业务场景下的技术选型最后给出了工程化落地时常见问题的排查思路。10.2 推荐的学习路径如果你刚刚入门建议按下面顺序推进。第一步熟练调用大模型 API。把你正在做的项目里某个小功能用 API 实现比如周报总结、客服回复、代码注释生成。第二步掌握提示词工程。学习 system 消息的编写、少样本示例的用法、输出格式约束你会发现同一个模型在不同提示词下的表现差异非常大。第三步接入 Spring AI 或 LangChain。用框架把 API 调用封装成服务学会配置切换不同模型服务商。第四步实现一个简单的 RAG 应用。准备一批自己的文档切分、向量化、检索、生成形成闭环。第五步研究 Agent 开发。从工具调用做起设计一个可以查数据库、调接口的AI助手。注意这一步最容易失控一定要从小范围、低风险场景开始。10.3 写在最后技术的价值不在于“是不是AI生成的”而在于“能不能解决真实问题”。你可以用AI生成代码初稿但要自己审查边界可以让AI写文章框架但要自己核对事实也可以让AI辅助测试但最终要把质量责任落实到人。下次再听到“有人会说这是AI”你可以大方地承认“对我用了AI而且我知道它怎么工作知道它的优点和边界。” 这才是这个时代技术人员该有的状态。希望这篇文章能帮你迈出第一步也欢迎在评论区分享你在 AI 应用开发中踩过的坑。