AI/NLP

NLP-RAG : 검색 증강 생성 모델

우당탕탕인생기 2024. 3. 13. 23:06

 

기존 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