데이터 수집

RAG Cookbook이 제공하는 더 많은 내용을 살펴보고 오늘날의 RAG 솔루션에 대해 더 깊이 이해해 보세요.

Watson for Customer Care 리드스페이스를 기본으로 사용하여 색상을 변경한 리드스페이스.
개요

수집은 이후 검색을 위해 검색 공간에 임베딩할 수 있도록 원본 문서에서 정보를 파싱하는 과정입니다. 일반 텍스트의 경우에는 비교적 단순한 과정이지만 원본 문서가 '텍스트' 형식이 아닌 경우에는 복잡성이 발생합니다. 예를 들어 Microsoft Word 또는 PDF 형식이거나 반복되는 머리글과 바닥글, 여러 열로 구성된 텍스트, 또는 표와 같은 복잡한 서식을 포함하는 경우입니다.

이 섹션에는 이러한 문제를 해결하는 데 도움이 되는 팁, 기술, 가속기, 그리고 관련 리소스에 대한 안내가 포함되어 있습니다.

어디서부터 시작해야 할까요?

 

기술적 배경이 없는 사용자이고 문서가 비교적 단순하며 코드가 필요 없는 솔루션이 필요하다면 Watsonx Orchestrate를 사용하세요.

 

기술 사용자이며 문서가 비교적 단순하고 Watson Discovery에 접근할 수 있다면 거기서부터 시작하세요. Watson Discovery는 코딩이 거의 필요하지 않으면서 사용할 수 있는 편리한 UI를 제공합니다. 복잡한 문서의 경우 watson discovery를 사용해 문서의 특정 부분을 주석 처리하고 추출할 수 있으며, 이를 RAG 백엔드 파이프라인에 사용하거나 문서 내 단락의 정확한 위치를 파악해 프런트엔드에서 텍스트를 강조 표시하는 데 사용할 수 있습니다.

 

그러나 Watson Discovery에는 몇 가지 한계가 있습니다. 문서 크기가 50MB보다 크면 Watson Discovery에 업로드할 수 없습니다. 문서가 너무 복잡한 경우(예: 중첩된 표 또는 불규칙한 표 형식을 포함하는 경우) Watson Discovery가 전체 문서 구조를 제대로 캡처하지 못할 수 있습니다. 이러한 경우에는 오픈 소스 라이브러리를 사용해 사용자 지정 데이터 수집 파이프라인을 구현하는 것이 좋습니다.

 

오픈 소스 라이브러리 측면에서 보면 LangChain과 LlamaIndex는 데이터 수집 기능 면에서 매우 유사합니다. 그러나 문서화와 벡터 데이터베이스 및 다른 애플리케이션과의 통합 측면에서는 LangChain이 LlamaIndex보다 사용하기 더 쉽습니다. LangChain과 LlamaIndex 모두 Document 객체를 서로 변환할 수 있는 헬퍼 함수를 제공하므로 파이프라인의 어느 단계에서든 두 라이브러리 간 전환이 가능합니다.

복잡한 테이블이 포함된 문서 수집

다음 메모에는 복잡한 표가 포함된 문서를 수집하는 과정에서 얻은 여러 교훈과 특정 프로젝트에서 테스트된 다양한 접근 방식이 포함되어 있습니다. 일부 관찰 결과는 프로젝트마다 다를 수 있지만 중첩된 표와 복잡한 표가 포함된 문서를 다루는 프로젝트에서는 대부분의 결론이 유사하게 적용됩니다.

Watson Discovery

Watson Discovery는 50MB보다 큰 문서를 지원하지 않습니다. 문서 크기가 큰 이유가 원본 문서가 Word 형식이기 때문이라면 Watson Discovery를 사용하기 위해 원본 Word 문서를 PDF로 변환해야 합니다. 그러나 이 방법을 사용할 경우 Watson Discovery가 표 형식을 제대로 인식하지 못하는 경우가 있으며 특히 복잡하거나 중첩된 표에서 이러한 문제가 발생할 수 있습니다.

