기존 Chatbot의 문제점
- 기존 Chatbot의 경우 pre-trained된 모델을 fine-tuning을 통해서 도메인에 특화된 chatbot을 많이 만드는 기법을 사용하여 좋은 결과를 만들어 낸다.
- 하지만 이 기법의 경우 학습 데이터 기반으로 정확한 대답을 추론하지만, 새로운 지식이 업데이트되거나 학습데이터 이외의 질문이 들어올 경우 정확한 대답을 하지 못하는 문제점이 있다.
RAG란
- 이를 해결하기 위해 나온것이 바로 RAG (Retrieval Augmented Generation) - 검색증강생성 모델이다.
- 쉽게 말해 학습데이터가 아닌 외부 데이터베이스에 접근하여 정보를 얻고 대답을 하는 방식이다.
- 그 결과 모델은 더욱 정확하고 최신의 정보를 대답할 수 있게 된다.
- 질문에 대해 document index에 접근하여 답변을 생성해간다.
RAG의 이점
- 최신의 정확한 응답을 제공할 수 있게된다.
- 할루시네이션 현상이 감소한다.
- 학습하는데 많은 리소스가 필요없어 탁월한 효율성과 비용 효과성을가지게된다.
Langchain 구현
해당 RAG 모델은 Langchain을 통해서 구현 가능 하다.
docs = loader.load() ### 외부 학습데이터 load
### 외부 학습데이터 분리
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
### vector db 저장
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
## 이때 챗봇은 gpt 3.5 turbo로 사용
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
## ragchain 구성
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| llm ## 챗봇 모델
| StrOutputParser() ## 해당 답변을 str타입으로
)
## 답변 추론
rag_chain.invoke("RAG가 뭐야?")
이외에 RAG을 답변의 퍼포먼스를 높히기 위해서는 parent-document 나 multi query , ensemble retriever 등 다양한 방법들이 있는데 이는 다음 포스트에 이어서 진행하겠다.
'AI > NLP' 카테고리의 다른 글
NLP - seq2seq (1) | 2023.12.27 |
---|---|
NLP - RNN , LSTM (1) | 2023.12.27 |
NLP- LM(N-gram) (0) | 2023.12.21 |
NLP - word embedding (0) | 2023.12.20 |
NLP - BoW , N-gram, TF-IDF (0) | 2023.12.20 |