여러분, 혹시 문서 더미 속에서 중요한 정보를 찾아야 했던 적 있나요? 직접 검사하고, 요약하는 일이 얼마나 힘든지 잘 아실 겁니다. 오늘은 이런 문제를 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가 작성 했습니다.
무서운 세상입니다. 이건 제가 썼습니다. ^^;