SK ← Sungju Kim · Data & AI Systems Engineer
Career커리어 / Selected work주요 작업 / System시스템 01

Vertical AI Pipeline for an Industrial-Security Customer산업 보안 고객을 위한 버티컬 AI 파이프라인

A Slack-triggered workflow from collection to LLM-generated report, designed and operated end to end.수집부터 LLM 리포트 생성까지, Slack으로 시작하는 워크플로우를 엔드투엔드로 설계·운영.

Python 3.13Argo WorkflowsFastAPISlack BoltIn-house LLMGoogle Sheets APIKubernetes

Problem문제

An industrial-security customer needed monitoring across Korean and Chinese corporate sources for potential industrial leaks. Analysts were manually stitching together collection, parsing, LLM field extraction, and report drafting for each keyword.산업 보안 고객은 잠재적 기술 유출을 찾기 위해 한국·중국 기업 소스 전반의 모니터링이 필요했습니다. 분석가들은 키워드마다 수집, 파싱, LLM 필드 추출, 리포트 초안 작성을 수작업으로 이어 붙이고 있었습니다.

System시스템

Designed end to end as the sole owner. A Slack command starts an Argo Workflow that fans out site-specific scrapers across policy domains, persists raw URLs through an internal API, and uses an exit handler to call the in-house LLM service for field extraction and report drafting. Progress and the final report link land back in the same Slack thread.단독 오너로 엔드투엔드 설계. Slack 명령이 Argo Workflow를 시작해 정책 도메인별 사이트 전용 스크래퍼를 팬아웃하고, 내부 API로 원본 URL을 저장하며, exit handler에서 사내 LLM 서비스를 호출해 필드 추출과 리포트 초안을 만듭니다. 진행 상황과 최종 리포트 링크는 처음 시작한 Slack 스레드로 돌아옵니다.

Slack /search Argo Workflow Scraper pods Internal API LLM extract Report → Slack

Impact임팩트

Replaced the manual sequence with a single workflow. The same pipeline runs internally and is offered to the customer as Slack self-service: one keyword input triggers collection, LLM extraction, report drafting, and notification.수작업 절차를 하나의 워크플로우로 대체했습니다. 같은 파이프라인이 사내에서도 돌고, 고객에게는 Slack 셀프서비스로 제공됩니다. 키워드 입력 한 번으로 수집, LLM 추출, 리포트 초안, 알림까지 실행됩니다.

Architecture notes아키텍처 노트

The public lab uses the same operating pattern shown here: a scheduled agent does the heavy work ahead of time, writes a static JSON artifact, and the page reads that artifact. Loading the page never calls an LLM. If collection or generation fails, the existing page still works; only the next refresh is delayed.

공개 Lab도 여기서 보여준 것과 같은 운영 패턴으로 동작합니다. 스케줄 에이전트가 무거운 작업을 미리 처리해 정적 JSON 아티팩트를 쓰고, 페이지는 그 파일을 읽기만 합니다. 페이지를 여는 것만으로는 LLM이 호출되지 않으며, 수집이나 생성이 실패해도 기존 페이지는 계속 동작하고 다음 갱신만 늦어집니다.

The Argo Workflow uses withParam to start one scraper Pod per policy. The LLM step runs as an Argo exit handler, so collection success and report generation have separate failure domains. Slack thread state (thread_ts) is propagated through the full workflow so progress, errors, and the final report link all stay in the thread the customer started.

The in-house LLM call is the only AI step, and it runs inside the workflow rather than while a user is waiting on the Slack UI. Slack only receives progress updates and the final report URL.

Argo Workflow는 withParam으로 정책마다 스크래퍼 Pod을 하나씩 시작합니다. LLM 단계는 Argo exit handler로 실행되어 수집 성공과 리포트 생성의 실패 도메인이 분리됩니다. Slack 스레드 상태(thread_ts)가 워크플로우 전체를 관통해 전달되므로 진행 상황, 오류, 최종 리포트 링크가 모두 고객이 시작한 스레드에 남습니다.

사내 LLM 호출이 유일한 AI 단계이며, 사용자가 Slack UI에서 기다리는 동안이 아니라 워크플로우 내부에서 실행됩니다. Slack은 진행 상황 업데이트와 최종 리포트 URL만 받습니다.

Stack스택

Python 3.13Argo WorkflowsFastAPISlack BoltIn-house LLMGoogle Sheets APIKubernetes