Watson Discovery를 사용한 수집에서는 두 가지 접근 방식을 테스트할 수 있습니다. 하나는 사전 학습된 모델이고 다른 하나는 Discovery의 Smart Document Understanding을 통해 몇 페이지를 수동으로 주석 처리하여 학습한 사용자 모델입니다. 다음에서는 복잡하게 중첩된 표가 포함된 프로젝트에서 이 두 가지 접근 방식으로부터 얻은 교훈을 설명합니다.

  • 사전 학습된 모델l
    • 장점: 
      • Discovery의 HTML 출력은 사용자 학습 모델(SDU)보다 표 구조를 더 잘 캡처하는 경우가 많았습니다.
    • 단점: 
      • Discovery는 여전히 중첩된 표를 감지하는 데 어려움이 있었습니다. 일부 경우에는 가장 안쪽 표만 표로 인식하고 바깥쪽 표는 텍스트로 캡처하여 데이터 구조가 손실되기도 했습니다.
    • Watson Discovery를 사용할 때 HTML 출력 대신 원시 텍스트를 사용하는 것이 더 나은 결과를 제공할 수 있습니다.  

  • 사용자 정의 모델
    • 장점: 
      • 주석을 달기 매우 쉽고 나중에 특정 섹션을 필터링하려는 단순한 문서에 적합합니다.
    • 단점:
      • 표 안의 모든 표에 주석을 달았더라도 중첩된 표 구조를 감지하지 못했습니다.
      • 단순한 표의 경우에도 새 문서에서 이를 감지하는 데 문제가 있었으며, 7개 이상의 문서에서 20페이지를 수동으로 주석 처리한 이후에도 동일한 문제가 발생했습니다.

복잡하고 중첩된 표의 경우 Watson Discovery의 결과는 아래에서 언급된 다른 사용자 정의 라이브러리만큼 정확하지는 않았지만, 페이지 번호나 텍스트 좌표와 같은 많은 메타데이터를 포함하고 있어 UI에서 강조 표시를 보여주는 데 도움이 됩니다. 이러한 메타데이터는 검색 과정에서 추가 필터를 적용하거나 특정 HTML 섹션을 기준으로 문서를 분할하는 데에도 매우 유용합니다.

PyPDFLoader vs PyMuPDF

PyMuPDF 라이브러리는 훨씬 더 빠르며 특히 대용량 데이터에서 더 정확한 결과를 제공합니다. 50.6MB 데이터 세트에서 다음 두 함수를 사용했을 때 PyMuPDF는 0.131초가 걸렸고 LangChain의 PypdfLoader는 0.366초가 걸렸습니다. 따라서 대용량 파일을 처리할 때 문서의 각 섹션을 별도로 추출할 필요가 없다면 PyMuPDF 라이브러리를 사용하는 것이 좋습니다.

def pdf_to_text(path: str,
                        start_page: int = 1,
                        end_page: Optional[int | None] = None) -> (list[str], list[str], list[dict]):
    """
    Converts PDF to plain text.

    Params:
        path (str): Path to the PDF file.
        start_page (int): Page to start getting text from.
        end_page (int): Last page to get text from.
    """
    logger.debug("Processing PDF %s".format(path))

    from langchain_community.document_loaders import PyPDFLoader

    loader = PyPDFLoader(path)
    pages = loader.load()
    total_pages = len(pages)
    logger.debug(f'Total pages: {total_pages}')
    _ids = []
    _metadata = []
    _file_name = Path(path).name

    if end_page is None:
        end_page = len(pages)

    _text_list = []
    for index in range(start_page - 1, end_page):
        text = pages[index].page_content
        text = text.replace('\n', ' ')
        text = re.sub(r'\s+', ' ', text)
        _text_list.append(text)
        _ids.append(f'page_{index + 1}')
        _metadata.append({
            "id": index + 1,
            "file_name": _file_name,
            "page": f'page {index + 1}'
        })

    return _text_list, _ids, _metadata

