Notion AI 분류가 20개 선택지에서 '기타'로 도피한 경험 — 7개 재설계와 3행 프롬프트 완벽 구현
요약
Notion AI를 활용한 경비 지출 분류에서 선택지 과다와 '기타' 항목을 공식화하는 프롬프트가 LLM의 판단 포기로 이어지는 문제를 분석했습니다. 필자는 이를 해결하기 위해 선택지를 MECE하게 재설계하고, 각 항목에 상세 설명을 부여하며, 프롬프트에 근거 단어 필수화를 적용하여 분류 정확도를 높이는 방법을 제시합니다.
핵심 포인트
- LLM의 판단 포기는 단순히 선택지 증가가 아닌, 경계 모호성과 '기타' 탈출구 조합이 원인이다.
- 분류 시스템은 선택지를 MECE(상호 배타적이고 전체를 포괄하는)하게 재설계해야 한다.
- 각 선택지에 포함/제외 기준을 명시하는 description 부여가 분류 정확도 향상의 핵심이다.
- 프롬프트에 '근거 단어 필수화'를 지시하여 LLM의 판단 강제성을 확보해야 한다.
경비 지출 DB의 AI 분류 과정에서, '기타' 항목이 37%에 달했습니다. 정확도를 높이기 위해 선택지를 7개에서 20개로 세분화한 야간 배치 작업은 다음 날 아침, 분류할 수 없는 데이터 더미를 남기는 사고를 일으켰습니다. 원인은 단순히 선택지 증가 자체가 아니라, 경계가 모호해진 선택지와 '모르면 기타'라는 탈출구를 공식화한 프롬프트의 조합이었습니다. 본 글에서는 기타 항목 비율을 한 줄로 측정하는 주간 검산 방법과, 7개 재설계 + description + 3행 프롬프트를 통한 분류 완벽 구현 사례(Python 및 복사/붙여넣기로 작동 가능)까지 다룹니다.
| 일시 | 발생한 일 |
|---|---|
| 10/31 22:00 | 경비 지출 분류 선택지를 7개 → 20개로 확장하여 배포 (예: '숙박비(국내)', '식비(점심)') |
| ... |
실패의 본질은 LLM의 능력이 아니라 설계에 있었습니다. 20개의 선택지 중 10개는 '교통비(전철)/교통비(택시)', '식비(점심)/식비(접대)/회의비'처럼 서로 경계가 모호한 쌍으로 구성되어 있었고, 이 경계에 걸친 행들은 LLM이 판단을 포기하고 '기타'로 흘러갔습니다.
선택지 세분화로 경계가 모호해짐: 사람이 운영할 때는 '헷갈리면 가까운 쪽으로 처리' 할 수 있지만, LLM은 선택지 간의 차이가 언어로 정의되어 있지 않을 경우 판단 자료가 없어 가장 안전한 '기타'를 선택합니다.
description 부재: Notion의 select 타입 속성은 선택지 이름만 가질 수 있어, 프롬프트에는 20개 이름 문자열만 나열되었습니다. '숙박비(국내)'와 '숙박비(해외)'의 차이를 설명하는 한 줄도 어디에도 없었습니다.
프롬프트의 탈출구: 서두에 추가한 '판단하기 어려우면 기타'라는 한 줄이, 경계가 모호한 행들을 기타로 보내는 공식적인 경로 역할을 했습니다. '기타'는 분류 실패를 받아들이는 창구일 뿐, 판단을 대체하는 수단이 아닙니다.
먼저 현재 상황을 숫자로 확인합니다. Notion API로 DB 전체를 순회하며 분류 속성의 비율만 세는 검산입니다. 이 한 줄의 코드가 있었다면, 11/3 아침이 아니라 10/31 밤(최초 배치 직후)에 감지할 수 있었습니다.
from collections import Counter
import os, requests
TOKEN = os.environ["NOTION_TOKEN"]
...
수정은 세 가지 요소로 이루어집니다. ① 선택지를 MECE(Mutually Exclusive and Collectively Exhaustive)한 7개로 되돌리기 ② 각 선택지에 '무엇을 포함하고, 무엇을 포함하지 않는지'에 대한 한 줄의 설명(description) 부여 ③ 프롬프트에서 탈출구를 제거하고 근거 단어(keyword)를 필수화하기.
"""Notion AI 분류 완벽형: 7개 선택지 + description + 3행 프롬프트"""
import os, requests
LLM_URL = os.environ.get("LLM_BASE_URL", "https://api.openai.com/v1") + "/chat/completions"
...
핵심 포인트는 세 가지입니다. ① 근거 단어 필수화: '근거를 작성하라'고 지시하는 것만으로도, LLM은 선택지 설명과 대조하여 판단하게 되므로, '기타'로 도피하는 것이 구조적으로 불가능해집니다. ② 온도(Temperature) 0: 분류는 분류 문제이므로 출력의 흔들림은 해가 될 뿐입니다. ③ 근거 기록: 근거 속성에 한 단어를 남김으로써, 주간 재고 조사 시 '기타'뿐만 아니라 '경계에 걸친 의심스러운 분류'도 사람이 눈으로 검증할 수 있습니다.
실행하면 다음과 같습니다:
$ python3 sort_audit.py
기타 비율 4.1% (9/219행)
OK
| 방식 | 기타 비율(실측) | 경계 모호 행 처리 | 검산과의 적합성 | 판정 |
|---|---|---|---|---|
| 20개・description 없음 (사고 버전) | 37% | 기타로 도피 | 비율은 나오지만 원인을 파악할 수 없음 | ✗ 중단 |
| ... |
- |
실패 1: '선택지를 늘리면 정확도가 올라간다'는 전제. 사람의 운영에서는 세분화가 정확도를 높이지만, LLM은 선택지 간 차이가 언어로 정의되어 있지 않을 때 판단을 포기합니다. 세분화는 '설명 가능한 범위'에서만 효과적입니다.
실패 2: '헷갈리면 기타'라는 한 줄. 친절한 의도로 추가한 지시가, 경계 모호한 행들을 모두 기타로 빨아들이는 공식 경로가 되었습니다. '기타'는 분류 실패를 받아들이는 창구일 뿐, 판단을 대체하는 수단이 아닙니다.
실패 3: 기타 비율을 아무도 측정하지 않는 운영. 배치 로그에는 행 수는 나왔지만, 비율을 계산하는 코드가 없었습니다. 검산이 없었다면, 선택지 설계의 좋고 나쁨은 일주일 뒤 불만으로만 나타났을 것입니다.
- 선택지를 MECE(Mutually Exclusive, Collectively Exhaustive)한 7개 전후로 되돌리고, 각각에 "무엇을 포함하고 무엇을 포함하지 않는지"를 한 줄 설명으로 부여한다.
- 프롬프트는 3줄로 고정한다: 가장 가까운 1개를 선택 / 의문은 근거 단어 1개로 해결 / 그 외는 해당되지 않을 때만.
- 기타 비율 검산(10% 임계값)을 배치 마지막에 넣는다. 외부 데이터의 주간 운영은 잊어버린다.
- 그때 주의사항: 이미 "기타"로 분류된 행은, 재설계 후에 재고 조사 배치(inventory batch)를 통해 전 건을 재분류해야 한다. 방치할 경우 새로운 선택지 체계와 실제 데이터가 어긋나 검산의 분모가 오염된다.
본 기사 같은 구현 패턴을 가로지르는(cross-section) 치트시트와, Obsidian·Notion 템플릿 모음을 무료 배포합니다. 총 8권의 내용에 "무엇을 어떤 도구로 할 것인가" 판단 차트도 포함되어 있습니다.
- MCP 서버에 도구 11개를 주었더니 AI가 40%를 잘못 사용했다 — 도구가 선택되는 description 설계의 5가지 유형
- Notion 속성명 하나를 바꿨더니 야간 배치(night batch)가 400건 전멸했다 — 스키마 변경에 강한 3가지 보험과 완벽 구현
📗 Notion 완전 활용 가이드 — 정보를 "시스템"으로 바꾸는 실전서 (Kindle·무제한 읽기 대상)
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기