springai整合milvus

springai整合milvus

起男 35 2025-04-19

springai整合milvus

依赖

    <properties>
        <spring-ai.version>1.0.0-M5</spring-ai.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter</artifactId>
            <version>1.0.0-M5.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

配置

spring:
  ai:
    dashscope:
      api-key: sk-xxxxx
      chat:
        options:
          model: qwen-plus
      embedding:
        options:
          model: text-embedding-v1
    vectorstore:
      milvus:
        client:
          host: localhost
          port: 19530
        database-name: default
        collection-name: vector_store
        index-type: ivf_flat
        metric-type: cosine
        initialize-schema: true
        embedding-dimension: 1536
        embedding-field-name: embedding

单元测试

    @Autowired
    private VectorStore vectorStore;

    @Test
    void addDocument() {
        List<Document> documents = new ArrayList<>();
        documents.add(new Document("票价是50元"));
        documents.add(new Document("退票要10元手续费"));
        documents.add(new Document("退票金额会在7个工作日内返还"));

        vectorStore.add(documents);
    }

    @Test
    void queryDocument() {
        List<Document> documentList = vectorStore.similaritySearch(SearchRequest.builder()
                .query("我要退票").build());
        documentList.forEach(System.out::println);
    }

controller

@RestController
@RequestMapping("ai")
public class AIController {

    @Autowired
    private VectorStore vectorStore;

    private final ChatClient chatClient;

    public AIController(ChatClient.Builder builder){
        chatClient = builder
                .defaultSystem("你是一个景区的客服")
                .build();
    }

    @GetMapping(value = "chat/{message}",produces = "text/stream;charset=UTF-8")
    public Flux<String> chat(@PathVariable String message){
        return chatClient.prompt()
                .user(message)
                .advisors(new QuestionAnswerAdvisor(vectorStore,new SearchRequest.Builder()
                        .query(message).build()))
                .stream()
                .content();
    }
}