def large_pdf_to_text(path: str,
                        start_page: int = 1,
                        end_page: Optional[int | None] = None,
                        remove_string_list=None) -> (list[str], list[str], list[dict]):
    """
        Converts PDF to plain text using PyMuPDF, impressive execution speed, making it suitable for
        large-scale PDF processing. While it does not offer dedicated table extraction features, it can
        still be used to analyze the PDF structure and extract tabular data with additional processing
        steps if needed.

        50.6MB -> 0.131 seconds (PyMuPDF) vs. 0.366 seconds (pypdf)

        Params:
            file_stream (stream): Stream to the PDF file.
            path (str): Path to the PDF
            start_page (int): Page to start getting text from.
            end_page (int): Last page to get text from.
            remove_string_list (list[str]): Remove string list.
        """
    logger.debug("Processing PDF %s".format(path))
    if remove_string_list is None:
        remove_string_list = []

    import fitz

    # pdf_reader = fitz.open(stream = file_stream, filetype = "pdf")
    pdf_reader = fitz.open(path)
    if end_page is None:
        end_page = pdf_reader.page_count

    _text_list = []
    _ids = []
    _metadata = []
    _file_name = Path(path).name
    for index in range(start_page - 1, end_page):
        text = pdf_reader[index].get_text("text")
        text = text.replace('\n', ' ')
        text = re.sub(r'\s+', ' ', text)
        for remove_string in remove_string_list:
            re_compile = re.compile(remove_string)
            text = re_compile.sub('', text)
            _metadata.append({
                "id": index + 1,
                "file_name": _file_name,
                "page": f'page {index + 1}'
            })
        _ids.append(f'page_{index + 1}')
        _text_list.append(text)

    return _text_list, _ids, _metadata

HTML 수집을 위한 비정형 PDF 로더 LangChain의 UnstructuredPDFLoader

  • 장점: 
    • Watson Discovery와 유사하게 페이지 번호와 텍스트의 x,y 좌표와 같은 많은 메타데이터를 포함하며, 이는 향후 강조 표시를 보여주는 데 유용할 수 있습니다.
  • 단점: 
    • 중첩되거나 복잡한 많은 테이블을 제대로 캡처하지 못합니다. 또한 이 접근 방식을 사용하려면 원래의 docx 형식 문서를 각각 PDF로 변환해야 합니다.

HTML 수집을 위한 비정형 Word 로더 LangChain의 UnstructuredWordDocumentLoader

  • 장점: 
    • 문서(Docs)를 사용하면 테이블을 더 잘 캡처할 수 있으며, LLM이 답변을 생성하는 데 더 적절한 컨텍스트를 제공하는 데 도움이 됩니다.
  • 단점: 
    • 페이지 나누기를 추가했음에도 PDF 로더와 비교했을 때 페이지 번호와 같은 메타데이터가 제대로 캡처되지 않았습니다.

HTML 테이블 요약

표 구조를 보존하기 위해 추출된 HTML( Unstructured 라이브러리 사용 )에서 얻은 표 요소를 LLM에 입력합니다(Mixtral은 컨텍스트 크기 때문에 긴 표에 적합한 옵션입니다). 이후 프롬프트를 생성하여 표를 요약하거나 few-shot learning을 사용해 표를 대규모 언어 모델이 더 이해하기 쉬운 형식으로 변환할 수 있습니다.

  • 장점: 
    • 출력된 텍스트는 청킹과 수집이 더 쉬우며 테이블 구조도 유지됩니다.
  • 단점: 
    • 여러 페이지에 걸친 대형 표의 경우 요약 프롬프트를 사용하면 일부 정보가 손실될 수 있으므로, 표를 요약하는 대신 퓨샷 러닝을 사용해 표를 변환하면 더 나은 결과를 얻을 수 있습니다.

camelot과 tabula 같은 다른 테이블 리더 라이브러리도 테스트되었지만, 복잡한 테이블의 경우 비정형보다 정확도가 낮았으며 문서 내 테이블만 감지하기 때문에 대규모 언어 모델에 전달할 의미 있는 청크를 만들기 위해 추가 전처리가 필요할 수 있습니다.

결론적으로 Watson Discovery는 문서를 수집하고 UI 구축에 유용한 많은 추가 메타데이터(예: 문장 강조 표시)를 캡처할 수 있는 쉽고 빠른 방법이지만, “비정형” 라이브러리(LlamaIndex와 LangChain 모두에서 래퍼 제공)는 Discovery보다 문서 내 복잡한 테이블을 더 정확하게 캡처할 수 있습니다. 따라서 문서에 복잡한 테이블이 포함된 프로젝트에서는 두 접근 방식을 함께 사용하는 것이 도움이 될 수 있습니다.

IBM 툴

Watsonx Orchestrate를 사용한 수집

그래픽 사용자 인터페이스 없이 수집을 수행하는 것은 기술 경험과 지식이 필요하기 때문에 비즈니스 사용자에게 어려울 수 있습니다. Watsonx Orchestrate는 드래그 앤 드롭 사용자 인터페이스(UI)를 제공하여 비즈니스 사용자의 불편함을 줄여 줍니다. 파란색 업로드 버튼을 클릭하면 문서를 watsonx Discovery(Elasticsearch라고도 함)에 직접 업로드하고 저장할 수 있습니다.

