소개

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가지 다양한 기능이 있습니다.

  1. Models -> LLM, 채팅 모델, 텍스트 임베딩 모델
  2. Chains -> Prompts|llm|outputparsers와 같은 20개 이상의 애플리케이션별 체인
  3. Prompts -> 프롬프트 템플릿, 출력 파서, 예제 선택기
  4. Indexes -> 문서 로더, 텍스트 분할기, 검색기, 벡터 저장소
  5. 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

https://wikidocs.net/232104

 

2-2-5-1. PDF 문서 페이지별로 로드 (PyPDFLoader)

### PyPDFLoader 이용하여 PDF 파일 데이터 가져오기 `langchain_community` 패키지에서 제공하는 `PyPDFLoader`를 사용하여 PDF 파일에…

wikidocs.net

 

"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 파일이 신뢰할 수 없는 출처에서 오는 것인지 확인하고, 그 파일이 수정되지 않았음을 확인한 후에만 이 옵션을 사용해야 합니다.

 
streamlit 서버 구동
% 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
 
 
http://localhost:8501/

 

이제 로드한 PDF를 기반으로 쿼리를 입력하고 Enter 키를 눌러 쿼리에 대한 답변을 얻을 수 있습니다.

what is Multi-layer Perceptron?

PDF 챗봇이 제공하는 PDF와 출력을 비교할 수 있습니다. PDF에서 쿼리를 요청하면 봇은 다음과 같이 대답합니다.

PDF 이외의 질문에 대한 답변

 

따라하기

https://medium.com/@solidokishore/building-rag-application-using-langchain-openai-faiss-3b2af23d98ba

https://wikidocs.net/232104

+ Recent posts