> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nora.my/llms.txt
> Use this file to discover all available pages before exploring further.

# 필터

> 메타데이터로 리트리벌 후보를 좁힙니다. 태그, 소스, 날짜, 엔티티

필터는 랭킹 **전에** 돕니다. 기준에 맞는 청크만 남겨 후보 풀을 줄이고, 랭킹이 좁혀진 세트에서 일하게 합니다.

## 무엇으로 거를 수 있나

강화한 청크는 모두 메타데이터를 가집니다. 흔히 이런 필드로 거릅니다.

* **Tags** 자동 태그 강화기가 붙인 태그.
* **Source** 어느 문서·폴더·데이터베이스 행인지.
* **Path** 헤딩 경로나 폴더 위치.
* **Language** 청크의 감지된 언어.
* **Entities** 뽑아낸 사람·조직·제품.
* **Modified date** 소스를 마지막으로 고친 때.
* **Custom fields** 인라인 강화기가 쓴 것.

필드는 [Enrich 단계](/ko/build/foundry/enrich)에서 더합니다.

## 필터 표현식

필터는 JSON 같은 술어로 씁니다. 예를 들면 이렇습니다.

```json theme={null}
{ "tag": "billing" }
```

```json theme={null}
{ "tag": { "$in": ["billing", "pricing"] } }
```

```json theme={null}
{ "modified_at": { "$gte": "2026-01-01" } }
```

```json theme={null}
{ "$and": [
  { "tag": "customer-facing" },
  { "language": "en" },
  { "not": { "tag": "deprecated" } }
] }
```

연산자는 `$eq`, `$ne`, `$in`, `$nin`, `$gt`, `$gte`, `$lt`, `$lte`, `$contains`, `$startsWith`, `$exists`, `$and`, `$or`, `$not` 입니다.

## 세 층의 필터

필터는 층끼리 합쳐집니다. 위 층에서 정한 것이 아래 층 모두에 적용됩니다.

1. **데이터 소스 층** 문서 컬렉션에 붙입니다. 그 컬렉션에 대한 모든 쿼리에 적용됩니다.
2. **프리셋 층** 리트리벌 프리셋 안입니다. 그 프리셋을 쓰는 모든 Agent에 적용됩니다.
3. **쿼리 층** 호출마다, 런타임에 정합니다. Agent가 특별한 도구 인자로, 또는 여러분 코드로요.

런타임 필터는 프리셋 필터에 합쳐집니다(둘 다 맞아야 합니다). 이렇게 하면 "고객 대상 문서만 검색 가능" 을 시스템 룰로 드러내지 않고도 Agent가 더 좁힐 수 있습니다.

## 변수로 만드는 동적 필터

필터는 Flow 변수를 참조할 수 있습니다.

```json theme={null}
{ "department": "{vars.CURRENT_USER_DEPT}" }
```

흔한 방법은 테넌트별 스코핑입니다. 실행 시작 때 변수를 요청자의 테넌트 ID로 두면, 모든 리트리벌이 자동으로 스코프됩니다.

## 테스트

프리셋 **Test** 패널에서 런타임 필터를 걸고 결과가 어떻게 바뀌는지 봅니다. 배포 전에 접근 통제를 확인하기 좋습니다.

## 성능

인덱스된 필드(태그, 소스, 날짜)로 거는 필터는 공짜입니다. 인덱스 스캔 때 함께 돕니다. 인덱스 안 된 커스텀 필드 필터는 가져온 뒤 훑는 방식이라, 컬렉션이 커질수록 느려집니다. 컬렉션 설정에서 자주 쓰는 필터 필드에 인덱스를 더하세요.