watsonx Orchestrate 드래그 앤 드롭 포털의 스크린샷

이를 통해 사용자는 문서를 Elasticsearch에 직접 업로드하여 자체 맞춤형 지식 베이스를 만들 수 있습니다.

watsonx Orchestrate 문서 업로드 화면 스크린샷

문서를 watsonx Discovery에 직접 수집하는 대신 watsonx Orchestrate를 통해 Watson Discovery에 연결하는 방법도 사용할 수 있습니다. Watson Discovery를 통해 데이터를 수집하는 방법에 대한 자세한 내용은 아래에서 확인할 수 있습니다.

Watson Discovery

수집에 사용할 수 있는 또 다른 내부 툴은 Watson Discovery입니다. Watson Discovery는 단순한 수집 툴이 아니라 비정형 데이터를 수집, 정규화, 강화, 검색할 수 있는 기능을 제공합니다. 아래 이미지는 Watson Discovery의 핵심 구성 요소와 기능을 보여 줍니다.

Watson Discovery 핵심 기능 일러스트

위에서 볼 수 있듯이 Watson Discovery의 핵심 기능 중 하나는 JSON, HTML, PDF, Word 등 다양한 형식의 정형 및 비정형 데이터를 수집하고 Smart Document Understanding을 활용하는 것입니다.

환경에 Watson Discovery가 프로비저닝되어 있다면 먼저 프로젝트를 만들고 컬렉션을 생성한 뒤 로컬 스토리지나 객체 스토리지 버킷과 같은 클라우드 위치에서 데이터를 업로드하여 문서를 쉽게 수집할 수 있습니다.

컬렉션을 생성한 후 햄버거 메뉴의 Manage Collections 탭으로 이동하고 Identity Fields에서 문서를 처리할 방법을 선택할 수 있습니다.

Watson Discovery 문서 처리 화면

세 가지 옵션이 있습니다.

  • 텍스트 추출만: 문서에서 텍스트만 추출합니다.
  • 사용자 학습 모델: 문서의 여러 부분에 사용자 지정 태그로 주석을 달고 문서 내 반복되는 시각적 패턴을 기반으로 자체 모델을 학습할 수 있습니다.
  • 사전 학습된 모델: 사전 학습된 IBM 모델을 사용해 텍스트를 추출하고 테이블, 목록, 섹션을 식별합니다.

모든 문서가 처리되기까지 시간이 걸릴 수 있습니다. 이후 Watson Discovery API를 사용해 코드에서 데이터를 읽고 활용할 수 있습니다.

아래는 컬렉션에서 데이터를 읽기 위해 API를 사용하는 방법을 보여 주는 샘플 코드입니다.

from langchain.docstore.document import Document
import os
import logging
import time
from ibm_watson import DiscoveryV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

WD_PAGE_SIZE = 200
MAX_RETRIES = 2
def get_documents_from_wd(collection_ids=[WD_COLLECTION_ID]):
    
    print("Fetching documents from Watson Discovery")
    documents = []
    
    print("Configuring the WD client")
    authenticator = IAMAuthenticator(WD_API_KEY)
    wd_client = DiscoveryV2(
        version="2023-03-31",
        authenticator=authenticator
    )
    
    print("Setting the WD service URL")
    wd_client.set_service_url(WD_SERVICE_URL)
    
    print("Fetching documents from WD")
    page_id = 0
    retries = 0
    while True:
        try:
            print("Fetching page: " + str(page_id))
            response = wd_client.query(
                project_id=WD_PROJECT_ID,
                collection_ids=collection_ids,
                return_=["text"],
                count=WD_PAGE_SIZE,
                offset=page_id*WD_PAGE_SIZE
            ).get_result()
            if response is None or not isinstance(response, dict):
                print("No query result")
                raise ValueError("No query result")
            if "results" not in response or response["results"] is None or not isinstance(response["results"], list):
                print("No query result 2")
                raise ValueError("No query result")
            results = response["results"]
            if len(results) == 0:
                print("No more results")
                break
            print("Fetched " + str(len(results)) + " documents")
            documents.extend(list(map(lambda result: Document(page_content=result["text"][0],  
                                                              metadata= {"collection_id": WD_COLLECTION_ID, "document_id" : result['document_id']}), results)))
            page_id += 1
        except Exception as error:
            logging.error("Failed to fetch documents from WD", str(error))
            retries += 1
            time.sleep(5)
            if retries > MAX_RETRIES:
                break
            print("Retrying...")
    print("Fetched " + str(len(documents)) + " documents")
    return documents

 

