Spring AI存储向量数据

背景:打造企业级AI应用,满足客户需求

此次为演示demo版,采用若依plus框架,SpringBoot版本3.4.1,JDK17,需安装Ollama!

步骤一:引入依赖

[1]pom.xml

xml 复制代码
<spring-ai.version>1.0.0</spring-ai.version>
<spring-ai-alibaba.version>1.0.0.2</spring-ai-alibaba.version>
xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama</artifactId>
    <version>${spring-ai.version}</version>
</dependency>
xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
    <version>${spring-ai-alibaba.version}</version>
</dependency>

步骤二:配置信息

[2]application.yml

yaml 复制代码
spring:
  application:
    name: ruoyi-plus
  ai:
    ollama:
      base-url: http://localhost:11434
      embedding:
        model: nomic-embed-text:latest
    dashscope:
      api-key: 个人秘钥
      chat:
        options:
          model: qwen-max

步骤三:接口开发

[1]VectorStoreController

scala 复制代码
@RestController
@RequestMapping("/vector")
public class VectorStoreController extends BaseController {
    @Autowired
    private VectorStoreService vectorStoreService;

    /**
     * spring ai向量库
     *
     * @return
     */
    @GetMapping("/simple")
    public R<Void> simpleVectorStore() {
        return toAjax(vectorStoreService.simpleVectorStore());
    }
}

[2]VectorStoreService

csharp 复制代码
public interface VectorStoreService {
    /**
     * spring ai向量库
     *
     * @return
     */
    int simpleVectorStore();
}

[3]VectorStoreServiceImpl

java 复制代码
@Service
@Slf4j
public class VectorStoreServiceImpl implements VectorStoreService {
    private static final String VECTOR_STORE_DOCUMENT_ID = "documentId";

    @Autowired
    private EmbeddingModel embeddingModel;

    /**
     * spring ai向量库
     *
     * @return
     */
    @Override
    public int simpleVectorStore() {
        String content = "这是一段测试文本";
        Document document = new Document(content);
        VectorStore vectorStore = buildSimpleVectorStore(embeddingModel);

        // 存储数据 业务关联
        document.getMetadata().put(VECTOR_STORE_DOCUMENT_ID, "c7e8354c-af69-721b-dac0-cc0d8833b2b4");
        vectorStore.add(List.of(document));
        log.info("vector store success...");
        return 1;
    }

    /**
     * 构建spring ai向量库
     *
     * @param embeddingModel
     * @return
     */
    private VectorStore buildSimpleVectorStore(EmbeddingModel embeddingModel) {
        SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build();
        // 本地存储文件
        File file = new File(StrUtil.format("{}/data_store/simple_{}.json", FileUtil.getUserHomePath(), embeddingModel.getClass().getSimpleName()));
        if (!file.exists()) {
            FileUtil.mkParentDirs(file);
            try {
                file.createNewFile();
            } catch (IOException e) {
                log.info("file create error...");
            }
        } else if (file.length() > 0) {
            vectorStore.load(file);
        }
        // 定时器
        Timer timer = new Timer("SimpleVectorStoreTimer-" + file.getAbsolutePath());
        log.info("timer task start...");
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                vectorStore.save(file);
            }
        }, Duration.ofMinutes(1).toMillis(), Duration.ofMinutes(1).toMillis());
        // 持久化
        RuntimeUtil.addShutdownHook(() -> vectorStore.save(file));
        return vectorStore;
    }


}

接口测试

验证

文件内容

可以将业务数据,如文档id存储在元数据中,方便检索

以上所用的在spring-ai-alibaba-starter-dashscope依赖中含有rag功能,无需引入spring-ai-ollama依赖!

源码解析

由于引入ollama,改写为ollama向量模型解析并存储

[4]ModelFactory

scss 复制代码
@Component
public class ModelFactory {
    @Value("${spring.ai.ollama.base-url}")
    private String url;

    @Value("${spring.ai.ollama.embedding.model}")
    private String model;

    /**
     * 构建ollama向量模型
     *
     * @return
     */
    public OllamaEmbeddingModel buildOllamaEmbeddingModel() {
        OllamaApi ollamaApi = OllamaApi.builder().baseUrl(url).build();
        OllamaOptions ollamaOptions = OllamaOptions.builder().model(model).build();
        return OllamaEmbeddingModel.builder()
            .ollamaApi(ollamaApi)
            .defaultOptions(ollamaOptions)
            .build();
    }
}

改写VectorStoreServiceImpl

java 复制代码
@Autowired
private ModelFactory modelFactory;
ini 复制代码
// 构建向量模型 ollama示例
OllamaEmbeddingModel ollamaEmbeddingModel = modelFactory.buildOllamaEmbeddingModel();
VectorStore vectorStore = buildSimpleVectorStore(ollamaEmbeddingModel);

接口测试

验证

文件内容

至此,Spring AI实现文本转向量存储已完成,由于用的本地文件,大家可以使用向量库pgvector/Milvus来实现!

本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走得更远。QQ群号:925317809 备注:技术交流 即可通过!

相关推荐
蚂蚁背大象5 分钟前
Rust 所有权系统是为了解决什么问题
后端·rust
子玖2 小时前
go实现通过ip解析城市
后端·go
Java不加班2 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬2 小时前
RAG 进阶检索学习笔记
后端
Moment2 小时前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_2 小时前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术2 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝2 小时前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享2 小时前
340. Java Stream API - 理解并行流的额外开销
前端·后端