밀버스 텍스트 임베딩 기능과 LangChain 통합하기

Open In Colab GitHub Repository

이 가이드는 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}

시맨틱 검색(텍스트 임베딩)과 키워드 검색(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는 강력한 벡터 검색 기능을 제공합니다.