Dec 18

[교육/학습지원] Adivare: 공지사항 알림봇

📌 프로젝트 소개

업데이트 된 공지사항을 자동으로 알려주는 알림 봇 입니다.
Empty space, drag to resize

🧐 문제 정의

저희 프로젝트는 대학 공지사항을 수동으로 확인해야 하는 정보 과부하 및 비효율성을 해결하고자 했습니다.

핵심적으로는 주기적인 자동 감시를 통해 새로운 공지사항만 선별하고, 텍스트와 이미지(포스터)를 포함하는 멀티모달 데이터를 AI가 분석하도록 하여, 사용자가 복잡한 원본을 직접 읽지 않고도 핵심 일정, 대상, 요약 정보를 즉시 파악할 수 있도록 정보 접근성을 극대화하는 것이 목표였습니다.

이 과정에서 발생한 웹 크롤링 오류, URL 결합 오류, 그리고 API 요청 과부하 등의 기술적 문제들을 해결하는 데 중점을 두었습니다.
Empty space, drag to resize

💡 문제 해결

반복 실행 및 중복 제거: Schedule Trigger를 1시간마다 설정하고, Deduplicate 노드를 사용하여 게시글의 고유 ID를 DB에 저장하고 비교함으로써, 이미 처리된 항목을 걸러내고 새로운 공지사항만 다음 단계로 넘겼습니다.

데이터 클리닝 및 분리: HTML Extract 노드에서 발생한 잘못된 배열 구조와 postBody의 불필요한 줄바꿈/텍스트 오염 문제를 Code 노드를 사용하여 해결했습니다. 이 과정에서 배열을 개별 아이템으로 분리하고 텍스트를 정제했습니다.

URL 완성 및 필터링: 추출된 상대 경로 이미지 URL에 도메인을 결합하여 절대 경로(fullImageUrl)를 만들고, IF 노드를 사용하여 URL이 없는 아이템은 이미지 다운로드(HTTP Request) 노드를 건너뛰도록 분기 처리하여 Invalid URL 에러를 방지했습니다.

멀티모달 정보 추출: Upstage Information Extract 노드를 사용하여 이미지 다운로드 없이 Image URL을 직접 입력으로 받고, JSON Schema를 명확히 정의하여 LLM이 텍스트와 이미지를 종합 분석하여 깔끔한 JSON 형태의 요약 결과를 반환하도록 했습니다.
Empty space, drag to resize

⚙️ 핵심 기능

1. 자동 업데이트 및 중복 제거 (Polling & Deduplication)
핵심 기능: 워크플로를 1시간마다 주기적으로 실행(Schedule Trigger 설정)하고, 이전에 처리했던 공지사항은 걸러내어(Deduplicate 노드) 새로 올라온 게시물만 처리합니다.

구현 방법: 게시글 링크에서 고유 ID(articleId)를 추출하여 데이터베이스에 저장된 기록과 비교합니다. 이는 서버 부하와 사용자에게 가는 중복 알림을 방지하는 필수 기능입니다.

2. 멀티모달 정보 추출 및 클리닝 (Upstage 활용)
공지사항의 핵심 정보가 텍스트와 이미지에 흩어져 있거나, 텍스트 자체가 복잡한 HTML 잔여물로 오염된 문제를 해결합니다.

데이터 클리닝 (Code 노드): LLM에게 전달하기 전, postBody에서 불필요한 줄바꿈이나 공백을 제거하여 텍스트 품질을 최적화합니다.

이미지 URL 추출: fullImageUrl 필드를 완성하여, 이미지 다운로드 과정을 건너뛰고 Upstage API가 URL에 직접 접근하도록 합니다 (Input Type: Image URL 사용).

Upstage Information Extract (핵심):

입력: 공지 본문 텍스트 + 이미지 URL을 프롬프트(Context)에 통합하여 제공합니다.

멀티모달 분석: LLM이 이미지와 텍스트를 동시에 분석하여 포스터 내부의 핵심 정보(일정, 대상 등)를 놓치지 않고 파악하도록 지시합니다.

3. 구조화된 결과 생성 및 전달 (Schema Output)
핵심 기능: 분석된 정보를 사람이 읽기 편하고 시스템이 사용하기 쉬운 형태로 변환합니다.

Upstage JSON Schema: LLM 노드의 JSON Schema 필드에 원하는 최종 출력 구조(예: title, summary, period, contact)를 명확히 정의하여, LLM이 일관된 JSON 형태로 결과를 반환하도록 강제합니다.

최종 전달: 생성된 JSON 데이터에서 필요한 필드를 추출하여 디스코드, 이메일 등 사용자가 지정한 채널에 깔끔한 요약 메시지로 전송합니다.
Empty space, drag to resize

🎬 데모 영상

Write your awesome label here.
Empty space, drag to resize

👥 팀원 소개

박근영 - 워크플로우 제작

김재훈 - 자료수집
최진용 - 워크블로우 제작 보조, ppt보조, 영상촬영

강현우 - PPT작성
Empty space, drag to resize

💾 참고 자료