Streamlit/실습

150.[AI] [LlamaIndex RAG] Mistral 모델로 PDF 텍스트 추출

천재단미 2025. 2. 10. 09:38
728x90
반응형

 

 

 

 

🎯 LlamaIndex RAG란 무엇일까요?

LlamaIndex는 대규모 언어 모델(LLM)을 사용하여 데이터를 인덱싱하고 쿼리하는 과정을 간소화하는 강력한 프레임워크입니다. RAG(Retrieval-Augmented Generation)는 검색을 통해 얻은 정보를 기반으로 답변을 생성하는 방법으로, LLM의 지식 부족 문제를 해결하고 답변의 정확성을 높이는 데 효과적입니다.

⚙️ 필요한 라이브러리 설치

먼저 필요한 라이브러리를 설치합니다. 아래 명령어를 사용하여 pypdf2llama-index, **llama-index-embeddings-huggingface**를 설치하세요.

! pip install pypdf2 llama-index llama-index-embeddings-huggingface

📚 PDF 텍스트 추출 함수

PDF 파일에서 텍스트를 추출하는 함수를 정의합니다. PyPDF2 라이브러리를 사용하여 PDF 파일의 각 페이지에서 텍스트를 추출하고, 이를 연결하여 하나의 문자열로 반환합니다.

from pypdf import PdfReader

def extract_text_from_pdf(pdf_file):
    reader = PdfReader(pdf_file)
    text = ""
    for page in reader.pages:
        text  = text + page.extract_text()
    return text

🤖 Mistral 모델 설정

Mistral은 뛰어난 성능과 효율성을 자랑하는 오픈 소스 LLM입니다. LlamaIndex와 함께 사용하면 더욱 강력한 챗봇을 만들 수 있습니다. Mistral 모델을 설정하고, API 토큰을 입력하여 모델에 접근합니다.

model_name = "mistralai/Mistral-7B-Instruct-v0.2"
! pip install llama_index-llms-huggingface

 

from llama_index.llms.huggingface import HuggingFaceInferenceAPI

llm = HuggingFaceInferenceAPI(
    model_name="mistralai/Mistral-7B-Instruct-v0.2",
    max_new_tokens=512,
    temperature=0.0,
    system_prompt="당신은 한국어로 대답하는 AI 어시스턴트 입니다. 모든 질문에 대해 한국어로 명확하고 정확하게 답변해주세요",
    token="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",
    context_window=3900,
    additional_kwargs={
        "max_length": 512,
        "top_p": 1,
        "do_sample": True
    }
)

🧱 임베딩 모델 설정

임베딩 모델은 텍스트를 벡터 형태로 변환하여 의미론적 유사도를 측정하는 데 사용됩니다. Hugging Face의 sentence-transformers/all-mpnet-base-v2 모델을 사용하여 텍스트를 임베딩합니다.

from llama_index.embeddings.huggingface import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(model_name='sentence-transformers/all-mpnet-base-v2')

 

⚙️ LlamaIndex 설정

LLM과 임베딩 모델을 LlamaIndex 설정에 적용합니다. **Settings.llm**과 **Settings.embed_model**을 사용하여 LlamaIndex가 사용할 모델을 지정합니다.

from llama_index.core import Settings
Settings.llm = llm
Settings.embed_model = embed_model

📝 PDF 문서 로드 및 인덱싱

extract_text_from_pdf 함수를 사용하여 PDF 파일에서 텍스트를 추출하고, 추출된 텍스트를 LlamaIndex 문서로 변환합니다. **VectorStoreIndex.from_documents**를 사용하여 문서를 인덱싱하고, 벡터 스토어 인덱스를 생성합니다.

from llama_index.core import Document, VectorStoreIndex

pdf_file_path = '/content/메뉴얼.pdf'
pdf_text = extract_text_from_pdf(pdf_file_path)
documents = [Document(text=pdf_text)]
index = VectorStoreIndex.from_documents(documents)

🔑 쿼리 엔진 생성 및 질문 답변

인덱스를 기반으로 쿼리 엔진을 생성하고, 질문을 입력하여 답변을 얻습니다. 쿼리 엔진은 입력된 질문과 관련된 정보를 검색하고, LLM을 사용하여 답변을 생성합니다.

query_engine = index.as_query_engine()
response = query_engine.query("기업복지제도의 주요 내용은 무엇인가요?")
print(response)

📚 전체 코드

! pip install pypdf2 llama-index llama-index-embeddings-huggingface
! pip install llama_index-llms-huggingface

from pypdf import PdfReader
from llama_index.core import Document, VectorStoreIndex, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceInferenceAPI

*# PDF 텍스트 추출 함수*
def extract_text_from_pdf(pdf_file):
    reader = PdfReader(pdf_file)
    text = ""
    for page in reader.pages:
        text  = text + page.extract_text()
    return text

*# Mistral 모델 설정*
model_name = "mistralai/Mistral-7B-Instruct-v0.2"
llm = HuggingFaceInferenceAPI(
    model_name=model_name,
    max_new_tokens=512,
    temperature=0.0,
    system_prompt="당신은 한국어로 대답하는 AI 어시스턴트 입니다. 모든 질문에 대해 한국어로 명확하고 정확하게 답변해주세요",
    token="YOUR_HUGGINGFACE_API_TOKEN",  *# Hugging Face API 토큰*
    context_window=3900,
    additional_kwargs={
        "max_length": 512,
        "top_p": 1,
        "do_sample": True
    }
)

*# 임베딩 모델 설정*
embed_model = HuggingFaceEmbedding(model_name='sentence-transformers/all-mpnet-base-v2')

*# LlamaIndex 설정*
Settings.llm = llm
Settings.embed_model = embed_model

*# PDF 문서 로드 및 인덱싱*
pdf_file_path = '/content/메뉴얼.pdf'
pdf_text = extract_text_from_pdf(pdf_file_path)
documents = [Document(text=pdf_text)]
index = VectorStoreIndex.from_documents(documents)

*# 쿼리 엔진 생성 및 질문 답변*
query_engine = index.as_query_engine()
response = query_engine.query("기업복지제도의 주요 내용은 무엇인가요?")
print(response)

💡 추가 팁

  • token 변수에 Hugging Face API 토큰을 입력해야 합니다.
  • pdf_file_path 변수에 실제 PDF 파일 경로를 입력해야 합니다.

이제 LlamaIndex와 Mistral 모델을 활용하여 PDF 문서를 기반으로 질문에 답변하는 챗봇을 만들었습니다. 다양한 데이터를 활용하여 나만의 챗봇을 만들어 보세요! 질문이 있으시면 언제든지 댓글을 남겨주세요.

 

728x90
반응형