콘텐츠로 이동

여러 PDF + Pinecone 사용하기

실행 준비

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

폴더 구조

/content/pdfs/
├── file1.pdf
├── file2.pdf
├── file3.pdf

Pinecone 설정값 입력

import pinecone

# Pinecone 계정 정보 입력
PINECONE_API_KEY = "your-pinecone-api-key"     # 👉 본인 API 키로 대체
PINECONE_ENV = "gcp-starter"                   # 👉 본인의 환경에 맞게 수정
INDEX_NAME = "ko-pdf-rag"                      # 인덱스 이름

# Pinecone 초기화
pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENV)

# 인덱스 생성 (처음 1회만)
if INDEX_NAME not in pinecone.list_indexes():
    pinecone.create_index(name=INDEX_NAME, dimension=768, metric="cosine")

전체 파이프라인 코드 (KoSBERT + Pinecone + PDF 다수)

import os
import pdfplumber
import kss
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Pinecone
from langchain.docstore.document import Document

# ✅ PDF 텍스트 추출
def extract_texts_from_pdfs(folder_path: str):
    texts = []
    for file_name in os.listdir(folder_path):
        if file_name.endswith(".pdf"):
            with pdfplumber.open(os.path.join(folder_path, file_name)) as pdf:
                full_text = ""
                for page in pdf.pages:
                    t = page.extract_text()
                    if t:
                        full_text += t + "\n"
                texts.append((file_name, full_text))
    return texts

# ✅ 문장 분리 + Document 객체 생성
def create_documents_from_texts(texts):
    all_docs = []
    for filename, text in texts:
        sentences = kss.split_sentences(text)
        for sentence in sentences:
            doc = Document(page_content=sentence, metadata={"source": filename})
            all_docs.append(doc)
    return all_docs

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

# ✅ PDF 폴더 경로
pdf_folder = "/content/pdfs"  # <- 자신의 폴더로 바꿔주세요

# ✅ 문서 추출 및 변환
texts = extract_texts_from_pdfs(pdf_folder)
documents = create_documents_from_texts(texts)

# ✅ Pinecone 벡터 DB 연결 및 문서 추가
vectorstore = Pinecone.from_documents(
    documents=documents,
    embedding=embedding,
    index_name=INDEX_NAME,
)

# ✅ 검색
query = "FAISS와 Pinecone의 차이점을 설명해줘"
docs = vectorstore.similarity_search(query, k=5)

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

[문맥]
{context}

[질문]
{query}
"""

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

결과 예시

📌 ChatGPT에 보낼 프롬프트:

[문맥]
[file1.pdf]
Pinecone은 클라우드 기반의 벡터 검색 엔진이다.
[file2.pdf]
FAISS는 로컬에서 빠르게 벡터 유사도를 검색할  있는 라이브러리다.
...

[질문]
FAISS와 Pinecone의 차이점을 설명해줘