AI/Natural Language Processing

Self-RAG (실습)

Cori 2024. 7. 3. 15:15

해당 포스트는 Medium 'Florian June'이 작성한 Advanced RAG 포스트 시리즈 그 여덟번째 내용을 실제로 실습하는 과정을 정리하며, Self-RAG 관련된 여러 기법을 사용해본다. 이론적인 부분은 다음을 참고하자.

 

Self-RAG

해당 포스트는 Medium 'Florian June'이 작성한 Advanced RAG 포스트 시리즈 그 여덟번째 내용을 정리하며, ~에 대해 다루고 있다.오픈북 시험을 보는 상황에서, 우리는 크게 두 가지 전략을 사용한다.Meth

cori.tistory.com


오픈북 시험을 보는 상황에서, 우리는 크게 두 가지 전략을 사용한다.

Method #01. 익숙한 주제에 대해서는 빠르게 답하고, 익숙하지 않은 주제에 대해서는 참고서를 열어 관련 부분을 빨리 찾아서 머릿속으로 정리한 후 시험지에 답을 쓴다.

Method #02. 모든 주제에 대해 책을 참고한다. 관련 섹션을 찾아서 머릿속으로 정리한 후 시험지에 답을 쓴다.

 

방법 2는 시간이 많이 소요되고 관련 없거나 잘못된 정보를 도입할 가능성이 있으며, 이는 원래 이해했던 부분에서도 혼란과 실수를 초래할 수 있다. 방법 2는 전통적인 RAG 프로세스를 예시하고, 방법 1은 self-RAG 프로세스를 나타낸다. self-RAG는 비평 모델 C와 생성 모델 M으로 구성되어 있으며, 다음과 같이 구현할 수 있다.

 

Env Setting

from llama_index import Document, VectorStoreIndex
from llama_index.retrievers import VectorIndexRetriever
from llama_index.readers import SimpleDirectoryReader
# from llama_index.packs.self_rag import SelfRAGQueryEngine
from self_rag_pack.base import SelfRAGQueryEngine
from llama_index.query_engine import CustomQueryEngine
from pathlib import Path
import os
os.environ["OPENAI_API_KEY"] = "Your OPENAI API Key"
model_dir = './model'

처음 실행하는 경우, lSelfRAGPack을 다운받아야 한다. 이후 실행할 때에는 해당 코드를 실행하지 않아도 된다.

from llama_index.llama_pack import download_llama_pack
download_llama_pack(
    "SelfRAGPack",
    "./self_rag_pack")
# from llama_index.packs.self_rag import SelfRAGQueryEngine
# The directory where the Llama2 model was previously downloaded and saved.

Create Document & Index

테스트를 위한 문서와 인덱스를 생성하자

# Create testing documents
documents = [
    Document(text="A group of penguins, known as a 'waddle' on land, shuffled across the Antarctic ice, their tuxedo-like plumage standing out against the snow."),
    Document(text="Emperor penguins, the tallest of all penguin species, can dive deeper than any other bird, reaching depths of over 500 meters."),
    Document(text="Penguins' black and white coloring is a form of camouflage called countershading; from above, their black back blends with the ocean depths, and from below, their white belly matches the bright surface."),
    Document(text="Despite their upright stance, penguins are birds that cannot fly; their wings have evolved into flippers, making them expert swimmers."),
    Document(text="The fastest species, the Gentoo penguin, can swim up to 36 kilometers per hour, using their flippers and streamlined bodies to slice through the water."),
]
index = VectorStoreIndex.from_documents(documents)

Define Retreival & QueryEngine

추출기와 QueryEngine 또한 정의해준다.

retriever = VectorIndexRetriever(
    index=index,   # 추출 대상 인덱스 
    similarity_top_k=10,   # 유사도가 높은 10개 문서 추출
)
model_path = Path(download_dir) / "selfrag_llama2_7b.q4_k_m.gguf"
query_engine = SelfRAGQueryEngine(str(model_path), retriever, verbose=True)

질문하기

문서에서 정보를 추출할 필요가 없는 질문과, 정보를 추출해야 하는 질문 2가지를 던져보자

response = query_engine.query("Which genre the book pride and prejudice?")   # No retreival example
response2 = query_engine.query("How tall is the smallest penguins?")   # Retreival example

정보를 추출할 필요가 없는 질문은 별다른 계산 없이 응답을 생성한다. 

정보를 추출할 필요가 있는 질문 (How tall is the smallest penguins ?)은 추출기가 필요한 것을 인식하고, 주어진 여러 개의 문서를 방문한다.

주어진 Document에 대한 점수 계산을 마쳤으면, 점수가 가장 높게 나온 문서를 사용해 응답을 생성한다.