๐ฆ๐ RAG๋?
์ด๋ฏธ์ง ์ถ์ฒ: https://www.ml6.eu/blogpost/leveraging-llms-on-your-domain-specific-knowledge-base
RAG(Retriever Augmented Generation)๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ LLM์ ์ง์์ ๊ฐํํ๋ ๊ธฐ์ ์ด๋ค.
RAG๋ ๊ธฐ์กด์ ํ์ต๋ LLM์ด ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ต๋ณ์ ํ๋ ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ๋ณด๊ฐํ๋ค๋ ์ ์ด ํน์ง์ด๋ค.
๋ฐ๋ผ์ ์ต์ ๋ฐ์ดํฐ๋ ํน์ ๋๋ฉ์ธ์ ์ธ๋ถ์ ์ธ ์ง์์ ๋ณด๊ฐํ ์ ์์ด ๋ค์ํ ๋ถ์ผ์ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ํ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ์ ์์ฑํ๊ธฐ์ ๊ธฐ์กด์ LLM์ ๋ฌธ์ ์ ์ผ๋ก ์ง์ ๋๋ ํ ๋ฃจ์๋ค์ด์
ํ์์ ์ค์ผ ์ ์๋ค๋ ์ ์ด ์ฅ์ ์ด๋ค.
RAG ์ดํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ฒ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์๋ค.
- Indexing
- ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ธ๋ฑ์ฑํ๊ธฐ ์ํ Pipeline - Retrieval and Generation
- ์ค์ RAG ์ฒด์ธ์ผ๋ก ๋ฐํ์ ์ ์ฌ์ฉ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ํ ๋ชจ๋ธ์ ์ ๋ฌ
๐ RAG Concept
๐ Indexing
์ด๋ฏธ์ง ์ถ์ฒ: https://pub.towardsai.net/langchain-101-part-3a-talking-to-documents-load-split-and-simple-rag-with-lcel-26b005ccb30a
- Load
- Document Loader๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ค. - Split
- ๋ฐ์ดํฐ๋ฅผ ์์ํ๊ฒ Indexingํ๊ณ ๋ชจ๋ธ์ ์ ๋ฌํ๊ธฐ ์ํด Text Splitter๋ฅผ ํตํด Documents๋ฅผ ์์ ์ฒญํฌ ๋จ์๋ก ๋ถํ ํ๋ค. - Store
- ๊ฒ์์ ์ํด VectorStore์ Embedding Model์ ์ด์ฉํด ๋ถํ ํ ๋ฐ์ดํฐ(Split)๋ฅผ ์ ์ฅํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ: https://python.langchain.com/v0.2/docs/tutorials/rag/
๐ Retrieval and Generation
- Retrieve
- ์ฌ์ฉ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด Retriever๋ฅผ ํตํด Storage๋ก๋ถํฐ ๊ด๋ จ split๋ค์ด ๊ฒ์๋๋ค.
- Generate
- LLM์ ์ง๋ฌธ๊ณผ ๊ฒ์๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ต๋ณ์ ์์ฑํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ: https://python.langchain.com/v0.2/docs/tutorials/rag/
๐RAG Pipeline
์ด๋ฏธ์ง ์ถ์ฒ: https://pub.towardsai.net/langchain-101-part-3a-talking-to-documents-load-split-and-simple-rag-with-lcel-26b005ccb30a
Import Modules
!pip install langchainhub
!pip install sentence-transformers
!pip install langchain langchain_community langchain_chroma
import bs4
from langchain import hub
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader, TextLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_google_genai import ChatGoogleGenerativeAI
set env
from dotenv import load_dotenv
# load settings
load_dotenv()
Load LLM
๊ตฌ๊ธ์ gemini-pro ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค. ์ด ์ธ์๋ ChatGPT, Ollama์ ๊ฐ์ ๋ค์ํ LLM์ ์ฌ์ฉํ ์ ์๋ค.
llm = ChatGoogleGenerativeAI(model="gemini-pro")
Load Document
์ด๋ฏธ์ง ์ถ์ฒ: https://pub.towardsai.net/langchain-101-part-3a-talking-to-documents-load-split-and-simple-rag-with-lcel-26b005ccb30a
Document๋ PDF, Text, Web ๋ฑ ๋ค์ํ ์์ค๋ก๋ถํฐ ๋ก๋ํ ์ ์๋ค.
์ค์ต์ ์ํด ์ต๊ทผ ๋ค์ด๋ฒ ๋ด์ค์ ํ ๊ธฐ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์งํ์๋ค.
loader = WebBaseLoader(
web_paths=("https://n.news.naver.com/mnews/article/018/0005806756?sid=101/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("media_end_head_headline", "newsct_body", "media_end_summary")
)
),
)
docs = loader.load()
print(docs[0].page_content[:500])
>>>ํ์ "็พ ๊ฒฝ๊ธฐ์นจ์ฒด ์๋จ ์ด๋ ค์โฆํ๋ฐ๊ธฐ๋ ๊ฒฝ์์์ง ํ์๊ธฐ์กฐ"[์ผ๋ฌธ์ผ๋ต]
6์ ๊ตญ์ ์์ง ์ ์ ์ค๋ช
ํ"๊ธ๋ก๋ฒ ๊ฒฝ๊ธฐ ํธ์กฐ ๋ฐ๋ฅธ ์์ถ ์ฆ๊ฐ์ธ ๊ณ์, ํฌ์๋ ์ํธ""7์ ํ์ ๊ท๋ชจ ์ค๊ณ์ผ๋, ๋น๋ถ๊ฐ ํ์ ๊ธฐ์กฐ ์ด์ด์ง ๊ฒ"[์ด๋ฐ์ผ๋ฆฌ ํ์๋ ฌ ๊ธฐ์] ํ๊ตญ์ํ์ ํ๋ฐ๊ธฐ์๋ ๊ฒฝ์์์ง ํ์๊ธฐ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ์ ๋งํ๋ค. ๋ฏธ๊ตญ๋ฐ(็ผ) ๊ฒฝ๊ธฐ์นจ์ฒด ์ฐ๋ ค์๋ ๋ฐ๋์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ํ ์ ๋ณด๊ธฐ์ (IT) ์์ถ ํธ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ์์๋๋ค. ๋ค๋ง ํ์์ ํ๋ฐ๊ธฐ์๋ ์์
์ด ๋์ด๋๋ฉฐ ๊ฒฝ์์์ง ํ์๋ฅผ ์ด๋ ์ํ์์ง์ ํ์ ๊ท๋ชจ๊ฐ ์ค์ด๋ค ๊ฒ์ผ๋ก ๋ด๋ค๋ดค๋ค.
์ก์ฌ์ฐฝ ๊ธ์ตํต๊ณ๋ถ์ฅ์ด 7์ผ ์ค์ ์์ธ ์ค๊ตฌ ํ๊ตญ์ํ์์ โ2024๋
6์ ๊ตญ์ ์์ง(์ ์ )โ์ ์ฃผ์ ํน์ง์ ์ค๋ช
ํ๊ณ ์๋ค.(์ฌ์ง=ํ๊ตญ์ํ)์ก์ฌ์ฐฝ ํ์ ๊ฒฝ์ ํต๊ณ๊ตญ ๊ธ์ตํต๊ณ๋ถ์ฅ์ 7์ผ โ6์ ๊ตญ์ ์์ง(์ ์ )โ ์ค๋ช
ํ์์ โ๊ธ๋ก๋ฒ ๊ฒฝ๊ธฐ ํธ์กฐ์ ๋ฐ๋ฅธ ์์ถ ์ฆ๊ฐ์ธ๊ฐ ๊ณ์๋๊ณ ํฌ์ ์๋์ด ์ํธํด ๋น๋ถ๊ฐ (๊ฒฝ์์์ง) ํ์ ๊ธฐ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ๋ณด์ธ๋คโ๊ณ ๋ฐํ๋ค.๋ค๋ง ์ก ๋ถ์ฅ์ โณ๋ฏธ
๋ก๋๋ ๋ฌธ์์ ๊ธธ์ด๋ ์ด 6342์์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
# ๋ก๋๋ ๋ฌธ์์ ๊ธธ์ด
len(docs[0].page_content)
>>> 6342
Document Split
์ด๋ฏธ์ง ์ถ์ฒ: https://pub.towardsai.net/langchain-101-part-3a-talking-to-documents-load-split-and-simple-rag-with-lcel-26b005ccb30a
๋ก๋๋ ๋ฌธ์์ ๊ธธ์ด๋ ์ด 6342์์ด๋ค. ๋ฌธ์์ ๊ธธ์ด๊ฐ ๋๋ฌด ๊ธธ๋ฉด LLM์ด ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์๋ฅผ Chunk ๋จ์๋ก ๋ถํ ํด์ผํ๋ค.
Chunk ๋จ์๋ก ๋ถํ ๋ ๋ฌธ์๋ LLM์ด ๊ด๋ จ์ฑ์ด ๊ฐ์ฅ ๋์ ๋ถ๋ถ๋ง ๊ฒ์ํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ค.
# 1000์์ ์ฒญํฌ๋ก ๋ถํ ํ๊ณ ์ฒญํฌ ์ฌ์ด์ 200์๊ฐ ๊ฒน์น๋๋ก ๋ถํ
# ์ฒญํฌ๊ฐ ๊ฒน์น๋๋ก ์ธํ
ํ๋ฉด ์ค์ํ ๊ตฌ๋ฌธ์ ๋ถ๋ฆฌํ๋ ์ํฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ค.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
splits = text_splitter.split_documents(docs)
all_splits = text_splitter.split_documents(docs)
print(f"๋ถ๋ฆฌ๋ ๋ฌธ์์ ๊ฐฏ์ : {len(all_splits)}")
print(f"1๋ฒ์งธ ๋ฌธ์์ ๊ธธ์ด : {len(all_splits[0].page_content)}")
print(all_splits[0].metadata)
>>>๋ถ๋ฆฌ๋ ๋ฌธ์์ ๊ฐฏ์ : 10
1๋ฒ์งธ ๋ฌธ์์ ๊ธธ์ด : 290
{'source': 'https://n.news.naver.com/mnews/article/018/0005806756?sid=101/'}
Vector Store
๋ถ๋ฆฌ๋ ์ด 10๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํ์์์ ๊ฒ์ํ ์ ์๋๋ก Indexingํ๋ ์์
์ด ํ์ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก Vector Database(Vector Store)์ ๊ฐ ๋ถํ ๋ ๋ฌธ์์ ์๋ฒ ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์
ํ๋ค.
LangChain ๊ณต์ ๋ฌธ์์์ Vector Database๋ ์คํ์์ค์ธ Chroma DB๋ฅผ ์๊ฐํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ: https://docs.trychroma.com/
# ํ
์คํธ๋ฅผ ์ํด vectorstore๋ฅผ ์ด๊ธฐํ ํ๋ ๋ก์ง
for collection in vectorstore._client.list_collections():
ids = collection.get()['ids']
print('REMOVE %s document(s) from %s collection' % (str(len(ids)), collection.name))
if len(ids): collection.delete(ids)
# Vector Store ์์ฑ
vectorstore = Chroma.from_documents(documents=splits, embedding=HuggingFaceEmbeddings())
Retrieve
๋ฌธ์์ด ์ฟผ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ฉด ์ ์ฌ๋๊ฐ ๋์ Document๋ฅผ ๋ฐํํ ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ํํ๋ Retriever ์ธํฐํ์ด์ค๋ฅผ ์ ์ํด์ผํ๋ค.
retriever = vectorstore.as_retriever()
relevant_docs = retriever.get_relevant_documents("ํ์์ ๋ฏธ๊ตญ๋ฐ ๊ฒฝ๊ธฐ์นจ์ฒด ์ฐ๋ ค์ ๋ํ ์
์ฅ์ด ์ด๋")
>>>๋ฌธ์์ ๊ฐ์: 4
[๊ฒ์ ๊ฒฐ๊ณผ]
์ ์กฐ์
์ฒด๊ฐ ์ค๋นํฌ์๋ฅผ ์ฌ๊ฐํ๊ณ ์์์ฌ ๊ฐ๊ฒฉ์ด ์์ ๋๋ค๊ณ ํ์ง๋ง ๊ฐ๊ฒฉ์ด ์์ ํ๋ ์ํฅ์ ๊ธฐ์ ํจ๊ณผ๋ก ์์ฉํ ์ ์๋ค. ์์
๊ฐ์์ธ๋ ํ๋ฐ๊ธฐ์๋ ์ํ๋์ง ์์๊น ์์๋๋ค. ์ค์ ๋ก 7์ ํต๊ด ๊ธฐ์ค ๋ฌด์ญ์์ง๋ฅผ ๋ณด๋ฉด 6์์๋ ์ํ์์
์ด 7.5% ๊ฐ์ํ๋ค๊ฐ 7์์ 10.5% ์ฆ๊ฐํ๋ค. ๊ทธ๋ฐ ์ํฅ์ ๊ณ ๋ คํ ๋ ๊ทธ๊ฐ ์์
๊ฐ์์ธ๋ ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.-๊ทธ๊ฐ ์์ ๋ก ์ธํ ์ผ๋ณธ ์ฌํ ๋๋ฌธ์ ์ฌํ์์ง๊ฐ ์ํฅ์ ํฌ๊ฒ ๋ฐ์๋ค๊ณ ์ค๋ช
ํ๋ค .์ต๊ทผ ์ํ๊ฐ ๋ฐ๋ฑ์ด ์์๋ค. ์ด์ ๋ฐ๋ผ ์ฌํ์์ง๋ฅผ ์ด๋ป๊ฒ ์์ํ๋๊ฐ.โณ(์ก ๋ถ์ฅ) ์ง๊ธ๊น์ง ์์ ์ํฅ์ด ์์๋ค. โ์ํผ ์์ โ ์ฐ๋ ค๋ ์์๋ค. ์ต๊ทผ ์ผ๋ณธ์ํ์ด ๊ธ๋ฆฌ ์ธ์์ ํ ๋ฐ๋ฉด ๋ฏธ๊ตญ ์ฐ๋ฐฉ์ค๋น์ ๋(Fedยท์ฐ์ค)์ ๊ธ๋ฆฌ ์ธํ ๊ธฐ๋๋ก ์ํ๊ฐ ๊ฐ์ธ ํ๋ฆ์ผ๋ก ์ ํ๋๋ค. ์ง๋๋ฒ ์์ ์ํฅ ๋ฐ๋๋ก ํด์ํ์๋ฉด ์ผ๋ณธํ ์ฌํ์์๋ฅผ ๋ณด๋ฉด ์์ ๋ก ์ธํด ํ์ฑํ ๋๋ ์ธก๋ฉด์ด ์ฝํ๋์ง ์๊ฒ ๋. ๊ฐ๊ฒฉ์ ์ธก๋ฉด์์ ๋ณด์๋ฉด ๊ทธ๋ ๊ฒ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.-๊ฒฝ์์์ง ํ์ ๊ท๋ชจ๊ฐ ์ญ๋ 3๋ฒ์งธ๋ก ํฌ๋ค. ์ถ๊ฐ์ค๋ช
๋ถํํ๋ค. ํ๋ฐ๊ธฐ์๋ ์ด์ ๋น์ทํ ํ์๊ท๋ชจ๋ฅผ ๋ฌ์ฑํ ์ ์๊ฑฐ๋ ์ญ๋ ์ต๋์น ๋ฌ์ฑ ๊ฐ๋ฅ์ฑ๋ ๊ถ๊ธํ๋ค.โณ(์ก ๋ถ์ฅ) ์ํ์์ง๊ฐ ํฌ๊ฒ ๊ฐ์ ๋ ์ํฅ์ด ์๋ค. 2023๋
ํ๋ฐ๊ธฐ๋ถํฐ ์ ๋ณด๊ธฐ์ (IT) ๊ฒฝ๊ธฐ ํ๋ณต ์ํฅ์ผ๋ก ์ํ์์ง๊ฐ ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ฒ ๊ฐ์ ๋๋ค. ์ด๊ฒ์ ์์ถ์ด ์ง์์ ์ผ๋ก ์ง์ํ๋ ๋ฐ๋ฉด ์์
์ด ๊ฐ์ํ๋ ์ธก๋ฉด์ด ๋ณตํฉ์ ์ผ๋ก ์์ฉํ๋ค. ํ๋ฐ๊ธฐ์ ์์ถ ํธ์กฐ๊ฐ ์ง์๋ ๊ฒ์ด๊ณ ๋ณธ์์๋์์ง๋ฅผ ๋น๋กฏํ ๋ถ๋ถ๋ ์ํธํ ํฌ์์๋์ด ์ ์
๋๋ ํ๋ฆ์ ์ง์๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ค๋ง ๋ฏธ๊ตญ ๊ฒฝ๊ธฐ, AI ๊ด๋ จ ํฌ์ ๋ํ ๊ฐ๋ฅ์ฑ, ์ฃผ์๊ตญ ํตํ์ ์ฑ
๋ฐฉํฅ, ์ง์ ํ์
print(f"๋ฌธ์์ ๊ฐ์: {len(relevant_docs)}")
print("[๊ฒ์ ๊ฒฐ๊ณผ]\n")
print(relevant_docs[0].page_content)
>>>๋ฌธ์์ ๊ฐ์: 4
[๊ฒ์ ๊ฒฐ๊ณผ]
์ ์กฐ์
์ฒด๊ฐ ์ค๋นํฌ์๋ฅผ ์ฌ๊ฐํ๊ณ ์์์ฌ ๊ฐ๊ฒฉ์ด ์์ ๋๋ค๊ณ ํ์ง๋ง ๊ฐ๊ฒฉ์ด ์์ ํ๋ ์ํฅ์ ๊ธฐ์ ํจ๊ณผ๋ก ์์ฉํ ์ ์๋ค. ์์
๊ฐ์์ธ๋ ํ๋ฐ๊ธฐ์๋ ์ํ๋์ง ์์๊น ์์๋๋ค. ์ค์ ๋ก 7์ ํต๊ด ๊ธฐ์ค ๋ฌด์ญ์์ง๋ฅผ ๋ณด๋ฉด 6์์๋ ์ํ์์
์ด 7.5% ๊ฐ์ํ๋ค๊ฐ 7์์ 10.5% ์ฆ๊ฐํ๋ค. ๊ทธ๋ฐ ์ํฅ์ ๊ณ ๋ คํ ๋ ๊ทธ๊ฐ ์์
๊ฐ์์ธ๋ ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.-๊ทธ๊ฐ ์์ ๋ก ์ธํ ์ผ๋ณธ ์ฌํ ๋๋ฌธ์ ์ฌํ์์ง๊ฐ ์ํฅ์ ํฌ๊ฒ ๋ฐ์๋ค๊ณ ์ค๋ช
ํ๋ค .์ต๊ทผ ์ํ๊ฐ ๋ฐ๋ฑ์ด ์์๋ค. ์ด์ ๋ฐ๋ผ ์ฌํ์์ง๋ฅผ ์ด๋ป๊ฒ ์์ํ๋๊ฐ.โณ(์ก ๋ถ์ฅ) ์ง๊ธ๊น์ง ์์ ์ํฅ์ด ์์๋ค. โ์ํผ ์์ โ ์ฐ๋ ค๋ ์์๋ค. ์ต๊ทผ ์ผ๋ณธ์ํ์ด ๊ธ๋ฆฌ ์ธ์์ ํ ๋ฐ๋ฉด ๋ฏธ๊ตญ ์ฐ๋ฐฉ์ค๋น์ ๋(Fedยท์ฐ์ค)์ ๊ธ๋ฆฌ ์ธํ ๊ธฐ๋๋ก ์ํ๊ฐ ๊ฐ์ธ ํ๋ฆ์ผ๋ก ์ ํ๋๋ค. ์ง๋๋ฒ ์์ ์ํฅ ๋ฐ๋๋ก ํด์ํ์๋ฉด ์ผ๋ณธํ ์ฌํ์์๋ฅผ ๋ณด๋ฉด ์์ ๋ก ์ธํด ํ์ฑํ ๋๋ ์ธก๋ฉด์ด ์ฝํ๋์ง ์๊ฒ ๋. ๊ฐ๊ฒฉ์ ์ธก๋ฉด์์ ๋ณด์๋ฉด ๊ทธ๋ ๊ฒ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.-๊ฒฝ์์์ง ํ์ ๊ท๋ชจ๊ฐ ์ญ๋ 3๋ฒ์งธ๋ก ํฌ๋ค. ์ถ๊ฐ์ค๋ช
๋ถํํ๋ค. ํ๋ฐ๊ธฐ์๋ ์ด์ ๋น์ทํ ํ์๊ท๋ชจ๋ฅผ ๋ฌ์ฑํ ์ ์๊ฑฐ๋ ์ญ๋ ์ต๋์น ๋ฌ์ฑ ๊ฐ๋ฅ์ฑ๋ ๊ถ๊ธํ๋ค.โณ(์ก ๋ถ์ฅ) ์ํ์์ง๊ฐ ํฌ๊ฒ ๊ฐ์ ๋ ์ํฅ์ด ์๋ค. 2023๋
ํ๋ฐ๊ธฐ๋ถํฐ ์ ๋ณด๊ธฐ์ (IT) ๊ฒฝ๊ธฐ ํ๋ณต ์ํฅ์ผ๋ก ์ํ์์ง๊ฐ ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ฒ ๊ฐ์ ๋๋ค. ์ด๊ฒ์ ์์ถ์ด ์ง์์ ์ผ๋ก ์ง์ํ๋ ๋ฐ๋ฉด ์์
์ด ๊ฐ์ํ๋ ์ธก๋ฉด์ด ๋ณตํฉ์ ์ผ๋ก ์์ฉํ๋ค. ํ๋ฐ๊ธฐ์ ์์ถ ํธ์กฐ๊ฐ ์ง์๋ ๊ฒ์ด๊ณ ๋ณธ์์๋์์ง๋ฅผ ๋น๋กฏํ ๋ถ๋ถ๋ ์ํธํ ํฌ์์๋์ด ์ ์
๋๋ ํ๋ฆ์ ์ง์๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ค๋ง ๋ฏธ๊ตญ ๊ฒฝ๊ธฐ, AI ๊ด๋ จ ํฌ์ ๋ํ ๊ฐ๋ฅ์ฑ, ์ฃผ์๊ตญ ํตํ์ ์ฑ
๋ฐฉํฅ, ์ง์ ํ์
ํ๋กฌํํธ๋ LangChain ํ๋กฌํํธ ํ๋ธ์ RAG์ฉ ํ๋กฌํํธ๋ฅผ ์ธํ ํ๋ค.
- retriever | format_docs: ์ฌ์ฉ์ ์ง๋ฌธ์ ์ด์ฉํด Document๋ฅผ ์์ฑํ๊ณ format_docs์ ์ ๋ฌํ์ฌ ๋ฌธ์์ด์ ์์ฑํ๋ค.
- RunnablePassthrough(): ์ฌ์ฉ์์ ์ง๋ฌธ์ ๊ทธ๋๋ก ํต๊ณผํ๋ค.
prompt = hub.pull("rlm/rag-prompt")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
rag_chain.invoke("๋ฏธ๊ตญ๋ฐ ๊ฒฝ์ ์นจ์ฒด ์ฐ๋ ค์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํด?")
>>> 'ํ์์ ๋ฏธ๊ตญ๋ฐ ๊ฒฝ๊ธฐ์นจ์ฒด ์ฐ๋ ค์๋ ๋ถ๊ตฌํ๊ณ ํ๋ฐ๊ธฐ์๋ ๊ฒฝ์์์ง ํ์ ๊ธฐ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ์ ๋งํ์ต๋๋ค. ๋ฐ๋์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ํ IT ์์ถ ํธ์กฐ๊ฐ ์ง์๋ ๊ฒ์ผ๋ก ์์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ค๋ง ์์
์ด ๋์ด๋๋ฉด์ ์ํ์์ง์ ํ์ ๊ท๋ชจ๋ ์ค์ด๋ค ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.'
rag_chain.invoke("์ฌํด ํ๊ตญ์ ํ๋ฐ๊ธฐ ๋ฌด์ญ์์ง์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํด?")
>>> '์ฌํด ํ๊ตญ์ ํ๋ฐ๊ธฐ ๋ฌด์ญ์์ง์ ๋ํด์๋ ๊ฒฝ์์์ง ํ์ ๊ธฐ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ์ ๋ง๋๋ค. ๋ค๋ง ์์
์ฆ๊ฐ๋ก ์ธํด ์ํ์์ง์ ํ์ ๊ท๋ชจ๋ ์ค์ด๋ค ๊ฒ์ผ๋ก ์์๋๋ค. ์ด๋ฌํ ์ ๋ง์ ๋ฏธ๊ตญ๋ฐ ๊ฒฝ๊ธฐ ์นจ์ฒด ์ฐ๋ ค์๋ ๋ฐ๋์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ํ IT ์์ถ ํธ์กฐ๊ฐ ์ด์ด์ง ๊ฒ์ผ๋ก ์์๋๊ธฐ ๋๋ฌธ์ด๋ค.'
LangSmith์์ ์์ ํ ์คํธ๊ฐ ์ด๋ ํ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ต๋ณ์ด ์์ฑ๋์๋์ง ํ์ธํด๋ณผ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ
'LangChain' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LangChain] Reranker (0) | 2024.08.29 |
---|---|
[LangChain] Chatbot Message History (1) | 2024.08.29 |
[LangChain] LangServe๋ฅผ ์ด์ฉํ LLM์ฑ ๋ฐฐํฌ (0) | 2024.08.29 |
[LangChain] LangChain ์์ํ๊ธฐ (1) | 2024.08.29 |