Spring AI的内容太多太多。Chat是其中的一部分,也是其中非常重要、非常基础的一部分,所以适合用来入门。
Chat API主要涉及几个概念:
- Client:代表各模型的客户端,负责请求和响应。
- Prompt:请求的最外层封装,包含Message和Option。
- Message:发送到大模型的内容,另外还包含了一些属性以及消息类型等。
- Option:相当于参数、控制项,比如本次对话的temperature(值越小大模型回答越严谨,值越大大模型回答越有创造性)。
- Response:响应对象,封装了大模型返回的信息,主要是Generation。
- Generation:具体的返回内容。
Chat简单示例
-
项目依赖
<dependencies> <!-- SpringBootStarterWeb依赖包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.4.5</version> </dependency> <!-- JavaxServlet依赖包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- SpringAI依赖包 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-spring-boot-autoconfigure</artifactId> <version>1.0.0-M6</version> </dependency> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0-M6.1</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> </dependencies> -
项目配置
- 修改配置文件,主要用于设置API密钥、模型选择等参数。
- 由于封禁的原因,国内无法获取很多模型的api-key,示例选的国内厂商阿里的大模型服务平台百炼上的模型。
spring: profiles: active: dev application: name: ai-demo-app main: allow-bean-definition-overriding: true ai: dashscope: api-key: sk-1d888882468a0e12b01b012f1a234f28 chat: enabled: true options: model: qwen-max mcp: client: enabled: true timeout: 60000 server: port: 10101 -
项目代码
- 一个请求是同步阻塞调用,返回完整的字符串响应。
- 一个请求Flux表示使用响应式流式处理,针对大模型的响应进行流式输出,响应的内容并非一次性展现,而是一段一段的内容,持续不断的展现出来,这就是流式响应的效果。
@RestController("aiDemoChat") @RequestMapping("ai/demo/chat") public class AiDemoChatRest { private ChatClient chatClient; public AiDemoChatRest(ChatClient.Builder builder, ToolCallbackProvider toolCallbackProvider) { this.chatClient = builder .defaultSystem("后续操作") .defaultAdvisors(new PromptChatMemoryAdvisor(new InMemoryChatMemory())) .defaultTools(toolCallbackProvider.getToolCallbacks()) .build(); } @GetMapping("001") public String chat001(@RequestParam(name = "message", defaultValue = "tell a joke") String message) { return this.chatClient.prompt().user(message).call().content(); } @GetMapping("002") public Flux<String> chat002(@RequestParam(name = "message", defaultValue = "tell a joke") String message) { Flux<String> content = this.chatClient.prompt().user(message) .system(promptSystemSpec -> promptSystemSpec.param("date", new Date())) .advisors(advisorSpec -> advisorSpec.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) .stream().content(); return content.concatWith(Flux.just("[finish]")); } } -
至此Caht简单示例已基本完成,启动项目,之后就可以通过请求链接跟大模型进行交互。

2771

被折叠的 条评论
为什么被折叠?



