Knowledge Bases
매니지드 RAG — S3 동기화, 하이브리드 검색, Retrieve API
Knowledge Bases
매니지드 RAG — S3 동기화, 하이브리드 검색, Retrieve API
파이프라인 전체를 관리형으로
RAG 파이프라인의 파싱·청킹·임베딩·인덱싱·검색을 관리형으로
왜 Knowledge Bases인가
DIY의 무게 · 관리형 RAG · Knowledge Base 3종
Knowledge Bases
RAG 파이프라인의 전 단계를 대신 돌리는 Bedrock의 관리형 RAG
Bedrock Knowledge Bases
문서를 연결하면 파싱 → 청킹 → 임베딩 → 인덱싱 → 검색까지 관리형으로
- 동기화 한 줄 — start_ingestion_job
- 검색 API 2종 — Retrieve · RetrieveAndGenerate
- Knowledge Base 3종 — Managed · Vector Store · Structured
- 개발자 몫 — 파싱·청킹·임베딩·벡터 스토어
RAG 파이프라인 모듈에서 직접 만들던 것들이 전부 서비스의 파라미터가 됩니다 — 남는 결정은 데이터와 전략뿐입니다.
Knowledge Base 처리 흐름
DIY 파이프라인이 하던 파싱·청킹·임베딩·검색 — 인제스트 잡 하나와 API 호출 하나로
"환불 규정이
어떻게 되나요?"
같은 질문 —
답은 사내 문서에만
→
Knowledge Base — RAG 여섯 단계를 대신 돌리는 관리형 구간
오프라인 — start_ingestion_job 잡 하나로 자동
① 인제스트→② 청킹→③ 임베딩·저장
온라인 — RetrieveAndGenerate 호출 하나로 자동
④ 검색→⑤ 증강→⑥ 생성· Retrieve는 ④만 — 청크+score
개발자 몫은 청킹 등 네 가지 전략 선택뿐
→
"예약금은 이용일 3일 전까지 취소하면 전액 환불됩니다"
citations —
restaurant-policy.pdf 인용 첨부
RAG 파이프라인 모듈의 여섯 단계 그대로 — Knowledge Base가 ①~③은 잡 하나, ④~⑥은 호출 하나로 대신 돌립니다. 코드는 사라지고 결정만 남습니다
같은 질문, 같은 문서, 같은 답 — 다른 것은 누가 파이프라인을 돌리는가뿐입니다. 이 예제가 모듈 끝까지 이어집니다.
DIY에서 Knowledge Bases로
직접 만든 파이프라인 각 단계의 관리형 대응
개발자가 정하는 것은 데이터 소스와 네 가지 전략(파싱·청킹·임베딩·벡터 스토어)뿐 — 실행과 운영은 Knowledge Base가 맡습니다.
Knowledge Bases 3종
워크로드에 맞는 Knowledge Base 유형 선택 — 셋 다 Knowledge Bases, 다른 것은 관리 범위
Managed Knowledge Base 추천
완전 관리형 RAG
- 벡터 스토어 관리 불필요
- Smart Parsing + Agentic Retrieval
- 멀티모달 인제스트
- GA — 리전 8곳에서 제공
언제 — 빠른 시작, 인프라 관리 최소화
Vector Store Knowledge Base
BYO 벡터 스토어
- OpenSearch/Aurora/Pinecone 선택
- 커스텀 청킹/파싱 전략
- 기존 벡터 스토어 활용
언제 — 세밀한 제어가 필요할 때
Structured Data Store
SQL 쿼리
- Redshift 연결
- Text-to-SQL 자동 생성
- 정형 데이터 분석
언제 — 데이터 웨어하우스 질의
이름 주의 — Knowledge Bases는 서비스 전체(관리형 RAG)의 이름이고, 그중 벡터 스토어까지 통째로 맡기는 유형의 이름이 "Managed Knowledge Base"입니다. Vector Store Knowledge Base도 파이프라인은 관리형이고, 벡터 스토어만 직접 고릅니다.
구축과 운영
데이터 소스 · 네 가지 결정 · 인제스트 운영
데이터 소스 6종
문서가 어디에 있든 연결하는 순간 지식이 되는 소스들 — Vector Store 기준 6종, Managed는 7종(Google Drive·OneDrive 포함)
S3
기본 소스 — 버킷·접두사로 범위 지정
- inclusionPrefixes로 대상 문서 한정
- 증분 동기화 — 변경분만 재처리
웹 크롤러
공개 웹사이트를 크롤링해 인제스트
- 시드 URL과 범위 설정
- 공개 문서·도움말 사이트에 적합
SaaS 커넥터 · Custom
Confluence · Salesforce · SharePoint + 커스텀
- 사내 위키·CRM 문서를 그대로 연결
- Managed는 Google Drive·OneDrive 추가 (Salesforce 대신)
- Custom은 API로 직접 인제스트
소스가 어디든 이후 파이프라인은 동일합니다 — 소스 연결이 곧 지식 연결입니다.
Knowledge Base 생성과 동기화
S3 연결 후 동기화 한 줄 — 파싱부터 인덱싱까지 자동
핵심 포인트
- create_data_source
- S3 버킷 연결 — inclusionPrefixes로 대상 문서 범위 지정
- start_ingestion_job
- 동기화 한 줄 — 파싱 → 청킹 → 임베딩 → 인덱싱 자동 수행
- 증분 처리
- 변경된 문서만 재처리 — 전체 재인덱싱이 아님
- bedrock-agent
- 구축은 bedrock-agent, 검색은 bedrock-agent-runtime 클라이언트
코드
import boto3
bedrock_agent = boto3.client("bedrock-agent", region_name="us-east-1")
# 데이터 소스 연결 — S3 버킷과 접두사만 지정
response = bedrock_agent.create_data_source(
knowledgeBaseId="SUPPORT-KB-001",
name="support-docs",
dataSourceConfiguration={"type": "S3", "s3Configuration": {
"bucketArn": "arn:aws:s3:::support-docs-bucket",
# restaurant-policy.pdf는 policy/ 아래 — rag 모듈과 같은 문서
"inclusionPrefixes": ["policy/", "faq/"],
}},
)
# 동기화 시작 — 파싱, 청킹, 임베딩, 인덱싱을 자동 수행
bedrock_agent.start_ingestion_job(
knowledgeBaseId="SUPPORT-KB-001",
dataSourceId=response["dataSource"]["dataSourceId"])
개발자의 네 가지 결정
RAG 파이프라인 모듈에서 배운 판단이 여기서는 콘솔의 선택지가 됩니다 — 전부 생성 시점의 결정
파싱
문서 → 텍스트
- 기본 파서 — 텍스트 중심 문서
- 파운데이션 모델 파서 — 표·이미지를 모델이 해석
- Data Automation — 대규모 비정형
청킹
텍스트 → 검색 단위
- 고정 크기 + 오버랩 — 기본값
- 계층적(Parent+Child) — 긴 약관·매뉴얼
- 시맨틱 — FAQ·대화형 문서
임베딩 모델
텍스트 → 벡터
- Titan Embed v2 — 1,024차원
- 검색도 같은 모델을 쓰므로 생성 후 교체는 곧 전체 재인덱싱
벡터 스토어 (인덱싱)
벡터 저장 · 인덱스
- Managed Knowledge Base — 자동 프로비저닝
- Vector Store Knowledge Base — OpenSearch·Aurora 등 직접 선택
판단 기준은 RAG 파이프라인 모듈 그대로 — 문서의 구조가 전략을 결정하고, 특히 임베딩 모델은 되돌리기 비싼 결정이니 처음에 신중히 고릅니다.
인제스트 운영 — 상태·실패·상한
동기화는 한 줄 — 상한과 실패를 아는 데서 시작하는 운영
- 파일 50MB 상한
- 초과 문서는 failureReasons에 기록되고 스킵 — 큰 문서는 분할·압축 후 업로드
- 동시 인제스트 잡 50/Knowledge Base
- 데이터 소스는 Knowledge Base당 최대 200개 — 둘 다 Managed Knowledge Base 전용 쿼터, 소스별 잡이 병렬로 돕니다.
- 직접 인제스트
- IngestKnowledgeBaseDocuments로 S3 없이 최대 25문서 인라인 주입 (콘솔은 10)
- 원시 데이터 10TB/Knowledge Base
- Managed Knowledge Base 기준 — 쿼리 입력 10,000자 · Retrieve 300회/분
인제스트 잡의 실패 문서 목록(failureReasons)을 확인하는 습관이 검색 품질 디버깅의 첫 단추입니다 — "안 나오는 문서"의 절반은 들어가지 않은 문서입니다.
검색 API
Retrieve · RetrieveAndGenerate · 에이전트 연결
Retrieve vs RetrieveAndGenerate
검색만 가져올 것인가, 답변까지 맡길 것인가 — Knowledge Base의 두 가지 검색 API
Retrieve
검색만 — 프롬프트 직접 제어
- 청크 텍스트 + 점수 + 메타데이터 반환
- 프롬프트 커스터마이징 자유
- 멀티스텝 RAG·후처리에 유리
- 에이전트 도구(@tool) 연동에 적합
Strands 에이전트의 도구로 감싸는 Agentic RAG의 표준 패턴입니다.
RetrieveAndGenerate
검색 + 생성 한 번에
- 답변 + 출처(citations) 반환
- 모델·프롬프트 제어는 제한적
- 하이브리드 검색 옵션 지정 가능
- 빠른 PoC·단순 Q&A에 적합
한 번의 호출로 답변과 출처까지 — 가장 빨리 RAG를 체험하는 경로입니다.
빠른 시작은 RetrieveAndGenerate, 에이전트 연동과 프롬프트 제어가 필요하면 Retrieve — 이 선택은 Agentic RAG 모듈로 이어집니다.
RetrieveAndGenerate — 답변과 출처 한 번에
가장 빨리 RAG를 체험하는 경로 — 검색·증강·생성이 호출 하나에
import boto3
rt = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
# 검색 + 증강 + 생성을 호출 하나로
response = rt.retrieve_and_generate(
input={"text": "예약금 환불 규정이 어떻게 되나요?"}, # ① 자연어 질문
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
# ② Knowledge Base ID + 생성에 쓸 모델
"knowledgeBaseConfiguration": {
"knowledgeBaseId": "SUPPORT-KB-001",
"modelArn": "us.anthropic.claude-sonnet-4-6",
},
},
)
print(response["output"]["text"]) # ③ 생성된 답변
for c in response["citations"]: # ④ 세그먼트별 근거
for ref in c["retrievedReferences"]:
print(ref["location"]["s3Location"]["uri"])
- input.text — 자연어 질문. 검색과 생성이 한 번에 수행됨
- knowledgeBaseConfiguration — Knowledge Base ID + 생성에 쓸 모델(modelArn) 지정
- output['text'] — 생성된 답변 본문
- citations — 답변 세그먼트별 근거. retrievedReferences에 원본 위치(location)
Retrieve 호출과 응답 구조
청크 텍스트 · 유사도 점수 · 원본 위치 — 프롬프트에 넣을 재료를 그대로 받는 검색 전용 API
핵심 포인트
- retrievalQuery
- 자연어 질문 그대로 전달 — 임베딩 변환은 Knowledge Base가 수행
- score
- 상대 관련도 점수 — 동일 설정 내 비교·임계값 필터 기준
- location
- 원본 S3 문서 URI — 출처 표시(Citation)의 재료
- 다음 단계
- 이 호출을 @tool로 감싸면 Agentic RAG — 해당 모듈에서 계속
코드
import boto3
bedrock_rt = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
# 검색만 수행 — 프롬프트 구성과 생성은 직접 제어한다
response = bedrock_rt.retrieve(
knowledgeBaseId="SUPPORT-KB-001",
retrievalQuery={"text": "예약금 환불 규정이 어떻게 되나요?"},
retrievalConfiguration={"vectorSearchConfiguration": {"numberOfResults": 3}},
)
# 응답 — 청크 텍스트 + 유사도 점수 + 원본 문서 위치
for r in response["retrievalResults"]:
print(r["score"]) # 상대 관련도 (동일 설정 내 비교용)
print(r["content"]["text"]) # 청크 원문
print(r["location"]["s3Location"]["uri"]) # 출처 문서
Retrieve 응답의 실물
앞 장 코드가 받는 것 — 필드별로 열어보는 retrievalResults 한 건
요청
retrieve(knowledgeBaseId="SUPPORT-KB-001", retrievalQuery="예약금 환불 규정이 어떻게 되나요?", numberOfResults=3)
retrievalResults[0] — 1위 청크
content.text
"예약금은 이용일 3일 전까지 취소하면 전액 환불됩니다. 이용일 1~2일 전 취소는 …" — 프롬프트에 넣을 근거 원문
score
0.87
상대 관련도 — 동일 설정 내 비교·임계값 필터용 (예시 수치)
location.s3Location.uri
s3://support-docs-bucket/policy/restaurant-policy.pdf
출처 표시(Citation)의 재료
retrievalResults[1]
score 0.79 · "당일 취소와 노쇼는 환불되지 않습니다 …" — 같은 문서의 다음 청크 (예시 수치)
RAG 파이프라인 모듈에서 임베딩 → ANN 검색 → Top-K로 직접 조립하던 세 가지가, 여기서는 응답 JSON에 이미 담겨 옵니다
이 세 필드가 곧 증강의 재료입니다 — content.text는 근거, location은 출처, score는 필터 기준. 이 호출을 @tool로 감싸면 그대로 Agentic RAG의 도구가 됩니다.
검색 품질 조율
하이브리드 · 메타데이터 필터 · 리랭커
검색 품질 조율
요청 하나가 후보를 좁혀 가는 순서 — 네 단계 모두 요청 파라미터로 조절 가능
-
1
메타데이터 필터
찾아도 되는 범위부터 확정 — 부서·연도·테넌트 격리
-
2
검색 타입
SEMANTIC 또는 HYBRID로 유사 후보 선정
-
3
리랭커
후보를 쿼리와 정밀 비교하여 순서 재조정
-
4
Top-K 반환
numberOfResults만큼만 최종 반환
네 단계 전부 재인덱싱 없이 요청 단위로 바꿉니다 — 같은 Knowledge Base에 질의 성격별로 다른 조율을 적용할 수 있습니다.
검색 타입 — 시맨틱과 하이브리드
RAG 파이프라인 모듈의 하이브리드 검색이 Knowledge Base에서는 요청 파라미터 하나
SEMANTIC
벡터 검색만
- 의미 유사도로만 후보 선정
- 동의어·다국어·유사 표현에 강함
- 고유명사·코드·품번 매칭에 약함
기본 동작 — 대부분의 자연어 질의에 충분합니다.
HYBRID
벡터 + 키워드 결합
- 벡터 결과와 키워드 매칭을 함께 반영
- "SKU-1042" 같은 정확 매칭 보완
- vectorSearchConfiguration의 overrideSearchType으로 전환
문서에 코드·모델명·고유명사가 많다면 하이브리드가 기본값이 됩니다.
재인덱싱 없이 요청 단위로 전환합니다 — 같은 Knowledge Base에 질의 성격별로 다른 검색 타입을 쓸 수 있습니다.
필터와 Top-K — 후보를 다스리기
유사한 것을 찾는 일과 찾아도 되는 범위를 정하는 일의 차이
- 메타데이터 필터
- 문서에 붙인 메타데이터로 검색 범위 제한 — 부서·연도·문서 유형별 격리
- numberOfResults
- 반환 청크 수(Top-K) — 많을수록 재현율↑, 컨텍스트 비용↑
- score 임계값
- 응답의 score(상대 관련도)로 클라이언트 측 필터 — 절대 기준보다 동일 설정 내 상대 비교용
- 요청 상한
- 쿼리 입력 10,000자 · Retrieve 분당 300회 (Managed Knowledge Base 기준)
멀티테넌트라면 필터가 곧 보안 경계입니다 — 유사도는 테넌트를 구분하지 않으므로, 메타데이터 필터로 강제해야 합니다.
리랭커 — 마지막 순서 재조정
벡터 검색이 빠르게 추린 후보를 리랭커가 다시 줄 세우는 2단 구조
- rerankingConfiguration
- vectorSearch 결과에 재순위 적용 — type은 BEDROCK_RERANKING_MODEL (유일값)
- modelArn · numberOfRerankedResults
- 리랭킹에 쓸 모델과 최종 반환 개수 지정
- metadataConfiguration
- 리랭킹 판단에 포함/제외할 메타데이터 필드 선택
- Managed Knowledge Base
- 관리형 리랭커가 기본 포함 — 별도 구성 없이 적용
넓게 뽑고(Top-K↑) 정밀하게 줄이는(리랭커) 조합이 실무 기본형 — 원리는 Advanced RAG 모듈에서, Knowledge Base에서는 설정 하나입니다.
OpenSearch Serverless
컬렉션 · 인덱스 매핑 · kNN · 거리 메트릭
컬렉션과 인덱스
Vector Store Knowledge Base(BYO)가 소유하게 되는 저장 구조
컬렉션 — VECTORSEARCH 타입
서버리스 운영 단위 — OCU 자동 확장, Knowledge Base가 연결하는 대상
인덱스
벡터 필드 스키마(매핑)를 가진 저장 단위 — Knowledge Base 하나가 인덱스 하나를 사용
문서 — 청크당 1건
벡터 + 원문 텍스트 + 메타데이터가 한 문서로 기록
인덱스 매핑
knn_vector 필드 선언 — dimension은 임베딩 모델 차원과 일치해야 한다
PUT /kb-refund-index
{
"settings": { "index.knn": true },
"mappings": { "properties": {
"chunk_vector": {
"type": "knn_vector", "dimension": 1024,
"method": { "name": "hnsw", "engine": "faiss", "space_type": "l2" }
},
"chunk_text": { "type": "text" }, "metadata": { "type": "keyword" }
} }
}
- index.knn: true — kNN 검색 활성화
- dimension — 임베딩 모델 차원과 일치 (Titan v2 = 256/512/1024)
- method — HNSW 그래프 · faiss 엔진
- space_type — 거리 메트릭 선언 (l2 = 유클리드)
kNN 검색과 거리 메트릭
질의 벡터와 가까운 k개를 찾는 검색 — "가깝다"의 정의가 space_type
kNN 질의
GET /kb-refund-index/_search
{
"size": 5,
"query": { "knn": {
"chunk_vector": {
"vector": [0.12, -0.48, ...],
"k": 5
}
} }
}
거리 메트릭 — space_type
- l2
- 유클리드 거리 — 좌표 공간의 직선 거리
- cosinesimil
- 코사인 유사도 — 크기를 무시한 방향 비교
- innerproduct
- 내적 — 크기까지 반영한 유사도
space_type은 임베딩 모델의 권장 메트릭과 일치시켜야 합니다 — BYO를 고르면 이 전부를 직접 소유하고, Managed를 고르면 보이지 않는 내부가 됩니다.
실습 — Knowledge Base
Bedrock Knowledge Base를 구축하고 동기화한 뒤, Retrieve로 검색 품질을 확인합니다
학습 목표
- S3 데이터 소스 연결과 Knowledge Base 생성
- start_ingestion_job으로 동기화 — 인제스트 상태 확인
- Retrieve · RetrieveAndGenerate로 검색 품질 비교
DIY → Knowledge Base 전환 · 구축과 운영 · Retrieve vs RetrieveAndGenerate