paint-brush
자동화된 텍스트 추출 및 분석을 위해 MinIO 및 Apache Tika 활용~에 의해@minio
7,928 판독값
7,928 판독값

자동화된 텍스트 추출 및 분석을 위해 MinIO 및 Apache Tika 활용

~에 의해 MinIO7m2024/04/11
Read on Terminal Reader

너무 오래; 읽다

이 게시물에서는 LLM(대형 언어 모델) 교육 및 RAG(검색 증강 생성)와 같은 중요한 다운스트림 작업의 핵심인 문서 텍스트 추출을 위해 MinIO 버킷 알림 및 Apache Tika를 사용합니다.
featured image - 자동화된 텍스트 추출 및 분석을 위해 MinIO 및 Apache Tika 활용
MinIO HackerNoon profile picture
0-item
1-item


이 게시물에서는 LLM (Large Language Model) 교육 및 RAG (Retrieval Augmented Generation)와 같은 중요한 다운스트림 작업의 핵심인 문서 텍스트 추출을 위해 MinIO 버킷 알림 및 Apache Tika를 사용합니다.


전제

다음 작업에 사용할 수 있는 텍스트 데이터 세트를 구성하고 싶다고 가정해 보겠습니다. 미세 조정 LLM. 이를 위해서는 먼저 다양한 문서(소스로 인해 다른 폼 팩터가 있을 수 있음)를 조합하고 해당 문서에서 텍스트를 추출해야 합니다. 데이터 세트 보안과 감사 가능성이 가장 중요하므로 이러한 구조화되지 않은 문서는 일치하도록 객체 저장소에 저장해야 합니다. MinIO는 다음을 위해 만들어진 객체 저장소입니다. 이러한 상황과 그 이상 . 반면, Apache Tika는 "1000개 이상의 다양한 파일 형식(예: PPT, XLS, PDF)에서 메타데이터와 텍스트를 감지하고 추출"하는 툴킷입니다. 그들은 함께 모여 우리의 목표를 달성할 수 있는 시스템을 형성합니다.


이전 게시물에서 , 우리는 즉시 사용 가능한 MinIO와 약 30줄의 코드를 갖춘 객체 감지 추론 서버를 구성했습니다. 이식성이 뛰어나고 반복 가능한 아키텍처를 다시 한번 활용해 보겠습니다. 이번에는 텍스트 추출 작업입니다. 아래는 우리가 구축할 시스템의 대략적인 그림입니다.




아파치 티카 설정

Apache Tika를 시작하고 실행하는 가장 간단한 방법은 다음을 사용하는 것입니다. 공식 Docker 이미지 . 원하는 Tika 이미지 버전/태그는 Docker Hub를 확인하세요.



이 예에서는 기본 포트인 9998을 사용하고 노출하도록 허용합니다.


 docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>


docker ps 또는 Docker Desktop을 사용하여 Tika 컨테이너가 실행 중이고 포트 9998을 노출했는지 확인하세요.


텍스트 추출 서버 구축

이제 Tika가 실행되었으므로 프로그래밍 방식으로 새 개체에 대한 Tika 추출 요청을 할 수 있는 서버를 구축해야 합니다. 그런 다음 MinIO 버킷에 웹후크를 구성하여 새 객체(즉, 버킷에 대한 PUT 이벤트) 도착을 이 서버에 알리도록 해야 합니다. 단계별로 살펴보겠습니다.


