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

SPRING AI 入门

1.创建一个模块

2.yml 文件配置

server:port: 8899
spring:application:name: spring_aiai:openai:api-key: sk-a2780a577b7e4c25b296f284d5c7099abase-url: https://api.deepseek.comchat:options:model: deepseek-chattemperature: 0.7

3.pom 文件设置 可按需修改

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>cloud-demo</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../../pom.xml</relativePath></parent><groupId>org.example</groupId><artifactId>spring_ai</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-ai.version>1.0.0-M5</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>
<!--        <dependency>-->
<!--            <groupId>springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-test</artifactId>-->
<!--            <scope>test</scope>-->
<!--        </dependency>--></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

4.创建启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringAIApplication {public static void main(String[] args) {SpringApplication.run(SpringAIApplication.class,args);}
}

5.Controller层测试

@RestController
public class AIController {@Autowiredprivate OpenAiChatModel chatModel;@GetMapping("/ai/generate")public String generate(@RequestParam(value = "message")String message){String call = this.chatModel.call(message);return call;}
}

6.简单聊天交互

@RestController
public class ChatClientController {private  final ChatClient chatClient;private ChatClientController(ChatClient.Builder chatClientBuilder){this.chatClient = chatClientBuilder.build();}@GetMapping("/chat")public String chat(@RequestParam(value = "massage") String message){return this.chatClient.prompt().user(message).call().content();}
}

 ChatClient  Config注入方式的实现

@Configuration
public class AiConfig {@Beanpublic ChatClient chatClient(ChatClient.Builder builder){return builder.build();}
}

7.实现角色预设

@Configuration
public class AiConfig {@Beanpublic ChatClient chatClient(ChatClient.Builder builder){return builder.defaultSystem("你是java开发程序员,你精通java").build();}
}

流式返回 逐个返回 增加体检感

// 流式返回@GetMapping(value = "/chat/stream",produces = "text/html;charset=UTF-8")public Flux<String> chatStream(@RequestParam(value = "massage") String message){return this.chatClient.prompt().user(message).stream().content();}

chatModel 的使用

 @Autowiredprivate ChatModel chatModel;@GetMapping(value = "/chatModel")public String chatModel (@RequestParam(value = "massage")String massage){String call = chatModel.call(massage);return call;}@GetMapping(value = "/chatModel02")public String chatModel02 (@RequestParam(value = "massage")String massage){ChatResponse chatResponse = chatModel.call(new Prompt(massage, OpenAiChatOptions.builder().model("deepseek-chat").temperature(0.8).build()));String content = chatResponse.getResult().getOutput().getContent();return content ;}

chatModel提示词使用

  @Autowiredprivate ChatModel chatModel;/***  chatModel 提示词相关的操作* @param name  用户名* @param voice  习惯* @return*/@GetMapping("/prompt")public String prompt (@RequestParam(value = "name")String name,@RequestParam(value = "voice")String voice){// 设置用户输入信息String userText = """ 给我推荐至少三种河南美食""";UserMessage userMessage = new UserMessage(userText);// 设置系统提示词String systemText = """你是一个美食咨询助手,可以帮助人们查询美食信息。你的名字是{name},你应该用你的名字和{voice}的饮食习惯回复用户的请求。""";SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);// 替换占位符Message message = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));// 使用 prompt Template 设置信息Prompt prompt = new Prompt(List.of(userMessage, message));// 调用chatModel方法List<Generation> results = chatModel.call(prompt).getResults();// 返回结果是多个 使用流处理String collect = results.stream().map(map -> map.getOutput().getContent()).collect(Collectors.joining(""));return collect;}

chatModel函数调用

config 文件中创建函数方法

// 创建函数import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;import java.util.function.Function;@Configuration
public class CalculatorService {public record  AddOperation(int a,int b){}public record MulOperation(int m,int n){}// 注册方法@Bean@Description("加法")public Function<AddOperation,Integer> addOperation(){return request->{return  request.a + request.b;};}@Bean@Description("乘法")public Function<MulOperation,Integer> mulOperation(){return request->{return  request.m * request.n;};}
}

controller层调用

 @Autowiredprivate ChatModel chatModel;@GetMapping("/function")public String function01(@RequestParam(value="message")String message) {return ChatClient.builder(chatModel).build().prompt().system("""您是算术计算器的代理。您能够支持加法运算,乘法运算的操作,其余功能将在后续版本中添加,如果用户问的问题不支持请告知详情,再提供加法运算,乘法运算操作前,您必须从用户处获得如下信息:两个数字,运算类型,请调用自定义函数执行加法运算,乘法运算。请回答中文""").user(message).functions("addOperation","mulOperation").call().content();}

实现效果

http://www.xdnf.cn/news/13995.html

相关文章:

  • 前端八股文 - JavaScript 篇
  • UE接口通信常见问题
  • Ubuntu下搭建Black Magic Probe (BMP) 编译环境
  • AbMole| 2-Deoxy-D-glucose(M5140;2-脱氧-D-葡萄糖)
  • 第七章接入技术
  • opencv opencv_contrib vs2020 源码安装
  • 简述Python里面search和match的区别
  • ZooKeeper详解以及应用部署(AI)
  • Spring Cache 详细介绍——补充
  • 深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
  • JavaScript 原型(Prototype)详解
  • 金属切削机床制造企业如何破局?探索项目管理数字化转型
  • 学习STC51单片机35(芯片为STC89C52RCRC)智能小车3(PWM调速小车)
  • C++学习之虚析构函数
  • 【QT】QVariant 转换为自定义的枚举类型
  • 当机械工程师的餐桌变身实验室:立创电赛的真实创新启示录
  • 《深度优先搜索》题集
  • 结构型模式 (7种)
  • 鸿蒙期末总结
  • 高铁列车能否考虑加装飞翼?
  • 深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载
  • C# TAP异步编程(Task/async/await)总结
  • VRFF: Video Registration and Fusion Framework
  • 机器学习与深度学习20-数学优化
  • 2025.06.12【3D曲线图】|用Python绘制DNA甲基化3D曲线图(以CpG位点为例)
  • 局域网内 100 台设备同屏直播技术方案
  • 【总天数两种算法相互印证正确】2022-4-13
  • flowable查询历史流程实例时条件变量的类型问题
  • 实战解析:如何用克魔(KeyMob)等工具构建iOS应用稳定性与数据可观测体系
  • 【web应用】若依框架:若依框架中的面包屑导航与顶部导航栏:设计与实现