[๊ฐ์๋ ธํธ] RAG From Scratch : Query Indexing ๊ธฐ๋ฒ
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/RAG-From-Scratch-12-14
- ํด๋น ๋ธ๋ก๊ทธ ํฌ์คํธ๋ RAG From Scratch : Coursework ๊ฐ์ ํํธ 12 - 14 ๋ด์ฉ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
๋น๋์ค | ์์ฝ | ๊ฐ์ ๋งํฌ | ์ฌ๋ผ์ด๋ |
---|---|---|---|
Part 12 (๋ค์ค ํํ ์ธ๋ฑ์ฑ) | ํจ์จ์ ์ธ ๊ฒ์์ ์ํด ๋ฌธ์ ์์ฝ์ ์ธ๋ฑ์ฑํ๋ฉด์๋ ์ ์ฒด ๋ฌธ์์ ์ฐ๊ฒฐํ์ฌ ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ ผ์ํฉ๋๋ค. | ๐ ๊ฐ์ | ๐ ์ฐธ๊ณ ์๋ฃ |
Part 13 (RAPTOR) | ๋ฌธ์ ์์ฝ๊ณผ ํด๋ฌ์คํฐ๋ง์ ํตํด ๊ณ ์์ค ๊ฐ๋ ์ ํฌ์ฐฉํ๋ RAPTOR ๊ธฐ๋ฒ์ ์๊ฐํฉ๋๋ค. | ๐ ๊ฐ์ | ๐ ์ฐธ๊ณ ์๋ฃ |
Part 14 (ColBERT) | RAG ํ๋ ์์ํฌ ๋ด์์ ๊ฐํ๋ ํ ํฐ ๊ธฐ๋ฐ ๊ฒ์์ ์ํ ColBERT๋ฅผ ํ๊ตฌํฉ๋๋ค. | ๐ ๊ฐ์ | ๐ ์ฐธ๊ณ ์๋ฃ |
ํ์ ํจํค์ง ์ค์น
1
# ! pip install langchain_community tiktoken langchain-openai langchainhub chromadb langchain youtube-transcript-api pytube
Part 12 (์ธ๋ฑ์ฑ/๋ค์คํํ์ธ๋ฑ์ฑ)
-
์ ๊ทธ๋ฆผ์ ๋จ๊ณ์ ๋ฐ๋ผ ๊ฐ ๊ณผ์ ์ ์ญํ ๊ณผ ๊ฐ๋ ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค:
- Question (์ง๋ฌธ) : ์ฌ์ฉ์๊ฐ ์์คํ ์ ์ ๋ ฅํ๋ ์์ฐ์ด ํํ์ ์ง๋ฌธ์ ๋๋ค. ์ด๋ ์ ์ฒด ํ๋ก์ธ์ค์ ์์์ ์ด ๋ฉ๋๋ค.
- Query Translation (์ฟผ๋ฆฌ ๋ฒ์ญ) : ์ฌ์ฉ์์ ์์ฐ์ด ์ง๋ฌธ์ ์์คํ ์ด ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ ์์ฐ์ด ์ฒ๋ฆฌ ๊ธฐ์ ์ ํ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
- Routing (๋ผ์ฐํ ) : ๋ณํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌ ๊ฒฝ๋ก๋ ๋ฐ์ดํฐ ์์ค๋ก ์๋ดํ๋ ๊ณผ์ ์ ๋๋ค. ์ง๋ฌธ์ ํน์ฑ์ ๋ฐ๋ผ ์ต์ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค.
- Query Construction (์ฟผ๋ฆฌ ๊ตฌ์ฑ) : ๋ผ์ฐํ ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฒ์ ์์ง์์ ์ฌ์ฉํ ์ ์๋ ํํ์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- Indexing (์ธ๋ฑ์ฑ, ์ด๋ฒ ์ฑํฐ๐) : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฌธ์ ์ปฌ๋ ์ ์์ ํจ์จ์ ์ธ ๊ฒ์์ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ๊ณ ์กฐ์งํํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ ์ฃผ๋ก ์์คํ ๊ตฌ์ถ ๋จ๊ณ์์ ์ํ๋ฉ๋๋ค.
- Retrieval (๊ฒ์) : ๊ตฌ์ฑ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ฑ์ฑ๋ ๋ฐ์ดํฐ์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋จ๊ณ์์ ์ง๋ฌธ๊ณผ ๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ์ ๋ณด๋ฅผ ์ฐพ์๋ ๋๋ค.
- Generation (์์ฑ) : ๊ฒ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋จ๊ณ์์๋ ์ฃผ๋ก ์์ฐ์ด ์์ฑ ๊ธฐ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- Answer (๋ต๋ณ) : ์ต์ข ์ ์ผ๋ก ์์ฑ๋ ๋ต๋ณ์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์๋ ์ง๋ฌธ์ ๋ํ ์๋ต์ผ๋ก, ์์ฐ์ด ํํ๋ก ํํ๋ฉ๋๋ค.
- ์ด๋ฒ ๊ฐ์๋ Indexing(์ธ๋ฑ์ฑ), ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค์์๋ Multi-Representation Indexing(๋ค์ค ํํ ์ธ๋ฑ์ฑ)์ด๋ผ๋ ๊ฐ๋ ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
-
Multi-Representation Indexing(๋ค์ค ํํ ์ธ๋ฑ์ฑ)์ ๋ฒกํฐ ์คํ ์ด์์ ์ ๋ณด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ๋ ๋ฐ ์ค์ํ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ด ๊ธฐ๋ฒ์ ์์ฐ์ด ์ง๋ฌธ์ ๋ํ ์ต์ ์ ๋ฌธ์ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ํนํ ๊ธด ๋ฌธ๋งฅ์ ์ฒ๋ฆฌํ๋ LLM(Long Context Language Models)์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
1. Indexing์ด๋?
- ์ธ๋ฑ์ฑ์ ๋ฌธ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๋์ค์ ๊ฒ์ํ ์ ์๋๋ก ์ค๋นํ๋ ๊ณผ์ ์
๋๋ค.
- ๋ฒกํฐ ์คํ ์ด(Vector Store)๋ ๋ฌธ์๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก, ๋ฌธ์์ ์ฃผ์ ํน์ง๋ค์ ๋ฒกํฐ ํํ๋ก ์ธ๋ฑ์ฑํ๊ณ ๋์ค์ ์ ์ฌ๋ ๊ฒ์์ ํตํด ๊ด๋ จ ๋ฌธ์๋ฅผ ์ฐพ์๋ผ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฌธ์์์ ์ค์ํ ํค์๋๋ฅผ ์ถ์ถํ์ฌ ๋ฒกํฐ๋ก ๋ณํํ๊ณ ์ด๋ฅผ ์ ์ฅํ ํ, ์ง๋ฌธ๊ณผ ์ ์ฌํ ํค์๋๋ฅผ ๊ฐ์ง ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ๋๋ค.
2. Multi-Representation Indexing์ด๋?
- Multi-Representation Indexing์ ๋ฌธ์์ ์ฌ๋ฌ ํํ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฒ์
๋๋ค.
- ์ด ๊ธฐ๋ฒ์ ํ ๋ฌธ์๋ฅผ ๋จ์ํ ๋๋์ด ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, LLM์ ์ฌ์ฉํด ๋ฌธ์๋ฅผ ์์ฝํ๊ณ ๊ทธ ์์ฝ์ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ์ ์ฅํฉ๋๋ค.
- ๋์ค์ ๊ฒ์ํ ๋ ์ด ์์ฝ๋ ๋ด์ฉ์ ํตํด ๋ฌธ์๋ฅผ ๊ฒ์ํ ํ, ์ ์ฒด ๋ฌธ์๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
-
์ฃผ์ ์ ์ฐจ:
- ๋ฌธ์ ์์ฝ: ์๋ณธ ๋ฌธ์๋ฅผ ์์ฝํ์ฌ ์ค์ํ ํค์๋๋ฅผ ํฌํจํ ์์ฝ๋ณธ์ ์์ฑํฉ๋๋ค.
- ์์ฝ๋ณธ ์ธ๋ฑ์ฑ: ์์ฝ๋ ๋ฌธ์๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ์ฌ ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅํฉ๋๋ค.
- ์ ์ฒด ๋ฌธ์ ์ ์ฅ: ์๋ณธ ๋ฌธ์๋ ๋ณ๋์ ๋ฌธ์ ์ ์ฅ์(Doc Store)์ ์ ์ฅํ์ฌ ๊ฒ์ ํ์ ์๋ฌธ์ ๋ฐํํ ์ ์๋๋ก ์ค๋นํฉ๋๋ค.
- ๊ฒ์: ์ฌ์ฉ์๊ฐ ์ง๋ฌธ์ ํ๋ฉด, ์ง๋ฌธ๊ณผ ์ ์ฌํ ์์ฝ๋ณธ์ ๋ฒกํฐ ์คํ ์ด์์ ์ฐพ์๋ด๊ณ , ํด๋น ์์ฝ๋ณธ์ ์ฐ๊ฒฐ๋ ์๋ณธ ๋ฌธ์๋ฅผ ๋ฌธ์ ์ ์ฅ์์์ ๋ฐํํฉ๋๋ค.
-
์ด ๋ฐฉ์์ ์์ฝ๋ณธ์ ํตํด ๋น ๋ฅด๊ฒ ๊ฒ์ํ ํ ์ ์ฒด ๋ฌธ์๋ฅผ ๋ฐํํจ์ผ๋ก์จ ๊ฒ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ , ๊ธด ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
3. Multi-Representation Indexing์ ์ฅ์
- ๋น ๋ฅธ ๊ฒ์: ์์ฝ๋ ๋ด์ฉ์ ๋ฒกํฐ๋ก ์ธ๋ฑ์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
- ์ ํํ ๋ฌธ์ ๋ฐํ: ๊ฒ์ ํ์๋ ์๋ณธ ๋ฌธ์ ์ ์ฒด๋ฅผ ๋ฐํํ์ฌ ์ง๋ฌธ์ ๋ํ ์ถฉ๋ถํ ๋ฌธ๋งฅ์ ์ ๊ณตํฉ๋๋ค.
- LLM๊ณผ์ ํตํฉ: LLM์ด ๋ฌธ์๋ฅผ ์์ฝํ๊ณ ๊ทธ ์์ฝ๋ณธ์ ๊ฒ์์ ์ฌ์ฉํจ์ผ๋ก์จ, ๋ฌธ์์ ํต์ฌ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ ์ ํํ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
4. ์ฝ๋ ์ค๋ช
- ๋ค์์ ๋ ๊ฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ๋ก๋ํ๊ณ , ์์ฝํ์ฌ Multi-Representation Indexing์ ์ํํ๋ ์์์ ๋๋ค.
4.1 ์น ๋ฌธ์ ๋ก๋ ๋ฐ ์์ฝ ์์ฑ
- ์ ์ฝ๋๋ ์น์์ ๋ ๊ฐ์ ๋ฌธ์๋ฅผ ๋ก๋ํฉ๋๋ค. ์ดํ ์ด ๋ฌธ์๋ฅผ ์์ฝํ์ฌ ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
docs = loader.load()
loader = WebBaseLoader("https://lilianweng.github.io/posts/2024-02-05-human-data-quality/")
docs.extend(loader.load())
len(docs) # 2
4.2 LLM์ ์ด์ฉํ ๋ฌธ์ ์์ฝ
- ์ด ์ฝ๋๋ LLM์ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ๋ฌธ์๋ ์์ฝ๋ณธ์ผ๋ก ๋ณํ๋๊ณ , ์ด ์์ฝ๋ณธ์ ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅ๋ฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import uuid
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
chain = (
{"doc": lambda x: x.page_content}
| ChatPromptTemplate.from_template("Summarize the following document:\n\n{doc}")
| Azure_Chat #ChatOpenAI(model="gpt-3.5-turbo",max_retries=0)
| StrOutputParser()
)
summaries = chain.batch(docs, {"max_concurrency": 5})
summaries
-
chain.batch(docs, {"max_concurrency": 5})
์์max_concurrency: 5
๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค:- ๋์ ์ฒ๋ฆฌ ๋ฌธ์ ์: ํ ๋ฒ์ ์ต๋ 5๊ฐ์ ๋ฌธ์๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฒ๋ฆฌ ์๋ ์ต์ ํ: 5๊ฐ์ฉ ๋ฌธ์๋ฅผ ๋ฌถ์ด ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
- ๋ฆฌ์์ค ๊ด๋ฆฌ: ์์คํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ ์ดํ์ฌ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
-
ํด๋น ์์์ ๊ฒฝ์ฐ, ๋ฌธ์๊ฐ 2๊ฐ์ด๊ธฐ ๋๋ฌธ์
max_concurrency: 5
๋ก ์ค์ ๋์ด ์๋๋ผ๋ ์ค์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋ฉ๋๋ค:- ๋์ ์ฒ๋ฆฌ: ๋ ๋ฌธ์ ๋ชจ๋ ๋์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
max_concurrency
๊ฐ 5๋ก ์ค์ ๋์ด ์์ง๋ง, ์ค์ ๋ฌธ์ ์๊ฐ 2๊ฐ์ด๋ฏ๋ก 2๊ฐ๋ง ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๋์ ์ฒ๋ฆฌ: ๋ ๋ฌธ์ ๋ชจ๋ ๋์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
4.3 ๋ฒกํฐ ์คํ ์ด ๋ฐ ๋ฌธ์ ์ ์ฅ์ ์ค์
- ์ฌ๊ธฐ์๋ ์์ฝ๋ ๋ฌธ์๋ฅผ ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅํ๊ณ , ์๋ณธ ๋ฌธ์๋ ๋ณ๋์ ๋ฌธ์ ์ ์ฅ์์ ์ ์ฅํ์ฌ ๊ฒ์ํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain.storage import InMemoryByteStore
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.retrievers.multi_vector import MultiVectorRetriever
# ์์ฝ๋ณธ์ ์ ์ฅํ ๋ฒกํฐ ์คํ ์ด
vectorstore = Chroma(collection_name="summaries",
embedding_function=OpenAIEmbeddings())
# ์๋ณธ ๋ฌธ์๋ฅผ ์ ์ฅํ ๋ฌธ์ ์ ์ฅ์
store = InMemoryByteStore()
# ์์ฝ๋ณธ๊ณผ ์๋ณธ ๋ฌธ์๋ฅผ ์ฐ๊ฒฐํ๋ ํค
id_key = "doc_id"
# ์์ฝ๋ณธ๊ณผ ์๋ณธ ๋ฌธ์๋ฅผ ํตํฉํ๋ ๊ฒ์๊ธฐ
retriever = MultiVectorRetriever(vectorstore=vectorstore,
byte_store=store,
id_key=id_key,
)
4.4 ๋ฌธ์ ๊ฒ์ ๋ฐ ๋ฐํ
- ์ด ์ฝ๋๋ โMemory in agentsโ๋ผ๋ ์ง๋ฌธ์ ๋ํด ์์ฝ๋ณธ์ ๊ฒ์ํ๊ณ , ํด๋น ์์ฝ๋ณธ์ ์ฐ๊ฒฐ๋ ์๋ณธ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# ์์ฝ๋ณธ๊ณผ ์๋ณธ ๋ฌธ์ ์ฐ๊ฒฐ
doc_ids = [str(uuid.uuid4()) for _ in docs]
summary_docs = [Document(page_content=s, metadata={id_key: doc_ids[i]}) for i, s in enumerate(summaries)]
# ๋ฒกํฐ ์คํ ์ด์ ์์ฝ๋ณธ ์ถ๊ฐ
retriever.vectorstore.add_documents(summary_docs)
# ๋ฌธ์ ์ ์ฅ์์ ์๋ณธ ๋ฌธ์ ์ถ๊ฐ
retriever.docstore.mset(list(zip(doc_ids, docs)))
# ๊ฒ์ ์ฟผ๋ฆฌ
query = "Memory in agents"
# ์์ฝ๋ณธ์ผ๋ก๋ถํฐ ๋ฌธ์ ๊ฒ์
sub_docs = vectorstore.similarity_search(query, k=1)
# ๊ฒ์๋ ์๋ณธ ๋ฌธ์ ๋ฐํ
retrieved_docs = retriever.get_relevant_documents(query, n_results=1)
retrieved_docs[0].page_content[0:500]
์ ๋ฆฌ
- Multi-Representation Indexing์ ์์ฝ๋ณธ์ ํตํด ๋น ๋ฅด๊ฒ ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ณ , ๊ฒ์๋ ์์ฝ๋ณธ์ ์ฐ๊ฒฐ๋ ์๋ณธ ๋ฌธ์๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ ๊ฒ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ๊ธด ๋ฌธ๋งฅ์ ๊ฐ์ง ๋ฌธ์๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด ๋ฐฉ์์ ํนํ ๋ฒกํฐ ์คํ ์ด๋ฅผ ํ์ฉํ ๋ฌธ์ ๊ฒ์์์ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, LLM์ ์ฌ์ฉํด ๋ฌธ์๋ฅผ ์์ฝํ๊ณ ๊ฒ์ํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
Part 13 (RAPTOR)
- RAPTOR๋ ๊ณ์ธต์ ์ธ๋ฑ์ฑ(hierarchical indexing) ๊ธฐ๋ฒ์ผ๋ก, ๋๊ท๋ชจ ๋ฌธ์๋ ํ ์คํธ ๋ฐ์ดํฐ์์ ํจ์จ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
1. RAPTOR ๊ฐ๋
- RAPTOR (RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL)๋ ๋ฌธ์ ์งํฉ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ์์ฝํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ์ฑํ๋ ๊ธฐ๋ฒ์
๋๋ค. ์ด๋ ๋ค์ํ ์ง๋ฌธ ์ ํ์ ๋ง๊ฒ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์๋๋ก ๋๋ ๋ฐฉ์์
๋๋ค.
- ์ฆ, ํน์ ์ง๋ฌธ์ด ์ธ๋ถ์ ์ธ ์ ๋ณด๋ฅผ ์๊ตฌํ๋ ๊ฒฝ์ฐ์๋ ํ์ ๋ ธ๋(์ธ๋ถ ๋ฌธ์๋ ์์ ์ ๋ณด ์กฐ๊ฐ)๋ฅผ, ์์ ๊ฐ๋ ์ ๋ค๋ฃจ๋ ์ง๋ฌธ์๋ ์์ ๋ ธ๋(๋ฌธ์ ์์ฝ)๋ฅผ ๊ฒ์ํ์ฌ ๋ต์ ์ ๊ณตํ ์ ์์ต๋๋ค.
2. ๊ณ์ธต์ ์ถ์ํ
RAPTOR
์ ํต์ฌ ๊ฐ๋ ์ ๋ฐ๋ก ๊ณ์ธต์ ์ถ์ํ(hierarchical abstraction)์ ๋๋ค.- ๋ฌธ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋๋ฉฐ, ๊ฐ ์กฐ๊ฐ์ ์์ ๋ ๋ฒจ์์ ์์ฝ๋๊ณ , ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ต์ข ์ ์ผ๋ก ์ ์ฒด ๋ฌธ์๋ฅผ ์์ฝํ ์ต์์ ์์ฝ์ ์์ฑํฉ๋๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ ์์ฝ ํธ๋ฆฌ๋ ์ง๋ฌธ์ ๋ฐ๋ผ ์ ์ ํ ์์ค์ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ธ๋ถ์ ์ธ ์ง๋ฌธ์ ๋ํด์๋ ๊ฐ๋ณ ๋ฌธ์๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ ํฐ ๋ฒ์์ ์ง๋ฌธ์ ๋ํด์๋ ์์ ๋ ๋ฒจ์์ ์์ฝ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
3. RAPTOR์ ๋์ ๋ฐฉ์
RATOR์ ๋์์ ๋ ๊น์ด ์๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ์ ์ฝ๋์ ์๋ ์๋ฆฌ์ ๊ตฌ์ฒด์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ต๋๋ค.
-
3.1. ๋ฌธ์ ๋ก๋ ๋ฐ ๋ฒกํฐํ:
-
๋ฌธ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๋ก๋ํ๊ณ , ์ด๋ฅผ ๋ฒกํฐํํฉ๋๋ค. ๋ฒกํฐํ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ณํํ์ฌ ๊ณ์ฐํ ์ ์๋ ํํ๋ก ๋ง๋๋ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ์ด ๋จ๊ณ์์๋ ๋ฌธ์ ๋ด์์ ๋จ์ด๋ ๋ฌธ์ฅ ๊ฐ์ ์๋ฏธ์ ์ ์ฌ๋๋ฅผ ๋ฐ์ํ ์ ์๋๋ก ๊ฐ ๋ฌธ์๊ฐ ๊ณ ์ฐจ์์ ๋ฒกํฐ๋ก ํํ๋ฉ๋๋ค. ๋ฒกํฐํ๋ ๋ฐ์ดํฐ๋ ์ดํ ํด๋ฌ์คํฐ๋ง์ด๋ ๊ฒ์์์ ํ์ฉ๋ฉ๋๋ค.
1 2 3
docs = loader.load() # ๋ฌธ์ ๋ก๋ docs_texts = [d.page_content for d in docs] # ํ ์คํธ ์ถ์ถ text_embeddings = embd.embed_documents(docs_texts) # ๋ฌธ์ ๋ฒกํฐํ
-
-
3.2. ํด๋ฌ์คํฐ๋ง ๋ฐ ์์ฝ:
-
๋ฌธ์ ๊ฐ ์ ์ฌ์ฑ์ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง์ ์ํํฉ๋๋ค. ํด๋ฌ์คํฐ๋ง์ ๋น์ทํ ๋ฌธ์๋ค์ ๋ฌถ์ด์ฃผ๋ ๊ณผ์ ์ผ๋ก, Gaussian Mixture Model (GMM)์ ํ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ๊ฐ์๋ฅผ ๊ฒฐ์ ํ๊ณ ๊ฐ ๋ฌธ์๊ฐ ์ด๋ ํด๋ฌ์คํฐ์ ์ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค. ์ดํ ํด๋ฌ์คํฐ ๋ด ๋ฌธ์๋ค์ ์์ฝํ์ฌ ๊ฐ ํด๋ฌ์คํฐ์ ์ฃผ์ ๋ด์ฉ์ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํฉ๋๋ค.
1
df_clusters, df_summary = embed_cluster_summarize_texts(docs_texts, level=1)
-
embed_cluster_summarize_texts
ํจ์1 2 3
def embed_cluster_summarize_texts( texts: List[str], level: int ) -> Tuple[pd.DataFrame, pd.DataFrame]:
- ๊ธฐ๋ฅ: ์ฃผ์ด์ง ํ ์คํธ ๋ชฉ๋ก์ ์๋ฒ ๋ฉํ๊ณ , ํด๋ฌ์คํฐ๋ง์ ์ํํ ํ ํด๋ฌ์คํฐ ๋ด์ ๋ฌธ์๋ค์ ์์ฝํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋ฌ์คํฐํ๋ ๋ฌธ์ ์ ๋ณด์ ๊ฐ ํด๋ฌ์คํฐ์ ์์ฝ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
-
์ ๋ ฅ ์ธ์:
texts
: ๋ฌธ์์ ๋ฆฌ์คํธ๋ก, ๊ฐ ๋ฌธ์๊ฐ ๋ฌธ์์ด๋ก ํํ๋ฉ๋๋ค. ์ด ๋ฆฌ์คํธ๋ ํด๋ฌ์คํฐ๋ง์ ๋์์ด ๋๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.level
: ํด๋ฌ์คํฐ๋ง ๋ฐ ์์ฝ์ ๊น์ด๋ฅผ ๋ํ๋ด๋ ๋งค๊ฐ๋ณ์์ ๋๋ค. ์ฃผ๋ก ์ฌ๊ท์ ์์ฝ ๊ณผ์ ์์ ์ด ๊ฐ์ด ์ฆ๊ฐํฉ๋๋ค.
-
์ถ๋ ฅ:
df_clusters
: ๊ฐ ๋ฌธ์์ ๊ทธ ์๋ฒ ๋ฉ, ํด๋ฌ์คํฐ ์ ๋ณด๊ฐ ๋ด๊ธดDataFrame
.df_summary
: ๊ฐ ํด๋ฌ์คํฐ์ ์์ฝ ์ ๋ณด๊ฐ ๋ด๊ธดDataFrame
.
-
-
3.3. ์ฌ๊ท์ ์์ฝ:
-
ํด๋ฌ์คํฐ๋ณ ์์ฝ์ ํ ๋ฒ ์ํํ ํ, ์ด๋ฅผ ๋ค์ ์์ ๋ ๋ฒจ์์ ํด๋ฌ์คํฐ๋งํ๊ณ ์์ฝํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฌธ์์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ , ๊ณ ์์ค ์์ฝ์ ์ ์ง์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ท์ ์์ฝ์ ํตํด ๋ฌธ์ ์ ์ฒด๋ฅผ ๋ ์ ์ดํดํ ์ ์๋๋ก ๋์ต๋๋ค.
1
results = recursive_embed_cluster_summarize(docs_texts, level=1, n_levels=3)
-
recursive_embed_cluster_summarize
ํจ์1 2 3
def recursive_embed_cluster_summarize( texts: List[str], level: int = 1, n_levels: int = 3 ) -> Dict[int, Tuple[pd.DataFrame, pd.DataFrame]]:
- ๊ธฐ๋ฅ: ์ฃผ์ด์ง ํ ์คํธ ๋ชฉ๋ก์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ํด๋ฌ์คํฐ๋ง๊ณผ ์์ฝ์ ์ํํ๋ ํจ์์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 3๋จ๊ณ๊น์ง ์ฌ๊ท๋ฅผ ์ํํ๋ฉฐ, ๊ฐ ๋จ๊ณ์์ ์์ฑ๋ ํด๋ฌ์คํฐ์ ์์ฝ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค.
-
์ ๋ ฅ ์ธ์:
texts
: ํด๋ฌ์คํฐ๋ง ๋ฐ ์์ฝ ๋์์ด ๋๋ ํ ์คํธ ๋ฐ์ดํฐ ๋ฆฌ์คํธ.level
: ํ์ฌ ์ฌ๊ท ์์ค์ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 1์ด๋ฉฐ, ์ฌ๊ท ํธ์ถ ์ ์ด ๊ฐ์ด ์ฆ๊ฐํฉ๋๋ค.n_levels
: ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด๋ก, ๊ธฐ๋ณธ๊ฐ์ 3์ ๋๋ค. ์ต๋ 3๋จ๊ณ๊น์ง ์ฌ๊ท์ ์ผ๋ก ํด๋ฌ์คํฐ๋ง ๋ฐ ์์ฝ์ ์ํํฉ๋๋ค.
-
์ถ๋ ฅ:
- ๊ฐ ์ฌ๊ท ๋ ๋ฒจ๋ณ ํด๋ฌ์คํฐ ๋ฐ ์์ฝ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋
Dict
. - ๊ฐ ๋ ๋ฒจ์ ๊ฒฐ๊ณผ๋ ํํ ํํ์
(df_clusters, df_summary)
.
- ๊ฐ ์ฌ๊ท ๋ ๋ฒจ๋ณ ํด๋ฌ์คํฐ ๋ฐ ์์ฝ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋
-
-
3.4. ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ:
-
๋ฒกํฐํ๋ ๋ฌธ์๋ค์ ๋ฒกํฐ ์คํ ์ด์ ์ธ๋ฑ์ฑํ์ฌ ์ฌ์ฉ์๊ฐ ์ง๋ฌธํ ๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ฐฉ๋ํ ์์ ๋ฌธ์ ์ค์์ ์ํ๋ ์ ๋ณด๋ฅผ ์ ์ํ๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค.
1 2
vectorstore = Chroma.from_texts(texts=all_texts, embedding=embd) retriever = vectorstore.as_retriever()
- ๋ฒกํฐ ์คํ ์ด๋ ๋ฌธ์์ ๋ฒกํฐํ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ฉฐ, ์๋ก์ด ์ ๋ ฅ ์ง๋ฌธ์ ๋ํด ๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ๋ฌธ์๋ค์ ๋ฐํํฉ๋๋ค.
- retriever๋ ๊ฒ์ ์์ ์ ์ฌํ ๋ฌธ์๋ฅผ ์ฐพ๋ ์ญํ ์ ํ๋ฉฐ, ๋ฒกํฐ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌธ์๋ค์ ๋ฐํํฉ๋๋ค.
-
-
3.5. RAG ์ฒด์ธ ๊ตฌ์ฑ:
-
๊ฒ์๋ ๋ฌธ์๋ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ์ ์์ฑํ๋ RAG (Retrieval-Augmented Generation) ์ฒด์ธ์ ๊ตฌ์ฑํฉ๋๋ค. RAG๋ ๊ฒ์๋ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ตฌ์ฒด์ ์ด๊ณ ๋งฅ๋ฝ์ ๋ง๋ ๋ต๋ณ์ ์์ฑํ ์ ์๋ ๋ชจ๋ธ๋ก, ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ๋งฅ์ ๋ง์ถ์ด ์ ์ ๋ฆฌํ์ฌ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค.
1 2 3 4 5 6 7
rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) rag_chain.invoke("How to define a RAG chain?")
- ์ง๋ฌธ์ ์ ๋ ฅ๋ฐ์ผ๋ฉด ๊ฒ์๋ ๋ฌธ์์ ๋ด์ฉ๊ณผ ์ง๋ฌธ์ ๊ฒฐํฉํ์ฌ ๋ฌธ์์ ์ค์ํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
- StrOutputParser๋ ์์ฑ๋ ํ ์คํธ๋ฅผ ํ์ฒ๋ฆฌํ์ฌ ๊ตฌ์กฐํ๋ ์๋ต์ ๋ฐํํฉ๋๋ค.
-
Part 14 (ColBERT)
- ์ด๋ฒ ๊ฐ์๋ ColBERT๋ผ๋ ์๋ก์ด ๊ฒ์ ๋ฐฉ๋ฒ๋ก ์ ๋ค๋ฃน๋๋ค. ColBERT๋ ๊ธฐ์กด์ ์๋ฒ ๋ฉ ๋ฐฉ์์์ ๋ฐ์ํ๋ ํ๊ณ๋ฅผ ๋ณด์ํ์ฌ, ๋ ๋์ ๋ฌธ์ ๊ฒ์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฒ ์ค๋ช ์์๋ ColBERT์ ๊ฐ๋ ๊ณผ ๊ทธ ๊ตฌํ ๋ฐฉ๋ฒ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ColBERT์ ๊ฐ๋
- ๋ค์ ํจํค์ง๋ฅผ ์ค์นํ์ ์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค:
1
! pip install -U ragatouille
1.1 ์ ํต์ ์ธ ์๋ฒ ๋ฉ ๋ฐฉ๋ฒ์ ํ๊ณ
- ๊ธฐ์กด์ ๋ฌธ์ ๊ฒ์์ ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋์ ๋ฒกํฐ๋ก ์๋ฒ ๋ฉ(embedding) ํ์ฌ ์ด๋ฅผ ์ด์ฉํ K-์ต๊ทผ์ ์ด์(K-Nearest Neighbors, KNN) ๋ฐฉ์์ผ๋ก ๊ฒ์์ ์งํํฉ๋๋ค. ์ฆ, ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋์ ๋ฒกํฐ๋ก ์ถ์ฝํ ํ, ์ง๋ฌธ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฒกํฐํํ์ฌ ๋ ๋ฒกํฐ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํด ๊ฐ์ฅ ์ ์ฌํ ๋ฌธ์๋ฅผ ์ฐพ๋ ๋ฐฉ์์
๋๋ค.
- ํ์ง๋ง ์ด ๋ฐฉ์์ ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋์ ๋ฒกํฐ๋ก ์์ถํ๋ ๊ณผ์ ์์ ๋ง์ ์ธ๋ถ ์ ๋ณด(nuance) ๋ฅผ ์์ ์ ์๋ค๋ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
1.2 ColBERT์ ํด๊ฒฐ์ฑ
- ColBERT (Contextualized Late Interaction over BERT)๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌธ์๋ฅผ ๋จ์ํ ํ๋์ ๋ฒกํฐ๋ก ์ถ์ฝํ์ง ์๊ณ , ๋ฌธ์๋ฅผ ์ฌ๋ฌ ํ ํฐ(token)์ผ๋ก ๋๋์ด ๊ฐ ํ ํฐ์ ๋ํด ๊ฐ๋ณ ์๋ฒ ๋ฉ์ ์์ฑํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ง๋ฌธ์ ๋ํด์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ฒ ๋ฉ์ ์งํํ์ฌ, ๊ฐ ์ง๋ฌธ์ ํ ํฐ๊ณผ ๋ฌธ์์ ๋ชจ๋ ํ ํฐ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค. - ๊ฐ ์ง๋ฌธ ํ ํฐ์ด ๋ฌธ์ ๋ด์์ ๊ฐ์ฅ ์ ์ฌํ ํ ํฐ์ ์ฐพ๊ณ , ์ด ์ ์ฌ๋ ๊ฐ๋ค์ ํฉ์ ์ต์ข ์ ์ผ๋ก ๋ฌธ์์ ์ง๋ฌธ ๊ฐ์ ์ ์ฌ๋๋ก ์ฌ์ฉํฉ๋๋ค.
2. ColBERT์ ๋์ ๋ฐฉ์
2.1 ํ ํฐํ ๋ฐ ์๋ฒ ๋ฉ
- ๋ฌธ์๋ฅผ ์๋ฒ ๋ฉํ ๋, ColBERT๋ ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋์ ๋ฒกํฐ๋ก ์์ถํ๋ ๋์ ํ ํฐํ(tokenization) ๋ฅผ ์งํํฉ๋๋ค. ํ ํฐ์ ๋ฌธ์์ ๊ฐ ๋จ์ด๋ ์๋ฏธ ์๋ ๋จ์๋ก ๋๋ฉ๋๋ค.
- ๊ฐ ํ ํฐ์ ๋ํด ๊ฐ๋ณ์ ์ธ ๋ฒกํฐ(์๋ฒ ๋ฉ) ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๊ฐ ํ ํฐ์ ์์น ์ ๋ณด(positional information) ๊ฐ ๋ฐ์๋ฉ๋๋ค.
2.2 ์ง๋ฌธ์ ๋ํ ์ฒ๋ฆฌ
- ์ง๋ฌธ๋ ๋ฌธ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ ํฐํ ๋ฐ ์๋ฒ ๋ฉ์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ง๋ฌธ์ ๊ฐ ํ ํฐ์ ๋ํด ์๋ฒ ๋ฉ ๋ฒกํฐ๊ฐ ์์ฑ๋๋ฉฐ, ๋ฌธ์์์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ ์ค๋น๋ฅผ ํฉ๋๋ค.
2.3 ์ ์ฌ๋ ๊ณ์ฐ
- ์ง๋ฌธ์ ๊ฐ ํ ํฐ์ ๋ํด, ๋ฌธ์์ ๋ชจ๋ ํ ํฐ๊ณผ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ฐ ์ง๋ฌธ ํ ํฐ์ ๋ํด ๋ฌธ์์์ ๊ฐ์ฅ ์ ์ฌํ ํ ํฐ์ ์ฐพ๊ณ , ์ด ์ ์ฌ๋ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
- ์ง๋ฌธ์ ๋ชจ๋ ํ ํฐ์ ๋ํด ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ ํ, ์ ์ฌ๋ ๊ฐ๋ค์ ํฉ(sum of maximum similarities) ์ ์ต์ข ์ ์ฌ๋๋ก ์ฌ์ฉํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ๋ฌธ์ ์ ์ฒด์ ์ ๋ณด๋ฅผ ํ๋๋ก ์์ถํ๋ ๋์ , ๊ฐ๊ฐ์ ์ธ๋ถ ์ ๋ณด๊ฐ ์ ์ง๋๋๋ก ํ์ฌ ๋ ์ ํํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
3. ColBERT์ ํน์ง
- ColBERT๋ ๋ฌธ์์ ์ธ๋ถ์ ์ธ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๊ธด ๋ฌธ์๋ ๋ณต์กํ ์ง๋ฌธ์ ๋ํ ๊ฒ์ ์ฑ๋ฅ์ด ๋ฐ์ด๋ฉ๋๋ค.
- ํ์ง๋ง ์ด ๋ฐฉ์์ ๋ชจ๋ ํ ํฐ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆด ์ ์์ผ๋ฉฐ, ์ค์๊ฐ ์๋ต์ด ํ์ํ ํ๊ฒฝ์์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
4. ColBERT ๊ตฌํ ์์
- ์ด์ ColBERT๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ฌ๊ธฐ์๋ RAG ๋ฐฉ์์ ColBERT๋ฅผ ์ ์ฉํ์ฌ ๋ฌธ์ ๊ฒ์์ ์ํํฉ๋๋ค.
- ๋งํฌ : https://python.langchain.com/docs/integrations/retrievers/ragatouille/
4.1 Load Pretrained Model
1
2
from ragatouille import RAGPretrainedModel
RAG = RAGPretrainedModel.from_pretrained("colbert-ir/colbertv2.0")
4.2 Load Docs from Wikipedia
- ์ด ์ฝ๋๋ ColBERT ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ Hayao Miyazaki์ Wikipedia ํ์ด์ง๋ฅผ ๊ฐ์ ธ์์ ํ ํฐํ ๋ฐ ์ธ๋ฑ์ฑ์ ์งํํ๋ ๊ณผ์ ์ ๋๋ค.
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
41
import requests
def get_wikipedia_page(title: str):
"""
Retrieve the full text content of a Wikipedia page.
:param title: str - Title of the Wikipedia page.
:return: str - Full text content of the page as raw string.
"""
# Wikipedia API endpoint
URL = "https://en.wikipedia.org/w/api.php"
# Parameters for the API request
params = {
"action": "query",
"format": "json",
"titles": title,
"prop": "extracts",
"explaintext": True,
}
# Custom User-Agent header to comply with Wikipedia's best practices
headers = {"User-Agent": "RAGatouille_tutorial/0.0.1 (ben@clavie.eu)"}
response = requests.get(URL, params=params, headers=headers)
data = response.json()
# Extracting page content
page = next(iter(data["query"]["pages"].values()))
return page["extract"] if "extract" in page else None
# Get Document
full_document = get_wikipedia_page("Hayao_Miyazaki")
# Create Index
RAG.index(
collection=[full_document],
index_name="Miyazaki-123",
max_document_length=180,
split_documents=True,
)
4.3 Search Query
- ์ด์ ๋ฌธ์์ ๋ํด ์ง๋ฌธ์ ๋์ ธ ๊ฒ์ํ๋ ๊ณผ์ ์ ์งํํ ์ ์์ต๋๋ค.
1
2
3
results = RAG.search(query="What animation studio did Miyazaki found?", k=3)
results
- ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด, โMiyazaki๊ฐ ์ค๋ฆฝํ ์ ๋๋ฉ์ด์ ์คํ๋์ค๋?โ์ด๋ผ๋ ์ง๋ฌธ์ ๋ํด ๊ด๋ จ๋ ๋ต๋ณ์ด ๊ฒ์๋ฉ๋๋ค.
4.4 Merge with LangChain
- LangChain ๋ด์์ ColBERT๋ฅผ retriever๋ก ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ ์๋ต์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
1
2
3
retriever = RAG.as_langchain_retriever(k=3)
retriever.invoke("What animation studio did Miyazaki found?")
- ์ด ์ฝ๋๋ฅผ ํตํด LangChain์์ ColBERT๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ฐํํ ์ ์์ต๋๋ค.