Spring AI的教程

Spring AI的教程 Spring AI 是一个面向人工智能工程的应用框架。 解决了 AI 集成的基本挑战将企业数据和 API 与 AI 模型连接起来。langchain4j vs SpringAI 对比对比维度langchain4jSpringAI生态不依赖 Spring需要单独集成 SpringSpring 官方项目和 Spring 无缝集成诞生出现更早中国团队开发受 LangChain 启发推出稍晚但发展后来居上JDK 版本v0.35.0 之前支持 JDK8之后只支持 JDK17全版本要求 JDK17功能无 mcp‑server官方建议搭配quarkus‑mcp‑server使用早期功能弱于 langchain4j现在功能全面生态活跃开源贡献者多易用性尚可拥有中文文档上手简单API 设计优雅选型结论项目不使用 Spring时选 langchain4jSpring 项目无脑选 SpringAI大模型选型三种方案自研大模型技术栈C、Python、深度学习、机器学习、神经网络、视觉处理人员要求一般需要 985/211 研究生对应 AI 算法岗位成本高门槛高云端大模型API 调用优点不需要占用本地算力模型功能完善成熟计费方式按 token 计费开源大模型本地部署工具Ollama前提需要购买硬件算力自建选型 评估流程a. 选型 b. 自己构建选型 → 评估流程业务确定确定业务领域电商、医疗、教育等样本准备准备数据集、样本、测试题任务定制确定任务类型例如问答可利用多个大模型评估人工评估效果c. 优先选择通用能力表现较好的模型主流国产大模型迭代笔记说明b代表十亿参数671b 6710 亿参数2 月 DeepSeek模型deepseek‑r1671B6710 亿参数硬件算力显存 H20 96G成本约 140 万对比相比 OpenAI GPT‑4成本仅为其 1/403 月 阿里 qwq‑32b参数32B320 亿参数不带深度思考能力显存32G对标可媲美 deepseek‑r1成本仅为其 1/204 月 阿里 qwen3通义千问 3参数235B2350 亿参数支持深度思考能力性能赶超 deepseek‑r1成本比 deepseek‑r1 节省 2‑3 倍推荐选型qwen3‑30b5 月 deepseek‑r1‑0528参数671B6710 亿参数特点兼顾各项综合性能补充概念参数单位B Billion十亿32b320 亿671b6710 亿深度思考模型内部多轮推理解决复杂逻辑、数学问题成本对比后面数字代表成本降低倍数例如节省 40/1 → 成本是对方的 1/40。入门演示前提条件SpringBoot3 JDK17购买DeepSeek的token网址如下DeepSeek依赖project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.sankuai/groupId artifactIdSpringBoot01/artifactId version1.0-SNAPSHOT/version packagingjar/packaging nameSpringBoot01/name !-- Spring Boot 3.4.xSpring AI 1.0.0 官方配套版本 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.4.1/version relativePath/ /parent properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding start-classcom.sankuai.App/start-class java.version17/java.version lombok.version1.18.34/lombok.version log4jdbc.log4j2.version1.16/log4jdbc.log4j2.version rest.assured.version2.3.3/rest.assured.version !-- Spring AI 正式版 -- spring-ai.version1.0.0/spring-ai.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId scopeprovided/scope /dependency !-- Spring AI DeepSeek 官方 starter -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-deepseek/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project配置文件spring: ai: deepseek: api-key: sk-6751d6e5652047e781bd93e9be00f3cd base-url: https://api.deepseek.com chat: options: model: deepseek-chat temperature: 0.7package com.sankuai; import org.junit.jupiter.api.Test; import org.springframework.ai.deepseek.DeepSeekChatModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import reactor.core.publisher.Flux; SpringBootTest public class HelloControllerTest { Autowired private DeepSeekChatModel deepSeekChatModel; Test public void testHello() { String response deepSeekChatModel.call(帮我讲一个笑话); System.out.println(response); } //流最友好 Test public void testHello1() { FluxString response deepSeekChatModel.stream(给我生成一个代码打印6层倒三角); response.toIterable().forEach(System.out::print); } }模型通用配置options 配置‑temperature温度取值范围0‑2 的浮点数数值越高AI 输出更有创造性、更随机、脑洞更大数值越低AI 输出越保守、确定、重复度高更贴合事实Test public void testChatOptions(Autowired DeepSeekChatModel chatModel) { DeepSeekChatOptions options DeepSeekChatOptions.builder() .model(deepseek-chat) //不使用全局配置文件的深度思考 .temperature(1.9d) .build(); ChatResponse res chatModel.call(new Prompt(请写一句诗描述清晨。, options)); System.out.println(res.getResult().getOutput().getText()); }使用提示词只引用可靠来源中的信息不做任何假设或扩展描述。请只基于已知事实回答不要主观臆想或添加额外内容。请简明、客观地给出答案不要进行修饰或补充未经请求的信息。temperature 范围建议业务场景输出风格说明 / 应用举例0.0 ~ 0.2严谨问答、代码补全、数学答题严格、确定、标准法律 / 金融答题、接口返回模板、考试答卷等0.3 ~ 0.6聊天机器人、日常摘要、辅助写作稍有变化、较稳妥公众号摘要、普通对话、邮件生成等0.7 ~ 1.0创作内容、广告文案、标题生成丰富、有创意、灵活诗歌、短文案、趣味对话、产品描述等1.1 ~ 1.5脑洞风格、头脑风暴、灵感碰撞场景大开脑洞、变化极强故事创作、异想天开的推荐语、多样化内容maxTokens 与 stop 参数maxTokens默认低 tokenmaxTokens限制 AI 模型生成的最大 token 数近似理解为字数上限。需要简洁回复、打分、列表、短摘要等建议小值如 10‑50。防止用户的长对话导致无关内容或花费过多 token 费用。如果遇到生成内容经常被截断可以适当配置更大 maxTokens。stop截断你不想输出的内容示例配置spring: ai: deepseek: api‑key: ${DEEP_SEEK_KEY} chat: options: model: deepseek‑chat max‑tokens: 20 stop: - \n # 只想一行 - 。 # 只想一句话 - 政治 # 敏感词 - 最后我总结一下 # 过滤AI惯用模板词减少AI腔让文章更拟人参数说明max‑tokens控制输出最大 token值过小会出现输出截断值过大消耗更多 token。stop停止词列表当模型输出命中列表中任意内容就立刻终止生成。可用于控制输出长度、屏蔽关键词、过滤 AI 套话。Test public void testHello2() { DeepSeekChatOptions options DeepSeekChatOptions.builder() .stop(Arrays.asList()) //有逗号就停止 .build(); try { ChatResponse res deepSeekChatModel.call(new Prompt(请讲一个让女生开心的笑话。, options)); //打印完整原始对象可以看到reasoning_content字段 System.out.println(完整响应: res); // deepseek‑reasoner 的思考内容在底层metadata里面getText拿不到 }catch (Exception e){ e.printStackTrace(); } }深度思考