Spring AI Alibaba 静态RAG实战:让AI成为你的专属知识管家

本文将通过生动易懂的方式介绍静态RAG技术,并提供一个简单实用的实现方案,让AI能够读取你的文档并智能回答问题。

什么是静态RAG?一个生动的比喻

想象一下,你新招了一位博学多才的助理,但他对你公司的具体业务一无所知。为了让他能帮你处理工作,你给了他一套完整的产品手册、技术文档和客户资料。

静态RAG就是这个过程的数字化版本:

  • 📚 文档库 = 你给助理的资料文件
  • 🤖 AI模型 = 那位博学的助理
  • 你的问题 = 需要查询的业务问题
  • 💡 AI的回答 = 助理查阅资料后给出的答案

与直接问AI不同,静态RAG确保回答严格基于你提供的资料,不会胡编乱造,真正成为你的专属知识专家。

为什么需要静态RAG?

解决AI的"幻觉"问题

普通AI聊天时,可能会编造不存在的信息。比如你问:“我们产品的技术规格是什么?” AI可能基于训练数据编造答案。

而静态RAG会回答:“根据您提供的产品手册第3页,我们的产品规格是…”

保护商业机密

你可以只给AI看脱敏后的内部文档,既获得了智能问答能力,又不用担心数据泄露。

知识实时更新

AI模型的训练数据有截止日期,但你的业务文档可以随时更新。新产品发布?更新文档即可,AI立即掌握最新信息。

静态RAG的简单实现原理

我们的实现方案很简单:

  1. 文档存储 → 把文档放在resources/documents文件夹
  2. 文档发现 → 程序自动扫描文件夹内的所有文件
  3. 内容读取 → 读取用户指定文档的全部内容
  4. 智能问答 → 把文档内容+问题一起发给AI,要求基于文档回答
[你的文档] → [程序读取] → [AI分析] → [精准回答]

环境准备:5分钟快速开始

1. 环境要求

在开始之前,请确保你的开发环境满足以下要求:

  • JDK 17及以上(本文使用JDK 17)
  • Spring Boot 3.x及以上(本文使用Spring Boot 3.5.7)
  • Maven 3.6及以上

2. 获取API Key

  1. 访问阿里云百炼平台并登录你的账号
  2. 开通"百炼大模型"服务(新用户通常有一定免费额度)
  3. 在控制台中生成API Key并保存
    在这里插入图片描述
    使用某个模型时,建议开启该模型的"免费额度用完即停"功能,防止测试中超额扣费。
    在这里插入图片描述
    语音合成模型可以在这里找:
    在这里插入图片描述

创建Spring Boot项目

1. 初始化项目

访问 start.spring.io 快速创建项目,配置如下:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.5.7
  • Group: com.example
  • Artifact: spring-ai-demo
  • Java: 17
  • Dependencies: Spring Web

点击"Generate"下载项目压缩包并解压到本地。

2. 配置pom.xml

pom.xml中添加Spring AI Alibaba依赖和仓库配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.7</version>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>spring-ai-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-tts-demo</name>
    
    <properties>
        <java.version>17</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter</artifactId>
            <version>1.0.0-M5.1</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 添加Spring Milestones仓库 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

由于Spring AI相关依赖尚未发布到中央仓库,所以需要添加Spring Milestones仓库。

配置应用参数

1. 配置API Key

src/main/resources/application.yml中添加配置:

spring:
  application:
    name: spring-ai-demo
  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY:}
    chat:
      options:
        model: qwen3-max # 设置默认的对话模型
  

安全提示:不建议将API Key直接写在代码中,可以通过环境变量设置:

Windows系统:

set AI_DASHSCOPE_API_KEY=你的API_KEY

Mac/Linux系统:

export AI_DASHSCOPE_API_KEY=你的API_KEY

手把手实现:动态文档问答系统

环境准备

确保你已经有了基础的Spring AI Alibaba项目:

  • Spring Boot 3.x + Java 17
  • 配置好阿里云百炼API密钥
  • 添加了spring-ai-alibaba依赖

第一步:创建智能文档读取器

创建src/main/java/com/example/spring_ai_demo/util/DocumentReader.java

