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