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 备注:技术交流 即可通过!

相关推荐
G探险者9 分钟前
如何在批量创建 `DefaultMessageListenerContainer` 时避免阻塞问题
后端
我崽不熬夜25 分钟前
List、Set、Map,你真的会选用吗?
java·后端·java ee
展信佳_daydayup1 小时前
01 基础篇-虚拟机网络配置
后端
uhakadotcom1 小时前
最近rust生态有啥能力更新?
后端·面试·github
long3162 小时前
适配器模式 java demo
java·javascript·后端·程序人生·设计模式·适配器模式
David爱编程3 小时前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术3 小时前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
苏三的开发日记3 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记3 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端