轻松入门 Spring AI · RAG(Retrieval-Augmented Generation)实现(2026年主流实用写法 · 从最简单到生产可用)

RAG 是目前使用大模型最常见、最有效的增强方式之一:
让模型“先查资料,再回答”,大幅降低幻觉,提高答案准确性。

Spring AI 中 RAG 的几种主流实现难度对比(2026年初)

难度实现方式向量存储类型上手时间生产可用性推荐场景
★☆☆内存版(SimpleVectorStore)内存5~15分钟★☆☆学习、Demo、快速验证
★★☆文件+PGVectorPostgreSQL + pgvector1~3小时★★★★小型到中型项目、性价比高
★★★Chroma / Milvus / Redis专用向量数据库3~8小时★★★★★中大型项目、分布式、高并发
★★★★Elasticsearch / Weaviate搜索+向量混合6~15小时★★★★★已有ES集群、企业级

最推荐的入门组合(2026年最常用)

学习/快速上手首选
Spring AI 1.0.x + SimpleVectorStore(内存) + OpenAI/DeepSeek/通义千问 兼容接口

小项目/生产过渡推荐
PostgreSQL + pgvector + Spring AI PGVector Store

方式一:最简单内存版 RAG(5分钟能跑通)

@RestController
@RequestMapping("/rag/easy")
@RequiredArgsConstructor
public class EasyRagController {

    private final ChatClient chatClient;
    private final EmbeddingModel embeddingModel;   // 自动注入,通常跟随你选择的模型

    // 内存向量存储(项目重启就清空,适合学习)
    private final VectorStore vectorStore = new SimpleVectorStore(embeddingModel);

    // 启动时自动加载知识(实际项目中可以做成定时任务/管理接口)
    @PostConstruct
    public void initKnowledge() {
        List<String> rawTexts = List.of(
            "Spring AI 是 Spring 家族 2024~2025 年推出的官方大模型集成框架。",
            "ChatClient 是最核心的高层抽象,类似以前的 RestTemplate。",
            "目前最受欢迎的国内模型组合:DeepSeek-R1(推理)、DeepSeek-V3(综合)、通义千问-max(稳定)。",
            "RAG 全称 Retrieval-Augmented Generation,中文叫检索增强生成。",
            "好的 RAG 系统关键在于:高质量的切分、分块、Embedding、检索召回、上下文构建。"
        );

        List<Document> documents = rawTexts.stream()
            .map(text -> Document.builder()
                .content(text)
                .metadata(Map.of("source", "spring-ai-rag-intro", "type", "tutorial"))
                .build())
            .toList();

        vectorStore.add(documents);
    }

    @GetMapping("/ask")
    public String askQuestion(@RequestParam String question) {
        // 1. 检索最相似的 TopK 文档
        List<Document> similarDocs = vectorStore.similaritySearch(
            SearchRequest.query(question)
                .withTopK(4)              // 召回几条
                .withSimilarityThreshold(0.68)  // 相似度阈值,可调
        );

        // 2. 构建上下文(最简单拼接方式)
        String context = similarDocs.stream()
            .map(doc -> doc.getContent())
            .collect(Collectors.joining("\n\n---\n\n"));

        // 3. 带上下文提问
        return chatClient.prompt()
            .system("""
                    你现在是一位基于给定上下文回答问题的专家助手。
                    只使用下面提供的上下文信息来回答问题。
                    如果上下文里没有相关信息,就诚实地说不知道,不要编造。

                    上下文:
                    {context}
                    """)
            .user(question)
            .advisors(PromptTemplate.from("{context}").withVariable("context", context))
            .call()
            .content();
    }
}

测试例子
http://localhost:8080/rag/easy/ask?question=什么是RAG?它有什么关键点?

方式二:更接近生产的 PGVector 版(推荐小项目使用)

依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

application.yml 配置示例

spring:
  ai:
    vectorstore:
      pgvector:
        initialize-schema: true           # 第一次启动时自动建表
        index-type: HNSW                  # 或 IVFFlat
        dimensions: 1536                  # 跟你的 embedding model 维度一致(text-embedding-3-small=1536)
        distance-type: COSINE             # 余弦最常用
  datasource:
    url: jdbc:postgresql://localhost:5432/ragdb
    username: postgres
    password: yourpassword

代码基本相同,只改 VectorStore 注入方式

@Autowired
private VectorStore vectorStore;  // 会自动注入 PgVectorStore

其他使用方式几乎不变。

目前(2026年1月)推荐的 Embedding 模型选择

模型维度中文效果速度价格/本地推荐度
text-embedding-3-small (OpenAI)1536★★★★★★★★付费★★★★
bge-m3 (BAAI)1024★★★★★★★★免费/本地★★★★★
text-embedding-ada-0021536★★★★★★★★便宜★★★
moka-ai/m3e-base768★★★★☆★★★★本地免费★★★★
GTE-large-zh (Alibaba-NLP)1024★★★★★★★★本地/云★★★★½

一句话总结目前最舒服的入门 RAG 路径:

先用 SimpleVectorStore + bge-m3 或 text-embedding-3-small 跑通完整流程 →
理解原理后再迁移到 PGVector / Chroma
再考虑 高级切分、重排、HyDE、查询改写、多路召回 等优化

需要我帮你把上面代码改成更完整的版本吗?
例如:

  • 支持文件上传 pdf/txt/docx → 自动切分 → 入库
  • 带相似度分数显示
  • 使用 bge-m3 本地 embedding
  • 加上重排序(rerank)

告诉我你想往哪个方向深入~ 😄

文章已创建 3855

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部