一文帶你搞懂Spring?AI核心接口,輕松對接所有大模型
一、Spring AI 核心設(shè)計理念是什么?
簡單說,它就是 Spring 官方為 Java 開發(fā)者打造的 AI 應(yīng)用開發(fā)框架。
它借鑒了 LangChain 等 Python 項目的設(shè)計思路,但更強調(diào) Spring 生態(tài)的核心哲學(xué):可移植性、模塊化設(shè)計、約定優(yōu)于配置。
不同 AI 廠商的 API 千差萬別,切換模型往往意味著重寫大片調(diào)用代碼。Spring AI 的解法是:定義一套統(tǒng)一的抽象接口,讓不同廠商去實現(xiàn)它。業(yè)務(wù)代碼只依賴抽象層,底層模型切換時,代碼零改動。
本文目標:從頂層 ChatClient 到底層 Model,逐層拆解 Spring AI 的核心接口設(shè)計,幫你徹底理清這套"萬能轉(zhuǎn)接頭"的工作原理。
二、最底層:Generic Model API(通用模型 API)
這是整個 Spring AI 的基石,定義了與 AI 模型交互的最基本規(guī)范。
1. Model 接口
public interface Model<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> {
TRes call(TReq request);
}
這是所有模型接口的頂級父接口。無論是聊天、文生圖還是嵌入模型,都繼承自它。
2. StreamingModel 接口
public interface StreamingModel<TReq extends ModelRequest<?>, TResChunk extends ModelResponse<?>> {
Flux<TResChunk> stream(TReq request);
}
提供流式響應(yīng)能力,返回 Reactor 的 Flux,支持打字機效果。
3. ModelRequest 接口
封裝請求參數(shù),包含指令(Instructions)和模型選項(ModelOptions)兩部分。
4. ModelResponse 接口
封裝響應(yīng)結(jié)果,包含主要輸出、結(jié)果列表和響應(yīng)元數(shù)據(jù)(如 token 使用量)。
三、核心業(yè)務(wù)接口
1. ChatModel —— 聊天模型接口
這是最常用的接口,負責(zé)與 LLM 進行對話交互。
public interface ChatModel extends Model<Prompt, ChatResponse> {
default String call(String message) {
// 簡化調(diào)用,實際返回完整響應(yīng)
}
ChatResponse call(Prompt prompt);
Flux<ChatResponse> stream(Prompt prompt);
}
大白話解釋:ChatModel 就是一個"智能對話機器人",你給它發(fā)消息,它回復(fù)你答案。
使用示例:
@Resource
private ChatModel chatModel;
public String chat(String msg) {
return chatModel.call(msg);
}
自動配置原理:不同的 AI 廠商各自提供 Starter 依賴和自動配置類來實現(xiàn)這個接口:
| Starter 依賴 | 自動配置類 | 所需配置項 |
|---|---|---|
spring-ai-alibaba-starter-dashscope | DashScopeChatAutoConfiguration | spring.ai.dashscope.api-key |
spring-ai-starter-model-openai | OpenAiChatAutoConfiguration | spring.ai.openai.api-key |
切換模型只需改依賴和配置,業(yè)務(wù)代碼零改動。
2. EmbeddingClient —— 嵌入模型接口
將文本轉(zhuǎn)換為向量,是 RAG(檢索增強生成)的基礎(chǔ)。
public interface EmbeddingClient extends Model<EmbeddingRequest, EmbeddingResponse> {
List<Double> embed(String text);
EmbeddingResponse embedForResponse(List<String> texts);
}
典型應(yīng)用:將用戶問題和知識庫文檔都轉(zhuǎn)換成向量,通過相似度檢索相關(guān)內(nèi)容。
3. ImageModel —— 圖像生成接口
用于文本生成圖片。
public interface ImageModel extends Model<ImageGenerationRequest, ImageGenerationResponse> {
ImageGenerationResponse call(ImageGenerationRequest request);
}
4. AudioModel —— 音頻處理接口
支持語音轉(zhuǎn)文字(STT)和文字轉(zhuǎn)語音(TTS)。
public interface SpeechModel extends Model<SpeechPrompt, SpeechResponse> {
SpeechResponse call(SpeechPrompt request);
}
public interface TranscriptionModel extends Model<TranscriptionPrompt, TranscriptionResponse> {
TranscriptionResponse call(TranscriptionPrompt request);
}
四、數(shù)據(jù)層接口
1. VectorStore —— 向量數(shù)據(jù)庫接口
這是做 RAG 的核心接口,抽象了所有向量數(shù)據(jù)庫的操作。
public interface VectorStore {
void add(List<Document> documents);
List<Document> similaritySearch(SearchRequest request);
}
支持的主流向量數(shù)據(jù)庫包括:PGVector、Milvus、Chroma、Pinecone、Qdrant、Redis、Elasticsearch 等。
2. Document —— 文檔抽象
表示一個待處理的文檔,包含內(nèi)容和元數(shù)據(jù)。
public class Document {
private String id;
private String content;
private Map<String, Object> metadata;
// getters/setters
}
配合 ETL 框架,可以從 PDF、Markdown、HTML 等格式讀取文檔。
五、高級 API 接口
1. ChatClient —— 流式 API(強推)
這是構(gòu)建在 ChatModel 之上的高級 API,提供鏈式調(diào)用,用起來非常舒服。
String response = chatClient.prompt()
.system("你是一個專業(yè)的Java助手")
.user("介紹一下Spring AI")
.call()
.content();
對比理解:
ChatModel= 功能手機(能打電話就行)ChatClient= 智能手機(自帶通訊錄、應(yīng)用商店、相機)
2. CallAdvisor —— 顧問接口
攔截和增強 AI 交互,封裝常見模式。
public interface CallAdvisor {
ChatClientResponse adviseCall(ChatClientRequest request, CallAdvisorChain chain);
int getOrder(); // 控制執(zhí)行順序
}
內(nèi)置顧問類型:
- 對話記憶顧問:自動維護多輪對話上下文
- RAG 顧問:自動檢索相關(guān)知識庫
- 日志顧問:記錄請求/響應(yīng)日志
3. 函數(shù)調(diào)用接口(Function Calling)
允許 AI 模型主動調(diào)用你注冊的工具函數(shù)。
@Bean
public ToolCallback weatherTool() {
return FunctionToolCallback.builder("getWeather", (Request request) -> {
return "15.0°C"; // 返回天氣信息
})
.description("獲取指定地點的天氣")
.inputType(Request.class)
.build();
}
這讓模型不光能"說",還能真正"做"事情——查數(shù)據(jù)庫、調(diào) API、執(zhí)行業(yè)務(wù)邏輯。
4. ETL 相關(guān)接口
DocumentReader:從各種源讀取文檔
public interface DocumentReader {
List<Document> read();
}
DocumentTransformer:文檔轉(zhuǎn)換和分塊
public interface DocumentTransformer {
List<Document> transform(List<Document> documents);
}
DocumentWriter:將處理后的文檔寫入向量存儲
public interface DocumentWriter {
void accept(List<Document> documents);
}
六、一張圖看懂 Spring AI 接口體系