Watson Discovery에서의 웹 크롤링

Watson Discovery에서 프로젝트를 생성할 때 지정된 URL에서 정보를 가져오도록 웹 크롤링 일정을 설정할 수 있습니다. 데이터 소스를 선택할 때 Web Crawl을 선택한 다음 URL과 크롤링 일정을 지정하면 됩니다.

Watson Discovery 웹 크롤러 설정 화면
Watson Discovery 웹 크롤러 스케줄러 화면

그 이후에는 위에서 설명한 단계에 따라 컬렉션을 관리하고 API를 사용해 컬렉션의 데이터를 읽을 수 있습니다. Watson Discovery에서 Web Crawl을 설정하는 방법에 대한 자세한 내용은 동영상을 시청하세요.

더 많은 정보와 기능은 Watson Discovery 개발자 페이지에서 확인할 수 있습니다.

딥 서치

딥 서치는 IBM Research에서 개발한 오픈 소스 수집 툴킷입니다. 딥 서치는 최신 AI 방법을 활용하여 대규모 문서 컬렉션을 지속적으로 수집, 변환, 강화, 연결합니다. 공개 PDF 문서와 독점 PDF 문서 모두에 사용할 수 있습니다.

딥 서치는 비정형 PDF 문서를 정확하고 효율적으로 정형 JSON 파일로 변환합니다. 이를 통해 지식 추출을 자동화하고 자체 파운데이션 모델과 대규모 언어 모델을 파인 튜닝할 수 있습니다.

딥 서치에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

딥 서치는 unstructured 또는 기타 오픈소스 라이브러리 대신 복잡한 문서를 읽는 데 사용할 수 있는 유용한 내부 툴입니다. 저장소에는 다양한 Python 노트북 예제가 포함된 매우 유용한 문서도 제공됩니다.

딥 서치 예제 노트북

PDF에서 테이블 수집

딥 서치는 PDF에서 테이블을 JSON 형식으로 추출할 때 좋은 결과를 제공합니다.

테스트를 위해 각 페이지에 테이블 데이터가 포함된 3페이지짜리 CIPP의 일부 PDF 문서를 사용했습니다. 이 경우 RAG의 최상의 성능은 PDF를 직접 사용하거나 딥 서치 없이 PDF를 HTML로 변환하거나 Watson Discovery / watsonx Discovery에서 딥 서치의 JSON만 사용하는 대신, 딥 서치를 사용해 테이블을 JSON 형식으로 추출한 뒤 이를 HTML로 변환하여 Watson Discovery / watsonx Discovery에서 사용하는 방식으로 얻을 수 있습니다. 일부 경우 Watson Discovery가 테이블의 잘못된 셀에서 잘못된 답을 선택하기도 하지만 속도는 더 빠르며, 같은 경우에서도 Watson Discovery는 테이블 그리드 내에서 정확한 답을 정확히 찾아낼 수 있습니다.

IBM Datacap

IBM Datacap은 문서 및 데이터 캡처를 위한 종합 솔루션으로, 데이터와 문서 이미지를 빠르고 정확하며 비용 효율적으로 스캔, 분류, 인식, 검증, 내보내기할 수 있도록 제공합니다. 문서를 캡처하고 관련 데이터를 추출하여 후속 비즈니스 프로세스에 통합합니다.

Datacap은 스캐너, 복합기, 모바일 장치를 통해 종이 문서를 수집하고 파일 시스템, 팩스 또는 이메일 서버에서 전자 문서를 가져옵니다. 기울기 보정(deskewing) 및 선, 번짐, 테두리 제거와 같은 이미지 처리 기능을 통해 데이터 추출을 향상합니다.

Datacap은 데이터 추출을 효율적으로 수행하기 위해 광학 문자 인식(OCR), 필기 인식을 위한 지능형 문자 인식(ICR), 표시 인식을 위한 광학 마크 인식(OMR), 바코드 판독을 사용합니다.

설치 및 사용에 대한 자세한 지침은 IBM Datacap 문서를 참고하세요.

오픈 소스 툴

LangChain 데이터 로더

