Drum Bun: 루마니아의 정보를 아는 에이전트가 이번 주에 그 비네트를 다시 썼다
요약
본 글은 루마니아, 헝가리, 오스트리아 등 유럽 국가의 복잡하고 분산된 통행료(비네트) 정보를 통합하여 제공하는 에이전트를 개발한 사례를 소개합니다. 이 에이전트는 최신 법규 변경 사항과 여러 출처의 데이터를 종합적으로 분석하여 사용자에게 정확한 여행 가이드를 제시합니다.
핵심 포인트
- 유럽 국가별 비네트 정보가 분산되어 있어 복잡함.
- 에이전트를 통해 실시간으로 변화하는 통행료 정보를 통합 제공.
- 루마니아, 헝가리, 오스트리아 등 주요국의 최신 법규 변경 사항 반영.
본 글은 Sanity Challenge, Path One: 실시간 콘텐츠를 질의하는 에이전트를 배포하기 제출물입니다.
제가 만든 것
매년 12월이면 수십만 대의 자동차가 독일이나 오스트리아에서 루마니아로 집으로 향합니다. 여행을 떠나기 전 질문은 항상 같습니다: 어떤 비네트를, 어느 날짜에, 어디서 사야 하는지, 그리고 길에서 무엇 때문에 벌금을 물게 되는지? 그 답들은 네 개의 톨 운영사, 네 가지 언어, 그리고 수많은 구식 블로그 게시물에 흩어져 있습니다.
올해는 모두의 발밑이 바뀌었습니다:
- 루마니아가 2026년 10월 1일부로 rovinietă를 교체했습니다: 새로운 판매처(TollRo), 레우화 기준 가격 책정 방식 변경(유로 클래스별), 그리고 차량 등급을 표시할 수 없는 차는 유로 0 요율을 지불합니다. 상원 법안으로 인해 이 일정이 연기될 수도 있습니다.
- 헝가리가 2026년에 M1 지역 비네트를 추가했는데, 이는 페스트와 코마롬-에슈테르곰(Komárom-Esztergom) 카운티의 비네트만으로는 M1 구간에 공백이 생겨 Fejér가 커버하는 경우, 연간 통과 비용을 국가 단위 비네트 가격의 절반 이하로 만듭니다.
- 오스트리아는 2026년 12월 1일부터 디지털 비네트만 판매하며, 현장 벌금액을 €200으로 인상했고, 2027년 가격은 아직 발표되지 않아 크리스마스 여행 비용을 정확히 산정할 수 없습니다.
Drum Bun(

데이터에서 그려진 구간 지도: 통행료 부과 구역은 노란색 코어와 함께 빨간색, 무료 구역은 속이 비었으며, 국경은 점선으로 표시됨.

모든 답변은 단계를 보여줌: 플래너 실행, 지식 기반(Knowledge Base) 항목 열람, GROQ 쿼리.
코드
GitHub logo danielbutnar / drum-bun
산리티(Sanity) 컨텍스트 기반 로드 트립 에이전트: 루마니아와 독일/오스트리아 간의 비네트, 통행료 및 규칙 (여행 날짜별 가격 책정)
Drum Bun
루마니아에서 독일 또는 오스트리아로 가는 길에 차량이 필요한 것: 여행 날짜에 맞는 비네트(vignettes)와 통행료(tolls) (가장 저렴한 조합), 겨울 타이어 및 배기가스 구역 규칙, 그리고 온라인에서 읽은 주장들이 오래되었을 수 있다는 점. 모든 답변은 공식 출처를 추적하여 제공됩니다.
실시간 데모: https://drum-bun-agent.vercel.app · 데모 영상 (2:52):
· 산리티 프로젝트pd5e7gez, 데이터셋 production (공개) · DEV Sanity Challenge, Path One을 위해 제작됨.
GitHub에서 보기
Sanity를 사용한 방법
1. 계산하는 구조화된 콘텐츠
'브라쇼브에서 뮌헨까지, 12월 20일 출발, 1월 3일 복귀, 유로 5 디젤'이라는 내용은 답을 제공하는 페이지가 없습니다. 그래서 이 콘텐츠는 답변이 계산되는 조각들로 모델링됩니다:
route→ 순서화된legs→roadSection참조. 섹션은tolled(통행료 부과 여부),coveredBy[](합법적으로 통행할 수 있게 하는 제품 목록, 그중 하나만 있어도 충분함),counties[](카운티 목록) 및exemptVehicles[](면제 차량 목록)을 가집니다.tollProduct는validity(days,months,calendarYear와 중첩 기간) 및 날짜가 지정된prices[]를 가집니다. 각 가격은validFrom/validTo와 선택적인 배출가스band(euroMin,euroMax,electric,appliesWhenUnknown)를 가집니다.rule은 연간season기간,conditional+condition,effectiveFrom/To및severity;zone은dieselMinEuro와status를 가집니다.claim: 온라인에서 발견된 진술로, 그verdict(outdated(구식),wrong(틀린),misleading(오해의 소지가 있는)), 그것이 보인source, 그리고 현재 사실인 것에 대한correctedBy[]참조를 가집니다.source는trust(official(공식), club, press, blog, forum),language및checkedAt을 가집니다. 모든 사실은 최소한 하나 이상의 출처를 참조합니다.
순수하고 단위 테스트가 가능한 플래너가 이 구조를 따라 작동합니다: 각 날짜에 유효한 가격을 선택하고, 가장 저렴한 커버리지(1일권 비네트 두 개가 2개월권을 능가함; 2026년 오스트리아 연간 비네트는 여전히 2027년 1월 3일을 커버함)를 위해 작은 동적 프로그래밍을 실행하고, 헝가리 카운티 비네트와 M1 지역권에 대한 정확한 집합 커버(exact set cover) 문제를 해결하며, 온라인 구매에 대한 오스트리아의 18일 규칙을 적용합니다. 에이전트는 이를 도구로 호출합니다. 모델은 절대 가격을 계산하지 않습니다.
2. 네 가지 언어의 공식 페이지에서 가져온 지식 기반
2. 네 가지 언어의 공식 페이지에서 가져온 지식 기반
'Drum Bun 도로 규정(road rules)'에 대한 지식 기반은 데이터셋(각 문서를 읽기 쉬운 필드로 평탄화하는 GROQ 쿼리)과 톨 운영사, 각료부 및 도시가 있는 루마니아어, 헝가리어, 독일어, 영어의 총 24개 웹 페이지로 구축되었습니다. 그리고 운전자들이 실제로 읽는 블로그도 포함되어 있습니다. 첫 번째 빌드에서는 14개의 이슈가 발생했지만, 모든 수정과 전체 재구축을 거친 후 지식 기반은 103개 데이터셋 문서와 24개 웹 페이지에서 나온 22개의 항목(entries), 21개의 결정 사항(decided issues) 및 9개의 현행 지침(standing instructions)을 갖게 되었습니다. 저는 대시보드를 클릭하는 대신 @sanity/client의 context API를 사용하여 이 문제들을 해결하여, 모든 결정이 그 이유와 함께 레포지토리에 기록되도록 했습니다(decisions.md):
- 네 가지 충돌 중 두 가지는 저 자신의 어휘에서 비롯되었습니다: 빌드가 제 열거형 값
carTrailer를

빌드가 결정과 이유와 함께 충돌을 보고합니다.
공개된 How it knows 페이지는 스크립트가 데이터셋에 작성하는 스냅샷으로부터 양쪽 모두의 모든 문제점, 유지된 내용, 표준 지침 및 개요를 보여줍니다.
3. Sanity Context MCP, 두 개의 엔드포인트
하나의 엔드포인트는 하나의 모드를 제공하므로, 두 가지가 있습니다: drum-bun-kb (지식 기반(Knowledge Base) 모드: 개요 + knowledge_base_read/knowledge_base_search)와 drum-bun-rules (데이터셋에 대한 GROQ 모드, 임베딩 활성화). 에이전트(AI SDK 7, AI Gateway)는 두 초기 컨텍스트를 한 번 가져와 인라인으로 포함하고, 플래너를 세 번째 도구로 얻습니다. 대화 내용은 Sanity Context Insights에 저장되며, 일일 크론 작업이 이를 분류합니다.
4. 구조가 검색보다 나은가?
루마니아어, 독일어, 영어로 된 16개의 질문이 있으며, 각 질문에는 답변에 포함되어야 하는 사실과 포함되어서는 안 되는 오래된 사실이 있습니다(questions). 기준선은 동일한 Sanity 문서와 동일한 모델을 사용하지만, 플래너, 지식 기반 및 GROQ 대신 임의 단어 키워드 검색(사이트 검색 상자가 하는 것)으로 검색합니다.
| 정확한 답변 수 | |
|---|---|
| Drum Bun 에이전트 (플래너 + 지식 기반 + Sanity Context를 통한 GROQ) | 15 / 16 |
| 동일 콘텐츠에 대한 키워드 검색 | 11 / 16 |
에이전트가 놓친 한 가지 질문: 누군가가 이미 시작된 오스트리아 10일 디지털 비네트(vignette)에 잘못된 번호판을 입력한 경우입니다. 에이전트는 바꿀 수 없다는 것과 잘못된 번호판은 비네트가 없는 것으로 간주된다는 것(현장에서 €200)은 정확하게 말했지만, 연간 비네트는 예외라는 점(재등록 시 €18)을 빠뜨렸습니다. 이 테스트는 그 세부 사항을 요구하므로 감점 요인이 됩니다. 저는 프롬프트를 통과할 때까지 조정하는 대신 테스트를 원래대로 유지했습니다. 키워드 검색도 이를 놓쳤습니다.
단일 사실에 대한 검색은 잘 작동했습니다: 데이터셋이 그것들을 명확하게 진술하고 있으며, 이는 구조화된 콘텐츠의 한 가지 지점입니다. 그러나 답이 계산되어야 하는 부분에서는 정확히 실패했습니다: 뮌헨 지역 규칙은 찾았지만 크리스마스 여행을 위한 비네트 가격은 찾지 못했고, rovinietă는 찾았지만 유로 클래스 가격을 선택하지 못했으며, 6개의 헝가리 주 중 2개만 이름을 언급하고 M1 지역 비네트는 놓쳤으며, 추가 요금 규칙은 찾았지만 금액은 찾지 못했습니다.
솔직한 평가: 첫 번째 실행에서 에이전트는 16점 만점에 6점을 받았습니다. 일반 질문에 대해
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기