package com.example.spring_ai_demo.util;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

@Component
public class DocumentReader {

    /**
     * 自动发现documents目录下的所有文档
     * 就像图书馆管理员知道书架上有哪些书一样
     */
    public List<String> getAvailableDocuments() {
        List<String> documents = new ArrayList<>();
        try {
            // 自动扫描documents目录
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = resolver.getResources("classpath:documents/*");
            
            for (Resource resource : resources) {
                String filename = resource.getFilename();
                if (filename != null) {
                    documents.add(filename);
                }
            }
            System.out.println("发现 " + documents.size() + " 个文档");
        } catch (Exception e) {
            System.out.println("读取文档列表时出错: " + e.getMessage());
        }
        return documents;
    }

    /**
     * 读取文档内容 - 就像从书架上取下一本书阅读
     */
    public String readDocument(String filename) {
        try {
            Resource resource = new PathMatchingResourcePatternResolver()
                    .getResource("classpath:documents/" + filename);
            String content = new String(Files.readAllBytes(Paths.get(resource.getURI())));
            System.out.println("已读取文档: " + filename + " (长度: " + content.length() + " 字符)");
            return content;
        } catch (Exception e) {
            return "❌ 文档读取失败: " + e.getMessage();
        }
    }
}

第二步:创建文档问答控制器

创建src/main/java/com/example/spring_ai_demo/controller/DocumentController.java

package com.example.spring_ai_demo.controller;

import com.example.spring_ai_demo.util.DocumentReader;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/doc")
public class DocumentController {

    @Autowired
    private DocumentReader documentReader;
    
    @Autowired
    private ChatClient chatClient;

    /**
     * 查看知识库中有哪些文档
     * 就像查看图书馆的图书目录
     */
    @GetMapping("/list")
    public Map<String, Object> listDocuments() {
        Map<String, Object> result = new HashMap<>();
        List<String> documents = documentReader.getAvailableDocuments();
        
        result.put("success", true);
        result.put("documents", documents);
        result.put("message", "发现 " + documents.size() + " 个文档,可以直接用于问答");
        
        return result;
    }

    /**
     * 核心功能:基于文档的智能问答
     * 就像把书给助理看,然后问他相关问题
     */
    @GetMapping("/ask")
    public Map<String, Object> askDocument(@RequestParam String document, 
                                          @RequestParam String question) {
        
        Map<String, Object> result = new HashMap<>();
        
        // 1. 从知识库中取出指定的"书"
        String content = documentReader.readDocument(document);
        if (content.contains("失败")) {
            result.put("success", false);
            result.put("error", content);
            result.put("tip", "请检查文档是否存在,或查看/doc/list获取可用文档");
            return result;
        }
        
        // 2. 给AI明确的指令:基于这本书回答问题
        String prompt = "请你扮演一个专业的文档分析助手。请严格基于我提供的文档内容来回答问题。\n\n" +
                       "文档内容如下:\n《" + document + "》\n" + content + "\n\n" +
                       "我的问题是:" + question + "\n\n" +
                       "回答要求:\n" +
                       "1. 如果文档中有相关信息,请准确回答并注明依据\n" +
                       "2. 如果文档中没有相关信息,请诚实说'文档中没有提到相关内容'\n" +
                       "3. 不要使用文档之外的知识来回答问题";
        
        // 3. 让AI助理基于文档给出答案
        String answer = chatClient.prompt()
                .user(prompt)
                .call()
                .content();
        
        result.put("success", true);
        result.put("document", document);
        result.put("question", question);
        result.put("answer", answer);
        result.put("tip", "此回答严格基于文档《" + document + "》的内容");
        
        return result;
    }
}

第三步:准备你的知识库文档

src/main/resources/下创建documents文件夹,然后放入你的文档:

创建 documents/java-basic.txt

Java编程语言基础

Java是一种面向对象的编程语言,由Sun公司于1995年发布。

主要特点:
1. 简单易学 - 语法清晰,学习曲线平缓
2. 面向对象 - 支持封装、继承、多态
3. 平台无关 - 通过JVM实现"一次编写,到处运行"
4. 多线程 - 内置多线程支持
5. 安全性 - 提供安全管理机制

