Spring AI存储向量数据

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

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

步骤一:引入依赖

1pom.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>

步骤二:配置信息

2application.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

步骤三:接口开发

1VectorStoreController

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());
    }
}

2VectorStoreService

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

3VectorStoreServiceImpl

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向量模型解析并存储

4ModelFactory

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

相关推荐
灯澜忆梦6 分钟前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
m0_5873830011 分钟前
无人自助拼豆系统从需求分析到落地部署全流程实战开发指南
java·经验分享·后端·struts·小程序·架构·需求分析
Rain的Java大神之路21 分钟前
被问麻了!Function Calling、MCP、Skill 到底啥关系?一张图讲透三层架构,附 Java 生产落地全流程+30个坑
java·后端·ai编程
云和数据.ChenGuang1 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
豆角焖肉2 小时前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
付威20232 小时前
如果你想拥有自己的 Agent,为什么值得从 rpi 开始
后端
可乐ea2 小时前
2000 个智能体把 Agent 重写成 Rust:编排流水线拆解
开发语言·后端·rust·多智能体协作·ai编程助手·智能体编排·rust重写
用户72757483196502 小时前
02-变量、常量和字符串:len("Hello, 世界") 为什么不是 9?
后端
SamDeepThinking2 小时前
CyclicBarrier的底层实现
java·后端·面试
god_cvz2 小时前
第二章:6、对话记忆与引用标注
后端·ai编程