LLM이 여러분의 PDF 문제를 해결해드립니다 – Ollama-Gemma2와 함께하는 프로젝트 이야기

여러분, 혹시 문서 더미 속에서 중요한 정보를 찾아야 했던 적 있나요? 직접 검사하고, 요약하는 일이 얼마나 힘든지 잘 아실 겁니다. 오늘은 이런 문제를 Python과 머신러닝(LMM)으로 해결하는 방법을 나눠보려 합니다. 프로젝트의 하이라이트는 Local 모델인 Ollama-Gemma2를 사용하여 PDF 데이터를 RAG(Retrieval-Augmented Generation) 모델로 검색하고 요약하는 것입니다.

PDF 데이터를 SQLite와 PostgreSQL에 저장하기!

여러분이 알고 계셔야 할 첫 번째 개념은 PDF 파일을 데이터베이스에 저장하는 것입니다. 여기선 SQLite와 PostgreSQL을 사용했습니다.

1. PDF 파일 로드

PyPDFLoader를 사용하여 PDF 파일을 로드합니다. 이 단계에서는 파일을 읽기만 합니다.

from langchain_community.document_loaders import PyPDFLoader

def load_pdf(file_path):
    loader = PyPDFLoader(file_path)
    documents = loader.load()
    return documents

file_path는 읽어들일 PDF 파일의 경로를 말합니다. documents는 PDF의 내용을 담고 있습니다.

2. 텍스트 분할

이어서, PDF에서 얻은 텍스트를 청크로 나눕니다. RecursiveCharacterTextSplitter를 사용하면 이 작업이 가능합니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

def split_text(documents):
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    texts = text_splitter.split_documents(documents)
    return texts

chunk_size는 각 청크의 최대 크기를, chunk_overlap은 청크들 간의 중복 범위를 뜻합니다.

3. 텍스트를 데이터베이스에 저장하기

저장한 텍스트 청크를 데이터베이스에 넣는 것은 꽤 중요합니다. 아래는 이를 SQLite에 저장하는 코드입니다.

from langchain_community.vectorstores import SQLiteVSS

def save_to_db(texts, embeddings):
    vector_store = SQLiteVSS.from_texts(
        texts=texts,
        embedding=embeddings,
        table="documents"
    )
    return vector_store

위 코드에서 texts는 저장하려는 텍스트, embeddings는 임베딩 모델이며 모든 텍스트 청크는 ‘documents’ 테이블에 저장됩니다.

4. 데이터베이스로부터 읽어오기

이제 저장한 데이터를 다시 불러오는 방법에 대해 알아봅니다.

def load_from_db(embeddings):
    conn = SQLiteVSS.create_connection(db_file="vss.db")
    db = SQLiteVSS(table="documents", embedding=embeddings, connection=conn)
    return db

db_file은 SQLite 데이터베이스 파일의 이름입니다. 이는 필요한 데이터를 효율적으로 가져오기 위한 연결을 만듭니다.

Ollama-Gemma2: 문서 요약의 마법사

이제 Ollama-Gemma2 모델을 사용하여 데이터를 검색하고 요약해 봅시다. 이 모델은 사용자가 입력한 쿼리에 대해 문서를 이해하고 요약해 줍니다.

1. 임베딩 생성

위에서 사용한 텍스트 청크를 위한 임베딩을 생성합니다. 이 임베딩은 텍스트를 숫자 벡터로 변환하여 효율적으로 검색하는 데 사용됩니다.

from langchain_community.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

2. 검색 및 요약

Ollama-Gemma2 모델을 사용하여 벡터 저장소에서 가장 유사한 텍스트 청크를 검색하고 이를 요약합니다.

from langchain.chains import RetrievalQA
from langchain_community.llms import Ollama

def query_to_db(query, vector_store, llm, chain_type):
    retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 2})
    qa = RetrievalQA.from_chain_type(llm=llm, chain_type=chain_type, retriever=retriever)
    response = qa.invoke(query)
    return response

query는 사용자가 입력하는 질문입니다. vector_store는 텍스트 청크가 저장된 데이터베이스 연결을, llm은 Ollama-Gemma2 모델을 나타냅니다. 마지막으로 chain_type은 검색 방식입니다.

예제: 문서를 한글로 요약하기

프로젝트의 진짜 재미는 데이터를 입력하고 요약 결과를 확인하는 순간입니다. 예제를 통해 마지막 단계를 보겠습니다.

if __name__ == "__main__":
    # 데이터 불러오기
    texts = load_pdf_process("example.pdf") 
    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
    vector_store = load_from_db(embeddings)

    # Ollama-Gemma2 모델 생성
    ollama_model = Ollama(model="gemma2")

    # 쿼리 수행
    query = "문서를 한글로 요약해주세요."
    response = query_to_db(query, vector_store, ollama_model, "stuff")
    print(response)

위의 코드는 PDF 파일을 로드하고, 청크로 분할하고, 데이터베이스에 저장하며, Ollama-Gemma2 모델을 사용해 요약 결과를 반환합니다.

전체 코드는 아래 링크에서 참조 할 수 있습니다.

https://github.com/bipark/Ollama-Gemma2-PDF-RAG

마무리

이번 프로젝트를 통해 PDF 파일을 읽고, 청크로 나누며, 데이터베이스에 저장한 후, 이를 LLM 모델로 분석하고 요약하는 다양한 과정을 알아봤습니다. Ollama-Gemma2 모델은 오늘날의 문서 분석 및 요약 작업을 한층 더 효율적이고 쉽게 만들어줍니다. 여러분도 이 방법을 사용하여 문서 더미 속에서 중요한 정보를 빠르고 쉽게 찾아 보세요!

이 글은 Github 문서를 토대로 제목부터 모두 AI가 작성 했습니다.

무서운 세상입니다. 이건 제가 썼습니다. ^^;