Spring AI 核心概念详解:ChatModel、Embedding 与 VectorStore

在上一篇文章中,我们搭建了第一个 Spring AI 应用并体验了 ChatClient 的便捷。但在实际开发中,仅仅调用对话接口远远不够。本文将深入剖析 Spring AI 的三大核心概念:ChatModelEmbeddingVectorStore,帮助你理解 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 对象详解

PromptChatModel 的核心输入对象,它封装了一次完整的对话请求:

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 模式

EmbeddingModelVectorStore 结合使用,可以实现经典的 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 回答的准确性和相关性
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