当前位置: 首页 > news >正文

Spring AI第一课-简单问答

Spring AI 快速入门:集成 DeepSeek 大模型实战笔记

今天上手了 Spring AI 的第一课,用 Spring Boot + DeepSeek API 搭了一个最简单的 AI 聊天应用。把整个过程和知识点整理一下,方便后续回顾。

一、什么是 Spring AI

Spring AI 是 Spring 官方推出的 AI 应用开发框架,核心目标是让 Java 开发者像使用 Spring Data 操作数据库一样,用统一的抽象来调用各种大模型

它的核心特点:

  • 统一 API 抽象:不管是 OpenAI、DeepSeek、智谱还是通义千问,接口调用方式基本一致,切换模型只改配置
  • 自动装配:Spring Boot Starter 机制,引入依赖 + 写配置就能用
  • 高阶能力:支持 RAG、Function Calling、多模态、向量数据库等(入门阶段先从聊天开始)

二、项目配置详解(application.properties)

spring.application.name=SpringAIQuickStart server.port=8080 # Deepseek API 配置 spring.ai.deepseek.base-url=https://api.deepseek.com spring.ai.deepseek.api-key=sk-xxxxxxxxxxxxxxxxxxxx spring.ai.deepseek.chat.options.model=deepseek-chat spring.ai.deepseek.chat.options.temperature=0.8

逐行拆解知识点

配置项作用注意点
spring.ai.deepseek.base-urlDeepSeek API 的基础地址国内模型必须手动指定 base-url,默认是 OpenAI 的地址
spring.ai.deepseek.api-keyAPI 密钥从 DeepSeek 官网控制台获取,生产环境绝对不能硬编码,建议用环境变量或配置中心
chat.options.model指定使用的模型名称DeepSeek 聊天模型一般填deepseek-chat
chat.options.temperature采样温度,范围 0~2值越高回答越随机、越有创造力;值越低越稳定、越严谨。0.8 属于偏创意的平衡值

💡小知识:pom.xml 里需要引入spring-ai-deepseek-spring-boot-starter依赖,Spring Boot 才会自动装配 DeepSeekChatModel 这个 Bean。

三、Controller 层实现(ChatController)

@RestController @RequestMapping("/ai") public class ChatController { @Autowired private DeepSeekChatModel chatModel; @GetMapping("/generate") private String generate(@RequestParam(value="message", defaultValue="你是谁") String message) { String response = chatModel.call(message); return response; } }

核心知识点

1. DeepSeekChatModel 是什么?

这是 Spring AI 自动装配好的聊天模型客户端,本质上封装了 HTTP 请求、鉴权、序列化等底层逻辑。我们只需要注入直接调用就行,不用手写 RestTemplate/WebClient。

2.chatModel.call(message)方法
  • 最简单的同步调用方式,传入一个 String,返回一个 String
  • 内部会自动构建 ChatRequest,调用 DeepSeek 的/chat/completions接口
  • 阻塞式调用:大模型生成需要几秒,这段时间线程会一直等待。生产环境建议用流式(stream)接口提升体验
3. 几个可以优化的点
  • generate方法权限是private,Spring MVC 其实也能识别,但规范上应该写成public
  • 没有异常处理,API 调用失败会直接抛 500
  • 没有对话历史,每次调用都是全新的上下文(多轮对话需要自己维护 message 列表)

四、前端聊天页面

前端是一个纯 HTML + CSS + JS 的单页,通过fetch调用后端/ai/generate接口。

关键实现点

1. 消息渲染机制
function addMessage(role, text) { // 动态创建 DOM 元素,区分 user / ai 两种样式 }

role参数控制气泡方向:用户消息靠右(紫色渐变),AI 消息靠左(白色卡片)。

2. 打字指示器(Typing Indicator)
function addTypingIndicator() { ... } function removeTypingIndicator() { ... }

请求发出后显示三个跳动的小圆点,AI 回复回来后移除——这是聊天应用的标配交互,解决了等待期间的空白焦虑

3. XSS 防护
function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }

AI 返回的内容直接插入 DOM 有 XSS 风险,用textContent转义是最简单的处理方式。

4. 跨域问题

这里前端页面和后端接口是同源部署(都在 8080 端口),所以 fetch 直接写/ai/generate就行。如果前后端分离部署,后端需要配置@CrossOrigin或全局 CORS 配置。