상대적으로 단순함을 유지하고 이 접근 방식의 이식성을 강조하기 위해 텍스트 추출 서버는 널리 사용되는 Flask 프레임워크를 사용하여 Python으로 구축됩니다. 다음은 서버에 대한 코드입니다(아래의 MinIO 블로그 리소스 저장소에서도 사용 가능). 추출_서버.py )는 Tika를 사용하여 버킷에 추가된 새 문서에서 텍스트 추출을 수행합니다. 티카-파이썬 ).


 """ This is a simple Flask text extraction server that functions as a webhook service endpoint for PUT events in a MinIO bucket. Apache Tika is used to extract the text from the new objects. """ from flask import Flask, request, abort, make_response import io import logging from tika import parser from minio import Minio # Make sure the following are populated with your MinIO details # (Best practice is to use environment variables!) MINIO_ENDPOINT = '' MINIO_ACCESS_KEY = '' MINIO_SECRET_KEY = '' # This depends on how you are deploying Tika (and this server): TIKA_SERVER_URL = 'http://localhost:9998/tika' client = Minio( MINIO_ENDPOINT, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, ) logger = logging.getLogger(__name__) app = Flask(__name__) @app.route('/', methods=['POST']) async def text_extraction_webhook(): """ This endpoint will be called when a new object is placed in the bucket """ if request.method == 'POST': # Get the request event from the 'POST' call event = request.json bucket = event['Records'][0]['s3']['bucket']['name'] obj_name = event['Records'][0]['s3']['object']['key'] obj_response = client.get_object(bucket, obj_name) obj_bytes = obj_response.read() file_like = io.BytesIO(obj_bytes) parsed_file = parser.from_buffer(file_like.read(), serverEndpoint=TIKA_SERVER_URL) text = parsed_file["content"] metadata = parsed_file["metadata"] logger.info(text) result = { "text": text, "metadata": metadata } resp = make_response(result, 200) return resp else: abort(400) if __name__ == '__main__': app.run()


추출 서버를 시작해 보겠습니다.



Flask 애플리케이션이 실행 중인 호스트 이름과 포트를 기록해 둡니다.


버킷 알림 설정

이제 남은 것은 버킷의 모든 PUT 이벤트(새 개체 추가라고도 함)가 추출 엔드포인트에 대한 호출을 트리거하도록 MinIO 서버의 버킷에 대한 웹후크를 구성하는 것입니다. mc 도구를 사용하면 몇 가지 명령만으로 이 작업을 수행할 수 있습니다.


먼저, Webhook 및 해당 엔드포인트 호출을 활성화한다는 사실을 MinIO 서버에 알리기 위해 몇 가지 환경 변수를 설정해야 합니다. <YOURFUNCTIONNAME>을 선택한 함수 이름으로 바꾸세요. 단순화를 위해 '추출'을 선택했습니다. 또한 엔드포인트 환경 변수가 추론 서버에 대한 올바른 호스트 및 포트로 설정되어 있는지 확인하세요. 이 경우 http://localhost:5000은 Flask 애플리케이션이 실행되는 곳입니다.


 export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000


이러한 환경 변수를 설정한 후 MinIO 서버 (또는 이미 실행 중이었다면, 다시 시작해 ). 다음 단계에서는 MinIO 서버 배포를 위한 '별칭'이 필요합니다. 별칭 및 별칭 설정 방법에 대해 자세히 알아보려면 다음을 확인하세요. 선적 서류 비치 . 또한 MinIO 클라이언트 명령줄 도구인 mc 사용할 예정이므로 해당 도구가 있는지 확인하세요. 설치됨 .


다음으로 버킷에 대한 이벤트 알림과 알림을 받을 이벤트 유형을 구성해 보겠습니다. 이 프로젝트의 목적을 위해 ' 추출 '이라는 이름의 새로운 버킷을 만들었습니다. 당신은 이것을 할 수 있습니다 MinIO 콘솔을 통해 아니면 mc 명령 ' 추출' 버킷에 새 객체를 추가할 때 웹후크를 트리거하려고 하므로 PUT 이벤트가 우리의 초점입니다. ALIAS를 MinIO 서버 배포의 별칭 으로 바꾸고 BUCKET을 해당 서버의 원하는 버킷으로 바꿉니다. 이전과 마찬가지로 <YOURFUNCTIONNAME>을 이전 단계에서 사용한 것과 동일한 값으로 바꿔야 합니다.


 mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put


