2. 项目初始化

4 min

理解了 RAG 的核心概念和工作流程后,现在动手创建项目,把基础环境搭建起来。

1. 创建项目

打开 start.spring.io,按以下配置创建项目:

  • Project:Maven
  • Language:Java
  • Spring Boot:4.x
  • Group:com.albertstack
  • Artifact:rag-demo
  • Package name:com.albertstack.rag
  • Packaging:Jar
  • Configuration:YAML
  • Java:25
  • Dependencies:Spring Reactive Web、Lombok

点击 Generate 下载压缩包并解压。

2. 添加 Spring AI 依赖

Spring Initializr 目前还没有直接提供 Spring AI 的 RAG 相关依赖选项,需要手动添加。打开 pom.xml,在 <dependencies> 中添加以下两项:

xml
<!-- Spring AI Ollama:提供 ChatModel 和 EmbeddingModel -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>

<!-- Spring AI 向量存储 Advisor:提供 QuestionAnswerAdvisor + SimpleVectorStore -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>

依赖说明:

  • spring-ai-starter-model-ollama:自动配置 Ollama 连接,注册 OllamaChatModel(实现 ChatModel)和 OllamaEmbeddingModel(实现 EmbeddingModel)两个 Bean
  • spring-ai-advisors-vector-store:提供 QuestionAnswerAdvisor(RAG 的核心 Advisor)和 SimpleVectorStore(内存向量存储),后续构建 RAG 管道时会用到

接下来添加 Spring AI BOM 进行版本管理。在 pom.xml<dependencyManagement> 中添加:

xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>2.0.0-M3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3. 配置 Ollama

打开 src/main/resources/application.yaml,写入以下配置:

yaml
spring:
  application:
    name: rag-demo

  ai:
    ollama:
      base-url: http://localhost:11434
      # 启动时自动拉取缺失的模型
      init:
        pull-model-strategy: when_missing
      chat:
        model: qwen3.5:9b
      embedding:
        model: qwen3-embedding:8b

server:
  port: 8080

配置说明:

  • base-url:Ollama 服务地址,本地默认是 http://localhost:11434
  • pull-model-strategy: when_missing:应用启动时,如果本地没有配置的模型,Spring AI 会自动调用 Ollama 拉取,省去手动操作
  • chat.model:对话模型,这里使用 qwen3.5:9b
  • embedding.model:嵌入模型,使用 qwen3-embedding:8b。它与 qwen3.5 同属 Qwen 系列,中文语义理解优秀,输出 4096 维向量,最大支持 32K token 上下文

4. 拉取 Embedding 模型

虽然我们配置了 pull-model-strategy: when_missing 自动拉取,但建议先手动拉取一次,确认模型可用:

bash
ollama pull qwen3-embedding:8b

拉取完成后,确认两个模型都已就绪:

albert@dev: ~

5. 编写配置类

和 Spring AI 专栏一样,我们需要手动把 ChatClient 注册为 Bean。

src/main/java/com/albertstack/rag/config/AiConfig.java

java
package com.albertstack.rag.config;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.build();
    }
}

6. 验证基础通信

环境配置好了,写个测试确认 Spring AI 能正常连接 Ollama。

6.1 测试 ChatClient

src/test/java/com/albertstack/rag/AiConnectionTest.java

java
package com.albertstack.rag;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@Slf4j
@SpringBootTest
class AiConnectionTest {

    @Autowired
    ChatClient chatClient;

    @Autowired
    EmbeddingModel embeddingModel;

    @Test
    void chatClientShouldRespond() {
        // 发送简单问题,验证模型能正常回复
        String response = chatClient.prompt()
                .user("用一句话介绍 Spring Boot")
                .call()
                .content();

        log.info("模型回复: {}", response);
        assertThat(response).isNotBlank();
    }

    @Test
    void embeddingModelShouldWork() {
        // 嵌入一段文本,验证 EmbeddingModel 正常工作
        float[] vector = embeddingModel.embed("Spring AI 是 Spring 官方的 AI 集成框架");

        log.info("向量维度: {}", vector.length);
        log.info("前 5 个分量: ");
        for (int i = 0; i < Math.min(5, vector.length); i++) {
            log.info("  [{}] = {}", i, String.format("%.6f", vector[i]));
        }

        // qwen3-embedding:8b 输出 4096 维向量
        assertThat(vector.length).isGreaterThan(0);
        assertThat(vector).isNotEmpty();
    }
}

如果两个测试都通过,说明:

  • ChatClient:能正常连接 Ollama 并获取对话模型的回复
  • EmbeddingModel:能正常调用 Embedding 模型将文本转换为向量

7. 项目结构

到目前为止,项目结构如下:

text
rag-demo/
├── pom.xml
├── src/main/java/com/albertstack/rag/
│   ├── RagDemoApplication.java
│   └── config/
│       └── AiConfig.java
├── src/main/resources/
│   └── application.yaml
└── src/test/java/com/albertstack/rag/
    └── AiConnectionTest.java

8. 本章小结

本章完成了 RAG 项目的初始化,配置了 Ollama 连接并通过测试验证了基础通信。

知识点 说明
Spring Boot 4 + Spring AI 使用 Spring Initializr 创建项目,引入 Ollama starter 依赖
Ollama 模型配置 对话模型(qwen3.5:9b)和嵌入模型(qwen3-embedding:8b)的 YAML 配置
AiConfig 配置类 Spring AI 只提供 ChatClient.Builder,需手动注册 ChatClient Bean
基础通信验证 通过测试确认 ChatClient 和 EmbeddingModel 都能正常连接 Ollama

下一章我们进入 Embedding 和向量存储,理解 RAG 系统的数据基础。