PowerPoint 문서를 RAG 시스템에 활용하는 방법

in #blog2 months ago (edited)

이 글에서는 LangChain, Unstructured 및 Hugging Face를 사용하여 PowerPoint 문서를 RAG(Retrieval-Augmented Generation) 시스템에 통합하는 방법을 살펴봅니다.

개요

RAG 시스템은 대량의 텍스트 데이터에서 관련 정보를 검색하고 해당 정보를 사용하여 질문에 대한 더욱 심층적인 답변을 생성하는 인공 지능 시스템입니다. 이는 전문 지식이 있는 문서를 검색하고 해당 정보를 요약하거나 질문에 대한 답변을 생성하는 데 유용합니다.

PowerPoint 프레젠테이션은 종종 전문 지식, 설명, 이미지 및 기타 시각적 요소를 포함하는 귀중한 정보의 저장소입니다. 하지만 RAG 시스템에 이러한 프레젠테이션을 포함하는 것은 어려울 수 있습니다. Unstructured는 PowerPoint와 같은 다양한 문서 형식을 텍스트로 추출하여 RAG 시스템에 활용할 수 있도록 지원하는 도구입니다.

설치

이 튜토리얼을 시작하기 전에 다음과 같은 라이브러리를 설치해야 합니다.

  • unstructured-client: Unstructured API와 상호 작용하는 데 사용됩니다.
  • unstructured[all-docs]: 다양한 문서 형식을 처리합니다.
  • langchain: RAG 시스템을 구축하는 데 사용됩니다.
  • accelerate: Hugging Face 모델을 가속화합니다.
  • bitsandbytes: 모델을 압축하여 리소스 사용량을 줄입니다.
  • sentence-transformers: 텍스트를 임베딩합니다.
  • chromadb: 텍스트 임베딩을 저장하는 데 사용되는 벡터 저장소입니다.

아래 명령어를 사용하여 Python 환경에 라이브러리를 설치합니다.

!pip install -q unstructured-client unstructured[all-docs] langchain accelerate bitsandbytes sentence-transformers chromadb
!pip install transformers --upgrade

Unstructured로 PowerPoint 문서 전처리

먼저 Unstructured를 사용하여 PowerPoint 문서를 처리하여 텍스트를 추출합니다.

  1. Unstructured API 키를 가져옵니다. 무료 계정으로도 이 튜토리얼을 사용할 수 있지만, 무료 계정은 페이지 수 제한이 있습니다.
  2. os.environ을 사용하여 환경 변수 UNSTRUCTURED_API_KEY에 API 키를 설정합니다.
import os

os.environ["UNSTRUCTURED_API_KEY"] = "YOUR_UNSTRUCTURED_API_KEY"
  1. Unstructured API 클라이언트를 초기화합니다.
from unstructured_client import UnstructuredClient
from unstructured_client.models import shared
from unstructured_client.models.errors import SDKError
from unstructured.staging.base import dict_to_elements

unstructured_api_key = os.environ.get("UNSTRUCTURED_API_KEY")

client = UnstructuredClient(
    api_key_auth=unstructured_api_key,
    # if using hosted API, provide your unique API URL:
    # server_url="YOUR_API_URL",
)
  1. with open을 사용하여 PowerPoint 파일을 열고 파일 콘텐츠를 Unstructured API에 전달합니다.
# The example powerpoint is from https://agsci.oregonstate.edu
# search for Plant Identification, the powerpoint should be the first result
# or upload your own .ppt or .pptx to Colab.

path_to_pptx = "/content/Plant Identification handout.ppt"

with open(path_to_pptx, "rb") as f:
  files = shared.Files(
      content=f.read(),
      file_name=path_to_pptx,
  )

  req = shared.PartitionParameters(
    files=files,
    # By setting the chunking strategy here, we'll partition AND
    # chunk the document in a single call
    chunking_strategy="by_title",
    max_characters=512,
  )

  try:
    resp = client.general.partition(req)
  except SDKError as e:
    print(e)

elements = dict_to_elements(resp.elements)

Retriever

