RAG(检索增强生成)作为融合信息检索与大语言模型文本生成的核心技术,能够通过外部知识库动态补充实时、精准的专属信息,从根源上提升大语言模型回答的准确性、时效性,还能有效抑制传统 LLM 的 “幻觉” 问题、解决模型知识过时的痛点,如今已成为企业搭建专属 AI 问答系统、智能助手的主流技术方案。

本文将以 2026 年最新技术栈为基础,详细讲解如何使用 Spring AI 框架快速构建基于本地知识库的 AI 问答系统,涵盖环境配置、文档加载、向量存储、查询增强、单元测试等全流程关键步骤,还额外补充了异常处理优化、多格式文档兼容小贴士和2026 年 Spring AI 新特性亮点,适合新手入门落地,也可供开发者作为项目参考收藏。

1、准备环境

开发工具:IDEA

构建工具:Gradle

开发环境:JDK21(17+即可)

技术框架:SpringBoot3.3.0 + Spring AI Alibaba 1.0.0-M6.1

2、引入Gradle依赖

这里我只引入核心依赖,其他的SpringBoot等基础依赖就不做展示了。

implementation 'com.alibaba.cloud.ai:spring-ai-alibaba-starter:1.0.0-M6.1'
implementation 'org.springframework.ai:spring-ai-markdown-document-reader:1.0.0-M6'

3、准备知识库文档

文档可以是Text、PDF或Markdown文件等,这里我们就以Markdown文件为例。

将文档放在resources的document目录里下:

4、文档读取

对自己准备好的知识库文档进行处理,然后保存到向量数据库中。这个过程俗称 ETL(抽取、转换、加载),Spring AI 提供了对 ETL 的支持。

ETL 的 3 大核心组件,按照顺序执行:

  • DocumentReader:读取文档,得到文档列表。
  • DocumentTransformer:转换文档,得到处理后的文档列表。
  • DocumentWriter:将文档列表保存到存储中(可以是向量数据库,也可以是其他存储)

通过 DocumentLoader 文‎档加载配置指定读取文档的细节,比如是否读取代码块、引用块等。还指定了额外的元信息配置‍,提取文档的文件名(fileName)作为文档的元信息⁠,可以便于后续知识库实现更精确的检索。

@Component
@Slf4j
public class DocumentLoader {
 
    private final ResourcePatternResolver resourcePatternResolver;
 
    public DocumentLoader(ResourcePatternResolver resourcePatternResolver) {
        this.resourcePatternResolver = resourcePatternResolver;
    }
 
    /**
    * 加载多篇Markdown文档
    * @param
    * @return java.util.List<org.springframework.ai.document.Document>
    */
    public List<Document> loadMarkDownList() {
        List<Document> documentList = new ArrayList<>();
        // 加载Markdown文档列表
        try {
            Resource[] markDownList = resourcePatternResolver.getResources("classpath*:document/*.md");
            for (Resource markDown : markDownList) {
                String filename = markDown.getFilename();
                // 加载markdown文档构造器
                MarkdownDocumentReaderConfig documentReaderConfig = MarkdownDocumentReaderConfig.builder()
                        // 有分隔符就创建新文档
                        .withHorizontalRuleCreateDocument(true)
                        // 是否包含代码块
                        .withIncludeCodeBlock(true)
                        // 是否包含引用格式
                        .withIncludeBlockquote(true)
                        // 添加额外信息
                        .withAdditionalMetadata("filename", filename)
                        .build();
                MarkdownDocumentReader markdownDocumentReader = new MarkdownDocumentReader(markDown, documentReaderConfig);
                documentList.addAll(markdownDocumentReader.read());
            }
        } catch (IOException e) {
            BizException.of("加载Markdown文档列表失败:", e);
        }
        return documentList;
    }
}

5、向量转换和存储

为了实现方便؜,我们使用 Spri‎ng AI 内置的、基于内存读写的向量数据库‍ SimpleVect⁠orStore 来保存文档。

SimpleVe؜ctorStore 实现了 Ve‎ctorStore 接口,而 VectorStore 接口集成了‍ DocumentWriter,⁠所以具备文档写入能力。

