컴퓨터 과학/AI

ChatPDF - pdf를 읽어서 chatgpt에게 물어보기

DevHam94 2024. 12. 31. 18:50

pdf 문서를 불러와서 embedding vectorDB에 넣고 

안의 내용과 연관된 내용을 질문하여 chat gpt한테 답을 받는다. 

 

LLaMa2에서 vector DB를 사용한다고 했는데. vector값 즉 위치값을 저장하는건데 이미지의 모양에 벡터값을 부여하고 그 비슷한 벡터를 찾아 연관된 값을 찾는 형식이라 사과랑 바나나가 비슷한 벡터에 위치하게되 연관값이 높게된다. 

즉 일반 db와는 다르게 이미지 값을 저장하고 연관을 시킬수 있다는거다.

vectorDB에는 무료인 chroma와 유료인 pinecone, weaviate등이 있다. 

 

pdf를 읽어오기위해 PyPDF 모듈을 설치해준다. 

pip install pypdf

 

 

pypdf 사용

참고링크

https://python.langchain.com/v0.2/docs/how_to/document_loader_pdf/

 

How to load PDFs | 🦜️🔗 LangChain

Portable Document Format (PDF), standardized as ISO 32000, is a file format developed by Adobe in 1992 to present documents, including text formatting and images, in a manner independent of application software, hardware, and operating systems.

python.langchain.com

페이지를 쪼갠다. 

from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()

 

 

vectorDB를 사용하기위해 chromaDB를 다운받아준다. 

pip install chromadb

# embedding 모델을 사용하기위해 필요한 모듈
pip install tiktoken

https://python.langchain.com/docs/integrations/vectorstores/chroma/

 

Chroma | 🦜️🔗 LangChain

This notebook covers how to get started with the Chroma vector store.

python.langchain.com

 

참고 사이트:
https://python.langchain.com/docs/how_to/MultiQueryRetriever/

from langchain.vectorstores import Chroma

db = Chroma.from_documents(docs, embeddings_function)

# Build a sample vectorDB
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# Load blog post
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# Split
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
splits = text_splitter.split_documents(data)

# VectorDB
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)

question = "What are the approaches to Task Decomposition?"
llm = ChatOpenAI(temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(
    retriever=vectordb.as_retriever(), llm=llm
)