Open In Colab GitHub Repository

라마인덱스와 Milvus로 메타데이터 필터링하기

이 노트북에서는 메타데이터 필터링 기능에 초점을 맞춰 LlamaIndex에서 Milvus 벡터 저장소를 사용하는 방법을 설명합니다. 메타데이터로 문서를 색인하고, LlamaIndex에 내장된 메타데이터 필터로 벡터 검색을 수행하고, Milvus의 기본 필터링 표현식을 벡터 스토어에 적용하는 방법을 배우게 됩니다.

이 노트북을 마치면 Milvus의 필터링 기능을 활용하여 문서 메타데이터를 기반으로 검색 결과의 범위를 좁히는 방법을 이해하게 될 것입니다.

전제 조건

설치 종속성

시작하기 전에 다음 종속성이 설치되어 있는지 확인하세요:

$ pip install llama-index-vector-stores-milvus llama-index

Google Colab을 사용하는 경우 런타임을 다시 시작해야 할 수 있습니다(인터페이스 상단의 '런타임' 메뉴로 이동한 후 드롭다운 메뉴에서 '세션 다시 시작'을 선택합니다).

계정 설정하기

이 튜토리얼에서는 텍스트 임베딩 및 답변 생성을 위해 OpenAI를 사용합니다. OpenAI API 키를 준비해야 합니다.

import openai

openai.api_key = "sk-"

Milvus 벡터 스토어를 사용하려면 Milvus 서버 URI (또는 선택적으로 TOKEN)를 지정합니다. 밀버스 서버를 시작하려면 밀버스 설치 가이드에 따라 밀버스 서버를 설정하거나 질리즈 클라우드를 무료로 체험해 보세요.

URI = "./milvus_filter_demo.db"  # Use Milvus-Lite for demo purpose
# TOKEN = ""

데이터 준비

이 예제에서는 제목은 비슷하거나 동일하지만 메타데이터(저자, 장르, 출판 연도)가 다른 몇 권의 책을 샘플 데이터로 사용하겠습니다. 이를 통해 Milvus가 벡터 유사도와 메타데이터 속성을 모두 기반으로 문서를 필터링하고 검색하는 방법을 보여줄 수 있습니다.

from llama_index.core.schema import TextNode

nodes = [
    TextNode(
        text="Life: A User's Manual",
        metadata={
            "author": "Georges Perec",
            "genre": "Postmodern Fiction",
            "year": 1978,
        },
    ),
    TextNode(
        text="Life and Fate",
        metadata={
            "author": "Vasily Grossman",
            "genre": "Historical Fiction",
            "year": 1980,
        },
    ),
    TextNode(
        text="Life",
        metadata={
            "author": "Keith Richards",
            "genre": "Memoir",
            "year": 2010,
        },
    ),
    TextNode(
        text="The Life",
        metadata={
            "author": "Malcolm Knox",
            "genre": "Literary Fiction",
            "year": 2011,
        },
    ),
]

색인 구축

이 섹션에서는 기본 임베딩 모델(OpenAI의 text-embedding-ada-002)을 사용하여 Milvus에 샘플 데이터를 저장합니다. 제목은 텍스트 임베딩으로 변환되어 고밀도 임베딩 필드에 저장되고, 모든 메타데이터는 스칼라 필드에 저장됩니다.

from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.core import StorageContext, VectorStoreIndex


vector_store = MilvusVectorStore(
    uri=URI,
    # token=TOKEN,
    collection_name="test_filter_collection",  # Change collection name here
    dim=1536,  # Vector dimension depends on the embedding model
    overwrite=True,  # Drop collection if exists
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context)
2025-04-22 08:31:09,871 [DEBUG][_create_connection]: Created new connection using: 19675caa8f894772b3db175b65d0063a (async_milvus_client.py:547)

메타데이터 필터

이 섹션에서는 LlamaIndex의 기본 제공 메타데이터 필터와 조건을 Milvus 검색에 적용하겠습니다.

