SpringAI使用總結
- 基本使用
- ChatModel和ChatClient
- 簡單對話
- 流式輸出
- 預設角色
- prompt(提示詞)
- function call(工具調用)
- 參考
基本使用
ChatModel和ChatClient
SpringAi支持非常多的模型,為了統一處理,SpringAi聲明了ChatModel接口,各個模型的starter中有ChatModel對應的實現。
當我們引入ollama的依賴后
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>
可以在程序中搜索到OllamaChatModel
ChatClient是獲取與模型進行對話獲取響應的入口,需要給ChatClient提供ChatModel,ChatClient也是一個接口,不過SpringAi提供了默認的實現。
簡單對話
這里調用的是本地的ollama中的模型,需要提前下載對應的模型。當然也可以通過api key調用遠程的模型服務。
1、引入ollama starter依賴
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>
2、配置
spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:14b
3、創建ChatClient
@Configuration
public class MyAiConfig {@Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).build();}}
4、對話controller編寫
@RestController
@RequestMapping("/ai-chat")
public class ChatController {@Autowiredprivate ChatClient chatClient;@GetMapping("/chat1")public String chat(@RequestParam String message) {return chatClient.prompt(message).call().content();}
}
5、測試結果,可以看到模型輸出了響應。
流式輸出
由于大模型生成響應可能比較慢,為了提高用戶體驗,所以出現了流式輸出,即不等待大模型回答完成后,把輸出一次性傳輸到客戶端,而是將輸出不斷地傳輸到客戶端。
@GetMapping("/chat2")public Flux<String> chat1(@RequestParam String message) {return chatClient.prompt().user(message).stream().content();}
預設角色
在創建ChatClient的時候,可以給模型設置角色,這樣模型會按照設置的角色來回答問題。
通過defaultSystem方法預設角色。
@Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).defaultSystem("你是一名醫生,擅長診斷病情并提供對應的治療方案").build();}
prompt(提示詞)
SpringAi中主要有以下幾類提示詞模板:
- PromptTemplate:通用的提示詞模板類,用于構建包含占位符的提示語句;適用于需要動態替換變量的任意提示內容;
- AssistantPromptTemplate:專門用于生成模型助手角色的提示詞模板,當需要定義 AI 助手的行為或初始指令時使用;
- FunctionPromptTemplate:用于生成與函數調用相關的提示詞模板;當需要模型根據特定函數描述進行推理或調用時使用;
- SystemPromptTemplate:用于生成系統級別的提示詞模板,通常用于設置模型的整體行為;用于生成系統級別的提示詞模板,通常用于設置模型的整體行為;
示例
通過@Value注解加載提示詞模板
@Value("classpath:/my-prompt-template.st")private Resource systemResource;@GetMapping("/chat4")public String chat4(@RequestParam String message) {SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);Prompt prompt = systemPromptTemplate.create();return chatClient.prompt(prompt).user(message).call().content();}
提示詞模板內容
你是我的好朋友,請用東北話回答問題,回答問題的時候適當添加表情符號。
今天是 {{current_date}}。
輸出:
function call(工具調用)
使用@Tool注解定義工具
public class DateTimeUtil {/*** @Tool注解:* 1、name:工具的名稱。如果未提供,則將使用方法名稱。AI 模型在調用工具時使用此名稱來識別工具。因此,不允許在同一個類中有兩個同名的工具* 2、returnDirect:工具結果是應直接返回給客戶端還是傳遞回模型* 3、description:工具的描述,模型可以使用它來了解何時以及如何調用工具* @return*/@Tool(name = "",description = "Get the current date and time in the user's timezone")public String getCurrentTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}/*** @ToolParam注解:* 1、required:參數是必需的還是可選的。默認情況下,所有參數都被視為必需參數* 2、description:description:參數的描述,模型可以使用該描述來更好地了解如何使用它* @param time*/@Tool(name = "setAlarm", description = "Set a user alarm for the given time")void setAlarm(@ToolParam(description = "Time in ISO-8601 format") String time) {LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("Alarm set for " + alarmTime);}}
通過tools方法添加工具,模型會自動調用工具
chatClient.prompt().tools(new DateTimeUtil()).user(message).call().content();
由于我使用的是本地的deepseek-r1不支持tool,報錯了,這里就不放測試結果了。
[400] Bad Request - {"error":"registry.ollama.ai/library/deepseek-r1:14b does not support tools"}
參考
- Spring文檔
- Spring Ai視頻教程