实现初始化向量数据库并且保存文档的方法。代码如下:

@Configuration
public class VectorStoreConfig {
 
    @Resource
    private DocumentLoader documentLoader;
 
    @Bean
    VectorStore vectorStore(EmbeddingModel dashscopeEmbeddingModel) {
        SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel)
                .build();
        // 加载文档
        List<Document> documentList = documentLoader.loadMarkDownList();
        simpleVectorStore.add(documentList);
        return simpleVectorStore;
    }
}

6、查询增强

Spring AI 通过؜ Advisor 特性提供了开箱即用的 RAG 功‎能。主要是 QuestionAnswerAdvisor 问答拦截器和RetrievalAug‍mentationAdvisor 检索增强拦截器⁠。

查询增强的原理:向量数据库存储着 AI 模型本身不知道的数据,当用户问题‎发送给 AI 模型时,QuestionAnswerAdvisor 会查询向量数据库,获取与用户问题相关的文档‍。然后从向量数据库返回的响应会被附加到用户文本中,为 ⁠AI 模型提供上下文,帮助其生成回答。

@Slf4j
@Component
public class CodeAssistantApp {
 
    private final ChatClient chatClient;
 
    /**
    * 系统提示词
    */
    private static final String SYSTEM_PROMPT = "扮演资深的软件开发专家。开场向用户表明身份,告知用户可以提出难以解决的编程问题。\" +\n" +
            "            \"引导用户详述问题需求,以便给出专属解决方案。";
 
    /**
    * 初始化ChatClient
    * @param chatModel
    */
    public CodeAssistantApp(ChatModel chatModel) {
        ChatMemory chatMemory = new InMemoryChatMemory();
        chatClient = ChatClient.builder(chatModel)
                .defaultSystem(SYSTEM_PROMPT)
                // 拦截器
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory),
                        // 自定义拦截器,按需开启
                        new CustomLoggerAdvisor()
                        // 自定义重读拦截器,增强推理能力,增加成本,按需开启
                        //new ReReadingAdvisor()
                )
                .build();
    }
 
    /**
    * 基础对话(支持多轮对话记忆)
    * @param message
    * @param chatId
    * @return java.lang.String
    */
    public String doChat(String message, String chatId) {
        ChatResponse response = chatClient
                .prompt()
                .user(message)
                // 将当前对话的 ID(chatId)传入,AI 客户端会根据这个 ID 去查找该对话的历史记录
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        // 表示最多获取最近的 10 条历史消息作为上下文,供 AI 在生成回复时参考
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                .call()
                .chatResponse();
        String content = "";
        if (Objects.nonNull(response)) {
            content = response.getResult().getOutput().getText();
        }
        log.info("content: {}", content);
        return content;
    }
}

7、与RAG知识库对话方法

/**
    * RAG 知识库 对话
    * @param message
    * @param chatId
    * @return java.lang.String
    */
    public String doChatWithRag(String message, String chatId) {
        ChatResponse chatResponse = chatClient
                .prompt()
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                // 开启日志
                .advisors(new CustomLoggerAdvisor())
                // 应用知识库问答
                .advisors(new QuestionAnswerAdvisor(vectorStore))
                .call()
                .chatResponse();
        String content = chatResponse.getResult().getOutput().getText();
        log.info("content: {}", content);
        return content;
    }

8、单元测试

故意提问一个文档内有回答的问题。

文档部分内容:

@Test
    void doChatWithRag() {
        String chatId = UUID.randomUUID().toString();
        String message = "进程和线程的区别";
        String answer =  codeAssistantApp.doChatWithRag(message, chatId);
        Assertions.assertNotNull(answer);
    }

输出结果:

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2025 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》下方扫码获取~
在这里插入图片描述

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)
在这里插入图片描述

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!
在这里插入图片描述

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。
在这里插入图片描述

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
在这里插入图片描述

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。
在这里插入图片描述

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

图片

以上资料如何领取?

在这里插入图片描述

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

图片

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
在这里插入图片描述
在这里插入图片描述

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
在这里插入图片描述
在这里插入图片描述

以上全套大模型资料如何领取?

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