Spring AI 的接口設(shè)計采用經(jīng)典的五層架構(gòu),每一層都有明確的職責(zé)邊界:
| 層級 | 名稱 | 核心接口 | 一句話職責(zé) |
|---|---|---|---|
| L1 | 開發(fā)者使用層 | ChatClient | 給你最絲滑的編碼體驗 |
| L2 | 高級能力層 | CallAdvisor、Function Calling、ETL 接口 | 封裝 AI 應(yīng)用中的常見模式 |
| L3 | 核心抽象層 | ChatModel、EmbeddingClient、VectorStore | 按功能領(lǐng)域劃分的核心能力 |
| L4 | 基礎(chǔ)層 | Model、StreamingModel、ModelRequest、ModelResponse | 定義所有模型調(diào)用的統(tǒng)一規(guī)范 |
| L5 | 廠商實現(xiàn)層 | OpenAI、通義千問、Anthropic 等實現(xiàn) | 可插拔,按需引入 |
七、總結(jié)
三條核心鏈路
| 場景 | 調(diào)用鏈路 |
|---|---|
| 簡單對話 | ChatClient → ChatModel → Model → 廠商實現(xiàn) |
| RAG 問答 | ChatClient → CallAdvisor → VectorStore → ChatModel → Model → 廠商實現(xiàn) |
| 函數(shù)調(diào)用 | ChatClient → Function Calling → ChatModel → Model → 廠商實現(xiàn) |
設(shè)計精髓
- 接口與實現(xiàn)分離:L1-L4 定義"是什么",L5 負責(zé)"怎么做"
- 自動配置驅(qū)動:引入 Starter 后,Spring Boot 自動裝配正確的實現(xiàn)類
- 可觀測性內(nèi)置:每一層都可插拔日志、監(jiān)控、追蹤能力
- Java 生態(tài)優(yōu)先:擁抱 Reactor 響應(yīng)式編程,與 Spring 生態(tài)無縫集成
到此這篇關(guān)于一文帶你搞懂Spring AI核心接口,輕松對接所有大模型的文章就介紹到這了,更多相關(guān)Spring AI核心接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
servlet生命周期_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了servlet生命周期的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
一文搞懂MyBatis多數(shù)據(jù)源Starter實現(xiàn)
本文將實現(xiàn)一個MyBatis的Springboot的Starter包,引用這個Starter包后,僅需要提供少量配置信息,就能夠完成MyBatis多數(shù)據(jù)源的初始化和使用,需要的小伙伴可以參考一下2023-04-04
Java Callable接口實現(xiàn)細節(jié)詳解
這篇文章主要介紹了Java Callable接口實現(xiàn)細節(jié)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
Java通過反射獲取方法參數(shù)名的方式小結(jié)
這篇文章主要為大家詳細介紹了Java如何通過反射獲取方法參數(shù)名的方式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究
ThreadLocal是JDK提供的線程本地變量機制,但若使用不當可能導(dǎo)致內(nèi)存泄漏。正確的使用方式是在使用完后及時remove,或者使用弱引用等手段避免強引用導(dǎo)致的內(nèi)存泄漏。在多線程編程中,合理使用ThreadLocal可以提高并發(fā)性能,但也需要注意其潛在的內(nèi)存泄漏問題2023-04-04

