메타데이터 필터링

메타데이터 필터링 (Metadata Filtering)

이 페이지에서는 쿼리 시점에 메타데이터 필터를 적용하는 방법을 자세히 설명해요. 인덱싱할 때 문서에 메타데이터를 붙여 두면, 검색할 때 그 메타데이터를 기준으로 결과를 좁힐 수 있어요.

출처: 공식문서

문서를 Document Store에 인덱싱할 때 메타데이터를 붙일 수 있어요. 예를 들어 DocumentLanguageClassifier는 문서 콘텐츠의 언어를 메타데이터에 추가하죠. MetadataRouter 같은 컴포넌트는 그 메타데이터를 기준으로 문서를 라우팅할 수 있어요.

그리고 검색 쿼리에 필터를 적용하면, 특정 기준에 집중해 결과를 좁힐 수 있어요. 이렇게 하면 Retriever가 데이터 중 가장 관련 있는 부분집합에서 답을 가져오게 돼요.

예를 들어 여러 회사의 연례 보고서 모음이 있다고 가정해 볼게요. 특정 연도만, 그리고 소수의 회사만 대상으로 검색하고 싶을 수 있죠. 그러면 Retriever의 작업량도 줄고, 더 관련 있는 결과도 얻을 수 있어요.

필터링 타입

필터는 딕셔너리 또는 중첩 딕셔너리로 정의돼요. 두 가지 타입이 있어요: **Comparison(비교)**과 Logic(논리).

Comparison (비교)

Comparison 연산자는 지정한 조건에 따라 메타데이터 필드를 검색하는 데 도움을 줘요.

비교 딕셔너리는 다음 키를 포함해야 해요.

  • field: 문서의 메타 필드 이름 중 하나, 예: meta.years
  • operator: 다음 중 하나여야 해요.
==
!=
>
>=
<
<=
in
not in

info — 사용 가능한 비교 연산자는 Document Store 통합에 따라 달라질 수 있어요. 예를 들어 ChromaDocumentStorecontainsnot contains라는 두 개의 추가 연산자를 지원해요. 각 통합의 API 레퍼런스에서 지원되는 필터에 대한 자세한 내용을 확인하세요.

  • value: 단일 값 또는(in, not in의 경우) 값의 리스트를 받아요.

예제

다음은 딕셔너리 형태의 간단한 필터예요. 문서의 type 메타 필드에서 "article"로 분류된 문서를 선택해요.

filters = {"field": "meta.type", "operator": "==", "value": "article"}

Logic (논리)

논리 연산자는 중첩 딕셔너리를 만들어 여러 field를 필터 조건으로 적용할 수 있게 해 줘요. 논리 딕셔너리는 다음 키를 포함해야 해요.

  • operator: 보통 다음 중 하나예요.
NOT
OR
AND

info — 사용 가능한 논리 연산자는 Document Store 통합에 따라 달라질 수 있어요. 예를 들어 ChromaDocumentStoreNOT 연산자를 지원하지 않아요. 각 통합의 API 레퍼런스를 확인하세요.

  • conditions: Comparison 또는 Logic 타입의 딕셔너리 리스트여야 해요.

중첩 필터 예제

다음은 Comparison과 Logic을 모두 사용하는 더 복잡한 필터예요. 다음 조건을 만족하는 문서를 찾아요.

  • 메타 필드 type이 "article"이고,
  • 메타 필드 date가 1420066800과 1609455600 사이이고(특정 날짜 범위),
  • 메타 필드 rating이 3 이상이고,
  • 문서가 genre["economy", "politics"]인 것으로 분류되었거나, 메타 필드 publisher가 "nytimes"인 경우.
filters = {
    "operator": "AND",
    "conditions": [
        {"field": "meta.type", "operator": "==", "value": "article"},
        {"field": "meta.date", "operator": ">=", "value": 1420066800},
        {"field": "meta.date", "operator": "<", "value": 1609455600},
        {"field": "meta.rating", "operator": ">=", "value": 3},
        {
            "operator": "OR",
            "conditions": [
                {
                    "field": "meta.genre",
                    "operator": "in",
                    "value": ["economy", "politics"],
                },
                {"field": "meta.publisher", "operator": "==", "value": "nytimes"},
            ],
        },
    ],
}

필터 사용하기

필터는 Retriever 클래스를 통해서 또는 Document Store 내부에서 직접 적용할 수 있어요.

Retriever 클래스에서는 filters 인자로 필터를 전달해요. 파이프라인을 쓸 때는 Pipeline.run()에 필터를 제공할 수 있는데, run이 자동으로 Retriever 클래스로 라우팅해 줘요(파이프라인 작업에 대한 자세한 내용은 pipelines 문서를 참고).

아래 예제는 파이프라인 안에서 Retriever에 필터를 전달하는 방법이에요.

pipeline.run(
    data={
        "retriever": {
            "query": "Why did the revenue increase?",
            "filters": {
                "operator": "AND",
                "conditions": [
                    {"field": "meta.years", "operator": "==", "value": "2019"},
                    {
                        "field": "meta.companies",
                        "operator": "in",
                        "value": ["BMW", "Mercedes"],
                    },
                ],
            },
        },
    },
)

Document Store에서는 해당 통합이 필터링을 지원한다면, filter_documents 메서드로 저장된 문서에 필터를 적용해요.

아래 예제는 QdrantDocumentStore에 필터를 전달하는 방법이에요.

filters = {
    "operator": "AND",
    "conditions": [
        {"field": "meta.type", "operator": "==", "value": "article"},
        {"field": "meta.genre", "operator": "in", "value": ["economy", "politics"]},
    ],
}

results = QdrantDocumentStore.filter_documents(filters=filters)

추가 참고 자료

더 알아보기 (Learn more)