콘텐츠로 이동

PDF + Chroma 사용하기

실행 준비

!pip install openai
!pip install gradio
!pip install sentence-transformers
!pip install pdfplumber
!pip install kss langchain chromadb tiktoken

PDF + Chroma + KoSBERT

import pdfplumber
import kss
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.docstore.document import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os
import shutil

# ✅ PDF 텍스트 추출
def extract_text_from_pdf(file_path: str) -> str:
    text = ""
    with pdfplumber.open(file_path) as pdf:
        for page in pdf.pages:
            t = page.extract_text()
            if t:
                text += t + "\n"
    return text

# ✅ 문장 분리 (한국어 특화)
def split_korean_sentences(text: str):
    return kss.split_sentences(text)

# ✅ LangChain 형식으로 문장 리스트를 문서 객체로 변환
def create_documents(sentences):
    return [Document(page_content=sentence) for sentence in sentences]

# ✅ PDF 경로
pdf_path = "/content/sample.pdf"  # 본인의 파일로 변경

# ✅ 텍스트 추출 및 문장 분리
raw_text = extract_text_from_pdf(pdf_path)
sentences = split_korean_sentences(raw_text)
documents = create_documents(sentences)

# ✅ 임베딩 모델 로딩 (KoSBERT)
embedding_model = HuggingFaceEmbeddings(
    model_name="snunlp/KR-SBERT-V40K-klueNLI-augSTS"
)

# ✅ Chroma 저장 디렉토리 초기화 (매번 새로 생성)
CHROMA_PATH = "chroma_ko_rag_db"
if os.path.exists(CHROMA_PATH):
    shutil.rmtree(CHROMA_PATH)

# ✅ Chroma 벡터 DB 생성
vectorstore = Chroma.from_documents(
    documents=documents,
    embedding=embedding_model,
    persist_directory=CHROMA_PATH
)
vectorstore.persist()

# ✅ 질의(Query)
query = "한국어 임베딩 모델 중에서 성능 좋은 모델이 뭐야?"

# ✅ 유사 문장 검색 (Top 5)
retrieved_docs = vectorstore.similarity_search(query, k=5)

# ✅ 프롬프트 구성
context = "\n".join([doc.page_content for doc in retrieved_docs])
final_prompt = f"""다음 문맥을 참고해서 질문에 답해줘:

[문맥]
{context}

[질문]
{query}
"""

# ✅ 출력
print("📌 ChatGPT에 보낼 최종 프롬프트:\n")
print(final_prompt)

결과 예시

📌 ChatGPT에 보낼 최종 프롬프트:

다음 문맥을 참고해서 질문에 답해줘:

[문맥]
KoSBERT는 한국어 문장 임베딩에 특화된 모델입니다.
KR-SBERT-V40K는 STS와 NLI 태스크로 학습되었습니다.
 모델은 HuggingFace에서 다운로드할  있습니다.
...

[질문]
한국어 임베딩 모델 중에서 성능 좋은 모델이 뭐야?

요약

  • 문서 입력: pdfplumber
  • 문장 분리: kss
  • 임베딩 모델: snunlp/KR-SBERT-V40K-klueNLI-augSTS
  • 벡터 DB: Chroma
  • 검색 및 프롬프트 구성: LangChain similarity_search() + 사용자 query