IT/AI

PDF 파일을 이용한 인터랙티브 질의응답 시스템 구축하기

chn1002 2024. 5. 8. 10:05

오늘날 정보를 취득하고 이해하는 방식이 급격히 변화하면서, 문서로부터 직접 정보를 추출하고 질문에 답하는 시스템의 필요성이 더욱 증가하고 있습니다. 이러한 필요를 충족시키기 위해, 우리는 PDF 문서를 직접적으로 활용할 수 있는 인터랙티브 질의응답 시스템인 ChatPDF를 소개합니다. 이 시스템은 사용자가 업로드한 PDF 파일에 기반하여 질문에 답할 수 있도록 설계되었습니다.

 

주요 기능

1. PDF 파일 업로드 및 텍스트 추출

  • 사용자는 웹 인터페이스를 통해 PDF 파일을 업로드할 수 있습니다. 업로드된 파일은 PyPDFLoader를 사용하여 텍스트로 변환됩니다.
def pdf_to_document(uploaded_file):
    temp_dir = tempfile.TemporaryDirectory()
    temp_filepath = os.path.join(temp_dir.name, uploaded_file.name)
    with open(temp_filepath, "wb") as f:
        f.write(uploaded_file.getvalue())
    loader = PyPDFLoader(temp_filepath)
    pages = loader.load_and_split()
    return pages

이 코드는 사용자가 업로드한 PDF 파일을 서버에 임시 파일로 저장하고, PyPDFLoader를 사용하여 페이지 별로 텍스트를 추출합니다.

 

2. 텍스트 분할

  • 추출된 텍스트는 RecursiveCharacterTextSplitter를 통해 작은 부분으로 나누어져 처리가 용이하도록 합니다. 이는 효과적인 정보 검색을 위해 중요합니다.
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 300,
    chunk_overlap  = 20,
    length_function = len,
    is_separator_regex = False,
)
texts = text_splitter.split_documents(pages)

 

3. 텍스트 임베딩과 벡터 저장소 생성

  • OpenAIEmbeddings와 Chroma 벡터 저장소를 사용하여 문서의 텍스트를 벡터로 변환하고 저장합니다. 이를 통해 효율적인 정보 검색이 가능해집니다.
embeddings_model = OpenAIEmbeddings()
db = Chroma.from_documents(texts, embeddings_model)

 

4. 질의응답 시스템

  • 사용자는 질문을 입력할 수 있고, RetrievalQA 체인을 통해 질문에 가장 잘 맞는 답을 찾아 제공합니다.
question = st.text_input('질문:')
if st.button('질문하기'):
    with st.spinner('Wait for it...'):
        llm = ChatOpenAI(model_name="llama3", temperature=0)
        qa_chain = RetrievalQA.from_chain_type(llm,retriever=db.as_retriever())
        result = qa_chain({"query": question})
        st.write(result["result"])

 

장점 및 활용 가능성

ChatPDF는 학술 자료, 기업 보고서, 기술 문서 등 다양한 PDF 문서에 적용 가능합니다. 사용자는 복잡한 데이터베이스나 검색 알고리즘에 의존하지 않고 직접 문서에 질문함으로써 필요한 정보를 빠르게 얻을 수 있습니다.

 

ChatPDF는 문서 기반 정보 추출 및 질의응답 시스템의 새로운 지평을 열어줍니다. 이 시스템을 통해 사용자는 간편하게 중요 정보를 추출하고 상호작용할 수 있습니다. 앞으로도 이러한 기술의 발전이 기대되며, 다양한 분야에서의 응용 가능성이 매우 높습니다.