문서는 어떻게 검색 대상이 되는가
Amazon Bedrock Knowledge Bases에서 문서는 데이터 소스를 동기화(수집 작업)해야 검색 대상이 됩니다. 동기화는 증분 방식이라 지난 동기화 이후 추가·수정·삭제된 문서만 처리하므로, 원본을 고친 뒤 동기화하지 않으면 검색 결과는 예전 상태로 남습니다. 수집이 끝나면 그 내용은 원본 시스템의 문서 권한과 관계없이 검색 권한(bedrock:Retrieve)을 가진 누구나 조회할 수 있으므로, 사용자별 접근 제어는 별도로 설계해야 합니다.
가상의 사내 안내 도우미를 예로 데이터 소스 유형, 동기화와 직접 수집의 차이, 문서 삭제가 검색 결과에 반영되는 방식과 삭제 정책, 수집 작업 상태 해석과 실패 원인, 원본 권한과 검색 권한의 차이를 설명합니다.
S3·외부 서비스·웹·사용자 정의 연결
데이터 소스는 Knowledge Base가 문서를 가져오는 연결입니다. 연결할 수 있는 유형은 Knowledge Base 구성 방식에 따라 다릅니다. 관리형(Bedrock Managed)은 S3, SharePoint, Confluence, 웹 크롤러, Google Drive, OneDrive, 사용자 정의 커넥터를 지원하고, 고객 관리형(Customer-managed)은 S3와 사용자 정의 커넥터를 지원합니다.
| 유형 | 문서를 가져오는 방식 | 맞는 경우 |
|---|---|---|
| S3 | 버킷의 지정 위치를 동기화할 때 읽음 | 문서를 파일로 모아 두고 정기적으로 반영 |
| 외부 서비스(SharePoint·Confluence 등) | 커넥터가 서비스에 접속해 크롤링 | 협업 도구의 문서를 옮기지 않고 연결(관리형) |
| 웹 크롤러 | 지정한 웹 페이지를 크롤링 | 공개 안내 페이지를 검색 대상으로 삼음(관리형) |
| 사용자 정의 | 애플리케이션이 API로 문서를 직접 넣음 | 사용자가 올린 파일처럼 실행 중에 생기는 문서 |
Confluence 같은 외부 서비스 커넥터는 각 서비스가 제공하는 변경 추적 기능을 이용해 바뀐 내용만 가져올 수 있습니다. 첫 동기화에서는 기본적으로 전체 내용을 크롤링합니다. 서비스별 인증 정보와 크롤링 범위 설정은 커넥터마다 다르므로 해당 커넥터 문서를 따릅니다.
전체 수집과 변경 반영
S3나 외부 서비스 데이터 소스는 문서를 추가·수정·삭제할 때마다 동기화해야 Knowledge Base에 반영됩니다. 동기화는 증분 방식이라 지난 동기화 이후 바뀐 문서만 처리합니다. 바뀐 문서는 파싱·분할·임베딩·인덱싱을 처음부터 다시 거칩니다. 데이터 소스 동기화
| 원본 상태 | 동기화 결과 |
|---|---|
| 바뀌지 않음 | 건너뜀 |
| 내용이나 메타데이터 변경 | 다시 파싱·분할·임베딩·인덱싱 |
| 새 문서 추가 | 새 문서만 수집 |
| 문서 삭제 | 벡터 저장소에서 제거 |
동기화는 콘솔의 Sync 버튼이나 StartIngestionJob API로 시작합니다. 아래 Python 구성 예시는 수집 작업을 시작하고 작업 ID를 받아 둡니다. KB_ID와 DATA_SOURCE_ID는 사용할 Knowledge Base와 데이터 소스의 ID로, SOURCE_REGION은 Knowledge Base가 있는 리전으로 바꿉니다. 실행하려면 bedrock:StartIngestionJob 권한이 필요하고, 결과 조회에는 bedrock:GetIngestionJob 권한이 필요합니다.
agent = boto3.client("bedrock-agent", region_name="SOURCE_REGION")
job = agent.start_ingestion_job(
knowledgeBaseId="KB_ID",
dataSourceId="DATA_SOURCE_ID",
)["ingestionJob"]
print(job["ingestionJobId"], job["status"])
수집 작업은 비동기로 실행되므로 이 호출이 끝났다고 문서가 검색되는 것은 아닙니다. 작업이 완료될 때까지 기다린 뒤 결과를 확인해야 하며, 이는 4섹션에서 다룹니다. 원본이 자주 바뀐다면 문서 변경 이벤트나 정해진 일정에 맞춰 이 API를 호출하는 작업을 직접 구성합니다. 고객 관리형에서는 다시 처리한 문서만큼 임베딩 모델 호출 비용이 생기므로, 증분 동기화라도 불필요하게 자주 실행하지 않습니다.
사용자 정의 데이터 소스는 동기화 대신 IngestKnowledgeBaseDocuments API로 문서를 바로 넣습니다. 문서 ID를 애플리케이션이 직접 정하므로, 같은 ID로 다시 넣으면 새 문서가 추가되지 않고 기존 문서가 갱신됩니다. 일부만 고치는 방식은 없고 수정할 때마다 문서 전체를 다시 수집합니다. 사용자가 실행 중에 올리는 파일처럼 정기 동기화로 다루기 어려운 문서에 맞습니다.
문서 삭제와 검색 결과의 관계
원본에서 문서를 지워도 검색 결과에서 바로 사라지지는 않습니다. S3나 외부 서비스 데이터 소스는 다음 동기화 때 삭제가 반영되어 벡터 저장소에서 제거됩니다. 예를 들어 폐지된 휴게실 안내문을 S3에서 지운 뒤 동기화하지 않으면, 도우미는 계속 그 안내문을 근거로 답할 수 있습니다. 사용자 정의 데이터 소스로 직접 넣은 문서는 동기화로 지워지지 않으므로, 삭제 API로 명시적으로 지울 때까지 남습니다.
데이터 소스나 Knowledge Base 자체를 삭제할 때는 데이터 삭제 정책(data deletion policy)이 적용됩니다. 이 정책은 그 데이터 소스에서 만들어진 벡터 데이터를 지울지 남길지 정합니다. CreateDataSource API
| 정책 | 데이터 소스·Knowledge Base 삭제 시 | 주의할 점 |
|---|---|---|
| DELETE | 그 데이터 소스에서 만든 벡터 데이터를 삭제 | 벡터 저장소 자체는 삭제되지 않음 |
| RETAIN | 벡터 데이터를 벡터 저장소에 남김 | 남은 데이터는 직접 정리해야 함 |
관리형 Knowledge Base는 DELETE만 지원하며 기본값도 DELETE입니다. 고객 관리형에서 RETAIN을 고르면, Bedrock 리소스를 지운 뒤에도 벡터 저장소에 문서 조각이 남습니다. 민감한 문서를 다뤘다면 남은 데이터를 어떻게 정리할지 미리 정해 둡니다. 어느 정책이든 벡터 저장소를 직접 만들었다면 저장소 자체는 따로 삭제해야 비용이 멈춥니다.
수집 작업 상태와 실패 원인
수집 작업의 결과는 GetIngestionJob API나 콘솔의 동기화 기록에서 확인합니다. 응답에는 작업 상태(status), 문서별 처리 통계(statistics), 실패 사유 목록(failureReasons)이 있습니다. GetIngestionJob API
앞에서 시작한 작업의 결과를 조회하는 예시입니다. job은 2섹션 예시에서 받은 값입니다.
knowledgeBaseId="KB_ID",
dataSourceId="DATA_SOURCE_ID",
ingestionJobId=job["ingestionJobId"],
)["ingestionJob"]
stats = result.get("statistics", {})
print(result["status"], stats.get("numberOfDocumentsScanned"), stats.get("numberOfDocumentsFailed"))
for reason in result.get("failureReasons", []):
print(reason)
작업 상태가 완료(COMPLETE)로 나와도 모든 문서가 들어갔다는 뜻은 아닙니다. 상태는 작업 전체의 진행 결과이고, 개별 문서의 실패는 통계에 따로 집계됩니다. 그래서 상태와 함께 다음 통계를 봅니다.
numberOfDocumentsScanned: 이번 작업에서 확인한 원본 문서 수numberOfNewDocumentsIndexed·numberOfModifiedDocumentsIndexed: 새로 들어가거나 갱신된 문서 수numberOfDocumentsSkipped: 바뀌지 않아 건너뛴 문서 수numberOfDocumentsDeleted: 원본 삭제가 반영된 문서 수numberOfDocumentsFailed: 수집에 실패한 문서 수
예를 들어 시설 안내 문서 10개를 올렸는데 작업이 실패하거나 확인한 문서 수가 0이라면, 실패 사유와 함께 서비스 역할의 S3 읽기 권한과 데이터 소스의 경로 설정을 먼저 확인합니다. 확인한 문서는 10개인데 실패가 3개라면 그 문서들의 파일 형식이나 크기, 파싱 문제를 실패 사유에서 찾습니다. 수집은 됐는데 원하는 내용이 검색되지 않는다면 수집이 아니라 분할이나 검색 설정의 문제일 수 있으며, 이는 26·28편에서 다룹니다.
원본 접근 권한과 검색 권한의 차이
가장 오해하기 쉬운 부분은 권한입니다. 원본 시스템에서 문서마다 열람 권한을 걸어 두었더라도, 동기화로 수집된 내용은 검색 권한(bedrock:Retrieve)을 가진 누구나 조회할 수 있습니다. 공식 문서도 원본에서 권한이 제한된 데이터까지 여기에 포함될 수 있다고 안내합니다. 원본 권한은 서비스 역할이 문서를 읽을 수 있는지를 정할 뿐, 검색하는 사용자가 누구인지는 따지지 않습니다. 커넥터 권한 안내(Confluence 예)
예를 들어 인사팀만 볼 수 있는 급여 규정을 일반 안내 문서와 같은 Knowledge Base에 수집하면, 사내 안내 도우미를 쓰는 모든 직원의 질문에 급여 규정이 근거로 검색될 수 있습니다. 이를 막는 방법은 구성 방식에 따라 다릅니다.
- 공개 범위별로 Knowledge Base 분리: 전 직원용과 인사팀용을 따로 만들고, 애플리케이션이 사용자에 따라 호출할 Knowledge Base를 고릅니다. 가장 단순하고 경계가 분명합니다.
- 메타데이터 필터: 문서마다 공개 범위 같은 메타데이터를 붙이고, 애플리케이션이 로그인한 사용자에 맞는 필터를 검색 요청에 넣습니다. S3 데이터 소스에서는 문서 옆에 같은 이름의
.metadata.json파일을 둡니다. - 관리형 KB의 ACL 인식 검색: 지원 커넥터에서 ACL 인식을 켜면 원본의 사용자·그룹 권한을 문서와 함께 수집하고, 검색할 때 전달한 사용자 정보에 맞는 문서만 돌려줍니다. ACL 설정은 데이터 소스를 만들 때 정해야 하며 나중에 켜거나 끌 수 없습니다.
아래는 S3에 둔 시설안내.docx 옆에 함께 올리는 메타데이터 파일의 구성 예시입니다. 파일 이름은 원본 파일 이름 뒤에 .metadata.json을 붙인 형태이며, 속성 이름과 값은 가상의 예시입니다.
"metadataAttributes": {
"audience": "all",
"department": "facility"
}
}
어느 방법이든 사용자를 확인하는 책임은 애플리케이션에 있습니다. 메타데이터 필터는 애플리케이션이 넣은 조건대로만 걸러지고, 관리형 KB의 ACL 인식 검색도 전달받은 사용자 정보가 진짜인지 확인하지 않습니다. 공식 문서는 ACL 인식 검색이 보안 경계가 아니므로, 앞단의 사용자 인증 없이 이것만으로 접근을 통제하지 말라고 안내합니다. 즉 사용자 인증은 애플리케이션이 하고, Knowledge Base는 인증된 사용자 정보로 결과를 거르는 역할만 맡습니다.
'AI' 카테고리의 다른 글
| Knowledge Bases 구성 선택: 관리형 저장소와 직접 선택한 저장소 | Bedrock 24편 (0) | 2026.11.04 |
|---|---|
| RAG란 무엇인가: 모델이 외부 지식으로 답하는 구조 | Bedrock 23편 (0) | 2026.11.03 |
| 프롬프트 캐싱과 긴 입력 관리: 반복 처리 비용 줄이기 | Bedrock 22편 (0) | 2026.11.03 |
| 프롬프트 최적화와 모델 라우팅: 무엇을 자동화할 수 있는가 | Bedrock 21편 (0) | 2026.11.03 |
| Bedrock Prompt Management: 변수·버전·배포 관리 | Bedrock 20편 (0) | 2026.11.01 |
