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();}
实现效果