메타데이터 필터링
메타데이터 필터링 (Metadata Filtering)
이 페이지에서는 쿼리 시점에 메타데이터 필터를 적용하는 방법을 자세히 설명해요. 인덱싱할 때 문서에 메타데이터를 붙여 두면, 검색할 때 그 메타데이터를 기준으로 결과를 좁힐 수 있어요.
출처: 공식문서
문서를 Document Store에 인덱싱할 때 메타데이터를 붙일 수 있어요. 예를 들어 DocumentLanguageClassifier는 문서 콘텐츠의 언어를 메타데이터에 추가하죠. MetadataRouter 같은 컴포넌트는 그 메타데이터를 기준으로 문서를 라우팅할 수 있어요.
그리고 검색 쿼리에 필터를 적용하면, 특정 기준에 집중해 결과를 좁힐 수 있어요. 이렇게 하면 Retriever가 데이터 중 가장 관련 있는 부분집합에서 답을 가져오게 돼요.
예를 들어 여러 회사의 연례 보고서 모음이 있다고 가정해 볼게요. 특정 연도만, 그리고 소수의 회사만 대상으로 검색하고 싶을 수 있죠. 그러면 Retriever의 작업량도 줄고, 더 관련 있는 결과도 얻을 수 있어요.
필터링 타입
필터는 딕셔너리 또는 중첩 딕셔너리로 정의돼요. 두 가지 타입이 있어요: **Comparison(비교)**과 Logic(논리).
Comparison (비교)
Comparison 연산자는 지정한 조건에 따라 메타데이터 필드를 검색하는 데 도움을 줘요.
비교 딕셔너리는 다음 키를 포함해야 해요.
field: 문서의 메타 필드 이름 중 하나, 예:meta.yearsoperator: 다음 중 하나여야 해요.
==
!=
>
>=
<
<=
in
not in
info — 사용 가능한 비교 연산자는 Document Store 통합에 따라 달라질 수 있어요. 예를 들어
ChromaDocumentStore는contains와not contains라는 두 개의 추가 연산자를 지원해요. 각 통합의 API 레퍼런스에서 지원되는 필터에 대한 자세한 내용을 확인하세요.
value: 단일 값 또는(in, not in의 경우) 값의 리스트를 받아요.
예제
다음은 딕셔너리 형태의 간단한 필터예요. 문서의 type 메타 필드에서 "article"로 분류된 문서를 선택해요.
filters = {"field": "meta.type", "operator": "==", "value": "article"}
Logic (논리)
논리 연산자는 중첩 딕셔너리를 만들어 여러 field를 필터 조건으로 적용할 수 있게 해 줘요. 논리 딕셔너리는 다음 키를 포함해야 해요.
operator: 보통 다음 중 하나예요.
NOT
OR
AND
info — 사용 가능한 논리 연산자는 Document Store 통합에 따라 달라질 수 있어요. 예를 들어
ChromaDocumentStore는NOT연산자를 지원하지 않아요. 각 통합의 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)