웹페이지, 유튜브, 이미지 등 다양한 형태의 온라인 콘텐츠를 자동으로 분석하여 제목, 요약, 태그, 썸네일을 생성하고, 처리된 데이터를 백엔드 서버에 제공하는 비동기 콘텐츠 처리 AI 서비스 입니다.
| 이름 | 역할 | GitHub |
|---|---|---|
| 구강현 | 백엔드 / 배포 / AI | https://github.com/GangHyoun |
| 송보민 | 백엔드 / AI | https://github.com/Songbomin |
| 정혜지 | 프론트엔드 / 디자인 | https://github.com/heartggs |
- 비동기 콘텐츠 처리: Celery를 사용하여 URL(웹페이지, 유튜브, 이미지)을 비동기적으로 처리하여 메인 서버의 부하를 줄입니다.
- 다양한 콘텐츠 요약 및 태깅:
- 웹페이지: 동적/정적 웹페이지의 본문을 추출(
Playwright,BeautifulSoup)하고OpenAI를 통해 요약 및 태그를 생성합니다. - 유튜브: 영상의 자막과 음성을
Whisper로 추출하여 텍스트로 변환한 후 요약 및 태그를 생성합니다. - 이미지:
EasyOCR로 이미지 내 텍스트를 추출(OCR)하여 요약 및 태그를 생성합니다.
- 웹페이지: 동적/정적 웹페이지의 본문을 추출(
- 썸네일 자동 생성:
Playwright를 사용하여 웹페이지의 스크린샷을 찍거나, 유튜브/이미지 URL에서 직접 썸네일을 추출합니다.- 생성된 썸네일은 AWS S3에 업로드되어 URL로 관리됩니다.
- 벡터 데이터베이스 활용: LangChain 파이프라인을 통해 처리된 텍스트를 벡터로 변환하고 PGVector에 저장하여 추후 검색 및 활용 가능성을 열어둡니다.
- 자세한 API 명세는 API 명세서 주소 참고하세요.
| 분류 | 사용 기술 | 설명 |
|---|---|---|
| 언어 | Python 3.10+ | AI 모델링 및 비동기 처리를 위한 주력 개발 언어 |
| 웹 프레임워크 | FastAPI | 비동기 API 서버를 구축하여 높은 성능과 빠른 응답 속도 보장 |
| 비동기 작업 큐 | Celery with Redis | URL 콘텐츠 처리 작업을 비동기적으로 실행하여 메인 서버 부하 감소 |
| AI/ML | OpenAI, LangChain | 텍스트 요약, 태그 생성 등 자연어 처리 파이프라인 구축 |
| AI/ML | Whisper, EasyOCR | 유튜브 음성 및 이미지 내 텍스트를 추출하여 데이터 소스 확장 |
| 웹 스크래핑 | Playwright, BeautifulSoup | 동적/정적 웹페이지의 본문 콘텐츠를 정확하게 추출 |
| 데이터베이스 | PostgreSQL with PGVector | 텍스트 벡터 데이터를 저장하여 향후 검색 및 AI 기능 확장성 확보 |
| 클라우드 서비스 | AWS S3 | 생성된 썸네일 이미지를 안정적으로 저장하고 URL로 관리 |
| 분류 | 사용 기술 | 설명 |
|---|---|---|
| IDE | Visual Studio Code | Python 개발 및 디버깅에 최적화된 통합 개발 환경 |
| 패키지 매니저 | Pip | requirements.txt를 통해 Python 프로젝트 의존성 관리 |
| 컨테이너화 | Docker, Docker Compose | 개발 환경을 컨테이너화하여 일관된 배포 및 실행 환경 보장 |
| 버전 관리 | Git + GitHub | 소스 코드 버전 관리 및 팀 협업을 위한 플랫폼 |
| CI/CD | GitHub Actions | main 브랜치 push 시 Docker 이미지를 빌드하여 EC2에 자동 배포 |
| 배포 | AWS EC2 | Docker 컨테이너를 이용한 서비스 애플리케이션 배포 환경 |
| 테스트 도구 | Postman | FastAPI로 구축된 API 엔드포인트 테스트 및 명세 확인 |
| 런타임 환경 | Python 3.10+ | AI 서비스 애플리케이션 실행 환경 |
| 인프라 관리 | AWS Console | EC2, RDS, S3 등 클라우드 인프라 구성 및 모니터링 |
- Docker 및 Docker Compose 설치
- AWS S3 버킷 및 IAM 자격 증명
- OpenAI API Key
- PostgreSQL 데이터베이스 (로컬 또는 원격)
-
프로젝트 클론
git clone [https://github.com/your-username/moggulmoggul-ai.git](https://github.com/your-username/moggulmoggul-ai.git) cd moggulmoggul-ai -
.env 파일 설정
OPENAI_API_KEY="sk-..."POSTGRES_DB=momo POSTGRES_USER=user POSTGRES_PASSWORD=p1234 PGVECTOR_CONNECTION_STRING=postgresql+psycopg2://user:p1234@db:5432/momoREDIS_URL=redis://redis:6379/0 CELERY_BROKER_URL=redis://redis:6379/0 CELERY_RESULT_BACKEND=redis://redis:6379/0AWS_ACCESS_KEY_ID="your_access_key" AWS_SECRET_ACCESS_KEY="your_secret_key" AWS_S3_BUCKET_NAME="your_bucket_name" -
Docker 이미지 빌드 및 컨테이너 실행
docker-compose up --build
- 애플리케이션 실행 확인
Docker 컨테이너가 정상적으로 실행되면, FastAPI 웹 서버는 http://localhost:8000에서 접근할 수 있습니다.
- API 엔드 포인트
-
비동기 요약 작업 생성:
POST/async-index/- Request Body:
{"url": "요약할 URL"} - Response:
{"task_id": "생성된 작업 ID"}
- Request Body:
-
작업 상태 및 결과 조회:
GET/summary-result/{task_id}- Response (완료 시):
{ "summary": "생성된 요약 내용", "title": "생성된 제목", "tags": ["태그1", "태그2"], "thumbnail_url": "S3에 업로드된 썸네일 URL" } - Response (진행 중) :
HTTP 202 Accepted상태 코드와 함께 진행 중 메시지 반환
- Response (완료 시):
-
썸네일 생성:
POST/thumbnail-
Request Body:
{"url": "썸네일 생성할 URL"} -
Response: 생성된 썸네일 이미지(PNG) 또는 유튜브 썸네일 URL로 리다이렉트
-
API 테스트는 Postman과 같은 도구를 사용하거나 FastAPI에서 제공하는 Swagger UI (http://localhost:8000/docs)를 통해 할 수 있습니다.
이 파이프라인은 URL을 입력받아 콘텐츠 유형에 따라 적절한 처리 과정을 거쳐 최종 결과를 생성합니다.
- URL 입력: 사용자가
POST /async-index/엔드포인트에 URL을 전송합니다. - 작업 등록: FastAPI 애플리케이션(
app/main.py)은 Celery 큐에process_url_task작업을 등록하고, 즉시 작업 ID를 반환합니다. - 썸네일 생성: Celery 워커는
app/summarizer.py의process_url_task를 실행하여, 먼저app/thumbnail_handler.py를 통해 썸네일을 생성하고 AWS S3에 업로드합니다. - 콘텐츠 유형 감지: 워커는
requests.head를 사용하여 URL의Content-Type을 확인하고, 유튜브 URL은 별도로 식별합니다. - 콘텐츠 추출 및 처리:
- 웹페이지:
app/extractor.py를 사용하여 웹페이지 본문을 추출합니다. 네이버 블로그는Playwright를 사용하고, 그 외는requests와BeautifulSoup를 사용합니다.app/text_filter.py를 통해 불필요한 텍스트를 제거합니다.
- 유튜브:
app/video_handler.py를 사용하여 영상의 자막(YouTubeTranscriptApi)과 음성(Whisper)을 추출하여 통합된 텍스트를 만듭니다.
- 이미지:
app/image_handler.py를 사용하여 이미지에서EasyOCR로 텍스트를 추출합니다.
- 웹페이지:
- AI 요약 및 태그 생성: 추출된 텍스트를
app/langchain_pipe.py로 전달하여,app/ai_utils.py의summarize_and_tag함수를 통해 OpenAI 모델로 제목, 요약, 태그를 생성합니다. - 결과 반환: 최종 결과(제목, 요약, 태그, 썸네일 URL)를 딕셔너리 형태로 반환하며, 이 결과는 Celery에 저장됩니다.
- 결과 조회: 클라이언트는
GET /summary-result/{task_id}엔드포인트를 주기적으로 호출(폴링)하여 작업 완료 상태를 확인하고 최종 결과를 받습니다.
이 파이프라인은 썸네일 생성만을 담당합니다.
- URL 입력: 사용자가
POST /thumbnail엔드포인트에 URL을 전송합니다. - 썸네일 유형 감지:
app/thumbnail_handler.py의generate_thumbnail함수는 URL이 유튜브, 이미지, 또는 일반 웹페이지인지 감지합니다. - 썸네일 생성:
- 유튜브: 고정된 유튜브 썸네일 URL로 리디렉션 응답을 반환합니다.
- 이미지/웹페이지:
Playwright를 사용하여 웹페이지 스크린샷을 찍거나, 이미지를 직접 다운로드하여 PNG 형식의 바이트 데이터를 반환합니다.