마지막으로, 다음 명령을 실행할 때 s3:ObjectCreated:* 가 출력되는지 확인하여 버킷 알림에 대한 올바른 이벤트 유형을 구성했는지 확인할 수 있습니다.


 mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook


버킷 이벤트를 웹훅에 게시하는 방법에 대해 자세히 알아보려면 다음을 확인하세요. 문서 설명은 이것뿐만 아니라 이벤트 알림에 대해 자세히 알아보기 . 이제 텍스트 추출 서버를 시험해 볼 준비가 되었습니다.


사용해 보세요

다음은 텍스트를 추출하려는 문서입니다. 그것은 2000년 원자재 미래 현대화법 PDF , 미국의 영향력 있는 금융 법안입니다.



저는 MinIO 콘솔을 사용하여 이 PDF를 ' 추출 ' 버킷에 넣었습니다.



이 PUT 이벤트는 버킷 알림을 트리거한 다음 추출 서버 엔드포인트에 게시합니다. 따라서 Tika에서 텍스트를 추출하여 콘솔에 인쇄합니다.



다음 단계


지금은 추출된 텍스트를 인쇄하고 있지만 The Premise에서 암시한 것처럼 이 텍스트는 많은 다운스트림 작업에 사용될 수 있습니다. 예를 들어:


  1. LLM 미세 조정을 위한 데이터 세트 생성 : 다양한 파일 형식(예: PDF, DOCX, PPTX, Markdown 등)으로 존재하는 기업 문서 모음에서 대규모 언어 모델을 미세 조정하고 싶다고 상상해 보세요. 이 작업을 위한 LLM 친화적인 텍스트 데이터 세트를 생성하려면 유사한 웹훅으로 구성된 MinIO 버킷에 이러한 모든 문서를 수집하고 각 문서에 대해 추출된 텍스트를 미세 조정/훈련 세트의 데이터 프레임에 전달할 수 있습니다. 또한 데이터세트의 소스 파일을 MinIO에 두면 데이터세트의 구성을 관리, 감사 및 추적하는 것이 훨씬 쉬워집니다.


  2. 검색 증강 생성 : RAG는 LLM 응용 프로그램이 정확한 컨텍스트를 활용하고 환각을 피할 수 있는 방법입니다. 이 접근 방식의 핵심 측면은 문서의 텍스트를 추출한 다음 벡터에 삽입하여 의미 체계 검색을 가능하게 하는 것입니다. 또한 일반적으로 이러한 벡터의 실제 소스 문서를 개체 저장소(예: MinIO!)에 저장하는 것이 가장 좋습니다. 이 게시물에 설명된 접근 방식을 사용하면 두 가지 모두 쉽게 달성할 수 있습니다. RAG와 그 이점에 대해 자세히 알아보려면 다음을 확인하세요. 이전 게시물 .


  3. LLM 응용 프로그램 : 새로 저장된 문서에서 텍스트를 즉시 추출하는 프로그래밍 방식을 사용하면 특히 LLM을 활용할 수 있는 경우 가능성이 무궁무진합니다. 키워드 감지(즉, 프롬프트: “어떤 주식 시세가 언급되어 있나요?”), 내용 평가(즉, 프롬프트: “루브릭에 따라 이 에세이 제출은 어떤 점수를 받아야 할까요?) 또는 거의 모든 종류의 텍스트 기반 분석을 생각해 보세요. (예: 프롬프트: "이 로그 출력에 따르면 첫 번째 오류는 언제 발생했습니까?")


이러한 작업에 대한 버킷 알림의 유용성 외에도 MinIO는 Powerpoint, 이미지, 코드 조각 등 모든 유형 및 개수의 개체에 대해 세계 최고 수준의 내결함성과 성능을 제공하도록 구축되었습니다.


질문이 있으시면 우리와 함께하세요 슬랙 채널 또는 다음 주소로 메모를 남겨주세요. [email protected] . 우리는 당신을 돕기 위해 여기 있습니다.