LangChain 및 LlamaIndex를 사용하여 Milvus Lite에 연결하는 방법
Milvus Lite는 불과 일주일 전인 5월 31일에 출시되었으며, 이제 LangChain 및 LlamaIndex와 같은 서드파티 커넥터가 인기 있는 오픈 소스 벡터 데이터베이스인 Milvus에 연결하는 기본 방법입니다.
| 방법 | 검색 프로세스에 대한 제어 수준 | 시간(초) |
| LlamaIndex | 제어 불가 | 2156 |
| LangChain | 완전한 제어 | 8 |
| Milvus Lite API | 완전한 제어 | 28 |
표: 동일한 HuggingFace 임베딩 모델(BAAI/bge-large-en-v1.5)과 동일한 HTML 데이터 파일을 사용한 소요 시간.
결과는? Milvus 설정에 대한 높은 제어력과 빠른 설정 간의 최적의 균형을 찾고 있다면, Milvus Lite API를 직접 사용하는 것이 최적의 선택입니다. 전체 코드와 소요 시간은 제 GitHub에서 확인할 수 있습니다.
다음 섹션에서는 다음 내용을 다룹니다.
LlamaIndex를 사용하여 Milvus Lite에 연결하기
LangChain을 사용하여 Milvus Lite에 연결하기
Milvus API를 사용하여 Milvus Lite에 연결하기
LlamaIndex를 사용하여 Milvus Lite에 연결하기
LlamaIndex를 사용하면 쉽게 시작할 수 있습니다. 연결하고 컬렉션을 생성하는 데 약 2000초가 걸립니다.
from pymilvus import MilvusClient
from llama_index.core import (
Settings,
ServiceContext,
StorageContext,
VectorStoreIndex,
)
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.vector_stores.milvus import MilvusVectorStore
# 1. Define the embedding model.
service_context = ServiceContext.from_defaults(
# LlamaIndex local: translates to the same location as default HF cache.
embed_model="local:BAAI/bge-large-en-v1.5")
# LlamaIndex hides this but we need it to create the vector store!
EMBEDDING_DIM = 1024
# 2. Create a Milvus collection from the documents and embeddings.
milvus_client = MilvusClient()
vector_store = MilvusVectorStore(
client=milvus_client,
dim=EMBEDDING_DIM,
overwrite=True
)
storage_context = StorageContext.from_defaults(
vector_store=vector_store
)
llamaindex = VectorStoreIndex.from_documents(
# Chunk, embed, insert too slow! Just use one document.
docs[:1],
storage_context=storage_context,
service_context=service_context
)
LangChain을 사용하여 Milvus Lite에 연결하기
LangChain에서 쉽게 시작할 수 있습니다. 연결하고 컬렉션을 생성하는 데 약 8초가 걸립니다.
from langchain_milvus import Milvus
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. Define the embedding model.
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
embed_model = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs)
EMBEDDING_DIM = embed_model.dict()['client'].get_sentence_embedding_dimension()
# 2. Create a Milvus collection from the documents and embeddings.
start_time = time.time()
vectorstore = Milvus.from_documents(
documents=docs,
embedding=embed_model,
connection_args={
"uri": "./milvus_demo.db",},
# Override LangChain default values for Milvus.
consistency_level="Eventually",
drop_old=True,
index_params = {
"metric_type": "COSINE",
"index_type": "AUTOINDEX",
"params": {}}
)
Milvus Lite API를 사용하여 Milvus Lite에 연결하기
하지만 내부에서는 무슨 일이 일어나고 있을까요? 실제 단계를 나누어 보고 기본값을 더 명확히 해 보겠습니다:
Milvus Lite 서버를 시작하고 연결합니다.
임베딩 모델을 선택합니다.
Milvus 데이터베이스 컬렉션을 생성합니다.
스키마를 정의합니다.
인덱스(Approximate Nearest Neighbor 검색을 위한 데이터 구조)를 선택합니다.
거리 메트릭(벡터 공간에서 “가까움”의 정의)을 선택합니다.
데이터 삽입을 위한 일관성 수준을 선택합니다.
청킹 전략을 선택합니다.
임베딩 모델 추론을 사용하여 데이터 청크를 벡터로 변환합니다.
벡터 데이터를 Milvus에 삽입합니다.
다음은 Milvus Lite API를 직접 사용하는 Python 코드입니다. 연결하고 컬렉션을 생성하는 데 약 28초가 걸립니다.
import pymilvus
# STEP 1. CONNECT A CLIENT TO LIGHT MILVUS PYTHON SERVER.
from pymilvus import MilvusClient
mc = MilvusClient("milvus_demo.db")
# STEP 2. DOWNLOAD AN OPEN SOURCE EMBEDDING MODEL.
from sentence_transformers import SentenceTransformer
model_name = "BAAI/bge-large-en-v1.5"
encoder = SentenceTransformer(model_name, device=’cpu’)
# STEP 3. CREATE A MILVUS COLLECTION AND DEFINE THE DATABASE INDEX.
# Uses Milvus AUTOINDEX, which defaults to HNSW.
COLLECTION_NAME = "MilvusDocs"
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,)
# STEP 4. CHUNK DATA INTO VECTORS.
from langchain_community.document_transformers import BeautifulSoupTransformer
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Define chunk size and overlap.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Split the documents into recursive, overlapping chunks.
child_splitter = RecursiveCharacterTextSplitter(
chunk_size = chunk_size,
chunk_overlap = chunk_overlap,
length_function = len, # use built-in Python len function)
chunks = child_splitter.split_documents(docs)
# STEP 5. TRANSFORM CHUNKS INTO VECTORS USING EMBEDDING MODEL INFERENCE.
list_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]
embeddings = torch.tensor(encoder.encode(list_of_strings))
# STEP 6. INSERT CHUNK LIST INTO MILVUS.
# First, create chunk_list and dict_list.
dict_list = []
for chunk, sparse, dense in zip(chunks, embeddings["sparse"], embeddings["dense"]):
chunk_dict = {
'chunk': chunk.page_content,
'source': chunk.metadata.get('source', ""),
'vector': dense
}
dict_list.append(chunk_dict)
mc.insert(
COLLECTION_NAME,
data=dict_list,
progress_bar=True)
적합한 Milvus Light 방법 선택하기
다양한 Milvus Lite API는 편의성을 제공하지만, 검색 및 청킹 방법에 대한 제어와 속도 측면에서 트레이드오프가 있습니다.
Milvus Lite API를 직접 사용하면 Milvus 검색 설정에 대한 최고 수준의 제어와 가장 빠른 컬렉션 생성 속도의 균형을 얻을 수 있습니다.
리소스 및 추가 자료
계속 읽기

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.

Vector Databases vs. Object-Relational Databases
Use a vector database for AI-powered similarity search; use an object-relational database for complex data modeling with both relational integrity and object-oriented features.



