RAG(Retrieval-Augmented Generation)๋ ๋ํ ์ธ์ด ๋ชจ๋ธ(LLM)์ด ๊ฐ์ง ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ํต์ฌ ๊ธฐ์ ๋ก,
์ ๋ณด ๊ฒ์ + ์์ฑ ๋ชจ๋ธ ๊ธฐ๋ฐ์ ์์ฐ์ด ์ฒ๋ฆฌ(NLP) ๊ธฐ์
RAG๋ ๊ธฐ์ (๊ฐ๋ )์ ์๋ฏธํ๊ณ , Langchain์ RAG๋ฅผ ๊ตฌํํ ์ ์๋ AI ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์๋ฏธ
๋ํ ์ธ์ด ๋ชจ๋ธ์ ๋งค์ฐ ๋ฐ์ด๋ ์์ฐ์ด ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์ง๋ง,
์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์:
- ๋ต์ด ์์ ๋ ํ์ ์ ๋ณด๋ฅผ ์์ฑํจ
- ์ต์ ์ ๋ณด ๋ฐ์ ๋ถ๊ฐ (ํ๋ จ ์์ ์ดํ์ ๋ฐ์ดํฐ ๋ฏธํฌํจ)
- ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ ๊ธฐ๋ฐ์ ์๋ต ๊ฐ๋ฅ์ฑ
- ๋์ผ ์ฉ์ด์ ์ค์์ ์ฌ์ฉ์ผ๋ก ์ธํ ๊ฐ๋ ํผ๋
๋ฐ๋ผ์, RAG๋
๋๋ตํ๊ธฐ ์ ์ ์๋ก์ด ์ต์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ํ์ด๋ณธ ๋ค์์ ๋ตํ๋ผ๊ณ ์ง์ํ๋ ๊ฒ
๊ฒ์๊ธฐ(Search)๊ณผ ์์ฑ๊ธฐ(Generation)๋ฅผ ๊ฒฐํฉํ ์ํคํ
์ฒ ์ฌ์ฉ
๊ตฌ๋ถ BM25 DPR ๋ฐฉ์ ํต๊ณ ๊ธฐ๋ฐ (๋จ์ด ์ผ์น) ๋ฅ๋ฌ๋ ๊ธฐ๋ฐ (์๋ฏธ ์ ์ฌ๋) ์ ๋ ฅ ๋จ์ ๋จ์ด (bag-of-words) ๋ฌธ์ฅ/๋ฌธ์ ์๋ฒ ๋ฉ (vector) ์ฅ์ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์, ํด์ ์ฉ์ด ์๋ฏธ ๊ธฐ๋ฐ ๊ฒ์, ์ ์ฐํ ๋งค์นญ ๋จ์ ๋์์ด/๋ฌธ๋งฅ ์ดํด ๋ถ๊ฐ ๋ชจ๋ธ ํ์ต ํ์, ๊ณ์ฐ๋ ํผ ํ์ฉ ์ ๋ด์คยทํค์๋ ๊ฒ์, ๊ณ ์ IR ์์คํ RAG, QA ์ฑ๋ด, ์๋งจํฑ ๊ฒ์

1. ๋น์ฉ ํจ์จ์ฑ
2. ์ต์ ์ฑ
3. ์ ๋ขฐ์ฑ
# โ
0. ํจํค์ง ์ค์น
# pip install langchain openai faiss-cpu tiktoken
# โ
1. ๋ฌธ์ โ ์ฒญํฌ ๋ถ๋ฆฌ
from langchain.text_splitter import RecursiveCharacterTextSplitter
docs = [
"์ฌ๋ด ํด๊ฐ ๊ท์ : ์ฐ์ฐจ๋ ์
์ฌ ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ํจ.",
"๊ฒฝ์กฐ์ฌ ํด๊ฐ ๊ท์ : ๊ฒฐํผ ์ 5์ผ, ๋ถ๋ชจ์ 7์ผ, ์๋
์ถ์ฐ 3์ผ."
]
splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
chunks = splitter.create_documents(docs)
print(f"โ
์์ฑ๋ ์ฒญํฌ ์: {len(chunks)}")
print(chunks[0].page_content)
# โ
2. ์๋ฒ ๋ฉ & ๋ฒกํฐDB ๊ตฌ์ถ (FAISS)
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
vdb = FAISS.from_documents(chunks, embeddings)
# โ
3. ๋ฆฌํธ๋ฆฌ๋ฒ & ์์ฑ ์ฒด์ธ ๊ตฌ์ฑ
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vdb.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# โ
4. ์ง์ ์ํ
query = "๊ฒฐํผํ๋ฉด ๋ฉฐ์น ํด๊ฐ์?"
res = qa_chain({"query": query})
print("๐งพ ์ง๋ฌธ:", query)
print("๐ฌ ๋ต๋ณ:", res["result"])
print("๐ ๊ทผ๊ฑฐ ๋ฌธ์:")
for doc in res["source_documents"]:
print("-", doc.page_content)
์ค์ ์๋น์ค์์๋ PDF/์น/DB ๋ก๋, ๊ถํ ํํฐ, ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๋ฑ์ ๋ง๋ถ์ด๋ฉด ๋จ