메타데이터 필터 정의하기

from llama_index.core.vector_stores import (
    MetadataFilter,
    MetadataFilters,
    FilterOperator,
)

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="year", value=2000, operator=FilterOperator.GT
        )  # year > 2000
    ]
)

필터를 사용하여 벡터 스토어에서 검색

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
The Life
{'author': 'Malcolm Knox', 'genre': 'Literary Fiction', 'year': 2011}


Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}

여러 메타데이터 필터

여러 메타데이터 필터를 결합하여 더 복잡한 쿼리를 만들 수도 있습니다. LlamaIndex는 ANDOR 조건을 모두 지원하여 필터를 결합할 수 있습니다. 이를 통해 메타데이터 속성에 따라 문서를 보다 정확하고 유연하게 검색할 수 있습니다.

조건 AND

1979년부터 2010년 사이에 출판된 책(특히 1979년 <연도 ≤ 2010년)에 대한 필터링 예제를 사용해 보세요:

from llama_index.core.vector_stores import FilterCondition

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="year", value=1979, operator=FilterOperator.GT
        ),  # year > 1979
        MetadataFilter(
            key="year", value=2010, operator=FilterOperator.LTE
        ),  # year <= 2010
    ],
    condition=FilterCondition.AND,
)

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
Life and Fate
{'author': 'Vasily Grossman', 'genre': 'Historical Fiction', 'year': 1980}


Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}

조건 OR

조지 페렉이나 키스 리차드가 쓴 책을 필터링하는 다른 예제를 사용해 보세요:

filters = MetadataFilters(
    filters=[
        MetadataFilter(
            key="author", value="Georges Perec", operator=FilterOperator.EQ
        ),  # author is Georges Perec
        MetadataFilter(
            key="author", value="Keith Richards", operator=FilterOperator.EQ
        ),  # author is Keith Richards
    ],
    condition=FilterCondition.OR,
)

retriever = index.as_retriever(filters=filters, similarity_top_k=5)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
Life
{'author': 'Keith Richards', 'genre': 'Memoir', 'year': 2010}


Life: A User's Manual
{'author': 'Georges Perec', 'genre': 'Postmodern Fiction', 'year': 1978}

Milvus의 키워드 인수 사용

기본 제공 필터링 기능 외에도 string_expr 키워드 인수를 통해 Milvus의 기본 필터링 표현식을 사용할 수 있습니다. 이를 통해 검색 작업 중에 특정 필터 표현식을 Milvus에 직접 전달하여 표준 메타데이터 필터링을 넘어 Milvus의 고급 필터링 기능에 액세스할 수 있습니다.

Milvus는 벡터 데이터를 정밀하게 쿼리할 수 있는 강력하고 유연한 필터링 옵션을 제공합니다:

  • 기본 연산자: 비교 연산자, 범위 필터, 산술 연산자 및 논리 연산자
  • 필터 표현식 템플릿: 일반적인 필터링 시나리오를 위한 사전 정의된 패턴
  • 특수 연산자: JSON 또는 배열 필드를 위한 데이터 유형별 연산자

Milvus 필터링 표현식에 대한 종합적인 문서와 예제는 Milvus 필터링 공식 문서를 참조하세요.

retriever = index.as_retriever(
    vector_store_kwargs={
        "string_expr": "genre like '%Fiction'",
    },
    similarity_top_k=5,
)
result_nodes = retriever.retrieve("Books about life")
for node in result_nodes:
    print(node.text)
    print(node.metadata)
    print("\n")
The Life
{'author': 'Malcolm Knox', 'genre': 'Literary Fiction', 'year': 2011}


Life and Fate
{'author': 'Vasily Grossman', 'genre': 'Historical Fiction', 'year': 1980}


Life: A User's Manual
{'author': 'Georges Perec', 'genre': 'Postmodern Fiction', 'year': 1978}

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?