Spring AI ve Milvus Vektör Veritabanı Entegrasyonu

Nesrin Asan
3 min readMay 26, 2024

--

Yakın zamanda hayatımıza giren Spring AI ile vector database’ler ile çalışabiliriz. Bugün Spring AI ve Milvus veritabanı ile bir örnek gerçekleştireceğiz.

Öncelikle Spring.io sitesi üzerinden şu şekilde bağımlılıklarımızı ekleyelim.

NOT: Docker Compose Support bir developer tools’tur. Bu ekranda eklediğiniz bağımlılıklarınızı projeye sizin yerinize bir docker-compose dosyası olarak otomatik olarak ekler. aynı zamanda docker-compose up komutunu çalıştırmanıza gerek kalmadan projeyi run ettiğiniz anda sizin için docker-compose dosyasındaki komutları çalıştırır. Tabi bunu ayarlayabiliyorsunuz. her proje çalıştığında yeniden çalışsın/kapansın vs gibi. Şuan Milvus DB desteği yok o nedenle bu eklenti milvus için boş gelecektir.

Daha sonra projemizi açıyoruz. properties dosyasını benzer şekilde düzenliyoruz.

# Milvus Configuration
spring.ai.vectorstore.milvus.client.host=localhost
spring.ai.vectorstore.milvus.client.port=19530
spring.ai.vectorstore.milvus.client.username=root
spring.ai.vectorstore.milvus.client.password=milvus
spring.ai.vectorstore.milvus.databaseName=default
spring.ai.vectorstore.milvus.collectionName=vector_store
spring.ai.vectorstore.milvus.embeddingDimension=1536
spring.ai.vectorstore.milvus.indexType=IVF_FLAT
spring.ai.vectorstore.milvus.metricType=COSINE

# OpenAI API Key
spring.ai.openai.api-key= your-open-ai-key

# Docker Compose Lifecycle Management
spring.docker.compose.lifecycle-management=start_only

# Server Port Configuration
spring.server.port=8989

Yukarıda gördüğünüz gibi vectorstore olarak kullandığımız milvus için gerekli ayarlamaları yapıyoruz.

Burada önemli olan nokta openAI kullanımı. Milvus bir vector database’dir. yani text, image gibi yapıların uzaydaki yerini alır ve database’e kaydeder. Örneğin: Kırmızı Pantolon, Mavi Kazak, Kırmızı Şort gibi üç adet data’yı Milvus üzerinde text olarak tutmak yerine bunların vektörlerini tutarız. Bir nevi uzayda kümeleriz gibi düşünülebilir belki. Böylelikle Kırmızı Pantolon ve Kırmızı Şort uzayda birbirine daha yakın olacaktır. Evet bu kaydetme işlemini Milvusta yapıyoruz. Peki kaydedeceğimiz vektörü nasıl çıkarıyoruz. Bunun için de şirketlerin kendi AI çözümleri olabilir tabiki. Aynı zamanda SpringAI kullanarakta vektörlerimizi çıkarabiliriz. Bunun için bir embedding client’a ihtiyacımız var. biz bugün embedding client olarak openAI’dan faydalanacağız. Ama bunları da kullanabilirsiniz.

Spring üzerinde openAI key’imizi tanımlayarak bu text bilgilerinin vektörlerini openAI aracılığı ile çıkartabilir ve Milvus database’ine kaydedebiliriz. Aslında tüm bunlara karar verdikten sonrası çok rahat.

Hemen bir MilvusController ve MilvusService adında class’larımızı açıyoruz:

import com.asan.milvusspringaitest.milvus.MilvusService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MilvusController {

@Autowired
MilvusService milvusService;


@GetMapping("/getDataFromMilvus")
public void getDataFromMilvus(){
milvusService.getDataFromMilvus();

}
}


import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
@Service
public class MilvusService {

@Autowired
VectorStore vectorStore;


public void getDataFromMilvus(){
List<Document> documents = List.of(
new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
new Document("The World is Big and Salvation Lurks Around the Corner"),
new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));


vectorStore.add(documents);

List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));
}

}

Yukarıdaki kodda vectorStore.add dediğimiz anda dokumanlarımızın vektörleri milvus database’imize kaydediliyor. Hemen bir alt satırda ise “Spring” kelimesini search ederek bu kelimeye en yakın 5 dokumanı search ediyoruz.

Bu sonuçları görmek için ATTU tool’unu kullanabilirsiniz.

attu

attu için docker image:

docker run -p 8000:3000 -e MILVUS_URL=localhost:19530 zilliz/attu:v2.3.10

projenin tamamına github hesabımdan ulaşabilirsiniz.

Bug’sız günler.

--

--