五、完整调用链路梳理

用户输入文字 → 前端 fetch 发送 GET 请求 /ai/generate?message=xxx → ChatController 接收参数 → DeepSeekChatModel.call() 内部封装 HTTP 请求 → 调用 DeepSeek 官方 API (api.deepseek.com) → 大模型生成回答并返回 ← 拿到响应字符串 ← Controller return 字符串 ← 前端收到 response → 渲染 AI 气泡到页面

六、踩坑与注意事项

  1. API Key 泄露风险:代码里硬编码 key 只是练习用,实际项目一定要放到环境变量或 Nacos 等配置中心
  2. 同步调用超时call()是阻塞的,复杂回答可能耗时十几秒,需要调整 Tomcat 超时时间,或者改用 SSE 流式输出
  3. 没有上下文记忆:每次调用都是独立的,AI 不记得上一句说了什么。多轮对话需要把历史消息组装成List<Message>传给chatModel.call()
  4. Temperature 参数调优:做代码生成、事实问答建议调低(0.20.5);做创意写作、头脑风暴可以调高(0.71.0)

七、下一步可以学什么

  • 流式输出(Streaming):用stream()方法实现打字机效果,用户体验直接拉满
  • 多轮对话:用ChatMemory管理对话历史
  • Prompt 模板PromptTemplate统一管理提示词
  • RAG 检索增强:结合向量数据库,让 AI 回答你的私有文档
  • Function Calling:让 AI 调用你写的 Java 方法

总结:Spring AI 把大模型调用的复杂度封装得非常彻底,一个 Starter + 几行配置 + 一个call()方法就能跑通完整的 AI 聊天应用。这节课只是入门,核心价值在于 Spring 生态的统一抽象——后面换模型、加功能,都不用推翻重写。

http://www.jsqmd.com/news/1215093/

相关文章:

  • Altair HyperWorks:一站式多物理场CAE仿真优化赋能工业研发升级
  • FreeClip2苹果用户必更!连接bug终于解决啦✨
  • 两寸照片电子版怎么制作?实用二寸证件照小程序制作流程详解 - 工具软件使用指南
  • 深圳搬家公司哪家靠谱?五家品牌实测测评完整攻略 - 深圳顺风搬迁
  • 河北立体库堆垛机成套制造
  • AI Agent持续优化已进入“亚秒级”时代:2025年必须掌握的4个在线蒸馏与轻量化热更新协议
  • AI新闻日报_2026-07-17
  • PCB布局布线九大黄金法则与实战技巧
  • WarcraftHelper终极指南:3步解决魔兽争霸3 Windows 11兼容性问题
  • 2026郑州青少年减肥训练营靠谱推荐 - 谁都没有我好看
  • Dify+Docker 构建生产级智能体:容器化部署与线上性能调优
  • 胶片冲洗中的puddle式显影技术详解
  • 低代码不是替代开发:2026 最优落地模式:标准化搭建 + 精细化定制
  • 2026必看:深圳室内空气检测,甲醛治理公司怎么选?多方测评优选鸥叶环保 - 环保除醛知识库
  • 成都专业的经营哲学建设平台公司
  • 百元价位的红茶有哪些推荐?实测5款日常喝不踩坑的主流口粮红茶
  • 单片机开发中自定义printf函数的实现与优化
  • ADC噪声分析与抑制:从原理到工程实践
  • 嵌入式系统中USB接口设计与开发全解析
  • 小红书稳定流量运营实操心得,告别流量起伏波动
  • 2026 年当下,合阳诚信的庭院设计工作室推荐,别再浪费空间!这个小院如何实现高价值变现? - 实业推荐官【官方】
  • USB与TTL电平标准详解及转换实践
  • 开关频率在电源设计中的关键影响与优化策略
  • 深度解析Wand-Enhancer:重新定义游戏修改器的本地化增强体验
  • 成都 2026 名表回收行情更新,腕表首饰当场估价结算 - 逸程奢侈品回收中心
  • EMMI技术在半导体失效分析中的原理与应用
  • LOGITacker硬件配置全解:Nordic、MakerDiary、April Brother加密狗对比
  • 运算放大器增益带宽积(GBP)详解与应用指南
  • 433MHz遥控器技术:调制原理与硬件实现详解
  • 呼叫系统集成实战:PCSwitch如何把“外挂”变成“原生”?