이 게시물에서는 LLM (Large Language Model) 교육 및 RAG (Retrieval Augmented Generation)와 같은 중요한 다운스트림 작업의 핵심인 문서 텍스트 추출을 위해 MinIO 버킷 알림 및 Apache Tika를 사용합니다.
다음 작업에 사용할 수 있는 텍스트 데이터 세트를 구성하고 싶다고 가정해 보겠습니다.
Apache Tika를 시작하고 실행하는 가장 간단한 방법은 다음을 사용하는 것입니다.
이 예에서는 기본 포트인 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 블로그 리소스 저장소에서도 사용 가능).
""" 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
이러한 환경 변수를 설정한 후mc
사용할 예정이므로 해당 도구가 있는지 확인하세요.
다음으로 버킷에 대한 이벤트 알림과 알림을 받을 이벤트 유형을 구성해 보겠습니다. 이 프로젝트의 목적을 위해 ' 추출 '이라는 이름의 새로운 버킷을 만들었습니다. 당신은 이것을 할 수 있습니다mc
mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put
마지막으로, 다음 명령을 실행할 때 s3:ObjectCreated:*
가 출력되는지 확인하여 버킷 알림에 대한 올바른 이벤트 유형을 구성했는지 확인할 수 있습니다.
mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook
버킷 이벤트를 웹훅에 게시하는 방법에 대해 자세히 알아보려면 다음을 확인하세요.
다음은 텍스트를 추출하려는 문서입니다. 그것은
저는 MinIO 콘솔을 사용하여 이 PDF를 ' 추출 ' 버킷에 넣었습니다.
이 PUT 이벤트는 버킷 알림을 트리거한 다음 추출 서버 엔드포인트에 게시합니다. 따라서 Tika에서 텍스트를 추출하여 콘솔에 인쇄합니다.
지금은 추출된 텍스트를 인쇄하고 있지만 The Premise에서 암시한 것처럼 이 텍스트는 많은 다운스트림 작업에 사용될 수 있습니다. 예를 들어:
LLM 미세 조정을 위한 데이터 세트 생성 : 다양한 파일 형식(예: PDF, DOCX, PPTX, Markdown 등)으로 존재하는 기업 문서 모음에서 대규모 언어 모델을 미세 조정하고 싶다고 상상해 보세요. 이 작업을 위한 LLM 친화적인 텍스트 데이터 세트를 생성하려면 유사한 웹훅으로 구성된 MinIO 버킷에 이러한 모든 문서를 수집하고 각 문서에 대해 추출된 텍스트를 미세 조정/훈련 세트의 데이터 프레임에 전달할 수 있습니다. 또한 데이터세트의 소스 파일을 MinIO에 두면 데이터세트의 구성을 관리, 감사 및 추적하는 것이 훨씬 쉬워집니다.
검색 증강 생성 : RAG는 LLM 응용 프로그램이 정확한 컨텍스트를 활용하고 환각을 피할 수 있는 방법입니다. 이 접근 방식의 핵심 측면은 문서의 텍스트를 추출한 다음 벡터에 삽입하여 의미 체계 검색을 가능하게 하는 것입니다. 또한 일반적으로 이러한 벡터의 실제 소스 문서를 개체 저장소(예: MinIO!)에 저장하는 것이 가장 좋습니다. 이 게시물에 설명된 접근 방식을 사용하면 두 가지 모두 쉽게 달성할 수 있습니다. RAG와 그 이점에 대해 자세히 알아보려면 다음을 확인하세요.
LLM 응용 프로그램 : 새로 저장된 문서에서 텍스트를 즉시 추출하는 프로그래밍 방식을 사용하면 특히 LLM을 활용할 수 있는 경우 가능성이 무궁무진합니다. 키워드 감지(즉, 프롬프트: “어떤 주식 시세가 언급되어 있나요?”), 내용 평가(즉, 프롬프트: “루브릭에 따라 이 에세이 제출은 어떤 점수를 받아야 할까요?) 또는 거의 모든 종류의 텍스트 기반 분석을 생각해 보세요. (예: 프롬프트: "이 로그 출력에 따르면 첫 번째 오류는 언제 발생했습니까?")
이러한 작업에 대한 버킷 알림의 유용성 외에도 MinIO는 Powerpoint, 이미지, 코드 조각 등 모든 유형 및 개수의 개체에 대해 세계 최고 수준의 내결함성과 성능을 제공하도록 구축되었습니다.
질문이 있으시면 우리와 함께하세요