Spring AI 核心概念详解:ChatModel、Embedding 与 VectorStore
·
Spring AI 核心概念详解:ChatModel、Embedding 与 VectorStore
在上一篇文章中,我们搭建了第一个 Spring AI 应用并体验了 ChatClient 的便捷。但在实际开发中,仅仅调用对话接口远远不够。本文将深入剖析 Spring AI 的三大核心概念:ChatModel、Embedding 和 VectorStore,帮助你理解 Spring AI 的设计原理和底层机制。
概述:三大核心抽象
Spring AI 的设计借鉴了 Spring 生态一贯的分层抽象思想,在最底层提供了三个核心接口:
- ChatModel:与大语言模型对话的抽象,负责发送提示词并获取回复
- EmbeddingModel:将文本转换为向量表示的抽象,用于语义搜索和相似度计算
- VectorStore:向量数据库的抽象,用于存储和检索向量数据
一句话总结:ChatModel 负责"说",EmbeddingModel 负责"理解",VectorStore 负责"记忆"——三者构成了 AI 应用的基础设施。
ChatModel:对话能力的基石
接口定义
ChatModel 是 Spring AI 中最核心的接口,它的定义非常简洁:
public interface ChatModel {
String call(String message);
ChatResponse call(Prompt prompt);
Flux<ChatResponse> stream(Prompt prompt);
}
主要实现类
Spring AI 为不同的 AI 提供商提供了对应的实现:
| 提供商 | 实现类 | Starter 依赖 |
|---|---|---|
| OpenAI | OpenAiChatModel | spring-ai-openai |
| Azure OpenAI | AzureOpenAiChatModel | spring-ai-azure-openai |
| Ollama | OllamaChatModel | spring-ai-ollama |
| HuggingFace | HuggingFaceChatModel | spring-ai-huggingface |
| Google Vertex AI | VertexAiChatModel | spring-ai-vertex-ai |
Prompt 对象详解
Prompt 是 ChatModel 的核心输入对象,它封装了一次完整的对话请求:
public class Prompt {
private final List<Message> messages;
private final ChatOptions chatOptions;
public Prompt(String contents) {
this(new UserMessage(contents));
}
public Prompt(Message message) {
this(List.of(message));
}
public Prompt(List<Message> messages) {
this.messages = messages;
this.chatOptions = null;
}
public Prompt(List<Message> messages, ChatOptions chatOptions) {
this.messages = messages;
this.chatOptions = chatOptions;
}
}
Message 体系
Spring AI 定义了丰富的消息类型,对应 LLM 中的不同角色:
- UserMessage:用户的消息,对应 role: “user”
- SystemMessage:系统提示词,对应 role: “system”
- AssistantMessage:AI 的回复,对应 role: “assistant”
- ToolResponseMessage:工具调用的结果
EmbeddingModel:让机器理解语义
什么是 Embedding
Embedding 是将文本(单词、句子、文档)映射到高维向量空间的技术。语义相近的文本在向量空间中的距离也更近。
接口定义
public interface EmbeddingModel {
List<Double> embed(String text);
List<List<Double>> embed(List<String> texts);
EmbeddingResponse embedForResponse(List<String> texts);
int dimensions();
}
使用示例
@Service
public class EmbeddingService {
private final EmbeddingModel embeddingModel;
public EmbeddingService(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
public float[] getEmbedding(String text) {
List<Double> embedding = embeddingModel.embed(text);
float[] result = new float[embedding.size()];
for (int i = 0; i < embedding.size(); i++) {
result[i] = embedding.get(i).floatValue();
}
return result;
}
public double calculateSimilarity(String text1, String text2) {
List<Double> emb1 = embeddingModel.embed(text1);
List<Double> emb2 = embeddingModel.embed(text2);
return cosineSimilarity(emb1, emb2);
}
private double cosineSimilarity(List<Double> a, List<Double> b) {
double dot = 0, normA = 0, normB = 0;
for (int i = 0; i < a.size(); i++) {
dot += a.get(i) * b.get(i);
normA += a.get(i) * a.get(i);
normB += b.get(i) * b.get(i);
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}
}
VectorStore:持久化的向量记忆
接口定义
public interface VectorStore {
void add(List<Document> documents);
void delete(List<String> idList);
List<Document> similaritySearch(SearchRequest request);
default List<Document> similaritySearch(String query) {
return similaritySearch(SearchRequest.query(query));
}
}
支持的实现
Spring AI 支持多种向量数据库:
- Redis:使用 Redis Stack 的向量搜索功能
- Pgvector:PostgreSQL 的向量扩展
- Pinecone:托管的向量数据库
- Milvus:开源的分布式向量数据库
- ChromaLite:轻量级嵌入数据库
- Weaviate:开源向量搜索引擎
实战:RAG 模式
将 EmbeddingModel 和 VectorStore 结合使用,可以实现经典的 RAG(检索增强生成)模式:
@Service
public class RagService {
private final VectorStore vectorStore;
private final ChatClient chatClient;
public RagService(VectorStore vectorStore, ChatClient.Builder builder) {
this.vectorStore = vectorStore;
this.chatClient = builder.build();
}
public String query(String userQuestion) {
List<Document> similarDocs = vectorStore.similaritySearch(
SearchRequest.query(userQuestion).withTopK(3));
String context = similarDocs.stream()
.map(Document::getContent)
.collect(Collectors.joining("
---
"));
return chatClient.prompt()
.system("Based on the following context, answer the question:
" + context)
.user(userQuestion)
.call()
.content();
}
}
配置示例
以 Redis 作为 VectorStore 为例:
spring:
ai:
vectorstore:
redis:
index: spring-ai-index
prefix: spring-ai:
openai:
embedding:
options:
model: text-embedding-3-small
三者协作:完整的 AI 应用架构
用户输入
|
v
ChatClient (高阶 API)
|
+---> ChatModel ---> LLM API
| |
| +---> returns text response
|
+---> EmbeddingModel ---> vectorization
| |
| +---> VectorStore ---> similarity search
| |
| +---> returns relevant docs
|
+---> combine context + user input, call ChatModel again
总结:本文要点
- ChatModel 是 Spring AI 的核心对话接口,支持同步和流式调用
- EmbeddingModel 将文本转换为向量,用于语义理解和相似度计算
- VectorStore 是向量数据库的抽象,支持多种后端实现
- 三者结合可以实现 RAG 模式,显著提升 AI 回答的准确性和相关性
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)