1. API 요약으로는 근거가 안 된다
문제. 네이버 검색 API의 description 이 평균 120자입니다. 10건이 전부 말줄임으로 끝납니다.
이투데이=조소현 기자 | 법원이 종합편성채널 제이티비씨(JTBC)에 대해
회생절차 개시를 결정했다. 제작비 상승과 방송광고시장 축소, 올림픽
중계권료 지출 등에 중앙그룹 전반의 유동성 위기까지 겹치면서 재정적...사건은 알 수 있지만 인용할 사실이 없습니다. 결정 날짜, 채권자, 금액이 잘린 뒤에 있습니다.
파라미터로 늘릴 수 있는지 확인했습니다. fields=full, descriptionLength=1000 모두 응답이 동일했습니다. 응답 필드가 title · link · originallink · description · pubDate 다섯 개뿐이라 본문이 들어올 자리가 없습니다.
조치. link 를 직접 HTTP GET 해서 본문을 뽑습니다.
결과. 120자 → 평균 1,500자. 10건 중 9건 성공.
2. 본문 컨테이너를 파서 없이 찾기
문제. 언론사마다 본문 컨테이너가 다릅니다.
html<div id="dic_area"> <!-- 네이버 뉴스 -->
<div id="newsct_article"> <!-- 네이버 뉴스(다른 버전) -->
<div class="article_body"> <!-- 일부 경제지 -->
<div itemprop="articleBody"> <!-- 스키마 마크업 -->
<article> <!-- HTML5 표준 -->여는 태그는 정규식으로 찾지만 닫는 위치를 못 찾습니다. div 가 중첩돼 있어 짝을 맞추려면 파서가 필요합니다.
조치. 컨테이너 시작점부터 40,000자를 잘라 태그를 걷어낸 뒤, 표지별 결과 중 가장 긴 것을 고릅니다. 본문이 가장 길다는 전제입니다.
같은 표지가 여러 번 나오면 모두 시도합니다. id="content" 가 메뉴에도 붙어 있어 첫 번째만 보면 메뉴에서 시작하는 경우가 있었습니다.
3. 사이드바가 본문에 섞여 들어왔다
문제. 기사는 1,459자에서 끝났는데 4,687자를 가져오고 있었습니다.
… 회생계획안 제출 기한은 내년 1월 29일까지다.
AI 추천 뉴스 [속보] 법원, JTBC 회생절차 개시 결정…ARS 종료
#JTBC #회생 #ARS 조소현 기자의 주요 뉴스 자세히보기
좋아요 0 화나요 0 슬퍼요 0 추가취재 원해요 0
주요 뉴스 2개월 만에 물가 3% 복귀… SKT통신비 할인 기저효과
8월 물가 3.1%↑…"SKT할인 기저효과 0.58%p" …뒤쪽 3,200자가 추천 기사 목록, 반응 버튼, 그리고 다른 기사의 본문이었습니다. LLM 입장에서 8월 소비자물가 3.1% 상승 이 JTBC 회생 기사의 일부로 읽힙니다.
기존 절단 규칙은 저작권자·무단전재·댓글 만 찾았는데, 이 매체는 그 문구가 없어 끊을 지점을 못 찾았습니다.
조치. 여러 매체 HTML을 열어 본문 종료 표지를 세 갈래로 정리했습니다.
| 갈래 | 표지 |
|---|---|
| 추천 기사 | AI 추천 뉴스 · 많이 본 뉴스 · 기자의 주요 뉴스 |
| 반응·공유 | 좋아요 0 · 화나요 0 · 기사 공유하기 |
| 해시태그 | #JTBC #회생 (연속 2개 이상) |
결과. 4,687자 → 1,516자. 끝이 JTBC의 회생계획안 제출 기한은 내년 1월 29일까지다. 로 정확히 맞습니다.
4. 본문 앞쪽 UI도 걷어냈다
문제. 뒤쪽만 잘라서는 이런 게 남습니다.
기자 이름을 클릭하면 더 자세한 정보를 확인할 수 있어요!
북마크 되었습니다. 마이페이지에서 확인하세요.
▶ 기사 듣기 00:00 / 구글 선호매체 추가
카카오톡 페이스북 엑스 URL공유 가장작게 작게 기본 크게 가장크게조치. 앞쪽 전용 제거 규칙을 따로 뒀습니다. 매체명·분류·제목·수정/입력 시각·기자명도 함께 지웁니다. 제목은 근거 첫 줄에 따로 적으므로 본문에 또 넣으면 중복입니다.
주의한 점. 카카오톡 을 무조건 지우면 현대홈쇼핑이 카카오톡 선물하기와 제휴 같은 본문이 훼손됩니다. 공유 버튼 이름이 2개 이상 연속일 때만 지웁니다. 글자 크기(가장작게 작게 기본)도 3개 이상 연속일 때만입니다.
사진 설명도 지웁니다 — (… 사진=연합), [사진=연합뉴스], ▲서울 서초구 서울회생법원 (조소현 기자 sohyun@) 형태입니다.
5. ⓒ 가 이미지 alt 안에 있었다
문제. 한 매체에서 본문이 95자만 나왔습니다.
html<img alt="배경훈 부총리 겸 과학기술정보통신부 장관. ⓒ 뉴스1 김명섭 기자" …>절단 표지에 ⓒ 를 넣어뒀는데, 이게 이미지 alt 속성 안에 있었습니다. 사진 캡션이라 본문 맨 앞에 옵니다. 저작권 표시로 오인해 511자 지점에서 끊었습니다.
조치. ⓒ 단독을 표지에서 뺐습니다. 저작권 문구는 저작권자·무단전재 로 잡히고, ⓒ 는 본문 중간에도 흔히 나옵니다.
결과. 95자 → 2,483자.
6. 원문을 다 넣으면 입력이 4배가 된다
문제. 원문은 요약보다 10~15배 깁니다. 관련 기사가 회사당 10~20건이니 전부 넣으면 입력 토큰이 4배입니다(실측: 한국마사회 13건 × 3,800자 = 32,933토큰). 12,515를 곱하면 감당이 안 됩니다.
조치 셋.
요약을 먼저 보고 고릅니다. 관련 판정을 통과한 기사의 제목과 요약(120자)만 LLM에게 보여 원문을 받을 것을 고르게 했습니다. 요약 20건은 다 넣어도 2,400자입니다. 여기서 고른 것만 HTTP 요청을 보냅니다.
기사 선별(제이티비씨): 10건 중 5건 선정
기사 원문 수집: 4/5건앞부분만 씁니다. 기사는 앞에 사실관계가 몰려 있어 800자면 충분합니다. 문장 중간에 끊기지 않게 마지막 문장 끝까지만 남깁니다. 이 처리 전에는 법원은 별도의 관리인은 선임하지 않기로 로 끊겼습니다.
종결어미를 줄입니다. 결정했다. → 결정함. 으로 약 2%. LLM 입력에만 적용하고 저장된 원문은 그대로 둡니다. 미리 줄이면 나중에 인용할 때 어색한 문장이 나갑니다.
7. 검색어 12개가 1개보다 나빴다
문제. LLM이 검색어를 10~12개 만들고 조합마다 검색했습니다. 회사당 12회, 전체 15만 회입니다.
측정 결과.
| 방식 | 받은 건수 | 관련 기사 |
|---|---|---|
| 검색어 1개 × 100건 | 100 | 26건 |
| 검색어 12개 × 30건 | 360 | 1건 |
30건씩 나눠 받으면 상위 기사가 겹쳐 옵니다. 360건을 받아도 중복 제거 후 1건이었습니다.
조치. 검색어를 하나만 만들고 100건을 한 번에 받습니다.
결과. 호출 15만 회 → 12,515회.
검색어 생성 자체의 토큰도 줄였습니다. 조합 하나를 만드는 데 근거 6,000자를 넣고 max_tokens=1500 을 쓰고 있었습니다.
| 이전 | 이후 | |
|---|---|---|
| 근거 | 6,000자 | 1,200자 |
| max_tokens | 1500 | 500 |
| 호출당 입력 | 1,140 | 820 |
| 호출당 출력 | 709 | 188 |
max_tokens=300 까지 낮췄더니 추론 모델이 한도를 다 먹어 content 가 비고 재시도(900)가 돌았습니다. 재시도가 더 비싸서 500으로 되돌렸습니다.
8. 검색어가 너무 좁아 0건이 나왔다
문제. 조합을 하나만 만들게 하자 이런 검색어가 나왔습니다.
제이티비씨 회생절차개시결정 부도발생 → 검색 결과 2건 → 관련 0건공시 제목을 그대로 붙인 것입니다. 회생절차개시결정, 기한의이익상실, 반기검토의견부적정 은 공시 서식 용어라 기사에 안 쓰입니다.
조치. 프롬프트에 규칙을 넣었습니다.
기사에 실제로 쓰이는 말이어야 한다. 공시 서식 용어는 언론이 안 쓴다. 뜻이 통하는 말로 바꿔라 —기한의이익상실→채무불이행.
결과. 제이티비씨 회생절차 채무불이행 으로 바뀌어 0건 → 3건.
자료가 없어 폴백으로 갈 때도 문제가 있었습니다. 현대홈쇼핑 실적 발표 같은 일반어를 붙이니 1건이었습니다. 회사명 단독으로 바꾸자 8건이 됐습니다.
9. KAIST 를 못 알아봤다
문제. 공공기관을 돌렸더니 관련 기사가 0건이었습니다. 매체 필터는 9건을 통과시켰는데 관련 판정에서 전부 탈락했습니다.
[X] 과학기술인 성장 '두뇌 고속도로' 만든다…5개년 계획 수립
[X] 의대 쏠림에 꺾인 이공계…정부, 과학인재 1만명 키운다언론은 한국과학기술원 을 KAIST 로 씁니다. 별칭 목록에 한글 표기만 있었습니다.
조치. DART 기업개황의 영문 법인명(corp_name_eng)에서 약칭을 뽑습니다. JTBC Co., Ltd → JTBC 처럼 법인 표기를 떼고 대문자 낱말만 남깁니다. 영문명이 없는 기관(한국전력·코레일·LH 등)은 표에 직접 적었습니다.
결과. 0건 → 6건.
10. 매체를 12곳으로 좁혔더니 근거가 얇아졌다
문제. 회의에서 수집 대상 매체를 10곳 안팎으로 정했습니다. 그대로 12곳으로 좁혔더니 검색 결과의 71~77%가 걸러져 회사당 관련 기사가 3~5건만 남았습니다.
조치. 고객사 13곳을 검색해 매체별 기사량을 측정했습니다. 316곳이 나왔고, 지역지·보도자료 재배포가 대부분이었습니다. 기사량 상위이면서 사실 보도 비중이 높은 곳으로 35곳을 골랐습니다.
| 구분 | 매체 |
|---|---|
| 통신사 | 연합뉴스 · 뉴스1 · 뉴시스 · 뉴스핌 · 연합인포맥스 |
| 경제지 | 한국경제 · 매일경제 · 서울경제 · 이데일리 · 머니투데이 · 파이낸셜뉴스 외 |
| 종합지 | 한겨레 · 조선일보 · 동아일보 · 중앙일보 · 경향신문 외 |
| 산업·IT | 전자신문 · 디지털타임스 · 디지털데일리 · ZDNet · 아이뉴스24 |
| 방송 | SBS · KBS · MBC · YTN |
결과. 회사당 3~5건 → 6~14건.
한 매체는 제외했습니다. 본문 컨테이너가 id="content" 하나뿐인데 그 안 878자 지점에 댓글 이 나와 본문보다 앞섭니다. 추출하면 82자만 남습니다.
11. 재검색이 같은 검색어를 다시 돌고 있었다
문제. 관련 기사가 10건에 못 미치면 예비 조합 → 회사명 단독 → 영문 약칭 순으로 다시 찾게 해뒀습니다. 그런데 미달이 자주 났습니다.
pythondef _run(plan):
for query, category in queries: # plan 을 받아놓고 queries 를 돈다파라미터 plan 을 받아서 바깥 queries 를 순회하고 있었습니다. 재검색을 불러도 처음 검색어를 그대로 다시 돌린 것입니다. 결과가 전부 seen_urls 에 있어 한 건도 안 늘고 호출만 나갔습니다.
폴백 세 갈래가 한 번도 동작한 적이 없었습니다. 파라미터를 안 쓰는 코드라 예외도 경고도 없이 조용히 지나갑니다.
결과. plan 으로 고쳤습니다. JTBC 기준 검색 1회 100건 → 2회 200건, 관련 기사 10건 → 12건.
12. 요약과 본문이 다른 기사처럼 보였다
문제. 샘플을 보다가 요약과 본문이 어긋나는 것을 발견했습니다.
제목: "회사 부도 났다"던 이나연…"에어컨 안 나온다" 발언
요약: JTBC는 지난달 12일 206억 원 규모의 유동화 차입금을 상환하지 못해…
본문: JTBC 골프 아나운서 출신 방송인 이나연(30)이 유튜브에서…수집 코드가 제목과 요약을 뒤바꾼 줄 알고 파이프라인을 되짚었습니다. API 응답 조립, 중복 제거, 기사 선별까지 전부 같은 항목에서 필드를 꺼내고 있어 섞일 자리가 없었습니다.
같은 기사를 검색어만 바꿔 다시 받아봤습니다.
검색어 `이나연 JTBC 골프 아나운서` → 요약: 한편 이나연은 2021년 JTBC 골프…
검색어 `JTBC 회생절차 디폴트 사채` → 요약: JTBC는 지난달 12일 206억 원…코드 문제가 아니었습니다. 네이버의 description 은 기사 첫머리가 아니라 검색어가 걸린 주변 문장입니다. 같은 기사도 검색어에 따라 다른 대목이 나옵니다. 본문은 항상 첫머리부터라 둘이 어긋나 보입니다.
남는 문제. 기사 선별을 이 요약만 보고 합니다. 그래서 연예 기사가 재무 기사로 뽑혔습니다 — 회생절차 문장이 요약에 걸렸기 때문입니다.
13. 연예 기사를 매체로는 못 거른다
문제. 소속 아나운서 기사가 회사명을 달고 재무 근거로 들어왔습니다.
처음엔 네이버 연예 도메인을 막으면 될 줄 알았는데, 실제 주소를 찍어보니 원문 매체로 풀립니다.
www.mk.co.kr ← 이나연 에어컨 (연예)
www.sportschosun.com ← 이나연 에어컨 (연예)매일경제가 연예면을 함께 냅니다. mk.co.kr 을 막으면 매일경제 사업 기사까지 전부 사라집니다.
조치. 매체가 아니라 섹션으로 판정합니다. 네이버가 연예·스포츠를 별도 호스트(entertain.naver.com · sports.naver.com)로 재배포하는 것을 표지로 씁니다.
결과. 같은 매체가 양쪽에 걸쳐야 제대로 된 필터입니다.
연예 검색 15건 중 11건 제외 mk.co.kr 이나연 → 제외
재무 검색 15건 중 0건 제외 mk.co.kr 회생절차 → 통과14. 저작권 문구를 띄어 쓰는 매체
문제. 한겨레 기사 2,005자 중 1,002자가 사이드바였습니다.
… 재직한 바 있다. ⓒ 한겨레신문사 All Rights Reserved. 무단 전재, 재배포 금지
이 기사는 언론사에서 사회 섹션으로 분류했습니다. 구독 구독중
'김민기 대법관 카드' 절대 양보 없다는 청와대·대법원…정면충돌 가나
불장은 '남의 떡'…주식투자 10명 중 6명 '1천만원 미만' 보유
쏠쏠정보 0 흥미진진 0 공감백배 0 분석탁월 0절단 규칙은 3절에서 이미 만들어 뒀는데 표기가 안 맞았습니다.
| 기존 패턴 | 한겨레 실제 |
|---|---|
무단전재 | 무단 전재 (띄어쓰기) |
저작권자 ⓒ … | ⓒ 한겨레신문사 All Rights Reserved |
사명이 ⓒ 뒤에 와서 저작권자 패턴에 안 걸립니다.
조치. 공백을 허용하고 All Rights Reserved 와 섹션 분류 안내를 표지에 넣었습니다.
`ⓒ` 단독은 이번에도 안 넣었습니다. 5절에서 사진 캡션 때문에 뺐던 것이라, 되돌리면 그 기사가 다시 95자로 줄어듭니다.
결과. 2,005 → 980자, 2,993 → 1,818자.
15. 기자 서명이 네 가지 형태였다
문제. 본문 끝에 이런 것들이 남았습니다.
연합뉴스 … 결정을 받았다. 김빛나 장진리 ← 공동 바이라인
매일경제 … 결정을 받았다. 안서진 매경 디지털뉴스룸 기자 ← 소속이 중간에
뉴시스 … 제출해야 한다. 이승주 기자 ← 전각 마침표
YTN … [카카오톡] YTN 검색해 채널 추가 [전화] 02-398-8585기존 규칙은 이름 2~4자 하나만 봐서 전부 빠져나갔습니다.
조치. 네 형태를 각각 처리하되, 마침표 뒤 문장 끝에서만 지우는 조건은 유지했습니다. 조건을 풀면 본문 중간의 사람 이름을 건드립니다.
YTN 이준엽입니다. 는 남겼습니다. 기자가 말한 본문이지 서명이 아닙니다.
결과. 11개 매체 확인, 모두 온전한 문장으로 끝납니다.
16. 지금 구조
검색어 생성(codi 1회)
→ 네이버 검색 1회 · 100건 (모자라면 예비 검색어로 재검색)
→ 영상·사진 기사 제외
→ 연예·스포츠 기사 제외
→ 수집 대상 매체 35곳으로 한정
→ 6개월 이내 · 제목·리드에 회사명(영문 약칭 포함)
→ 같은 사건 중복 제거
→ 요약만 보고 원문 받을 기사 선별(codi 1회)
→ 유료 기사 제외
→ 본문 추출 · 정제(사이드바 · 서명 · 저작권 절단)
→ LLM 입력용 압축(800자)회사당 외부 호출은 네이버 1~2회 + 기사 원문 몇 회 + codi 2회 입니다.
선정 내역은 별도로 남깁니다. 어느 기사를 왜 골랐고 왜 버렸는지 봐야 기준을 손볼 수 있는데, 건수만 세면 매체 목록이 적절한지 판단할 수 없기 때문입니다.
본문 추출 성공률은 90% 안팎입니다. 구조가 특이한 매체는 요약으로 떨어집니다. 한 매체를 위해 규칙을 흔들면 다른 매체가 깨지므로, 실패를 허용하고 폴백을 두는 쪽을 택했습니다.