์ด ๊ธ์ RAG Blueprint ๋ ํฌ์งํ ๋ฆฌ์ ์ํคํ ์ฒ๋ฅผ ๋ถ์ํ๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
GitHub - feld-m/rag_blueprint: A modular framework for building and deploying Retrieval-Augmented Generation (RAG) systems with
A modular framework for building and deploying Retrieval-Augmented Generation (RAG) systems with built-in evaluation and monitoring. - feld-m/rag_blueprint
github.com
์ํํธ์จ์ด์์์ ๋ธ๋ฃจํ๋ฆฐํธ(blueprint) ๋
- ๊ฑด์ถ์ ์ค๊ณ๋/์ฒญ์ฌ์ง ์ญํ
- ํ์คํ๋ ์ํคํ ์ณ์ ๋ฏธ๋ฆฌ ์ง๋์ ์ฝ๋๋ฅผ ์๋ฏธ
- ๋จ์ ๊ฐ๋ ๋ง ์ค๋ช ํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ ์คํ ๊ฐ๋ฅํ ์ฝ๋ ํ ํ๋ฆฟ ์ ๊ณต
RAG ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์๋ค๋๋ ์ค ๋ฐ๊ฒฌํ ํ๋ก์ ํธ์ด๋ค.
ํ์ฌ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ RAG ์์คํ ๊ณผ ์ด๋ค ์ ์ด ๋ค๋ฅธ์ง ๋น๊ตํด๋ณด๊ณ
์ํคํ ์ณ ๊ตฌ์กฐ, ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํ ์ฌ๋ฌ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ ๊ฒ ๊ฐ์์ ์ดํด๋ณด๊ธฐ๋ก ํจ

