[์๋ฃ] KT ์ฌ๋ด ์ง์ ๋์ RAG ๊ต์ ๋๋ฐฉ์ถ?!
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/์๊ฐ๋-๊ธฐ์ ๊ฒฝ์์ ๋ฌธ๋ํ์-by-KT-DS-๊น์ฑ์ฐ-๋จ์ฅ๋
์ค๋๋ RAG์ ๋ํ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ ์ค, KT DS์ ๊น์ฑ์ฐ ๊ธฐ์ ํ์ ๋จ์ฅ๋๊ป์ ๊ณต์ ํ์ RAG ๊ด๋ จ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
KT ์ฌ๋ด ์ง์ RAG ๊ต์์ด๋ผ๋ ๋ง์ ์ด๋ค ๋ด์ฉ์ผ์ง ๊ถ๊ธํ์ฌ, ์ด๋ฒ ํฌ์คํ ์์๋ ํด๋น ์๋ฃ๋ฅผ ์์ธํ๊ฒ ๊ณต๋ถํ๋ฉฐ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์์ผ๋ ํจ๊ป ์ดํด๋ณด์์ฃ .
์ด๋ฏธ์ง ์ถ์ฒ : https://www.lgcns.com/blog/it-trend/15258/
๋ณธ ๋ธ๋ก๊ทธ ํฌ์คํ ์ โKT DS์ ๊น์ฑ์ฐ ๊ธฐ์ ํ์ ๋จ์ฅ๋๊ป์ ๊ณต์ ํด์ฃผ์ RAG ๊ด๋ จ ์๋ฃ๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋ ์๋ฃ์ ๋๋ค.
- ๋ณ๋์ Reference๋ฅผ ๋ฌ์ง ์์ ์ฌ์ง ์๋ฃ๋ ํด๋น ๊ฐ์ ์๋ฃ ๋ด์ฉ์ ๋ฐ์ทํ ์๋ฃ์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค.
Chapter 1: Overview of RAG
-
Discriminative vs. Generative AI
- Discriminative AI =>
ํ๋ณํ AI
- ๋ถ๋ฅ(Classification) ๋ฐ ํ๊ท(Regression) ๋ฑ ์ ํต์ ์ธ ๋จธ์ ๋ฌ๋ ์์ ์ ์ด์ ์ ๋ง์ถค.
- ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ๋ ์คํค๋ง ์ ๋ ฅ. (์ ์ถ๋ ฅ์ด ํ์ ์ ์)
- ํน์ง: ์ง๋ ํ์ต(Supervised Learning)
- Generative AI =>
์์ฑํ AI
- ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ก ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ํตํด ์์ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐ ์ค์ ์ ๋ ๊ธฐ์ .
- ์ธ์ด ์์ฑ, ์ด๋ฏธ์ง ์์ฑ ๋ฑ ๋ค์ํ ์ฐฝ์์ ์์ ๊ฐ๋ฅ. (์ ์ถ๋ ฅ์ด ์ ์ฐํจ)
- ํน์ง: ๋น์ง๋ํ์ต(unsupervised) , ์๊ฐํ์ต(self-supervised)
-
AI Hype Cycle
-
ํ์ดํ ์ฌ์ดํด(Hype Cycle)
- ์ ๊ธฐ์ ์ ๋์ค์ ์ด๊ด ๋ฐ ์ฑํ ๋จ๊ณ๋ฅผ ์ค๋ช ํ๋ ๊ฐํธ๋์ ๋ชจ๋ธ.
-
์ฃผ์ ๋จ๊ณ:
- ๊ธฐ์ ์ด๋ฐ ๋จ๊ณ: ๊ธฐ์ ์๊ฐ.
- ๊ณผ๋ํ ๊ธฐ๋์ ์ ์ : ๊ณผ์ฅ๋ ๊ธฐ๋๊ฐ ํ์ฑ.
- ํ๋ฉธ ๋จ๊ณ: ์ค์ง์ ํ๊ณ์ ๋ํ ์ธ์ ์ฆ๊ฐ.
- ๊ณ๋ชฝ ๋จ๊ณ: ์ค์ฉ์ ์ฌ์ฉ ์ฌ๋ก ๋ฑ์ฅ.
- ์์ฐ์ฑ ๋จ๊ณ: ์ฑ์๋ ๊ธฐ์ ๋ก ์๋ฆฌ์ก์.
- ํ์ฌ ์์ฑํ AI๋ ๊ณผ๋ํ ๊ธฐ๋์ ์ ์ ์์ ํ๋ฉธ ๋จ๊ณ๋ก ์ง์ ์ค์.
-
LLM & ํ๊ณ
-
LLM(Large Language Models)์ด๋?
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ํ์ฉํ์ฌ ํ๋ จ๋ ์ธ์ด ๋ชจ๋ธ๋ก, ์ธ๊ฐ์ ์ธ์ด๋ฅผ ์ดํดํ๊ณ ์์ฑํ๋ ๋ฐ ์ต์ ํ๋ ๋ชจ๋ธ.
- Generative AI ๊ธฐ์ ์ ํต์ฌ์ผ๋ก, OpenAI์ GPT ์๋ฆฌ์ฆ, Google์ BERT, Hugging Face์ Transformers ๋ฑ์ด ๋ํ์ .
- ์ธ์ด ์ฒ๋ฆฌ(์์ฐ์ด ์ฒ๋ฆฌ, ์์ฑ ์ธ์, ๋ฒ์ญ ๋ฑ)์ ๊ด๋ จ๋ ๋ค์ํ ์์ ์ ์ ์ฉ ๊ฐ๋ฅ
-
LLM(Large Language Models)์ ํน์ง
- ๋๊ท๋ชจ ํ์ต ๋ฐ์ดํฐ:
- ์๋ฐฑ์ต~์์กฐ ๊ฐ์ ํ ํฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ๋ก ํ์ต.
- ์น ๋ฐ์ดํฐ, ๋ ผ๋ฌธ, ์์ ๋ฏธ๋์ด ๋ฑ ๊ด๋ฒ์ํ ๋ฐ์ดํฐ ์ถ์ฒ ํ์ฉ.
- Generative AI์ ํต์ฌ:
- ์๋ก์ด ํ ์คํธ ์์ฑ, ์ง๋ฌธ ์๋ต(QA), ์์ฝ, ๋ฒ์ญ ๋ฑ ์ธ์ด ์์ฑ ์์ ์ํ.
- ์ฐฝ์์ ์ด๊ณ ์ ์ฐํ ์๋ต ๊ฐ๋ฅ.
- ์ ๋ก์ท(Zero-shot) ์ถ๋ก ๊ฐ๋ฅ:
- ์ถ๊ฐ ํ์ต ์์ด๋, ์ฌ์ ํ์ต๋ ์ง์์ ํ์ฉํด ์๋ก์ด ์์ ์ ์ํ.
- ํ๋กฌํํธ๋ง์ผ๋ก๋ ํน์ ๋๋ฉ์ธ์์ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ.
- ๋ค์ํ ์์
์์์ ์ ์ฉ์ฑ:
- ํ ์คํธ ๋ถ๋ฅ, ๊ฐ์ ๋ถ์, ๋ํํ AI, ์ฝ๋ ์์ฑ, ์๋ฃ ๋ฐ์ดํฐ ๋ถ์ ๋ฑ ๋ค์ํ ๋๋ฉ์ธ์์ ํ์ฉ.
- ๊ธฐ์ ๋ฐ์ ์ ์ค์ฌ:
- ํธ๋์คํฌ๋จธ(Transformer) ๊ตฌ์กฐ๋ฅผ ํ์ฉํ ํ์ต.
- GPU/TPU ๋ฑ์ ํ๋์จ์ด์ ๋ณ๋ ฌ์ฒ๋ฆฌ ๊ธฐ์ ์ ๋ฐ์ ์ผ๋ก ํ๋ จ ํจ์จ ํฅ์.
- ๋๊ท๋ชจ ํ์ต ๋ฐ์ดํฐ:
- LLM(Large Language Models)์ ํ๊ณ
- ๋๋ฉ์ธ ํนํ ๋ฅ๋ ฅ ๋ถ์กฑ:
- ํ์ต ๋ฐ์ดํฐ๊ฐ ์ผ๋ฐ์ ์ธ ์ ๋ณด์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์์.
- ํน์ ์ฐ์ (์๋ฃ, ๋ฒ๋ฅ ๋ฑ)์ด๋ ์ต์ ๋ฐ์ดํฐ์ ๋ํ ์ดํด ๋ถ์กฑ.
- ์ ๋ณด์ ์ต์ ์ฑ ๋ถ์กฑ:
- ํ์ต ์์ ์ดํ์ ์๋ก์ด ์ง์ ๋ฐ์ ์ด๋ ค์.
- ์ ์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ํ๋ จ๋๋ฏ๋ก ์ค์๊ฐ ์ ๋ณด์๋ ๊ฒฉ์ฐจ ๋ฐ์.
- ํ๊ฐ(Hallucination):
- ๋ชจ๋ธ์ด ์กด์ฌํ์ง ์๋ ์ฌ์ค์ ์์ฑํ๊ฑฐ๋ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ขฐ๋ ์๊ฒ ์ ๊ณต.
- ์์ฑ ๊ฒฐ๊ณผ๊ฐ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ์ง ์์.
- ์ถ๋ก ๋ฅ๋ ฅ ๋ถ์กฑ:
- LLM์ ์ถ๋ก ์ ๊น์ด๊ฐ ๋ถ์กฑํ์ฌ ๋ ผ๋ฆฌ์ ์ด๊ฑฐ๋ ๋ณต์กํ ๋ฌธ์ ํด๊ฒฐ์ ํ๊ณ๊ฐ ์์.
- ์ํ์ ๋ฌธ์ ํ์ด๋ ๋ณต์กํ ๋ ผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ ์ง๋ฌธ์ ๋ํด ์ ํํ ๋ตํ์ง ๋ชปํ ๋๊ฐ ๋ง์.
- LLM์ ๋ ผ๋ฆฌ์ ์ฒด๊ณ๋ณด๋ค๋ ํจํด ์ธ์์ ์์กดํ๊ธฐ ๋๋ฌธ.
- ์ง์ ๋งค๊ฐ๋ณ์ํ(parameterizing knowledge) ํจ์จ์ฑ์ด ๋ฎ์:
- LLM์ ๋ชจ๋ ์ง์์ ๋ชจ๋ธ์ ๊ฐ์ค์น(parameter)์ ์์ถ ์ ์ฅํจ.
- ์ด๋ ์ง์์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ํ์ฅํ๋ ๋ฐ ๋นํจ์จ์ ์(์ด๋ ค์)
- ๋๋ฉ์ธ ํนํ ๋ฅ๋ ฅ ๋ถ์กฑ:
-
LLM ํ๊ณ ๊ทน๋ณต
LLM ํ๊ณ ๊ทน๋ณต ์ ๋ต์์ ๋ค๋ฃจ๋ ์ฃผ์ ์์๋ค์ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ, ํน์ ์ํฉ์ ์ ํฉํ๊ฒ ํ์ฉ๋ ์ ์์ต๋๋ค.
4.1 Prompt Engineering
-
ํ๋กฌํํธ ์์ง๋์ด๋ง
์ ์
: ํ๋กฌํํธ ์์ง๋์ด๋ง์ LLM์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ ๋ ฅ ํ ์คํธ๋ฅผ ๊ตฌ์กฐํํ๊ฑฐ๋ ์ฌ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ์ด๋ ์ํํธ์จ์ด์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.์์
: Standard Prompting(๊ธฐ๋ณธ ์ง์)์ Chain-of-Thought Prompting(์ฌ๊ณ ์ ํ๋ฆ)์ ๋น๊ตํด๋ณด๋ฉด, ํ์๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋จ๊ณ๋ณ๋ก ํด๊ฒฐํ๋๋ก ์ ๋ํ์ฌ ์ ํํ ๋ต๋ณ์ ๋์ถํฉ๋๋ค.ํ๊ณ
: ๋๋ฉ์ธ ์ง์์ด๋ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ๊ฐ ์์ผ๋ฉฐ, ์ ์ค๊ณ๋ ํ๋กฌํํธ ์์ด ๊ฒฐ๊ณผ๊ฐ ์ผ๊ด์ ์ด์ง ์์ ์ ์์ต๋๋ค.
4.2 RAG (Retrieval-Augmented Generation)
-
RAG ๊ฐ๋
์ ์
: RAG๋ ์ธ๋ถ ์ง์๋ฒ ์ด์ค(Vector Database)์ LLM์ ๊ฒฐํฉํ์ฌ ๋ ๊ฐ๋ ฅํ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค. ๊ฒ์๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ต์ ์์ฑํจ์ผ๋ก์จ ์ต์ ๋ฐ์ดํฐ ๋ฐ์์ด ๊ฐ๋ฅํ๋ฉฐ, LLM์ด ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ง์์ ๊ณต๋ฐฑ์ ๋ฉ์๋๋ค.-
์ฅ์
:- ์ ๋ณด ์ ๋ฐ์ดํธ๊ฐ ์ฝ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํจ์ผ๋ก์จ ์ฆ๊ฐ์ ์ธ ์ง์ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์ํ ์ธ๋ถ ๋ฐ์ดํฐ(์: ๋ฌธ์, PDF, ๋ฐ์ดํฐ์ ) ํ์ฉ์ ๊ฐ์ ์ด ์์ต๋๋ค.
-
๋จ์
:- ๊ฒ์ ์ฑ๋ฅ์ ๋ฐ๋ผ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์ข์ฐ๋ฉ๋๋ค.
- ๊ฒ์ ํ์ง์ด ๋ฎ์ ๊ฒฝ์ฐ, ์์ฑ๋ ์๋ต์ ํ์ง๋ ๋จ์ด์ง ์ ์์ต๋๋ค.
- ๊ฒ์๊ณผ ์์ฑ ๋จ๊ณ๋ฅผ ๊ฒฐํฉํ๋ค ๋ณด๋ ์๊ฐ ์ง์ฐ(latency)์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
4.3 Fine-Tuning
-
Fine-Tuning
-
์ ์
: Fine-Tuning(๋ฏธ์ธ ์กฐ์ )์ ์ฌ์ ํ์ต๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ํน์ ๋๋ฉ์ธ์ด๋ ์์ ์ ๋ง๊ฒ ๋ค์ ํ์ต์ํค๋ ๊ณผ์ ์ ๋๋ค.- ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ๊ฐ์ค์น(Weights)๋ฅผ ์กฐ์ ํ์ฌ, ์ฌ์ ํ์ต๋ ์ผ๋ฐ์ ์ธ ์ธ์ด ์ดํด ๋ฅ๋ ฅ์ ํน์ ํ ์ฉ๋์ ๋ง๊ฒ ์ต์ ํํฉ๋๋ค.
์์
: ์๋ฃ ๋ถ์ผ์์ ํนํ๋ ์ง๋จ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ Fine-Tuning์ ์งํํ๋ฉด, ๋ชจ๋ธ์ด ๋ ์ ๋ฌธ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์๋ฃ ๊ด๋ จ ๋ต๋ณ์ ์์ฑํ ์ ์์ต๋๋ค.-
์ฅ์
:- ๋๋ฉ์ธ ์ ๋ฌธ์ฑ ๊ทน๋ํ: Fine-Tuning์ ํตํด ํน์ ๋๋ฉ์ธ(์: ๋ฒ๋ฅ , ์๋ฃ, ๊ธ์ต ๋ฑ)์ ๋ง๋ ์๋ต์ ์์ฑํ ์ ์์ต๋๋ค.๋๋ฉ์ธ ์ ๋ฌธ์ฑ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก ์ต์ ํ: Fine-Tuning์ ํน์ ์์ (์: ๊ฐ์ ๋ถ์, ์์ฝ ์์ฑ, ๊ณ ๊ฐ ์ง์)์ ํ์ํ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ํ์ต์์ผ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
-
๋จ์
:- ๋์ ํ์ต ๋น์ฉ: Fine-Tuning์ ๋ชจ๋ธ ์ ์ฒด์ ๊ฐ์ค์น๋ฅผ ํ์ต์ํค๊ธฐ ๋๋ฌธ์, GPU/TPU์ ๊ฐ์ ๋๊ท๋ชจ ๊ณ์ฐ ์์์ด ํ์ํ๋ฉฐ, ํ์ต ์๊ฐ๋ ๋ง์ด ์์๋ฉ๋๋ค.
- ์ ์ฐ์ฑ ๋ถ์กฑ: Fine-Tuning๋ ๋ชจ๋ธ์ ํน์ ๋ฐ์ดํฐ๋ ๋๋ฉ์ธ์ ์ง๋์น๊ฒ ์ต์ ํ๋๋ ๊ฒฝํฅ์ด ์์ด, ์๋ก์ด ๋ฐ์ดํฐ๋ ๋น ๋ฅด๊ฒ ๋ณํ๋ ํ๊ฒฝ(์: ์ค์๊ฐ ๋ด์ค)์ ์ ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ๊ณผ์ ํฉ ์ํ: ํ์ต ๋ฐ์ดํฐ์ ์ง๋์น๊ฒ ์์กดํ ๊ฒฝ์ฐ, Fine-Tuning๋ ๋ชจ๋ธ์ด ์ผ๋ฐํ ๋ฅ๋ ฅ์ ์์ด ๊ณผ์ ํฉ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
-
๐ RAG vs Fine-Tuning
๋น๊ต ํญ๋ชฉ | RAG | Fine-Tuning |
---|---|---|
ํน์ง | ์ธ๋ถ ๋ฐ์ดํฐ(์: ๋ฌธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค)๋ฅผ ๊ฒ์ํ์ฌ LLM์ด ํ์ฉํ๋๋ก ์ค๊ณ. | ๋ชจ๋ธ ์์ฒด๋ฅผ ํน์ ์์ ์ ๋ง๊ฒ ์กฐ์ ํ์ฌ ๋๋ฉ์ธ์ ํนํ๋ ์ฑ๋ฅ ์ ๊ณต. |
๋น์ฉ | ๋น๊ต์ ๋ฎ์. ๊ฒ์ ์ธํ๋ผ ๊ตฌ์ถ์ ๋ฐ๋ผ ์ด๊ธฐ ๋น์ฉ์ ๋ฐ์ํ๋, ๋ชจ๋ธ ์ฌํ์ต ๋น์ฉ ์์. | ๋ฐ์ดํฐ ์ค๋น ๋ฐ ๋ชจ๋ธ ์ฌํ์ต์ ์๋นํ ๋น์ฉ๊ณผ ์๊ฐ์ด ์์๋จ. |
์ ์ฉ ๊ฐ๋ฅ์ฑ | ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋์ ๋ฐ์ดํฐ๋ ์ค์๊ฐ ์ ๋ณด์ ์ ํฉ. | ์๋์ ์ผ๋ก ์ ์ ์ด๊ณ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ํ๊ฒฝ์์ ์ ํฉ. |
๋ฐ์ดํฐ ๊ด๋ฆฌ | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ฝ๊ฒ ์ง์ ํ์ฅ ๊ฐ๋ฅ. | ๋ฐ์ดํฐ์ ์์ฑ ๋ฐ ๋ ์ด๋ธ๋ง์ด ํ์ํ๋ฉฐ, ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์ ์ฌํ์ต ํ์. |
๋ชจ๋ธ ์์ ํ์์ฑ | ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์์ ํ์ง ์์. ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํ ์ง์ ํ์ฅ์ ์์กด. | ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์ง์ ์์ ํ์ฌ ํน์ ์์ ์ด๋ ๋๋ฉ์ธ์ ์ต์ ํ๋ ๋ชจ๋ธ ์์ฑ. |
์ฑ๋ฅ ์ต์ ํ | ๊ฒ์ ๋จ๊ณ์ ํ์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง. ๊ฒ์ ์์คํ ๊ฐ์ ์ผ๋ก ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ. | ๋ชจ๋ธ ์ฑ๋ฅ์ ๋ฐ์ดํฐ ํ์ง๊ณผ ํ์ต ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ฉฐ, ๋๋ฉ์ธ ํนํ๋ ์ฐ์ํ ์ฑ๋ฅ ์ ๊ณต. |
์ง์ฐ ์๊ฐ | ๊ฒ์ ๋ฐ ์์ฑ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์. | ์ฌ์ ํ์ต๋ ๋ชจ๋ธ๋ก ๋ฐ๋ก ์๋ต ๊ฐ๋ฅํ์ฌ ์๋ต ์๋๊ฐ ๋น ๋ฆ. |
์ ์ง ๊ด๋ฆฌ | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฐ์ดํธ๋ง์ผ๋ก ์ ์ง ๋ณด์ ๊ฐ๋ฅ. | ๋ฐ์ดํฐ์ ์ ์ ๋ฐ์ดํธ ๋ฐ ๋ชจ๋ธ ์ฌํ์ต์ด ํ์ํ์ฌ ์ ์ง ๊ด๋ฆฌ ๋น์ฉ์ด ๋์. |
์ค๋ฆฌ์ ๊ณ ๋ ค์ฌํญ | ์ธ๋ถ ๋ฐ์ดํฐ ํ์ฉ์ผ๋ก ์ธํด ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฐ ๋ฐ์ดํฐ ์์ค ์ ๋ขฐ์ฑ์ด ์ค์. | ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ํฌํจ ์, ๋ชจ๋ธ์ด ์ด๋ฅผ ํ์ตํ๋ฉด์ ๊ฐ์ธ์ ๋ณด ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ๊ฐ๋ฅ์ฑ ์กด์ฌ. |
ํ๊ฐ(hallucination) | ๊ฒ์๋ ์ ๋ณด์ ์์กดํ๊ธฐ ๋๋ฌธ์ ํ๊ฐ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์. | ํน์ ๋๋ฉ์ธ์์ ํ์ต๋์ง ์์ ๊ฒฝ์ฐ, ๋ถ์ ํํ๊ฑฐ๋ ํ๊ฐ๋ ์ ๋ณด๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ ์กด์ฌ. |
๋๋ฉ์ธ ์ ํฉ์ฑ | ๋ค์ค ๋๋ฉ์ธ ๋๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๊ฒฝ์ ์ ํฉ. | ํน์ ๋๋ฉ์ธ์ ์ต์ ํ๋ ๋ฐ์ดํฐ์ ์ผ๋ก ๋์ ์ ๋ฌธ์ฑ ์ ๊ณต. |
๊ตฌํ ๋์ด๋ | ๊ฒ์ ์์คํ ๊ณผ์ ํตํฉ์ด ์๊ตฌ๋๋ฏ๋ก ์ด๊ธฐ ๊ตฌ์ถ์ด ๋ค์ ๋ณต์กํ ์ ์์. | ๋ชจ๋ธ ํ์ต ๋ฐ ๋ฐ์ดํฐ์ ์ค๋น ๊ณผ์ ์ด ๋ณต์กํ๋ฉฐ, ๊ณ์ฐ ๋ฆฌ์์ค ์๊ตฌ๋์ด ๋์. |
ํฌ๋ช ์ฑ(Explainability) | ๊ฒ์๋ ๋ฐ์ดํฐ์ ๋ต๋ณ์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ถ์ ๋ฐ ํด์์ด ์ฉ์ด. | ๋ชจ๋ธ์ด ๋ด๋ฆฐ ๊ฒฐ๋ก ์ ์ค๋ช ํ๊ธฐ ์ด๋ ต๊ณ , ๋ธ๋๋ฐ์ค ํน์ฑ์ ๊ฐ์ง. |
ํ์ฉ ์ฌ๋ก | FAQ ์์คํ , ์ต์ ๋ด์ค ์๋ต, ๊ณ ๊ฐ ์ง์ ๋ฑ ์ค์๊ฐ ์ ๋ณด ์ ๊ณต ์๋น์ค์ ์ ํฉ. | ์๋ฃ, ๋ฒ๋ฅ , ๊ณผํ ์ฐ๊ตฌ ๋ฑ ๊ณ ๋๋ก ํนํ๋ ์ ๋ฌธ ๋ถ์ผ์ ์ ํฉ. |
4.4 Fine-Tuning - PEFT (Parameter-Efficient Fine-Tuning)
ํจ์จ์ ์ธ Fine-Tuning์ ๋์
-
PEFT ๊ฐ๋
์ ์
:PEFT(Parameter-Efficient Fine-Tuning)
๋ ๊ธฐ์กด Fine-Tuning์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ชจ๋ธ ์ ์ฒด๋ฅผ ์กฐ์ ํ์ง ์๊ณ ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ์ ๋ฐ์ดํธํ์ฌ ํ์ตํ๋ ๊ธฐ์ ์ ๋๋ค.- ๊ธฐ์กด Fine-Tuning๊ณผ๋ ๋ฌ๋ฆฌ, ๋ชจ๋ธ์ ๊ธฐ์กด ๊ฐ์ค์น๋ฅผ ๋๋ถ๋ถ ๊ณ ์ ํ ์ํ์์ ์ถ๊ฐ์ ์ธ ํ์ต ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ(๋ชจ๋)๋ฅผ ์ฝ์ ํ์ฌ ํ์ตํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฅผ ํตํด ํ์ํ ์ฐ์ฐ๋์ ์ค์ด๊ณ , ํจ์จ์ ์ธ ํ์ต์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ค์ํ ์ ์, ๋จ์ํ ํน์ ๋ ์ด์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋๊ฒฐ(Freeze)ํ๋ ๊ฒ์ ๊ทธ์น๋ ๊ฒ์ด ์๋๋ผ, ์๋ก์ด ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋์ ํ์ฌ ํ์ต์ ์งํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด Fine-Tuning์ ๊ณ ๋น์ฉ๊ณผ ๋์ ์์ ์๊ตฌ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
-
PEFT ํน์ง : PEFT์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ธฐ์กด ๋ชจ๋ธ ์ ์ง
: ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ๋๋ถ๋ถ์ ํ๋ผ๋ฏธํฐ๋ ๊ณ ์ ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.์๋ก์ด ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
: ๋ชจ๋ธ์ ์ ์ ์์ ์๋ก์ด ํ์ต ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.ํจ์จ์ ์ธ ํ์ต
: ์ถ๊ฐ๋ ํ๋ผ๋ฏธํฐ๋ง ํ์ตํ์ฌ ๊ณ์ฐ ๋น์ฉ๊ณผ ์ ์ฅ ๊ณต๊ฐ์ ํฌ๊ฒ ์ค์ ๋๋ค.์ฑ๋ฅ ์ ์ง
: ์ ์ฒด ๋ฏธ์ธ ์กฐ์ ๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ฌ์ฑํ๋ฉด์๋ ์์ ์ฌ์ฉ์ ์ต์ํํฉ๋๋ค.-
๋ค์ํ ๊ตฌํ ๋ฐฉ๋ฒ: PEFT๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค:
-
LoRA
(Low-Rank Adaptation):- ๊ธฐ์กด ๋ชจ๋ธ ๊ฐ์ค์น(์: ํธ๋์คํฌ๋จธ ๋ ์ด์ด์ Query ๋ฐ Value ํ๋ ฌ)๋ฅผ
์ ๋ญํฌ ํ๋ ฌ๋ก ๋ถํด
ํ์ฌ ํ์ต ๊ฐ๋ฅํ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐ. - ์ฃผ์ ๊ฐ์ค์น๋ ๋ณ๊ฒฝ๋์ง ์๊ณ , ์ ๋ญํฌ ํ๋ ฌ๋ง ํ์ต๋จ.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ฉด์ Fine-Tuning ์ฑ๋ฅ์ ๊ทผ์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ.
- ๊ธฐ์กด์ ๊ฐ์ค์น WWW๋ฅผ ๊ทธ๋๋ก ๋ ์ฑ, Wโฒ=W+Aโ
BWโ = W + A \cdot BWโฒ=W+Aโ
B ํํ๋ก ํํํฉ๋๋ค.
- ์ฌ๊ธฐ์:
- WWW: ๊ณ ์ ๋ ๊ธฐ์กด ๋ชจ๋ธ์ ๊ฐ์ค์น
- A,BA, BA,B: ํ์ต ๊ฐ๋ฅํ ์์ ์ ๋ญํฌ ํ๋ ฌ
- ์ฌ๊ธฐ์:
- ๊ธฐ์กด ๋ชจ๋ธ ๊ฐ์ค์น(์: ํธ๋์คํฌ๋จธ ๋ ์ด์ด์ Query ๋ฐ Value ํ๋ ฌ)๋ฅผ
-
Adapter
:- ํธ๋์คํฌ๋จธ ์ํคํ ์ฒ์ ๋ ์ด์ด ์ฌ์ด์ ์์ ์ด๋ํฐ ๋ชจ๋์ ์ถ๊ฐ.
- ์ด๋ํฐ๋ ์ฃผ๋ก ์ถ๊ฐ์ ์ธ
Feedforward Layer
๋๋Bottleneck Layer
๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.- ์๋ฅผ ๋ค์ด, ๊ธฐ์กด ๋ ์ด์ด์ ์ถ๋ ฅ hhh์ ๋ํด:
- hโฒ=h+g(Wdownโ Wupโ h)hโ = h + g(W_{down} \cdot W_{up} \cdot h)hโฒ=h+g(Wdownโโ Wupโโ h)
- WdownW_{down}Wdownโ๊ณผ WupW_{up}Wupโ์ ํ์ต ๊ฐ๋ฅํ ์์ ๊ฐ์ค์น ํ๋ ฌ.
- ์๋ฅผ ๋ค์ด, ๊ธฐ์กด ๋ ์ด์ด์ ์ถ๋ ฅ hhh์ ๋ํด:
- ๊ธฐ์กด ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ํน์ ์์ ์ ํ์ํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ์ต.
- ์ผ๋ฐ์ ์ผ๋ก ํ์ต ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ ์๊ฐ ๋งค์ฐ ์ ์.
-
Prefix Tuning
:- ์ ๋ ฅ ๋ฐ์ดํฐ ์์ ํ์ต ๊ฐ๋ฅํ ํ๋ฆฌํฝ์ค ํ ์๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ธ์ด ์๋ก์ด ์ ๋ณด๋ฅผ ํ์ตํ๋๋ก ์ ๋.
- ํ๋ฆฌํฝ์ค ํ
์๋ ์
๋ ฅ๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ํ์ต๋๋ฉฐ, ํธ๋์คํฌ๋จธ์ ๊ฐ ๋ ์ด์ด์ ์ดํ
์
๋ฉ์ปค๋์ฆ์ ์ํฅ์ ์ค๋๋ค.
- ์๋ฅผ ๋ค์ด, ์
๋ ฅ XXX์ ๋ํด, ์๋ก์ด ์
๋ ฅ XโฒXโXโฒ๋:
- Xโฒ=[P;X]Xโ = [P; X]Xโฒ=[P;X]
- PPP: ํ์ต ๊ฐ๋ฅํ ํ๋ฆฌํฝ์ค ํ ์.
- ์๋ฅผ ๋ค์ด, ์
๋ ฅ XXX์ ๋ํด, ์๋ก์ด ์
๋ ฅ XโฒXโXโฒ๋:
- ๊ธฐ์กด ๊ฐ์ค์น๋ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ, ํ๋ฆฌํฝ์ค ํ ์๋ง ํ์ต.
-
-
์ฅ์
:- Fine-Tuning ๋๋น ์ ์ ๊ณ์ฐ ์์์ ์ฌ์ฉํ๋ฉฐ, ๋ ์ ์ ๋ฐ์ดํฐ๋ก๋ ํ์ต์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋๊ท๋ชจ ๋ชจ๋ธ์ ์ ์ฉํ ๋ ํจ์จ์ ์ ๋๋ค.
-
๋จ์
:- ํน์ ํ๋ผ๋ฏธํฐ๋ง ํ์ตํ๋ค ๋ณด๋, ๋ณต์กํ ๋๋ฉ์ธ์ ๋ํ ํ์ต ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
๐ Traditional Fine-Tuning vs. Parameter-Efficient Fine-Tuning
- PEFT(Parameter-Efficient Fine-Tuning)๋ ์ ํต์ ์ธ Fine-Tuning๊ณผ ๋น๊ตํด ํจ์จ์ฑ์ ๊ฐ์กฐํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก, ๋๊ท๋ชจ ๋ชจ๋ธ์ ํ์ต์ํค๋ ๋ฐ ์์ด โ
๋ณต์ก์ฑ๊ณผ ๋น์ฉ
โ ๊ทธ๋ฆฌ๊ณ โ์ฑ๋ฅ
โ ์ธก๋ฉด์์ LLM ์ ๊ทผ ๋ฐฉ์์ ๋น๊ตํ๋ ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํญ๋ชฉ | Fine-Tuning | PEFT |
---|---|---|
ํ์ต ํ๋ผ๋ฏธํฐ ์ | ๋ชจ๋ธ์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ | ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ์ ๋ฐ์ดํธ |
๊ณ์ฐ ๋น์ฉ | ๋์ | ๋ฎ์ |
์ ์ฐ์ฑ | ํน์ ๋๋ฉ์ธ์ ํ์ | ๋ค์ํ ์์ ์ ๋น ๋ฅด๊ฒ ์ ์ฉ ๊ฐ๋ฅ |
ํ์ต ์๊ฐ | ์ค๋ ๊ฑธ๋ฆผ | ๋น๊ต์ ๋น ๋ฆ |
์ ์ฉ ๊ฐ๋ฅํ ์์ | ๋ณต์กํ ๋๋ฉ์ธ ์์ | ์ ์ ๋ฐ์ดํฐ๋ก ๋น ๋ฅด๊ฒ ์ ์ฉํด์ผ ํ๋ ์์ |
์ ์ฅํ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ํด์ํด๋ณผ ์ ์์ต๋๋ค.
Complexity of Implementation (๊ตฌํ ๋ณต์ก์ฑ)
- Prompt Engineering: ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก, LLM์ ์
๋ ฅ๊ฐ์ธ ํ๋กฌํํธ๋ฅผ ์กฐ์ ํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐฉ์์
๋๋ค.
- ๋ชจ๋ธ์ ์์ ํ์ง ์์ ๋ณต์ก์ฑ์ด ๋งค์ฐ ๋ฎ์ต๋๋ค.
- RAG: RAG๋ ๊ฒ์(Augmentation)๊ณผ ์์ฑ(Generation)์ ๊ฒฐํฉํ๊ธฐ ๋๋ฌธ์ ํ๋กฌํํธ ์์ง๋์ด๋ง๋ณด๋ค๋ ๋ณต์กํฉ๋๋ค.
- ํ์ง๋ง, ๋ชจ๋ธ ์์ฒด๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ์ง ์์ผ๋ฏ๋ก ์๋์ ์ผ๋ก ๊ฐ๋จํฉ๋๋ค.
- PEFT: ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ํ์ต์ํค๋ PEFT๋ RAG๋ณด๋ค ๋ณต์กํ์ง๋ง, ์์ ํ Fine-Tuning์ ๋นํด์๋ ๊ฐ๋จํฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ถ๊ฐ ํ๋ผ๋ฏธํฐ ์ฝ์ ์ด๋ LoRA์ ๊ฐ์ ๊ธฐ์ ์ค์ ์ด ํ์ํด ๊ตฌํ ๋์ด๋๊ฐ ๋์์ง ์ ์์ต๋๋ค.
- Full Fine-Tuning: ๋ชจ๋ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํด์ผ ํ๋ฏ๋ก ๊ฐ์ฅ ๋์ ๋ณต์ก์ฑ์ ๊ฐ์ง๋๋ค.
- ํนํ ๋๊ท๋ชจ ๋ชจ๋ธ์์๋ ๊ณ์ฐ ๋ฆฌ์์ค์ ์ค์ ๋ณต์ก๋๊ฐ ๋งค์ฐ ๋์ต๋๋ค.
Cost of Implementation & Maintenance (๊ตฌํ ๋ฐ ์ ์ง ๋น์ฉ)
- Prompt Engineering: ๋ชจ๋ธ์ ์ฌํ์ตํ ํ์๊ฐ ์์ด ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ต๋๋ค.
- ์ ๋ ฅ ํ๋กฌํํธ๋ฅผ ์ค๊ณํ๋ ๋ฐ๋ง ๋ฆฌ์์ค๊ฐ ์์๋ฉ๋๋ค.
- RAG: ๊ฒ์ ์ธํ๋ผ ๋ฐ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ๋น์ฉ์ด ์์ง๋ง, Fine-Tuning์ ๋นํด ์ ์ง ๋น์ฉ์ด ๋ฎ์ต๋๋ค.
- PEFT: ๊ณ์ฐ ๋ฆฌ์์ค๋ฅผ ์ ๊ฒ ์ฌ์ฉํ๊ณ ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ํ์ตํ๋ฏ๋ก ๋น์ฉ์ด ์ค๊ฐ ์์ค์
๋๋ค.
- ๊ทธ๋ฌ๋ LoRA๋ Adapter ์ถ๊ฐ๋ก ์ธํด ์ด๊ธฐ ์ค์ ๋น์ฉ์ด ๋ค ์ ์์ต๋๋ค.
- Full Fine-Tuning: ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ต์ํค๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๊ณ์ฐ ๋ฆฌ์์ค, ์ ์ง ๋ณด์ ๋น์ฉ์ด ๊ฐ์ฅ ๋์ต๋๋ค.
- ํนํ, ๋๋ฉ์ธ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ฉด ์ง์์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ์ฌ ๋น์ฉ์ด ๊ธ์ฆํ ์ ์์ต๋๋ค.
์ ์ฅํ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ํด์ํด๋ณผ ์ ์์ต๋๋ค.
Avoiding Hallucinations (ํ ๋ฃจ์๋ค์ด์ (ํ๊ฐ) ์ต์ํ)
- Prompt Engineering: ๊ธฐ๋ณธ์ ์ธ ํ๋กฌํํธ ์กฐ์ ์ผ๋ก๋ ํ๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- RAG: ์ธ๋ถ ์ง์๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก ์๋ตํ๋ฏ๋ก ํ๊ฐ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
- PEFT: ํ์ต๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ์ฌ ์์ ์ ์ํํ๋ฏ๋ก RAG๋ณด๋ค ํ๊ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ฝ๊ฐ ๋ถ์กฑํ ์ ์์ต๋๋ค.
- Full Fine-Tuning: ํน์ ๋๋ฉ์ธ ๋ฐ์ดํฐ๋ก ํ์ตํ์ฌ ํ๊ฐ ๋ฌธ์ ๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค.
Domain-Specific Terminology (๋๋ฉ์ธ ํนํ ์ฉ์ด)
- Prompt Engineering: ํนํ๋ ์ฉ์ด๋ฅผ ์ดํดํ๊ฑฐ๋ ์์ฑํ๋ ๋ฐ ํ๊ณ๊ฐ ์์ต๋๋ค.
- RAG: ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฒ์๋ ์ ๋ณด๋ฅผ ํ์ฉํด ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ์ดํดํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- PEFT: ํน์ ๋๋ฉ์ธ์ ๋ง์ถฐ ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ๋ฏ๋ก ๋๋ฉ์ธ ํนํ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
- Full Fine-Tuning: ์ ์ฒด ๋ชจ๋ธ์ ๋๋ฉ์ธ ๋ฐ์ดํฐ๋ก ํ์ตํ๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ๊ฐ์ฅ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Up-to-date Response (์ต์ ์๋ต ์ ๊ณต)
- Prompt Engineering: ๋ชจ๋ธ์ด ํ๋ จ๋ ๋ฐ์ดํฐ์ ์์กดํ๋ฏ๋ก ์ต์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- RAG: ์ธ๋ถ ์ง์๋ฒ ์ด์ค๋ฅผ ํตํด ์ต์ ์ ๋ณด๋ฅผ ๊ฒ์ํ์ฌ ์ฆ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- PEFT: ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ํ์ตํ ์ ์์ง๋ง, Fine-Tuning๊ณผ ๋น์ทํ ํ๊ณ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- Full Fine-Tuning: ์ฌ์ ํ์ต๋ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ์๋ตํ๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
Transparency & Interpretability (ํฌ๋ช ์ฑ ๋ฐ ํด์ ๊ฐ๋ฅ์ฑ)
- Prompt Engineering: ๋จ์ํ ์ค์ ์ด๋ฏ๋ก ํด์์ด ์ฉ์ดํฉ๋๋ค.
- RAG: ๊ฒ์๋ ์ ๋ณด ์ถ์ฒ๋ฅผ ์ถ์ ํ ์ ์์ด ํฌ๋ช ์ฑ๊ณผ ํด์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
- PEFT: ์ผ๋ถ ํ๋ผ๋ฏธํฐ๋ง ํ์ตํ๋ฏ๋ก ํด์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ์ ์์ต๋๋ค.
- Full Fine-Tuning: ๋ธ๋๋ฐ์ค ์ฑ๊ฒฉ์ด ๊ฐํ๋ฉฐ, ํ์ต ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ฑฐ๋ ํฌ๋ช ์ฑ์ ํ๋ณดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
-
Emerging Tech: Agentic Workflow
์ถ์ฒ : AI์ ์์ฐ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ (Agentic Workflow)
-
Agentic Workflow
- AI Agentic Workflow๋ ๋ณต์กํ ์์ ์ ์ฌ๋ฌ ๊ฐ์ ํนํ๋ ์์ด์ ํธ๋ก ๋ถํ ํ์ฌ ์ฒ๋ฆฌํ๋ AI ์์คํ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
- ์ด๋ ๋จ์ผ AI ๋ชจ๋ธ์ด ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ธฐ์กด ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, ๊ฐ ๋จ๊ณ๋ฅผ ์ ๋ฌธํ๋ ์์ด์ ํธ๊ฐ ๋ด๋นํจ์ผ๋ก์จ ๋์ฑ ํจ์จ์ ์ด๊ณ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
-
Stanford ์ค๋๋ฅ ์ ๊ต์๋
AI Agentic Workflow
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๊ณ ์์ต๋๋ค:- ๋ฐ๋ณต์ ์ธ ํ๋ก์ธ์ค: LLM์ด ๋ฌธ์๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ฌ ์์ ํ ์ ์๊ฒ ํฉ๋๋ค.
- ์์ฒด ํ๊ฐ ๋ฐ ๊ฐ์ : AI๊ฐ ์์ ์ ์ถ๋ ฅ์ ์์ฒด ํ๊ฐํ๊ณ ๊ฐ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ต๋๋ค.
- ํ์ ์์คํ : ์ฌ๋ฌ AI ์์คํ ์ด ์๋ก ์ํตํ๊ณ ๊ท ํ์ ๋ง์ถ๋ฉฐ ํ๋ ฅํ์ฌ ๋ณต์กํ ์์ ์ ์ํํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค
-
LLM ์์ด์ ํธ ๋์์ธ ํจํด
-
LLM ์์ด์ ํธ ํจํด
-
LLM ๊ธฐ๋ฐ ์์ด์ ํธ์ ๋ค์ํ ์ค๊ณ ๋ฐฉ์์ ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ต์ ์ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
์ฃผ์ ๋์์ธ ํจํด:
๋ฆฌํ๋ ์ (Reflection)
: AI๊ฐ ์์ฒด์ ์ผ๋ก ์์ ์ ๊ฒํ ํ๊ณ ๊ฐ์ ๋ฐฉ์์ ๋ง๋ จํฉ๋๋ค.๋๊ตฌ ์ฌ์ฉ(Tool Use)
: AI๊ฐ ์น ๊ฒ์, ์ฝ๋ ์คํ ๋ฑ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.๊ณํ(Planning)
: AI๊ฐ ๋ชฉํ ๋ฌ์ฑ์ ์ํ ๋ค๋จ๊ณ ๊ณํ์ ์๋ฆฝํ๊ณ ์คํํฉ๋๋ค.๋ค์ค ์์ด์ ํธ ํ์ (Multi-Agent Collaboration)
: ์ฌ๋ฌ AI ์์ด์ ํธ๊ฐ ํ๋ ฅํ์ฌ ์์ ์ ์ํํฉ๋๋ค.
-
์ฃผ์ ๋์์ธ ํจํด ์์ธ:
(1) Reflection Pattern
- ๊ฐ๋
:
- LLM์ ์ด๊ธฐ ์๋ต์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํ๊ณ , ์ด๋ฅผ ์์ ํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ .
- LLM์ด ์์ฒด ๊ฒํ ์ ํผ๋๋ฐฑ์ ํตํด ํ์ง์ ๋์.
- ์์:
- ๋ต๋ณ์ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์ค์ค๋ก ์์ .
- ํ ์คํธ ์์ฑ ํ ๋ฌธ๋ฒ, ๋ ผ๋ฆฌ ๋ฐ ์๋ฏธ๋ฅผ ์ฌ๊ฒํ .
- ์ ์ฉ ์ฌ๋ก:
- Self-Refine: Madaan et al.(2023)์ ์ฐ๊ตฌ์์ ๋ฐ๋ณต์ ์ธ ์์ฒด ํผ๋๋ฐฑ์ ํตํด ์๋ต ํ์ง ํฅ์.
- Reflexion: ๊ฐํํ์ต์ ์ฌ์ฉํ์ฌ ์ธ์ด ๋ชจ๋ธ์ ์ฑ๋ฅ ๊ฐ์ .
(2) Tool Use Pattern
- ๊ฐ๋
:
- LLM ์์ฒด ์ ๋ณด๊ฐ ๋ถ์ถฉ๋ถํ ๊ฒฝ์ฐ ์ธ๋ถ ๋๊ตฌ(API, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ)๋ฅผ ํ์ฉํ์ฌ ์ ๊ตํ ์๋ต ์์ฑ.
- ๊ฒ์, ๊ณ์ฐ, ๋ถ์ ๋๊ตฌ ๋ฑ ์ธ๋ถ ๋ฆฌ์์ค์ ์์กด.
- ์์:
- Google ๊ฒ์์ ํตํด ์ต์ ์ ๋ณด ํ์ธ.
- Wolfram Alpha๋ฅผ ์ฌ์ฉํด ์ํ ๋ฌธ์ ํด๊ฒฐ.
- YouTube ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๋์์ ์ ๋ณด ์ถ์ถ.
- ์ ์ฉ ์ฌ๋ก:
- Gorilla: API์ ์ฐ๊ณํ์ฌ ์ ๋ฐํ ์ ๋ณด ๊ฒ์ ์ํ.
- MM-REACT: ๋ฉํฐ๋ชจ๋ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์คํ์ ์ง์ํ๋ ์์คํ .
(3) Planning Pattern
- ๊ฐ๋
:
- ์์ ์ ์ธ๋ถํํ์ฌ ๋จ๊ณ์ ์ผ๋ก ์ํํ๊ณ ๊ฐ ๋จ๊ณ์์ ํผ๋๋ฐฑ์ ๋ฐ์.
- ๋ณต์กํ ์์ ๋ ์ฒด๊ณ์ ์ผ๋ก ๋ถํ ํด ํด๊ฒฐ.
- ์์:
- ReAct(Reasoning + Acting) ๊ธฐ๋ฒ์ ํตํด ์ถ๋ก ๊ณผ ํ๋์ ๋ฐ๋ณตํ๋ฉฐ ๋ชฉํ ๋ฌ์ฑ.
- ๋๊ท๋ชจ ๊ณํ(์: ๋ณด๊ณ ์ ์์ฑ)์ ์ธ๋ถํํ ํ ๊ฐ ๋ถ๋ถ์ ์ฒ๋ฆฌ.
- ์ ์ฉ ์ฌ๋ก:
- HuggingGPT: ๋ค์ํ AI ๋ชจ๋ธ์ ์กฐ์จํ์ฌ ๋ณต์กํ ์์ ์ฒ๋ฆฌ.
(4) Multi-Agent Collaboration
- ๊ฐ๋
:
- ์ฌ๋ฌ ์์ด์ ํธ๊ฐ ์๋ก ํ๋ ฅํ๋ฉฐ ์ญํ ์ ๋ถ๋ดํ์ฌ ์์ ์ ํจ์จ์ ์ผ๋ก ์ํ.
- ๊ฐ ์์ด์ ํธ๋ ๊ณ ์ ์ ๊ธฐ๋ฅ(์: ๋ฐ์ดํฐ ์์ง, ๋ถ์, ์คํ)์ ๋ด๋น.
- ์์:
- ์ํํธ์จ์ด ์์ง๋์ด ์ญํ ์ ์์ด์ ํธ์ ํ๋ก์ ํธ ๋งค๋์ ์ญํ ์ ์์ด์ ํธ๊ฐ ํ๋ ฅ.
- ํ ์์ด์ ํธ๋ ๋ฐ์ดํฐ ํฌ๋กค๋ง, ๋ค๋ฅธ ์์ด์ ํธ๋ ๊ฒฐ๊ณผ ๋ถ์.
- ์ ์ฉ ์ฌ๋ก:
- AutoGen: ๋ฉํฐ ์์ด์ ํธ ํ์ ์ ์ง์ํ๋ ํ๋ ์์ํฌ.
- CrewAI: ์์ ๋จ์ ๋ถ๋ด์ ํตํ ํ๋ ฅ ์ํ.
Chapter 2: Naive RAG
Naive RAG๋?
- Naive RAG๋ RAG์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ๋ก, ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ์ด๋ฅผ LLM์ ์ ๋ฌํ์ฌ ๋ต๋ณ์ ์์ฑํ๋ ๊ณผ์ ์ ํฌํจํฉ๋๋ค.
- ์ฃผ๋ก ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Vector DB)๋ฅผ ํ์ฉํ๋ฉฐ, ๊ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์คํธ๋ก ์ฌ์ฉํด LLM์ด ๋ณด๋ค ์ ํํ ๋ต๋ณ์ ์์ฑํ๋๋ก ๋์ต๋๋ค.
์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ค์น ๋ช ๋ น์ด
1
2
3
4
5
pip install langchain\
langchain-community\
langchain-openai\
langchain-huggingface\
langchain-cohere -qU
1
pip install pypdf faiss-cpu rank-bm25 ragas deepeval -qU
LangChain ๊ด๋ จ ํจํค์ง
langchain
: LLM ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ํ๋ ์์ํฌlangchain-community
: ์๋ํํฐ ํตํฉ์ ์ํ LangChain ํจํค์งlangchain-openai
: OpenAI์ LangChain ํตํฉ์ ์ํ ํจํค์งlangchain-huggingface
: Hugging Face์ LangChain ํตํฉ์ ์ํ ํจํค์งlangchain-cohere
: Cohere์ LangChain ํตํฉ์ ์ํ ํจํค์ง
๊ธฐํ ํจํค์ง
pypdf
: PDF ํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌfaiss-cpu
: ๊ณ ๋ฐ๋ ๋ฒกํฐ์ ํจ์จ์ ์ธ ์ ์ฌ์ฑ ๊ฒ์ ๋ฐ ํด๋ฌ์คํฐ๋ง์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌrank-bm25
: BM25 ๋ญํน ํจ์๋ฅผ ๊ตฌํํ ํจํค์งragas
: RAG(Retrieval-Augmented Generation) ์์คํ ์ ํ๊ฐํ๊ธฐ ์ํ ํ๋ ์์ํฌdeepeval
: RAG(Retrieval-Augmented Generation) ํ์ดํ๋ผ์ธ ํ๊ฐ๋ฅผ ์ํ ํ๋ ์์ํฌ
-qU ์ต์ ์ค๋ช
pip ๋ช ๋ น์ด์ -qU ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค:
-q
: quiet ๋ชจ๋๋ก, ์ค์น ๊ณผ์ ์ ์ถ๋ ฅ์ ์ต์ํํฉ๋๋ค.-U
: โupgrade์ ์ถ์ฝํ์ผ๋ก, ์ด๋ฏธ ์ค์น๋ ํจํค์ง๊ฐ ์๋ค๋ฉด ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํฉ๋๋ค.
๋ฐ๋ผ์ -qU ์ต์ ์ ์ฌ์ฉํ๋ฉด ํจํค์ง๋ฅผ ์กฐ์ฉํ ์ค์นํ๊ฑฐ๋ ์ ๊ทธ๋ ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
2.1. Vector DB ๊ตฌ์ถํ๊ธฐ
2.1.1. Documents Loading
- ์์ ๋ชฉ์ : ๋ค์ํ ํํ์ ๋ฌธ์๋ฅผ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ ์ํด ๋ถ๋ฌ์ต๋๋ค.
-
์ฝ๋ ์์
-
์ ๋ ฅ ์์ : ์๋ ์ฝ๋๋ PDF๋ฅผ ๋ก๋ฉํ๋ ์ฝ๋ snippet์ ๋๋ค.
1 2 3 4 5 6
from langchain.document_loaders import PyPDFLoader # PDF ํ์ผ ๋ก๋ฉ loader = PyPDFLoader("sample.pdf") docs = loader.load()
-
์ถ๋ ฅ ์์: ๋ก๋๋ ๋ฌธ์์ ํ์ด์ง ์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ธ.
1 2 3
print(len(docs)) # ๋ฌธ์์ ๊ฐ์ print(docs[0].metadata) # ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด
-
2.1.2. Chunking
- ๋ชฉ์ : ๋ฌธ์๋ฅผ ์ ์ ํ ํฌ๊ธฐ๋ก ๋ถ๋ฆฌํด ๊ฒ์ ํจ์จ์ฑ์ ๋์.
-
์ฒญํน(Chunking) ๋ฐฉ์
- ํ
์คํธ๋ฅผ ์ผ์ ํฌ๊ธฐ๋ก ๋๋ ์ฃผ๋ ๊ณผ์ .
ํฐ Chunk
=> ๋ง์ ์ ๋ณด, ๋ง์ ๋ ธ์ด์ฆ์์ Chunk
=> ์์ ์ ๋ณด, ์์ ๋ ธ์ด์ฆ- ์ ๋นํ ์ฌ์ด์ฆ์ ํฌ๊ธฐ๋ก ๋๋๋ ๊ฒ์ด ์์คํ ๊ฒฐ๊ณผ์ ์ถฉ์ค๋ ๋ฐ ๊ด๋ จ์ฑ์ ์ํฅ์ ์ค
- ํ
์คํธ๋ฅผ ์ผ์ ํฌ๊ธฐ๋ก ๋๋ ์ฃผ๋ ๊ณผ์ .
-
์ฌ๊ท์ ์ฒญํน(Recursive Chunking) ๋ฐฉ์
-
ํ ์คํธ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๋ถํ ํ์ฌ ์ ๋ณด์ ๋งฅ๋ฝ๊ณผ ์๋ฏธ๋ฅผ ๋ณด์กดํ๋ ๊ณผ์ .
- ๋จ์ ์ฒญํน ๋ฐฉ์์์๋ ํ ์คํธ๋ฅผ ์ผ์ ํฌ๊ธฐ๋ก ๋๋์ง๋ง, ์ฌ๊ท์ ์ฒญํน์ ํ ์คํธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ์ฌ ์์-ํ์ ๊ด๊ณ๋ฅผ ์ ์งํ๋ฉฐ ๋ถํ ํจ.
RecursiveCharacterTextSplitter
๋ ํ ์คํธ๋ฅผ ์ง์ ๋ ํฌ๊ธฐ์ ์ฒญํฌ๋ก ๋ถํ ํ๋ LangChain์ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ๋๋ค.-
์ด๋ฅผ ํ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๋ถํ ํ ํ ์ต์ข chunk๋ฅผ ์ ์ํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๋ถํ ๊ณผ์ :
- ์ง์ ๋ ๊ตฌ๋ถ์(separators)๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ถํ ํฉ๋๋ค.
- ํฐ ๋จ์์ ๊ตฌ๋ถ์๋ถํฐ ์์ํ์ฌ ์ ์ฐจ ์์ ๋จ์์ ๊ตฌ๋ถ์๋ก ์ด๋ํฉ๋๋ค.
-
๋ณํฉ ๊ณผ์ :
- ๋ถํ ๋ ํ ์คํธ ์กฐ๊ฐ๋ค์ ์ง์ ๋ chunk_size์ ๋ง๊ฒ ๋ณํฉํฉ๋๋ค.
- chunk_overlap์ ๊ณ ๋ คํ์ฌ ์ผ๋ถ ๋ด์ฉ์ด ๊ฒน์น๋๋ก ํฉ๋๋ค.
-
์ต์ข chunk ์ ์:
- ๋ณํฉ๋ ํ ์คํธ ์กฐ๊ฐ๋ค์ด ์ต์ข chunk๊ฐ ๋ฉ๋๋ค.
- ๊ฐ chunk๋ ์ง์ ๋ chunk_size๋ฅผ ์ด๊ณผํ์ง ์์ต๋๋ค.
-
-
์ฃผ์ ๋งค๊ฐ๋ณ์
chunk_size
: ๊ฐ ์ฒญํฌ์ ์ต๋ ๋ฌธ์ ์ (์ฌ๊ธฐ์๋ 100)chunk_overlap
: ์ฐ์๋ ์ฒญํฌ ๊ฐ ๊ฒน์น๋ ๋ฌธ์ ์ (์ฌ๊ธฐ์๋ 20)separators
: ํ ์คํธ๋ฅผ ๋ถํ ํ ๋ ์ฌ์ฉํ ๊ตฌ๋ถ์ ๋ชฉ๋ก
-
Separators์ ์๋ ๋ฐฉ์
separators ๋ฆฌ์คํธ [โ\n\nโ, โ\nโ, โ.โ, โ โ]๋ ์ฐ์ ์์ ์์๋๋ก ์ ์ฉ๋ฉ๋๋ค:
- โ
\n\n
โ: ๋จผ์ ๋น ์ค๋ก ๊ตฌ๋ถ๋ ๋จ๋ฝ์ ๋ถ๋ฆฌํฉ๋๋ค. - โ
\n
โ: ๊ทธ ๋ค์ ์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋ ์ค์ ๋ถ๋ฆฌํฉ๋๋ค. - โ
.
โ: ๊ทธ ๋ค์ ๋ง์นจํ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์ฅ์ ๋ถ๋ฆฌํฉ๋๋ค. - โโ: ๋ง์ง๋ง์ผ๋ก ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋จ์ด๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
- โ
-
-
์ฝ๋ ์์
-
์ ๋ ฅ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
from langchain.text_splitter import RecursiveCharacterTextSplitter # ์ ๋ ฅ ํ ์คํธ text = """ This is a sample document. It contains multiple paragraphs. Each paragraph contains multiple sentences. This is the second sentence in the second paragraph. Finally, this is the last paragraph. """ # RecursiveCharacterTextSplitter ์ค์ text_splitter = RecursiveCharacterTextSplitter( chunk_size=100, # ์ฒญํฌ ํฌ๊ธฐ (์ต๋ 100์) chunk_overlap=20, # ์ฒญํฌ ๊ฐ ๊ฒน์น๋ ๋ถ๋ถ (20์) separators=["\n\n", "\n", ".", " "] # ๋ถํ ๊ธฐ์ค ) # ํ ์คํธ ๋ถํ chunks = text_splitter.split_text(text) # ๋ถํ ๋ ์ฒญํฌ ์ถ๋ ฅ for i, chunk in enumerate(chunks): print(f"Chunk {i + 1}:\n{chunk}\n")
-
์ถ๋ ฅ
1 2 3 4 5 6 7 8 9 10 11
Chunk 1: This is a sample document. It contains multiple paragraphs. Chunk 2: Each paragraph contains multiple sentences. This is the second sentence in the second paragraph. Chunk 3: Finally, this is the last paragraph.
-
์ค๋ช
-
์ฒซ ๋ฒ์งธ ์ฒญํฌ:
- โ\n\nโ๋ก ๋ถ๋ฆฌ๋ ์ฒซ ๋ฒ์งธ ๋จ๋ฝ์ด ์ ํ๋ฉ๋๋ค.
- ์ด ๋จ๋ฝ์ 100์ ๋ฏธ๋ง์ด๋ฏ๋ก ๊ทธ๋๋ก ์ฒซ ๋ฒ์งธ ์ฒญํฌ๊ฐ ๋ฉ๋๋ค.
-
๋ ๋ฒ์งธ ์ฒญํฌ:
- ๋จ์ ํ ์คํธ์์ ๋ค์ โ\n\nโ๋ก ๊ตฌ๋ถ๋ ๋จ๋ฝ์ด ์ ํ๋ฉ๋๋ค.
- ์ด ๋จ๋ฝ๋ 100์ ๋ฏธ๋ง์ด๋ฏ๋ก ๊ทธ๋๋ก ๋ ๋ฒ์งธ ์ฒญํฌ๊ฐ ๋ฉ๋๋ค.
-
์ธ ๋ฒ์งธ ์ฒญํฌ:
- ๋ง์ง๋ง ๋จ์ ํ ์คํธ๊ฐ ์ธ ๋ฒ์งธ ์ฒญํฌ๊ฐ ๋ฉ๋๋ค.
chunk_overlap์ด 20์ผ๋ก ์ค์ ๋์์ง๋ง, ์ด ์์์์๋ ๊ฐ ์ฒญํฌ๊ฐ 100์ ๋ฏธ๋ง์ด์ด์ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๊ธฐ์ง ์์์ต๋๋ค.
-
-
๐ ์ฐธ๊ณ (Chunking ๊ธฐ๋ฒ)
2.1.3. Embedding
- Embedding์ ์ ์:
ํ ์คํธ
,์ด๋ฏธ์ง
,์์ฑ
๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ฐจ์์ ๋ฒกํฐ ๊ณต๊ฐ์ ํํํ๋ ๊ธฐ์ ์ ๋๋ค.- ์ด ๋จ๊ณ๋
๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Vector DB)
์์ ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ๊ณผ์ ์ ๋๋ค.
- ์ด ๋จ๊ณ๋
-
Embedding์ ์ญํ :
์๋ฏธ์ ์ ์ฌ์ฑ ํฌ์ฐฉ
: ์ ์ฌํ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ ๋ฒกํฐ ๊ณต๊ฐ์์ ์๋ก ๊ฐ๊น๊ฒ ์์นํฉ๋๋ค.์ฐจ์ ์ถ์
: ๊ณ ์ฐจ์์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์์ผ๋ก ํํํ์ฌ ํจ์จ์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.์ ์ฌ๋ ๊ธฐ๋ฐ ๊ฒ์
: ๋ฒกํฐ ๊ฐ ๊ฑฐ๋ฆฌ๋ ๊ฐ๋๋ฅผ ๊ณ์ฐํ์ฌ ์ ์ฌํ ํญ๋ชฉ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
-
Embedding ์์
- ์ด ์์์์๋
HuggingFace
์OpenAI์ ์๋ฒ ๋ฉ
๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. -
OpenAI์ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง API ํค๊ฐ ํ์ํ๊ณ ์ฌ์ฉ๋์ ๋ฐ๋ฅธ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12
# OpenAI API ์ฌ์ฉ from langchain.embeddings import OpenAIEmbeddings import os # OpenAI API ํค ์ค์ os.environ["OPENAI_API_KEY"] = "your-api-key-here" # ์๋ฒ ๋ฉ ๋ชจ๋ธ ์ค์ embedding_model = OpenAIEmbeddings() embeddings = [embedding_model.embed_query(chunk) for chunk in chunks]
-
๋ฐ๋ฉด HuggingFace ๋ชจ๋ธ์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๊ณ ๋ก์ปฌ์์ ์คํ ๊ฐ๋ฅํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก OpenAI ๋ชจ๋ธ์ ๋นํด ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
1 2 3 4 5 6 7 8 9 10
# HuggingFace ๋ชจ๋ธ ์ฌ์ฉ: from langchain_huggingface import HuggingFaceEmbeddings model_name = "BAAI/bge-m3" model_kwargs = {"device": "cuda"} encode_kwargs = {"normalize_embeddings": True} hf_embeddings = HuggingFaceEmbeddings( model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs )
- ์ด ์์์์๋
-
Embedding ํ์ฉ ์์
- ์๋ฒ ๋ฉ์ ์์ฑํ ํ์๋ ๋ฒกํฐ ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ์ฌ ํ ์คํธ ๊ฐ์ ์๋ฏธ์ ๊ด๊ณ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
- ์ด๋ ์ ๋ณด ๊ฒ์, ๋ฌธ์ ๋ถ๋ฅ, ์ถ์ฒ ์์คํ
๋ฑ ๋ค์ํ ์์ฐ์ด ์ฒ๋ฆฌ ์์
์ ํ์ฉ๋ฉ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12
import numpy as np # ์๋ฒ ๋ฉ ์ฐจ์ ํ์ธ print(f"์๋ฒ ๋ฉ ์ฐจ์: {len(embeddings[0])}") # ์๋ฒ ๋ฉ ๋ฒกํฐ ๊ฐ ์ ์ฌ๋ ๊ณ์ฐ (์ฝ์ฌ์ธ ์ ์ฌ๋) def cosine_similarity(v1, v2): return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) similarity = cosine_similarity(embeddings[0], embeddings[1]) print(f"์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ์ฒญํฌ์ ์ ์ฌ๋: {similarity}")
2.1.4. Vector DB ์ ์ฅ
์๋ฒ ๋ฉ ๊ณผ์ ์ ํตํด ์์ฑ๋ ๋ฒกํฐ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Vector DB)์ ์ ์ฅ๋ฉ๋๋ค.
- Vector DB๋ ๊ฒ์ ์๋๋ฅผ ๋์ด๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์๋ ๋น ๋ฅด๊ฒ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
-
๋ฒกํฐ DB ํน์ง
์ธ๋ฑ์ฑ(Indexing)
: ํจ์จ์ ์ธ ๊ฒ์์ ์ํด ๋ฒกํฐ๋ฅผ ์ธ๋ฑ์ฑํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ
: Milvus, Pinecone, Weaviate ๋ฑ ๋ฒกํฐ DB ํ๋ซํผ์ด ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๋น๋ฆฌ์ธ ์ค์ผ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
- ์ฝ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from langchain.vectorstores import FAISS
# 1. ๋ฒกํฐ DB ์์ฑ
vector_db = FAISS.from_documents(documents = split_documents,
embedding = embedding_model)
# 2. ๋ก์ปฌ์ ์ ์ฅ
vectorstore.save_local('./db/faiss')
# 3. ๋ก์ปฌ์์ ๋ก๋
vectorstore = FAISS.load_local(
'./db/faiss',
embedding_model,
allow_dangerous_deserialization=True
)
๐ (์ฐธ๊ณ ) ๋ค์ํ ์ ํ์ Vector DB
์๋ ๊ฐ ์นดํ ๊ณ ๋ฆฌ ๋ณ๋ก ๋ช๊ฐ์ง ์ฌ๋ก๋ค์ ์กฐ์ฌํด์ ์ค๋ช ์ ์ถ๊ฐํด ๋์์ต๋๋ค.
๐๏ธ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฃผ๋ก ๊ณ ์ฐจ์ ๋ฒกํฐ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ๊ฒ์์ ํนํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก,
๊ฒ์ ํจ์จ์ฑ
๊ณผํ์ฅ์ฑ
์ ์ ๊ณตํฉ๋๋ค.
- Milvus
- ๋ค์ํ ์ธ๋ฑ์ค ํ์ ์ง์๊ณผ ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ๊ฐ ํน์ง
- ํ๋์จ์ด ๊ฐ์ํ๋ ์ฐ์ฐ ์ง์๊ณผ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ์ ๊ณต
- 10๊ฐ ์ด์์ ์ธ๋ฑ์ค ํ์ ์ ์ง์ํ๋ฉฐ GPU ๊ธฐ๋ฐ ์ธ๋ฑ์ฑ๋ ๊ฐ๋ฅ
๐๏ธ ๋ฒกํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋๋
๋ฒกํฐ ์๋ฒ ๋ฉ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
.
- Faiss
https://github.com/facebookresearch/faiss
- Facebook AI(ํ Meta)๊ฐ ๊ฐ๋ฐํ ๋ฒกํฐ ์ ์ฌ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- C++๋ก ์์ฑ๋ ์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Python ๋ํผ ์ ๊ณต
- k-ํ๊ท ํด๋ฌ์คํฐ๋ง, ๊ทผ์ ๊ทธ๋ํ ๊ธฐ๋ฐ ๋ฐฉ์ ๋ฑ ๋ค์ํ ์ธ๋ฑ์ฑ ๋ฐฉ๋ฒ ์ง์
๐๏ธ Vector-capable SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๊ธฐ์กด SQL DB์ ๋ฒกํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์์คํ .
- Timescale
- PostgreSQL ๊ธฐ๋ฐ์ ๋ฒกํฐ ๊ฒ์ ๊ธฐ๋ฅ ์ ๊ณต
- ์๊ณ์ด ๋ฐ์ดํฐ์ ์ต์ ํ๋ ๋ฒกํฐ ๊ฒ์ ์ง์
- DiskANN ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ์ ๋น ๋ฅธ ์ ์ฌ๋ ๊ฒ์ ์ ๊ณต
๐๏ธ Vector-capable NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ์ํ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฒกํฐ ๊ธฐ๋ฅ์ ์ถ๊ฐ ์ ๊ณต.
- Cassandra
LLamaIndex - Cassandra Index Demo
- 5.0 ๋ฒ์ ๋ถํฐ ๋ฒกํฐ ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ
- Storage-Attached Indexing(SAI)๋ฅผ ํตํ ํจ์จ์ ์ธ ๋ฒกํฐ ์ธ๋ฑ์ฑ ์ ๊ณต
- ๋ถ์ฐ ์ํคํ ์ฒ๋ฅผ ํ์ฉํ ๋๊ท๋ชจ ๋ฒกํฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
-
(์ฐธ๊ณ )
SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
vsNoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ ์ ํต์ ์ธ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Relational Database Management Systems, RDBMS)๋ก, ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ ํํ๋ก ๊ตฌ์กฐํ๋์ด ์์ต๋๋ค.NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ์ ํ ๋ฐ์ดํฐ๋ฟ๋ง ์๋๋ผ ๋น์ ํ(Unstructured) ๋ฐ์ดํฐ์ ๋ฐ์ ํ(Semi-structured) ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค.-
SQL vs NoSQL: ์ฃผ์ ์ฐจ์ด์ ์ ๋ฆฌ
ํน์ง SQL NoSQL ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ณ ์ ๋ ์คํค๋ง ์คํค๋ง๊ฐ ์ ์ฐํ๊ฑฐ๋ ์์ ๋ฐ์ดํฐ ๊ด๊ณ ๊ด๊ณํ ๋ฐ์ดํฐ ์ง์ ๋น๊ด๊ณํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ฅ์ฑ ์์ง์ ํ์ฅ(๋ ๊ฐ๋ ฅํ ์๋ฒ) ์ํ์ ํ์ฅ(๋ ธ๋ ์ถ๊ฐ) ์ฟผ๋ฆฌ ์ธ์ด ํ์ค SQL ์ฌ์ฉ ๋ค์ํ API ๋ฐ ์์ฒด ์ฟผ๋ฆฌ ์ธ์ด ์ฌ์ฉ ํธ๋์ญ์ ์ง์ ACID ์์ฑ ๋ณด์ฅ BASE ์์ฑ(์ต์ข ์ผ๊ด์ฑ) ์ ๊ณต ์ฒ๋ฆฌ ๋ฐ์ดํฐ ์ ํ ์ ํ ๋ฐ์ดํฐ ๋น์ ํ ๋ฐ ๋ฐ์ ํ ๋ฐ์ดํฐ ์ ํฉํ ์ฌ์ฉ ์ฌ๋ก ๊ธ์ต, ERP, CRM ๋ฑ ๊ด๊ณํ ๋ฐ์ดํฐ ์์ ๋ฏธ๋์ด, IoT, ๋ก๊ทธ ๋ถ์
๐๏ธ Text Search Databases
- ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ฒ์์ ์ฒ๋ฆฌํ๋ฉฐ, ๋ฒกํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ๋ ์ ์ง์ ์ผ๋ก ๋์ .
- Elasticsearch
LLamaIndex - Elasticsearch Index Demo
- Apache Lucene ๊ธฐ๋ฐ์ ์คํ์์ค ์ ๋ฌธ ๊ฒ์ ์์ง
- ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ์๊ณผ ์๊ฐํ ๊ธฐ๋ฅ ์ ๊ณต
- ๊ตฌ์กฐํ/๋น๊ตฌ์กฐํ ๋ฐ์ดํฐ์ ๋ํ ๊ฐ๋ ฅํ ์ ๋ฌธ ๊ฒ์ ๊ธฐ๋ฅ ์ ๊ณต
2.2. ๊ฒ์๊ธฐ(Retriever)
๊ฒ์๊ธฐ(Retriever)๋ RAG ์์คํ ์์ ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ํด ์ ์ ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํด ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ํต์ฌ ๋ชจ๋์ ๋๋ค.
- ์๋๋
๊ฒ์๊ธฐ ์์ฑ
๊ณผ๊ฒ์ ๋ฐฉ์
์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ค๋ช ์ ๋๋ค.
1. ๊ฒ์๊ธฐ ์์ฑ
์ฝ๋ ์์
1
2
retriever = vector_db.as_retriever(search_type="similarity",
search_kwargs={"k": 5})
์ฃผ์ ๋งค๊ฐ๋ณ์
-
search_type
:- ๊ฒ์ ๋ฐฉ์์ ์ง์ ํฉ๋๋ค.
"similarity"
: ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ฒ์."mmr"
: MMR(Maximal Marginal Relevance) ๋ฐฉ์."similarity_score_threshold"
: ์ ์ฌ๋ ์ ์ ์๊ณ๊ฐ์ ์ค์ ํ์ฌ ํํฐ๋ง.
- ๊ฒ์ ๋ฐฉ์์ ์ง์ ํฉ๋๋ค.
-
search_kwargs
:- ๊ฒ์์ ์ฌ์ฉ๋๋ ์ถ๊ฐ ์ธ์๋ฅผ ์ ์ํฉ๋๋ค.
k
: ๋ฐํํ ๋ฌธ์ ์.fetch_k
: MMR ๊ฒ์์์ ์ด๊ธฐ ํ์ ๋ฌธ์ ์.lambda_mult
: MMR ๊ฒฐ๊ณผ์์ ์ ์ฌ์ฑ๊ณผ ๋ค์์ฑ ๊ฐ์ ๊ท ํ ์กฐ์ .
- ๊ฒ์์ ์ฌ์ฉ๋๋ ์ถ๊ฐ ์ธ์๋ฅผ ์ ์ํฉ๋๋ค.
2. ๊ฒ์ ๋ฐฉ๋ฒ
๊ฒ์๊ธฐ๋ ์ฌ์ฉ์์ ์ง์(Query)๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด ๋ฒกํฐ๋ค๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
(1) ์ ์ฌ๋ ๊ฒ์(Similarity Search)
- ์๋ฆฌ:
- ๋ฒกํฐ ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ์ฌ ์ง์์ ๊ฐ์ฅ ์ ์ฌํ ๋ฌธ์๋ฅผ ์ฐพ์ต๋๋ค.
- ์ฅ์ :
- ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ๋น ๋ฅธ ๊ฒ์์ด ๊ฐ๋ฅ.
- ๋จ์ :
- ๋ฐํ๋ ๋ฌธ์๊ฐ ์ค๋ณต๋๊ฑฐ๋ ๋ค์์ฑ์ด ๋ฎ์ ์ ์์.
- ์ฌ์ฉ ์ฌ๋ก:
- ์ถ์ฒ ์์คํ , ๋จ์ ์ ๋ณด ๊ฒ์.
- ์ฝ๋ ์์:
1 2
retriever = vector_db.as_retriever(search_type="similarity", search_kwargs={"k": 5})
(2) MMR (Maximal Marginal Relevance)
- ์๋ฆฌ:
- ์ง์์ ๋ํ ์ ์ฌ๋์ ๊ฒ์๋ ๋ฌธ์ ๊ฐ ๋ค์์ฑ์ ๋์์ ๊ณ ๋ คํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
lambda_mult
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ์ฌ์ฑ๊ณผ ๋ค์์ฑ์ ๊ฐ์ค์น๋ฅผ ์กฐ์ .
- ์ฅ์ :
- ๊ฒฐ๊ณผ์ ๋ค์์ฑ์ ํ๋ณด.
- ์ค๋ณต ๋ฌธ์๋ฅผ ๋ฐฉ์ง.
- ๋จ์ :
- ๊ณ์ฐ ๋น์ฉ์ด ๋ ๋์.
- ์ฌ์ฉ ์ฌ๋ก:
- ๋ฌธ์ ์์ฝ, ์ค๋ณต ์๋ ์ ๋ณด ์ ๊ณต.
- ์ฝ๋ ์์:
1 2 3 4 5
retriever = vector_db.as_retriever(search_type="mmr", search_kwargs={"k": 5, "fetch_k": 10, "lambda_mult": 0.6} )
(3) ์ ์ฌ๋ ์ ์ ์๊ณ๊ฐ ๊ฒ์(Similarity Score Threshold)
- ์๋ฆฌ:
- ๊ฒ์ ๊ฒฐ๊ณผ ์ค, ์ ์ฌ๋ ์ ์๊ฐ ํน์ ์๊ณ๊ฐ ์ด์์ธ ๋ฌธ์๋ง ๋ฐํ.
- ์ฅ์ :
- ์ง์์ ๊ด๋ จ ์๋ ๋ฌธ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํํฐ๋ง.
- ๋จ์ :
- ์๊ณ๊ฐ ์ค์ ์ด ์ด๋ ค์(๋๋ฌด ๋์ผ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ ๋ถ์กฑ, ๋๋ฌด ๋ฎ์ผ๋ฉด ๋ถํ์ํ ๊ฒฐ๊ณผ ํฌํจ).
- ์ฌ์ฉ ์ฌ๋ก:
- ๊ฒ์ ์ ํ๋๊ฐ ์ค์ํ ์ํฉ.
- ์ฝ๋ ์์:
1 2 3 4
retriever = vector_db.as_retriever( search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.8} )
2.3. ์์ฑ๊ธฐ
์ ์ฅ 2.2 ๊ฒ์๊ธฐ
์์ ๋ง๋ ๊ฒ์๊ธฐ๋ ์๋์ ๊ฐ์ด ๋์์ ํ๊ฒ ๋ฉ๋๋ค.
- ์ง์(Query) ์ฒ๋ฆฌ: ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ฒกํฐ๋ก ๋ณํ.
- ๋ฒกํฐ ๋น๊ต: ์ง์ ๋ฒกํฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด ์ ์ฅ๋ ๋ฒกํฐ ๊ฐ์ ์ ์ฌ๋ ๊ณ์ฐ.
- ๋ฌธ์ ์ ํ: ์ ํ๋ ๊ฒ์ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ ๋ฌธ์ ํํฐ๋ง(์ ์ฌ๋, MMR, ์๊ณ๊ฐ ๊ธฐ์ค).
- ๊ฒฐ๊ณผ ๋ฐํ: ์ ํ๋ ๋ฌธ์๋ฅผ ๋ฐํ.
๐ค ํ์ง๋ง ๊ฒ์๊ธฐ๋ง์ผ๋ก๋ ์ต์ข ์ ์ธ ๋ต๋ณ์ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฒ์๋ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๋ ๊ณผ์ ์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํฉ๋๋ค.
=> ์ด ์ญํ ์ ์ํํ๋ ๊ฒ์ด ๋ฐ๋ก ์์ฑ๊ธฐ(Generator)์ ๋๋ค.
- ๊ฒ์๊ธฐ๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ ์ฐพ์๋ด์ง๋ง, ๊ฒ์๋ ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์
ํ๊ณ
๊ฐ ์์ต๋๋ค:
- ๋ฌธ์๊ฐ ๋๋ฌด ๊ธธ๊ฑฐ๋ ์ง๋ฌธ๊ณผ ๊ด๋ จ ์๋ ์ธ๋ถ ์ ๋ณด ํฌํจ ๊ฐ๋ฅ.
- ์ง๋ฌธ์ ๋งฅ๋ฝ์ ๋ง๋ ์์ฝ์ด ํ์.
- ์ฌ์ฉ์์๊ฒ ์ต์ ํ๋ ๋ต๋ณ์ด ์๊ตฌ๋จ.
- ๋ฐ๋ผ์ ์์ฑ๊ธฐ๋ ๊ฒ์๋ ๋ฌธ์๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์ ์ง๋ฌธ์ ๋ง๋ ๊ฐ๊ฒฐํ๊ณ ์ ํํ ์๋ต์ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค.
๊ฒ์๊ธฐ์ ์์ฑ๊ธฐ์ ์ฐ๊ฒฐ
๊ฒ์๊ธฐ์ ์์ฑ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ๋์ํฉ๋๋ค:
-
์ง์(Query) โ ๊ฒ์๊ธฐ
:- ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ฒกํฐ๋ก ๋ณํํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ์ฌํ ๋ฌธ์๋ฅผ ๊ฒ์.
-
๊ฒ์ ๊ฒฐ๊ณผ โ ์์ฑ๊ธฐ
:- ๊ฒ์๋ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก LLM(Language Model)์ ํตํด ์ฌ์ฉ์ ์ง๋ฌธ์ ๋ํ ์ต์ ํ๋ ๋ต๋ณ ์์ฑ.
-
LLM โ ์๋ต ์์ฑ
:- ๊ฒ์๋ ๋ฌธ์์ ์ง๋ฌธ์ ๊ฒฐํฉํ ํ๋กฌํํธ๋ฅผ ํตํด LLM์ด ๋ต๋ณ์ ์์ฑ.
2.3.1. RAG ํ๋กฌํํธ
์์ฑ๊ธฐ์ ํต์ฌ์ ๊ฒ์๋ ๋ฌธ์๋ฅผ ์ง๋ฌธ๊ณผ ํจ๊ป ์ธ์ด ๋ชจ๋ธ์ ์ ๋ฌํ๋ ๋ฐฉ์์
๋๋ค. ์ด๋ฅผ ์ํด ํ๋กฌํํธ๋ฅผ ์ค๊ณํ์ฌ LLM์ด ํ๊ฐ(Hallucination)
์ ์ค์ด๊ณ ๋ช
ํํ ๋ต๋ณ์ ์์ฑ
ํ๋๋ก ์ ๋ํฉ๋๋ค.
-
ํ๋กฌํํธ ์์
1 2 3 4 5 6 7 8 9 10 11 12
prompt = PromptTemplate.from_template( """ ๋น์ ์ ์ง๋ฌธ ๋ต๋ณ ์์ ์ ์ํ ์ด์์คํดํธ์ ๋๋ค. ์ ๊ณต๋ ์ปจํ ์คํธ๋ฅผ ํ์ฉํ์ฌ ์ง๋ฌธ์ ๋ต๋ณํด ์ฃผ์ธ์. ๋ต์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ฅธ๋ค๊ณ ๋ง์ํด ์ฃผ์ธ์. ํ๊ตญ์ด๋ก ๋ต๋ณํด ์ฃผ์ธ์. #์ง๋ฌธ: {question} #์ปจํ ์คํธ: {context} #๋ต๋ณ: """ )
- ์ด ํ๋กฌํํธ๋ RAG(Retrieval-Augmented Generation) ์์คํ ์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ผ๋ก, ์ฃผ์ด์ง ์ง๋ฌธ์ ๋ํด ๊ฒ์๋ ์ปจํ ์คํธ๋ฅผ ๋ฐํ์ผ๋ก ํ๊ตญ์ด๋ก ๋ต๋ณ์ ์์ฑํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
-
์ฌ์ฉ์์ ์ง๋ฌธ(
question
)๊ณผ ๊ฒ์๊ธฐ๋ฅผ ํตํด ์ป์ ๊ด๋ จ ๋ฌธ๋งฅ(context
)์ด ๊ฐ๊ฐ {question
}๊ณผ {context
} ์์น์ ์ฝ์ ๋ฉ๋๋ค.question
: ์ฌ์ฉ์์ ์ง๋ฌธ.context
: ๊ฒ์๊ธฐ๋ฅผ ํตํด ๋ฐํ๋ ๊ด๋ จ ๋ฌธ์.- ๊ฒฐ๊ณผ : LLM์ ์ง๋ฌธ๊ณผ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ๊ณ ์์ฝ๋ ๋ต๋ณ์ ์์ฑ.
2.3.2. ์ธ์ด ๋ชจ๋ธ ์์ฑ
์์ฑ๊ธฐ๋ LLM์ ํ์ฉํ์ฌ ๊ฒ์๋ ๋ฌธ์์ ์ง๋ฌธ์ ๋ฐํ์ผ๋ก ๋ต๋ณ์ ๋ง๋ญ๋๋ค. OpenAI์ GPT-4, Hugging Face ๋ชจ๋ธ ๋ฑ ๋ค์ํ ์ธ์ด ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฝ๋ ์์
1
2
3
4
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4", temperature=0.5, max_tokens=1000)
-
temperature
: Temperature๋ LLM์ ์ถ๋ ฅ ๋ค์์ฑ๊ณผ ์ฐฝ์์ฑ์ ์กฐ์ ํ๋ ํต์ฌ ํ๋ผ๋ฏธํฐ์ ๋๋ค. ๋ฎ์ Temperature์ ์ฌ์ค์ ์ด๊ณ ๊ฐ๊ฒฐํ ์๋ต์, ๋์ Temperature์ ํ ํฐ์ ๋ฌด์์์ฑ์ด ์ฆ๊ฐํ์ฌ ๋ณด๋ค ๋ค์ํ๊ณ ์ฐฝ์กฐ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด์งํฉ๋๋ค.- Temperature ์ ํ Tips
- 0.0-0.5: ์ ํ์ฑ์ด ์ค์ํ ์์ (์: ๊ณ ๊ฐ ์๋น์ค, ๊ธฐ์ ๋ฌธ์)
- 0.6-0.7: ์ผ๋ฐ์ ์ธ ์ฉ๋
- 0.8-1.0: ์ฐฝ์์ ์์
- Temperature ์ ํ Tips
-
max_tokens
: Max tokens๋ ๋ชจ๋ธ์ด ์์ฑํ ์ ์๋ ์ถ๋ ฅ ํ ์คํธ์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํํฉ๋๋ค. ์ด๋, ํ๋กฌํํธ์ ํ ํฐ ์์ max_tokens์ ํฉ์ด ๋ชจ๋ธ์ ์ปจํ ์คํธ ๊ธธ์ด๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.- Max Tokens ์ค์ Tips
- ๋ชจ๋ธ์ ์ปจํ ์คํธ ๊ธธ์ด ์ ํ ๊ณ ๋ ค
- ์ค์ ํ์ํ ์ถ๋ ฅ ๊ธธ์ด์ ๋ง๊ฒ ์ ์ ํ ์ค์
- ์งง์ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ ๋ ๋ฎ์ ๊ฐ ์ค์
- Max Tokens ์ค์ Tips
(์ถ๊ฐ)
Top-P
(sampling)๋ ๋ชจ๋ธ์ด ๋ค์ ํ ํฐ(๋จ์ด)์ ์ ํํ ๋ ๋์ ํ๋ฅ ์ ๊ธฐ์ค์ผ๋ก ์ ํ ๋ฒ์๋ฅผ ์ ํํ๋ ํ๋ผ๋ฏธํฐ์ ๋๋ค.
- ํ๋ฅ ์ด ๋์ ํ ํฐ๋ถํฐ ๋์ ํ๋ฅ ์ ๊ณ์ฐํ์ฌ ์ค์ ๋ P๊ฐ์ ๋๋ฌํ ๋๊น์ง์ ํ ํฐ๋ค๋ง ์ ํ ๋์์ผ๋ก ๊ณ ๋ คํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด Top-P๊ฐ 0.9๋ผ๋ฉด, ํ๋ฅ ์ด ๋์ ์์๋๋ก ํ ํฐ๋ค์ ๋ํด๊ฐ๋ค๊ฐ ํฉ์ด 90%๊ฐ ๋๋ ์ง์ ๊น์ง์ ํ ํฐ๋ค๋ง ๊ณ ๋ คํฉ๋๋ค.
(Tips) Top-P & Temperature์์ ๊ด๊ณ
- Temperature์ Top-P๋ ๋ชจ๋ ํ ์คํธ ์์ฑ์ ๋ค์์ฑ์ ์ ์ดํ๋ ํ๋ผ๋ฏธํฐ์ด์ง๋ง:
- Temperature๋ ์ ์ฒด ํ๋ฅ ๋ถํฌ๋ฅผ ์กฐ์ ํ์ฌ ๋ค์์ฑ์ ์ ์ดํฉ๋๋ค.
- Top-P๋ ์ ํ ๊ฐ๋ฅํ ํ ํฐ์ ๋ฒ์๋ฅผ ์ ํํ์ฌ ๋ค์์ฑ์ ์ ์ดํฉ๋๋ค.
- ์ ๊ทธ๋ฆผ์์ ํ๋ผ๋ฏธํฐ ์ค์ ์, ๋ ์ค ํ๋๋ง ๋ณ๊ฒฝํ๋ผ๊ณ ๊ถ์ฅํ๋ ์ด์ ๋:
- ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋น์ทํ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ์กฐ์ ํ๋ฉด ์๋์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค
- Temperature์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ Top-P๋ ๋์ Temperature์์ ์์ ํ ์ด์ํ ํ ํฐ์ด ์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ญํ ์ ํฉ๋๋ค.
(์์) Top-P ๊ฐ์ ๋ฐ๋ฅธ โ๊ฐ์์ง๋ ์ด๋ค ๋๋ฌผ์ธ๊ฐ์?โ์ ๋ํ ๋ต๋ณ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฎ์ Top-P (0.3)
๋ชจ๋ธ์ ๊ฐ์ฅ ํ๋ฅ ์ด ๋์ ๋ช ๊ฐ์ง ์ ํ์ง๋ง ๊ณ ๋ คํ์ฌ ๋ต๋ณ:
โ๊ฐ์์ง๋ ๊ฐ๊ณผ์ ์ํ๋ ํฌ์ ๋ฅ์ ๋๋ค. ์ฌ๋๊ณผ ํจ๊ป ์ฌ๋ ๋ฐ๋ ค๋๋ฌผ์ ๋๋ค.โ
๋์ Top-P (0.9)
๋ ๋ง์ ์ ํ์ง๋ฅผ ๊ณ ๋ คํ์ฌ ๋ค์ํ ํํ ๊ฐ๋ฅ:
โ๊ฐ์์ง๋ ๊ฐ๊ณผ์ ์ํ๋ ํฌ์ ๋ฅ์ด๋ฉด์, ์ถฉ์คํ ๋ฐ๋ ค๋๋ฌผ์ ๋๋ค. ๋๋ผ์ด ํ๊ฐ๊ณผ ์ฒญ๊ฐ์ ๊ฐ์ก์ผ๋ฉฐ, ๋ค์ํ ํฌ๊ธฐ์ ํ์ข ์ด ์๊ณ , ์ธ๊ฐ๊ณผ ํน๋ณํ ์ ๋๊ด๊ณ๋ฅผ ํ์ฑํ ์ ์๋ ๊ฐ์ ์ด ํ๋ถํ ๋๋ฌผ์ ๋๋ค.โ
(์์) Temperature ๊ฐ์ ๋ฐ๋ฅธ โ๊ฐ์์ง๋ ์ด๋ค ๋๋ฌผ์ธ๊ฐ์?โ์ ๋ํ ๋ต๋ณ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค
๋ฎ์ Temperature (0.2)
๋ ์ฌ์ค์ ์ด๊ณ ์ผ๊ด๋ ๋ต๋ณ:
โ๊ฐ์์ง๋ ๊ฐ๊ณผ์ ์ํ๋ ๋ฐ๋ ค๋๋ฌผ์ ๋๋ค. ์ถฉ์คํ๊ณ ์ฌ๋๊ณผ ์ ์ด์ธ๋ฆฌ๋ฉฐ ๋ณดํธ์์๊ฒ ์ถฉ์ฑ์ฌ์ด ๊ฐํฉ๋๋ค.โ
๋์ Temperature (0.8)
๋ ์ฐฝ์์ ์ด๊ณ ๋ค์ํ ๋ต๋ณ:
โ๊ฐ์์ง๋ ์ฐ๋ฆฌ์ ์ถ์ ํ๋ณต์ผ๋ก ๋ฌผ๋ค์ด๋ ๋ง๋ฒ ๊ฐ์ ์กด์ฌ์์! ๋๋ก๋ ์ฅ๋๊พธ๋ฌ๊ธฐ ๊ด๋์ฒ๋ผ, ๋๋ก๋ ๋ ๋ ํ ์ํธ์ฒ์ฌ์ฒ๋ผ ์ฐ๋ฆฌ ๊ณ์ ์ง์ผ์ฃผ์ฃ .โ
2.3.3. Chaining
LangChain์ ํ์ฉํ๋ฉด ๊ฒ์๋ ๋ฌธ์
์ ์ง๋ฌธ์ ๊ฒฐํฉ
ํด ์์ฐ์ค๋ฌ์ด ํ๋ฆ์ผ๋ก ์์ฑ๊ธฐ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ฒด์ด๋(Chaining)์ด๋ผ๊ณ ํ๋ฉฐ, ๊ฒ์๊ณผ ์์ฑ ๋จ๊ณ๋ฅผ ํ๋์ ํ์ดํ๋ผ์ธ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
LCEL(LangChain Expression Language)
์ ์ฌ์ฉํ์ฌ Chain์ ์ฐ๊ฒฐํ๋ฉด ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌํํ๊ฑฐ๋ ์ฌ๋ฌ ๋จ๊ณ์ ๋
ผ๋ฆฌ์ ํ๋ฆ์ ๋ง๋ค ์ ์์ต๋๋ค.
(์ฐธ๊ณ ) LCEL(LangChain Expression Language)
LangChain Expression Language(LCEL)์ LangChain ํ๋ ์์ํฌ ๋ด์์ ๋ค์ํ ์ปดํฌ๋ํธ(Ex. ํ๋กฌํํธ ํ ํ๋ฆฟ, ์ธ์ด ๋ชจ๋ธ, ์ถ๋ ฅ ํ์ ๋ฑ)๋ฅผ ์ ์ธ์ ๋ฐฉ์์ผ๋ก ๊ฒฐํฉํ์ฌ ์ฒด์ธ์ ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
์ด๋ฅผ ํตํด ๋ณต์กํ LLM(Large Language Model) ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถํ ์ ์์ต๋๋ค.
- ์ฃผ์ ํน์ง:
์ ์ธ์ ๊ตฌ๋ฌธ
: ๋ณต์กํ ๋ก์ง์ ๊ฐ๋จํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ํํํ ์ ์์ต๋๋ค.๋ชจ๋์ฑ
: ๋ค์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์กฐํฉํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.์ ์ฐ์ฑ
: ๋ค์ํ ์ ํ์ LLM ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.ํ์ฅ์ฑ
: ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.์ต์ ํ
: ์คํ ์ ์๋์ผ๋ก ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.- ์ฃผ์ ๊ตฌ์ฑ ์์:
Runnable
: ๋ชจ๋ LCEL ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.Chain
: ์ฌ๋ฌ Runnable์ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค.RunnableMap
: ์ฌ๋ฌ Runnable์ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.RunnableSequence
: Runnable์ ์ํ์ค๋ฅผ ์ ์ํฉ๋๋ค.RunnableLambda
: ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ Runnable๋ก ๋ํํฉ๋๋ค
์ฝ๋ ์์ 1
- ๋จ์ผ ์ฒด์ธ : ์ฒด์ด๋(Chaining)์ ๊ฒ์๊ธฐ์์ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฐ์ด ๋ชจ๋ธ(LLM)๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ํ ์๋ต์ ์์ฑํ๋ ๊ณผ์ ์ ๋จ์ผ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# ๊ฒ์ ๋ฌธ์ ํ์ํ ํจ์
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
chain = {
"question": RunnablePassthrough(),
"context": faiss_retriever | format_docs
} | prompt | llm | StrOutputParser()
์ฃผ์ ๊ตฌ์ฑ์์ ์ค๋ช :
-
RunnablePassThrough()
:- ์ ๋ ฅ๋ ์ง๋ฌธ์ ๊ทธ๋๋ก ๋ค์ ๋จ๊ณ๋ก ์ ๋ฌํฉ๋๋ค.
- โquestionโ ํค๋ฅผ ํตํด ์ ๋ฌ๋ ์ง๋ฌธ์ ๋ณํ ์์ด ์ ์ง๋ฉ๋๋ค.
-
retriever | format_docs
:- ๊ฒ์๊ธฐ(retriever)๋ฅผ ํตํด ๊ฒ์๋ ๋ฌธ์๋ฅผ ํฌ๋งทํ ํ์ฌ โcontextโ๋ก ์ ๋ฌํฉ๋๋ค.
- format_docs๋ ๊ฒ์๋ ๋ฌธ์์ ๋ด์ฉ์ ํ๋์ ๋ฌธ์์ด๋ก ๋ณํฉํฉ๋๋ค.
-
prompt | llm | StrOutputParser()
:- ๊ฒ์๋ ๋ฌธ์(context)์ ์ง๋ฌธ(question)์ ๊ฒฐํฉํ์ฌ LLM์ ์ ๋ฌํ๊ณ , ์๋ต์ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ์๋ต์ ๋ฌธ์์ด ํํ(StrOutputParser)๋ก ๋ฐํ๋ฉ๋๋ค.
์์์ฒ๋ผ chain์ ์ ์ํ๊ณ ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ์คํํ ์ ์์ต๋๋ค.
์ฝ๋ ์์ 2
- ๋ณต์ ์ฒด์ธ: LCEL์ ํ์ฉํ๋ฉด ์ฌ๋ฌ ์ฒด์ธ์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ค์์ ์ฒด์ธ์ ์ฐ๊ฒฐํ์ฌ ๋ค๋จ๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ถ๊ฐ ์์์ ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# ์ฒซ ๋ฒ์งธ ์ฒด์ธ: ํ๊ตญ์ด ์ง๋ฌธ์ ์์ด๋ก ๋ฒ์ญ (KOR2ENG)
prompt1 = ChatPromptTemplate.from_template(
"[{korean_input}] translate the question into English.
Don't say anything else, just translate it."
)
chain1 = (
prompt1
| llm
| StrOutputParser()
)
# ๋ ๋ฒ์งธ ์ฒด์ธ: ๋ฒ์ญ๋ ์ง๋ฌธ์ ๋ํ ๋๋ต ์์ฑ
prompt2 = ChatPromptTemplate.from_messages([
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "{input}"}
])
chain2 = (
{"input": chain1} # chain1์ ์ถ๋ ฅ์ด chain2์ input์ผ๋ก ์ ๋ฌ๋จ
| prompt2
| llm
| StrOutputParser()
)
# ์ฒด์ธ ์คํ
result = chain2.invoke({"korean_input": "๋ํต๋ น์ ์ ๋ํด ์ค๋ช
ํด์ค"})
print(result)
์ฃผ์ ๊ตฌ์ฑ์์ ์ค๋ช :
-
chain1
: ํ๊ตญ์ด -> ์์ด ๋ฒ์ญ (KOR2ENG)- ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๋ฐ์ ํ๊ตญ์ด ์ง๋ฌธ(
korean_input
)์ ์์ด๋ก ๋ฒ์ญ. - ํ๋กฌํํธ ํ ํ๋ฆฟ๊ณผ LLM์ ์ฌ์ฉํ์ฌ ๋ฒ์ญ ์์ ์ํ.
- ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๋ฐ์ ํ๊ตญ์ด ์ง๋ฌธ(
-
chain2
: ์์ด ์ง๋ฌธ -> ๋ต๋ณ ์์ฑchain1
์ ์ถ๋ ฅ(๋ฒ์ญ๋ ์์ด ์ง๋ฌธ)์ ์ ๋ ฅ๋ฐ์ ๋ต๋ณ ์์ฑ.- ๋ฒ์ญ๋ ์ง๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก LLM์ ํตํด ์ต์ ์ ๋ต๋ณ์ ๋ฐํ.
-
์ฒด์ธ ์ฐ๊ฒฐ
:chain1
์ ์ถ๋ ฅ์ ์๋์ผ๋กchain2
์ ์ ๋ ฅ(input)์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.- LCEL ๋ฌธ๋ฒ์ ํตํด ์ฒด์ธ์ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ฐ๊ฒฐ.
์ฒด์ธ ํ๋ฆ
- ๊ทธ๋ ๋ค๋ฉด
chain2.invoke({"korean_input": "๋ํต๋ น์ ์ ๋ํด ์ค๋ช ํด์ค"})
์ ์คํํ์ ๋ ์ด๋ป๊ฒ ํธ์ถ์ด ๋ ๊น์?chain2.invoke()
ํธ์ถ์ ๋ ฅ
:{"korean_input": "๋ํต๋ น์ ์ ๋ํด ์ค๋ช ํด์ค"}
korean_input
์chain1
์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
chain1
์คํ: ๋ฒ์ญ ์์prompt1
์์ ํ๋กฌํํธ ํ ํ๋ฆฟ์ด ์์ฑ๋ฉ๋๋ค.1 2 3
[๋ํต๋ น์ ์ ๋ํด ์ค๋ช ํด์ค] translate the question into English. Don't say anything else, just translate it.
- LLM์ด ์ด ํ๋กฌํํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ
๋ฒ์ญ๋ ์์ด ์ง๋ฌธ
์ ์์ฑํฉ๋๋ค.1 2
"Explain about the presidential system."
๋ฒ์ญ ๊ฒฐ๊ณผ
๋ฅผchain2
๋ก ์ ๋ฌchain1
์ ์ถ๋ ฅ์ธ ๋ฒ์ญ๋ ์ง๋ฌธ โExplain about the presidential system.โ์ดchain2
์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
chain2
์คํ: ๋๋ต ์์ฑ-
prompt2์ ํ ํ๋ฆฟ์ด ์์ฑ๋ฉ๋๋ค:
1 2 3
SYSTEM: You are a helpful assistant. USER: Explain about the presidential system.
-
LLM์ด ์ด ํ๋กฌํํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋๋ต์ ์์ฑํฉ๋๋ค:
1 2
"A presidential system is a form of government where the president is the head of state and government, often elected by the people."
-
(์ ๋ฆฌ) ์ ๋ ฅ ๋ฐ์ดํฐ ํ๋ฆ:
korean_input
โchain1
โchain2
.
์ฝ๋ ์์ 3
- ๋ณ๋ ฌ ์ฒด์ธ: LCEL์ ์ฒด์ธ์ ์ ์ฐํ๊ฒ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋ณ๋ ฌ ์คํ์ ์ง์ํ์ฌ ๋ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel
# ๋ ๊ฐ์ ์ฒด์ธ ์์ฑ
joke_chain = (
ChatPromptTemplate.from_template("{topic}์ ๊ดํ ์งง์ ๋๋ด์ ๋งํด์ค")
| llm
| StrOutputParser()
)
poem_chain = (
ChatPromptTemplate.from_template("{topic}์ ๊ดํ 5์ค ํ๋์๋ฅผ ์จ์ค")
| llm
| StrOutputParser()
)
# ๋ณ๋ ฌ ์คํ
parallel_chain = RunnableParallel({"joke": joke_chain, "poem": poem_chain})
# ์คํ
response = parallel_chain.invoke({"topic": "AI"})
print(response["joke"].content)
print(response["poem"].content)
์ฃผ์ ๊ตฌ์ฑ์์ ์ค๋ช :
-
RunnableParallel
:- ๋ ๊ฐ์ ์ฒด์ธ์ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค.
joke_chain
๊ณผpoem_chain
์ด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๋์ผํ ์ ๋ ฅ ๋ณ์(topic
)๋ฅผ ๊ณต์ ํฉ๋๋ค.
-
joke_chain
:- ์ ๋ ฅ๋ ์ฃผ์ (topic)์ ๋ํด ์งง์ ๋๋ด์ ์์ฑํฉ๋๋ค.
- ํ๋กฌํํธ์ ์ธ์ด ๋ชจ๋ธ(LLM)์ ์ฐ๊ฒฐํ์ฌ ์๋ต์ ์์ฑ.
-
poem_chain
:- ๋์ผํ ์ฃผ์ ์ ๋ํด ์งง์ ์๋ฅผ ์์ฑํฉ๋๋ค.
joke_chain
๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ก ์๋ํ์ง๋ง, ์๋ต์ ๋ด์ฉ์ ์(poem)๋ก ์ค์ .
-
๊ฒฐ๊ณผ ๋ณํฉ
:RunnableParallel
์ ๋ ์ฒด์ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณํฉํ์ฌ โjokeโ์ โpoemโ ํค์ ์ ์ฅ๋ ์๋ต์ ๋ฐํํฉ๋๋ค.
Chapter 3: Advanced RAG
Advanced RAG๋?
Advanced RAG๋ Naive RAG์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์๋, ๊ฒ์ ํ์ง ํฅ์
๊ณผ ๋ต๋ณ ์์ฑ ์ต์ ํ
๋ฅผ ์ํด ์ถ๊ฐ์ ์ธ ์ ๋ต๊ณผ ๊ณผ์ ์ ํฌํจํ ๊ณ ๋ํ๋ RAG ๊ตฌ์กฐ์
๋๋ค.
- ์ด ๊ตฌ์กฐ๋ Naive RAG์์ ๋ฐ์ํ ์ ์๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ํ๋ ์ ํ์ ์ค๋ณต๋ ์๋ต ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ๋์ฑ ๋ณต์กํ ์ง๋ฌธ์ ๋์ฒํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๊ฒ์ ํ์ง ํฅ์์ด๋ผ๋ ๋ชฉํ๋ฅผ ๋๊ณ , ์๋ ์ฌํญ๋ค์ด ๊ฐ์ ๋์์ต๋๋ค.
- ์ง์ํ ์ฆ๊ฐ(Knowledge Enrichment):
- ๊ฒ์๋ ๋ฌธ์๋ฅผ ์ถ๊ฐ ๊ฐ๊ณตํ๊ฑฐ๋ ๊ธฐ์กด ์ง์๊ณผ ์ฐ๊ฒฐํ์ฌ ์ ๋ณด์ ๊น์ด๋ฅผ ๊ฐํ.
- ์: ์์ฝ, ํตํฉ, ๋๋ฉ์ธ ์ง์ ์ ์ฉ.
- ๊ฒ์ ์ ์ต์ ํ(Pre-Retrieval Process):
- ๊ฒ์ ์ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๊ฑฐ๋ ํํฐ๋ง.
- ์: ์ ํฉํ ํค์๋ ์ถ์ถ, ๋ถํ์ํ ์ฟผ๋ฆฌ ์ ๊ฑฐ.
- ๊ฒ์ ํ ์ต์ ํ(Post-Retrieval Process):
- ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ ์ค์๋๋ฅผ ์ฌ์กฐ์ ํ์ฌ ์ ํฉํ ๋ฌธ์๋ง ์ ํ.
- ์: MMR(Maximal Marginal Relevance) ๋ฐฉ์ ์ ์ฉ, ๊ด๋ จ์ฑ ์ ์ ๊ธฐ๋ฐ ์ฌ์ ๋ ฌ.
- ์ง์ํ ์ฆ๊ฐ(Knowledge Enrichment):
๊ฐ๊ฐ์ ๊ฐ์ ์ฌํญ์ ๋ํด์ ์๋์์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฃผ์ ๊ธฐ์ ๋ฐ ์ต์ ํ
1. ์ง์ํ ์ฆ๊ฐ(Knowledge Enrichment)์ด๋?
์ง์ํ ์ฆ๊ฐ์ ๊ธฐ์กด์ ๊ฒ์ ๊ณผ์ ์ ๋จ์ํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์์ ๋์๊ฐ, ๊ฒ์๋ ์ ๋ณด๋ฅผ ๋์ฑ ๊ตฌ์กฐ์ ์ด๊ณ ํ๋ถํ๊ฒ ๋ง๋ค์ด ๊ฒ์ ํ์ง์ ํฅ์์ํค๋ ๊ณผ์ ์ ๋๋ค.
์ด๋ฅผ ์ํด ์ฃผ์ ๊ธฐ์
๊ณผ ์ ๊ทผ ๋ฐฉ์
์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํฉ๋๋ค:
-
Document Level
-
๊ตฌ์กฐ์ ํ์ฑ (Structural Parsing)
- ๋ฌธ์์ ๋ฌธ๋จ, ์น์ , ํ์ ๊ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ถ์ํ์ฌ ์ ๋ณด์ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํฉ๋๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ ๊ฒ์ ์ฟผ๋ฆฌ์ ๋งฅ๋ฝ์ ๋์ฑ ์ ๊ตํ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.
-
๋ฉํฐ๋ชจ๋ฌ ์ฒ๋ฆฌ (Multi-Modal Processing)
- ํ ์คํธ๋ฟ๋ง ์๋๋ผ ์ด๋ฏธ์ง, ํ, ๋ํ์ ๊ฐ์ ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ, ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ํตํฉ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ด๋ฅผ ํตํด ๋จ์ ํ ์คํธ ๊ธฐ๋ฐ์ ๊ฒ์์์ ๋ฒ์ด๋, ๋ณด๋ค ์๋ฏธ ์๋ ๋ฐ์ดํฐ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฅํฉ๋๋ค.
-
๋ฉํ๋ฐ์ดํฐ ์ฆ๊ฐ (Metadata Enrichment)
- ๋ฌธ์์ ํ์ด์ง ๋ฒํธ, ์์ฑ์, ์นดํ ๊ณ ๋ฆฌ, ์๊ฐ ์คํฌํ ๋ฑ ๋ฉํ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ๊ฒ์์ ์ ํ์ฑ๊ณผ ์๋๋ฅผ ๋์ ๋๋ค.
- ์: ์ํฐํฐ ์ถ์ถ(์ธ๋ฌผ, ์ฅ์, ์ฌ๊ฑด ๋ฑ)์ ํตํด ์์ฑ๋ ์ง์ ๊ทธ๋ํ๋ฅผ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ฐ์.
-
-
Model Level
- ์๋ฐฐ๋ฉ ๋ชจ๋ธ ํ์ธํ๋(Finetune Embedding Models)
- ์ง๋ฌธ๊ณผ ๊ฒ์ ์ฟผ๋ฆฌ ๊ฐ์ ์๋ฏธ์ ๊ด๋ จ์ฑ์ ๊ฐํํ๊ธฐ ์ํด, ์ฌ์ ํ์ต๋ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ํน์ ๋๋ฉ์ธ์ ๋ง๊ฒ ์กฐ์ ํ๋ ๊ณผ์ ์ ๋๋ค.
- ํนํ ๋๋ฉ์ธ ํนํ ๊ฒ์์ด ํ์ํ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ธ ์๋ฒ ๋ฉ ๋ชจ๋ธ๋ก๋ ๋ถ์กฑํ ์ ์์ด, ํ์ธํ๋์ ํตํด ์ ํ๋๋ฅผ ๋์ ๋๋ค.
- ์๋ฐฐ๋ฉ ๋ชจ๋ธ ํ์ธํ๋(Finetune Embedding Models)
2. ๊ฒ์ ์ ์ต์ ํ (Pre-Retrieval Optimization)
2.1. HyDE (Hypothetical Document Embeddings)
- ๊ฐ๋ : ์ฌ์ฉ์๊ฐ ์ ์ํ ์ง๋ฌธ์ ๊ธฐ๋ฐํ์ฌ โ๊ฐ์์ ๋ฌธ์โ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๊ฒ์ ๊ณผ์ ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ํต์ฌ ํน์ง
- ๊ฐ์ ๋ฌธ์ ์์ฑ: ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ์ฌ์ฉํ์ฌ, ์ฌ์ฉ์์ ์ง๋ฌธ์ ์์ธํ ๋ต๋ณํ๋ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์๋ฒ ๋ฉ ํ์ฉ: ์์ฑ๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์๋ฒ ๋ฉํ์ฌ ๊ฒ์ ํ๋ก์ธ์ค์ ํตํฉํฉ๋๋ค.
- ์ฅ์ :
- ์ฌ์ฉ์์ ์ง๋ฌธ์ด ๊ตฌ์ฒด์ ์ด์ง ์์ ๋๋ ํจ๊ณผ์ ์ธ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ์์ ๋ต๋ณ์ ํตํด, ์ฌ์ฉ์๊ฐ ์ฐพ๊ณ ์ ํ๋ ๋ฌธ๋งฅ์ ๋ณด์ํฉ๋๋ค.
- ํ์ฉ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from langchain.prompts.chat import SystemMessagePromptTemplate
def generate_hypothetical_document(query):
template =
"Imagine you are an expert writing a detailed explanation on the topic: '{query}'.
Your response should be comprehensive and include all key points from top search results."
system_message_prompt = SystemMessagePromptTemplate.from_template(template=template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt])
messages = chat_prompt.format_prompt(query=query).to_messages()
response = llm(messages=messages)
return response.content
(์ฐธ๊ณ ) Langchain ํจ์๋ฅผ ์ด์ฉํ Hyde ๊ตฌํ
- HypotheticalDocumentEmbedder๋ฅผ ํตํ ๊ฐ์ ๋ฌธ์ ์์ฑ:
HypotheticalDocumentEmbedder.from_llm
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ, LLM๊ณผ ๊ธฐ๋ณธ ์๋ฒ ๋ฉ(Base Embedding)์ ๊ฒฐํฉํ HyDE ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.- HypotheticalDocumentEmbedder๋ฅผ ์ด๊ธฐํํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค:
llm
: ์ธ์ด ๋ชจ๋ธ (์: OpenAI์ GPT ๋ชจ๋ธ)Embeddings
: ๊ธฐ๋ณธ ์๋ฒ ๋ฉ ๋ชจ๋ธprompt_key
: ํ๋กฌํํธ ํ ํ๋ฆฟ์ ์ ํํ๋ ํค
prompt_key='web_search'
๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์์ฑํ ๋ ํ์ฉ๋๋ ํ๋กฌํํธ ํ ํ๋ฆฟ์ ์ง์ ํฉ๋๋ค. ์ด ํ๋กฌํํธ ํ ํ๋ฆฟ์ ์์ฑ๋ ๊ฐ์ ๋ฌธ์์ ๋ด์ฉ๊ณผ ํ์์ ๊ฒฐ์ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.prompt_key='web_search'
ํ๋กฌํํธ๋ ์น ๊ฒ์๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๋๋ก ์ค๊ณ๋์ด, ์ฌ์ฉ์ ์ง๋ฌธ์ ๋ํ ๊ฐ์์ ์น ๊ฒ์ ๊ฒฐ๊ณผ๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ์์ฑํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ต๋๋ค.1 2 3 4 5
web_search_template = """ Please write a passage to answer the question Question: {QUESTION} Passage:"""
- ๋ง์ฝ ํน์ ๋๋ฉ์ธ์ด๋ ๋ชฉ์ ์ ๋ง๋ ๋ง์ถคํ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด,
custom_prompt
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ง์ ํ๋กฌํํธ ํ ํ๋ฆฟ์ ์ ๊ณตํ ์ ์์ต๋๋ค.1 2 3 4 5
custom_prompt = PromptTemplate( input_variables=["question"], template="์ต์ ๊ธฐ์ ๋ํฅ์ ๋ํด ์์ธํ ์ค๋ช ํด์ฃผ์ธ์: {question}" )
- (์์) ๋ฒกํฐ ์คํ ์ด(Vector Store) ๊ตฌ์ฑ:
FAISS.from_documents
๋ Facebook AI๊ฐ ๊ฐ๋ฐํ FAISS(Facebook AI Similarity Search) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ณํํ๋ ๋ฉ์๋์ ๋๋ค.- ์ด๋ ์๋์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ค์ ์ฌ์ฉํฉ๋๋ค:
documents
: split_documents๋ฅผ ํตํด ๋ถํ ๋ ๋ฌธ์๋คembedding
: hyde_embedding์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ๋ฒกํฐํ
- (์์) ๊ฒ์ ์คํ:
hyde_retriever.as_retriever
๋ฅผ ํตํด MMR(Maximal Marginal Relevance) ๋ฐฉ์์ผ๋ก ๊ฒ์์ ์ํํฉ๋๋ค.search_type="mmr"
:- MMR(Maximal Marginal Relevance) ๊ฒ์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ค์์ฑ๊ณผ ๊ด๋ จ์ฑ์ ๋ชจ๋ ๊ณ ๋ คํฉ๋๋ค.
search_kwargs
:- k : ๊ฒ์ํ ๋ฌธ์์ ์ (์ด๋ฏธ์ง์์๋ 30์ผ๋ก ์ค์ )
- fetch_k : k+10์ผ๋ก ์ค์ ํ์ฌ ์ถ๊ฐ ํ๋ณด ๋ฌธ์๋ฅผ ๊ฒ์
- lambda_mult : 0.15๋ก ์ค์ ํ์ฌ ๋ค์์ฑ๊ณผ ๊ด๋ จ์ฑ ์ฌ์ด์ ๊ท ํ์ ์กฐ์
2.2. Multi-Query
-
๊ฐ๋ : Multi-Query๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ
๋จ์ผ ์ง๋ฌธ(์ฟผ๋ฆฌ)
์ ์ฌ๋ฌ ๊ฐ์ ํ์ ์ง๋ฌธ์ผ๋ก ๋ณํํ์ฌ ๊ฒ์ ๊ณผ์ ์ ํ์ง์ ๊ทน๋ํํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.- ๋จ์ผ ์ง๋ฌธ์ด ๊ฐ์ง๊ณ ์๋ ์๋๋ ์๋ฏธ์ ํ๊ณ๋ฅผ ๋ณด์ํ๋ฉฐ, ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ค์์ฑ๊ณผ ํฌ๊ด์ฑ์ ๋์ด๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.
-
์ด ์ ๊ทผ ๋ฐฉ์์ ํนํ ๋ณต์กํ๊ฑฐ๋ ๋์์ค๊ฐ ํ์ํ ์ง๋ฌธ์ ์ฒ๋ฆฌํ ๋ ๊ฐ๋ ฅํ ํจ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, โ2025๋
ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?โ์ด๋ผ๋ ์ง๋ฌธ์ ๋ํด
๋ค์ํ ๊ด์
(์ ์ฑ
,๊ฒฝ์ ์ํฉ
,๊ธ๋ก๋ฒ ๋ํฅ
๋ฑ)์์ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ณ , ์ด๋ฅผ ๊ฒฐํฉํ์ฌ ์ข ํฉ์ ์ธ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, โ2025๋
ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?โ์ด๋ผ๋ ์ง๋ฌธ์ ๋ํด
์ฝ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.llms import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import RunnablePassthrough
from langchain.chains import Chain
# ์ธ์ด ๋ชจ๋ธ ๋ฐ ๊ธฐ๋ณธ ๊ฒ์๊ธฐ ์ค์
llm = ChatOpenAI(temperature=0.5) # ์ง๋ฌธ ํ์ฅ์ ์ํ LLM ์ค์
retriever = faiss_retriever # ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ๊ฒ์๊ธฐ
# Multi-Query Retriever ์์ฑ
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=retriever, # FAISS ๊ธฐ๋ฐ ๊ธฐ๋ณธ ๊ฒ์๊ธฐ
llm=llm # ์ง๋ฌธ ํ์ฅ์ ์ํ LLM
)
# LCEL ์คํ์ผ Chain ๊ตฌ์ฑ
prompt_template = """
You are an assistant answering user questions based on the following retrieved context.
Context:
{context}
Question:
{question}
Provide a concise and structured response in bullet points.
"""
prompt = ChatPromptTemplate.from_template(prompt_template)
# LCEL Chain ์ค์
chain = (
{
"question": RunnablePassthrough(), # ์ฌ์ฉ์ ์
๋ ฅ ์ง๋ฌธ
"context": multi_query_retriever | format_docs, # ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌ ๋ฐ ํ์ํ
}
| prompt # ํ๋กฌํํธ ์์ฑ
| llm # LLM์ ์ฌ์ฉํ ์๋ต ์์ฑ
| StrOutputParser() # ๊ฒฐ๊ณผ ํ์ํ
)
# LCEL Chain ์คํ
query = "2025๋
ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?"
response = chain.invoke(query)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("Generated Response:")
print(response)
(์ฐธ๊ณ )
format_docs
?
format_docs
๋ ๊ฒ์๋ ๋ฌธ์๋ฅผ ํน์ ํ์์ผ๋ก ์ ๋ฆฌํ๊ฑฐ๋, LLM์ ์ ๋ฌํ๊ธฐ ์ ํฉํ ํ ์คํธ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ ํจ์ ๋๋ ํ๋ก์ธ์ค๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฒ์๋ ๋ฌธ์๊ฐ LLM์์ ๋ ์ฝ๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ ์ฝ๋์์๋
format_docs
๋MultiQueryRetriever
์ LLM ๊ฐ์ ์ค๊ฐ ๋จ๊ณ๋ฅผ ๋ด๋นํ๋ฉฐ, ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํ ๋ค ํ๋กฌํํธ์ ์ฝ์ ๋ ์ ์๋๋ก ์ค๋นํฉ๋๋ค.- ์๋๋ format_docs๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ ์์์ ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 def format_docs(docs): """ ๊ฒ์๋ ๋ฌธ์๋ฅผ ์ ๋ฆฌํ๊ณ LLM์ ์ ํฉํ ํฌ๋งท์ผ๋ก ๋ณํํ๋ ํจ์. """ formatted = [] for doc in docs: # ๋ฌธ์ ๋ด์ฉ์ ์์ฝํ๊ฑฐ๋ ์ ๋ฆฌ content = doc.page_content metadata = doc.metadata # ์: ์ ๋ชฉ๊ณผ ์ฃผ์ ๋ด์ฉ๋ง ์ถ์ถ formatted_content = f"Title: {metadata.get('title', 'Untitled')}\nContent: {content[:500]}..." formatted.append(formatted_content) return "\n\n".join(formatted)
-
ํต์ฌ ํน์ง
-
1)
์ง๋ฌธ ํ์ฅ
- ์๋ ๋ฐฉ์:
- AI ์ธ์ด ๋ชจ๋ธ(LLM)์ ํ์ฉํ์ฌ, ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ค์ํ ๊ด์ ์์ ์ฌ๊ตฌ์ฑํ๊ณ ๊ด๋ จ ํ์ ์ง๋ฌธ๋ค์ ์์ฑํฉ๋๋ค.
- ๋ชฉ์ :
- ๋จ์ผ ์ง๋ฌธ์ด ๊ฐ์ง๋ ํํ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ๋ค์ํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
- ์์:
1 2
์ ์ง๋ฌธ (Original Question, 1๊ฐ): "2025๋ ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?"
1 2 3 4
์์ฑ๋ ํ์ ์ง๋ฌธ(Generated Question, 3๊ฐ): "2025๋ ํ๊ตญ ๊ธ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น๋ ์ฃผ์ ์์ธ์ ๋ฌด์์ธ๊ฐ?" "๊ธ๋ก๋ฒ ๊ฒฝ์ ์ํฉ์ด 2025๋ ํ๊ตญ ๊ธ๋ฆฌ์ ๋ฏธ์น ์ํฅ์?" "ํ๊ตญ์ํ์ ์ ์ฑ ์ด 2025๋ ๊ธ๋ฆฌ ๋ณํ์ ์ด๋ป๊ฒ ์์ฉํ ๊น?"
- ์๋ ๋ฐฉ์:
-
2)
๊ฒฐ๊ณผ ํตํฉ
- ์๋ ๋ฐฉ์:
- ์์ฑ๋ ํ์ ์ง๋ฌธ ๊ฐ๊ฐ์ ๋ํด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์์ ์ํํ ํ, ๊ฒ์๋ ๋ฌธ์๋ค์ ํ๋์ ๊ฒฐ๊ณผ๋ก ํตํฉํฉ๋๋ค.
- ์ฃผ์ ๊ณผ์ :
- ์ค๋ณต ์ ๊ฑฐ: ๋์ผํ ์ ๋ณด๊ฐ ์ค๋ณต๋๋ฉด ์ ๊ฑฐํ์ฌ ํจ์จ์ฑ์ ๋์ ๋๋ค.
- ๊ฒฐ๊ณผ ์ ๋ ฌ: ๊ฒ์๋ ๋ฌธ์์ ๊ด๋ จ์ฑ ์ ์๋ฅผ ๋ถ์ฌํ๊ณ ์ฐ์ ์์๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
-
๋ชฉ์ :
๋ค์ํ ๊ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ํ๋ถํ๊ณ ์ ๋ขฐ์ฑ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์์: ``` ์์ฑ๋ ํ์ ์ง๋ฌธ๋ค(Generated Question, 3๊ฐ): โ2025๋ ํ๊ตญ ๊ธ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น๋ ์ฃผ์ ์์ธ์?โ โ๊ธ๋ก๋ฒ ๊ฒฝ์ ์ํฉ์ด ํ๊ตญ ๊ธ๋ฆฌ์ ๋ฏธ์น ์ํฅ์?โ โํ๊ตญ์ํ์ ์ ์ฑ ์ด 2025๋ ๊ธ๋ฆฌ ๋ณํ์ ์ด๋ป๊ฒ ์์ฉํ ๊น?โ
๊ฒ์ ๊ฒฐ๊ณผ(Retrieved Documents, 3๊ฐ): ๋ฌธ์ 1: ํ๊ตญ์ํ ๋ฐํ ์๋ฃ, ๊ธ๋ฆฌ ์ ์ฑ ๋ณด๊ณ ์. ๋ฌธ์ 2: ๊ธ๋ก๋ฒ ๊ฒฝ์ ๋ณด๊ณ ์์์ ๋ฐ์ท๋ ๊ธ๋ฆฌ ๊ด๋ จ ์ ๋ณด. ๋ฌธ์ 3: ๊ธ๋ฆฌ ๋ณํ์ ์์ฅ ๋ฐ์์ ๋ํ ์ ๋ฌธ๊ฐ ์ธํฐ๋ทฐ. ```
- ์๋ ๋ฐฉ์:
-
-
์ฅ์ :
- ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ค์์ฑ ์ฆ๊ฐ
- ๋จ์ผ ์ฟผ๋ฆฌ๋ก๋ ํ์งํ๊ธฐ ์ด๋ ค์ด ๋ค์ํ ๋งฅ๋ฝ๊ณผ ๊ด์ ์ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
- ์: ์ ์ฑ , ์์ฅ, ๊ธ๋ก๋ฒ ์ํฉ ๋ฑ ๋ค์ํ ์ธก๋ฉด์์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณต.
- ์ฌ์ฉ์ ์๋ ํ์
๊ฐํ
- ์ง๋ฌธ์ ๋ช ์์ ์๋ฏธ๋ฅผ ๋์ด, ์๋ฌต์ ๋งฅ๋ฝ๊ณผ ์๋๋ฅผ ํด์ํฉ๋๋ค.
- ์ด๋ฅผ ํตํด ๋ ์๋ฒฝํ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ํฌ๊ด์ ๊ฒฐ๊ณผ ์ ๊ณต
- ๋จ์ํ ๊ด๋ จ ๋ฌธ์๋ง ๋์ดํ๋ ๊ฒ์ด ์๋๋ผ, ๋ค์ธต์ ์ด๊ณ ์ข ํฉ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณต์กํ๊ฑฐ๋ ๋ค๋ฉด์ ์ธ ์ฃผ์ ์ ์ ํฉ.
- ์๋ํ๋ ํ๋กฌํํธ ์ต์ ํ
- ์ฌ์ฉ์๊ฐ ์ง์ ์ง๋ฌธ์ ์์ ํ๊ฑฐ๋ ์ฌ์์ฑํ์ง ์์๋, AI๊ฐ ์ง๋ฌธ์ ์๋์ผ๋ก ํ์ฅํฉ๋๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ค์์ฑ ์ฆ๊ฐ
4. ๊ฒ์ ๋จ๊ณ: Retrieval (Ensemble Retrieval)
Ensemble Retrieval์ ์ฌ๋ฌ ๊ฒ์๊ธฐ(Retriever)
๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฐ๊ฐ์ ์ฅ์ ์ ์กฐํฉํ๊ณ ๊ฒ์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ RAG(Retrieval-Augmented Generation) ๊ธฐ๋ฒ์
๋๋ค.
- ์๋ก ๋ค๋ฅธ ํน์ฑ์ ๊ฐ์ง
Dense Retrieval(๊ณ ๋ฐ๋ ๊ฒ์)
์Sparse Retrieval(ํฌ์ ๊ฒ์)
๋ฅผ ์ ์ ํ ๊ฒฐํฉํ์ฌ ๋ค์ํ ๊ฒ์ ์๋๋ฆฌ์ค์์ ๋ฐ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
-
1. Sparse Retrieval
Sparse Retrieval
์ ์ ํต์ ์ธ ํค์๋ ๊ธฐ๋ฐ ๊ฒ์ ๋ฐฉ์์ผ๋ก, ๋จ์ด์ ์กด์ฌ ์ฌ๋ถ์ ๋น๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ฌธ์๋ฅผ ํฌ์ ๋ฒกํฐ(sparse vector) ํํ๋ก ํํํ๋ฉฐ, ๊ฐ ๋จ์ด๋ ๋ ๋ฆฝ์ ์ธ ์ฐจ์์ ๊ฐ์ง๋๋ค(TF-IDF, BM25 ๋ฑ). ์ฃผ๋ก ์ ํต์ ์ธ ์ ๋ณด ๊ฒ์(Information Retriever) ๋ชจ๋ธ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ฅ์
- ์๋์ ํจ์จ์ฑ: ๋จ์ด์ ๋น๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฐ๋จํ ๊ณ์ฐ์ด๋ฏ๋ก ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ํฌ์ ํ๋ ฌ(sparse matrix)์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋์ด ์๋์ ์ผ๋ก ์ ์ต๋๋ค.
- ์ ํํ ํค์๋ ๋งค์นญ: ํน์ ๋จ์ด๊ฐ ๋ฌธ์์ ์กด์ฌํ๋์ง์ ๋ํ ๊ฒ์์์ ๋์ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค.
๋จ์
- ๋ฌธ๋งฅ์ ์๋ฏธ ๋ถ์กฑ: ๋์์ด๋ ์ ์ฌ์ด๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉฐ, ๋จ์ํ ๋จ์ด ์ผ์น์ ์์กดํฉ๋๋ค.
- ์ถ๊ฐ ํ์ต ๋ถ๊ฐ๋ฅ: ์ฌ์ ๊ตฌ์ถ๋ ๋ชจ๋ธ์ ์์กดํ๋ฏ๋ก ์๋ก์ด ๋ฐ์ดํฐ์ ์ ์ํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ง๋ฌธ ์ฒ๋ฆฌ ์ด๋ ค์: ๋ฌธ๋งฅ์ ์๋ ํ์ ์ด๋ ๋ณต์กํ ์ฟผ๋ฆฌ ์๋ต์ด ์ ํ์ ์ ๋๋ค.
ํ์ฉ ์์
- BM25์ TF-IDF๋
Sparse Retrieval
์์ ๊ฐ์ฅ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ด์ค ๊ธฐ์ฌ๋ ๊ฒ์ ์์ง๊ณผ ๊ฐ์ ํค์๋ ์ค์ฌ ๊ฒ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
-
2. Dense Retrieval
Dense Retrieval
์ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ๋ชจ๋ธ(BERT, RoBERTa ๋ฑ)์ ํ์ฉํ์ฌ ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ํฌํจํ๋ ๋ฐ์ง ๋ฒกํฐ(dense vector)๋ฅผ ์์ฑํฉ๋๋ค. ๋ฌธ์์ ์ง๋ฌธ์ ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ๊ฒ์ํฉ๋๋ค. ๊ฐ ์ฐจ์์ด ๋จ์ด ๊ฐ ๊ด๊ณ๋ฅผ ํฌํจํ๋ฏ๋ก ๋ณต์กํ ๋ฌธ๋งฅ์ ์ดํดํ ์ ์์ต๋๋ค.
์ฅ์
- ๋ฌธ๋งฅ์ ์๋ฏธ ์ดํด: ๋์์ด๋ ์ ์ฌ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ฌธ๋งฅ์ ์๋ฏธ์ ๊ธฐ๋ฐํ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ง์์ ์ธ ํ์ต: ์๋ก์ด ๋ฐ์ดํฐ๋ก ์ถ๊ฐ ํ์ต์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฒ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ง๋ฌธ ์ฒ๋ฆฌ ๊ฐ๋ฅ: ๋จ์ํ ํค์๋ ๋งค์นญ์ ๋์ด ๋ฌธ๋งฅ๊ณผ ์๋๋ฅผ ํ์ ํ์ฌ ๊ฒ์ํฉ๋๋ค.
๋จ์
- ์ฐ์ฐ ๋น์ฉ: ๋ฒกํฐ๋ฅผ ๊ณ์ฐํ๊ณ ๋น๊ตํ๋ ๊ณผ์ ์์ ๋์ ์ฐ์ฐ ๋น์ฉ์ด ์๊ตฌ๋ฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋: ๋ฐ์ง ๋ฒกํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํฉ๋๋ค.
- ํ์ต ๋ฐ์ดํฐ ์์กด: ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ์ต ๋ฐ์ดํฐ์ ์ง๊ณผ ์์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
ํ์ฉ ์์
Dense Retrieval
์ ํ์ ๋ ผ๋ฌธ ๊ฒ์, ์์ฐ์ด ๊ธฐ๋ฐ ์ง์์๋ต ์์คํ , ๊ทธ๋ฆฌ๊ณ ์๋ฏธ๋ก ์ ๋ฌธ์ ๊ฒ์๊ณผ ๊ฐ์ ๋ณต์กํ ๊ฒ์ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
Sparse vs Dense Retrieval: ๋น๊ต์ ์กฐํฉ
ํน์ง | Sparse Retrieval | Dense Retrieval |
---|---|---|
์๊ณ ๋ฆฌ์ฆ | BM25, TF-IDF ๋ฑ ์ ํต์ IR ๋ชจ๋ธ | BERT, RoBERTa ๋ฑ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ๋ชจ๋ธ |
์ฐ์ฐ ํจ์จ์ฑ | ๊ณ์ฐ ๋ณต์ก๋ ๋ฎ์ | ๊ณ์ฐ ๋ณต์ก๋ ๋์ |
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋ ๋ฎ์ | ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋ ๋์ |
๊ฒ์ ์ฑ๋ฅ | ๋จ์ ๋จ์ด ๋งค์นญ์์ ๋์ ์ ํ๋ | ๋ฌธ๋งฅ์ ์๋ฏธ ์ดํด์์ ๋์ ์ ํ๋ |
ํ๋ จ ํ์์ฑ | ์ฌ์ ๊ตฌ์ถ๋ ๋ชจ๋ธ ์ฌ์ฉ, ์ถ๊ฐ ํ๋ จ ๋ถํ์ | ๋๊ท๋ชจ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํ์ต ํ์ |
์ฃผ์ ์ฅ์ | ๋น ๋ฅธ ๊ฒ์ ์๋, ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ๋ฌธ๋งฅ ์ดํด ๋ฐ ์ ์ฌ์ด ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ฃผ์ ๋จ์ | ๋ฌธ๋งฅ์ ์๋ฏธ ์ดํด ๋ถ์กฑ | ๋์ ๊ณ์ฐ ๋น์ฉ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ |
2. Ensemble Retrieval๋ก์ ํ์ฅ
Sparse Retrieval
๊ณผ Dense Retrieval
์ ๊ฐ๊ฐ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์์ฃผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
- Sparse Retrieval: ํค์๋ ๊ธฐ๋ฐ ์ ํ๋๋ฅผ ๋ณด์ฅํ๋ฉฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๊ฒ์์ ์ ๊ณตํฉ๋๋ค.
- Dense Retrieval: ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ์ดํดํ๊ณ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- Ensemble Retrieval: ๋ ๊ฒ์ ๋ฐฉ์์ ์กฐํฉํ์ฌ ๋์ ๊ฒ์ ์ ํ๋์ ์๋๋ฅผ ๋์์ ๋ฌ์ฑํฉ๋๋ค.
Ensemble Retrieval ๊ตฌํ ์์:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from langchain_community.retrievers import BM25Retriever, EnsembleRetriever
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# Embeddings ์ด๊ธฐํ
embeddings = OpenAIEmbeddings()
# Sparse ๊ฒ์๊ธฐ (BM25) ์ด๊ธฐํ
bm25_retriever = BM25Retriever.from_documents(
split_documents,
k=20 # ๊ฒ์ํ ๋ฌธ์ ์
)
# Dense ๊ฒ์๊ธฐ (FAISS) ์ด๊ธฐํ
faiss_retriever = FAISS.load_local(
"dense_index",
embeddings,
allow_dangerous_deserialization=True
).as_retriever()
# Ensemble ๊ฒ์๊ธฐ ์์ฑ
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, faiss_retriever],
weights=[0.4, 0.6]
)
chain = (
{
"question": RunnablePassthrough(), # ์ฌ์ฉ์ ์
๋ ฅ ์ง๋ฌธ
"context": ensemble_retriever | format_docs, # ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํฌ๋งทํ
}
| prompt # ํ๋กฌํํธ ์ ์ฉ
| llm # LLM์ ์ฌ์ฉํด ์๋ต ์์ฑ
| StrOutputParser() # ์ถ๋ ฅ ํ์ ์ ๋ฆฌ
)
์ถ๋ ฅ ์์
Ensemble Retrieval ๊ฒ์ ๊ณผ์
- ์
๋ ฅ๋ ์ง๋ฌธ:
"2025๋ ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?"
- ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด ์ง๋ฌธ์
RunnablePassthrough
๋ฅผ ํตํด ์ฒด์ธ์ ์ฒซ ๋จ๊ณ๋ก ์ ๋ฌ๋์์ต๋๋ค. -
๋ ๊ฒ์๊ธฐ(Sparse์ Dense)๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฒ์์ ์ํํฉ๋๋ค.
Sparse Retrieval(BM25 ๋ฑ)
: ๋จ์ด ๋น๋ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ จ ๋ฌธ์๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์.Dense Retrieval(FAISS ๋ฑ)
: ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ๊ณ ๋ คํ์ฌ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ฒ์.
-
์ด ๋ ๊ฒ์๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ค์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํตํฉ๋ฉ๋๋ค.
- ์ฝ๋์์ ์ค์ ๋ weights์ ๋ฐ๋ผ Dense์ Sparse ๊ฒ์๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ ๊ฒฐํฉ๋์์ต๋๋ค.
- ์ต์ข ์ ์ผ๋ก ๊ฒ์๋ ๋ฌธ์๋ 42๊ฐ์ ๋๋ค.
-
ํด์
weights=[0.4, 0.6]
์ ์๋ฏธ, ๊ฐ ๊ฒ์๊ธฐ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ณ ์์๋ฅผ ๋งค๊น.- BM25 ๊ฒฐ๊ณผ์ 0.4 ๊ฐ์ค์น ์ ์ฉ
- FAISS ๊ฒฐ๊ณผ์ 0.6 ๊ฐ์ค์น ์ ์ฉ
- ๋ ๊ฒ์๊ธฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ ๋ ฌ, ๊ฐ ๋ฌธ์๋ ๋ ๊ฒ์๊ธฐ์ ์ ์๋ฅผ ์กฐํฉํ ์ต์ข ์ ์๋ฅผ ๋ฐ์.
- ๋ ๊ฐ์ง๊ฐ ๊ท ํ์๊ฒ ๋ฐ์๋ ์ต์ ์ ๋ฌธ์ ์งํฉ ์ด 42๊ฐ๊ฐ ์ ํ๋จ.
5. ๊ฒ์ ํ: Re-Ranking
Re-Ranking(๋ฆฌ๋ญํน)์ ์ด๊ธฐ ๊ฒ์ ๋จ๊ณ์์ ์์ง๋ ํ๋ณด ๋ฌธ์(๋๋ ์ฒญํฌ)์ ์์๋ฅผ ์ฌ์กฐ์ ํ๋ ๊ธฐ์ ์ ๋๋ค.
(์์์ Ensemble Retrieval ์ดํ ์ผ์ข ์ ์ฌ์์ํ(Re-Ranking) ์์ ์ ์ํํ๋ค๊ณ ๋ด๋ ๋ฉ๋๋ค.)
- LLM ๊ธฐ๋ฐ ๊ฒ์์์๋ ์ ๋ ฅ ํ ํฐ ์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์, ์ง๋ฌธ๊ณผ ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ๋ฌธ์๋ฅผ ์ ํํด ์ต์ข ์์๋ก ์ ๋ ฌํด์ผ ํฉ๋๋ค.
- ํนํ ๊ธด ๋ฌธ์์์ ๋ค์์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋ ๋, ๊ด๋ จ์ฑ์ด ๋ฎ์ ๋ฌธ๋งฅ ์ ๊ฑฐ ๋ฐ ์ต์ ํ๋ ์์ ๊ฒฐ์ ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์๋ ์๋ฆฌ
Re-Ranking์ ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ ์์ง:
- Retriever(๊ฒ์๊ธฐ)๊ฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ ๊ด๋ จ ํ๋ณด ๋ฌธ์๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์ด ๋จ๊ณ์์ ๋น ๋ฅธ ๊ฒ์์ ์ํด Dense ํน์ Sparse ๋ฐฉ์์ ๊ฒ์๊ธฐ๊ฐ ์ฃผ๋ก ํ์ฉ๋ฉ๋๋ค.
-
Re-Ranker๋ก ์์ ์ฌ์กฐ์ :
- ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ง๋ฌธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฐ ์ฒญํฌ์ ๊ด๋ จ์ฑ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๊ณ์ฐ๋ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ณด ๋ฌธ์์ ์์๋ฅผ ์ฌ๋ฐฐ์นํฉ๋๋ค.
-
์์ ๊ฒฐ๊ณผ ๋ฐํ:
- ์ค์ ๋ ์์ N๊ฐ์ ๊ฒฐ๊ณผ๋ง ์ ํํด ์ฌ์ฉ์๊ฐ ํ์ธํ ์ ์๋๋ก ์ ๊ณตํฉ๋๋ค.
์ฝ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# Cohere Reranker ์ค์
COHERE_API_KEY = "your_cohere_api_key"
reranker = CohereRerank(model="rerank-multilingual-v3.0", top_n=3)
# ๋ฆฌ๋ญํน์ ์ ์ฉํ ๊ฒ์๊ธฐ ์์ฑ
reranking_retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=faiss_retriever # ์ด๊ธฐ ๊ฒ์ ๋จ๊ณ์์ ์ฌ์ฉํ Retriever
)
# ์ง์์ ๋ฐ๋ฅธ ๊ฒ์ ์คํ
test_question = "2025๋
ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?"
retrieved_chunks = reranking_retriever.invoke(test_question)
# ์ต์ข
๊ฒฐ๊ณผ ํ์ธ
print(len(retrieved_chunks)) # ์ถ๋ ฅ: 3
for chunk in retrieved_chunks:
print(chunk.page_content)
์ถ๋ ฅ ๊ฒฐ๊ณผ ํด์
retrieved_chunks
์ ๊ธธ์ด๋3
์ผ๋ก, ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ30๊ฐ
์ค ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์3๊ฐ
์ ๋ฌธ์๋ง ์ต์ข ์ ์ผ๋ก ๋ฐํ๋์์ต๋๋ค.- ์ต์์ ๋ฌธ์๋ค์ ์ง๋ฌธ
"2025๋ ํ๊ตญ ๊ธ๋ฆฌ ์ ๋ง์?"
๊ณผ ๊ด๋ จ์ฑ์ด ๋์ ๋ด์ฉ์ ํฌํจํ๋ฉฐ, LLM์ด ํ์ฉ ๊ฐ๋ฅํ ํํ๋ก ์ค๋น๋์์ต๋๋ค.
์ด์ฒ๋ผ Re-Ranking์ ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ต์ ํํ์ฌ ์ฌ์ฉ์ ์ง๋ฌธ์ ๊ฐ์ฅ ์ ํฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
6. ๊ฒ์ ํ: Compression
Compression์ ๊ฒ์๋ ๋ฌธ์๋ค์ ๊ธธ์ด๋ฅผ ์ค์ด๊ฑฐ๋ ์์ฝ(Summarization)ํ์ฌ ๊ด๋ จ์ฑ์ด ๋์ ์ ๋ณด๋ง ์ ์งํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ LLM์ ํ ํฐ ์ ํ ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ณ ํจ์จ์ ์ธ ๋ฌธ์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์๋ ์๋ฆฌ
- ๋ฌธ์ ์์ถ ๊ณผ์
- ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ ์ฌ๋ฌ ๋ฌธ์(chunk)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ContextualCompressionRetriever
๋base_compressor
์base_retriever
๋ฅผ ๊ฒฐํฉํ์ฌ ๋์ํฉ๋๋ค.base_compressor
๋ก LLM์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ถํ๊ฑฐ๋ ํ์ํ ์ ๋ณด๋ฅผ ์์ฝํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๋น๊ต
- ์์์์ ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ 30๊ฐ์ chunk๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
- Compression ๊ณผ์ ์ ํตํด 5๊ฐ์ chunk๋ก ์์ถ๋์์ผ๋ฉฐ, ์ด๋ Query์ ๋งฅ๋ฝ(Context)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ฝ๋ ๊ตฌํ
1
2
3
4
5
6
7
8
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor_from_llm = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor_from_llm,
base_retriever=faiss_retriever
)
์ ์ฝ๋๋ฅผ ํตํด Compression ๊ณผ์ ์ด ์ํ๋๋ฉฐ, ํต์ฌ์ ์ธ ์ ๋ณด๋ง ๋จ๊ธฐ๊ฒ ๋ฉ๋๋ค.
7. ๋ค์ํ ์กฐํฉ: Multi-query Ensemble + Re-Ranking
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฒ์ ๊ธฐ๋ฒ๊ณผ ์์ ์กฐ์ (Re-Ranking)์ ๊ฒฐํฉํ์ฌ ๊ฒ์ ํ์ง์ ๊ทน๋ํํ๋ ๊ณ ๊ธ RAG ๊ธฐ๋ฒ์ ๋๋ค. ์ ๋ด์ฉ๊ณผ ์ข ์ ์ฌํ ๋ถ๋ถ๋ค์ด ์๊ธด ํ์ง๋ง Multi-query Ensemble๊ณผ Re-Ranking์ ๊ฐ์ด ์ธ ์ ์๋ค๋ ๋ถ๋ถ์ด ์๋ค๋ ๊ฒ์ ๊ฐ์กฐํ๊ธฐ ์ํด ๋ณ๋๋ก ์ฑํฐ๋ก ์ถ๊ฐํ์ ๊ฒ ๊ฐ๊ตฐ์ ๐ค
๊ตฌ์ฑ ์์
-
Multi-query Retrieval
-
Multi-query Retrieval
์ ํ๋์ ์ง๋ฌธ์ ๋ค์ํ ๊ด์ ์ผ๋ก ํ์ฅํ์ฌ ๊ฒ์ ๋ฒ์๋ฅผ ๋ํ๋๋ค. -
์: โ2025๋ ํ๊ตญ ๊ธ๋ฆฌ ์ ๋งโ โ โ2025๋ ๊ธ๋ฆฌ ๋ณํ ์์ธกโ, โํ๊ตญ์ ๊ธ๋ฆฌ ์์ค ์ ๋งโ
-
-
Ensemble Retrieval
-
Ensemble Retrieval
์ Sparse Retriever(BM25)์ Dense Retriever๋ฅผ ์กฐํฉํฉ๋๋ค. -
๊ฐ ๊ฒ์๊ธฐ์ ๊ฒฐ๊ณผ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ๊ฒ์ ํ์ง์ ์ต์ ํํฉ๋๋ค.
-
-
Re-Ranking
-
Re-Ranking
์ Ensemble ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ Re-Ranker๋ก ๋ค์ ์ ๋ ฌํฉ๋๋ค. -
LLM ๊ธฐ๋ฐ Re-Ranker๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ์ฑ์ด ๋์ ๋ฌธ์ ์์ผ๋ก ์ฌ๋ฐฐ์นํฉ๋๋ค.
-
์๋ ์๋ฆฌ
- Multi-query๋ก ์์ฑ๋ ์ง๋ฌธ๋ค์ Ensemble Retrieval๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๊ฒ์๋ ๊ฒฐ๊ณผ(44๊ฐ chunk)๋ ReRanking์ ํตํด 3๊ฐ์ chunk๋ก ์์ถ๋ฉ๋๋ค.
- ์ต์ข ์ ์ผ๋ก ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ๋ฌธ์๋ค๋ง ์ ํ๋ฉ๋๋ค.
- Re-Ranking์ ํตํด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์กฐ์ ํ์ฌ ์ต์ ์ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
์ฝ๋ ๊ตฌํ
1
2
3
4
5
6
7
8
9
10
11
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain.retrievers import MultiQueryRetriever
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
# Define MultiQuery_Ensemble_reranking_retriever
MultiQuery_Ensemble_reranking_retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=MultiQuery_Ensemble_retriever
)
8. ํ๋ก์ธ์ค ์ฆ๊ฐ(Process Augmentation)
ํ๋ก์ธ์ค ์ฆ๊ฐ(Process Augmentation)์ ๋จ์ผ ๊ฒ์ ๋ฐ ์์ฑ ๋จ๊ณ๋ฅผ ๋์ด ๋ค๋จ๊ณ ๊ฒ์
, ์ ์ง์ ์ถ๋ก
, ์ ์์ ๊ฒ์
๋ฐฉ์์ ๋์
ํ์ฌ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ๊ทผ๋ฒ์
๋๋ค. ์ด๋ RAG(Retrieval-Augmented Generation)์์ ์ ๋ณด๋ฅผ ๋ณด๋ค ์ ๊ตํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
-
๊ธฐ์กด์ ๋จ์ผ ๊ฒ์๊ณผ ์๋ต ์์ฑ ํ๋ก์ธ์ค
๋ ์ ํ๋ ์ ๋ณด๋ง ์ ๊ณตํ๊ฑฐ๋, ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ถฉ๋ถํ ํด๊ฒฐํ์ง ๋ชปํ ์ ์์ต๋๋ค.ํ๋ก์ธ์ค ์ฆ๊ฐ
์ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ํตํด ์ด๋ฅผ ๋ณด์ํฉ๋๋ค.Iterative Search(๋ฐ๋ณต์ ๊ฒ์)
: ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์์ ๋ฐ๋ณตํ์ฌ ๋์ฑ ํ๋ถํ ์ ๋ณด๋ฅผ ์์ง.Recursive Search(์ฌ๊ท์ ๊ฒ์)
: ๋ฌธ์ ๋ฅผ ์ธ๋ถ์ ์ธ ํ์ ๋ฌธ์ ๋ก ๋ถํดํ๊ณ ๋จ๊ณ์ ์ผ๋ก ํด๊ฒฐ.Adaptive Search(์ ์์ ๊ฒ์)
: ๊ฒ์๊ณผ ์์ฑ ๊ณผ์ ์์ ์ํฉ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ.
ํ๋ก์ธ์ค ์ฆ๊ฐ ์ ํ (์ ๊ทธ๋ฆผ ์ฐธ๊ณ )
1) Iterative Search (๋ฐ๋ณต์ ๊ฒ์)
ํน์ง
:- Query๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ณด๊ฐํ์ฌ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์์ง.
- Judge ๋จ๊ณ๋ฅผ ํตํด ๊ฒ์ ๋ฐ ์์ฑ์ ์ ํ๋๋ฅผ ์ ๊ฒ.
์ข ๋ฃ ์กฐ๊ฑด
:- ์ฌ์ ์ค์ ๋ ์ต๋ ๋ฐ๋ณต ํ์(Max Times) ๋๋ ์ ํ๋ ๊ธฐ์ค(Threshold)์ ๋ง์กฑํ ๋ ์ข ๋ฃ.
ํ์ฉ ์ฌ๋ก
:- ์ฌ์ฉ์์ ์ถ๊ฐ์ ์ธ ์ง๋ฌธ์ด ํ์ํ ์ํฉ์์ ์ ์ง์ ์ผ๋ก ๋ต๋ณ์ ์์ฑ.
2) Recursive Search (์ฌ๊ท์ ๊ฒ์)
ํน์ง
:- ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํ์ ๋ฌธ์ ๋ก ๋ถํด(Query Transformation).
- ๋ฌธ์ ๋ฅผ ์ ์ง์ ์ผ๋ก ํด๊ฒฐํ๋ฉฐ ์ ์ฒด ๋ต๋ณ์ ์์ฑ.
์ข ๋ฃ ์กฐ๊ฑด
:- ์ค์ ๋ ์ต๋ ์ฌ๊ท ๊น์ด(Max Depth) ๋๋ ํธ๋ฆฌ ๊ตฌ์กฐ ๊ธฐ๋ฐ์ Threshold๋ฅผ ๋ง์กฑํ ๋ ์ข ๋ฃ.
ํ์ฉ ์ฌ๋ก
:- ์ํ์ ์ฆ๋ช , ๋จ๊ณ์ ์ถ๋ก ์ด ํ์ํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ํด๊ฒฐ.
3) Adaptive Search (์ ์์ ๊ฒ์)
ํน์ง
:- ๊ฒ์ ํ์์ฑ์ ๋์ ์ผ๋ก ํ๋จํ์ฌ ๊ฒ์ ๋๋ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ์ ํ.
- Generate ๋จ๊ณ์์ ํน์ ํ ํฐ(์: Special Token)์ ์์ฑํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ ์ด.
์ข ๋ฃ ์กฐ๊ฑด
:- ๊ด๋ จ ์ ๋ณด๊ฐ ์ถฉ๋ถํ ์์ง๋์๊ฑฐ๋ ํ์ํ์ง ์์ ๋ ์๋ ์ข ๋ฃ.
ํ์ฉ ์ฌ๋ก
:- ์ค์๊ฐ์ผ๋ก ๋ณํํ๋ ๋ฐ์ดํฐ๋ ์ธ๋ถ ์ง์์ ์์กดํ๋ ์๋ต ์์ฑ.
RAG ์์คํ ๊ตฌํ ์์
- ์ ๋ ฅ ์ฒ๋ฆฌ: ์ฌ์ฉ์์ ์ ๋ ฅ์ ํํฐ๋ง ๋ฐ ์์ (๊ฐ๋๋ ์ผ + ์ฟผ๋ฆฌ ์ฌ์์ฑ).
- ๊ฒ์ ๋จ๊ณ: ์ฟผ๋ฆฌ๋ฅผ ์๋ฒ ๋ฉํ์ฌ ๊ณ์ธต์ ๊ฒ์ ์ํ.
- ๊ฒฐ๊ณผ ์ ์ : ๋ฆฌ๋ญ์ปค๋ฅผ ํตํด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ๋ฐ ์์ ์กฐ์ .
- ์์ฑ ๋จ๊ณ: ์ ํ๋ ์ฒญํฌ๋ฅผ ๋ฐํ์ผ๋ก ๋ต๋ณ ์์ฑ.
- ์ถ๋ ฅ ์ฒ๋ฆฌ: ์์ฑ๋ ๋ต๋ณ์ด ์ ์ ํ์ง ๊ฒ์ฆ(์ถ๋ ฅ ๊ฐ๋๋ ์ผ).
Chapter 4: RAG ํ๊ฐํ๊ธฐ
RAG ํ๊ฐ์ ์ค์์ฑ
- RAG ์์คํ ์ ํ์ง์ ํ๊ฐํ๋ ๊ฒ์ ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์ ๋ขฐ๋๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ํ์์ ์ ๋๋ค.
-
์ฃผ์ ํ๊ฐ ๋์
๊ฒ์ ํ์ง
: ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ํ์ฑ ๋ฐ ๊ด๋ จ์ฑ.์์ฑ ํ์ง
: LLM์ด ์์ฑํ ๋ต๋ณ์ ํ์ง.์ฌ์ฉ์ ๊ฒฝํ
: ์ค๋ฌด์์์ ์๋ต ์ ๋ขฐ์ฑ๊ณผ ์ผ๊ด์ฑ.
-
์ ์ฌ๋ ๋ฐ ๊ด๋ จ์ฑ ํ๊ฐ
- ๊ธฐ๋ณธ ํ๊ฐ ๊ธฐ์ค
- ๊ฒ์๋ ๋ฌธ์์ ๋ฒกํฐ ์ ์ฌ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ํ์ง์ ์ธก์ .
- ์ ์ฌ๋ ์งํ: Cosine Similarity ๋ฑ.
- ํ๊ฐ ๋ฐฉ์
- ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฒกํฐ์ ์ ๋ ฅ ๋ฒกํฐ ๊ฐ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ.
- ์ ์ฌ๋ ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ์ ํ์ง์ ํ๊ฐ.
์ธก์ ์ฝ๋ ์์
์ธก์ ์ถ๋ ฅ ์์
-
LLM ํ๊ฐ : Metric
2.1. ํ๋ฅญํ ํ๊ฐ ์งํ์ ์กฐ๊ฑด
-
Quantitative (๊ณ๋์ ):
- ์ ์ ๊ณ์ฐ์ด ๊ฐ๋ฅํด์ผ ํ๋ฉฐ, ํ์ง ๊ฐ์ ์ ์ํด ์๊ฐ์ ๋ฐ๋ผ ํ๊ฐ ์ ์์ ๋ณํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์: BLEU, ROUGE ๊ฐ์ ์ ์ ๊ธฐ๋ฐ ์งํ.
-
Reliable (์ ๋ขฐ์ฑ):
- ํ๊ฐ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ฉฐ, ๋์ผํ ์ํฉ์์ ํ๊ฐ๋ฅผ ๋ฐ๋ณตํ์ ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๊ฒ ๋์์ผ ํฉ๋๋ค.
- ์: ํต๊ณ์ ํ๊ฐ ๋ฉํธ๋ฆญ์ ์ฌํ ๊ฐ๋ฅ์ฑ.
-
Accurate (์ ํ์ฑ):
- ํ๊ฐํ๋ ค๋ ๋ชฉํ์ ๋ถํฉํ๋ฉฐ ๋ถ์กฑํจ์ด ์์ด์ผ ํฉ๋๋ค.
- ์: Human Evaluation์ ํตํ ์ ๋ฐํ ๋ถ์.
2.2. Types of Metric Scores
-
Human Evaluation
ํ๊ฐ ๋ฐฉ์
: ์ฌ๋์ด ์ง์ ํ๊ฐํ์ฌ ์์ฑ๋ ํ ์คํธ์ ์ ์ฐฝ์ฑ, ๊ด๋ จ์ฑ, ๋ ผ๋ฆฌ์ ์ผ๊ด์ฑ, ์ฌ์ค์ ์ ํ์ฑ์ ํ๋จํฉ๋๋ค.์ฅ์
: ์ค์ ์ฌ์ฉ์ ๊ด์ ์์์ ์ง๊ด์ ์ธ ํ๊ฐ ๊ฐ๋ฅ.๋จ์
: ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ๋ค๋ฉฐ, ํ๊ฐ์์ ์ฃผ๊ด์ด ๊ฒฐ๊ณผ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
-
Statistical Evaluation
๋ํ ๋ฉํธ๋ฆญ
: BLEU, ROUGE, METEOR, Levenshtein Distance.- BLEU (Bilingual Evaluation Understudy): N-gram ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ฅ์ ์ ํ๋๋ฅผ ๊ณ์ฐ.
- ROUGE (Recall-Oriented Understudy for Gisting Evaluation): ์๋ฌธ๊ณผ ์์ฝ๋ฌธ ๊ฐ์ N-gram ๋๋ ๋จ์ด์ ์ค๋ณต ์ ๋๋ฅผ ์ธก์ .
- METEOR (Metric for Evaluation of Translation with Explicit Ordering): ๋จ์ด์ ๋์์ด์ ์ดํ ๋ณํ๋ฅผ ๋ฐ์ํ์ฌ BLEU๋ณด๋ค ์ ์ฐํ๊ฒ ํ๊ฐ.
- Levenshtein Distance: ํ ์คํธ ๊ฐ์ ํธ์ง ๊ฑฐ๋ฆฌ(์ฝ์ , ์ญ์ , ๊ต์ฒด)๋ก ํ ์คํธ ๊ฐ ์ฐจ์ด๋ฅผ ๊ณ์ฐ.
์ฅ์
: ์๋ํ๋ ํ๊ฐ๋ก ๋น ๋ฅด๊ณ ๋น์ฉ ํจ์จ์ .๋จ์
: N-gram ๊ธฐ๋ฐ ํ๊ฐ๋ก ๋ฌธ๋งฅ ๋ฐ ์๋ฏธ๋ฅผ ์ถฉ๋ถํ ๋ฐ์ํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ.
-
LLM-based Evaluation
-
ํ๊ฐ ๋ฐฉ์์ ํต์ฌ ๊ธฐ์ ์ ์ ๊ทผ๋ฒ
๊ณผ์ฌ์ฉ๋ ๋ชจ๋ธ ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ
์ ๋ฐ๋ผ Natural Language Process Model, Embedding Model, Large Language Model๋ก ๋ฉํธ๋ฆญ์ ๊ตฌ๋ถํ ์ ์์.-
Natural Language Process Model
: ๋ ผ๋ฆฌ์ ๊ด๊ณ์ ๋ฌธ๋งฅ์ ์ ์ฌ์ฑ ํ๊ฐ์ ์ค์ ์ ๋ก๋๋ค.- NLI (Natural Language Inference): ๋ ผ๋ฆฌ์ ๊ด๊ณ(ํฌํจ, ๋ชจ์, ์ค๋ฆฝ)๋ฅผ ํ๊ฐ.
- BLEURT: ์ฌ์ ํ๋ จ๋ BERT ๋ชจ๋ธ์ ํ์ฉํด ๋ฌธ๋งฅ์ ์ ์ฌ์ฑ์ ํ๊ฐ.
-
Embedding Model
: ํ ์คํธ์ ๋ฒกํฐ ํํ์ ํ์ฉํ ์๋ฏธ์ ์ ์ฌ์ฑ ํ๊ฐ์ ์ด์ ์ ๋ง์ถฅ๋๋ค.- BERTScore: BERT ์๋ฒ ๋ฉ์ ์ฌ์ฉํด ๋ ํ ์คํธ ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ณ์ฐ.
- MoverScore: Earth Moverโs Distance(EMD)๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ๊ฐ ๋จ์ด ์ด๋ ๊ฑฐ๋ฆฌ(Transport Cost)๋ฅผ ์ธก์ .
-
Large Language Model
: ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ์ ํ์ฉํ ๋ค๊ฐ์ ์ด๊ณ ๊ณ ์ฐจ์์ ์ธ ํ๊ฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.- QAG Score: ์ง๋ฌธ ์์ฑ๊ณผ ์ ๋ต ๋น๊ต๋ฅผ ํตํด ํ ์คํธ์ ํต์ฌ ์ ๋ณด์ ์ฌ์ค์ฑ์ ํ๊ฐ.
- GPTScore: GPT ๋ชจ๋ธ์ ์์ฑ ํ๋ฅ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ์ ์์ฐ์ค๋ฌ์๊ณผ ์ผ๊ด์ฑ์ ํ๊ฐ.
- SelfCheckGPT: ๋ชจ๋ธ์ด ์์ฑํ ํ ์คํธ์ ํ์ง์ ์ค์ค๋ก ํ๊ฐํ์ฌ ์๋ต์ ์ผ๊ด์ฑ๊ณผ ์ ๋ณด์ ์ฌ์ค์ฑ์ ์ ๊ฒ.
- G-Eval: Chain-of-Thought(CoT) ๋ฐ ํ๋กฌํํธ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ณ ํ๊ฐ ๊ธฐ์ค์ ๋ฐ๋ผ ์์ฑ ํ ์คํธ๋ฅผ ํ๊ฐ.
- Prometheus: ๋ค์ค ์งํ ๊ธฐ๋ฐ์ผ๋ก ํน์ ๋๋ฉ์ธ์ด๋ ์์ ๋ชฉ์ ์ ๋ง์ถ ๋ง์ถคํ ํ๊ฐ.
-
์ฅ์
: LLM์ ํ์ฉํ์ฌ ๊ณ ์ฐจ์์ ์ธ ํ๊ฐ ๊ฐ๋ฅ.๋จ์
: ํ๊ฐ ๋ชจ๋ธ์ ํธํฅ์ฑ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋ ๊ฐ๋ฅ์ฑ.
-
(์ฐธ๊ณ ) ๋ถ๋ฅ์ ๋ฐ๋ผ์๋ ์๋์ ๊ฐ์ด๋ ์ ์๋ ์๋ ์์.
- Statistical Scorers๋ ํต๊ณ์ ํ๊ฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฉํธ๋ฆญ๋ค๋ก, ์ฃผ๋ก N-gram๊ณผ ๊ฐ์ ์ธ์ด ํต๊ณ์ ํน์ง์ ๊ธฐ๋ฐํ์ฌ ํ ์คํธ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- Model-Based Scorers๋ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ํ์ฉํ์ฌ ํ ์คํธ ๊ฐ์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ํ๊ฐํ๊ฑฐ๋, ๋ชจ๋ธ์ด ์์ฑํ ์๋ต ์์ฒด๋ฅผ ํ๊ฐํฉ๋๋ค.
- ๊ต์งํฉ(Statistical โฉ Model-Based)์ ์์ชฝ ํน์ฑ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ค๊ณ ํด์ํ ์ ์์ต๋๋ค.
๊ตฌ๋ถ | Statistical Scorers | Model-Based Scorers | ๊ต์งํฉ |
---|---|---|---|
ํ๊ฐ ๋ฐฉ์ | ๋จ์ N-gram ์ผ์น, ํต๊ณ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ | ์ฌ์ ํ๋ จ๋ NLP ๋ชจ๋ธ ํ์ฉ | ํต๊ณ์ ๊ณ์ฐ + ์๋ฒ ๋ฉ ๊ธฐ๋ฐ ์๋ฏธ ํ๊ฐ |
์ฅ์ | ๋น ๋ฅด๊ณ ๋น์ฉ ํจ์จ์ , ์๋ํ ๊ฐ๋ฅ | ๋ฌธ๋งฅ์ ์๋ฏธ์ ๊ตฌ์กฐ์ ํ๊ฐ ๊ฐ๋ฅ | ํจ์จ์ฑ๊ณผ ์ ํ์ฑ์ ๊ท ํ ์๊ฒ ๊ฒฐํฉ |
๋จ์ | ๋ฌธ๋งฅ ๋ฐ์ ๋ถ์กฑ, ์๋ฏธ์ ์ฐ๊ฒฐ์ฑ ๋ฏธํก | ๊ณ์ฐ ๋น์ฉ ๋์, ํธํฅ ๊ฐ๋ฅ์ฑ | ๊ณ์ฐ ๋น์ฉ๊ณผ ๋๋ฉ์ธ ์์กด์ฑ ์ผ๋ถ ์กด์ฌ |
๋ํ ๋ฉํธ๋ฆญ | BLEU, ROUGE, METEOR, Levenshtein Distance | BERTScore, GPTScore, SelfCheckGPT, Prometheus | BERTScore, MoverScore |
2.3. Strategies for LLM Evaluation
- ๋ชจ๋ธ ์ถ๋ ฅ์ ํํ์ ํ๊ฐ ๋ชฉํ ์ ์: ์ ๋ต์ด ๋ช ํํ์ง, ์๋๋ฉด ์ ์ฌ์ฑ์ด๋ ํ์ง ํ๊ฐ์ธ์ง.
- ์๋ํ์ ๊ฐ๋ฅ์ฑ ๋ฐ ๋น์ฉ ํจ์จ์ฑ ๊ณ ๋ ค: Human Evaluation์ ํฌํจํ ์ง, LLM ๊ธฐ๋ฐ์ผ๋ก ๋์ฒดํ ์ง.
- ์ํฉ์ ๋ง๋ ๋ฉํธ๋ฆญ ์ ํ: Accuracy, Similarity, Creativity ๋ฑ.
2.4. LLM ํ๊ฐ ๋ฉํธ๋ฆญ์ ์ธ๋ถ ๋ด์ฉ
์๋๋ LLM(Large Language Model)์ ํ๊ฐํ๋ LLM ํ๊ฐ ๋ฉํธ๋ฆญ์ ๋ํด์ ๊ฐ์ ๋ด์ฉ๊ณผ ํด๋น ๋ด์ฉ์ ๋ณด์ถฉํ ๋งํ ์๋ฃ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฒจ๋ถํ ๋ด์ฉ์ ๋๋ค.
1. NLI (Natural Language Inference)
- ์ค๋ช
:
-
NLI๋ ์์ฐ์ด ์ถ๋ก ์ ํตํด ๋ ํ ์คํธ(
๊ธฐ์ค ํ ์คํธ
์์์ฑ ํ ์คํธ
)๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง๋ฅผ ํ๊ฐํฉ๋๋ค. - ๊ธฐ์ค ํ ์คํธ(Premise)๋ฅผ ์ ์ ๋ก ์ผ๊ณ , ์์ฑ๋ ํ ์คํธ๋ฅผ ๊ฐ์ค(Hypothesis)๋ก ๋ณด์ ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํฉ๋๋ค.
- ํฌํจ(Entailment): ๊ฐ์ค์ด ์ ์ ๋ฅผ ์ง์งํฉ๋๋ค.
- ๋ชจ์(Contradiction): ๊ฐ์ค์ด ์ ์ ์ ์ถฉ๋ํฉ๋๋ค.
- ์ค๋ฆฝ(Neutral): ๋ ๋ฌธ์ฅ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ด์ ์์ง๋ง ์ง์ ์ ์ผ๋ก ์ง์งํ๊ฑฐ๋ ๋ชจ์๋์ง ์์ต๋๋ค.
-
-
ํน์ง:
- NLI๋ ์์ฑ๋ ํ ์คํธ์ ๊ธฐ์ค ํ ์คํธ ๊ฐ์ ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ํ๊ฐํ๋ฉฐ, ์๋ฏธ์ ์ผ๊ด์ฑ์ ๋ถ์ํฉ๋๋ค.
-
์ฅ์ :
- NLI๋ ๋จ์ ๋จ์ด ๋งค์นญ์ด ์๋๋ผ, ํ ์คํธ์ ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ํ๊ฐํฉ๋๋ค.
- ๋ฒ์ญ, ์์ฝ, ์ ๋ณด ์ถ์ถ ๋ฑ ๋ค์ํ ์์ ์ ์ ํฉํฉ๋๋ค.
-
๋จ์ :
- ๋ชจ๋ธ์ด ํ ์คํธ ๊ฐ ๊ด๊ณ๋ฅผ ์ถฉ๋ถํ ์ดํดํ์ง ๋ชปํ๋ฉด ํ๊ฐ๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- ํ ์คํธ ๋ณต์ก์ฑ์ ๋ฐ๋ผ ๋ฏผ๊ฐํ๊ฒ ์๋ํฉ๋๋ค.
2. BLEURT (Bilingual Evaluation Understudy with Representations from Transformers)
- ์ค๋ช
:
- BLEURT๋ BERT๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ํ๊ฐ ๋ชจ๋ธ์
๋๋ค. ์ฌ์ ํ์ต๋ BERT ๋ชจ๋ธ์ด ๋ฌธ๋งฅ์ ์ดํดํ๋ฉฐ,
๊ธฐ์ค ํ ์คํธ
์์์ฑ ํ ์คํธ
๊ฐ์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ํ๊ฐํฉ๋๋ค. -
BLEURT๋ ๋จ์ํ ๋จ์ด ๋งค์นญ ๋ฐฉ์์ด ์๋, ๋ฌธ์ฅ์ ๊น์ ์๋ฏธ์ ๋ฌธ๋งฅ์ ์ผ์น๋ฅผ ์ธก์ ํฉ๋๋ค.
- BLEURT๋ BERT๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ํ๊ฐ ๋ชจ๋ธ์
๋๋ค. ์ฌ์ ํ์ต๋ BERT ๋ชจ๋ธ์ด ๋ฌธ๋งฅ์ ์ดํดํ๋ฉฐ,
-
ํน์ง:
- BLEURT๋ ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ๋ฐ์ํ์ฌ ๋ ํ ์คํธ๊ฐ ์ผ๋ง๋ ์ ์ฌํ์ง ํ๊ฐํฉ๋๋ค.
-
์ฅ์ :
- ๋จ์ ํต๊ณ์ ํ๊ฐ๋ณด๋ค ๋ฌธ์ฅ์ ์๋ฏธ ์ฐจ์ด๋ฅผ ์ธ๋ฐํ๊ฒ ๋ฐ์ํฉ๋๋ค.
- BLEU์ ROUGE๋ณด๋ค ์ ํํ ํ๊ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ ํ๋ จ๋ BERT๋ฅผ ์ฌ์ฉํด ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ๋ก ํ๊ฐํฉ๋๋ค.
-
๋จ์ :
- BERT ๋ชจ๋ธ ์ฌ์ฉ์ผ๋ก ์ธํด ์์์ด ์๋ชจ๋ ์ ์์ต๋๋ค.
- ํน์ ๋๋ฉ์ธ์์๋ ์ ์๋ ฅ์ด ๋ฎ์ ์ ์์ต๋๋ค.
3. BERTScore
- ์ค๋ช
:
- BERTScore๋ BERT ์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ฌ
์์ฑ๋ ํ ์คํธ
์๊ธฐ์ค ํ ์คํธ
์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ๋ฒกํฐ ๊ณต๊ฐ์์ ์ธก์ ํฉ๋๋ค. -
๋จ์ด ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ์ฌ ๋ ํ ์คํธ๊ฐ ์ผ๋ง๋ ๋น์ทํ์ง๋ฅผ ์ ์๋ก ์ฐ์ถํฉ๋๋ค.
- BERTScore๋ BERT ์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ฌ
-
ํน์ง:
- BERTScore๋ BERT์ ๋ฌธ๋งฅ ์ดํด ๋ฅ๋ ฅ์ ํ์ฉํ์ฌ ๋จ์ํ n-gram ๊ธฐ๋ฐ ์ ์๋ณด๋ค ์ ํํ๊ฒ ์๋ฏธ์ ์ ์ฌ์ฑ์ ํ๊ฐํฉ๋๋ค.
-
์ฅ์ :
- ๋์ ์๋ฏธ์ ์ ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ฒ์ญ, ์์ฝ, ์์ฑ ํ ์คํธ ํ๊ฐ ๋ฑ ๋ค์ํ ์์ ์ ํ์ฉํ ์ ์์ต๋๋ค.
-
๋จ์ :
- ๊ณ์ฐ์ ๋ง์ ์์์ด ์๋ชจ๋ ์ ์์ต๋๋ค.
- BERT ํ๋ จ ๋๋ฉ์ธ๊ณผ ๋ค๋ฅธ ๋๋ฉ์ธ์์๋ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์ต๋๋ค.
4. MoverScore
- ์ค๋ช
:
- MoverScore๋ Earth Moverโs Distance (EMD) ๊ฐ๋ ์ ํ์ฉํ์ฌ ์์ฑ๋ ํ ์คํธ์ ๊ธฐ์ค ํ ์คํธ์ ์๋ฏธ์ ์ ์ฌ์ฑ์ ๊ณ์ฐํฉ๋๋ค.
-
๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ ๊ฐ์ ์ด๋ ๊ฑฐ๋ฆฌ(์ด๋ ๋น์ฉ)๋ฅผ ์ต์ํํ์ฌ ๋ ํ ์คํธ๊ฐ ์ผ๋ง๋ ์ ์ฌํ์ง๋ฅผ ํ๊ฐํฉ๋๋ค.
-
ํน์ง:
- ๋จ์ด ์ด๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ํ๊ฐ๋ก ์๋ฏธ์ ์ผ๋ก ๋น์ทํ ๋จ์ด๋ค ๊ฐ์ ์ ์ฌ์ฑ์ ๋ฐ์ํฉ๋๋ค.
-
์ฅ์ :
- ๋จ์ด ์ด๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฐํ ์ ์ฌ์ฑ์ ์ธก์ ํ ์ ์์ต๋๋ค.
- ๋ฒ์ญ, ์์ฝ ๋ฑ ๋ค์ํ NLP ์์ ์ ํ์ฉ๋ฉ๋๋ค.
-
๋จ์ :
- ์ด๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ๋ณต์กํ๊ณ ์์์ด ๋ง์ด ์๋ชจ๋ฉ๋๋ค.
- ๊ธด ๋ฌธ์ฅ์ ๋จ์ด ์์ค์์ ํ๊ฐํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
5. GPTScore
- ์ค๋ช
:
- GPTScore๋ GPT์ ๊ฐ์ ๋ํ ์ธ์ด ๋ชจ๋ธ(LLM)์ ์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ฌ ๋ฌธ๋งฅ์ ์๋ฏธ์ ๋ฌธ์ฅ์ ์์ฐ์ค๋ฌ์์ ํ๊ฐํฉ๋๋ค.
-
์์ฑ๋ ๋ฌธ์ฅ์ ๊ฐ ํ ํฐ(๋จ์ด)์ด ์ฃผ์ด์ง ์กฐ๊ฑด์์ ์ผ๋ง๋ ๋์ ํ๋ฅ ๋ก ์์ฑ๋์๋์ง๋ฅผ ์ ์ํํฉ๋๋ค.
-
ํน์ง:
- GPTScore๋ ๋จ์ด ์์ค์ ๋์ด ๋ฌธ์ฅ ์ ์ฒด์ ์๋ฏธ์ ์ ์ฌ์ฑ๊ณผ ๋ฌธ๋งฅ์ ์์ฐ์ค๋ฌ์์ ์ธก์ ํฉ๋๋ค.
-
์ฅ์ :
- ๋ํ ์ธ์ด ๋ชจ๋ธ์ ๊ฐ๋ ฅํ ๋ฌธ๋งฅ ์ดํด ๋ฅ๋ ฅ์ ํ์ฉํฉ๋๋ค.
- ๋ฒ์ญ, ์์ฝ, ์์ฑ ํ ์คํธ ํ๊ฐ ๋ฑ ๋ค์ํ ์์ ์ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
-
๋จ์ :
- ์ฌ์ฉ๋ ๋ชจ๋ธ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ์๋ชจ๋ฉ๋๋ค.
6. QAG Score (Question-Answer Generation)
- ์ค๋ช
:
-
QAG๋ ์ง๋ฌธ-๋ต๋ณ ์์ฑ ๋ฐฉ์์ ํ์ฉํ์ฌ
์์ฑ๋ ํ ์คํธ
์๊ธฐ์ค ํ ์คํธ
๊ฐ์ ์ฌ์ค์ ์ผ๊ด์ฑ์ ํ๊ฐํฉ๋๋ค. -
๊ธฐ์กด Question Generation๊ณผ์ ์ฐจ์ด์ ์ ์์ฑ๋ ํ ์คํธ์์ ์ง๋ฌธ์ ๋ง๋ค๊ณ , ์ด์ ๋ํ ๋ต๋ณ์ด ๊ธฐ์ค ํ ์คํธ์ ์ผ์นํ๋์ง๋ฅผ ํ์ธํฉ๋๋ค.
-
(์ฐธ๊ณ ) ํด๋น ๋ ผ๋ฌธ์ Question-Answer Generation Task Pipeline์ ๋ค๋ฃจ๊ธด ํ์ง๋ง, ์ ํํ๊ฒ Scoring์ ๋ํด์ ๋ค๋ฃจ๊ณ ์์ง ์์ต๋๋ค.
-
ํน์ง:
- ์ง๋ฌธ-๋ต๋ณ ํ์์ผ๋ก ํ ์คํธ์ ํต์ฌ ์๋ฏธ๋ฅผ ํ๊ฐํฉ๋๋ค.
-
์ฅ์ :
- ํ ์คํธ์ ์ฌ์ค์ ํ์ง์ ์ ๋ฐํ๊ฒ ํ๊ฐํฉ๋๋ค.
- ์ง๋ฌธ๊ณผ ๋ต๋ณ ๋ฐฉ์์ผ๋ก ํ ์คํธ์ ํต์ฌ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
-
๋จ์ :
- ์ถ๊ฐ์ ์ธ ์ง๋ฌธ ์์ฑ ๊ณผ์ ์ด ํ์ํด ์๊ฐ์ด ์์๋ฉ๋๋ค.
- QA ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ฐ๋ผ ํ๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
7. SelfCheckGPT
- ์ค๋ช
:
-
SelfCheckGPT๋ ๋ชจ๋ธ์ด ์ค์ค๋ก ํ ์คํธ์ ํ์ง์ ํ๊ฐํฉ๋๋ค.
-
๋ชจ๋ธ์ด ์์ฑํ ์ฌ๋ฌ ์๋ต์ ๋น๊ตํด ์ ์ฌ์ฑ์ด ๋ฐ๋ณต๋๋ฉด ์ผ๊ด์ฑ์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
-
-
ํน์ง:
- ์์ฑ๋ ํ ์คํธ๊ฐ ์ด์ ์ ๋ณด์ ์ผ๋ง๋ ์ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ์ ๊ฒํฉ๋๋ค.
-
์ฅ์ :
- ์ฌ๋์ด ํ์ ์์ด ๋ชจ๋ธ์ด ์ค์ค๋ก ํ ์คํธ ํ์ง์ ์ ๊ฒํ ์ ์์ต๋๋ค.
- ์ ๋ณด ์ผ๊ด์ฑ๊ณผ ์ฌ์ค์ฑ์ ํ๊ฐํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
-
๋จ์ :
- ๋ณต์กํ ์ฌ์ค ๊ฒ์ฆ์๋ ์ฝํฉ๋๋ค.
- ๋ชจ๋ธ์ ์ ๋ขฐ์ฑ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค.
8. G-Eval
- ์ค๋ช
:
-
G-Eval์ GPT-4๋ฅผ ๊ธฐ๋ฐ์ผ๋ก CoT (Chain-of-Thought)์ ์์ ์ฑ์ฐ๊ธฐ(Form-filling) ๋ฐฉ์์ ๊ฒฐํฉํ์ฌ ํ๊ฐ ๊ธฐ์ค์ ์ ์ํฉ๋๋ค.
-
ํ๊ฐ ํญ๋ชฉ(์: ์ผ๊ด์ฑ, ์ ํ์ฑ ๋ฑ)์ ์ ์ํ๊ณ ์ด์ ๋ฐ๋ผ ์ ์๋ฅผ ๋งค๊น๋๋ค.
-
-
ํน์ง:
- ํ๊ฐ ๊ธฐ์ค์ ์ธ๋ถํํ์ฌ ์ ๋ฐํ ํ๊ฐ๋ฅผ ์ํํฉ๋๋ค.
-
์ฅ์ :
- ๋ค์ํ ์์ ์์ ๋ง์ถคํ ํ๊ฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- CoT ๋ฐฉ์์ผ๋ก ํ๊ฐ์ ์ ๋ฐ๋๊ฐ ๋์์ง๋๋ค.
-
๋จ์ :
- ํ๋กฌํํธ ์ค๊ณ๊ฐ ์๋ชป๋๋ฉด ํ๊ฐ ๊ฒฐ๊ณผ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
9. Prometheus
- ์ค๋ช
:
-
Prometheus๋ ํ๊ตญ๊ณผํ๊ธฐ์ ์(KAIST)๊ณผ LG AI์ฐ๊ตฌ์์ด ๊ฐ๋ฐํ ์คํ ์์ค ํ๊ฐ ํ๋ ์์ํฌ๋ก, ํน์ ๋๋ฉ์ธ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ถฐ ํ๊ฐ ๊ธฐ์ค์ ์ค์ ํ ์ ์์ต๋๋ค.
-
-
ํน์ง:
- ์ฌ์ ์ ์๋ ํ๊ฐ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉฐ, ๋ค์ํ ํ๊ฐ ์งํ(์ ํ์ฑ, ์ ์ฐฝ์ฑ, ์ผ๊ด์ฑ, ์ฌ์ค์ฑ ๋ฑ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
์ฅ์ :
- ๋ค์ํ ์งํ์ ์ฌ์ฉ์ ๋ง์ถคํ ํ๊ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํน์ ๋๋ฉ์ธ์ ๊ตญํ๋์ง ์๊ณ ์ ์ฐํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
-
๋จ์ :
- ํ๋กฌํํธ ์ค๊ณ๊ฐ ํ๊ฐ ๊ฒฐ๊ณผ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
-
RAG ํ๊ฐ
์๋๋ RAG(Retrieval-Augmented Generation)๋ฅผ ํ๊ฐํ๋ RAG ํ๊ฐ ๋ฉํธ๋ฆญ์ ๋ํด์ ๊ฐ์ ๋ด์ฉ๊ณผ ํด๋น ๋ด์ฉ์ ๋ณด์ถฉํ ๋งํ ์๋ฃ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฒจ๋ถํ ๋ด์ฉ์ ๋๋ค.
Background
RAG ์์คํ
์ ๊ฒ์ ๋จ๊ณ
์ ์์ฑ(๋ต๋ณ) ๋จ๊ณ
์ ํ๊ฐ๊ฐ ๋ชจ๋ ์ค์ํฉ๋๋ค.
- ๊ฐ ๋จ๊ณ์ ์ธ๋ถ ํ๊ฐ ์์์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. Input
- [Q] Question: ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ง๋ฌธ์ผ๋ก, RAG ํ์ดํ๋ผ์ธ์ ์์์ ์ ๋๋ค.
2. RAG Pipeline
RAG ํ์ดํ๋ผ์ธ์ ํฌ๊ฒ ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
Retriever (๊ฒ์๊ธฐ)
:- ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ์ปจํ ์คํธ([C] Retrieval Context)๋ฅผ ๊ฒ์ํฉ๋๋ค.
๐ฌ ๊ฒ์ ํ๊ฐ
๋ชฉ์
: ๊ฒ์๋ ์ปจํ ์คํธ๊ฐ ์ฌ์ฉ์์ ์ง๋ฌธ์ ์ผ๋ง๋ ๊ด๋ จ์ฑ์ด ์๋์ง๋ฅผ ํ๊ฐํฉ๋๋ค.
- ๊ฒ์๋ ์ปจํ ์คํธ(
[C] Retrieval Context
)๊ฐ ์ง๋ฌธ([Q] Question
)๊ณผ ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ํ์ธํฉ๋๋ค.ํ๊ฐ ๋ฉํธ๋ฆญ
:
- Contextual Recall: ๊ฒ์๋ ๋ฌธ์๊ฐ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ์ผ๋ง๋ ๋ง์ด ํฌํจํ๋์ง.
- Contextual Precision: ๊ฒ์๋ ๋ฌธ์์ ๋น์จ ์ค ๊ด๋ จ๋ ๋ด์ฉ์ด ์ผ๋ง๋ ๋๋์ง.
- Contextual Relevancy: ๊ฒ์๋ ๋ฌธ์๊ฐ ์ง๋ฌธ์ ์๋ฏธ์ ์ผ๋ง๋ ์ ์ฌํ์ง.
Generator (์์ฑ๊ธฐ)
:- ๊ฒ์๋ ์ปจํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ([A] Actual Output)์ ์์ฑํฉ๋๋ค.
๐ฌ ์์ฑ ํ๊ฐ
๋ชฉ์
: ์์ฑ๋ ๋ต๋ณ์ด ๊ฒ์๋ ๋ฌธ์ ๋ฐ ์ง๋ฌธ์ ์ผ๋ง๋ ์ ๋ถํฉํ๋์ง๋ฅผ ํ๊ฐํฉ๋๋ค.
- ์์ฑ๋ ๋ต๋ณ(
[A] Actual Output
)์ด ๊ฒ์๋ ์ปจํ ์คํธ([C] Retrieval Context
), ์ง๋ฌธ([Q] Question
), Ground Truth([G] Ground Truth
)์ ์ผ๋ง๋ ์ผ์นํ๋์ง ํ๊ฐํฉ๋๋ค.ํ๊ฐ ๋ฉํธ๋ฆญ
:
- Answer Relevancy: ์์ฑ๋ ๋ต๋ณ์ด ์ง๋ฌธ๊ณผ ์ผ๋ง๋ ๊ด๋ จ ์๋์ง.
- Faithfulness: ์์ฑ๋ ๋ต๋ณ์ด ๊ฒ์๋ ์ปจํ ์คํธ์ ์ผ๋ง๋ ์ถฉ์คํ์ง.
3. LLM Output
- [A] Actual Output: RAG ์์คํ ์ด ์์ฑํ ์ต์ข ๋ต๋ณ.
- [G] Ground Truth: ํ๊ฐ์ ๊ธฐ์ค์ด ๋๋ ์ ๋ต ๋ฐ์ดํฐ.
3.1 Model-based Scorer
RAG ํ๊ฐ์์ LLM Evaluation Metric์ ์ฌ์ฉํ์ฌ ์ง๋ฌธ, ๊ฒ์๋ ์ปจํ ์คํธ, ์์ฑ๋ ๋ต๋ณ, Ground Truth(Golden Data)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์๋ฅผ ์ฐ์ถํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค.
1. ์ ๋ ฅ/ํ๊ฐ ์์
RAG ํ๊ฐ์ ํ์ํ ์ฃผ์ ์ ๋ ฅ ๊ฐ(arguments from LLM application)๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Input (์ง๋ฌธ): ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ง๋ฌธ.
- Actual Output (์ค์ ์ถ๋ ฅ): RAG ์์คํ ์ด ์์ฑํ ๋ต๋ณ.
- Retrieval Context (๊ฒ์ ์ปจํ ์คํธ): ์ง๋ฌธ์ ๋ํด ๊ฒ์๋ ๊ด๋ จ ๋ฌธ์๋ ํ ์คํธ.
- Ground Truth (์ ๋ต ๋ฐ์ดํฐ): ์ด์์ ์ธ ์ ๋ต ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ค ๊ฐ.
2. LLM Evaluation Metric
-
Scorer (์ ์ ์ฐ์ถ๊ธฐ):
- ์ ๋ ฅ ์์๋ค(Input, Actual Output, Retrieval Context, Ground Truth)์ ๋น๊ตํ์ฌ ์ ์๋ฅผ ์ฐ์ถํฉ๋๋ค.
- ์: Fine-tuned BERT, GPT ๋ชจ๋ธ์ด ์ ๋ ฅ ๊ฐ๊ณผ ์ถ๋ ฅ ๊ฐ ๊ฐ์ ์ ์ฌ์ฑ์ ๊ณ์ฐ.
-
Thresholding (์๊ณ๊ฐ ํ๊ฐ):
- Scorer๊ฐ ์ฐ์ถํ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ต์ ์๊ณ๊ฐ(Threshold)์ ์ค์ ํฉ๋๋ค.
- ์ ์๊ฐ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด โPassed(โ๏ธ)โ๋ก ํ๊ฐ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด โFailed(โ)โ๋ก ํ๊ฐ๋ฉ๋๋ค.
-
Score์ Reason(Optional):
- ์ ์์ ํจ๊ป ์ ํ์ ์ผ๋ก ์ด์ (Reason)๋ฅผ ์ ๊ณตํ์ฌ ์ ํด๋น ์ ์๋ฅผ ๋ฐ์๋์ง ์ค๋ช ํ ์ ์์ต๋๋ค.
3.2 Ground Truth
1. Ground Truth๋?
-
์ ์: Ground Truth๋ ์ฌ์ฉ์์ ์ง๋ฌธ์ ์ ํฉํ ์ด์์ ์ธ ๋ต๋ณ์ด๋ ๋ฌธ์์ ์ฒญํฌ๋ฅผ ๋งํฉ๋๋ค.
-
์ด๋ RAG ์์คํ ์์ ํ๊ฐ ๊ธฐ์ค ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
-
ํน์ง:
- ์ ๋ต ๋ฐ์ดํฐ: ํ์ต ๋ฐ ํ๊ฐ ๊ณผ์ ์์ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๋จํ๋ ๊ธฐ์ค์ ์ญํ .
- End-to-End ํ๊ฐ: RAG ์์คํ ์ ๊ฒ์ ๋ฐ ์์ฑ ๊ณผ์ ์ ์ข ํฉ์ ์ผ๋ก ๋น๊ต ํ๊ฐํ ์ ์๋๋ก ํจ.
- ์ด์์ ์ํ: ์ค์ ํ์ฅ์์ ์ค๋นํ๊ธฐ ์ด๋ ต๊ณ , ๋ง์ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ด ํ์.
๐ Golden Data ?
- Ground Truth๋ ํ์ต ๋ฐ ํ๊ฐ ๊ธฐ์ค์ด ๋๋ ๋ฐ์ดํฐ๋ผ๋ฉด, Golden Data๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ํ๊ฐ๋ฅผ ์ํ ์ํ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
Golden Data๋ Ground Truth ๋ฐ์ดํฐ๋ฅผ ํน์ ๋ชฉ์ ์ ๋ง๊ฒ ์ ๋ณํ์ฌ ๊ตฌ์ฑํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ Ground_truth๋ ์ด๋ป๊ฒ ๋ง๋ค ์ ์์๊น์?
2. Ground Truth ์์ฑ ๊ณผ์
์๋ ์ด๋ฏธ์ง์์ ์ ์๋ ๋ด์ฉ์ Ground Truth๋ฅผ ์์ฑํ๋ ์ผ๋ฐ์ ์ธ ๊ณผ์ ์ ๋๋ค.
๊ฐ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
(1) ๋ฌธ์ ํ์ฑ ๋ฐ ์ ์ฒ๋ฆฌ
- PDF/์๋ฌธ ๋ฌธ์ ์ฒ๋ฆฌ:
- ์๋ณธ ๋ฌธ์๋ฅผ ์ฝ์ด์ ํ ์คํธ๋ก ๋ณํ(parsing).
- ๊ธด ํ ์คํธ๋ฅผ ์ ์ ํ ํฌ๊ธฐ๋ก ๋๋๋ chunking ์์ ์ ์ํ.
- ์ฒญํฌ ๋จ์ ์์ฑ:
- ํ ์คํธ๋ฅผ ์งง์ ๋ฌธ์ฅ์ด๋ ๋จ๋ฝ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ํ๊ฐ ๋จ์๋ก ์ฌ์ฉ.
(2) ์ง๋ฌธ ์์ฑ
- Random Pick:
- ์์ฑ๋ ์ฒญํฌ ์ค ์ผ๋ถ๋ฅผ ๋ฌด์์๋ก ์ ํ. (random ground truth)
- ์ง๋ฌธ ์์ฑ:
- ์ ํ๋ ์ฒญํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ จ๋ ์ง๋ฌธ์ ์๋ ์์ฑ.
- ์๋ฅผ ๋ค์ด:
- ํ ์คํธ ์ฒญํฌ: โI like apple. I mean the fruit apple, not the smartphone.โ
- ์์ฑ๋ ์ง๋ฌธ: โWhat is your favorite fruit?โ
(3) ๋ต๋ณ ์์ฑ
- Retrieval GT(๊ฒ์ ๊ธฐ๋ฐ ์ ๋ต):
- ์ ํ๋ ์ฒญํฌ(retrieval ground truth)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ ์์ฑ.
- Generation GT(์์ฑ ๊ธฐ๋ฐ ์ ๋ต):
- ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ๋ต๋ณ์ ์์ฑ.
(4) ๊ฒฐ๊ณผ ๊ฒํ
- ์์ฑ๋ ์ง๋ฌธ-๋ต๋ณ ์์ ํ์ง์ ์๋์ผ๋ก ๊ฒํ ํ๊ฑฐ๋ LLM ๊ธฐ๋ฐ ์๋ํ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ต์ข Ground Truth ํ์ง์ ๋ณด์ฅ.
3.3 RAG ํ๊ฐ๋ฅผ ์ํ Framework
๊ฐ์ ์๋ฃ์์๋ ๋ํ์ ์ธ ํ๊ฐ ํ๋ ์์ํฌ(Evaluation Framework)๋ก Ragas์ DeepEval, ๊ทธ๋ฆฌ๊ณ Pheonix๋ฅผ ์๋ก ๋ญ๋๋ค.
์ธ ํ๋ ์์ํฌ ๋ชจ๋ ๋ํ ์ธ์ด ๋ชจ๋ธ(LLM) ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ณ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๋๋ค.
Ragas
Ragas๋ ๋ฌธ์์์ ์ฒญํฌ๋ฅผ ์์ฑํ๊ณ ์ง๋ฌธ-๋ต๋ณ ์์ ์๋์ผ๋ก ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
Ragas์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์๋ํ๋ ๋ฐ์ดํฐ ์์ฑ
: ๋ฌธ์๋ก๋ถํฐ ์ฒญํฌ๋ฅผ ์ถ์ถํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ง๋ฌธ-๋ต๋ณ ์์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.๋น์ฉ ํจ์จ์ฑ
: ๋ฐ์ดํฐ ์์ฑ ๊ณผ์ ์ ์๋ํํจ์ผ๋ก์จ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋น์ฉ์ ํฌ๊ฒ ์ ๊ฐํ ์ ์์ต๋๋ค.์ ๋์ ํ๊ฐ
: ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ LLM ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ๋์ ์ผ๋ก ํ๊ฐํ ์ ์์ต๋๋ค.
DeepEval
DeepEval์ LLM์ ์ํ ์ ๋ ํ ์คํธ ๋๊ตฌ๋ก, Ground Truth ์์ฑ ๋ฐ ํ๊ฐ๋ฅผ ์ง์ํฉ๋๋ค.
DeepEval์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
LLM ๊ธฐ๋ฐ ํ๊ฐ
: LLM์ ์ฌ์ฉํ์ฌ Ground Truth๋ฅผ ์์ฑํ๊ณ ํ๊ฐํฉ๋๋ค.ํ์ด์ฌ ์นํ์ ์ ๊ทผ
: ํ์ด์ฌ์ผ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ๊ฒ LLM ์ ํ๋ฆฌ์ผ์ด์ ์ฉ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.๋ค์ํ ๋ฉํธ๋ฆญ ์ ๊ณต
: ๊ด๋ จ์ฑ, ์ฌ์ค์ ์ผ๊ด์ฑ, ๋ ์ฑ, ํธํฅ์ฑ ๋ฑ ๋ค์ํ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ LLM ์๋ต์ ํ๊ฐํฉ๋๋ค.CI/CD ํตํฉ
: ํ ์คํธ๋ฅผ ์ ํ ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ด, ์ง์์ ์ธ ํตํฉ๊ณผ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.Web UI ์ ๊ณต
: ํ ์คํธ, ๊ตฌํ, ๋น๊ต๋ฅผ ์ํ ์น ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
Phoenix
Phoenix๋ Arize AI์์ ๊ฐ๋ฐํ ์คํ์์ค LLM ๊ด์ฐฐ์ฑ ๋ฐ ํ๊ฐ ํ๋ซํผ์ผ๋ก, LLM ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ, ๋๋ฒ๊น , ํ๊ฐ๋ฅผ ์ํ ์ข ํฉ์ ์ธ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Phoenix์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํธ๋ ์ด์ฑ
: LLM ์์ ์ ์คํ ๋ฉํธ๋ฆญ์ ์ถ์ ํ๊ณ ๋ชจ๋ธ ๋์์ ๋ถ์ํฉ๋๋ค. ์ง์ฐ ์๊ฐ, ํ ํฐ ์ฌ์ฉ๋ ๋ฑ์ ์ฑ๋ฅ ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ํน์ ์คํฌ์ ์์ธํ ์ดํด๋ณด๊ณ ๊ด๋ จ ๋ก๊ทธ์ ๋ฉํ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.ํ๊ฐ
: ์ฌ์ ํ ์คํธ๋ ํ๊ฐ ํ ํ๋ฆฟ์ ์ ๊ณตํ์ฌ ๋ชจ๋ธ ํ์ง์ ํ๊ฐํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ ์ ์, ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง, ์๋ ํ๊ฐ๋ฅผ ์ํ ๋ณ๋ LLM ํ์ฉ ๋ฑ์ ์ง์ํฉ๋๋ค.์คํ ๋ฐ ๋๋ฒ๊น
: ํ๋กํ ํ์ดํ ๋ฐ ๋๋ฒ๊น ๋จ๊ณ์์ ์ฝ๋ ๊ณ์ธก์ ํตํด ์์ธํ ์คํ ํ๋ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ , ํ๋กฌํํธ ๋ฐ ๋ชจ๋ธ ์ฑ๋ฅ์ ์ธก์ ํ๊ธฐ ์ํ ์คํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.๊ฒ์ ๋ฐ ์ถ์ถ(RAG) ๋ถ์
: ๊ฒ์ ํ๋ก์ธ์ค๋ฅผ ์๊ฐํํ๊ณ ์ฒญํฌ ์์ฑ, ์ปจํ ์คํธ ์ถ์ถ, ํ๋กฌํํธ ํ ํ๋ฆฟ ๋ฑ์ ์ต์ ํํ ์ ์์ต๋๋ค.ํ๋กฌํํธ ํ ํ๋ฆฟ ๋๋ฒ๊น
: LLM ํธ์ถ์์ ์ฌ์ฉ๋ ํ๋กฌํํธ ํ ํ๋ฆฟ๊ณผ ์ต์ข ์์ฑ๋ ํ๋กฌํํธ๋ฅผ ์ถ์ ํฉ๋๋ค.๋ค์ํ ํ๊ฒฝ ์ง์
: ์ฃผํผํฐ ๋ ธํธ๋ถ, ๋ก์ปฌ ํ๊ฒฝ, ์ปจํ ์ด๋, ํด๋ผ์ฐ๋ ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅํฉ๋๋ค.ํ๋ ์์ํฌ ๋ฐ ๋ชจ๋ธ ํตํฉ
: LlamaIndex, LangChain ๋ฑ์ ํ๋ ์์ํฌ์ OpenAI, Amazon Bedrock ๋ฑ ๋ค์ํ LLM ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค.
(์ฐธ๊ณ ) Retrieval-Augmented Generation for Large Language Models: A Survey
- ๋งํฌ : https://arxiv.org/pdf/2312.10997v1
- ๋ณธ ๋ ผ๋ฌธ์์๋
RAGAS
์ARES
๋ผ๋ ๋ ๊ฐ์ง ์ฃผ์ ํ๊ฐ ํ๋ ์์ํฌ๊ฐ ์๊ฐํฉ๋๋ค.- ์๋ ๋ด์ฉ์ ๋ ผ๋ฌธ ๋ด์ฉ์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
- RAGAS:
- ์ด ํ๋ ์์ํฌ๋ ๊ฒ์ ์์คํ ์ด ๊ด๋ จ์ฑ๊ณผ ์ค์์ฑ์ ๊ฐ์ง ๋ฌธ๋จ์ ์๋ณํ๋ ๋ฅ๋ ฅ, LLM์ด ์ด๋ฌํ ๋ฌธ๋จ์ ์ผ๋ง๋ ์ถฉ์คํ ์ฌ์ฉํ๋์ง, ์์ฑ์ ์ง์ ํ๊ฐํฉ๋๋ค.
- RAGAS๋ ๊ฐ๋จํ ์๋ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๊ฐ์ง ํ์ง ์ธก๋ฉด(๋ต๋ณ์ ์ ๋ขฐ์ฑ, ๋ต๋ณ์ ๊ด๋ จ์ฑ, ๋ฌธ๋งฅ์ ๊ด๋ จ์ฑ)์ ํ๊ฐํฉ๋๋ค.
- ๋ชจ๋ ํ๋กฌํํธ๋ OpenAI API๋ฅผ ํตํด gpt-3.5-turbo-16k ๋ชจ๋ธ๋ก ํ๊ฐ๋ฉ๋๋ค.
- ARES:
- ARES๋ RAG ์์คํ ์ ์ฑ๋ฅ์ ์๋์ผ๋ก ํ๊ฐํ๊ธฐ ์ํด Context Relevance, Answer Faithfulness, Answer Relevance์ ์ธ ๊ฐ์ง ์ธก๋ฉด์ ๋ชฉํ๋ก ํฉ๋๋ค.
- RAGAS์ ์ ์ฌํ ํ๊ฐ ์งํ๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ ์๋ก์ด ์ค์ ์ ๋ํ ์ ์์ฑ์ด ๋จ์ด์ง๋ ๋จ์ ์ด ์์ต๋๋ค.
- ARES๋ ์๋์ ์๋ ์ฃผ์ ๋ฐ์ดํฐ์ ํฉ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฐ ๋น์ฉ์ ์ค์ด๋ฉฐ, Predictive-Driven Reasoning (PDR)์ ์ฌ์ฉํด ํ๊ฐ์ ์ ํ๋๋ฅผ ๋์ ๋๋ค.
3.4 RAGAs ๊ธฐ๋ฐ Ground Truth ์์ฑ
RAGAs๋ฅผ ํ์ฉํ์ฌ RAG ํ๊ฐ๋ฅผ ์ํ Ground Truth๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.
RAGAs ์ค์ ๋ฐ ํ์ฉ
-
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ:
1 2 3
from ragas.llms import LangchainLLMWrapper from ragas.embeddings import LangchainEmbeddingsWrapper from ragas.testset import TestsetGenerator
-
๋ชจ๋ธ ๋ฐ ์๋ฒ ๋ฉ ์ด๊ธฐํ:
1 2
llm = LangchainLLMWrapper("openai-gpt") # LLM ๋ชจ๋ธ ์ด๊ธฐํ embeddings = LangchainEmbeddingsWrapper("openai-embedding") # ์๋ฒ ๋ฉ ๋ชจ๋ธ ์ด๊ธฐํ
-
ํ ์คํธ์ ์์ฑ๊ธฐ ์ ์:
1 2 3 4
generator = TestsetGenerator( llm=llm, embedding_model=embeddings )
-
Ground Truth ์์ฑ:
1 2 3 4
dataset = generator.generate_with_langchain_docs( split_documents=split_documents, # ์ฌ์ ๋ถ๋ฆฌ๋ ๋ฌธ์ testset_size=10 # ์์ฑํ ์ง๋ฌธ-๋ต๋ณ ์ ๊ฐ์ )
-
๋ฐ์ดํฐ์ ํ์ธ:
1
print(dataset.to_pandas()) # Pandas ๋ฐ์ดํฐํ๋ ์ ํ์์ผ๋ก ํ์ธ
์ ์ฝ๋๋ฅผ ์ํํ๋ฉด, ์๋์ ๊ฐ์ด ์ง๋ฌธ๊ณผ, GT๊ฐ ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
3.5 RAG ํ๊ฐ: RAG Triad
RAG Triad๋ RAG(Retrieval-Augmented Generation) ์์คํ ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ํต์ฌ ํ๊ฐ ์งํ ํ๋ ์์ํฌ์ ๋๋ค.
- ์ด๋ โ์ง์ (Query)โ, โ์ปจํ ์คํธ (Context)โ, โ์๋ต (Response)โ์ ์ธ ์์๊ฐ โ์ ์ ํ (Relevance)โ ๋ด์ฉ์ ๋ด๊ณ ์๋์ง ํ๊ฐํ๊ณ ์ ํฉ๋๋ค.
- ์ด ํ๋ ์์ํฌ๋ ๊ฒ์๊ณผ ์์ฑ์ ๊ท ํ์ ํ๊ฐํ๊ณ ์ ์ฌ์ ์ธ ์คํจ ๋ชจ๋๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- RAG ํ๊ฐ์ ์ธ ๊ฐ์ง ํต์ฌ
- ๊ฒ์ ํ์ง(Search Quality): ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ํ์ฑ.
- ์์ฑ ํ์ง(Generation Quality): ์์ฑ๋ ๋ต๋ณ์ ์ ํ์ฑ๊ณผ ๊ด๋ จ์ฑ.
- ์ฌ์ฉ์ ๊ฒฝํ(User Experience): ์ฌ์ฉ์ ์นํ์ฑ, ์๋ต ์๊ฐ ๋ฑ.
(์ฐธ๊ณ ) DeepEval ์ค์ต
์ ํ 1: ๊ธฐ๋ณธ ์ถ๋ ฅ ํ์ง ํ๊ฐ
- G-Eval ๋ฉํธ๋ฆญ
- โcriteriaโ์ โevaluation_stepsโ๋ ๋์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ค ์ค ํ๋๋ฅผ ์ ํํด์ผ ํจ.
-
CoT(Chain-of-Thoughts)๋ฅผ ํ์ฉํ ํ๊ฐ ์ฒด๊ณ์ ์ค์์ฑ ๋ฐ ์ค์ ํ์ฉ ์ฌ๋ก(์: ๋จ๊ณ๋ณ reasoning).
-
๋ต๋ณ ๊ด๋ จ์ฑ ํ๊ฐ
- ์ ๊ณต๋ ์ ๋ ฅ๊ณผ ๋น๊ตํ์ฌ, LLM์ ์ถ๋ ฅ์ด ์ผ๋ง๋ ๊ด๋ จ์ฑ์ด ์๋์ง ํ๊ฐ.
- ํน์ง:
- ์์ฒด ์ค๋ช ํ ์งํ๋ก, ์ ์์ ๋ํ ์ด์ (reason)๋ฅผ ํจ๊ป ์ถ๋ ฅ.
-
์๊ณ๊ฐ(Threshold): 0.7 ์ด์์ด๋ฉด ๊ด๋ จ์ฑ์ด ์๋ค๊ณ ๊ฐ์ฃผ.
-
ํธํฅ์ฑ(bias) ๋ฐ ๋ ์ฑ(toxicity) ํ๊ฐ
Bias (ํธํฅ์ฑ)
: ์ถ๋ ฅ์ ์ฑ๋ณ, ์ธ์ข , ์ ์น์ ํธํฅ์ฑ์ด ํฌํจ๋์๋์ง ํ๊ฐ.-
ํน์ง: ์๊ณ๊ฐ: 0.5 ์ด์์ผ ๊ฒฝ์ฐ, ํธํฅ์ ์ด๋ผ๊ณ ํ๋จ.
-
Toxicity (๋ ์ฑ)
: ์ถ๋ ฅ์ด ๋ชจ์์ ์ด๊ฑฐ๋ ์ ํดํ ์ธ์ด๋ฅผ ํฌํจํ๋์ง ํ๊ฐ.-
ํน์ง: ์๊ณ๊ฐ: 0.5 ์ด์์ผ ๊ฒฝ์ฐ, ๋ ์ฑ์ด ์๋ค๊ณ ํ๋จ.
-
-
๋ํ ์์ ์ฑ ๋ฐ ๊ด๋ จ์ฑ ํ๊ฐ
Conversation Completeness (๋ํ ์์ ์ฑ)
: ๋ํ ์ ๋ฐ์์ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋์ง ํ๊ฐ.-
ํน์ง: ์๊ณ๊ฐ: 0.5 ์ด์์ด๋ฉด ๋ํ๊ฐ ์ถฉ๋ถํ ์์ ํ๋ค๊ณ ๊ฐ์ฃผ.
-
Conversation Relevancy (๋ํ ๊ด๋ จ์ฑ)
: ๋ํ ๋งฅ๋ฝ์์ ์ง์์ ์ผ๋ก ๊ด๋ จ์ฑ ์๋ ์๋ต์ ์์ฑํ๋์ง ํ๊ฐ.-
ํน์ง: ์๊ณ๊ฐ: 0.5 ์ด์์ด๋ฉด ๊ด๋ จ์ฑ์ด ์๋ค๊ณ ๊ฐ์ฃผ.
-
DeepEval์ Test Dataset ์์ฑ
- ํ๋ก์ธ์ค ๊ฐ์
- ๋ฌธ์ ์ฒญํฌํ:
- ์๋ณธ ๋ฌธ์๋ฅผ ์ฒญํฌ๋ก ๋ถ๋ฆฌํ๊ณ , ๊ฐ ์ฒญํฌ๋ฅผ ์๋ฒ ๋ฉํ์ฌ ๋ ธ๋ ์ปฌ๋ ์ ์์ฑ.
- ์ ์ฌ ๋
ธ๋ ๊ฒ์ ๋ฐ ์ปจํ
์คํธ ์์ฑ:
- ๊ฐ ์ฒญํฌ์ ๋ํด ์ ์ฌํ ๋ ธ๋๋ฅผ ๊ฒ์ํ์ฌ ๊ทธ๋ฃนํ.
- ํฉ์ฑ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ ์์ฑ:
- ์์ฑ๋ ์ปจํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง๋ฌธ-๋ต๋ณ ์์ ์์ฑํ์ฌ Golden Dataset์ ํ์ฑ.
- ๋ฌธ์ ์ฒญํฌํ:
- ์๊ณ๊ฐ ์ค์
-
ํ์ง์ด ๋ฎ์ ์ ๋ ฅ ๋ฐ ์ปจํ ์คํธ๋ ๊ฑฐ๋ถ๋๋ฉฐ, ๊ธฐ๋ณธ ์๊ณ๊ฐ(0.5)์ด ์ค์ ๋จ.
-
์ปจํ ์คํธ ํ์ง์ด๋ ์ ์ฌ๋๊ฐ ๊ธฐ์ค ๋ฏธ๋ฌ์ผ ๊ฒฝ์ฐ ์ฌ์๋ ๊ฐ๋ฅ.
-
์ฝ๋ ์ค์ต
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from deepeval.dataset import EvaluationDataset
from deepeval.synthesizer import Synthesizer
# Synthesizer ์ด๊ธฐํ
synthesizer = Synthesizer(
model="gpt-4o-mini", # ๊ธฐ๋ณธ GPT ๋ชจ๋ธ ์ค์
critic_model="gpt-4o-mini", # ํ๊ฐ ๊ธฐ์ค(Critic) ๋ชจ๋ธ ์ค์
embedder=embeddings, # ๋ฌธ์ ์๋ฒ ๋ฉ ๋ชจ๋ธ
context_quality_threshold=0.6, # ์ปจํ
์คํธ ํ์ง ์๊ณ๊ฐ ์ค์
context_similarity_threshold=0.7, # ์ปจํ
์คํธ ์ ์ฌ๋ ๊ธฐ์ค
context_max_retries=4, # ์ปจํ
์คํธ ์์ฑ ์ฌ์๋ ํ์
synthetic_input_quality_threshold=0.8, # ํฉ์ฑ ์
๋ ฅ ํ์ง ๊ธฐ์ค
synthetic_input_max_retries=5 # ํฉ์ฑ ์
๋ ฅ ์ฌ์๋ ํ์
)
- Synthesizer ์ด๊ธฐํ
Synthesizer
๊ฐ์ฒด๋ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ์ฑ ์ง๋ฌธ-๋ต๋ณ ์์ ์์ฑํ๊ธฐ ์ํ ํต์ฌ ์ญํ ์ ์ํํฉ๋๋ค.- ๋งค๊ฐ๋ณ์:
model
๊ณผcritic_model
: ์์ฑ๊ณผ ํ๊ฐ์ ์ฌ์ฉํ GPT ๋ชจ๋ธ.embedder
: ๋ฌธ์๋ฅผ ์๋ฒ ๋ฉํ์ฌ ์ ์ฌ๋ ๊ณ์ฐ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ.context_quality_threshold
: ์ปจํ ์คํธ์ ์ต์ ํ์ง ๊ธฐ์ค (0.6).context_similarity_threshold
: ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์คํธ์ ์ ์ฌ๋๋ฅผ ํ๊ฐ (๊ธฐ๋ณธ๊ฐ: 0.7).context_max_retries
: ๊ธฐ์ค ๋ฏธ๋ฌ ์ ์ปจํ ์คํธ ์์ฑ ์ฌ์๋ ํ์ (4ํ).synthetic_input_quality_threshold
: ํฉ์ฑ ์ ๋ ฅ์ ํ์ง ๊ธฐ์ค (0.8).synthetic_input_max_retries
: ํฉ์ฑ ์ ๋ ฅ ์์ฑ ์ฌ์๋ ํ์ (5ํ).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Test Dataset ์์ฑ
dataset = EvaluationDataset()
# Prompt Customization
dataset.generate_goldens_from_docs(
synthesizer=synthesizer,
document_paths=['/content/drive/MyDrive/RAG docs/๊ฒฝ๊ธฐ_์ฐจ๋ณํ_์ ๋ง.pdf'], # ๋ฌธ์ ๊ฒฝ๋ก ์ค์
scenario="A typical users asking question to obtain information using plain Korean instructions",
task="Answering to user questions by sending queries to the database and returning the results to the user.",
input_format="Korean instructions for retrieving information from a database",
expected_output_format="Korean informations based on the given input"
)
-
Test Dataset ์์ฑ
generate_goldens_from_docs
๋ฉ์๋๋ฅผ ํตํด Test Dataset ์์ฑ.- ๋งค๊ฐ๋ณ์:
document_paths
: ๋ฌธ์ ๊ฒฝ๋ก ๋ฆฌ์คํธ.scenario
: ์ฌ์ฉ ์ฌ๋ก ์ค๋ช (์: ์ฌ์ฉ์ ์์ฒญ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ๋ฐํํ๋ ์๋๋ฆฌ์ค).task
: ์์ ์ ๋ชฉํ ์ค๋ช (์: ์ง์์๋ต).input_format
: ์ ๋ ฅ ๋ฐ์ดํฐ์ ํ์ (ํ๊ตญ์ด ์ง์ ํ์).expected_output_format
: ์ถ๋ ฅ ๋ฐ์ดํฐ์ ํ์ (ํ๊ตญ์ด ์ ๋ณด).
-
Prompt Customization
- ๊ฐ๋จํ ํ๋กฌํํธ ์ค์ ์ ํตํด ํ๊ตญ์ด ๊ธฐ๋ฐ์ Golden Dataset ์์ฑ ๊ฐ๋ฅ.
- ์ฌ์ฉ ์ฌ๋ก์ ๋ง๋ ๋ค์ํ ์ธ์ด ์ง์.
๋ง์ง๋ง ๋จ๊ณ์์๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ Markdown ํ์์ผ๋ก ์ถ๋ ฅํ์ฌ ํ์ธํฉ๋๋ค:
1
2
3
4
display(Markdown(f"**Input**: {dataset.goldens[2].input}"))
display(Markdown(f"**Context**: {dataset.goldens[2].context}"))
display(Markdown(f"**Expected_output**: {dataset.goldens[2].expected_output}"))
๊ฒฐ๊ณผ:
- Input: 2025๋ ์ฃผ์๊ตญ GDP ์ฑ์ฅ๋ฅ ๋ฐ ์ธํ๋ ์ด์ ์ ์ฐจ๋ณํ์ ๋ํ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์กฐํํ ์ ์๋์?
- Context: 2025๋ ๊ฒฝ์ ์ ๋ง ๋ณด๊ณ ์์ ๋ฐ๋ฅด๋ฉด ์ฐ์ ์์ฐ์ด ๊ฐ์ ์ถ์ธ์ ์์ผ๋ฉฐ, ๊ตญ์ ๊ธ์ต ๊ธฐ๊ด์ ๋ถ์ ๋ณด๊ณ ์๋ฅผ ํตํด ๊ฒฝ์ ์ํฉ ๋น๊ต ๊ฐ๋ฅ.
- Expected Output: ์ฃผ์๊ตญ GDP ์ฑ์ฅ๋ฅ ์ ๋ณด๋ฅผ ๋น๊ตํ๊ณ , IMF ๋ฐ OECD ๋ณด๊ณ ์๋ฅผ ํ์ฉํ์ฌ ๊ฒฝ์ ์ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ ํ 2: ์ปจํ ์คํธ ๊ธฐ๋ฐ ํ๊ฐ
-
๋ฌธ๋งฅ์ ๊ด๋ จ์ฑ (Contextual Relevance)
- ๊ฒ์๋ ์ปจํ ์คํธ๊ฐ ์ง๋ฌธ์ ๋งฅ๋ฝ๊ณผ ์ผ๋ง๋ ์๋ฏธ์ ์ผ๋ก ๊ด๋ จ์ด ์๋์ง๋ฅผ ํ๊ฐ.
- ๊ตฌ์ฒด์ ๊ธฐ์ค์ ์ฝ์ฌ์ธ ์ ์ฌ๋์ ๊ฐ์ ์๋ฒ ๋ฉ ๋น๊ต ๋ฐฉ์ ์ฌ์ฉ. ``` from deepeval.metrics import ContextualRelevancyMetric
๋ฌธ๋งฅ์ ๊ด๋ จ์ฑ ํ๊ฐ ๋ฉํธ๋ฆญ ์ด๊ธฐํ
metric = ContextualRelevancyMetric( threshold=0.7, # ์๊ณ๊ฐ: 0.7 ์ด์์ด๋ฉด Pass model=โgpt-4o-miniโ, # ํ๊ฐ์ ์ฌ์ฉํ ๋ชจ๋ธ include_reason=True # ์ ์์ ๋ํ ์ด์ ๋ฅผ ์ถ๋ ฅ )
ํ๊ฐ ๊ตฌ์ฑ์์ ์์ฑ
question = dataset.goldens[2].input # ์ ๋ ฅ ์ง๋ฌธ actual_output = chain.invoke(question) # ์ค์ ์ถ๋ ฅ retrieval_context = dataset.goldens[2].context # ๊ฒ์๋ ์ปจํ ์คํธ
ํ ์คํธ ์ผ์ด์ค ์์ฑ
test_case = LLMTestCase( input=question, actual_output=actual_output, retrieval_context=retrieval_context )
๋ฌธ๋งฅ์ ๊ด๋ จ์ฑ ํ๊ฐ ์ํ
metric.measure(test_case)
```
-
ํ๊ฐ ๊ฒฐ๊ณผ ํด์
- ์ถ๋ ฅ ์ ์: 0.5 (๊ธฐ์ค ๋ฏธ๋ฌ)
- ์ด์ (Reason): ๊ฒ์๋ ์ปจํ ์คํธ๊ฐ ๋จ์ํ ์ซ์ ์์ธก๋ง ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ง๋ฌธ์ ๋งฅ๋ฝ์ ์๊ตฌ(์: ์ง์ ํ์ ์ํ, OPEC ๊ฒฐ์ ์ ์ํฅ)๋ฅผ ๋ฐ์ํ์ง ๋ชปํจ.
- ์๊ณ๊ฐ ๋ฏธ๋ฌ (์ค์ ๋ threshold=0.7๋ฅผ ๋์ง ๋ชปํด Fail๋ก ์ฒ๋ฆฌ.)
- Fail ์ด์ :
- โWTI ํ๊ท ๊ฐ๊ฒฉโ์ ๋ํ ์ง๋ฌธ์ ์ง์ ํ์ ์ํ๊ณผ ๊ฐ์ ๋ณต์กํ ์์ธ์ ๊ณ ๋ คํด์ผ ํ์ง๋ง, ์ปจํ ์คํธ๊ฐ ๋จ์ ์์น ์ ๋ณด๋ง ์ ๊ณต.
- Fail ์ด์ :
- ์ถ๋ ฅ ์ ์: 0.5 (๊ธฐ์ค ๋ฏธ๋ฌ)
-
์ถฉ์ค๋ (Faithfulness) ํ๊ฐ
- ์ถ๋ ฅ์ด ๊ฒ์๋ ์ปจํ ์คํธ ๋ด์์ ์๊ณก ์์ด ์ ๋ณด๋ฅผ ๋ฐ์ํ๋์ง ํ์ธ.
- ์ถฉ์ค๋๊ฐ ๋ฎ์ ์ถ๋ ฅ์ RAG ํ์ดํ๋ผ์ธ์์ โํ๊ฐโ์ผ๋ก ๊ฐ์ฃผ. ```
from deepeval.metrics import FaithfulnessMetric
์ถฉ์ค๋ ํ๊ฐ ๋ฉํธ๋ฆญ ์ด๊ธฐํ
metric = FaithfulnessMetric( threshold=0.7, # ์๊ณ๊ฐ: 0.7 ์ด์์ด๋ฉด Pass model=โgpt-4o-miniโ, # ํ๊ฐ์ ์ฌ์ฉํ ๋ชจ๋ธ include_reason=True # ์ ์์ ๋ํ ์ด์ ๋ฅผ ์ถ๋ ฅ )
ํ๊ฐ ๊ตฌ์ฑ์์ ์์ฑ
question = dataset.goldens[2].input # ์ ๋ ฅ ์ง๋ฌธ actual_output = chain.invoke(question) # ์ค์ ์ถ๋ ฅ retrieval_context = dataset.goldens[2].context # ๊ฒ์๋ ์ปจํ ์คํธ
ํ ์คํธ ์ผ์ด์ค ์์ฑ
test_case = LLMTestCase( input=question, actual_output=actual_output, retrieval_context=retrieval_context )
์ถฉ์ค๋ ํ๊ฐ ์ํ
metric.measure(test_case)
```
- ํ๊ฐ ๊ฒฐ๊ณผ ํด์
- ์ถ๋ ฅ ์ ์: 0.71 (์๊ณ๊ฐ ์ด๊ณผ, Pass)
- ์ด์ (Reason): ์ถ๋ ฅ์ด ์ง์ ํ์ ์ํ๊ณผ OPEC ๊ฒฐ์ ์ WTI ํ๊ท ๊ฐ๊ฒฉ์ ๋ฏธ์น๋ ์ํฅ์ ์ธ๊ธํ์ผ๋, ๊ฒ์๋ ์ปจํ ์คํธ์ ์ผ๋ถ ๋ถ์ผ์น ๋ฐ์.
- ์๊ณ๊ฐ ์ด๊ณผ (์ค์ ๋ threshold=0.7๋ฅผ ์ด๊ณผํ์ฌ Pass๋ก ์ฒ๋ฆฌ.)
- Pass ์ด์ :
- ์ถ๋ ฅ์ด ์ ์ฒด์ ์ผ๋ก ์ปจํ ์คํธ์ ์ ๋ณด๋ฅผ ๋ฐ์ํ๊ณ ์์.
- ์ผ๋ถ ์ถ๊ฐ์ ์ธ ๋ ผ๋ฆฌ๊ฐ ํฌํจ๋์์ง๋ง, ์ฌ์ค์ ์๊ณก์ ์์.
- Pass ์ด์ :
- ์ถ๋ ฅ ์ ์: 0.71 (์๊ณ๊ฐ ์ด๊ณผ, Pass)
์ ํ 3: ์ฌ์ธต ํ์ง ํ๊ฐ
์๋๋ 3๊ฐ์ง ํ์ง ํ๊ฐ Metric์ ํ๋ฒ์ ์ฝ๋๋ก ๋ฌถ์ด์ ์์ฑํ ์ฝ๋์ ๋๋ค:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from deepeval.metrics import ContextualPrecisionMetric, ContextualRecallMetric
from deepeval.metrics.ragas import RagasMetric
# ๋ฌธ๋งฅ์ ์ ๋ฐ์ฑ ๋ฉํธ๋ฆญ ์ ์
contextual_precision_metric = ContextualPrecisionMetric(
threshold=0.7, # ํ๊ฐ ํต๊ณผ ๊ธฐ์ค
model="gpt-4o-mini", # ์ฌ์ฉ ๋ชจ๋ธ
include_reason=True # ์ ์ ๊ณ์ฐ ์ด์ ํฌํจ ์ฌ๋ถ
)
# ๋ฌธ๋งฅ์ ์ฌํ์ฑ ๋ฉํธ๋ฆญ ์ ์
contextual_recall_metric = ContextualRecallMetric(
threshold=0.7, # ํ๊ฐ ํต๊ณผ ๊ธฐ์ค
model="gpt-4o-mini", # ์ฌ์ฉ ๋ชจ๋ธ
include_reason=True # ์ ์ ๊ณ์ฐ ์ด์ ํฌํจ ์ฌ๋ถ
)
# RAGAS ๋ฉํธ๋ฆญ ์ ์
ragas_metric = RagasMetric(
threshold=0.5, # ํ๊ฐ ํต๊ณผ ๊ธฐ์ค
model="gpt-4o-mini" # ์ฌ์ฉ ๋ชจ๋ธ
)
# ํ๊ฐ ๊ตฌ์ฑ ์์ ์์ฑ
question = dataset.golden_data[2].input # ์ง๋ฌธ ๋ฐ์ดํฐ
actual_output = chain.invoke(question) # ๋ชจ๋ธ ์ถ๋ ฅ
retrieval_context = dataset.golden_data[2].context # ๊ฒ์๋ ์ปจํ
์คํธ
expected_output = dataset.golden_data[2].expected_output # ๊ธฐ๋ ์ถ๋ ฅ (Ground Truth)
# ํ
์คํธ ์ผ์ด์ค ์์ฑ (Type3๋ expected_output ํฌํจ)
test_case_type3 = LLMTestCase(
input=question,
actual_output=actual_output,
retrieval_context=retrieval_context,
expected_output=expected_output
)
# ๋ฉํธ๋ฆญ ํ๊ฐ
contextual_precision_metric.measure(test_case_type3)
contextual_recall_metric.measure(test_case_type3)
ragas_metric.measure(test_case_type3)
๊ฐ๊ฐ์ ๊ฒฐ๊ณผ ํด์ ๋ฐ ์ค๋ช ์ ์๋์์ ๋ณด์ค ์ ์์ต๋๋ค.
-
๋ฌธ๋งฅ์ ์ ๋ฐ์ฑ (Contextual Precision)
- ๊ด๋ จ ์ปจํ ์คํธ์ ๋ฌด๊ดํ ์ปจํ ์คํธ์ ์์๋ฅผ ๋น๊ตํ์ฌ ์ ํ๋๋ฅผ ์ธก์ .
-
RAG ์์คํ ์์ ๊ฒ์๊ธฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ํ์์ ์ธ ๋ฉํธ๋ฆญ.
- ์ถ๋ ฅ ์์:
- ์ข ํฉ ์ ์: 0.83
- ํด์ค: ๊ฒ์๋ ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ GDP ์ฑ์ฅ๋ฅ ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ๋์ ์์๋ฅผ ๋ฐ์์ง๋ง, ๋ ๋ฒ์งธ ๋ ธ๋๋ ์ค์ ๋ฅ ์ ๋ณด๋ก ๊ด๋ จ์ฑ์ด ๋ฎ์ ์ ์๊ฐ ๊ฐ์ํจ.
-
๋ฌธ๋งฅ์ ์ฌํ์ฑ (Contextual Recall)
- ๊ฒ์๋ ์ปจํ ์คํธ๊ฐ Ground Truth์ ์ผ๋ง๋ ์ผ์นํ๋์ง๋ฅผ ์ธก์ .
-
์ฌํ์ฑ์ด ๋ฎ์ผ๋ฉด RAG ํ์ดํ๋ผ์ธ์ ๊ฒ์ ๊ณผ์ ์ด ๋ถ์ ํํ๋ค๊ณ ํ๊ฐ.
- ์ถ๋ ฅ ์์:
- ์ข ํฉ ์ ์: 0.75
- ํด์ค: ๊ฒ์๋ ๋ฌธ์ฅ์ด GDP ์ฑ์ฅ๊ณผ ๋ฌผ๊ฐ ์์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ ํฌํจํ๊ณ ์์ง๋ง, ์ค์ ๋ฅ ์ ๋ํ ์ ๋ณด ๋ถ์กฑ์ผ๋ก ์ ์๊ฐ ๊ฐ์ํจ.
-
RAGAS ๋ฉํธ๋ฆญ (RAGAS Metric)
- RAG ํ์ดํ๋ผ์ธ์ ์์ฑ๊ธฐ ๋ฐ ๊ฒ์๊ธฐ๋ฅผ ์ข ํฉ์ ์ผ๋ก ํ๊ฐํ๋ ํต์ฌ ์งํ.
-
๊ฐ ๋ฉํธ๋ฆญ(๋ต๋ณ ๊ด๋ จ์ฑ, ์ถฉ์ค๋, ์ ๋ฐ์ฑ, ์ฌํ์ฑ)์ ํ๊ท ์ ์๋ฅผ ๊ณ์ฐ.
- ์ถ๋ ฅ ์์:
- ์ข ํฉ ์ ์: 0.605
- ํด์ค: ๊ฐ ๋ฉํธ๋ฆญ์ ์ธ๋ถ ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก RAG ์์คํ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํ๊ฐ.
์ด์์ผ๋ก ๊ฐ์ ์๋ฃ์ ์๋ ๋ชจ๋ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์๋๋ฐ์.
์๋ฃ๋ฅผ ํ ๋๋ก ์กฐ์ฌํ๋ฉด์ ์์ฑํ ๋ธ๋ก๊ทธ์ด๋ฏ๋ก, ์ค์ ๊ฐ์ฐ ๋ด์ฉ๊ณผ๋ ์์ดํ ์ ์์ต๋๋ค ๐
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.