Study/AI

[LangChain] Hub와 RAG실습

hongeeii 2025. 8. 24.
728x90
반응형

RAG 실습하기

LangChain Hub

랭체인 프롬프트, 체인, 에이전트를 공유하고 재사용하여 개발 효율성을 높이는 협업 플랫폼
https://smith.langchain.com/hub

https://smith.langchain.com/hub/langchain-ai/retrieval-qa-chat

RAG

준비 단계.

# env에 있는 openai key 가져온다
from dotenv import load_dotenv
load_dotenv()

# gpt-4o-mini llm 모델을 만든다
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")

# HuggingFace에서 임베딩 모델을 가져온다
from langchain_huggingface import HuggingFaceEmbeddings
model_name = "klue/bert-base" # korea embedding model
hf_embeddings = HuggingFaceEmbeddings(model_name=model_name)

# 읽어올 문서를 가져온다
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

text_splitter = CharacterTextSplitter(
    separator="\n",
    chunk_size=1,
    chunk_overlap=0
)

loader = TextLoader("../docs/travel.txt", encoding="utf-8")
documents = loader.load_and_split(text_splitter=text_splitter)

# 가져온 문서를 임베딩하고 Chroma DB에 저장한다
from langchain_chroma import Chroma
db = Chroma.from_documents(documents, hf_embeddings)

# 사용자의 질문을 DB에서 검색할 검색기를 만든다.
# mmr알고리즘을 활용한 검색기를 만든다.
retriever = db.as_retriever(
    search_type="mmr",
    search_kwargs={"k":5, "fetch_k": 20, "lambda_mult": 0.5}
)

# langchain hub에서 프롬프트 템플릿을 가져온다.
from langchain import hub
propmt_templte = hub.pull("langchain-ai/retrieval-qa-chat")

# llm의 응답값에서 필요한 값만 가져올 파서를 만든다.
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser() 
 

propmt_template에는 context와 input 값을 넣어줘야한다.

사용자의 입력값을 ChromaDB에서 검색한 내용을 context에 넣고, input값에는 사용자가 입력한 값을 그대로 넣어서 질문한다.

from langchain_core.runnables import RunnablePassthrough
rag_chain = { 
    "context": retriever, # 사용자가 입력한 값을 토대로 검색된 내용을 넣음
    "input": RunnablePassthrough() # 사용자 입력값을 그대로 넣는 객체
} | propmt_templte | llm | parser

# context = retriever.invoke(question)
# input = RunnablePassthrough().invoke(question)

rag_chain.invoke("이색적인 숙소에는 어떤 곳이 있을까?")
 

=> '이색적인 숙소로는 트리하우스, 동굴 호텔, 빙하 호텔 등 독특한 숙소 경험을 제공하는 곳들이 있습니다.'

--원문 내용중 일부--
이색적인 숙소에서 머물기. 트리하우스, 동굴 호텔, 빙하 호텔 등 독특한 숙소 체험.

  • 없는 내용을 질문했을 때
rag_chain.invoke("우주의 역사에 대해서 알려줘")

=> '죄송하지만, 제공된 정보에는 "우주의 역사"에 대한 내용이 포함되어 있지 않습니다. 원하시는 다른 여행 관련 정보나 주제가 있을 경우 말씀해 주세요!'
728x90
반응형

추천 글