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: devapplication:name: ai-demo-appmain:allow-bean-definition-overriding: trueai:dashscope:api-key: sk-1d888882468a0e12b01b012f1a234f28chat:enabled: trueoptions:model: qwen-maxmcp:client:enabled: truetimeout: 60000server: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簡單示例已基本完成,啟動項目,之后就可以通過請求鏈接跟大模型進行交互。