Retrieval Chain
어떤 특정한 질문에 올바르게 대답하려면 LLM에 추가 컨텍스트를 제공해야 합니다. 추가적인 탐색을 통해 이를 수행할 수 있습니다. 이때 Retrieval을 쓰며 이는 LLM에 직접 전달하기에는 데이터가 너무 많은 경우에 유용합니다. 그런 다음 검색기를 사용하여 가장 관련성이 높은 부분만 가져와서 전달할 수 있습니다.
이 과정에서 우리는 Retriever로부터 관련 문서를 조회한 후 이를 프롬프트에 전달합니다. Retriever 는 SQL 테이블, 인터넷 등 무엇이든 지원될 수 있지만 이 경우 Vector Store를 채워 이를 Retriever 로 사용하겠습니다.
$ pip install langchain-community
$ pip install beautifulsoup4
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide")
docs = loader.load()
적절한 환경 변수 세트가 설치되어 있는 `langchain_openai` 패키지가 있는지 확인하세요(이것은 LLM에 필요한 것과 동일합니다).
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
이제 이 임베딩 모델을 사용하여 문서를 ventor Store에 수집할 수 있습니다. 단순화를 위해 간단한 로컬 Vector Store인 FAISS를 사용하겠습니다.
$ pip install faiss-cpu
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
이제 이 데이터를 Vector Store에 색인화했으므로 검색 체인을 생성하겠습니다. 이 체인은 들어오는 질문을 받아 관련 문서를 찾은 다음 해당 문서를 원래 질문과 함께 LLM에 전달하고 원래 질문에 답하도록 요청합니다.
먼저 질문과 검색된 문서를 가져와 답변을 생성하는 체인을 설정해 보겠습니다.
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input}""")
document_chain = create_stuff_documents_chain(llm, prompt)
우리는 방금 설정한 검색기에서 먼저 문서를 가져오길 원합니다. 이렇게 하면 검색기를 사용하여 가장 관련성이 높은 문서를 동적으로 선택하고 주어진 질문에 해당 문서를 전달할 수 있습니다.
from langchain.chains import create_retrieval_chain
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input": "how can langsmith help with testing?"})
print(response["answer"])
전체코드
import os
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import WebBaseLoader
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from time import sleep
from langchain_openai import OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_retrieval_chain
os.environ['OPENAI_API_KEY'] = 'sk-proj-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
llm = ChatOpenAI()
loader = WebBaseLoader("https://en.wikipedia.org/wiki/HTML")
# sleep(3)
docs = loader.load()
embeddings = OpenAIEmbeddings()
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input}""")
document_chain = create_stuff_documents_chain(llm, prompt)
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input": "What is HTML?"})
print(response["answer"])
'AI * ML' 카테고리의 다른 글
LangChain 시작하기 - Agent에 대해서 (0) | 2024.06.29 |
---|---|
LangChain 시작하기 - 대화내용을 Context로 가지는 Retriever 설정 (0) | 2024.06.23 |
Foundation Models 이란? 그리고 FMops란? (0) | 2024.06.16 |
LangChain 시작하기 (0) | 2024.06.11 |
Kubernetes용 생성 AI: K8sGPT 오픈 소스 프로젝트 (0) | 2024.06.09 |