LangChain은 다양한 유형의 문서 로더를 지원하며, 이를 통해 소스에서 데이터를 LangChain의 Document 객체로 로드할 수 있습니다. Document 객체는 텍스트 조각과 관련 메타데이터로 구성되며, 이후 파이프라인 단계에서 청킹과 검색에 쉽게 사용할 수 있습니다.

현재 LangChain은 전체 디렉터리를 로드하거나 다음과 같은 다양한 파일 유형을 로드하는 로더를 지원합니다.

  • CSV
  • HTML
  • JSON
  • Markdown
  • Microsoft Office
  • PDF

이러한 로더는 Python 코드 몇 줄로 사용할 수 있습니다. 예를 들어 PDF를 로드하려면 다음 코드를 사용할 수 있습니다.

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()

이러한 로더를 사용하는 방법은 LangChain 문서를 참고하세요.

위 링크에서 언급된 로더 외에도 이메일, Github, Google Drive 등 특정 애플리케이션에서 데이터를 직접 로드할 수 있는 추가 로더를 찾을 수 있습니다. 다양한 로더의 전체 목록은 여기에서 확인할 수 있습니다.

문서에 복잡한 구조, 형식, 테이블이 포함된 경우 LangChain의 unstructured 로더를 사용할 수 있습니다. 이 로더들은 내부적으로 unstructured 라이브러리를 사용하며, 이 라이브러리는 PDF, MSWord, PowerPoint 등 다양한 형식의 복잡한 문서를 처리하고 문서를 여러 구성 요소로 분해하는 데 가장 우수한 라이브러리 중 하나입니다. LangChain UnstructuredLoader

LlamaIndex 데이터 로더

LangChain과 마찬가지로 LlamaIndex도 다양한 유형의 로더를 지원합니다. LlamaIndex를 사용해 데이터를 로드하는 가장 간단한 방법 중 하나는 SimpleDirectoryReader를 사용하는 것입니다. SimpleDirectoryReader는 다음 유형을 지원합니다.

  • .csv - 쉼표로 구분된 값
  • .docx - Microsoft Word
  • .epub - EPUB 전자책 형식
  • .hwp - 한글 워드 프로세서
  • .ipynb - Jupyter Notebook
  • .jpeg, .jpg - JPEG 이미지
  • .mbox - MBOX 이메일 아카이브
  • .md - Markdown
  • .mp3, .mp4 - 오디오 및 동영상
  • .pdf - Portable Document Format
  • .png - Portable Network Graphics
  • .ppt, .pptm, .pptx Microsoft PowerPoint

다음 코드 스니펫을 사용하여 SimpleDirectoryLoader를 사용할 수 있습니다.

from llama_index.core import SimpleDirectoryReader

reader = SimpleDirectoryReader(input_dir="path/to/directory")
documents = reader.load_data()

특정 확장자만 디렉터리에서 읽도록 설정할 수도 있습니다.

SimpleDirectoryReader(
 input_dir="path/to/directory", required_exts=[".pdf", ".docx"]
 )

LlamaIndex 로더 사용 방법에 대한 자세한 내용은 해당 문서를 참고하세요.

또한 Huggingface와 유사하게 llamahub.ai에서 자체 커스텀 로더를 만들거나 다른 사람이 만든 커스텀 로더를 사용할 수 있습니다.

하지만 LangChain과 비교했을 때 LlamaIndex의 한 가지 단점은 문서화와 커뮤니티 지원이 LangChain만큼 좋지 않기 때문에 코드 디버깅이 더 어려울 수 있다는 점입니다.

비정형

복잡한 문서를 로드하는 경우 unstructured 라이브러리를 직접 사용할 수도 있습니다. unstructured 라이브러리는 테이블을 읽고 파싱하는 데 매우 뛰어납니다.

unstructured 라이브러리는 LangChain과 LlamaIndex의 래퍼에서도 지원되며, 이 경우 Document 객체를 자동으로 생성하고 반환하기 때문에 이후 RAG 파이프라인에서 사용하기 더 쉬울 수 있습니다. 그러나 프로젝트에서 더 많은 사용자 지정이 필요하고 unstructured 라이브러리를 직접 사용하려는 경우 다음 문서를 참고할 수 있습니다. Unstructured.

더 알아보기

IBM에서 제공하는 최신 기술 패턴, 솔루션 아키텍처, 아키텍처 관련 자료를 확인하세요.

  1. IBM Architecture Center로 이동
기고자