RAG (Retrieval-Augmented Generation) 모델은 전통적인 생성형 챗봇(Generator)에 지식 검색기(Retriever)를 결합한 하이브리드 구조입니다.
Retriever: 벡터 데이터베이스에서 관련 문서를 검색
Generator: 검색된 문서를 바탕으로 답변 생성
필요한 정보를 생성 모델이 직접 "기억"하기보다는, 외부에서 찾아와 참조하며 생성하도록 설계됨
[사용자 질문]
↓
[문장 임베딩 (Embedding)]
↓
[벡터DB에서 유사 문서 검색 (FAISS / Chroma)]
↓
[검색된 문서 + 원 질문 → LLM 입력]
↓
[생성 모델(LLM)이 답변 생성]
사용자 질문과 문서들을 수치 벡터로 표현한 뒤, 벡터 간 유사도를 바탕으로 가장 관련 있는 문서를 검색하는 시스템입니다.
| 이름 | 특징 |
|---|---|
| FAISS | Facebook 개발, 빠르고 확장성 높음 |
| Chroma | LangChain 친화적, 메타데이터 지원 |
문서 또는 질문을 수치 벡터로 변환합니다.
from langchain.embeddings import OpenAIEmbeddings
embedding = OpenAIEmbeddings()
from langchain.vectorstores import Chroma
vectordb = Chroma.from_documents(documents, embedding)
from langchain.vectorstores import FAISS
vectordb = FAISS.from_documents(documents, embedding)
사용자의 질문도 임베딩하여 벡터DB와 유사도 비교를 통해 관련 문서를 찾습니다.
retriever = vectordb.as_retriever()
related_docs = retriever.get_relevant_documents("사용자 질문")
코사인 유사도(Cosine Similarity)가 주로 사용됩니다.
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0.2)
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
import gradio as gr
with gr.Blocks() as demo:
chatbot = gr.Chatbot()
msg = gr.Textbox()
msg.submit(lambda q: qa_chain.run(q), inputs=msg, outputs=chatbot)