소개
RAG는 검색-증강 세대(Retrieval-Augmented Generation)를 의미합니다. 이러한 애플리케이션은 LLM(대형 언어 모델)을 자체 애플리케이션에 통합하는 데 사용됩니다. RAG 애플리케이션 LLM, 프롬프트, 자체(.pdf) 파일일 수 있는 사용자 데이터 및 쿼리 기록을 통합하여 LLM에 사용자 쿼리를 기반으로 특정 출력이나 답변을 요청합니다.
왜 RAG 애플리케이션인가?
RAG 애플리케이션은 주로 최신 정보를 제공하고, 특정 주제 및 사물에 대한 관련 정보를 제공하고, RAG 애플리케이션에 제공한 특정 리소스를 기반으로 주제에 대한 사용자에게 답변을 제공하기 위해 대규모 언어 모델을 사용자 정의하는 데 사용됩니다.
RAG 시스템을 구축하는 방법은 무엇입니까?
여기서는 업로드한 PDF를 기반으로 답변하는 PDF 챗봇을 구축하기 위해 OpenAI, langchain, FAISS를 사용할 예정이며, 오픈 소스 Python 라이브러리인 streamlit을 사용하여 개발자가 매력적인 사용자 인터페이스를 구축할 수 있습니다. Streamlit은 특히 프런트 엔드 지식이 없는 사람들이 자신의 코드를 웹 애플리케이션에 넣을 수 있는 가장 쉬운 방법입니다. 프런트 엔드(html, js, css) 경험이나 지식이 필요하지 않습니다.
랭체인
langchain은 대규모 언어 모델을 사용하여 응용 프로그램 시스템 생성을 단순화하는 데 사용되는 오픈 소스 Python 프레임워크이며 LLM API를 통합하고 사용자 데이터를 프롬프트하고 함께 연결하여 시스템을 구축하는 데 사용됩니다.langchain에는 다음과 같은 5가지 다양한 기능이 있습니다.
- Models -> LLM, 채팅 모델, 텍스트 임베딩 모델
- Chains -> Prompts|llm|outputparsers와 같은 20개 이상의 애플리케이션별 체인
- Prompts -> 프롬프트 템플릿, 출력 파서, 예제 선택기
- Indexes -> 문서 로더, 텍스트 분할기, 검색기, 벡터 저장소
- Agents -> LLM이 도구를 사용하기 위한 알고리즘
OpenAI LLM
OpenAI는 openAI API를 지정하여 langchain 모델을 통해 자체 애플리케이션과 연결할 수 있는 *gpt-3.5-turbo*인 LLM을 무료로 제공합니다. gpt-3.5-turbo 모델을 사용하려면 새 openai 계정을 만들고 새 API를 만들고 나중에 애플리케이션에서 사용할 비밀 키를 가져와야 합니다.
FAISS
FAISS는 문서에 대한 임베딩을 생성하고 문서 내 문장의 임베딩 또는 벡터 형식인 문서에 대해 유사성 검색 작업을 수행하는 데 사용되는 Facebook AI 유사성 검색의 라이브러리입니다.langchain은 우리에서 사용할 faiss 모듈을 제공합니다. 애플리케이션.
streamlit, Openai LLM, FAISS, Langchain을 사용하여 RAG 구현
첫 번째 단계로 종속성 설치 및 확인!
% pip list
...
langchain 0.1.16
langchain-community 0.0.34
langchain-core 0.1.46
langchain-openai 0.1.3
langchain-text-splitters 0.0.1
langchainhub 0.1.15
langdetect 1.0.9
langserve 0.0.51
langsmith 0.1.47
...
streamlit 1.33.0
...
pypdf 4.2.0
pypdfium2 4.29.0
...
%
애플리케이션을 구현하기 위해 이 아키텍처
다음의 작업을 위한 파일들 생성 (vector_loader.py, streamlit_app.py)
- Load our pdf
- Convert the pdf into chunks
- Embedding of the chunks
Vector_loader.py
#import Essential dependencies
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
import os
from dotenv import load_dotenv
load_dotenv()
#create a new file named vectorstore in your current directory.
if __name__=="__main__":
DB_FAISS_PATH = 'vectorstore/db_faiss'
loader=PyPDFLoader("./random machine learing pdf.pdf")
docs=loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = FAISS.from_documents(documents=splits, embedding=OpenAIEmbeddings())
vectorstore.save_local(DB_FAISS_PATH)
PyPDFLoader()를 사용하여 데이터를 로드하고 RecursiveCharacterTextSplitter()를 사용하여 청크로 만들고 OpenaiEmbeddings()를 사용하여 청크를 포함했습니다.
PyPDFLoader
"python vector_loader.py" 명령을 사용하여 이 파일을 실행하면 현재 디렉터리에 vectorstore라는 새 파일이 생성됩니다.
% python vector_loader.py
% tree vectorstore
vectorstore
`-- db_faiss
|-- index.faiss
`-- index.pkl
1 directory, 2 files
%
streamlit_app.py
Streamlit 앱에서 .faiss 벡터베이스를 로드하는 함수를 정의할 차례입니다.
#Import Dependencies
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
#function to load the vectordatabase
def load_knowledgeBase():
embeddings=OpenAIEmbeddings()
DB_FAISS_PATH = 'vectorstore/db_faiss'
db = FAISS.load_local(DB_FAISS_PATH, embeddings)
return db
여기서는 벡터 데이터베이스를 로드했습니다.
이제 향후 쿼리를 기반으로 유사한 콘텐츠를 검색하는 데 사용할 수 있는 PDF에서 지식 기반을 생성하는 기능을 성공적으로 완료했습니다.
이제 langchain 프롬프트를 사용하여 프롬프트 템플릿을 만들 차례입니다.
#Import Dependencies
from langchain.prompts import ChatPromptTemplate
#creating prompt template using langchain
def load_prompt():
prompt = """ You need to answer the question in the sentence as same as in the pdf content. .
Given below is the context and question of the user.
context = {context}
question = {question}
if the answer is not in the pdf answer "i donot know what the hell you are asking about"
"""
prompt = ChatPromptTemplate.from_template(prompt)
return prompt
이 load_prompt를 호출하면 컨텍스트와 질문이 입력 변수로 포함된 프롬프트가 반환됩니다.
openai LLM을 로딩해 보겠습니다.
#function to load the OPENAI LLM
def load_llm():
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
return llm
이제 Streamlit을 사용하여 자체 프런트 엔드를 만드는 주요 코드입니다.
#Import Dependencies
import streamlit as sl
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
if __name__=='__main__':
sl.header("welcome to the 📝PDF bot")
sl.write("🤖 You can chat by Entering your queries ")
knowledgeBase=load_knowledgeBase()
llm=load_llm()
prompt=load_prompt()
query=sl.text_input('Enter some text')
if(query):
#getting only the chunks that are similar to the query for llm to produce the output
similar_embeddings=knowledgeBase.similarity_search(query)
similar_embeddings=FAISS.from_documents(documents=similar_embeddings, embedding=OpenAIEmbeddings())
#creating the chain for integrating llm,prompt,stroutputparser
retriever = similar_embeddings.as_retriever()
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
response=rag_chain.invoke(query)
sl.write(response)
langchain의 StrOutputParser()를 사용하여 LLM, 벡터 데이터베이스 프롬프트, 출력 파서를 통합하는 체인을 만들었습니다.
다음 단계를 따라 Streamlit 앱을 실행합니다.
- streamlit_app.py 및 vectorstore가 포함된 디렉터리가 있는 cmd 또는 powershell로 이동합니다.
- "python -m streamlit run streamlit_app.py" 명령을 실행하세요.
브라우저 출력으로 리디렉션됩니다.
ValueError: The de-serialization relies loading a pickle file. Pickle files can be modified to deliver a malicious payload that results in execution of arbitrary code on your machine.You will need to set `allow_dangerous_deserialization` to `True` to enable deserialization. If you do this, make sure that you trust the source of the data. For example, if you are loading a file that you created, and no that no one else has modified the file, then this is safe to do. Do not set this to `True` if you are loading a file from an untrusted source (e.g., some random site on the internet.).
이 오류는 pickle 파일을 로드하는 과정에서 발생했으며, 이 과정은 보안 상의 위험이 있을 수 있습니다. pickle 파일은 악성 페이로드를 전달하기 위해 수정될 수 있으며, 결과적으로 임의의 코드가 실행될 수 있습니다. 따라서 allow_dangerous_deserialization을 True로 설정하여 역직렬화를 활성화해야 합니다. 그러나 이를 수행하기 전에 데이터의 소스를 신뢰할 수 있는지 확인해야 합니다.
예를 들어, 파일을 생성한 경우에는 안전한 것으로 간주됩니다. 그 파일이 다른 사람에 의해 수정되지 않았음을 확인하고 있어야 합니다. 그러나 인터넷의 신뢰할 수 없는 출처(예: 무작위 사이트)에서 파일을 로드하는 경우에는 True로 설정하지 않아야 합니다.
안전한 경우에만 allow_dangerous_deserialization을 True로 설정하십시오.
allow_dangerous_deserialization을 True로 설정하려면 해당 속성을 True로 지정하면 됩니다. 이것은 주로 pickle 파일을 로드할 때 사용되는 Python 라이브러리의 옵션 중 하나입니다.
예를 들어, pickle 파일을 로드할 때 allow_dangerous_deserialization을 True로 설정하려면 다음과 같이 코드를 작성할 수 있습니다:
import faiss
# 모델을 로드할 때 allow_dangerous_deserialization을 True로 설정
model = faiss.load_local("your_model_file", allow_dangerous_deserialization=True)
위 코드에서 faiss.load_local() 함수의 allow_dangerous_deserialization 매개변수를 True로 설정하여 역직렬화를 활성화합니다.
그러나 이것은 보안 상 주의가 필요한 옵션입니다. pickle 파일이 신뢰할 수 없는 출처에서 오는 것인지 확인하고, 그 파일이 수정되지 않았음을 확인한 후에만 이 옵션을 사용해야 합니다.
% python -m streamlit run streamlit_app.py
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://10.0.175.3:8501
For better performance, install the Watchdog module:
$ xcode-select --install
$ pip install watchdog
이제 로드한 PDF를 기반으로 쿼리를 입력하고 Enter 키를 눌러 쿼리에 대한 답변을 얻을 수 있습니다.
what is Multi-layer Perceptron?
PDF 챗봇이 제공하는 PDF와 출력을 비교할 수 있습니다. PDF에서 쿼리를 요청하면 봇은 다음과 같이 대답합니다.
따라하기
https://medium.com/@solidokishore/building-rag-application-using-langchain-openai-faiss-3b2af23d98ba
'AI > LLM' 카테고리의 다른 글
Multi Modal RAG를 위한 다중문서 처리 모듈 unstructured 살펴보기 (0) | 2024.05.07 |
---|---|
대용량 PDF를 위한 unstructured와 Multi-modal RAG에 대한 심층 분석 (0) | 2024.05.06 |
M1 LM Studio를 위한 Command Line Tool lms 설치 (0) | 2024.05.04 |
GPT-4 비전과 LLaVA (0) | 2024.05.04 |
M1 LM Studio HuggingFace 모델 구동 (0) | 2024.05.02 |