보여주는 매장
Next.js 화면이 토픽, 필터, 검색, 구독 설정을 보여준다. 손님이 보는 진열대다.
실전 사례 01 · 뉴스 공장
매일 쏟아지는 기사를 사람이 다 읽을 수는 없다. NewsHub는 기사를 모아 의미가 가까운 것끼리 묶고, AI가 “이 묶음이 진짜 쓸 만한 주제인가”를 검수한 뒤 뉴스레터로 만들어 보낸다. 원재료는 기사, 컨베이어벨트는 파이프라인, 완제품은 뉴스레터다.
수집된 기사 128개 중 의미가 가까운 7개가 한 묶음으로 올라왔다.
공개 강의용 안전 재현 화면. 실제 기사·구독자·운영 데이터 대신 같은 레이아웃으로 흐름만 보여준다.
부품은 수업에서 본 그대로다. 화면(매장), 주방(백엔드), 장부(DB)가 각자 역할을 맡는다.
Next.js 화면이 토픽, 필터, 검색, 구독 설정을 보여준다. 손님이 보는 진열대다.
FastAPI와 예약 작업(cron)이 수집 → 묶기 → 요약 → 뉴스레터 생성을 정해진 순서로 돌린다.
기사, 토픽, 뉴스레터 초안, 구독 설정, AI 비용 영수증이 PostgreSQL 장부에 남는다.
파이프라인은 컨베이어벨트다. 수업의 색 약속 그대로, 보라=외부 도구, 파랑=자료, 주황=AI, 초록=저장이다.
Naver, Google RSS, Baidu, Global RSS 창구에서 새 기사를 받아온다.
기사 제목·본문을 의미 지도 위 좌표로 바꾼다. 비슷한 기사는 가까워진다.
가까운 기사끼리 먼저 기계적으로 묶는다. AI를 부르기 전에 후보를 줄이는 체다.
LLM이 묶음을 keep/reject 판정하고, 통과한 주제로 뉴스레터 초안을 쓴다.
화면, 이메일로 나가고 기사·토픽·비용이 전부 장부에 남는다.
카드를 누르면 해당 교시로 돌아가 복습할 수 있다.
“이 기사와 저 기사가 같은 이야기인가”를 지도 위 거리로 비교한다.
2교시 · LLM 최종 판단과 글쓰기기사 묶음과 판단 규칙을 책상에 올려주면 keep/reject와 요약문을 만든다.
1교시 · 토큰 비용을 줄이는 설계모든 기사를 AI에 읽히면 토큰 폭탄이다. 그래서 임베딩으로 먼저 거른다.
5교시 · API 외부 창구 총출동뉴스 API, 임베딩 API, LLM API, 이메일 발송 API에 주문서를 보낸다.
6교시 · DB 기사와 토픽 장부원재료 창고(기사), 분류 상자(토픽), 완제품 박스(뉴스레터) 장부가 따로 있다.
6교시 · 비용 로그 AI 사용 영수증철input/output 토큰과 예상 비용을 남겨야 어느 기능이 돈을 쓰는지 보인다.
실제 운영 문구 대신, “판단 기준을 어떻게 적어주는가”가 보이도록 재작성했다.
역할: 뉴스 클러스터 검수자
입력:
- company_profile: 타깃 회사와 계열사 정보
- candidate_articles: 같은 주제로 묶인 기사 후보
- recent_topics: 최근 이미 만든 토픽 목록
판단 규칙:
- 타깃 회사가 주인공인지 확인한다.
- 단순 주가, 투자 의견, 광고성 문장은 reject.
- 같은 이야기가 최근 토픽에 있으면 중복 표시.
출력 JSON:
{
"decision": "keep | reject | duplicate",
"topic_title": "짧은 주제명",
"relevance_score": 0.0,
"reason": "판단 이유"
}
Stage 1. Fact extraction
원문 기사에서 사실, 인물, 수치, 출처를 뽑는다.
Stage 2. Top Story
가장 중요한 흐름 하나를 3문단으로 쓴다.
Stage 3. Headlines
여러 토픽을 짧은 제목과 근거 문장으로 정리한다.
Stage 4. Insights
단순 요약이 아니라 “왜 중요한지”를 설명한다.
Stage 5. Glossary
어려운 용어를 쉬운 한국어로 풀어준다.
포인트: 한 번에 다 시키지 않고,
앞 단계의 결과가 다음 단계의 근거가 된다.
5교시에서 본 API 주문 창구 그대로다. 요청서에 재료를 적어 보내면 응답서로 결과가 온다.
{
"model": "text-embedding-3-small",
"operation_type": "article_embedding",
"input": [
"A사가 신규 냉각 솔루션을 공개했다...",
"A사의 데이터센터 장비 수주가 증가했다..."
]
}
{
"article_id": "article_1029",
"embedding": "[0.018, -0.042, ...]",
"nearest_topic": "data_center_cooling",
"distance": 0.14,
"usage_log": {
"input_tokens": 128,
"estimated_cost_usd": 0.00001
}
}
2교시의 책상 그대로다. 색을 보면 어떤 종이가 자료(파랑)이고 어떤 종이가 AI의 답(주황)인지 보인다.
뉴스 검수자의 역할, 금지 규칙, JSON 출력 형식을 고정한다.
타깃 회사, 계열사, 경쟁사, 제외해야 할 투자성 기사 기준.
임베딩과 클러스터링으로 묶인 기사들의 제목·본문·출처.
이미 만든 토픽 목록. 같은 주제를 두 번 만들지 않게 한다.
keep/reject 판정, 토픽 제목, 판단 근거 — 그리고 비용 영수증 한 장.
6교시에서 배운 “역할별 장부 나누기”가 실전에서는 이렇게 된다.
| 장부 | 역할 | 비유 |
|---|---|---|
| news_articles | 수집한 원문 기사 저장 | 원재료 창고 |
| news_topics | 묶어서 만든 뉴스 주제 저장 | 분류된 상자 |
| email_newsletters | 완성된 뉴스레터 저장 | 완제품 박스 |
| newsletter_research_log | 인사이트 조사 과정 기록 | 조사 노트 |
| llm_usage_logs | AI 사용량과 비용 기록 | 영수증철 |
임베딩과 묶기로 후보를 먼저 줄인다. 모든 기사를 AI에게 읽히면 토큰 비용이 폭발한다.
“좋은 기사만 골라줘”가 아니라 “주가 기사는 빼, 중복이면 표시해”처럼 기준을 명시해야 결과가 안정된다.
AI 앱은 돈이 조용히 샌다. 모든 유료 호출은 llm_usage_logs 영수증철에 남긴다.