이제 Unstructured에서 추출한 텍스트를 사용하여 RAG 시스템의 retriever를 구축할 수 있습니다.

  1. langchain_core.documents에서 Document 클래스를 가져옵니다.
  2. langchain_community.vectorstores에서 Chroma 클래스와 langchain.vectorstores에서 utils를 가져옵니다.
  3. langchain.embeddings에서 HuggingFaceEmbeddings를 가져옵니다.
from langchain_core.documents import Document
from langchain_community.vectorstores import Chroma
from langchain.vectorstores import utils as chromautils
from langchain.embeddings import HuggingFaceEmbeddings

documents = []
for element in elements:
    metadata = element.metadata.to_dict()
    documents.append(Document(page_content=element.text, metadata=metadata))

# Some metadata is too complex for ChromaDB, so we filter it out
docs = chromautils.filter_complex_metadata(documents)

db = Chroma.from_documents(docs, HuggingFaceEmbeddings(model_name="BAAI/bge-base-en-v1.5"))
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 4})

LLM 설정

이제 RAG 시스템에 사용할 LLM을 설정합니다.

  1. torchtransformers에서 필요한 클래스를 가져옵니다.
  2. AutoModelForCausalLM을 사용하여 원하는 모델을 로드합니다. 이 예제에서는 NousResearch/Hermes-2-Pro-Llama-3-8B 모델을 사용합니다.
  3. AutoTokenizer를 사용하여 모델에 해당하는 토크나이저를 로드합니다.
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

# Here we use https://huggingface.co/NousResearch/Hermes-2-Pro-Llama-3-8B
model_name = 'NousResearch/Hermes-2-Pro-Llama-3-8B'

# Quantized version of the model can run on the free T4 in Colab
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    nb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)

model = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=bnb_config)
tokenizer = AutoTokenizer.from_pretrained(model_name)

LangChain을 사용한 통합

모든 구성 요소를 LangChain을 사용하여 통합합니다.

  1. langchain.llms에서 HuggingFacePipeline을 가져옵니다.
  2. langchain.prompts에서 PromptTemplate를 가져옵니다.
  3. transformers에서 pipeline을 가져옵니다.
  4. langchain_core.output_parsers에서 StrOutputParser를 가져옵니다.
  5. langchain_core.runnables에서 RunnablePassthrough를 가져옵니다.
from langchain.llms import HuggingFacePipeline
from langchain.prompts import PromptTemplate
from transformers import pipeline
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

terminators = [
    tokenizer.eos_token_id,
    tokenizer.convert_tokens_to_ids("<|im_end|>")
]

text_generation_pipeline = pipeline(
    model=model,
    tokenizer=tokenizer,
    task="text-generation",
    temperature=0.2,
    do_sample=True,
    repetition_penalty=1.1,
    return_full_text=False,
    max_new_tokens=250,
    eos_token_id=terminators,
)

llm = HuggingFacePipeline(pipeline=text_generation_pipeline)

prompt_template = """
<|im_start|>system
You are a helpful assistant.
You are given relevant documents for context and a question. Provide a conversational answer.
If you don't know the answer, just say "I do not know." Don't make up an answer.
Question: <|im_end|>
<|im_start|>user
{question}
Context: {context} <|im_end|>
"""

prompt = PromptTemplate(
    input_variables=["context", "question"],
    template=prompt_template,
)

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

RAG 체인 실행

이제 RAG 체인을 사용하여 질문에 대한 답변을 생성할 수 있습니다.

question = "How can I identify what plant is in front of me?"
rag_chain.invoke(question)

위 코드는 PowerPoint 프레젠테이션에서 검색된 관련 정보를 사용하여 질문에 대한 답변을 생성합니다.

결론

이 튜토리얼에서는 Unstructured, LangChain 및 Hugging Face를 사용하여 PowerPoint 문서를 RAG 시스템에 통합하는 방법을 살펴보았습니다. 이러한 기술을 사용하여 다양한 문서 형식을 RAG 시스템에 통합하고 다양한 질문에 대한 더욱 정확하고 심층적인 답변을 생성할 수 있습니다.

Posted using Obsidian Steemit plugin

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.20
TRX 0.14
JST 0.029
BTC 67443.68
ETH 3234.73
USDT 1.00
SBD 2.65