Study/AI
[LangChain] Hub와 RAG실습
728x90
반응형
랭체인 프롬프트, 체인, 에이전트를 공유하고 재사용하여 개발 효율성을 높이는 협업 플랫폼
https://smith.langchain.com/hub
https://smith.langchain.com/hub/langchain-ai/retrieval-qa-chat
준비 단계.
# 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
반응형
'Study > AI' 카테고리의 다른 글
[LangChain] MultiQueryRetriever, 사용자 질문 확장하기 (0) | 2025.08.24 |
---|---|
[LangChain] 검색기, Retriever의 search_type, search_kwargs 알아보기 (0) | 2025.08.24 |
[LangChain] 검색기, Retriever 개념. similarity_search와 차이점 (0) | 2025.08.24 |
[LangChain] 벡터스토어(VectorStore) ChromaDB, FaissDB 저장하고 불러오기 (1) | 2025.08.21 |
[LangChain] 벡터스토어(VectorStore)란, Chroma DB (1) | 2025.08.21 |
댓글