五、使用Spring AI Alibaba实现Rag

五、使用Spring AI Alibaba实现Rag

==================================================================================

==================================================================================

参考资料:

==================================================================================

解决spring-ai报错:Unresolved reference ‘SimpleVectorStore‘_org.springframework.ai.vectorstore.vectorstore' th-CSDN博客

Spring AI与DeepSeek实战三:打造企业知识库 (qq.com)

快速开始-阿里云Spring AI Alibaba官网官网 (java2ai.com)

在LinuxmacOS和Windows上配置APIKey为环境变量-大模型服务平台百炼-阿里云 (aliyun.com)

==================================================================================

集成大语言模型(LLM)落地的两大痛点:

  • 知识局限性:LLM依赖静态训练数据,无法覆盖实时更新或垂直领域的知识;
  • 幻觉:当LLM遇到训练数据外的提问时,可能生成看似合理但错误的内容。

用最低的成本解决以上问题,需要使用 RAG 技术,它是一种结合信息检索技术与 LLM 的框架,通过从外部 知识库 动态检索相关上下文信息,并将其作为 Prompt 融入生成过程,从而提升模型回答的准确性。

向量模型是实现 RAG 的核心组件之一,用于将非结构化数据(如文本、图像、音频)转换为 高维向量(Embedding)的机器学习模型。这些向量能够捕捉数据的语义或结构信息,使计算机能通过数学运算处理复杂关系。

1、准备工作

如果要使用一些大模型的高级功能,比如RAG、文生图、文生音频等,使用SpringAI Alibaba框架开发比较方便,配套的申请使用阿里云百炼上的大模型。

访问阿里云百炼页面并登录账号 https://www.aliyun.com/product/bailian

开通“百炼大模型推理”服务,获取API Key。

2、创建SpringBoot工程

9ffbe191b1f6da224baf258ec8273e51

3657038e73f8d028283088bd94626607

2.1、application.yml

server:
  port: 8898
spring:
  application:
    name: springai_rag

  ai:
    dashscope:
      # 阿里百炼 api_key
      api-key: ${BAILIAN_API_KEY}  # 从环境变量读取密钥

2.2、pom.xml

<?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.4.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springai_rag</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springai_rag</name>
    <description>springai_rag</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-M6</spring-ai.version>
        <spring-ai-alibaba.version>1.0.0-M6.1</spring-ai-alibaba.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>${spring-ai-alibaba.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
        <repository>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
            <id>sonatype-snapshots</id>
            <name>Sonatype Snapshot Repository</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                    </annotationProcessorPaths>
                    <source>15</source>
                    <target>15</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3、创建RAG 知识库

3.1、构建向量数据

创建 resources/rag/data-resources.txt 文件

1. {"type":"api","name":"测试api服务01","topic":"综合政务","industry":"采矿业","remark":"获取采矿明细的API服务"}
2. {"type":"api","name":"新能源车类型","topic":"能源","industry":"制造业","remark":"获取新能源车类型的服务"}
3. {"type":"api","name":"罚款报告","topic":"交通","industry":"制造业","remark":"获取罚款报告的接口"}
4. {"type":"api","name":"光伏发电","topic":"能源","industry":"电力、热力、燃气及水生产和供应业","remark":"获取光伏发电的年度报告"}
5. {"type":"api","name":"协同计算交付测试提供方","topic":"综合政务","industry":"信息传输、软件和信息技术服务业","remark":"协同计算交付测试提供方的数据源信息"}
6. {"type":"api","name":"文件下载-计量测试","topic":"综合政务","industry":"信息传输、软件和信息技术服务业","remark":"文件下载-计量测试"}
7. {"type":"api","name":"收益明细2025","topic":"综合政务","industry":"信息传输、软件和信息技术服务业","remark":"2025年的收益明细信息表"}

3.2、添加配置类

@Configuration
public class VectorStoreConfig {
    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel
            , @Value("classpath:rag/data-resources.txt") Resource docs) {
        VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build();
        vectorStore.write(new TokenTextSplitter().transform(new TextReader(docs).read()));
        return vectorStore;
    }
}

4、创建ChatClient和查询接口

@RestController
@RequestMapping("/rag")
public class RagController {
    private final ChatClient chatClient;

    public RagController(ChatClient.Builder builder, VectorStore vectorStore) {
        String sysPrompt = """
                您是一个智能搜索引擎,负责根据用户输入的内容进行精准匹配、模糊匹配和近义词匹配,以搜索相关的数据记录。
                您只能搜索指定的内容,不能回复其他内容或添加解释。
                您可以通过[search_content]标识符来表示需要搜索的具体内容。要求您返回匹配内容的完整记录,以JSON数组格式呈现。
                如果搜索不到内容,请返回[no_data]。
                """;
        this.chatClient = builder
                .defaultSystem(sysPrompt)
                .defaultAdvisors(
                        new QuestionAnswerAdvisor(vectorStore, new SearchRequest())
                )
                .defaultOptions(
                        DashScopeChatOptions.builder()
                                .withModel("deepseek-r1")
                                .build()
                )
                .build();
    }

    @GetMapping(value = "/search")
    public List<SearchVo> search(@RequestParam String search, HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");
        PromptTemplate promptTemplate = new PromptTemplate("[search_content]: {search}");
        Prompt prompt = promptTemplate.create(Map.of("search", search));

        return chatClient.prompt(prompt)
                .call()
                .entity(new ParameterizedTypeReference<List<SearchVo>>() {
                });
    }

    @Setter
    @Getter
    @NoArgsConstructor
    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    public static class SearchVo {
        private String type;
        private String name;
        private String topic;
        private String industry;
        private String remark;
    }
}

5、测试

0d78c928-d92b-4661-a41f-28f9afdca0de 195555f3-e1f1-4a0b-af19-b64e912b11d7
posted @ 2025-11-24 14:35  老羅  阅读(36)  评论(0)    收藏  举报