簡介 :: Spring AI 中文文檔
Spring AI 解決了 AI 集成的根本難題:將企業數據和 API 與 AI 模型連接起來。
聊天客戶端 API (ChatClient )
發起對模型的調用和響應
- 創建:其中可以通過bean來注入創建好的chatClient
可以使用@Qualifier注解,使用多模型,創建多chatClient - ChatClient 響應
-
- 多種格式,包括flux
- 提示模板
TemplateRenderer 作為模板引擎 - call返回值: 返回相應對象或字符串
- stream返回值:多種flux對象
- advisor
-
- Advisor API 為 Spring 應用中的 AI 驅動交互提供靈活強大的攔截、修改和增強能力。
interface AdvisorSpec {AdvisorSpec param(String k, Object v);AdvisorSpec params(Map<String, Object> p);AdvisorSpec advisors(Advisor... advisors);AdvisorSpec advisors(List<Advisor> advisors);
}
ChatClient.builder(chatModel).build().prompt().advisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),QuestionAnswerAdvisor.builder(vectorStore).build()).user(userText).call().content();
- 聊天記憶:
ChatMemory 接口定義了聊天對話存儲機制,當前內置實現MessageWindowChatMemory, 包括jdbc在內的多種存儲方案
Advisor API
執行流程
?
- 實現示例,定義一個LoggerAdvisor
public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {@Overridepublic AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);logger.debug("AFTER: {}", advisedResponse);return advisedResponse;}@Overridepublic Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {logger.debug("BEFORE: {}", advisedRequest);Flux<AdvisedResponse> advisedResponses = chain.nextAroundStream(advisedRequest);return new MessageAggregator().aggregateAdvisedResponse(advisedResponses,advisedResponse -> logger.debug("AFTER: {}", advisedResponse)); }
}
Prompt
- 主要角色
System 角色:指導 AI 的行為和響應風格,設定 AI 解釋和回復輸入的參數或規則,類似于在開始對話前向 AI 提供指令。
User 角色:代表用戶的輸入 — 包括問題、命令或對 AI 的陳述。該角色構成 AI 響應的基礎,具有根本重要性。
Assistant 角色:AI 對用戶輸入的響應,不僅是答案或反應,更對維持對話流至關重要。通過追蹤 AI 之前的響應(其 "Assistant Role" 消息),系統確保連貫且上下文相關的交互。助手消息也可能包含函數工具調用請求信息 — 這是 AI 的特殊功能,在需要時執行計算、獲取數據等超越對話的特定任務。
Tool/Function 角色:專注于響應工具調用類助手消息,返回附加信息。
PromptTemplate
PromptTemplate promptTemplate = PromptTemplate.builder().renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()).template("""Tell me the names of 5 movies whose soundtrack was composed by <composer>.""").build();String prompt = promptTemplate.render(Map.of("composer", "John Williams"));
PromptTemplate promptTemplate = new PromptTemplate("Tell me a {adjective} joke about {topic}");
Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));
return chatModel.call(prompt).getResult();
TOOlS
- 示例
class DateTimeTools {@Tool(description = "Get the current date and time in the user's timezone")String getCurrentDateTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}@Tool(description = "Set a user alarm for the given time, provided in ISO-8601 format")void setAlarm(String time) {LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("Alarm set for " + alarmTime);}}ChatModel chatModel = ...
String response = ChatClient.create(chatModel).prompt("Can you set an alarm 10 minutes from now?").tools(new DateTimeTools()).call().content();System.out.println(response);
- 創建tools的兩種方式, tools注解,和通過MethodToolCallback的編程式配置
MCP
- mcp client
- mcp server