밀버스 텍스트 임베딩 기능과 LangChain 통합하기
이 가이드는 Milvus 2.6의 텍스트 임베딩 기능 (데이터 인 데이터 아웃이라고도 함)을 LangChain과 함께 사용하는 방법을 설명합니다. 이 기능을 사용하면 Milvus 서버가 원시 텍스트를 벡터 임베딩으로 자동 변환하여 클라이언트 측 코드를 간소화하고 API 키 관리를 중앙 집중화할 수 있습니다.
Milvus는 세계에서 가장 진보된 오픈 소스 벡터 데이터베이스로, 유사도 검색 및 AI 애플리케이션 임베딩을 지원하기 위해 특별히 구축되었습니다. LangChain은 대규모 언어 모델(LLM)로 구동되는 애플리케이션을 개발하기 위한 프레임워크입니다. Milvus의 텍스트 임베딩 기능을 통합하면 LangChain 애플리케이션에서 보다 간단하고 효율적인 벡터 검색 솔루션을 구현할 수 있습니다.
전제 조건
이 튜토리얼을 실행하기 전에 다음 종속성을 설치했는지 확인하세요:
! pip install --upgrade langchain-milvus langchain-core langchain-openai
Google Colab을 사용하는 경우, 방금 설치한 종속성을 활성화하려면 런타임을 다시 시작해야 할 수 있습니다(화면 상단의 "런타임" 메뉴를 클릭하고 드롭다운 메뉴에서 "세션 다시 시작"을 선택합니다).
Milvus 서버 구성하기
중요: 텍스트 임베딩 기능(데이터 인 데이터 아웃)은 Milvus 서버에서만 사용할 수 있습니다. Milvus Lite는 이 기능을 지원하지 않습니다. 도커/쿠버네티스와 함께 배포된 Milvus 서버를 사용해야 합니다.
텍스트 임베딩 기능을 사용하기 전에 Milvus 서버에서 서비스 제공업체 임베딩을 위한 자격 증명을 구성해야 합니다.
자격 증명 아래에 키를 선언합니다:
하나 또는 여러 개의 API 키를 나열할 수 있으며, 각각에 나중에 참조할 레이블을 지정할 수 있습니다.
# milvus.yaml
credential:
apikey_dev:
apikey: <YOUR_OPENAI_API_KEY>
Milvus에 OpenAI 호출에 사용할 키를 알려주세요.
동일한 파일에서 OpenAI 제공업체가 사용할 레이블을 가리키도록 합니다.
function:
textEmbedding:
providers:
openai:
credential: apikey_dev
# url: https://api.openai.com/v1/embeddings # (optional) custom url
자세한 구성 방법은 Milvus 임베딩 함수 문서를 참조하세요.
Milvus 서비스 시작하기
Milvus 서버가 실행 중이고 임베딩 기능이 활성화되어 있는지 확인합니다. Docker 또는 Kubernetes를 사용하여 Milvus 서버를 배포할 수 있습니다. 참고: Milvus Lite는 텍스트 임베딩 기능을 지원하지 않습니다.
임베딩 이해하기: 클라이언트 측과 서버 측
사용법을 살펴보기 전에 먼저 두 가지 임베딩 접근 방식의 차이점을 이해해 보겠습니다.
LangChain의 Embeddings 클래스를 사용한 임베딩(클라이언트 측)
전통적인 LangChain 접근 방식에서는 Embeddings 클래스를 사용하여 클라이언트 측에서 임베딩 생성이 이루어집니다. 애플리케이션은 클래스의 embed_query 메서드를 사용하여 임베딩 API를 호출한 다음, 생성된 벡터를 Milvus에 저장해야 합니다.
from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus
# Generate embedding on client side
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("Hello, world!")
# [0.123, -0.456, ...] A vector of floats
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="traditional_approach_collection",
)
시퀀스 다이어그램:
특징:
- 클라이언트가 임베딩 API를 직접 호출
- 클라이언트 측에서 API 키를 관리해야 함
- 데이터 흐름: 텍스트 → 클라이언트 → 임베딩 API → 벡터 → 밀버스
Milvus 텍스트 임베딩 기능 (서버 측 데이터 인 데이터 아웃)
밀버스 2.6의 텍스트 임베딩 기능(데이터 인 데이터 아웃)은 밀버스 서버가 원시 텍스트를 벡터 임베딩으로 자동 변환할 수 있는 기능입니다. 클라이언트는 텍스트만 제공하면 Milvus가 임베딩 생성을 자동으로 처리합니다.
시퀀스 다이어그램:
특징:
- Milvus 서버가 임베딩 API 호출
- API 키는 서버 측에서 중앙에서 관리합니다.
- 데이터 흐름: 텍스트 → Milvus → 임베딩 API → 벡터(Milvus에 저장)
두 가지 방법 비교
| 특징 | LangChain 임베딩 (클라이언트 측) | 밀버스 텍스트 임베딩 기능 (서버 측) |
|---|---|---|
| 처리 위치 | 클라이언트 애플리케이션 | 밀버스 서버 |
| API 호출 | 클라이언트가 직접 임베딩 API 호출 | 밀버스 서버가 임베딩 API 호출 |
| API 키 관리 | 클라이언트 측에서 관리 필요 | 서버 측에서 중앙 관리, 보안 강화 |
| 코드 복잡성 | 클라이언트 측에서 API 키와 호출을 관리해야 함 | Milvus 설정에서 한 번만 구성하면 됩니다. |
| 사용 사례 | - 임베딩 프로세스에 대한 클라이언트 측 제어가 필요한 경우 - 클라이언트 측에서 임베딩 결과를 캐시해야 하는 경우 - 여러 임베딩 모델 전환을 지원해야 하는 경우 | - 클라이언트 측 코드 간소화 - 서버 측에서 API 키를 중앙에서 관리해야 함 - 대량의 문서를 일괄 처리해야 하는 경우 - 외부 API와의 클라이언트 측 상호 작용을 줄이고자 하는 경우 - BM25와 같은 Milvus 기본 제공 기능과 결합해야 하는 경우 |
| Milvus 버전 요구 사항 | 모든 버전(Milvus Lite 포함) | Milvus Lite는 지원되지 않음 |
이 튜토리얼에서는 클라이언트 측 코드를 대폭 간소화하고 보안을 강화할 수 있는 Milvus 2.6에 도입된 새로운 기능인 Milvus서버 측 텍스트 임베딩 함수(Data In Data Out) 방법을 주로 소개합니다.
텍스트 임베딩 함수 사용
예시 1: 서버 측 임베딩만 사용
가장 간단한 사용 사례로, 임베딩을 생성하기 위해 Milvus 서버에 전적으로 의존합니다. 클라이언트에는 임베딩 기능이 필요하지 않습니다.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction
from langchain_core.documents import Document
# Create Text Embedding Function
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text", # Input field name (field containing text)
output_field_names="vector", # Output field name (field storing vectors)
dim=1536, # Vector dimension (must specify)
params={
"provider": "openai", # Service provider
"model_name": "text-embedding-3-small", # Model name
"credential": "apikey_dev", # Optional: use credential label configured in milvus.yaml
},
)
# Create Milvus vector store
# Note: embedding_function=None, because embedding is done on server side
vector_store = Milvus(
embedding_function=None, # Do not use client-side embedding
builtin_function=text_embedding_func,
connection_args={"uri": "http://localhost:19530"},
collection_name="my_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
connection_args 의 경우:
- Milvus 서버를 사용해야 합니다: 텍스트 임베딩 기능 기능은 밀버스 서버에서만 사용할 수 있으며, 밀버스 라이트는 지원되지 않습니다.
http://localhost:19530(로컬 Docker 배포) 또는http://your-server:19530(원격 서버)와 같은 서버 URL을 사용하세요.- 질리즈 클라우드를 사용하는 경우, 퍼블릭 엔드포인트를
uri로 사용하고token파라미터를 설정합니다.
문서를 추가할 때는 벡터를 미리 계산할 필요 없이 텍스트만 입력하면 됩니다. 밀버스는 자동으로 OpenAI API를 호출하여 임베딩을 생성합니다.
# Add documents (only need to provide text, no need to pre-compute vectors)
documents = [
Document(page_content="Milvus simplifies semantic search through embeddings."),
Document(
page_content="Vector embeddings convert text into searchable numeric data."
),
Document(
page_content="Semantic search helps users find relevant information quickly."
),
]
vector_store.add_documents(documents)
[462726375729313252, 462726375729313253, 462726375729313254]
검색 중에 직접 텍스트 쿼리를 사용하면 Milvus가 자동으로 쿼리 텍스트를 벡터로 변환하여 검색합니다.
# Search (directly use text query)
results = vector_store.similarity_search(
query="How does Milvus handle semantic search?", k=2
)
for doc in results:
print(f"Content: {doc.page_content}")
print(f"Metadata: {doc.metadata}\n")
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1765186679.227345 12227536 fork_posix.cc:71] Other threads are currently calling into gRPC, skipping fork() handlers
Content: Milvus simplifies semantic search through embeddings.
Metadata: {'pk': 462726375729313252}
Content: Semantic search helps users find relevant information quickly.
Metadata: {'pk': 462726375729313254}
예 2: 텍스트 임베딩과 BM25의 결합(하이브리드 검색)
시맨틱 검색(텍스트 임베딩)과 키워드 검색(BM25)을 결합하면 더욱 강력한 하이브리드 검색 기능을 사용할 수 있습니다. 시맨틱 검색은 쿼리 의도를 이해하는 데 탁월한 반면, 키워드 검색은 정확히 일치하는 데 탁월합니다.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction, BM25BuiltInFunction
# Text Embedding Function (semantic search)
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text",
output_field_names="vector_dense",
dim=1536,
params={
"provider": "openai",
"model_name": "text-embedding-3-small",
},
)
# BM25 Function (keyword search)
bm25_func = BM25BuiltInFunction(
input_field_names="text",
output_field_names="vector_sparse",
)
# Create Milvus vector store
vector_store = Milvus(
embedding_function=None,
builtin_function=[text_embedding_func, bm25_func],
connection_args={"uri": "http://localhost:19530"},
vector_field=["vector_dense", "vector_sparse"],
collection_name="hybrid_search_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
# Add documents
documents = [
Document(page_content="Machine learning and artificial intelligence"),
Document(page_content="The cat sat on the mat"),
]
vector_store.add_documents(documents)
[462726375729313255, 462726375729313256]
WeightedRanker 에서 시맨틱 검색과 키워드 검색의 가중치를 제어할 수 있습니다. 가중치가 높으면 검색 결과가 시맨틱 유사성에 더 편중되고, 가중치가 낮으면 검색 결과가 키워드 일치에 더 편중됩니다.
# Hybrid search, use WeightedRanker to control weights
# 70% semantic search, 30% keyword search
results = vector_store.similarity_search(
query="AI technology",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.7, 0.3]},
)
# If you want to be more biased towards keyword matching, you can adjust weights
# 30% semantic search, 70% keyword search
results_keyword_focused = vector_store.similarity_search(
query="cat mat",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.3, 0.7]},
)
results
[Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence'),
Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat')]
results_keyword_focused
[Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat'),
Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence')]
요약
축하합니다! 여러분은 LangChain에서 Milvus의 텍스트 임베딩 기능(데이터 인 데이터 아웃) 기능을 사용하는 방법을 배웠습니다. 임베딩 생성을 서버 측으로 이전함으로써 클라이언트 측 코드를 간소화하고, API 키를 중앙에서 관리하며, 하이브리드 검색을 쉽게 구현할 수 있습니다. 텍스트 임베딩 기능 및 BM25와 결합된 Milvus는 강력한 벡터 검색 기능을 제공합니다.