背景

9年老Java学大模型应用开发

实操

pom

这里有个问题,原来用的SpringBoot版本是3.5.16,SpringAI版本是1.1.2。结果配置的 initialize-schema: true 无效,项目启动总是报错:collection不存在。用AI找问题说是当前SpringAI版本中有个匹配有问题,问题如下:

完整调用链:
Spring 启动
→ ChromaVectorStore.afterPropertiesSet()

→ chromaApi.getCollection(tenant, database, "my_test")

→ HTTP GET /api/v2/tenants/default_tenant/databases/default_database/collections/my_test
getErrorMessage() 用 "does not exists" 做 equals 匹配
→ 匹配失败 → 抛出 RuntimeException
→ initialize-schema 逻辑被中断,Collection 未被创建

没细究,遂升级版本解决:SpringAI:2.0.1 SpringBoot版本:4.1.0

pom
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        openai-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--        rag-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-rag</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-vector-store-chroma</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-tika-document-reader</artifactId>
        </dependency>

application.yaml

application.yml
spring:
  application:
    name: embedding-app
  ai:
    openai:
      base-url: https://api.agnes-ai.cn
      api-key: ${AGNES_KEY}
      chat:
        options:
          model: agnes-2.5-flash
      embedding:
        api-key: ${EMBEDDING_KEY}
        options:
          model: BAAI/bge-m3
        #          dimensions: 1024
        base-url: https://api.siliconflow.cn/v1
    vectorstore:
      chroma:
        client:
          host: http://192.168.1.2
          port: 8000
        collection-name: my_test
        database-name: default_database
        tenant-name: default_tenant
        initialize-schema: true

配置类

LLMConfig
@Configuration
@Slf4j
public class LLMConfig {

    @Value("${spring.ai.vectorstore.chroma.collection-name}")
    private String collectionName;
    @Value("${spring.ai.vectorstore.chroma.database-name}")
    private String databaseName;
    @Value("${spring.ai.vectorstore.chroma.tenant-name}")
    private String tenantName;

    @Resource
    private ChromaVectorStore vectorStore;


    @Bean
    public ChatClient chatClient(@Qualifier("openAiChatModel") ChatModel chatModel) {
        return ChatClient.builder(chatModel).build();
    }

    @Bean
    public RetrievalAugmentationAdvisor retrievalAugmentationAdvisor() {
        // 向量库检索设置
        VectorStoreDocumentRetriever documentRetriever = VectorStoreDocumentRetriever.builder()
                .vectorStore(vectorStore)
                .similarityThreshold(0.2)
                .topK(2)
                .build();
        // 查询增强
        ContextualQueryAugmenter augmenter = ContextualQueryAugmenter.builder()
                .allowEmptyContext(true) // 空的话使用大模型回答
                .build();
        return RetrievalAugmentationAdvisor.builder()
                .documentRetriever(documentRetriever)
                .queryAugmenter(augmenter)
                .build();
    }

    @SneakyThrows
    @PostConstruct
    public void initVectorData() {

        List<Document> documents1 = vectorStore.similaritySearch("");
        log.info("initVectorData>>>getCount: {}", documents1.size());
        if (documents1.isEmpty()) {
            ClassPathResource resource = new ClassPathResource("导游面试问答.doc");
            String text = new Tika().parseToString(resource.getFile());
            TokenTextSplitter splitter = TokenTextSplitter.builder()
                    .withChunkSize(800)
                    .withMinChunkSizeChars(400)
                    .withKeepSeparator(true)
                    .build();
            List<Document> documents = splitter.apply(List.of(new Document(text)));
            vectorStore.add(documents);
        }
    }
}

项目启动

启动成功,能正常查数据
image

总结

AI确实强大,找问题比人工快的多
这次只是加载类路径文件向量化存储到chroma。还有rag检索的没加上去。

posted on 2026-08-25 22:30  idanyang  阅读(3)  评论(0)    收藏  举报