4. RAG์ ๋ชจ๋ ๊ฒ (Retrieval-Augmented Generation)
๐ฏ ์ด ์ฑํฐ์์ ๋ฐฐ์ธ ๊ฒ
- RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ)์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ ์ฒด ํ๋ฆ(Load, Split, Embed, Store, Retrieve) ์ดํดํ๊ธฐ
UnstructuredFileLoader
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ์์ ๋ฌธ์๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒCharacterTextSplitter
์Tiktoken
์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์๋ฏธ ์๋ ์กฐ๊ฐ(chunk)์ผ๋ก ๋ถํ ํ๋ ๋ฐฉ๋ฒOpenAIEmbeddings
์VectorStore
(FAISS/Chroma)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ์กฐ๊ฐ์ ๋ฒกํฐ๋ก ๋ณํํ๊ณ ์ ์ฅํ๋ ๋ฐฉ๋ฒRetrievalQA
์ฒด์ธ์ ์ฌ์ฉํ์ฌ RAG ํ์ดํ๋ผ์ธ์ ๊ฐ๋จํ๊ฒ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ- LCEL์ ์ฌ์ฉํ์ฌ
Stuff
๋ฐMap-Reduce
์ ๊ฐ์ RAG ์ฒด์ธ์ ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
Load & Split (feat. Tiktoken)
๐ฏ ์ด๋ฒ ๋จ๊ณ์์ ๋ฐฐ์ธ ๊ฒ
- RAG์ ์ฒซ ๋ ๋จ๊ณ์ธ **Load(๋ก๋)**์ **Split(๋ถํ )**์ ๊ฐ๋ ์ ์ดํดํฉ๋๋ค.
UnstructuredFileLoader
๋ฅผ ์ฌ์ฉํ์ฌ.docx
,.txt
๋ฑ ๋ค์ํ ํ์ผ์ ๋ก๋ํฉ๋๋ค.CharacterTextSplitter
๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋๋ ๋ฌธ์๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํฉ๋๋ค.from_tiktoken_encoder
๋ฅผ ์ฌ์ฉํ์ฌ OpenAI ๋ชจ๋ธ์ ํ ํฐ ๊ณ์ฐ ๋ฐฉ์์ ๋ง์ถฐ ๋ ์ ํํ๊ฒ ๋ถํ ํฉ๋๋ค.
๐ 1๋จ๊ณ: ๋ฌธ์ ๋ก๋ ๋ฐ ๋ถํ
์ ์ฒด ์ฝ๋ (notebook.ipynb):
1 | from langchain.document_loaders import UnstructuredFileLoader |
๐ ์ฝ๋ ์์ธ ์ค๋ช
1. RAG์ ์ฒซ๊ฑธ์: Load & Split
LLM์ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ํ
์คํธ์ ์(์ปจํ
์คํธ ์๋์ฐ)์ ์ ํ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธด ๋ฌธ์๋ฅผ LLM์๊ฒ ์ ๊ณตํ๋ ค๋ฉด, ๋จผ์ ๋ฌธ์๋ฅผ ๋ถ๋ฌ์(Load) ์๊ฒ ์ชผ๊ฐ๋(Split) ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
UnstructuredFileLoader
: ํ ์คํธ, PDF, ์๋ ๋ฌธ์ ๋ฑ ๋ค์ํ ํ์์ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋ก๋์ ๋๋ค.CharacterTextSplitter
: ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์คํ๋ฆฌํฐ๋ก, ์ง์ ๋ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ๋ถํ ํฉ๋๋ค.from_tiktoken_encoder
: ๋จ์ํ ๊ธ์ ์๊ฐ ์๋, OpenAI์Tiktoken
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ ์๋ฅผ ๊ธฐ์ค์ผ๋กchunk_size
๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ ๋ชจ๋ธ์ ์ปจํ ์คํธ ์๋์ฐ๋ฅผ ๋ ์ ํํ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.chunk_overlap
: ๋ถํ ๋ ์กฐ๊ฐ๋ค์ด ์๋ก ์ฝ๊ฐ์ ๋ด์ฉ์ ๊ฒน์น๊ฒ ๋ง๋ค์ด, ๋ฌธ๋งฅ์ด ์๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์๋ฏธ๊ฐ ์ ์ ์ง๋๋๋ก ๋์ต๋๋ค.
โ ์ฒดํฌ๋ฆฌ์คํธ
-
UnstructuredFileLoader
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ก๋ํ๋์? -
CharacterTextSplitter.from_tiktoken_encoder
๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋ฆฌํฐ๋ฅผ ์ ์ํ๋์? -
load_and_split
๋ฉ์๋๋ก ๋ฌธ์ ๋ก๋์ ๋ถํ ์ ํ ๋ฒ์ ์คํํ๋์?
Embed & Store (Vector Stores)
๐ฏ ์ด๋ฒ ๋จ๊ณ์์ ๋ฐฐ์ธ ๊ฒ
- RAG์ ์ธ ๋ฒ์งธ์ ๋ค ๋ฒ์งธ ๋จ๊ณ์ธ **Embed(์๋ฒ ๋ฉ)**์ **Store(์ ์ฅ)**์ ๊ฐ๋ ์ ์ดํดํฉ๋๋ค.
OpenAIEmbeddings
๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ์กฐ๊ฐ์ ๋ฒกํฐ(์ซ์์ ๋ฐฐ์ด)๋ก ๋ณํํฉ๋๋ค.FAISS
๋๋Chroma
์ ๊ฐ์ ๋ฒกํฐ ์คํ ์ด์ ์๋ฒ ๋ฉ๋ ๋ฒกํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.CacheBackedEmbeddings
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ๋ฉ ๊ณผ์ ์ ์บ์ฑํ๊ณ ๋น์ฉ์ ์ ์ฝํฉ๋๋ค.
๐ 1๋จ๊ณ: ํ ์คํธ๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ธฐ
์ ์ฒด ์ฝ๋ (notebook.ipynb):
1 | from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings |
๐ ์ฝ๋ ์์ธ ์ค๋ช
1. ์๋ฒ ๋ฉ (Embedding)
์๋ฒ ๋ฉ์ ํ
์คํธ๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์ซ์์ ๋ฐฐ์ด, ์ฆ ๋ฒกํฐ(vector)๋ก ๋ณํํ๋ ๊ณผ์ ์
๋๋ค. ์ด ๋ฒกํฐ๋ ํ
์คํธ์ ์๋ฏธ๋ฅผ ๋ค์ฐจ์ ๊ณต๊ฐ์ ํ ์ ์ผ๋ก ํํํฉ๋๋ค. ์๋ฏธ๊ฐ ๋น์ทํ ํ
์คํธ๋ค์ ๊ณต๊ฐ์์์ ๊ฐ๊น์ด ์์น์ ์๊ฒ ๋ฉ๋๋ค.
OpenAIEmbeddings
: OpenAI์ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
2. ๋ฒกํฐ ์คํ ์ด (Vector Store)
๋ฒกํฐ ์คํ ์ด๋ ์์ฑ๋ ๋ฒกํฐ๋ค์ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ , ํน์ ๋ฒกํฐ์ ์๋ฏธ์ ์ผ๋ก ๊ฐ์ฅ ์ ์ฌํ ๋ค๋ฅธ ๋ฒกํฐ๋ค์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
๋๋ค.
FAISS
/Chroma
: ๋ํ์ ์ธ ์คํ์์ค ๋ฒกํฐ ์คํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.from_documents
: ๋ฌธ์ ์กฐ๊ฐ(docs
)๊ณผ ์๋ฒ ๋ฉ ๋ชจ๋ธ(cached_embeddings
)์ ๋ฐ์, ๋ด๋ถ์ ์ผ๋ก ๊ฐ ์กฐ๊ฐ์ ๋ฒกํฐ๋ก ๋ณํํ ํ ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅํฉ๋๋ค.similarity_search
: ์ฃผ์ด์ง ์ง๋ฌธ์ ๋ฒกํฐ๋ก ๋ณํํ ๋ค, ๋ฒกํฐ ์คํ ์ด์์ ๊ฐ์ฅ ๊ฐ๊น์ด(์ ์ฌํ) ๋ฒกํฐ๋ค์ ๊ฐ์ง ๋ฌธ์ ์กฐ๊ฐ๋ค์ ์ฐพ์ ๋ฐํํฉ๋๋ค.
3. CacheBackedEmbeddings
์๋ฒ ๋ฉ์ ๋น์ฉ์ด ๋ฐ์ํ๋ API ํธ์ถ์ผ ์ ์์ต๋๋ค. CacheBackedEmbeddings
๋ ํ ๋ฒ ์๋ฒ ๋ฉ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ ์์คํ
(LocalFileStore
)์ ์ ์ฅํ์ฌ, ๋์ผํ ํ
์คํธ์ ๋ํ ์๋ฒ ๋ฉ ์์ฒญ์ด ๋ค์ ๋ค์ด์ฌ ๊ฒฝ์ฐ API๋ฅผ ํธ์ถํ๋ ๋์ ์บ์์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ ๋น์ฉ๊ณผ ์๊ฐ์ ์ ์ฝํฉ๋๋ค.
โ ์ฒดํฌ๋ฆฌ์คํธ
-
OpenAIEmbeddings
๋ชจ๋ธ์ ์ด๊ธฐํํ๋์? -
CacheBackedEmbeddings
๋ฅผ ์ค์ ํ์ฌ ๋น์ฉ์ ์ ์ฝํ๋์? -
FAISS.from_documents
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒกํฐ ์คํ ์ด๋ฅผ ์์ฑํ๋์? -
similarity_search
๋ก ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์กฐ๊ฐ์ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ํ๋์?
RetrievalQA Chain
๐ฏ ์ด๋ฒ ๋จ๊ณ์์ ๋ฐฐ์ธ ๊ฒ
- RAG์ ๋ง์ง๋ง ๋จ๊ณ์ธ **Retrieve(๊ฒ์)**์ **Generate(์์ฑ)**๋ฅผ ํ๋๋ก ๋ฌถ๋ ๋ฐฉ๋ฒ
RetrievalQA
์ฒด์ธ์ ์ฌ์ฉํ์ฌ RAG ํ์ดํ๋ผ์ธ์ ์ฝ๊ฒ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ
๐ 1๋จ๊ณ: RAG ์ฒด์ธ์ผ๋ก ์ง๋ฌธ-๋ต๋ณํ๊ธฐ
์ ์ฒด ์ฝ๋ (notebook.ipynb):
1 | from langchain.chains import RetrievalQA |
๐ ์ฝ๋ ์์ธ ์ค๋ช
1. RetrievalQA
RetrievalQA
๋ RAG์ ์ ์ฒด ๊ณผ์ ์ ์ถ์ํํ์ฌ ์ ๊ณตํ๋ ํธ๋ฆฌํ ์ฒด์ธ์
๋๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํฉ๋๋ค.
- ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ฐ์ต๋๋ค.
retriever
๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์กฐ๊ฐ๋ค์ ๋ฒกํฐ ์คํ ์ด์์ ๊ฒ์ํฉ๋๋ค.- ๊ฒ์๋ ๋ฌธ์ ์กฐ๊ฐ๋ค์ ์ง๋ฌธ๊ณผ ํจ๊ป ํ๋กฌํํธ์ ๋ฃ์ด LLM์๊ฒ ์ ๋ฌํฉ๋๋ค.
- LLM์ ์ฃผ์ด์ง ๋ฌธ์ ์กฐ๊ฐ(context)์ ๊ธฐ๋ฐ์ผ๋ก ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
retriever
:vectorstore.as_retriever()
๋ฅผ ํตํด ๋ฒกํฐ ์คํ ์ด๋ฅผ ๊ฒ์๊ธฐ ์ธํฐํ์ด์ค๋ก ๋ณํํฉ๋๋ค.chain_type
: ๊ฒ์๋ ๋ฌธ์๋ค์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค. (์์ธํ ๋ด์ฉ์ ๋ค์ ์น์ ์์ ๋ค๋ฃน๋๋ค.)
โ ์ฒดํฌ๋ฆฌ์คํธ
-
vectorstore.as_retriever()
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์๊ธฐ๋ฅผ ๋ง๋ค์๋์? -
RetrievalQA.from_chain_type
์ ์ฌ์ฉํ์ฌ ์ฒด์ธ์ ์์ฑํ๋์? -
chain.run
์ผ๋ก ์ง๋ฌธ์ ํ๊ณ , ๋ฌธ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ต๋ณ์ ๋ฐ์๋์?
LCEL ๊ธฐ๋ฐ RAG ์ฒด์ธ (Stuff & Map-Reduce)
๐ฏ ์ด๋ฒ ๋จ๊ณ์์ ๋ฐฐ์ธ ๊ฒ
- LCEL์ ์ฌ์ฉํ์ฌ RAG ํ์ดํ๋ผ์ธ์ ์ง์ ์ ์ดํ๊ณ ์ปค์คํฐ๋ง์ด์งํ๋ ๋ฐฉ๋ฒ
- Stuff: ๊ฐ์ฅ ๊ฐ๋จํ RAG ์ฒด์ธ์ผ๋ก, ๊ฒ์๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ํ๋์ ํ๋กฌํํธ์ ๋ฃ๋ ๋ฐฉ์
- Map-Reduce: ๋ฌธ์๊ฐ ๋๋ฌด ๋ง์ ํ๋์ ์ปจํ ์คํธ์ ๋ค ๋ค์ด๊ฐ์ง ์์ ๋ ์ฌ์ฉํ๋ ๊ณ ๊ธ ๊ธฐ๋ฒ
๐ 1๋จ๊ณ: Stuff ์ฒด์ธ ์ง์ ๋ง๋ค๊ธฐ
์ ์ฒด ์ฝ๋ (notebook.ipynb):
1 | from langchain.schema.runnable import RunnablePassthrough |
๐ ์ฝ๋ ์์ธ ์ค๋ช
1. Stuff Chain
retriever
๊ฐ ๊ฒ์ํ ๋ชจ๋ ๋ฌธ์ ์กฐ๊ฐ์{context}
ํ๋ ์ด์คํ๋์ โ์ฑ์ฌ๋ฃ๋(stuff)โ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ์์ ๋๋ค.- ๊ฐ๋จํ๊ณ ์ฑ๋ฅ์ด ์ข์ง๋ง, ๊ฒ์๋ ๋ฌธ์์ ์ด๋์ด ๋ชจ๋ธ์ ์ปจํ ์คํธ ์๋์ฐ๋ฅผ ์ด๊ณผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
2. Map-Reduce Chain
- Map ๋จ๊ณ: ๊ฒ์๋ ๊ฐ ๋ฌธ์ ์กฐ๊ฐ์ ๋ํด ๋
๋ฆฝ์ ์ผ๋ก ์ง๋ฌธ์ ๋์ ธ ์ค๊ฐ ์์ฝ/๋ต๋ณ์ ์์ฑํฉ๋๋ค. (
map_doc_chain
) - Reduce ๋จ๊ณ: ์์ฑ๋ ๋ชจ๋ ์ค๊ฐ ๋ต๋ณ๋ค์ ๋ชจ์, ์ต์ข
์ ์ผ๋ก ํ๋์ ์ข
ํฉ์ ์ธ ๋ต๋ณ์ ์์ฑํฉ๋๋ค. (
final_prompt
|llm
) - ๋ฌธ์์ ์์ด ๋งค์ฐ ๋ง์ ๋ ์ ์ฉํ์ง๋ง, ์ฌ๋ฌ ๋ฒ์ LLM ํธ์ถ๋ก ์ธํด ๋น์ฉ์ด ๋ ๋ง์ด ๋ค๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
LCEL๋ก ๊ตฌํํ Map-Reduce Chain:
1 | # 1. Map ๋จ๊ณ: ๊ฐ ๋ฌธ์๋ฅผ ์์ฝํ๋ ์ฒด์ธ |
โ ์ฒดํฌ๋ฆฌ์คํธ
- LCEL์ ์ฌ์ฉํ์ฌ
retriever
์prompt
,llm
์ ์ฐ๊ฒฐํStuff
์ฒด์ธ์ ๋ง๋ค์ด ๋ณด์๋์? -
Map-Reduce
์ ๊ฐ๋ ์ ์ดํดํ๊ณ , ์Stuff
์ฒด์ธ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ ํ๋์?
์ถ์ฒ : https://nomadcoders.co/fullstack-gpt