RAG Blueprint
ํ๋ก์ ํธ ์ค๋ช
- ์์ฉํ ์์ค(production-ready)์ ๊ฒ์ ์ฆ๊ฐ ์์ฑ(RAG) ์์คํ ๊ตฌ์ถ์ ์ํ ํฌ๊ด์ ์ธ ์คํ์์ค ํ๋ ์์ํฌ
- ๊ฐ๋ฐ ๋ณต์ก๋๋ ๋ฎ์ถ๋ฉด์๋ ์ฑ๋ฅ, ๋ฆฌ์์ค, ํ๊ฐ์ ๋ํ ์์ ํ ์ ์ด๊ถ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ
- ํ์ฌ ๋ค์ํ RAG ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ์ง๋ง, ์ค์ ์๋น์ค ๊ฐ๋ฅํ ์ ํ ์์ค์ผ๋ก ๋ง๋๋ ๊ฒ์ ์ด๋ ค์.
์ ๊ณตํ๋ ๊ธฐ๋ฅ
- ๋ด์ฅํ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ด์ธก ๋๊ตฌ
- LLM ๊ธฐ๋ฐ ํ๊ฐ ์งํ (RAGAS ๊ฐ์ ๋๊ตฌ ํ์ฉ๋ฒ)
- ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง ๊ธฐ๋ฅ
๊ธฐ์ ์คํ (Tech Stack)
- ํต์ฌ ์ฝ์ด ์์ง : LlamaIndex ๐(์ฐ๋ฆฌ ํ๋ก์ ํธ๋ LangChain ๊ธฐ๋ฐ์ด๋ผ ๊ตฌ์กฐ์ ์ฐจ์ด๊ฐ ์์)
- ๋ชจ๋ํฐ๋ง : Langfuse (LLM ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น , ๋ถ์ ๋ฐ ๊ฐ์ ์ ์ง์ํ๋ ์คํ์์ค ์์ง๋์ด๋ง ํ๋ซํผ) ๐
- ํ๊ฐ : RAGAS (LLM์ ์ด์ฉํด ์ ์๋ฅผ ๋งค๊ธฐ๋ ์ ๋์ ํ๊ฐ ๋๊ตฌ ๋์ .)
- UI : Chainlit (๋น ๋ฅด๊ฒ ์ฑ๋ด ํ๋ฉด์ ๋์์ฃผ๋ ๋๊ตฌ)
์ํคํ ์ณ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ
1. ์ถ์ถ (Extraction)
- ๋จ์ ์์ง์ด ์๋ ๋งํฌ๋ค์ด ํ์ฑ์ ์ํํจ.
- ๋ฌธ์๋ฅผ ๊ทธ๋ฅ ํ ์คํธ๋ก ๊ธ์ด์ค๋ ๊ฒ์ด ์๋๋ผ, ์ ๋ชฉ/๋ฌธ๋จ ๊ตฌ์กฐ๋ฅผ ์ด๋ ค์ ๋งํฌ๋ค์ด์ผ๋ก ๋ณํ ํ ์ ์ฅํจ. ๐
- ์ด๋ ๊ฒ ํ๋ฉด ์ฒญํน ํ์ง์ด ์ข์์ง.
2. ์๋ฒ ๋ฉ
- ๋ฌธ๋งฅ์ ๊ณ ๋ คํด์ ์๋ฒ ๋ฉํจ. ๐
3. ์ฆ๊ฐ-๊ฒ์/๋ฆฌ๋ญํน
- ๊ฒ์๊ณผ ์์ฑ ํ์ดํ๋ผ์ธ ์ ์
- ๋ญํจ์ฆ(Langfuse)๋ฅผ ์ฌ์ฉํด์ ๊ด๋ฆฌ ๊ฐ๋ฅํ๋๋ก ํจ.
4. ํ๊ฐ
- ์ฌ์ฉ์ ํผ๋๋ฐฑ(Chainlit) + RAGAS ์ ์ ์ธก์ . ๐
ํด๋ ๊ตฌ์กฐ
.
โโโ build/ # Build and deployment scripts
โ โโโ workstation/ # Build scripts for workstation setup
โโโ configurations/ # Configuration and secrets files
โโโ data/ # Data for local testing
โโโ res/ # Assets
โโโ src/ # Source code
โโโ augmentation/ # Chainlit, Langfuse, and RAG processing components
โโโ core/ # Base package
โโโ extraction/ # Data sources extraction
โโโ embedding/ # Data embedding
โโโ evaluate/ # Evaluation system
โโโ tests/ # Unit tests
- src ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค. ํ์ฌ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์ด๋ฐ์ด๊ธฐ๋ ํ๊ณ ๊ธฐ๋ฅ ๊ตฌ๋ถ์ด ์ ๋งคํด์ src ์ ํ๋ฒ์ ๋ฃ์ด๋จ๋๋ฐ.. ใ ์ด ๋ถ๋ถ๋ ์ฐธ๊ณ ํด์ผ๊ฒ ๋ค.
- ๋ชจ๋ํฐ๋ง์ ๋ฐ๋ก ํ์ง ์๊ณ ์ผ์ผ์ด ๋ก๊ทธ๋ฅผ ์ฐ์ด์ ํ์ธํ๊ณ ์์๋ค. ๋ชจ๋ธ์ ์ฑ๋ฅ๋งํผ ํ์ดํ๋ผ์ธ์ ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ์ด ํ๋ก์ ํธ์ ์ฑํจ์๋ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์ฝ๋ ๋ถ์ ๋ฐ ์ธ์ฌ์ดํธ
- ์ ์ฒด ํ์ดํ๋ผ์ธ ์ค, ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ์ฉํ๊ณ ์ถ์ ๋ถ๋ถ์ ๋ฐ์ทํด๋ณด์์.
(1) ๋ฌธ๋งฅ ๊ณ ๋ ค ์๋ฒ ๋ฉ (Context-Aware Embedding)
- ์ผ๋ฐ์ ์ธ ํ ์คํธ splitter ๋ ๊ธ์์(์: 500์) ๋ก ๋๋ ์๋ฆ. ์ด ๋ฐฉ์์ ์น๋ช ์ ์ธ ๋จ์ ์ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ด ๋ถ๋ฆฌ๋์ด์ ๋ฌธ๋งฅ์ ์๊ฒ ๋๋ค๋ ๊ฒ์.
- ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋จผ์ ์ ๋ชฉ + ๋ณธ๋ฌธ ํฉ์น ๋ค, ํต์งธ๋ก chunk_size=600, overlap=60์ผ๋ก ์ค์ ํ์.
- ์ด๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ฒญํฌ์๋ง ์ ๋ชฉ์ด ํฌํจ๋์ด์ ๋๋ฒ์งธ๋ถํฐ๋ ์ ๋ชฉ ์ ๋ณด๊ฐ ์ฌ๋ผ์ ธ ๊ฒ์ ๊ฒ์ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์.
- Blue print ์ ๊ฒฝ์ฐ MarkdownNodeParser ๋ฉ์๋๋ฅผ ์ฌ์ฉํด Markdown์ ํค๋ ๊ตฌ์กฐ(#, ##)๋ฅผ ์ธ์ํด์ ์๋ฆ.
- ๋ญ์ฒด์ธ์์๋ MarkdownHeaderTextSplitter
1. ๋จ์ ์๋ฅด๊ธฐ vs ๊ตฌ์กฐ์ ์๋ฅด๊ธฐ
#basic_markdown_splitter.py
#__init__ ํจ์
self.markdown_node_parser = MarkdownNodeParser()
#split ํจ์
#๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ์๋ฅด๋ ๊ฒ์ด ์๋๋ผ, ๋งํฌ๋ค์ด ๊ตฌ์กฐ๋ก ๋ณํํจ.
document_nodes = self.markdown_node_parser.get_nodes_from_documents([document])
#MarkdownNodeParser: LlamaIndex ๋ด์ฅํจ์
#๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ธ์ํด, ์๋์ผ๋ก ๋ฌธ๋จ์ ๊ตฌ๋ถํ๋ค.
2. ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํจ
- ์ด ๋ฐฉ์์ ์ฅ์ ์ ๋ํ ๋ด๋ถ์ ์ผ๋ก ํค๋ ๊ฒฝ๋ก(Header Path)๋ฅผ ์ ์ฅํด metadata ๋ก ์ ์ฅํ๋ค๋ ์ .
- ์ด๋ ๊ฒ ๋๋ฉด, LLM or ๋ฆฌ๋ญ์ปค๊ฐ ์ด ์กฐ๊ฐ์ ๋ณผ๋ "์ด๊ฑด ๊ฐ์๊ตฌ๋", "์ค๋ช ํํธ์ด๊ตฌ๋" ํ๊ณ ๋ฌธ๋งฅ ํ์ ๊ฐ๋ฅ
3. ๋ฌธ์ ๊ธธ์ด์ ๋ฐ๋ฅธ 2์ฐจ ๊ฐ๊ณต ์์
- ์ฆ, ํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ์๊ฒ ์ชผ๊ฐ๋๋ผ๋ model_copy()๋ฅผ ํตํด ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ๋ ์กฐ๊ฐ์๊ฒ ๊ทธ๋๋ก ๋ฌผ๋ ค์ค.
- ๋ํ ์ ๋ชฉ๋ง ์๊ณ ๋ด์ฉ์ด ๋๋ฌด ์งง์ ๊ฒฝ์ฐ๋ฑ์ ๋๋ฌด ์์ํ ์กฐ๊ฐ๋ค์ ํ ํฐ ํ๋ ๋ด์์ ์๋ค ์กฐ๊ฐ๊ณผ ํฉ์ณ์ ๋ฌธ๋งฅ์ ์ด์ด์ค.
#basic_markdown_splitter.py
# _split_big_node ํจ์ ๋ด๋ถ
if document_node_size > self.chunk_size_in_tokens:
# ๋ฌธ์ฅ ๋จ์(SentenceSplitter)๋ก ๋ค์ ์ชผ๊ฐ ๋ค.
sub_texts = self.sentence_splitter.split_text(text)
# ๊ทธ๋ฆฌ๊ณ ! ๋ถ๋ชจ ๋
ธ๋์ ๋ฉํ๋ฐ์ดํฐ(ํค๋ ์ ๋ณด)๋ฅผ ๋ณต์ฌํด์ ๋ฌผ๋ ค์ค๋ค!
sub_node = document_node.model_copy()
(2) ๋ชจ๋ํฐ๋ง (Observability)
- ํ์ฌ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋ฐฉ์: ์ผ์ผ์ด (f"[TIMER] 1์ฐจ ๊ฒ์ ์๊ฐ: {elapsed}s") ๋ฑ์ ์ฐ์ด์ ํ์ธํ๊ณ ์์.. ใ
- ์์ง ๊ธฐ๋ฅ๋ณ ํ ์คํธ ๋จ๊ณ๋ผ์ ๋ฌด๋ฆฌ ์์ง๋ง ์ ์ฒด ํ์ดํ ๋ผ์ธ์ ์ฐ๊ฒฐํ์ ๋ ์ฐ์์ ์ผ๋ก ์ถ์ ํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์.
- ์ค๊ฐ ๋จ๊ณ(์: 10๋จ๊ณ ์ค 5~7๋ฒ)์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ค๋ฉด, print๋ฌธ์ ์ถ๊ฐํ๊ณ ์ ์ฒด ์ฝ๋๋ฅผ ๋ค์ ์คํํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์.
- Blueprint ๋ฐฉ์ : Tracing(์ถ์ ) ๊ธฐ์ ์ฌ์ฉ.
- ์ฌ์ฉ์๊ฐ "์๋ ?" ์ด๋ผ๊ณ ๋งํ ์๊ฐ๋ถํฐ ๋ต๋ณ์ด ๋๊ฐ ๋๊น์ง์ ๋ชจ๋ ๊ณผ์ ์ด ํ๋์ ํ์๋ผ์ธ์ผ๋ก ๋ฌถ์ฌ์ Langfuse ์๋ฒ๋ก ์๋ ์ ์ก๋จ.
- ๊ฐ๋ฐ์๋ ์น ๋์๋ณด๋์์ ์๊ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์์.
- RAG์ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์์.
- ์ฆ, tracing ์ ์ฌ์ฉํ๋ฉด, ์ด๋ ๋จ๊ณ์์ ์ด๋ค ๋ณ๋ชฉ์ด ๋ฐ์ํ๋์ง, ์ด๋ ๋จ๊ณ์ ๋ฐ์ดํฐ๊ฐ ์ด์ํ๋์ง ํด๋ฆญ ํ๋ฒ์ผ๋ก ํ์ ํ ์ ์์ด์ ์ต์ ํ, ๋๋ฒ๊น ํจ์จ์ด ๊ทน๋ํ ๋จ.
- ๋ด ํ๋ก์ ํธ์ ์ ์ฉํ ๋ ํ์ํ ๊ฒ
- ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋ญ์ฒด์ธ + ํ์ด์ฌ ์์ ์ฝ๋๋ก ๊ตฌํ์ด ๋ ํ๋ก์ ํธ์.
- ๊ทธ๋์ CallbackHandler ๊ฐ์ด LlamaIndex/๋ญ์ฒด์ธ์ด ์ ๊ณตํ๋ ํด๋์ค ๋ง๊ณ
- langfuse ์ค์น ํ, @observe ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ tracing ์ํ๋ ํจ์ ๋ฐ๋ก ์์ค์ ์ ์ด์ฃผ๋ฉด ํจ์ ์คํ ๊ณผ์ ์ด Langfuse ์ ๊ธฐ๋ก๋จ.


(3) ํ๊ฐ(Evaluation)
1. Ragas ํ๊ฐ
- Langfuse ์ ์์ธ ์ค์ ์ฌ์ฉ์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ฐ ๋ฐ์ดํฐ์ ์ ๊ตฌ์ถํ๊ณ ์ด๋ฅผ Ragas ๊ฐ ์ฑ์ ํจ.
- Langfuse๋ ๋จ์ํ ๋ก๊น ํด์ด ์๋๋ผ, ๋ฐ์ดํฐ์ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ๋ ์์.
- ์ค์ ์ ์ ์ง๋ฌธ๋ค์ ๊ฐ์ง๊ณ ํ๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ง๋ค์ด์ค.
2. ์ฌ์ฉ์ ํผ๋๋ฐฑ ๊ธฐ๋ฐ ํ๊ฐ
- ์ฌ์ฉ์ ํผ๋๋ฐฑ(๐/๐)์ ์์งํ๋ ์ธํฐํ์ด์ค ์ญํ
- ์ด ํผ๋๋ฐฑ์ Langfuse์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ๋ค์ ํ๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ฉ
- ์ฌ์ฉ์์๊ฒ ์ง์ ๋ฐ๋ ํผ๋๋ฐฑ ๋ฃจํ๊ฐ ๊ตฌ์ถ๋์ด์ผ ์ฑ๋ด์ด ์ค์ ์์ ๊ณ์ ๋๋ํด์ง ์ ์์.
- Chainlit : ๊ฐ๋ฐ์์ ๊ธฐ์ ์ด ๋ํํ ์ธ๊ณต์ง๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌ์ถ, ํ๊ฐ ๋ฐ ๊ฐ์ ํ ์ ์๋๋ก ์ค๊ณ๋ ํ์ด์ฌ ๊ธฐ๋ฐ์ ์คํ์์ค ํ๋ ์์ํฌ์ด์ ํ๋ซํผ.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ๋ถ์์ ํตํด RAG ์์คํ ์ ๋จ์ํ ๋ชจ๋ธ ์ฑ๋ฅ(๊ฒ์ ์๋, ๋ฆฌ๋ญํน ์ ์)๋ง ๋์ธ๋ค๊ณ ๋๋๋๊ฒ ์๋๋ผ๋ ๊ฑธ ๊นจ๋ฌ์๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ๋ฌผ๋ก ์ด๊ณ ๋ชจ๋ํฐ๋ง, ๊ทธ๋ฆฌ๊ณ ํผ๋๋ฐฑ ๋ฃจํ๊น์ง ์ด์ด์ง๋ ์ ์ฒด ํ์ดํ๋ผ์ธ์ ๊ด๋ฆฌ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ์์ฉํ์ ํต์ฌ์ด๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ์๋ Langfuse ์ ๊ตฌ์กฐ์ ์ธ ์ฒญํน์ ๋์ ํด ํ ๋จ๊ณ ๋ ๋ฐ์ ์์ผ์ผ๊ฒ ๋ค.