AI 브리프 파서, 모르는 줄은 버리지 않고 격리했어요
에이전트가 쓴 마케팅 브리프를 DB에 적재하는 파서를 하루 9커밋으로 만들며 unknown 레인을 2계층으로 둔 이유와 fix 4건을 정리했어요.
라이프케어로그(플랜씨·플랜엘 같은 플랜 시리즈를 만드는 1인 개발 브랜드)의 마케팅 자동화에는 Hermes라는 에이전트가 매일 마크다운 브리프를 써 두는 단계가 있어요. 그 파일을 읽어 초안·계정 같은 항목으로 쪼개 DB에 넣는 파서를 지난 9월 7일 하루에 만들었는데, 그날 이 작업만 커밋이 9건이에요. 그중 fix가 4건이고요. 뭘 잘못 짚었는지 순서대로 남겨 둘게요.
JSON 부록을 먼저 읽게 한 이유
브리프는 사람이 읽는 글이라 형식이 매번 조금씩 달라요. 그래서 마크다운 본문을 정규식으로 긁는 걸 1순위로 두지 않고, 에이전트 프롬프트 끝에 8줄짜리 JSON 부록을 붙이는 규칙을 초안으로 만들어 두고 파서는 그 부록부터 읽게 했어요. 부록이 깨져 있으면 본문 파싱으로 폴백해요. 첫 커밋은 파일 5개로 시작했고, 부록이 일부러 망가진 fixture로 테스트해 보면 폴백 경로로 넘어가는지 바로 확인할 수 있게 해 뒀어요.
unknown 레인을 2계층으로 나눈 것
제일 신경 쓴 건 모르는 입력을 조용히 버리지 않는 거예요. 항목 하나가 어느 유형에도 안 맞으면 unknown으로 따로 적재하고, 파일 전체가 형식을 벗어나면 파일 단위로 한 번 더 격리해요. 그래서 2계층이에요. 직접 만들어 보니 이렇게 해 두면 파서가 틀렸을 때 초록불만 켜지는 게 아니라, 격리된 건수가 숫자로 남아서 제가 나중에 들여다볼 수 있어요.
저녁에 몰아서 잡은 fix 4건
- 인젝션 문구가 섞인 파일은 prescan 단계에서 먼저 격리하고 해당 줄만 가려서 저장하게 바꿨어요. 원문은 전부 보존하고요.
--all옵션이 날짜 파일만 잡아야 하는데 변종 파일까지 물고 오길래 매칭 규칙을 좁혔어요.- dry-run이 deadman 마커까지 갱신하지 않도록 막았어요. 돌려 보니 감시 쪽이 "살아 있다"고 착각할 수 있는 구조라, dry-run은 ledger에 플래그만 남겨요.
- 같은 본문이 다른 날짜 파일에 걸치는 경우를 대비해 락과 statement timeout을 걸고, orphan이 안 생긴다는 불변식 테스트를 추가했어요.
백필은 미리보기부터
실제 적재 전에 dry-run으로 42파일을 미리 돌려 보고 결과를 문서로 남긴 다음 실백필을 했어요. 적재된 건 초안 127건, 계정 64건이었고 격리 쪽은 0으로 기록됐어요. 정기 실행은 매일 10시 50분에 launchd로 돌도록 걸어 뒀고요.
- 부록 우선
- 2계층 unknown
- dry-run은 마커 미갱신
- 백필 전 미리보기
하루치 빌드로그치고는 fix 비중이 컸는데, 적용해 봤더니 대부분 "성공처럼 보이는 실패"를 막는 쪽이었어요. 파서가 잘 읽는 것보다 못 읽었을 때 티가 나는 게 더 중요하더라고요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.