반응형
RAG의 기본 개념
RAG는 크게 두 가지 주요 구성 요소로 나눌 수 있습니다:
- Retrieval (검색): 외부 데이터베이스나 문서에서 관련 정보를 검색하는 단계입니다. 이는 특정 질문에 답변하기 위해 필요한 정보를 찾는 과정입니다. 검색 단계는 일반적으로 'Dense Retrieval' 또는 'Sparse Retrieval' 방식으로 이루어지며, 전자는 BERT와 같은 임베딩 기반 검색 방식을, 후자는 전통적인 TF-IDF나 BM25와 같은 방식으로 수행됩니다.
- Generation (생성): 검색된 정보를 바탕으로 답변을 생성하는 단계입니다. 이 과정에서 대형 언어 모델(예: GPT, BERT 등)이 사용되며, 검색된 정보와 질문을 결합하여 최종 답변을 생성합니다.
RAG의 구조
RAG는 두 가지 구조로 나뉩니다:
- RAG-Sequence: 검색된 정보를 순차적으로 처리하여 최종 답변을 생성합니다. 이 구조는 검색된 정보를 하나의 문장 또는 문단처럼 처리하여 답변을 생성하기 때문에 좀 더 긴밀한 문맥을 제공합니다.
- RAG-Token: 검색된 정보를 토큰 단위로 처리하여 답변을 생성합니다. 이 구조는 더 세밀한 정보 통합이 가능하지만, 처리 과정이 더 복잡할 수 있습니다.
728x90
RAG의 장점
- 정보 풍부성: RAG는 언어 모델 자체의 제한된 정보량을 극복할 수 있도록 돕습니다. 최신 정보나 모델 훈련에 포함되지 않은 데이터를 실시간으로 반영할 수 있습니다.
- 정확성 향상: 검색된 관련 정보는 모델이 더 정확하고 맥락에 맞는 응답을 생성할 수 있도록 돕습니다. 특히 특정 도메인이나 전문 지식이 필요한 질문에 유용합니다.
- 모델 경량화: 외부 지식을 활용함으로써 모델 자체를 경량화할 수 있습니다. 모든 정보를 모델에 내장하지 않아도 되기 때문에 훈련 데이터의 범위를 줄이고 모델 크기를 줄일 수 있습니다.
RAG의 응용 분야
RAG는 다음과 같은 다양한 분야에 응용될 수 있습니다:
- 고급 챗봇: 고객 지원, 교육, 헬스케어와 같은 분야에서 사용되는 챗봇은 RAG를 통해 더 나은 답변을 제공할 수 있습니다.
- 문서 요약: 대형 문서나 논문에서 핵심 정보를 추출하고 요약할 때 RAG가 사용될 수 있습니다.
- 질의응답 시스템: 특정 도메인(예: 법률, 의학 등)에서 전문적인 질의응답 시스템을 구축하는 데 적합합니다.
RAG의 동작 시나리오
질문: "엘론 머스크가 최근에 발표한 신기술은 무엇인가요?"외부 지식: 엘론 머스크에 대한 최신 뉴스를 포함한 데이터베이스나 문서들이 있다고 가정합니다.
RAG의 단계별 처리 예시
1. Retrieval (검색 단계)
먼저, 질문과 관련된 문서를 데이터베이스에서 검색합니다. 검색된 결과는 다음과 같을 수 있습니다:
문서 1: "2024년 8월, 엘론 머스크는 스타링크를 통해 전 세계 어디서나 초고속 인터넷을 제공하는 프로젝트를 발표했습니다."문서 2: "엘론 머스크는 최근 Neuralink의 뇌-컴퓨터 인터페이스 기술을 통해 인간의 뇌 기능을 확장하는 연구 결과를 발표했습니다."
2. Generation (생성 단계)
검색된 문서들(문서 1, 문서 2)을 기반으로 언어 모델이 답변을 생성합니다. 이 과정에서 모델은 질문과 검색된 정보를 결합하여 최종 응답을 만들어냅니다.
응답: "엘론 머스크는 최근 Neuralink의 뇌-컴퓨터 인터페이스 기술을 발표했으며, 또한 스타링크를 통해 전 세계 어디서나 초고속 인터넷을 제공하는 프로젝트를 소개했습니다."
RAG의 동작 시나리오 - 코드
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import openai
# 0. OpenAI API 키 설정
openai.api_key = os.getenv("OPENAI_API_KEY")
# 1. 데이터 준비 => pdf나 doc 파서를 붙이면 더 좋습니다.
documents = [
"2024년 8월, 엘론 머스크는 스타링크를 통해 전 세계 어디서나 초고속 인터넷을 제공하는 프로젝트를 발표했습니다.",
"엘론 머스크는 최근 Neuralink의 뇌-컴퓨터 인터페이스 기술을 통해 인간의 뇌 기능을 확장하는 연구 결과를 발표했습니다.",
"테슬라는 새로운 배터리 기술을 발표하여 전기차의 주행거리를 대폭 늘렸습니다.",
"스페이스X는 화성 식민지 건설을 위한 새로운 로켓 엔진을 개발했습니다."
]
# 2. TF-IDF 벡터화
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
# 3. 검색 함수
def retrieve(query, documents):
query_vec = vectorizer.transform([query])
cosine_similarities = cosine_similarity(query_vec, tfidf_matrix).flatten()
related_docs_indices = cosine_similarities.argsort()[-2:][::-1]
return [documents[i] for i in related_docs_indices]
# 4. 텍스트 생성 함수 (OpenAI GPT-4o-mini 사용)
def generate_answer(question, retrieved_docs):
context = " ".join(retrieved_docs)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Question: {question}\nContext: {context}\nAnswer:"}
]
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=messages,
temperature=0.7
)
answer = response['choices'][0]['message']['content']
return answer
# 5. RAG 실행
question = "엘론 머스크가 최근에 발표한 신기술은 무엇인가요?"
retrieved_docs = retrieve(question, documents)
answer = generate_answer(question, retrieved_docs)
print("Generated Answer:", answer)
각 코드의 역할
1) retrieve 함수
- 역할:
- 텍스트 검색: 이 함수는 사용자가 입력한 query(질문)와 사전에 준비된 documents(문서들) 사이의 유사도를 측정하여 가장 관련성이 높은 문서들을 검색합니다.
- TF-IDF 및 코사인 유사도: query와 문서들을 TF-IDF로 벡터화한 후, 코사인 유사도를 사용해 유사성을 계산합니다.
- 관련 문서 선택: 유사도가 가장 높은 상위 2개의 문서를 반환합니다.
- 주요 기능:
- 검색 단계의 핵심으로, 모델이 답변을 생성할 때 사용할 컨텍스트를 제공하기 위해 관련 문서를 선택합니다.
2) generate_answer 함수
- 역할:
- 답변 생성: 이 함수는 retrieve 함수에서 얻은 관련 문서들을 기반으로, OpenAI의 GPT-4o-mini 모델을 사용해 질문에 대한 답변을 생성합니다.
- 문맥 설정: 검색된 문서들을 하나의 컨텍스트로 결합하여, AI 모델이 답변을 생성할 때 참조할 수 있는 정보를 제공합니다.
- API 호출: OpenAI의 ChatCompletion API를 호출하여 생성된 답변을 반환합니다.
- 주요 기능:
- 생성 단계의 핵심으로, 검색된 문서들을 바탕으로 질문에 대한 자연스러운 답변을 생성합니다.
3) 전체 흐름 정리
- 질문 입력: 사용자는 질문을 입력합니다.
- 검색 (retrieve 함수): 입력된 질문과 관련된 문서들을 검색합니다. 이 단계는 RAG의 Retrieval 부분을 담당합니다.
- 답변 생성 (generate_answer 함수): 검색된 문서들과 질문을 바탕으로 OpenAI 모델을 사용해 답변을 생성합니다. 이 단계는 RAG의 Generation 부분을 담당합니다.
- 답변 출력: 최종적으로 생성된 답변이 사용자에게 출력됩니다.
코드 실행 결과
결론
RAG는 언어 모델의 능력을 실질적으로 확장시켜주는 중요한 기술로, 기존 언어 모델의 한계를 극복하는 데 기여합니다.
RAG를 통해 더 풍부하고 정확한 정보 제공이 가능해지며, 이는 다양한 산업과 응용 분야에서 활용될 수 있습니다.
앞으로 RAG 기술은 더욱 발전하여, 더욱 정교하고 유연한 NLP 솔루션을 제공할 것으로 기대됩니다.
반응형
'개발 > AI' 카테고리의 다른 글
Llama-3.2-1B-Instruction 모델 파인튜닝하기 (4) | 2024.10.02 |
---|---|
PPT 슬라이드를 Vision-Language 모델로 해석하기 (3) | 2024.09.24 |
[공부] 한국어 벡터 임베딩 (0) | 2024.08.14 |
[공부] RAG를 위한 벡터 임베딩 (0) | 2024.08.13 |
Streamlit과 OpenAI API를 활용한 아기 이름 추천 서비스 개발기 (0) | 2024.08.09 |