๐ฏ Advanced RAG
HyDE, Reranking, Self-RAG
Advanced RAG ๊ธฐ๋ฒ
์ธ๋ฑ์ฑ ์ต์ ํ ยท ์ฌ์ ๊ฒ์ ยท ํ์ด๋ธ๋ฆฌ๋ ยท ์ฌํ ๊ฒ์
๊ฒ์์ด ์๋ฑํ ๋ ์ฐ๋ ์ฒ๋ฐฉ์
์คํจ ์ ํ ์ง๋จ๊ณผ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ณ ์ฒ๋ฐฉ โ ๊ฒ์ ํ์ง์ ๋์ด์ฌ๋ฆฌ๋ ๊ธฐ๋ฒ ์ฒด๊ณ
์ Advanced RAG์ธ๊ฐ
์คํจ ์ ํ 3๊ฐ์ง ยท 3๋จ๊ณ ์ต์ ํ
Advanced RAG
Naive RAG๊ฐ ์คํจํ๋ ์ง์ ์ ์ง๋จํ๊ณ , ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ณ๋ก ์ฒ๋ฐฉํ๋ ๊ธฐ๋ฒ ์ฒด๊ณ
Advanced RAG
๊ธฐ๋ฒ์ ๋์ด์ด ์๋๋ผ ์ง๋จ โ ์ฒ๋ฐฉ์ ์ฒด๊ณ โ ์ด๋ ๋จ๊ณ๊ฐ ๋ณ๋ชฉ์ธ์ง์ ๋ฐ๋ผ ์ธ ๊ธฐ๋ฒ์ด ๋ฌ๋ผ์ง๋๋ค
- ์ง๋จ โ ์คํจ ์ ํ 3๊ฐ์ง
- ์ธ๋ฑ์ฑ โ ์ ์ฅ ๋ฐฉ๋ฒ ๊ฐ์ (์คํ๋ผ์ธ 1ํ)
- ์ฌ์ ๊ฒ์ โ ์ฟผ๋ฆฌ ๋ณํ (๊ฒ์ ์ )
- ์ฌํ ๊ฒ์ โ ๊ฒฐ๊ณผ ์ ์ (๊ฒ์ ํ)
์ ๋ถ ์ฐ๋ ๊ฒ์ด ์๋๋๋ค โ ๋ณ๋ชฉ์ ๋ง๋ ๊ธฐ๋ฒ๋ง ๊ณจ๋ผ ์น๊ณ , ํ๊ฐ ๋ฃจํ๋ก ํจ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
๋ชจ๋ ๊ธฐ๋ฒ์ ๋น์ฉ(๋ ์ดํด์ยทํ ํฐยท์ธํ๋ผ)์ ์ถ๊ฐํฉ๋๋ค.
Naive RAG โ ์ง์ ํ์ดํ๋ผ์ธ์ ๋ฒฝ
๊ฒ์ ํ ๋ฒ, ๊ฒฐ๊ณผ ๊ทธ๋๋ก ์ฃผ์ โ ์ ๋ชจ๋์์ ๋ง๋ ๊ธฐ๋ณธํ์ด ์ค์ ์์ ๋ถ๋ชํ๋ ์ง์
์ RAG ํ์ดํ๋ผ์ธ ๋ชจ๋์์ ๋ง๋ ๊ตฌ์ฑ์ด ๋ฐ๋ก ์ด Naive(Basic) RAG์ ๋๋ค โ ๋์์ ํ์ง๋ง ์ค๊ฐ์ ๊ณ ์น ์ง์ ์ด ์์ด, ๊ฒ์์ด ํ๋ฆฌ๋ฉด ๋ต๋ ๊ทธ๋๋ก ํ๋ฆฝ๋๋ค.
Naive vs Advanced โ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ
ํ์ดํ๋ผ์ธ์ ๊ฐ์์๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ ๋ผ๋์ ๋จ๊ณ๋ง๋ค ๊ฐ์ ํฌ์ธํธ๋ฅผ ๊ฝ๋ ๊ฒ
Naive RAG
๊ณ ์ ๋ ์ง์ ํ์ดํ๋ผ์ธ
- ์ง๋ฌธ์ ๋ฐ์ ๊ทธ๋๋ก ๊ฒ์ โ ์ฟผ๋ฆฌ ๊ฐ์ ์์
- ๊ฒ์๋ ์ฃผ์ ๋ ํ ๋ฒ โ ์ฌ์๋ยท์ ์ ์์
- ์์๊ฐ ํ๋ ค๋ ๊ทธ๋๋ก LLM์ ์ ๋ฌ
- ๊ตฌํ์ด ๋จ์ โ ํ๋กํ ํ์ ์ ์ ํฉ
์คํจํด๋ ๊ทธ ์์ธ์ ๊ณ ์น ์ง์ ์ด ํ์ดํ๋ผ์ธ ์์ ์์ต๋๋ค.
Advanced RAG
๋จ๊ณ๋ง๋ค ๊ฐ์ ํฌ์ธํธ๋ฅผ ๊ฝ๋ ์ฒด๊ณ
- ์ธ๋ฑ์ฑ โ ์ ์ฅ ๋ฐฉ๋ฒ๋ถํฐ ๊ฐ์ (Parent-Childยท๋ฉํ๋ฐ์ดํฐ)
- ์ฌ์ ๊ฒ์ โ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ ๊ฒ์ (RewritingยทMulti-Query)
- ๊ฒ์ โ ๋ฒกํฐ + ํค์๋ ํ์ด๋ธ๋ฆฌ๋
- ์ฌํ ๊ฒ์ โ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ํด ์ฃผ์ (RerankingยทCompression)
๊ฐ์ ๋ผ๋ ์์ ๋ณ๋ชฉ์ ๋ง๋ ๊ธฐ๋ฒ๋ง ๊ณจ๋ผ ์น์ต๋๋ค.
Advanced RAG๋ ์ ์ํคํ ์ฒ๊ฐ ์๋๋ผ Naive ํ์ดํ๋ผ์ธ์ ๊ฝ๋ ๊ฐ์ ํฌ์ธํธ์ ๋ชจ์์ ๋๋ค โ ๋ฌด์์ ๊ฝ์์ง๋ ์คํจ ์ ํ์ด ์ ํฉ๋๋ค.
Naive RAG์ ์คํจ ์ ํ 3๊ฐ์ง
๋จ์ ๋ฒกํฐ ๊ฒ์์ด ๋์น๋ ์ง๋ฌธ๋ค โ ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์ฒ๋ฐฉ
์ดํ ๋ถ์ผ์น
"ํด์ฝํ๋ฉด ๋ ๋ด์ผ ํด?" โ ๋ฌธ์๋ "์ทจ์ ์์๋ฃ ์ ์ฑ "
- ๊ตฌ์ด์ฒดโ๋ฌธ์ด์ฒดยท๋์์ด๋ฅผ ์๋ฒ ๋ฉ์ด ์์ง ๋ชปํ๋ ๊ฒฝ์ฐ
- ๊ด๋ จ ๋ฌธ์๊ฐ ์์ ๊ฒ์๋์ง ์์
- ์ฒ๋ฐฉ โ Query Rewriting ยท ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์
์๋ ๋ถ๋ช ํ
"๊ด์ฐฎ์ ๋ฐ ์์ด?" โ ์นดํ ๊ณ ๋ฆฌ ยท ์กฐ๊ฑด์ด ๋ชจํธ
- ์ด๋ค ๊ด์ ์ผ๋ก ๊ฒ์ํด์ผ ํ ์ง ์ฟผ๋ฆฌ์ ์ ๋ณด๊ฐ ์์
- ์๋ฑํ ๋ฌธ์๊ฐ ์์์ ์ฌ๋ผ์ด
- ์ฒ๋ฐฉ โ Multi-Query ยท ๋ฉํ๋ฐ์ดํฐ ํํฐ
๋ณตํฉ ์ง๋ฌธ
"์์ฝ ๋ฐ๊พธ๋ฉด์ ์ธ์๋ ์ถ๊ฐํ ์ ์์ด?" โ ์ฃผ์ 2๊ฐ
- ํ๋์ ๋ฒกํฐ๋ก ๋ ์ฃผ์ ๋ฅผ ํํํ ์ ์์
- ํ์ชฝ ์ฃผ์ ๋ง ๊ฒ์๋์ด ๋ฐ์ชฝ ๋ต๋ณ
- ์ฒ๋ฐฉ โ Sub-Query ๋ถํด ยท RAG Fusion
LLM์ด ์๋ฌด๋ฆฌ ์ข์๋ ์๋ชป๋ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ๋ฉด ํ ๋ฃจ์๋ค์ด์
(ํ๊ฐ)์
๋๋ค.
Advanced RAG์ ๋ชฉํ๋ ํ๋ โ ์ ํํ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ
3๋จ๊ณ ์ต์ ํ ์ง๋
์ผ์ชฝ์ Naive, ์ค๋ฅธ์ชฝ์ Advanced โ ๊ฐ์ ์ธ๋ก ํ๋ฆ์์ ์ค๋ฅธ์ชฝ์๋ง ๊ธฐ๋ฒ์ด ๋ผ์ด๋ ๋ค
โ 1ํ ์ค์ โ ์ถ๊ฐ ์ฟผ๋ฆฌ ๋น์ฉ ์์
โก ๋งค ์ฟผ๋ฆฌ LLM ํธ์ถ ์ถ๊ฐ
โข ์ฟผ๋ฆฌ๋น ๋ฆฌ๋ญ์ปค ยท LLM ํธ์ถ ์ถ๊ฐ
๊ฐ ๋จ๊ณ๋ ๋ ๋ฆฝ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค โ ๊ทธ๋ฆฌ๊ณ ๋น์ฉ์ด ๋ฎ์ ์ธ๋ฑ์ฑ๋ถํฐ ์๋ํ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
๋ฌ๋ ์์ โ Naive vs Advanced
๊ฐ์ ์ง๋ฌธ "์์ฝ๊ธ ํ๋ถ ๊ท์ ์ด ์ด๋ป๊ฒ ๋๋์?" โ ๊ธฐ๋ฒ 3๊ฐ๊ฐ ๋ฌธ์๋ค์ ์์๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ๋๊ฐ (์์ ์์น)
"์์ฝ๊ธ ํ๋ถ ๊ท์ ์ด ์ด๋ป๊ฒ ๋๋์?"
restaurant-policy.pdf
์ ๋ต์ ยง3 ์์ฝ๊ธ ํ๋ถ ๊ธฐ์ค ์ฒญํฌ
3
restaurant-policy ยง3 ์ ๋ต
0.64
1
terms.pdf ยง9 ํฌ์ธํธ ํ๊ธ ์ ์ฐจ
0.71
2
faq.pdf ๊ฒฐ์ ์ค๋ฅ ์ ์ฌ๊ฒฐ์ ์๋ด
0.68
1
์ ๋ต
0.94
2
0.41
3
0.28
์ธ๋ฑ์ฑ ์ต์ ํ
Parent-Child ยท ๋ฉํ๋ฐ์ดํฐ ยท ์๋ฒ ๋ฉ ์ ๋ต
์ธ๋ฑ์ฑ ์ต์ ํ
๊ฒ์์ด ์์๋๊ธฐ ์ ์ ์น๋ถ๋ฅผ ๋ด๋ ์คํ๋ผ์ธ ๋จ๊ณ โ ์ ์ฅ ๋ฐฉ๋ฒ์ด ๊ฒ์ ํ์ง์ ๊ฒฐ์
์ ์ฅ์ ๋ฐ๊พธ๋ฉด ๊ฒ์์ด ๋ฐ๋๋ค
RAG ๋ชจ๋์ ์ธ๋ฑ์ฑ ํ์ดํ๋ผ์ธ ์์ ์น๋ ์ธ ๊ฐ์ง ๊ฐ์ โ ์ฒญํน ๊ตฌ์กฐ ยท ๋ฉํ๋ฐ์ดํฐ ยท ์๋ฒ ๋ฉ
- Parent-Child โ ์๊ฒ ์ฐพ๊ณ ํฌ๊ฒ ์ฝ๊ธฐ
- Semantic Chunking โ ์๋ฏธ ๊ฒฝ๊ณ์์ ๋ถํ
- ๋ฉํ๋ฐ์ดํฐ โ ๊ฒ์ ์ ๋ฒ์ ์ ํ
- ์๋ฒ ๋ฉ ์ ๋ต โ ๋ชจ๋ธยท์ฐจ์ ์ ํ
ํ ๋ฒ ์ค์ ํ๋ฉด ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ์ฉ๋ฉ๋๋ค โ ๊ฐ์ฑ๋น๊ฐ ๊ฐ์ฅ ๋์ ๋จ๊ณ์ด๋ฏ๋ก ํญ์ 1์์๋ก ์ ์ฉํฉ๋๋ค.
Parent-Child ์ฒญํน
์ฒญํน์ ๋๋ ๋ง โ ์๊ฒ ์๋ฅด๋ฉด ๋ฌธ๋งฅ ์์ค, ํฌ๊ฒ ์๋ฅด๋ฉด ๊ฒ์ ํ๋ฆผ. ๊ทธ๋์ ๋ ๋ค ์ฐ๋ ์ ๋ต
Child โ ๊ฒ์์ฉ
์์ ์ฒญํฌ (100~300์)
- ์ ๋ฐํ ์๋ฏธ ๋งค์นญ โ ๊ฒ์ ์ ํ๋ ๋์
- "์ทจ์ ์์๋ฃ" ํค์๋๊ฐ ๋ ์ฒญํฌ๋ฅผ ์ ํํ ์กฐ์ค
- ID๋ก ์์ ์ Parent๋ฅผ ์ฐธ์กฐ
๊ฒ์์ Child์์ ์ผ์ด๋ฉ๋๋ค โ ์์์๋ก ์ฟผ๋ฆฌ์์ ์๋ฏธ ๋งค์นญ์ด ์ ๋ช ํด์ง๋๋ค.
Parent โ ์๋ต์ฉ
ํฐ ์ฒญํฌ (1,000~2,000์)
- ์กฐ๊ฑด ยท ๊ณ์ฐ๋ฒ ยท ์์ธ๊ฐ ํจ๊ป ๋ด๊ธด ๋ฌธ๋งฅ
- LLM์ ์ ๋ฌ๋๋ ๋จ์ โ ๋ต๋ณ ์์ ์ฑ ํ๋ณด
- ์๋ค ๋งฅ๋ฝ ํฌํจ โ ๋ฌธ์ฅ ์ค๊ฐ ์ ๋จ ์์
๋งค์นญ๋ Child์ Parent๋ฅผ LLM์ ์ ๋ฌํฉ๋๋ค โ ์ ๋ฐ ๊ฒ์๊ณผ ํ๋ถํ ๋ฌธ๋งฅ์ ๋์์ ์ป์ต๋๋ค.
Knowledge Base์์ Hierarchical Chunking์ ์ ํํ๋ฉด ์ฝ๋ ์์ด ๊ฐ์ ํจ๊ณผ๋ฅผ ์ป์ต๋๋ค โ Parent 1,500 ยท Child 300 ํ ํฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ด๋ฆฌํ ๊ตฌ์ฑ๋ฉ๋๋ค. ์ปค์คํ ๋ถํ ๋ก์ง์ด ํ์ํ ๋๋ง ์ง์ ๊ตฌํํ์ธ์.
Semantic Chunking โ ์๋ฏธ ๊ฒฝ๊ณ์์ ๋ถํ
๋ฌธ์ฅ ์ฌ์ด ์๋ฒ ๋ฉ ์ ์ฌ๋๊ฐ ๊ธ๋ฝํ๋ ์ง์ = ์ฃผ์ ์ ๊ฒฝ๊ณ โ ๊ธฐ๊ณ์ ๋ถํ ์ด ๋์น๋ ๋ฌธ๋งฅ ๋ณด์กด
๊ณ ์ ํฌ๊ธฐ ์ฒญํน
N์๋ง๋ค ๊ธฐ๊ณ์ ๋ถํ
- ๊ตฌํ ๊ฐ๋จ โ ์ธ๋ฑ์ฑ ๋น์ฉ ์ต์
- ๋ฌธ์ฅ ยท ์ฃผ์ ์ค๊ฐ์์ ์๋ฆด ์ํ
- ํญ๋ชฉ์ด ๋ ๋ฆฝ์ ์ธ FAQ์ ์ ํฉ
- ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋จผ์ ์๋ํ๋ ์ถ๋ฐ์
์งง๊ณ ๋ ๋ฆฝ์ ์ธ ๋ฌธ์๋ผ๋ฉด ์ด๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค โ ๊ฒ์ ํ์ง ๋ฌธ์ ๊ฐ ์ธก์ ๋ ๋๋ง ๋ค์ ๋จ๊ณ๋ก ๊ฐ๋๋ค.
Semantic Chunking
์ ์ฌ๋ ๋ณํ์ ์์ ๋ถํ
- ๋ฌธ์ฅ ์๋ฒ ๋ฉ ์ ์ฌ๋๊ฐ ๊ธ๋ฝํ๋ ์ง์ ์์ ์ ๋จ
- ์ฃผ์ ๋จ์ ๋ณด์กด โ ๊ธด ๋จ๋ฝ ๊ธฐ์ ๋ฌธ์์ ์ ํฉ
- ๋ชจ๋ ๋ฌธ์ฅ์ ์ฌ์ ์๋ฒ ๋ฉ โ ์ธ๋ฑ์ฑ ๋น์ฉ ์ฆ๊ฐ
- ์กฐํญ ๊ฒฝ๊ณ๊ฐ ๋๋ ทํ ๋ฒ๋ฅ ยท ์ ์ฑ ๋ฌธ์์ ํจ๊ณผ
์ธ๋ฑ์ฑ 1ํ ๋น์ฉ์ ๋ด๊ณ ๊ฒ์ ํ์ง์ ์ฌ๋ ์ ํ์ ๋๋ค โ ๋ฌธ์ ๊ฐฑ์ ์ด ์ฆ์ผ๋ฉด ๋น์ฉ์ด ๋ฐ๋ณต๋๋ ์ ์ ๊ฐ์ํ์ธ์.
๋ฌธ์ ์ ํ์ด ์ ๋ต์ ์ ํฉ๋๋ค โ ๊ธฐ์ ๋ฌธ์๋ Parent-Child, FAQ๋ ๊ณ ์ ํฌ๊ธฐ, ๋ฒ๋ฅ ยท์ ์ฑ ์ Semantic + ๋ฉํ๋ฐ์ดํฐ, ํ ๋ฌธ์๋ Data Automation์ด ๋ง์ต๋๋ค.
๋ฉํ๋ฐ์ดํฐ๋ก ๋ฒ์ ์ขํ๊ธฐ
๋ฒกํฐ ์ ์ฌ๋๋ "2026๋ ๋ฉ๋ด"์ "2025๋ ๊ตฌ ๋ฉ๋ด"๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํจ โ ๊ทธ๋์ ํํฐ๊ฐ ๋จผ์
ํต์ฌ ํฌ์ธํธ
- .metadata.json
- S3์ ๊ฐ ๋ฌธ์์ ํจ๊ป ์ ๋ก๋ โ Knowledge Base๊ฐ ํํฐ ํค๋ฅผ ์๋ ์ธ๋ฑ์ฑ
- ํ์ ํค 3์ข
- category(์ ํ) ยท effective_date(์ ํจ์ผ) ยท source(์ถ์ฒ)
- ์ฐ์ฐ์
- equals ยท notEquals ยท greaterThan ยท in ยท startsWith ๋ฑ
- ์ค๊ณ ์์น
- ํค 3~5๊ฐ ์ ํ, ๋ ์ง๋ ISO 8601, ์ค์ฒฉ ์์ด 1depth ํํํ
์ฝ๋
import boto3
bedrock_rt = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
# ๋ฒกํฐ ๊ฒ์ ์ ์ ๋ฉํ๋ฐ์ดํฐ๋ก ๋์ ๋ฒ์๋ฅผ ์ขํ๋ค
response = bedrock_rt.retrieve(
knowledgeBaseId="KB-RESTAURANT-001",
retrievalQuery={"text": "์ดํ๋ฆฌ์ ์ฝ์ค ๊ฐ๊ฒฉ"},
retrievalConfiguration={"vectorSearchConfiguration": {
"numberOfResults": 5,
"filter": {"andAll": [
{"equals": {"key": "category", "value": "restaurant"}},
{"equals": {"key": "cuisine", "value": "์ดํ๋ฆฌ์"}},
]},
}},
)
์๋ฒ ๋ฉ ์ ๋ต โ ๋ชจ๋ธ๊ณผ ์ฐจ์
์๋ฒ ๋ฉ ๋ชจ๋ธ์ด ๋ฒกํฐ ๊ณต๊ฐ์ ํ์ง์ ๊ฒฐ์ โ ์ธ์ด ๊ตฌ์ฑ๊ณผ ์ ๋ ฅ ๊ธธ์ด๊ฐ ๊ฐ๋ฆผ๊ธธ
์ ํ๊ณผ ์ต์ ํ
- ํ๊ตญ์ด ์์ฃผ
- Titan Embed v2๊ฐ ์ถ๋ฐ์ โ 8,192ํ ํฐ ์ ๋ ฅ, AWS ํตํฉ
- ๋ค๊ตญ์ด ํผํฉ
- Cohere Multilingual v3 โ 512ํ ํฐ ์ ๋ ฅ ํ๋ ์ฃผ์
- ์ฐจ์ ์ถ์
- 1,024 โ 256์ผ๋ก ์ ์ฅยท๊ฒ์ ๋น์ฉ ์ ๊ฐ (์ฝ๊ฐ์ ์ ํ๋ ์์ค๊ณผ ๊ตํ)
- ์ธ๋ฑ์ฑ ์ต์ ํ
- ๋ฐฐ์น ์๋ฒ ๋ฉ ยท ๋ฌธ์ ํด์ ์บ์ฑ์ผ๋ก ์ฌ์๋ฒ ๋ฉ ๋ฐฉ์ง ยท ์ฝ์ฌ์ธ ์ฌ์ฉ ์ ์ ๊ทํ
๋ชจ๋ธ ๋น๊ต
| ๋ชจ๋ธ | ์ฐจ์ | ์ต๋ ์ ๋ ฅ | ๊ฐ์ |
|---|---|---|---|
| Titan Embed v2 | 1,024 | 8,192 ํ ํฐ | AWS ํตํฉ ยท ๋ฒ์ฉ ยท ์๋์ ์ผ๋ก ์ ๋ ด |
| Cohere Multilingual v3 | 1,024 | 512 ํ ํฐ | ๋ค๊ตญ์ด ํผํฉ ๋ฌธ์์ ์ต์ |
์ฌ์ ๊ฒ์
Query Rewriting ยท HyDE ยท Multi-Query ยท RAG Fusion
์ฌ์ ๊ฒ์
์ฌ์ฉ์ ์ง๋ฌธ์ ๊ทธ๋๋ก ๊ฒ์ํ์ง ์์ โ LLM์ด ์ฟผ๋ฆฌ๋ฅผ ๋ณํํ ๋ค ๊ฒ์
๊ฒ์ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ๊ณ ์น๋ค
์ด๋ฆ์ ๋ง์ง๋ง ๊ตฌํ์ ํ๋ โ ํ๋กฌํํธ ํ ํ๋ฆฟ๊ณผ LLM ํธ์ถ์ ๋๋ค. ์ง์๋ฌธ๋ง ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ๊ธฐ๋ฒ์ด ๋ฉ๋๋ค
- Query Rewriting โ ๊ตฌ์ด์ฒด๋ฅผ ๊ฒ์์ด๋ก
- HyDE โ ๊ฐ์ ๋ต๋ณ์ผ๋ก ๊ฒ์
- Multi-Query ๊ฐ์กฑ โ ๊ด์ ๋ถํดยท์ถ์ํยท์ฃผ์ ๋ถํด
- RAG Fusion โ ์ฌ๋ฌ ๊ฒฐ๊ณผ๋ฅผ RRF๋ก ์ตํฉ
๋งค ์ฟผ๋ฆฌ๋ง๋ค LLM ํธ์ถ์ด ์ถ๊ฐ๋๋ ๋จ๊ณ์ ๋๋ค โ ํจ๊ณผ๋ ํฌ์ง๋ง ๋น์ฉ๋ ์ปค์, ์ธ๋ฑ์ฑยท์ฌํ ๊ฒ์์ ๋จผ์ ์๋ํ ๋ค ์ ์ฉํฉ๋๋ค.
Query Rewriting
"ํด์ฝํ๋ฉด ๋ ๋ด์ผ ํด?" โ "์์ฝ ์ทจ์ ์์๋ฃ ์ ์ฑ " โ ๊ฐ์ฅ ๊ฐ์ธ๊ณ ํ์คํ ์ฒซ ์ฒ๋ฐฉ
ํต์ฌ ํฌ์ธํธ
- REWRITE_PROMPT
- ์ง์๋ฌธ์ด ๊ณง ๊ธฐ๋ฒ โ ๊ตฌ์ด์ฒดโ๊ณต์ ์ฉ์ด, ๋๋ช ์ฌโ๊ตฌ์ฒด ๋ช ์ฌ
- str(result)
- AgentResult์์ ํ ์คํธ๋ฅผ ๊บผ๋ด๋ ์ ๋ณธ โ message๋ dict์ ๋๋ค.
- chat_history
- ์ต๊ทผ 3ํด์ ํจ๊ป ์ฃผ๋ฉด "๊ทธ๊ฑฐ ์ผ๋ง์ผ?" ๊ฐ์ ๋๋ช ์ฌ ํด์
- @tool
- Agentic RAG ๋ชจ๋์ ์์ด์ ํธ์ ๊ทธ๋๋ก ์ฅ์ฐฉ ๊ฐ๋ฅํ ํํ
์ฝ๋
from strands import Agent, tool
from strands.models import BedrockModel
model = BedrockModel(model_id="us.anthropic.claude-sonnet-4-6")
REWRITE_PROMPT = """์ฌ์ฉ์ ์ง๋ฌธ์ ๊ฒ์์ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ก ๋ณํํ์ธ์.
- ๊ตฌ์ด์ฒด๋ฅผ ๊ณต์ ์ฉ์ด๋ก, ๋๋ช
์ฌ๋ฅผ ๊ตฌ์ฒด์ ๋ช
์ฌ๋ก
- ๊ฒ์ ํค์๋๋ง ์ถ๋ ฅ (์ค๋ช
์์ด)"""
# ์ฌ์์ฑ ์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก โ ์ถ๋ ฅ ํ
์คํธ๋ str(result)๋ก ์ถ์ถ
@tool
def rewrite_query(query: str) -> str:
"""์ฌ์ฉ์ ์ง๋ฌธ์ ๊ฒ์ ์ต์ ์ฟผ๋ฆฌ๋ก ๋ณํํฉ๋๋ค."""
rewriter = Agent(model=model, system_prompt=REWRITE_PROMPT)
return str(rewriter(query))
# "ํด์ฝํ๋ฉด ๋ ๋ด์ผ ํด?" โ "์์ฝ ์ทจ์ ์์๋ฃ ์ ์ฑ
"
HyDE โ ๊ฐ์ ๋ต๋ณ์ผ๋ก ๊ฒ์
HyDE(Hypothetical Document Embeddings) โ ๋ฌธ์๋ฅผ ๋ฎ์ ๊ฐ์ ๋ต๋ณ์ ๋ง๋ค์ด, ์ง๋ฌธ ๋์ ๊ทธ ์๋ฒ ๋ฉ์ผ๋ก ๊ฒ์
ํต์ฌ ํฌ์ธํธ
- ํ์ ๊ฐญ ํด์
- ์งง์ ์ง๋ฌธ โ ๊ธด ๋ฌธ์ โ ๋ต๋ณ ์๋ฒ ๋ฉ์ด ๋ฌธ์์ ๋ ๊ฐ๊น์ต๋๋ค.
- LLM 2ํ
- ๊ฐ์ ๋ต๋ณ ์์ฑ + ์ต์ข ์๋ต โ ๋ ์ดํด์ ๋น์ฉ์ ๊ฐ์ํ๋ ๊ธฐ๋ฒ
- ์ ํฉ
- FAQ ์คํ์ผ ๋ฌธ์, ์ ๋ฌธ ์ฉ์ด ๋ฌธ์๋ฅผ ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ๊ฒ์ํ ๋
- ์ญํจ๊ณผ
- ์์นยท๋ ์งยท์ต์ ๋ฐ์ดํฐ ์ง๋ฌธ โ ๊ฐ์ ๋ต๋ณ์ด ํ๊ฐ ๋ ธ์ด์ฆ๊ฐ ๋ฉ๋๋ค.
์ฝ๋
import boto3
bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
# 1๋จ๊ณ โ ๊ฐ์ ๋ต๋ณ ์์ฑ (์ ํํ ํ์ ์์, ํ์๋ง ๋ฌธ์์ ๋ฎ์ผ๋ฉด ๋จ)
def hypothetical_answer(query: str) -> str:
response = bedrock.converse(
modelId="us.anthropic.claude-sonnet-4-6",
messages=[{"role": "user", "content": [
{"text": f"๋ค์ ์ง๋ฌธ์ ์์ธํ ๋ต๋ณํ์ธ์ (๋ถ์ ํํด๋ ๋ฉ๋๋ค): {query}"}]}],
inferenceConfig={"maxTokens": 200, "temperature": 0},
)
return response["output"]["message"]["content"][0]["text"]
# 2๋จ๊ณ โ ์ง๋ฌธ ๋์ ๊ฐ์ ๋ต๋ณ์ ์๋ฒ ๋ฉ์ผ๋ก ๋ฒกํฐ ๊ฒ์
docs = vector_search(embed(hypothetical_answer("์ดํ๋ฆฌ์ ์ฝ์ค ๊ฐ๊ฒฉ?")))
์ง๋ฌธ์ ์ชผ๊ฐ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ
๋ชจํธํ๋ฉด ๊ด์ ์ ๋๋ฆฌ๊ณ , 0๊ฑด์ด๋ฉด ๋ํ๊ณ , ์์์ผ๋ฉด ๋ถํด โ ๋ฌธ์ ๋ง๋ค ๋ค๋ฅธ ์ชผ๊ฐ๊ธฐ
Multi-Query ์ถ์ฒ
๊ด์ ๋ถํด
- 1๊ฐ ์ง๋ฌธ โ 3~5๊ฐ ๋ค๋ฅธ ๊ด์ ์ ์ฟผ๋ฆฌ
- ๊ฐ๊ฐ ๊ฒ์ ํ ํฉ์งํฉ โ ์ฌํ์จ ๊ทน๋ํ
- ๋ณ๋ ฌ ๊ฒ์(asyncio)์ผ๋ก ๋ ์ดํด์ ๋ฐฉ์ด
์ธ์ โ ์ง๋ฌธ์ด ๋ชจํธํด ์ด๋ค ๊ด์ ์ธ์ง ๋ถํ์คํ ๋
Step-back
์์ ๊ฐ๋ ์ถ์ํ
- "ํธ๋ผํ ๋ฆฌ์ ๋ฒจ๋ผ ๋ฐ์น ํ์คํ ๊ฐ๊ฒฉ" โ "์ดํ๋ฆฌ์ ๋ฉ๋ด ๊ฐ๊ฒฉ ์ ์ฑ "
- ํต์ฌ ์๋๋ฅผ ์ ์งํ ์ฑ ๊ฒ์ ๋ฒ์ ํ๋
- ๋๋ฌด ๊ตฌ์ฒด์ ์ธ ์ง๋ฌธ์ 0๊ฑด ๋ฌธ์ ํด๊ฒฐ
์ธ์ โ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ 0๊ฑด์ ๊ฐ๊น์ธ ๋
Sub-Query
๋ ๋ฆฝ ์ฃผ์ ๋ถํด
- "์์ฝ ๋ฐ๊พธ๋ฉด์ ์ธ์ ์ถ๊ฐ ๋ผ?" โ ๋ ๋ฆฝ ์ง๋ฌธ 2๊ฐ
- ํ์ ์ง๋ฌธ๋ณ๋ก ๊ฒ์ โ ๊ฒฐ๊ณผ ํฉ์ฐ โ LLM ์ ๋ฌ
- Multi-Query์ ๋ค๋ฆ โ ํํ ๋ณํ์ด ์๋๋ผ ์ฃผ์ ๋ถ๋ฆฌ
์ธ์ โ ์ง๋ฌธ์ ๋ ๋ฆฝ ์ฃผ์ ๊ฐ 2๊ฐ ์ด์ ์์์ ๋
์ ๋ค ํ๋กฌํํธ ์ง์๋ฌธ์ ์ฐจ์ด์ผ ๋ฟ์ ๋๋ค โ "๋ค๋ฅธ ๊ด์ ์ผ๋ก" ยท "์์ ๊ฐ๋ ์ผ๋ก" ยท "๋ ๋ฆฝ ์ง๋ฌธ์ผ๋ก" ๋ถํด ๋ฐฉํฅ๋ง ๋ฐ๊ฟ๋๋ค.
RAG Fusion โ ๋ถํด์ ์์ฑ
์ฌ๋ฌ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ ํฉ์งํฉ์ด ์๋๋ผ ์์ ์ตํฉ์ผ๋ก โ ๊ณตํต ์์ ๋ฌธ์๊ฐ ์ง์ง ๊ด๋ จ ๋ฌธ์
์ง๋ฌธ์ ๊ด์ ์ฟผ๋ฆฌ๋ก ๋ถํด(Multi-Query)ํ ๋ค, ์ ์๊ฐ ์๋๋ผ ์์๋ก ์ตํฉํฉ๋๋ค โ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๋ ๊ฐ์ ์ตํฉ๊ธฐ RRF๋ฅผ ์๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์
๋ฒกํฐ + ํค์๋ ยท RRF ยท ์ ์ ์ ๋ต
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์
๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฒกํฐ์ ํค์๋๋ก ๋์์ ๊ฒ์ํ๊ณ , ๋ ์์๋ฅผ ํ๋๋ก ์ตํฉ
์๋ฏธ + ์ฉ์ด
๋ฒกํฐ๋ "ํ์คํ์ง"๊ณผ "์ดํ๋ฆฌ์ ๋ ์คํ ๋"์ ์๊ณ , BM25๋ "SKU-12345"๋ฅผ ์ ํํ ์ง์ต๋๋ค
- ๋ฒกํฐ โ ์๋ฏธ ์ ์ฌ (๋์์ดยท์ ์ฌ ํํ)
- BM25 โ ์ ํ ์ฉ์ด (์ฝ๋ยท๊ณ ์ ๋ช ์ฌ)
- RRF โ ์์ ๊ธฐ๋ฐ ์ตํฉ
- Bedrock Knowledge Bases โ HYBRID ์ต์ ๋ด์ฅ
Bedrock Knowledge Bases๋ overrideSearchType: "HYBRID" ํ ์ค์ด๋ฉด ๋ โ ๊ฒฐํฉ ์ ๋ต์ ์ง์ ๊ณ ๋ฅด๋ ๊ฒ์ ์ปค์คํ OpenSearch ํ์ดํ๋ผ์ธ์ผ ๋์ ๋๋ค.
๋ฒกํฐ ๊ฒ์์ด ๋์น๋ ์ฟผ๋ฆฌ
์๋ฏธ์ ๊ฐํ๊ณ ์ฉ์ด์ ์ฝํ ๋ฒกํฐ โ ์ ํํ ๋ฌธ์์ด ๋งค์นญ์ ํค์๋ ๊ฒ์์ ์์ญ
| ์ฟผ๋ฆฌ ์ ํ | ๋ฒกํฐ ๊ฒ์ ๊ฒฐ๊ณผ | ๋ฌธ์ |
|---|---|---|
| ์ ํ ์ฝ๋ (SKU-12345) | ์ ์ฌํ ์ค๋ช ๋ฌธ์ ๋ฐํ | ์ ํํ ์ฝ๋ ๋งค์นญ ์คํจ |
| ๊ณ ์ ๋ช ์ฌ (Claude Sonnet) | ๊ด๋ จ AI ๋ฌธ์ ๋ฐํ | ๋ค๋ฅธ ๋ชจ๋ธ ๋ฌธ์๋ ์์ |
| ์๋ฌ ๋ฉ์์ง (AccessDenied) | IAM ๊ด๋ จ ๋ฌธ์ ๋ฐํ | ์ ํํ ์๋ฌ ์ฝ๋ ๋งค์นญ ์ฝํจ |
| ๋ ์ง ยท ๋ฒ์ (2026-07-01) | ๋ฌด๊ดํ ๋ฌธ์ ๋ฐํ | ์ซ์๋ ๋ฒกํฐ ๊ณต๊ฐ์์ ์๋ฏธ๊ฐ ์์ |
๊ฒฐํฉํ๋ฉด ์๋ก์ ์ฝ์ ์ ๋ณด์ํฉ๋๋ค โ ์๋ฏธ๋ ๋ง๊ณ ์ฉ์ด๋ ๋ง๋ ๋ฌธ์๊ฐ ์์ชฝ ์์ ๋ชจ๋์์ ์์์ ์ค๋ฆ ๋๋ค.
๊ฐ์ ์ง๋ฌธ, ๋ ๊ฒ์๊ธฐ
"์์ฝ๊ธ ํ๋ถ ๊ท์ ์ด ์ด๋ป๊ฒ ๋๋์?" โ ์๋ฏธ๋ก ์ฐพ๋ ๋ฒกํฐ์ "ํ๋ถ" ์ฉ์ด๋ก ์ฐพ๋ BM25๋ฅผ ์์๋ก ๋ณํฉ
โ
RRF ๋ณํฉ ยท k=60
โ
์ ์๊ฐ ์๋๋ผ ์์์ ์ญ์๋ฅผ ํฉ์ฐํ์ ๋ฟ์ ๋๋ค โ ์ค์ผ์ผ์ด ๋ค๋ฅธ ๋ ์ ์๋ฅผ ๋ณํ ์์ด ์ตํฉํฉ๋๋ค.
RRF (Reciprocal Rank Fusion)
๋ฒกํฐ ์ ์๋ 0~1, BM25๋ 0~๋ฌดํ๋ โ ์ ์ ๋์ ์์๋ฅผ ์ฐ๋ฉด ์ฌ๋ผ์ง๋ ์ค์ผ์ผ ๋ฌธ์
ํต์ฌ ํฌ์ธํธ
- ์์ ๊ธฐ๋ฐ
- ์ ์ ์ค์ผ์ผ ๋ถ์ผ์น๋ฅผ ์์ ํ ํํผ โ ์ ๊ทํ ๋ถํ์
- k=60
- ํ์ค๊ฐ โ ๋์ผ์๋ก ์์ ์ฐจ์ด์ ์ํฅ๋ ฅ์ด ์ํ๋ฉ๋๋ค.
- ์์ชฝ ์์ = ์ต์์
- ํ์ชฝ์์๋ง ๋์ ๋ฌธ์๋ ๋ณด์์ ์ผ๋ก ํฌํจ๋๋ ์์ ํ๋ฝ
- ์ฌ์ฌ์ฉ
- RAG Fusion(๋ค์ค ์ฟผ๋ฆฌ)๊ณผ ํ์ด๋ธ๋ฆฌ๋(๋ฒกํฐ+ํค์๋) ๊ณต์ฉ ์ตํฉ๊ธฐ
์ฝ๋
# RRF โ ์ ์๊ฐ ์๋๋ผ ์์์ ์ญ์๋ฅผ ํฉ์ฐํ๋ค (์ ๊ทํ ๋ถํ์)
def reciprocal_rank_fusion(results_list, k=60):
scores = {}
for results in results_list:
for rank, doc in enumerate(results):
scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank + 1)
return sorted(scores.items(), key=lambda x: x[1], reverse=True)
# ๋ฒกํฐ 1์ + ํค์๋ 3์ = 1/61 + 1/63 โ ์์ชฝ ์์ ๋ฌธ์๊ฐ ์ต์์๋ก
fused = reciprocal_rank_fusion([vector_results, keyword_results])
์ ์ ๊ฒฐํฉ ์ ๋ต ๋น๊ต
RRF๊ฐ ๊ธฐ๋ณธ๊ฐ โ ๊ฐ์ค์น ํ๋์ ํ๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ธ ๋ค์๋ง
| ์ ๋ต | ๋ฐฉ์ | ์ฅ์ | ์ ํฉ |
|---|---|---|---|
| RRF | ์์ ์ญ์ ํฉ์ฐ | ์ ๊ทํ ๋ถํ์ ยท ํ๋ ์์ด ๋ฒ์ฉ | ๋๋ถ๋ถ์ ๊ฒฝ์ฐ (๊ธฐ๋ณธ๊ฐ) |
| Weighted Sum | ๋ฒกํฐ 0.7 + BM25 0.3 | ๋๋ฉ์ธ ๋ง์ถค ๊ฐ๋ฅ | A/B ํ ์คํธ๋ก ์ต์ ํํ ๋ |
| Normalization | min-max ์ ๊ทํ ํ ํฉ์ฐ | ์ ์ ํฌ๊ธฐ ์ ๋ณด ๋ณด์กด | ์ ์ ์ฐจ์ด๊ฐ ์๋ฏธ ์์ ๋ |
BM25 ์ ์๊ฐ ๋ฒกํฐ ์ ์๋ณด๋ค ํจ์ฌ ํด ์ ์์ด 0.5:0.5๋ก ์์ํ๋ฉด ํค์๋ ํธํฅ์ด ๋ฐ์ํฉ๋๋ค. ๋ฐ๋์ ํ๊ฐ ๋ฐ์ดํฐ๋ก A/B ํ ์คํธ ํ ๊ฐ์ค์น๋ฅผ ์ ํ์ธ์ โ ๊ทธ์ ๊น์ง๋ RRF์ ๋๋ค.
์ฌํ ๊ฒ์
Reranking ยท Compression ยท Lost-in-the-Middle ยท Citation
์ฌํ ๊ฒ์
๊ฒ์์ ๋๋๋ฐ ์์ ยท ๋ถ๋ ยท ์ถ์ฒ๊ฐ ๋ฌธ์ ์ผ ๋ โ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ํ ๋ค LLM์ ์ ๋ฌ
๊ฐ์ ธ์จ ๊ฒ์ ๋ค๋ฌ๋๋ค
์ ์ฉ ์์๊ฐ ๊ณง ์ฐ์ ์์ โ ์์ ๊ต์ (Reranking) โ ๋ถ๋ ์ ๋ฆฌ(Compression) โ ์ถ์ฒ ๋ช ์(Citation)
- Reranking โ Cross-Encoder ์ ๋ฐ ์ฌ์ ๋ ฌ
- Compression โ ๊ด๋ จ ๋ฌธ์ฅ๋ง ์ถ์ถ
- Lost-in-the-Middle โ ๋ฐฐ์น ์ฌ์กฐ์
- Citation โ ์ถ์ฒ ๋ช ์ ยท ํ๊ฐ ํ์ง
์ ๋ถ ์ธ ํ์ ์์ต๋๋ค โ Reranking ํ๋๋ก ๋๋ถ๋ถ ์ถฉ๋ถํ๊ณ , ๋๋จธ์ง๋ ์ฆ์์ด ์์ ๋๋ง ์น์ต๋๋ค.
Reranking ์ โ ํ
"์์ฝ๊ธ ํ๋ถ ๊ท์ ์ด ์ด๋ป๊ฒ ๋๋์?"์ ํ๋ณด๋ค โ ์ ์ฌ๋ ์์๊ฐ Cross-Encoder ๊ด๋ จ๋๋ก ๋ค์งํ๋ ์ /ํ
โ
Cross-
Encoder
์ ์ฌ๋(๊ฐ๊น๋ค)์ ๊ด๋ จ๋(๋ต์ด ๋๋ค)๋ ๋ค๋ฆ ๋๋ค โ ์ด ์ฌ์ ๋ ฌ์ด retrieve ํธ์ถ ํ ๋ฒ์ ๋ค์ด๊ฐ๋๋ค.
Reranking โ 2๋จ๊ณ ํ์ดํ๋ผ์ธ
Bi-Encoder๋ก ๋๊ฒ ํ๋ณด 20๊ฐ โ Cross-Encoder๊ฐ ์ฟผ๋ฆฌยท๋ฌธ์ ์์ 1:1 ์ ๋ฐ ๋น๊ตํด Top-5 ์ ๋ณ
import boto3
bedrock_rt = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
response = bedrock_rt.retrieve(
knowledgeBaseId="KB-RESTAURANT-001",
retrievalQuery={"text": "๋น์ผ ์ทจ์ ์์๋ฃ"},
retrievalConfiguration={"vectorSearchConfiguration": {
# โ 1๋จ๊ณ โ ํ๋ณด๋ ๋๊ฒ 20๊ฐ (Bi-Encoder + ํ์ด๋ธ๋ฆฌ๋)
"numberOfResults": 20,
"overrideSearchType": "HYBRID",
# โก 2๋จ๊ณ โ rerankingConfiguration์ vectorSearchConfiguration ๋ด๋ถ์ ์์น
"rerankingConfiguration": {
"type": "BEDROCK_RERANKING_MODEL",
"bedrockRerankingConfiguration": {
# โข Cross-Encoder(Cohere Rerank)๊ฐ ์ ๋ฐ ์ฌ์ ๋ ฌํด Top-5๋ง ๋จ๊น
"numberOfRerankedResults": 5,
"modelConfiguration": {"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/cohere.rerank-v3-5:0"},
},
},
}})
- 1๋จ๊ณ โ ๋์ ํ๋ณด โ numberOfResults=20์ผ๋ก ์ฌํ์จ ํ๋ณด. HYBRID๋ก ์ดํ ๋ถ์ผ์น ๋ณด์
- 2๋จ๊ณ โ ๋ฆฌ๋ญํน ์ค์ โ retrieve ํธ์ถ ํ ๋ฒ์ ๋ฆฌ๋ญํน๊น์ง. ๋ณ๋ ํ์ดํ๋ผ์ธ ์ฝ๋ ๋ถํ์
- Cross-Encoder ์ ๋ณ โ ์ฟผ๋ฆฌยท๋ฌธ์ ์ 1:1 ์ ๋ฐ ๋น๊ต๋ก Top-5๋ง LLM์ ์ ๋ฌ. LLM ํธ์ถ ์์ด ๋ฆฌ๋ญ์ปค๋ง ์ถ๊ฐ๋๋ ๊ฐ์ฑ๋น ๊ธฐ๋ฒ
Compression๊ณผ ๋ฐฐ์น ์ ๋ต
๊ฐ์ ธ์จ ๋ฌธ์๊ฐ ๋๋ฌด ๊ธธ๊ฑฐ๋, LLM์ด ์ค๊ฐ์ ๊ฑด๋๋ฐ๊ฑฐ๋ โ ๋ถ๋๊ณผ ๋ฐฐ์น์ ๋ฌธ์
Contextual Compression
๋ฌธ์์์ ๊ด๋ จ ๋ฌธ์ฅ๋ง ์ถ์ถ
- 500ํ ํฐ ์ฒญํฌ์์ ๊ด๋ จ 50ํ ํฐ๋ง โ ๋น์ฉ ์ ๊ฐ + ์ ๋ฐ๋ ํฅ์
- ๋ฌธ์๋น LLM 1ํ ์ถ๊ฐ ํธ์ถ โ ๊ฒฝ๋ ๋ชจ๋ธ(Haiku)๋ก ์ ์ถฉ
- 200ํ ํฐ ์ดํ ์ฒญํฌ์๋ ๋ถํ์ โ ์คํ๋ ค ์ ๋ณด ์์ค
Lost-in-the-Middle ๋ฐฉ์ง
์ค์ ๋ฌธ์๋ฅผ ์ฒ์๊ณผ ๋์ ๋ฐฐ์น
- LLM์ ํ๋กฌํํธ ์ฒ์ยท๋์ ์ง์ค (Stanford NLP ์ฐ๊ตฌ)
- Reranking ํ 1๋ฑ์ ๋งจ ์, 2๋ฑ์ ๋งจ ๋ค๋ก ์ฌ๋ฐฐ์น
- Knowledge Base RetrieveAndGenerate๋ ์์ฒด ์ ๋ ฌ โ ์ปค์คํ RAG ์ ์ฉ ๊ธฐ๋ฒ
๋ฌธ์ ์๋ฅผ ์ค์ด๋ฉด "์ค๊ฐ"์ด ์ฌ๋ผ์ง๋๋ค โ Top-3 ์ ํ์ด ๊ฐ์ฅ ๊ฐ์ผ Lost-in-the-Middle ๋ฐฉ์ด์ ๋๋ค.
Citation โ ์ถ์ฒ๊ฐ ๊ณง ๋ฐฉ์ด์
๋ต๋ณ์ ๊ฐ ์ฃผ์ฅ์ ์ถ์ฒ ๋ฒํธ๋ฅผ ๊ฐ์ โ ์ ๋ขฐ์ฑ ํ๋ณด์ ํ๊ฐ ํ์ง๋ฅผ ๋์์
์ปค์คํ RAG โ ํ๋กฌํํธ ์ ๋
[N] ๋ฒํธ ๊ฐ์
- ๋ฌธ์๋ง๋ค [1], [2] ๋ฒํธ๋ฅผ ๋ถ์ฌ ์ ๋ฌ
- "๊ฐ ์ฃผ์ฅ์ [N] ํ๊ธฐ" + "์์ผ๋ฉด ํ์ธ ๋ถ๊ฐ๋ก ๋ต๋ณ" ์ง์
- ๋ต๋ณ์์ [N] ํจํด ์ถ์ถ โ ์๋ฌธ๊ณผ ๋์กฐ
- [N] ์๋ ๋ฌธ์ฅ = ํ๊ฐ ์์ฌ ์ ํธ
Citation ๊ฒ์ฆ์ ํ์ดํ๋ผ์ธ์ ๋ฃ์ผ๋ฉด ํ๊ฐ ํ์ง๊ฐ ์๋ํ๋ฉ๋๋ค โ Guardrails์ ๊ฒฐํฉํ๋ฉด ๋ฐฉ์ด์ ์ด ์ด์ค์ด ๋ฉ๋๋ค.
Bedrock Knowledge Bases โ ์๋ ์ ๊ณต
๊ด๋ฆฌํ ๊ฒฝ๋ก
- RetrieveAndGenerate ์๋ต์ citations ๋ฐฐ์ด ํฌํจ
- retrievedReferences + generatedResponsePart ๋งคํ
- Managed Knowledge Base๋ ๊ธฐ์กด Retrieve API ํธํ โ location์ผ๋ก ์ถ์ฒ ์ถ์
- ํ๋กฌํํธ ์์ง๋์ด๋ง ๋ถํ์
๊ด๋ฆฌํ ๊ฒฝ๋ก๋ Citation์ด ๊ธฐ๋ณธ์ ๋๋ค โ ์ง์ ์ ๋๊ฐ ํ์ํ ๊ฒ์ ์ปค์คํ ํ์ดํ๋ผ์ธ๋ฟ์ ๋๋ค.
Citation์ด ์์ด๋ ์๋ฌธ๊ณผ ๋ถ์ผ์นํ๋ฉด ์๋ชป๋ ์ธ์ฉ โ ๋ฒํธ์ ์กด์ฌ๊ฐ ์๋๋ผ ๋ด์ฉ ๋์กฐ๊น์ง๊ฐ ๊ฒ์ฆ์ ๋๋ค.
์ ์ฉ ์ ๋ต
์ง๋จ โ ์ฒ๋ฐฉ ยท ์ ์ฉ ์์ ยท ์ค์ต
์ฆ์ โ ์ง๋จ โ ์ฒ๋ฐฉ
์คํจ ๋ก๊ทธ์ ์ฆ์์ด ์ง๋จ์, ์ง๋จ์ด ๊ธฐ๋ฒ์ ๊ฒฐ์ โ ์ฒ๋ฐฉ์ ๋น์ฉ ๋ฎ์ ๊ฒ๋ถํฐ
| ์ฆ์ | ์ง๋จ | ์ฒ๋ฐฉ (๋น์ฉ ๋ฎ์ ์) |
|---|---|---|
| ๊ด๋ จ ๋ฌธ์๊ฐ ์์ ์ ๋์ด | ์ดํ ๋ถ์ผ์น | ๋ฉํ๋ฐ์ดํฐ ํํฐ โ Query Rewriting โ ํ์ด๋ธ๋ฆฌ๋ |
| ๋ฌธ์๋ ๋์ค๋๋ฐ ์์๊ฐ ๋ฎ์ | ์๋ฒ ๋ฉ ํ๊ณ | Parent-Child โ Reranking โ HyDE |
| ๋ณตํฉ ์ง๋ฌธ์ ๋ฐ์ชฝ ๋ต๋ณ | ์ฃผ์ ํผ์ฌ | Sub-Query ๋ถํด โ RAG Fusion |
| ๋๋ฌด ๊ตฌ์ฒด์ ์ด๋ผ 0๊ฑด | ๊ฒ์ ๋ฒ์ ํ์ | Step-back ์ถ์ํ |
| ๋ฌด๊ดํ ๋ฌธ์๊ฐ ๋ง์ด ์์ | ๊ณผ์ ๊ฒ์ | Semantic Chunking โ Compression |
| ๋ต์ด ์ค๊ฐ ๋ด์ฉ์ ๋๋ฝ | Lost-in-the-Middle | Top-3 ์ ํ ๋๋ ์ฌ๋ฐฐ์น |
| ์ ํํ์ง๋ง ์ถ์ฒ ๋ถ๋ช | ์ ๋ขฐ์ฑ ๋ถ์กฑ | Citation |
์ด ํ๊ฐ ์ด ๋ชจ๋์ ์์ฝ์ ๋๋ค โ ์ฆ์ ์์ด ๊ธฐ๋ฒ๋ถํฐ ๊ณ ๋ฅด์ง ์์ต๋๋ค.
์ ์ฉ ์์ โ ๋น์ฉ์ด ๋ฎ์ ๊ฒ๋ถํฐ
ํ ๋ฒ์ 1๊ฐ ๊ธฐ๋ฒ๋ง โ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ๋ฐ๊พธ๋ฉด ํจ๊ณผ์ ์ถ์ฒ๊ฐ ๋ถ๋ถ๋ช
-
1
1์์ โ ์ธ๋ฑ์ฑ
Parent-Child ยท ๋ฉํ๋ฐ์ดํฐ ยท ์ฒญํน ์กฐ์ . 1ํ ์ค์ ์ผ๋ก ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ์ฉ, ์ถ๊ฐ ์ฟผ๋ฆฌ ๋น์ฉ 0.
-
2
2์์ โ ์ฌํ ๊ฒ์
Reranking๋ถํฐ โ LLM ํธ์ถ ์์ด ๋ฆฌ๋ญ์ปค๋ง ์ถ๊ฐ. ์ฝ๋ ๋ช ์ค๋ก ์ฆ๊ฐ ํจ๊ณผ.
-
3
3์์ โ ์ฌ์ ๊ฒ์
Query Rewriting โ ํ์ ์ HyDE ยท RAG Fusion. ๋งค ์ฟผ๋ฆฌ LLM ๋น์ฉ โ ๊ฐ์ฅ ๋น์ธ์ง๋ง ํจ๊ณผ๋ ํผ.
-
4
์์ โ ํ๊ฐ ๋ฃจํ
๊ธฐ๋ฒ 1๊ฐ ์ถ๊ฐ๋ง๋ค ๋์ผ ๋ฐ์ดํฐ์ ์ผ๋ก ์ฌ์ธก์ . ๊ฐ์ ์ด ํ์ธ๋ ๋๋ง ์ ์ง โ ๋นผ์ ์ข์์ง๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
"๋ ๋ฃ์ผ๋ฉด ์ข๊ฒ ์ง"๊ฐ ์๋๋ผ ์์น๋ก ๊ฐ์ ํ์ธ์ด ๊ธฐ์ค์ ๋๋ค โ ์ธก์ ๋ฐฉ๋ฒ(3์ถ ๋ฉํธ๋ฆญยทRAGAS)์ RAG ํ๊ฐ ๋ชจ๋์์ ๋ค๋ฃน๋๋ค.
Advanced RAG ์ค์ต
Naive RAG์ Advanced ๊ธฐ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์น์ผ๋ฉฐ ํ์ง ๋ณํ๋ฅผ ์ง์ ํ์ธํฉ๋๋ค
ํ์ต ๋ชฉํ
- Query Rewriting์ผ๋ก ๊ฒ์ ์ฟผ๋ฆฌ ์ต์ ํ
- Multi-Query๋ก ๋ค์ํ ๊ด์ ์ ๊ฒ์ ์ํ
- Reranking์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ ์ ํ๋ ํฅ์
- Self-RAG๋ก ์๋ต์ ๊ทผ๊ฑฐ ์๋ ๊ฒ์ฆ
- ๊ธฐ๋ณธ RAG vs Advanced RAG ํ์ง ๋น๊ต
์ธ๋ฑ์ฑ โ ์ฌํ โ ์ฌ์ ์์ผ๋ก โ ํ๊ฐ ๋ฃจํ๋ก ํจ๊ณผ๋ฅผ ํ์ธํ๋ฉฐ ํ ๋ฒ์ ํ๋์ฉ