[๊ฐ์๋ ธํธ] RAG From Scratch : Query Retrieval ๊ธฐ๋ฒ
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/RAG-From-Scratch-15-18
- ํด๋น ๋ธ๋ก๊ทธ ํฌ์คํธ๋ RAG From Scratch : Coursework ๊ฐ์ ํํธ 15 - 18 ๋ด์ฉ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
- ๋ณ๋์ ๊ฐ์ข ๋ด์ฉ์ด ๋ณด์ด์ง ์์์ ์ค์ต ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก
Reverse Enginneering
ํด์ ์๋ฃ๋ฅผ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค!
1. Re-ranking (์ฌ์ ๋ ฌ)
- Re-ranking์ ๊ฒ์ ์์คํ ์์ ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๋ค์ ๋งค๊ธฐ๋ ๊ณผ์ ์ ๋๋ค. ๊ฒ์๋ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ์์ ๊ธฐ๋์ ๋ถํฉํ์ง ์๊ฑฐ๋, ๊ด๋ จ์ฑ์ด ์ถฉ๋ถํ์ง ์์ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ด ๋จผ์ ์ํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ ๋ ฌํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ ์ ํฉํ ํญ๋ชฉ์ ์์์ ๋ ธ์ถํฉ๋๋ค. Re-ranking ๊ณผ์ ์์๋ ์ฌ์ฉ์์ ๊ณผ๊ฑฐ ํ๋ ๋ฐ์ดํฐ๋ ๋ฌธ๋งฅ์ ์์, ์ต์ ์ฑ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์์ธ์ ๋ฐ์ํ์ฌ ์์๋ฅผ ์กฐ์ ํ๊ฒ ๋ฉ๋๋ค.
- Reciprocal Rank Fusion (RRF) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํ์ฌ ์ฌ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ์ฌ๋ฌ ๊ฒ์ ์์คํ ์์ ๋์จ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํฉ๋๋ค. RRF๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ํธ ์์์ ๊ธฐ๋ฐํ์ฌ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ ๋ฐฉ์์ ๋๋ค. ๊ฐ ๊ฒฐ๊ณผ์ ๋ํด ์์ ์ญ์๋ฅผ ๊ฐ์ฐํ๋ฉฐ, ์ด๋ฅผ ํตํด ์์์ ๋ ธ์ถ๋ ๊ฒฐ๊ณผ๊ฐ ์ฐ์ ์๋ฉ๋๋ค.
์ฃผ์ ํน์ง:
- ์ด๊ธฐ ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์ : ์ฒซ ๋ฒ์งธ ๊ฒ์์์ ๋์น ๊ด๋ จ ํญ๋ชฉ๋ค์ ์์๋ก ๋์ด์ฌ๋ฆฝ๋๋ค.
- ๋ค์ํ ์์ ๊ณ ๋ ค: ์ฌ์ฉ์ ์ ํธ๋, ๋ฌธ๋งฅ, ์ต์ ์ฑ ๋ฑ ๋ค์ํ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์์๋ฅผ ์กฐ์ ํฉ๋๋ค.
- ๋จธ์ ๋ฌ๋ ํ์ฉ: ๋ง์ re-ranking ์์คํ ์ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ ์ ํํ ์์๋ฅผ ๋งค๊น๋๋ค.
Re-ranking ์ฝ๋ ์์ (RRF)
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
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.output_parsers import StrOutputParser
from langchain.prompts import ChatPromptTemplate
# ๋ฒกํฐ ์คํ ์ด ์์ฑ ๋ฐ ๋ฌธ์ ๋ก๋
documents = ["This is document 1 about LLM.", "This is document 2 about AI agents."]
vectorstore = Chroma.from_documents(
documents=documents,
embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()
# ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ๊ฒ์
query = "What is LLM?"
results = retriever.get_relevant_documents(query)
# RRF ์ฌ์ ๋ ฌ ํจ์
def reciprocal_rank_fusion(results, k=60):
fused_scores = {}
for rank, doc in enumerate(results):
if doc not in fused_scores:
fused_scores[doc] = 0
fused_scores[doc] += 1 / (rank + k)
reranked_results = sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
return reranked_results
# RRF๋ฅผ ์ ์ฉํ ์ฌ์ ๋ ฌ
reranked_results = reciprocal_rank_fusion(results)
print("Reranked results:", reranked_results)
์ฝ๋ ๋ถ์ฐ ์ค๋ช :
reciprocal_rank_fusion
ํจ์๋ ๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์์๋ฅผ ๋ฐ์ ํด๋น ์์์ ๋ฐ๋ผ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์์๊ฐ ๋์ ๊ฒฐ๊ณผ๋ ์ญ์ ๋ฐฉ์์ผ๋ก ๋์ ์ ์๋ฅผ ๋ฐ์ต๋๋ค.k=60
์ ์ญ์ ๊ณ์ฐ์์ ์ถ๊ฐ์ ์ธ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์์๊ฐ ๋๋ฌด ๋ฎ์ ๊ฒฐ๊ณผ์ ๋ํ ๊ฐ์ค์น๊ฐ ์ง๋์น๊ฒ ์์์ง์ง ์๋๋ก ์กฐ์ ํฉ๋๋ค.
2. Retrieval (CRAG)
- CRAG๋ Retrieval-Augmented Generation(RAG) ๊ธฐ๋ฐ ์์คํ ์ ๊ฐ์ ๋ ํํ๋ก, ๊ฒ์๋ ๋ฌธ์์ ๊ด๋ จ์ฑ์ ํ๊ฐํ๊ณ ํ์์ ์ง๋ฌธ์ ๋ค์ ์์ฑํ์ฌ ๊ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ์์คํ ์ ์ด๊ธฐ ๊ฒ์์ด ์ถฉ๋ถํ์ง ์๊ฑฐ๋ ๋ถ์ ํํ ๋ ์์ฒด์ ์ผ๋ก ์ง๋ฌธ์ ์์ ํ๊ณ ์ถ๊ฐ ๊ฒ์์ ์ํํด ์ต์ข ์ ์ผ๋ก ๋ ์ ํํ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
- CRAG์ ํต์ฌ์ ์๊ธฐ ์์ ๋ฉ์ปค๋์ฆ์ผ๋ก, ๊ฒ์๋ ๋ฌธ์๊ฐ ๋ถ์ ์ ํ๋ค๊ณ ํ๋จ๋๋ฉด ์์คํ ์ด ์ด๋ฅผ ํ๊ฐํ๊ณ ๊ฒ์ ์ ๋ต์ ์กฐ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด, ์ฌ์ฉ์๋ ๋ ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ฃผ์ํน์ง
- ๊ฒ์ ํ๊ฐ๊ธฐ(Retrieval Evaluator) ๋์
:
- ๊ฒฝ๋ T5-large ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ๋ฌธ์์ ์ฟผ๋ฆฌ ๊ฐ์ ๊ด๋ จ์ฑ์ ํ๊ฐํฉ๋๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ โ์ ํโ, โ๋ถ์ ํโ, โ๋ชจํธโ๋ก ๋ถ๋ฅํฉ๋๋ค.
- ์๊ธฐ ์์ ๋ฉ์ปค๋์ฆ:
- ๊ฒ์๋ ๋ฌธ์๊ฐ ๋ถ์ ์ ํ๋ค๊ณ ํ๋จ๋๋ฉด, ์์คํ ์ด ์๋์ผ๋ก ์์ ์์ ์ ์ํํฉ๋๋ค.
- ์น ๊ฒ์์ ํตํด ์ถ๊ฐ ์ ๋ณด๋ฅผ ํ๋ํ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ๋ถํด-์ฌ๊ตฌ์ฑ(Decompose-then-Recompose) ์๊ณ ๋ฆฌ์ฆ:
- ๊ฒ์๋ ๋ฌธ์์์ ๊ฐ์ฅ ์ค์ํ ์ง์์ ์ถ์ถํ๊ณ ์ฌ๊ตฌ์ฑํฉ๋๋ค.
- ๋ถํ์ํ๊ฑฐ๋ ๊ด๋ จ ์๋ ์ ๋ณด๋ฅผ ํํฐ๋งํ์ฌ ํต์ฌ ์ ๋ณด๋ง ํ์ฉํฉ๋๋ค.
- ์ ์ฐํ ํตํฉ:
- ๊ธฐ์กด RAG ๊ธฐ๋ฐ ์์คํ ์ ํ๋ฌ๊ทธ ์ค ํ๋ ์ด ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ํตํฉ๋ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํฅ์:
- ๊ฒ์ ๊ฒฐ๊ณผ์ ํ์ง์ ๊ฐ์ ํจ์ผ๋ก์จ ์ต์ข ์์ฑ ๊ฒฐ๊ณผ์ ์ ํ์ฑ๊ณผ ๊ด๋ จ์ฑ์ ๋์ ๋๋ค.
CRAG ์ฝ๋ ์์
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
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# ๊ฒ์๊ธฐ ๋ฐ ๊ฒ์ ๋๊ตฌ
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
web_search_tool = TavilySearchResults(k=3)
# ์ง๋ฌธ ์ฌ์์ฑ LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
rewrite_prompt = ChatPromptTemplate.from_template(
"Here is the initial question: {question}. Rephrase this question for better search."
)
def corrective_rag(question):
# 1๋จ๊ณ: ๋ฒกํฐ ์คํ ์ด ๊ฒ์
results = retriever.get_relevant_documents(question)
# 2๋จ๊ณ: ๋ฌธ์ ํ๊ฐ
if not results or len(results) < 1:
# 3๋จ๊ณ: ์ง๋ฌธ ์ฌ์์ฑ ๋ฐ ์น ๊ฒ์
rewritten_question = rewrite_prompt.invoke({"question": question})
web_results = web_search_tool.invoke({"query": rewritten_question})
results.extend(web_results)
return results
question = "What are AI agents?"
corrected_docs = corrective_rag(question)
print(corrected_docs)
์ฝ๋ ๋ถ์ฐ ์ค๋ช :
corrective_rag
ํจ์๋ ๊ฒ์๋ ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ ์ง๋ฌธ์ ์ฌ์์ฑํ์ฌ ์น ๊ฒ์์ ์ํํ๋ ๊ตฌ์กฐ์ ๋๋ค.- ์ฌ๊ธฐ์
rewrite_prompt
๋ ์ด๊ธฐ ์ง๋ฌธ์ ๋ค์ ์์ฑํ๋ LLM ํธ์ถ์ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, ์ด๋ ์ง๋ฌธ์ ๋ช ํํ๊ฒ ํ๊ฑฐ๋ ์ธ๋ถํํ์ฌ ๋ ๋์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ํฉ๋๋ค.
3. Retrieval (Self-RAG)
- Self-RAG๋ ์ธ์ด ๋ชจ๋ธ์ด ์์ฒด์ ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฒ์ํ๊ณ , ์์ฑํ ๊ฒฐ๊ณผ๋ฅผ ๋นํํ๋ฉฐ ํ์์ ์ถ๊ฐ ๊ฒ์์ ์ํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ ๊ธฐ์กด RAG ์์คํ ์์ ๋ฐ์ํ ์ ์๋ ์ ํ ์ฌํญ์ ๋ณด์ํ๊ณ , ๋ชจ๋ธ์ด ์ค์ค๋ก ์์ฑ ๊ฒฐ๊ณผ๋ฅผ ํ๊ฐํ์ฌ ๋ ๋์ ๋ต๋ณ์ ๋ง๋ค ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ ์์ฑ๋ ๋ต๋ณ์ด ์ถฉ๋ถํ ๊ด๋ จ์ฑ์ด ์๋ค๊ณ ํ๋จ๋๋ฉด, ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฒ์ํด ์ด๋ฅผ ๋ณด์ํฉ๋๋ค.
- ์ด๋ฌํ ์๊ฐ ๋ฐ์ ๋ฉ์ปค๋์ฆ์ ํนํ ์ ํ์ฑ์ด ์ค์ํ ๋ถ์ผ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ชจ๋ธ์ด ํ ๋ฒ์ ๊ฒ์์ผ๋ก ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์ง ๋ชปํ ๋ ์ด๋ฅผ ์ธ์งํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๊ฒ์ํ ์ ์๋๋ก ํด์ค๋๋ค.
์ฃผ์ ํน์ง:
- ์๊ฐ ๋ฐ์: ๋ชจ๋ธ์ด ์์ ์ ์ถ๋ ฅ์ ํ๊ฐํ๊ณ ๊ฐ์ ํฉ๋๋ค.
- ๋์ ๊ฒ์: ํ์์ ๋ฐ๋ผ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ๋นํ ๋ฅ๋ ฅ: ์์ฑ๋ ๋ด์ฉ์ ์ ํ์ฑ๊ณผ ๊ด๋ จ์ฑ์ ํ๊ฐํฉ๋๋ค.
Self-RAG ์ฝ๋ ์์
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
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# ๋ฌธ์ ๋ฐ ๋ฒกํฐ ์คํ ์ด ์ค์
documents = ["Document 1 about LLM", "Document 2 about AI agents"]
vectorstore = Chroma.from_documents(
documents=documents,
embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()
# LLM ๋ฐ ๋ฌธ์ ํ๊ฐ
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
def self_rag(question):
# 1๋จ๊ณ: ๊ฒ์
results = retriever.get_relevant_documents(question)
# 2๋จ๊ณ: ๋ต๋ณ ์์ฑ
generated_answer = llm.invoke({
"context": results,
"question": question
})
# 3๋จ๊ณ: ์์ฑ๋ ๋ต๋ณ ํ๊ฐ
if "insufficient" in generated_answer:
# ๋ฌธ์๊ฐ ์ถฉ๋ถํ์ง ์๋ค๋ฉด ์ถ๊ฐ ๊ฒ์
additional_results = retriever.get_relevant_documents(f"{question} more details")
results.extend(additional_results)
generated_answer = llm.invoke({
"context": results,
"question": question
})
return generated_answer
question = "What are the types of AI agents?"
answer = self_rag(question)
print(answer)
์ฝ๋ ๋ถ์ฐ ์ค๋ช :
self_rag
ํจ์์์๋ ๋จผ์ ๊ฒ์์ ํตํด ๋ฌธ์๋ฅผ ๊ฐ์ ธ์จ ํ, ๊ทธ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก LLM์ด ๋ต๋ณ์ ์์ฑํฉ๋๋ค.- ๋ง์ฝ ๋ชจ๋ธ์ด ๋ต๋ณ์ ์์ฑํ ํ์ ๋ต๋ณ์ด ์ถฉ๋ถํ์ง ์๋ค๊ณ ํ๋จํ๋ฉด, ์ถ๊ฐ ๊ฒ์์ ์ํํ์ฌ ๋ต๋ณ์ ๊ฐ์ ํฉ๋๋ค.
4. Active RAG
- Active RAG๋ LLM์ด ์ธ์ , ์ด๋์ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ๊ฒ์ํ ์ง ์ค์ค๋ก ํ๋จํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ ์ด๊ธฐ ์ง๋ฌธ์ ๋ํด ๊ธฐ๋ณธ ์๋ต์ ์์ฑํ ํ, ์์คํ ์ด ์์จ์ ์ผ๋ก ํ์ ์ง๋ฌธ์ ์์ฑํ๊ฑฐ๋ ์ถ๊ฐ ๊ฒ์์ ํตํด ๋ ๋์ ๋ต๋ณ์ ์์ฑํ๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. Active RAG์ ์ฃผ๋ ๋ชฉํ๋ ์ฒซ ๋ฒ์งธ ์์ฑ๋ ๋ต๋ณ์ ๋ง์กฑํ์ง ์๊ณ , ๋ ๋์ ๋ต๋ณ์ ์ํด ์ ๊ทน์ ์ผ๋ก ์ถ๊ฐ ์์ ์ ์ํํ๋ ๋ฐ ์์ต๋๋ค.
์ฃผ์ ํน์ง:
- ๋ฐ๋ณต์ ๊ฒ์: ์ด๊ธฐ ์๋ต ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ์ง๋ฌธ ์์ฑ: ๋ชจ๋ธ์ด ์ค์ค๋ก ํ์ ์ง๋ฌธ์ ์์ฑํฉ๋๋ค.
- ์๋ต ๊ฐ์ : ์๋ก์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ด๊ธฐ ์๋ต์ ๊ฐ์ ํฉ๋๋ค.
Active RAG ์ฝ๋ ์์
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
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
# ์ง๋ฌธ ๋ถ์ ๋ฐ ์น ๊ฒ์ ๋๊ตฌ
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
web_search_tool = TavilySearchResults(k=3)
# ์ง๋ฌธ ๋ผ์ฐํ
๋ฐ Active RAG
def active_rag(question):
# ์ง๋ฌธ ๋ถ์
initial_results = retriever.get_relevant_documents(question)
if len(initial_results) < 2: # ๋ฌธ์๊ฐ ๋ถ์กฑํ๋ฉด ์น ๊ฒ์ ์ํ
additional_results = web_search_tool.invoke({"query": question})
initial_results.extend(additional_results)
# ์ต์ข
๋ต๋ณ ์์ฑ
answer = llm.invoke({
"context": initial_results,
"question": question
})
return answer
question = "What is LLM task decomposition?"
final_answer = active_rag(question)
print(final_answer)
์ฝ๋ ๋ถ์ฐ ์ค๋ช :
active_rag
ํจ์๋ ์ด๊ธฐ ๊ฒ์์ ์ํํ ํ, ๊ฒ์๋ ๋ฌธ์๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๊ด๋ จ์ฑ์ด ๋ฎ์ผ๋ฉด ์น ๊ฒ์ ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ถ๊ฐ ๊ฒ์์ ์คํํ๋ ๊ตฌ์กฐ์ ๋๋ค.- ์ด๋ฅผ ํตํด ๋ ํ๋ถํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด ์ต์ข ์ ์ผ๋ก ๋ ๋์ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
5. Adaptive RAG
- Adaptive RAG๋ ์ง๋ฌธ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์ ์ ํ ๊ฒ์ ๋ฐฉ๋ฒ์ ๋์ ์ผ๋ก ์ ํํ๋ ์์คํ ์ ๋๋ค. ์ฆ, ์ง๋ฌธ์ด ๋จ์ํ๋ฉด ๊ฐ๋จํ ๋ฒกํฐ ์คํ ์ด ๊ฒ์์ ์ฌ์ฉํ๊ณ , ์ง๋ฌธ์ด ๋ณต์กํ๋ฉด ์น ๊ฒ์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ง๋ฌธ์ ๋ณต์ก์ฑ๊ณผ ํ์์ ๋ฐ๋ผ ์ต์ ์ ๊ฒ์ ์ ๋ต์ ์ ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ๋ณต์กํ ์ง๋ฌธ์ ๋ํด ๋ ์ ํํ๊ณ ์ ์ํ ๋ต๋ณ์ ์์ฑํ ์ ์์ต๋๋ค.
- Adaptive RAG๋ ๋ค์ํ ๊ฒ์ ๋ฐฉ๋ฒ์ ์ ์ ํ ์กฐํฉํ์ฌ ๋ค์ํ ์ง๋ฌธ ์ ํ์ ๋ํด ๋์ ์ฑ๋ฅ์ ๋ฐํํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฃผ์ ํน์ง:
- ๋์ ์ ๋ต ์ ํ: ์ง๋ฌธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒ์ ๋ฐฉ๋ฒ์ ์ ํํฉ๋๋ค.
- ๋ณต์ก์ฑ ํ๊ฐ: ์ง๋ฌธ์ ๋ณต์ก์ฑ์ ๋ถ์ํ์ฌ ์ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ฆฌ์์ค ์ต์ ํ: ๊ฐ๋จํ ์ง๋ฌธ์๋ ๊ฐ๋จํ ๊ฒ์, ๋ณต์กํ ์ง๋ฌธ์๋ ๋ ์ฌ์ธต์ ์ธ ๊ฒ์์ ์ํํฉ๋๋ค.
Adaptive RAG ์ฝ๋ ์์
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
from langchain_openai import OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
# ๋ฒกํฐ ์คํ ์ด ๊ฒ์๊ธฐ
vector_retriever = vectorstore.as_retriever()
# LLM ์ค์
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# ์ง๋ฌธ ๋ผ์ฐํ
ํจ์
def adaptive_rag(question):
# ์ง๋ฌธ ๋ถ์ ๋ฐ ๋ผ์ฐํ
if "LLM" in question:
results = vector_retriever.get_relevant_documents(question)
else:
results = web_search_tool.invoke({"query": question})
# ๋ต๋ณ ์์ฑ
answer = llm.invoke({
"context": results,
"question": question
})
return answer
question = "What are the types of LLM agents?"
adaptive_answer = adaptive_rag(question)
print(adaptive_answer)
์ฝ๋ ๋ถ์ฐ ์ค๋ช :
adaptive_rag
ํจ์๋ ์ง๋ฌธ์ ๋ฐ๋ผ ๋ฒกํฐ ์คํ ์ด ๊ฒ์ ๋๋ ์น ๊ฒ์์ ์ ํํ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก LLM์ด ์ต์ข ๋ต๋ณ์ ์์ฑํฉ๋๋ค.- ์ด๋ฅผ ํตํด ์ง๋ฌธ์ ๋ณต์ก๋๋ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๊ฒ์ ์ ๋ต์ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.