관리 메뉴

너와 나의 스토리

[LLM] RAG with OpenAI 쉬운 구현 방법과 설명 본문

Data Analysis/LLM

[LLM] RAG with OpenAI 쉬운 구현 방법과 설명

노는게제일좋아! 2024. 8. 10. 14:57
반응형

웹 페이지에서 데이터 가져오기

  • import 문
import bs4
from langchain import hub
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
  • WebBaseLoader 이용
    • WebBaseLoader는 특정 웹페이지의 내용을 로드하고 파싱하기 위해 설계된 클래스다.
    • bs_kwargs: HTML을 파싱할 때 사용되는 인자들을 딕셔너리 형태로 제공
    • bs4.SoupStrainer: 특정 클래스 이름을 가진 HTML 요소만 파싱하도록 지정
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()

 

데이터를 벡터 저장소에 인덱싱

  • 효율적인 검색을 위해 먼저 데이터를 적절하게 나눈다.
    • chunk_size: 각 청크의 최대 크기
    • chunk_overlap: 청크 간에 중복될 수 있는 텍스트의 길이
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
  • 임베딩 및 인덱싱
    • 나눠진 텍스트 청크를 OpenAIEmbeddings를 사용하여 임베딩하고
    • Chroma라는 벡터 저장소에 인덱싱한다.
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

 

RAG(검색 및 생성) 체인 설정

  • retriever: 벡터 저장소에서 관련 문서를 검색하기 위한 객체
  • rag_chain: 검색된 문서를 기반으로 질문에 대한 답변을 생성하는 체인
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")

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.invoke("What is Task Decomposition?")

 

 

 

 

참고

- LangGraph: https://langchain-ai.github.io/langgraph/

- Tavily: https://app.tavily.com/home

- 랭체인 입문부터 응용까지: https://wikidocs.net/book/14473

반응형
Comments