☰
二、SpringAI+DeepSeek-模型(Model)
2026/9/24 23:50:24 网站建设 项目流程

一、ChatModel 聊天模型(核心)

1. 公共能力

能力说明
多模态文本/图片/PDF/音频/视频输入,不同模型支持不一样
Tools/Function Call函数调用,让LLM调用Java本地方法,查询外部接口、数据库
流式处理Flux<ChatResponse>,SSE流式输出,打字机效果
重试spring.ai.retry.*全局重试配置,指数退避
可观测性链路追踪、指标、日志
内置JSON输出两种模式:简单JSON / JSON Schema强约束结构化输出
本地部署Ollama 可本地跑模型;DeepSeek/OpenAI是云端API
OpenAI兼容APIOllama、DeepSeek、vLLM都兼容OpenAI协议,可以直接复用OpenAI客户端

通用重试配置(所有模型共享)

spring: ai: retry: max-attempts: 10 backoff: initial-interval: 2s multiplier: 5 max-interval: 3m on-client-errors: false # 4xx默认不重试

2. DeepSeek 模型(云端API)

依赖 starter(自动配置)

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-deepseek</artifactId> </dependency>

application.yml

spring: ai: deepseek: api-key: ${DEEPSEEK_API_KEY} # 环境变量注入,不要硬编码 base-url: [https://api.deepseek.com](https://api.deepseek.com) chat: options: model: deepseek-chat # deepseek-reasoner为推理模型 temperature: 0.8 maxTokens: 2000
关键特性
  1. 双模型
    • deepseek-chat:通用对话
    • deepseek-reasoner:推理模型,返回独立思维链CoT(reasoningContent)>

    多轮对话注意:不要把上一轮的reasoningContent塞回消息列表,否则报400,只保留最终回答文本进入上下文

  2. 前缀补全:DeepSeekAssistantMessage.prefixAssistantMessage("\``python\n")`,强制模型输出指定代码块
  3. 获取推理内容示例
ChatResponse response = chatModel.call(new Prompt("9.11 and 9.8 which bigger?", DeepSeekChatOptions.builder().model(DeepSeekApi.ChatModel.DEEPSEEK_REASONER.getValue()).build() )); DeepSeekAssistantMessage msg = (DeepSeekAssistantMessage) response.getResult().getOutput(); String reasoning = msg.getReasoningContent(); // 思考过程 String answer = msg.getText(); // 最终答案
手动创建客户端(不使用自动配置)
DeepSeekApi deepSeekApi = DeepSeekApi.builder().apiKey(apiKey).build(); DeepSeekChatOptions options = DeepSeekChatOptions.builder().model("deepseek-chat").temperature(0.4).build(); DeepSeekChatModel chatModel = DeepSeekChatModel.builder().deepSeekApi(deepSeekApi).defaultOptions(options).build();

3. Ollama(本地部署模型,重点)

依赖starter

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>

application.yml

spring:ai:ollama:base-url:[http://localhost:11434](http://localhost:11434)init:pull-model-strategy:when_missing# 可选 always / never / when_missing,生产建议never,提前ollama pullchat:options:model:llama3.2temperature:0.7num-ctx:2048# 上下文窗口keep-alive:5m# 模型驻留内存时长

启动拉取模型:ollama pull llama3.2;支持HuggingFace GGUF模型ollama pull hf.co/xxx

核心能力
  1. 思考模式 Thinking Mode(deepseek-r1/qwen3)
OllamaChatOptions.builder().model("deepseek-r1").enableThinking()// 开启思考.build();// 获取思考内容:存在metadata "thinking"Stringthinking=response.getResult().getMetadata().get("thinking");

若用OpenAI兼容端点对接ollama,思考字段名称变成reasoningContent

  1. 结构化输出两种模式
    • .format("json"):任意合法JSON,结构不可控
    • .outputSchema(jsonSchemaString):强约束,生产推荐,强制输出匹配JSON Schema
    • 搭配BeanOutputConverter,直接把返回JSON转Java Record对象
  2. 多模态:llava系列模型,支持传入图片Media
varimageResource=newClassPathResource("test.png");UserMessageuserMessage=newUserMessage("描述图片",newMedia(MimeTypeUtils.IMAGE_PNG,imageResource));
  1. OpenAI兼容模式:直接使用OpenAiChatModel对接ollama服务

4. OpenAI ChatModel(gpt系列,兼容通用OpenAI协议)

依赖starter

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency>

application.yml

spring:ai:openai:api-key:${OPENAI_API_KEY}base-url:[https://api.openai.com](https://api.openai.com)chat:options:model:gpt-4o-mini temperature:0.7

区分推理模型参数:

  • 普通模型(gpt4o/gpt3.5):maxTokens
  • o1/o3推理系列:maxCompletionTokens,两者互斥不能同时设置
重点
  1. 多模态:gpt4o支持图片、音频输入
  2. responseFormat支持JSON_OBJECT/JSON_SCHEMA强结构化输出
  3. extraBody:向OpenAI兼容服务(vLLM/Ollama/DeepSeek)传递模型特有参数(top_k、repeat_penalty)
  4. 推理内容:官方OpenAI gpt o系列接口不返回reasoningContent;DeepSeek R1/vLLM兼容接口才返回reasoningContent

5. ChatController 通用示例(三个模型写法几乎一样)

@RestControllerpublicclassChatController{privatefinalChatModelchatModel;@AutowiredpublicChatController(ChatModelchatModel){this.chatModel=chatModel;}// 同步返回@GetMapping("/ai/generate")publicMap<String,String>generate(@RequestParam(defaultValue="讲个笑话")Stringmessage){returnMap.of("generation",chatModel.call(message));}// 流式SSE@GetMapping("/ai/generateStream")publicFlux<ChatResponse>stream(@RequestParam(defaultValue="讲个笑话")Stringmessage){Promptprompt=newPrompt(newUserMessage(message));returnchatModel.stream(prompt);}}

二、ImageModel 图像生成模型(DALL·E)

顶层接口:ImageModel,入参ImagePrompt,返回ImageResponse

@FunctionalInterfacepublicinterfaceImageModelextendsModel<ImagePrompt,ImageResponse>{ImageResponsecall(ImagePromptrequest);}
  • ImagePrompt:包装多条ImageMessage+ ImageOptions
  • ImageMessage:文本提示词 + 权重weight
  • ImageResponse:ImageGeneration列表,包含图片二进制/url

OpenAI DALL·E 配置

spring:ai:openai:api-key:${OPENAI_API_KEY}image:options:model:dall-e-3size:1024x1024 quality:hd response-format:b64_json # url/b64_json

代码示例

ImageResponseresponse=openaiImageModel.call(newImagePrompt("一只浅金色小狗",OpenAiImageOptions.builder().quality("hd").N(1).height(1024).width(1024).build()));ImageGenerationgen=response.getResult();byte[]imageBytes=gen.getOutput().getImageBytes();

三、ModerationModel 内容审核模型

OpenAI Moderation,检测文本是否包含违规内容(暴力、色情、自残、仇恨言论)

ModerationPromptprompt=newModerationPrompt("待审核文本");ModerationResponseresponse=openAiModerationModel.call(prompt);Moderationresult=response.getResult().getOutput();booleanflagged=result.isFlagged();// 是否标记违规Categoriescategories=result.getCategories();// categories.isSexual() / isViolence() / isSelfHarm() 等

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询