회사의 문서로 챗봇 만들기: RAG와 Fine-Tuning 기법 완벽 가이드
안녕하세요. 파파대니입니다.
오늘은 회사의 문서를 활용하여 질문-답변을 자동으로 생성하는 방법에 대해 설명드리겠습니다.
문서 기반 챗봇을 만들기 위해서는 RAG (Retrieval-Augmented Generation) 방식과 Fine-Tuning 기법을 결합하여 사용하는 것이 효과적입니다.
Fine-Tuning만으로는 문서의 모든 내용을 완벽하게 학습시키기 어려운 점이 있지만, RAG 방식은 문서를 실시간으로 검색하여 답변을 생성할 수 있어 이를 보완할 수 있습니다.
1. Hugging Face를 활용한 문서 기반 챗봇 구축
Hugging Face는 자연어 처리(NLP) 분야에서 널리 사용되는 라이브러리로, 다양한 사전 학습된 모델을 제공하여 텍스트 분류, 질문-답변, 텍스트 생성 등 여러 작업을 수행할 수 있습니다.
이 라이브러리는 Fine-Tuning과 RAG (Retrieval-Augmented Generation) 방식 모두를 지원하여, 사용자가 특정 도메인에 최적화된 모델을 손쉽게 구축할 수 있게 도와줍니다.
- Fine-Tuning: 사전 학습된 모델을 회사의 문서나 특정 데이터를 기반으로 학습시켜, 해당 도메인에 맞는 성능을 발휘하도록 할 수 있습니다.
- RAG: 실시간으로 외부 문서를 검색하고, 검색된 문서를 기반으로 유연한 답변을 생성하는 방식입니다.
Hugging Face의 transformers 라이브러리에서는 두 가지 기법을 모두 지원하여, 회사의 문서에 적합한 고도화된 챗봇 시스템을 손쉽게 구축할 수 있습니다.
2. 문서를 바탕으로 질문-답변 자동 생성하기
2.1. 문서를 Fine-Tuning으로 활용하기
Fine-Tuning을 사용하여 문서 기반의 챗봇을 만드는 과정은 크게 데이터 준비, 모델 준비, 학습, 평가의 단계로 나눠집니다.
2.1.1 데이터셋 준비
우선, 회사의 FAQ 문서를 질문-답변 형식으로 변환한 데이터를 준비해야 합니다.
아래 예시 코드에서는 간단한 질문-답변 데이터를 생성합니다.
from datasets import Dataset
# 예시 문서에서 질문-답변 쌍을 생성한 데이터
data = {
"question": [
"근무 시간은 어떻게 되나요?",
"휴가 정책은 무엇인가요?",
"급여는 어떻게 결정되나요?"
],
"answer": [
"근무 시간은 오전 9시부터 오후 6시까지입니다.",
"연차는 매년 15일 제공됩니다.",
"급여는 업무 성과에 따라 결정됩니다."
]
}
# 데이터셋 생성
dataset = Dataset.from_dict(data)
2.1.2 Fine-Tuning 모델 준비
이제 사전 학습된 BERT 모델을 불러와 질문-답변 형식으로 Fine-Tuning을 진행합니다.
이를 위해 토크나이저와 모델을 설정하고 훈련 인자를 정의합니다.
from transformers import BertTokenizer, BertForQuestionAnswering, Trainer, TrainingArguments
# BERT 토크나이저 불러오기
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 토큰화 함수 정의
def tokenize_function(examples):
return tokenizer(examples["question"], examples["answer"], padding="max_length", truncation=True)
# 데이터셋에 토크나이저 적용
tokenized_dataset = dataset.map(tokenize_function, batched=True)
# 모델 준비
model = BertForQuestionAnswering.from_pretrained("bert-base-uncased")
# 훈련 인자 설정
training_args = TrainingArguments(
output_dir="./results", # 결과 출력 폴더
evaluation_strategy="epoch", # 평가 전략
per_device_train_batch_size=8, # 배치 사이즈
num_train_epochs=3, # 학습 에폭 수
)
# Trainer 객체 설정
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
# Fine-Tuning 시작
trainer.train()
2.1.3 모델 평가 및 예측
Fine-Tuning이 완료되면, 모델을 평가하고 새로운 질문에 대해 답변을 생성할 수 있습니다.
# 모델 평가
results = trainer.evaluate()
print(results)
# 새로운 질문에 대한 예측
inputs = tokenizer("근무 시간은 어떻게 되나요?", return_tensors="pt")
outputs = model(**inputs)
# 예측된 답변
start_position = outputs.start_logits.argmax()
end_position = outputs.end_logits.argmax()
answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][start_position:end_position+1]))
print(f"예측된 답변: {answer}")
2.2. 문서를 RAG로 활용하기
RAG 방식은 문서 검색과 답변 생성을 결합한 방식으로, 실시간 문서 검색 후 관련 정보를 바탕으로 답변을 생성합니다.
아래는 문서를 벡터화하여 검색하고, 관련 문서에서 답변을 생성하는 과정입니다.
2.2.1 문서 벡터화 및 검색 준비
먼저, sentence-transformers 모델을 사용하여 문서를 벡터화합니다.
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 문서 샘플
documents = [
"우리 회사는 AI 챗봇 솔루션을 제공하며, 주요 제품으로는 고객 상담 자동화 시스템이 있습니다.",
"근무 시간은 오전 9시부터 오후 6시까지이며, 주 5일 근무제입니다.",
"고객 지원은 이메일과 전화로 지원되며, 평균 응답 시간은 24시간입니다."
]
# 문서 벡터화
model = SentenceTransformer('all-MiniLM-L6-v2')
document_embeddings = model.encode(documents, convert_to_tensor=True)
# 벡터화된 문서 출력 (예시)
print(f"문서 벡터화: {document_embeddings}")
2.2.2 사용자 질문 벡터화 및 유사한 문서 검색
사용자 질문을 벡터화하고, cosine similarity를 사용해 가장 유사한 문서를 찾습니다.
# 사용자 질문
question = "근무 조건은 어떻게 되나요?"
# 사용자 질문 벡터화
question_embedding = model.encode([question], convert_to_tensor=True)
# 문서와 질문 벡터의 유사도 계산
cosine_similarities = cosine_similarity(question_embedding, document_embeddings)
# 가장 유사한 문서 찾기
most_similar_document_idx = np.argmax(cosine_similarities)
print(f"가장 유사한 문서: {documents[most_similar_document_idx]}")
2.2.3 문서 기반 답변 생성
RAG 모델을 활용하여 해당 문서에서 답변을 생성합니다.
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
# RAG 모델 로드
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq")
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="retrieval-qa", use_dummy_dataset=True)
model = RagSequenceForGeneration.from_pretrained("facebook/rag-token-nq")
# 사용자 질문에 대해 가장 관련성 높은 문서를 검색하고, 답변 생성
inputs = tokenizer(question, return_tensors="pt")
input_ids = inputs['input_ids']
# RAG 모델로 답변 생성
generated = model.generate(input_ids=input_ids, num_beams=5, max_length=50)
# 답변 디코딩
answer = tokenizer.decode(generated[0], skip_special_tokens=True)
# 결과 출력
print(f"답변: {answer}")
2.3. Fine-Tuning과 RAG 결합
Fine-Tuning과 RAG를 결합하면 다음과 같은 방식으로 운영할 수 있습니다:
- Fine-Tuning: 주요 질문-답변 데이터를 모델에 학습시켜 특정 도메인에 최적화.
- RAG: 모델이 알지 못하는 실시간 문서 데이터를 검색하고 답변을 생성.
# 1단계: Fine-Tuning된 모델로 기본적인 질문-답변 처리
def get_answer_from_finetuned_model(question, context):
inputs = tokenizer(question, context, return_tensors='pt')
outputs = model(**inputs)
answer = tokenizer.decode(outputs.start_logits.argmax(), outputs.end_logits.argmax())
return answer
# 2단계: RAG 방식으로 관련 문서 검색
def get_answer_from_rag(question):
question_embedding = get_embeddings(question)
cosine_similarities = cosine_similarity([question_embedding], document_embeddings)
most_similar_document_idx = np.argmax(cosine_similarities)
relevant_document = documents[most_similar_document_idx]
# Fine-Tuning된 모델로 해당 문서에서 답변 추출
answer = get_answer_from_finetuned_model(question, relevant_document)
return answer
# 테스트
user_question = "근무 조건은 어떻게 되나요?"
answer = get_answer_from_rag(user_question)
print(f"답변: {answer}")
이번 가이드에서는 Hugging Face의 Fine-Tuning과 RAG 방식을 활용해 회사의 문서를 학습시켜 질문-답변을 생성하는 방법을 소개했습니다.
Fine-Tuning을 통해 모델을 특정 도메인에 맞게 최적화하고, RAG 방식을 이용하여 실시간으로 문서를 검색하고 답변을 생성함으로써, 보다 정확하고 유연한 챗봇 시스템을 구축할 수 있습니다.
이 두 기법을 적절히 결합하여 기업 맞춤형 AI 챗봇을 구축해 보세요!
⬇️ 참고하면 좋은 글 ⬇️
외부 API 없이 문서 기반 AI 챗봇 만들기 (Hugging Face 활용)
외부 API 없이 문서 기반 AI 챗봇 만들기 (Hugging Face 활용)
외부 API 없이 문서 기반 AI 챗봇 만들기 (Hugging Face 활용) 안녕하세요. 파파대니입니다.최근 인공지능 기술이 급격히 발전하면서, 챗봇은 다양한 분야에서 중요한 도구로 자리 잡고 있습니다. 그
papa-danny.tistory.com
생성형 AI와 대화형 AI 차이: 무엇이 다를까?
생성형 AI와 대화형 AI 차이: 무엇이 다를까? 안녕하세요. 파파대니입니다.최근 인공지능(AI) 기술이 빠르게 발전하면서 다양한 분야에서 생성형 AI와 대화형 AI가 주목받고 있습니다. 하지만 이 두
papa-danny.tistory.com
RAG와 Fine-tuning: 생성형 AI와 대화형 AI 모두 활용 가능한 기술
RAG와 Fine-tuning: 생성형 AI와 대화형 AI 모두 활용 가능한 기술
RAG와 Fine-tuning: 생성형 AI와 대화형 AI 모두 활용 가능한 기술 안녕하세요. 파파대니입니다.RAG(Retrieval-Augmented Generation)와 Fine-tuning은 생성형 AI와 대화형 AI 모두에 활용할 수 있는 기술이며, 특정 AI
papa-danny.tistory.com