스타일 가이드를 인용하는 이탈리아어 카피 검토기, Sanity Context 기반 구축
요약
이탈리아어 카피 검토기를 개발하여 소프트웨어 웹사이트의 현지화된 텍스트 오류를 자동으로 감지합니다. 이 도구는 Sanity Studio 스키마와 지식 기반(Knowledge Base)을 활용하는 에이전트 아키텍처를 구축했으며, AI SDK가 외부 규칙과 컨텍스트를 참조하도록 하여 모델 단독보다 정확도를 높였습니다.
핵심 포인트
- Sanity Studio 스키마를 이용해 검토 규칙 및 용어집을 체계적으로 관리합니다.
- AI 에이전트가 지식 기반(Knowledge Base)을 활용하여 외부 컨텍스트에 근거한 검증을 수행합니다.
- 지식 기반 덕분에 모델 단독보다 더 많은 오류를 정확하게 플래그 지정할 수 있습니다.
- Vercel AI SDK와 TypeScript로 구현되어 실제 배포 환경에서 테스트 가능합니다.
This is a submission for the Sanity Challenge, Path One: Ship an Agent That Queries Real Content
내가 만든 것 (What I Built)
저는 이탈리아인이며, 제 업무 중 일부는 소프트웨어 웹사이트의 이탈리아어 카피를 검토하는 것입니다. 같은 실수가 계속 배포됩니다:
검토는 다음과 같이 보입니다 (9월 30일 테스트 실행의 실제 출력, gemini-3.1-flash-lite, 입력 Fidato da oltre 100.000 imprese):
{
"verdict": "error",
"reason": "'Fidato da'라는 구문은 'Trusted by'의 문자 그대로의 직역(literal calque)이며 이탈리아 마케팅 카피에서는 부자연스러운 것으로 간주됩니다.",
...
코드
https://github.com/exochard/italian-copy-reviewer
Vercel AI SDK를 사용한 Node 22의 TypeScript, Sanity Studio 스키마, 규칙을 Sanity 문서로 변환하는 작은 Python 스크립트입니다. npm test는 네트워크 없이 실행됩니다.
Sanity 활용 방법
콘텐츠 모델. Studio 스키마에 두 가지 문서 유형이 있습니다:
l10nRule: 제목(title), 슬러그(slug), 카테고리(category) (직역, 일치 여부, 숫자 형식 등), 심각도(severity), 일반적인 단어로 된 규칙, 선호되는 형태(preferred forms), 피해야 할 형태(forms to avoid), 그리고 실제 배포된 예시 배열 (제품 유형, 텍스트가 나타나는 위치, 영어 원문, 배포된 이탈리아어, 네이티브 수정본).glossaryTerm: 영어 용어(English term), 선호되는 이탈리아어(preferred Italian), 피해야 할 형태(forms to avoid), 참고 사항(note).
예시가 핵심입니다.
에이전트(The agent). AI SDK는 지식 기반 모드(knowledge-base mode)의 Context MCP 엔드포인트에 연결됩니다. 시스템 프롬프트는 모델에게 먼저 initial_context를 호출하고, 적용될 수 있는 항목들에 대해 knowledge_base_read를 실행하도록 지시합니다. 출력은 타입이 지정된 객체(verdict, reason, 텍스트에서 인용된 잘못된 조각들, 수정된 텍스트, 인용된 항목 경로)이며, 따라서 모든 답변은 어떤 규칙을 사용했는지 명시합니다.
첫 번째 측정 실행을 통해 저는 무언가를 배웠습니다. 지식 기반(Knowledge Base) 덕분에 에이전트는 모델 단독으로만 할 때보다 올바른 텍스트를 더 자주 플래그 지정했습니다. 왜냐하면 트리거가 없는 항목들까지 적용했기 때문입니다. 즉,
테스트를 정직하게 유지하는 것(Keeping the test honest). 이 벤치마크는 총 29쌍으로 구성되어 있습니다. 학습용 절반은 지식 기반(Knowledge Base)에 입력되고, 테스트용 절반은 절대 그곳에 들어가지 않으며, 단위 테스트(unit test)를 통해 두 절반이 서로 분리되어 있음을 확인합니다. 각 쌍은 에이전트가 수정된 문자열을 플래그 지정(and) 원본 수정 사항을 그대로 남겨둘 때만 점수가 매겨지므로, 모든 것을 플래그 지정하는 검토자는 0점을 받습니다.
매 테스트 실행마다 동일한 12쌍의 데이터로 gemini-3.1-flash-lite 모델이 완벽하게 수행한 결과는 다음과 같습니다:
| 테스트 실행 | 변경 전 (학습 쌍에 맞춰 조정됨) | 모델 단독 | + Sanity 지식 기반 | :--- |
| Sep 28 | 첫 번째 버전 | 7/12 | 4/12 |
| ... |
최신 전체 실행 결과:
| | 발견된 버그 | 그대로 남겨둔 수정 사항 | 완벽하게 수행한 쌍 | :--- |
| gemini-3.1-flash-lite 단독 | 11/12 | 10/12 | 9/12 |
| gemini-3.1-flash-lite + Sanity 지식 기반 | 10/12 | 11/12 | 9/12 |
모델 단독으로도 실행마다 변동이 있습니다: 두 팔(arms) 모두 프롬프트를 공유하며, 모델은 온도(temperature)가 0일 때조차 완전히 반복 가능하지 않습니다. 12쌍은 작은 테스트이므로, 한 쌍당 8점입니다.
Sep 30 실행에서 여전히 실패하는 부분: 두 팔 모두 _Transcrizione_을 통과했는데, 이는 _Trascrizione_이어야 하므로 철자 검사를 글자 단위로 수행하지 않습니다. 지식 기반(Knowledge Base)을 사용했을 때 에이전트는
저는 직접 수행한 QA 감사(QA audits)에서 가져온 벤치마크 문자열과 그 수정본을 작성했습니다. 이들은 챌린지보다 앞선 것이며, 브랜드 이름은 마스킹 처리되어 있습니다. 코드와 지식 기반(Knowledge Base) 콘텐츠는 AI 코딩 어시스턴트(Claude Code)를 사용해 챌린지 중에 작성되었습니다. 제가 사양(spec)과 수락 검사(acceptance checks)를 설정했고, 그것이 코드를 초안 작성했으며, 저는 모든 부분을 검토하고 실행하며 테스트했습니다. 위에 제시된 수치들은 npm run eval 실행(results/eval-*.json)에서 나온 것이며 측정값으로 보고되었고, 지식 기반에 위배되는 경우까지 포함합니다. src/rescore.ts는 모델을 호출하지 않고 저장된 실행(saved run)에 플래그 검사(flag checks)를 재적용합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기