Deep Learning/NLP

RAG란? 그리고 Langchain 을 이용한 구현까지

jinmc 2024. 1. 23. 17:01
반응형

RAG란, Retrieval-Augmented Generation의 약자로, retriever(검색기) 파트와 generator(생성기) 파트로 나눠져 있습니다. retriever는 관련 정보를 Database에서 검색하고, 생성기는 이 정보를 사용하여서 최종 응답을 생성합니다. 

 

관련 링크 : https://python.langchain.com/docs/use_cases/question_answering/ 

 

Q&A with RAG | 🦜️🔗 Langchain

Overview

python.langchain.com

Indexing 이후에, (load -> split -> store)이후에, Vector Database 또는 Embedding model 에 저장한 후에, Retrieval 과 Generation을 진행합니다.

일단 필요한 library들을 import 합니다.

import bs4
from langchain import hub
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# Load, chunk and index the contents of the blog.
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
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)


rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

 여기까지가 rag_chain을 만드는 과정이었고 그 이후에는 부르면 됩니다.

rag_chain.invoke("What is Task Decomposition?")
'Task decomposition is a technique used to break down complex tasks into smaller and simpler steps. It can be done through prompting techniques like Chain of Thought or Tree of Thoughts, or by using task-specific instructions or human inputs. Task decomposition helps agents plan ahead and manage complicated tasks more effectively.'

사실 이 코드를 100% 이해한다고 보기는 어렵습니다. 하지만 할 수 있는 customization 에는, document를 webBaseLoader가 아닌 CSV에서 가져오면서 CSVLoader를 사용할 수도 있고, openAI가 아니라 다른 LLM을 사용할 수도 있습니다. 실제로 저도 GCP vertex ai를 사용하고 있구요. 

 

물론 RAG 말고도 여러가지 도입할 수 있는 늬앙스들이 많이 있지만, 오늘은 여기에서 마치도록 하겠습니다.

감사합니다.

반응형