๐ฏ Knowledge Bases
๋งค๋์ง๋ RAG โ KB 3์ข , ๊ตฌ์ถยท๋๊ธฐํ, Retrieve API, Gateway ์ปค๋ฅํฐ
Bedrock Knowledge Bases
๊ด๋ฆฌํ RAG ยท ๊ฒ์ ํ์ง ์กฐ์จ ยท OpenSearch Serverless
ํ์ดํ๋ผ์ธ ์ ์ฒด๋ฅผ ๊ด๋ฆฌํ์ผ๋ก
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