본문 바로가기
Database

문서 검색 챗봇 만들기

by BTC_문땅훈 2023. 9. 13.

 

 

베하 ~ 😉

 

 

 

 

오늘은 저번 시간에 다뤘던 Langchain 패키지를 사용해서 간단한 실습 진행하겠습니다.

 

 

소설 PDF파일을 벡터DB에 임베딩하여 질문하면 답변할 수 있는 ‘문서 검색 챗봇’을 만들어보겠습니다.

* 이때, PDF파일은 꼭 소설이 아니더라도 하고 싶으신 파일을 사용해주시면 됩니다. 저는 데미안 소설로 진행하였습니다~

* 해당 실습 자료는 유튜브 참고하여 진행하였습니다~

 

 

 

1. Setting

(1) Langchain 패키지 설치

!pip install -q grobid-client langchain openai faiss-cpu PyPDF2 tiktoken

 

(2) OpenAI - Secret key 입력

  • OpenAI를 사용하기 위하여 Secret key를 발급받아 입력해주셔야 합니다.
import openai
from PyPDF2 import PdfReader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import ElasticVectorSearch, Pinecone, Weaviate, FAISS
import os

os.environ["OPENAI_API_KEY"] = "key_입력"

 

(3) 사용할 텍스트 pdf파일 가져오기

  • PDF파일 Github에서 불러오기
!wget https://raw.githubusercontent.com/kairess/toy-datasets/master/Demian.pdf

 

 

 

2. Preprocess a PDF file

  • PdfReader를 통해 pdf파일을 불러와 for문을 통해 모든 텍스트를 추출해내는 명령어
  • 이때는, 텍스트를 쪼개진 형태가 아닌 다 받아옵니다.
reader = PdfReader("Demian.pdf")

raw_text = ""

for i, page in enumerate(reader.pages):
    text = page.extract_text()
    if text:
        raw_text += text

raw_text[:1000]

 

 

 

3. 청크 작업

  • 빠르고 싸기 때문에 3버전으로 사용 (chatGPT는 3.5버전)
from langchain import OpenAI
from langchain.chains import AnalyzeDocumentChain
from langchain.chains.summarize import load_summarize_chain

llm = OpenAI(temperature=0) 
summary_chain = load_summarize_chain(llm, chain_type="map_reduce")

summarize_document_chain = AnalyzeDocumentChain(combine_docs_chain=summary_chain)

summarize_document_chain.run(raw_text)

 

 

 

4. 질문 및 답변 테스트

  • 이때, 한 질문 수행할 때마다 1~3분 소요됩니다.
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI

model = ChatOpenAI(model="gpt-3.5-turbo")

qa_chain = load_qa_chain(model, chain_type="map_reduce")
qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)

=> 질문

qa_document_chain.run(
    input_document=raw_text,
    question="싱클레어를 괴롭힌 사람은?")

 

 

 

+) 물론 … 프롬프트 질의를 좋게 하지 않으면 찾지 못할 때도 있습니다. 😂

 

 

정말 간단한 실습이라서 따라하기 쉬우실겁니다 ~

 

 

그럼 다음 시간에 봐요 ~

 

 

 

 

베빠 ~!

'Database' 카테고리의 다른 글

트랜잭션의 이해(ACID)  (0) 2023.09.15
Cloud Composer의 내부DB 접근  (0) 2023.09.14
[Airflow] Celery Executer  (0) 2023.09.04
LangChain이란?  (0) 2023.09.04
SQL과 NoSQL 데이터베이스  (0) 2023.08.18

댓글