jdk21 spring-ai源码

jdk21 spring-ai源码package com lili service import lombok RequiredArgs import lombok extern slf4j Slf4j import org springframew ai chat client ChatClient import org springframew ai chat messages

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。

package com.lili.service;

import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.api.OllamaChatOptions; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux;

import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;

@Slf4j @Service @RequiredArgsConstructor public class OllamaChatService {

private final OllamaChatModel chatModel; private final ChatClient chatClient; // 用于存储会话历史(生产环境建议用 Redis) private final Map 
  
    
    
      >> sessionHistory = new ConcurrentHashMap<>(); / * 简单对话 */ public String chat(String message) { log.info("用户输入: {}", message); String response = chatClient.prompt() .user(message) .call() .content(); log.info("AI回复: {}", response); return response; } / * 带系统提示词的对话 - 设置 AI 角色 */ public String chatWithSystemPrompt(String userMessage, String systemPrompt) { log.info("系统提示: {}", systemPrompt); log.info("用户输入: {}", userMessage); Prompt prompt = new Prompt( List.of( new SystemMessage(systemPrompt), new UserMessage(userMessage) ) ); ChatResponse response = chatModel.call(prompt); return response.getResult().getOutput().getText(); } / * 带个性化参数的对话(运行时动态调整温度等) */ public String chatWithOptions(String message, Double temperature, Integer maxTokens) { log.info("自定义参数 - temperature: {}, maxTokens: {}", temperature, maxTokens); // 运行时覆盖默认配置 OllamaChatOptions options = OllamaChatOptions.builder() .temperature(temperature != null ? temperature : 0.7) .numPredict(maxTokens != null ? maxTokens : 500) .build(); Prompt prompt = new Prompt(message, options); ChatResponse response = chatModel.call(prompt); return response.getResult().getOutput().getText(); } / * 流式响应 - 实时输出 AI 回复(打字机效果) */ public Flux 
     
       streamChat(String message) { log.info("开始流式响应: {}", message); return chatClient.prompt() .user(message) .stream() .content() .doOnNext(chunk -> log.debug("收到块: {}", chunk)) .doOnComplete(() -> log.info("流式响应完成")); } / * 带记忆的多轮对话(保留上下文) */ public String chatWithMemory(String sessionId, String message) else if ("assistant".equals(role)) { promptBuilder.append("AI: ").append(content).append(" 
      
    

");

 } } promptBuilder.append("AI: "); // 调用模型 String response = chatClient.prompt() .user(promptBuilder.toString()) .call() .content(); // 保存 AI 回复到历史 history.add(Map.of("role", "assistant", "content", response)); // 限制历史长度(保留最近 20 轮) if (history.size() > 40) { history.subList(0, history.size() - 40).clear(); } log.info("会话 {} - AI回复: {}", sessionId, response); return response; } / * 结构化输出 - 让 AI 返回 JSON 格式 */ public String chatWithStructuredOutput(String message) / * 多模态识别(如果使用支持多模态的模型如 llava) */ // 注意:多模态需要模型支持,如 ollama pull llava // 详细实现可参考 Spring AI 官方文档 [citation:5][citation:6] 

}

小讯
上一篇 2026-04-18 15:34
下一篇 2026-04-18 15:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/270001.html