검색증강(RetrievalQA) 체인
•
대규모 언어 모델(LLM)을 활용하여 방대한 문서 내에서 특정 질문에 대한 답을 검색하고 제공하는 시스템
•
검색 증강 생성을 사용하여 데이터 소스에 대해 자연어 질의응답을 수행한다.
•
이점
◦
더 쉬운 사용자 지정: 프롬프트 및 문서 형식 지정 방법과 같은 세부 사항은 RetrievalQA Chain의 특정 매개변수를 통해서만 구성할 수 있다.
◦
더 쉽게 소스 문서를 반환
◦
스트리밍 및 비동기 작업과 같은 실행 가능한 메서드 지원
동작 과정
1. Document Loading (문서 로딩)
•
분석하고자 하는 문서를 로드하는 과정이다.
•
데이터 소스는 URL, PDF 파일, 데이터베이스 등 다양한 형식을 포함할 수 있다.
•
사용자가 질문할 수 있는 전체 문서의 데이터를 한곳에 모아 준비하는 단계이다.
2. Splitting (문서 분할)
•
로드된 문서는 작은 단위로 분할된다.
•
이러한 작은 조각(Splits)들은 문서의 일부이며, 각 조각은 모델이 다루기 쉬운 크기로 나누어진다.
•
긴 문서를 여러 조각으로 나누어 검색의 효율성을 높이고, 이후 검색 단계에서 특정 질문과 관련된 정보를 빠르게 찾을 수 있도록 돕는다.
3. Storage (저장)
•
나누어진 문서 조각들은 Vectorstore라는 벡터화된 데이터 저장소에 저장된다.
•
각 조각은 텍스트 데이터를 벡터 형태로 변환하여 저장하며, 이러한 벡터는 이후 검색의 기반이 된다.
•
사용자의 쿼리와 관련된 조각을 신속하게 검색할 수 있도록 각 문서 조각을 벡터 형태로 저장한다.
4. Retrieval (검색)
•
사용자가 질문(쿼리)을 입력하면, Vectorstore에서 해당 질문과 유사한 문서 조각을 검색한다.
•
이 단계에서 쿼리와 가장 유사도가 높은 조각들을 찾아내며, 이를 Relevant Splits라고 부른다.
•
사용자의 질문과 관련성이 높은 정보를 빠르게 찾고, LLM이 정확한 답변을 생성할 수 있도록 필요한 데이터를 제공한다.
5. Output (출력)
•
검색된 조각들(Relevant Splits)을 활용하여 Prompt가 생성되고, 이를 대규모 언어 모델(LLM)에 전달한다.
•
LLM은 이 프롬프트를 기반으로 사용자의 질문에 대한 응답을 생성하며, 최종적인 답변이 사용자에게 반환된다.
실습
기본 세팅
설치
•
해당 과정은 cpu를 사용해서 진행하여서 faiss-cpu 모듈을 사용하였다.
!pip install -U langchain langchain-community langchain-core langchain-openai langgraph faiss-cpu
Python
복사
Key 등록
•
아래 방법이나 .env에 정의하자.
import os
os.environ['OPENAI_API_KEY'] = '여기에 사용하는 키 입력'
Python
복사
Document Loading (문서 로딩) & 모듈 불러오기
# Load docs
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()
> data
[Document(metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': "LLM Powered Autonomous Agents | Lil'Log", 'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, e...
Python
복사
Split
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
> all_splits # 리스트 형태로 각각 분할
[Document(metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': "LLM Powered Autonomous Agents | Lil'Log", 'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\nAgent System Overview In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:', 'language': 'en'}, page_content="LLM Powered Autonomous Agents | Lil'Log\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nLil'Log\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPosts\n\n\n\n\nArchive\n\n\n\n\nSearch\n\n\n\n\nTags\n\n\n\n\nFAQ\n\n\n\n\nemojisearch.app\n\n\n\n\n\n\n\n\n\n LLM Powered Autonomous Agents\n \nDate: June 23, 2023 | Estimated Reading Time: 31 min | Author: Lilian Weng\n\n\n \n\n\nTable of Contents\n\n\n\nAgent System Overview\n\nComponent One: Planning\n\nTask Decomposition\n\nSelf-Reflection\n\n\nComponent Two: Memory\n\nTypes of Memory\n\nMaximum Inner Product Search (MIPS)"),
Document(metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': "LLM Powered Autonomous Agents | Lil'Log", 'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\nAgent System Overview In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:', 'language': 'en'}, page_content='Component Three: Tool Use\n\nCase Studies\n\nScientific Discovery Agent\n\nGenerative Agents Simulation\n\nProof-of-Concept Examples\n\n\nChallenges\n\nCitation\n\nReferences'),
Document(metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'title': "LLM Powered Autonomous Agents | Lil'Log", 'description': 'Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\nAgent System Overview In a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:', 'language': 'en'}, page_content='Building agents with LLM (large language model) as its core controller is a cool concept. Several proof-of-concepts demos, such as AutoGPT, GPT-Engineer and BabyAGI, serve as inspiring examples. The potentiality of LLM extends beyond generating well-written copies, stories, essays and programs; it can be framed as a powerful general problem solver.\nAgent System Overview#\nIn a LLM-powered autonomous agent system, LLM functions as the agent’s brain, complemented by several key components:'),
Python
복사
Store Splits - FAISS
vectorstore = FAISS.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
Python
복사
LLM 모델 정의
llm = ChatOpenAI(model="gpt-4o-mini")
Python
복사
LCEL
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# See full prompt at https://smith.langchain.com/hub/rlm/rag-prompt
prompt = hub.pull("rlm/rag-prompt")
> prompt
ChatPromptTemplate(input_variables=['context', 'question'], input_types={}, partial_variables={}, metadata={'lc_hub_owner': 'rlm', 'lc_hub_repo': 'rag-prompt', 'lc_hub_commit_hash': '50442af133e61576e74536c6556cefe1fac147cad032f4377b60c436e6cdcb6e'}, messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['context', 'question'], input_types={}, partial_variables={}, template="You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.\nQuestion: {question} \nContext: {context} \nAnswer:"), additional_kwargs={})])
Python
복사
Chain
RAG
from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
# See full prompt at https://smith.langchain.com/hub/langchain-ai/retrieval-qa-chat
retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
> retrieval_qa_chat_prompt
ChatPromptTemplate(input_variables=['context', 'input'], optional_variables=['chat_history'], input_types={'chat_history': list[typing.Annotated[typing.Union[typing.Annotated[langchain_core.messages.ai.AIMessage, Tag(tag='ai')], typing.Annotated[langchain_core.messages.human.HumanMessage, Tag(tag='human')
Python
복사
combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
rag_chain = create_retrieval_chain(vectorstore.as_retriever(), combine_docs_chain)
res = rag_chain.invoke({"input": "What are autonomous agents?"})
> res.keys()
dict_keys(['input', 'context', 'answer'])
> res['input']
What are autonomous agents?
> res['answer']
Autonomous agents are systems or entities that can operate independently to perform tasks or make decisions without human intervention. In the context of scientific discovery, LLM-empowered autonomou...
> res['context']
Python
복사