应用领域:
- 企业级Web应用
- 移动应用开发(Android)
- 大数据处理
- 嵌入式系统

创建 documents/spring-intro.txt

Spring框架介绍

Spring是Java领域最流行的开发框架,简化了企业级应用开发。

核心功能:
- 依赖注入(DI):管理对象依赖关系
- 面向切面编程(AOP):处理横切关注点
- 事务管理:声明式事务支持
- Spring MVC:Web开发框架

Spring Boot的优势:
- 自动配置:减少XML配置
- 内嵌服务器:简化部署流程
- Starter依赖:快速集成各种功能

测试你的专属知识管家

启动应用后,让我们测试这个智能文档问答系统:

测试1:查看知识库目录

http://localhost:8080/doc/list

预期结果:返回所有可用文档列表,就像查看图书馆目录一样。
在这里插入图片描述

测试2:基于文档提问

http://localhost:8080/doc/ask?document=java-basic.txt&question=Java有哪些主要特点?

预期结果:AI会基于文档内容列出5个特点,并说明这是来自文档的信息。
在这里插入图片描述

测试3:测试文档外的问题

http://localhost:8080/doc/ask?document=java-basic.txt&question=Python有什么优点?

预期结果:AI会诚实地说"文档中没有提到Python相关内容"。
在这里插入图片描述

测试4:添加新文档

documents文件夹中新建ai-guide.txt

人工智能基础指南

人工智能是模拟人类智能的技术。

主要分支:
- 机器学习:从数据中学习规律
- 深度学习:基于神经网络的机器学习
- 自然语言处理:让计算机理解人类语言
- 计算机视觉:让计算机"看懂"图像

应用场景:
- 智能客服:自动回答用户问题
- 推荐系统:个性化内容推荐
- 图像识别:人脸识别、物体检测

重新访问/doc/list,你会看到新文档自动出现在列表中!

实际应用场景

这个简单的静态RAG系统可以用于:

🏢 企业内部知识库

  • 产品文档查询
  • 技术规范问答
  • 流程制度咨询

🎓 教育学习助手

  • 课程资料问答
  • 学习指南查询
  • 知识点解释

🛍️ 电商客服系统

  • 产品规格查询
  • 使用指南解答
  • 常见问题回复

📚 个人知识管理

  • 读书笔记查询
  • 研究资料整理
  • 学习内容复习

扩展学习方向

如果你对这个基础版本感兴趣,想要更强大的功能,可以探索:

1. 多文档联合问答

// 伪代码:同时基于多个文档回答
String content1 = readDocument("产品手册.txt");
String content2 = readDocument("技术白皮书.txt"); 
String combinedContent = content1 + "\n\n" + content2;
// 然后基于combinedContent提问

2. 智能文档搜索

实现关键词搜索,快速找到相关文档:

// 伪代码:搜索包含特定关键词的文档
for (String doc : documents) {
    if (readDocument(doc).contains("面向对象")) {
        // 找到相关文档
    }
}

3. 文档自动分类

让AI自动为文档打标签,方便管理:

// 伪代码:自动分类文档
String category = ai.analyze("这篇文档主要讲什么技术?");

4. 问答历史记录

记录用户的提问和AI的回答,形成知识积累。

5. 向量数据库集成

使用专业的向量数据库实现语义搜索,而不仅仅是关键词匹配。

总结

通过这个简单的静态RAG系统,你已经实现了:

智能文档管理 - 自动发现和读取知识库文档
精准问答 - AI严格基于你的文档内容回答
零配置扩展 - 添加新文档无需修改代码
防止幻觉 - AI不会编造文档之外的信息
易于使用 - 简单的HTTP接口,开箱即用

这个系统虽然简单,但已经能够解决很多实际场景中的知识问答需求。最重要的是,它让你掌握了静态RAG的核心思想:用你的专属数据为AI提供上下文,让通用大模型基于你的知识库给出精准回答

现在就开始构建你的专属知识库吧,让AI成为你最得力的知识管理助手!

本项目代码已上传至github《https://github.com/zhaohualuo/spring-ai-demo.git


进一步学习

如有问题,欢迎在评论区讨论!

在这里插入图片描述

Logo

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

更多推荐