json

3 개의 포스트

DSPy를 사용하여 Dash의 관련성 판별기를 최적화한 방법 (새 탭에서 열림)

Dropbox는 검색 및 답변 서비스인 Dash의 핵심 기능인 '관련성 판단 모델(relevance judge)'을 최적화하기 위해 DSPy 프레임워크를 도입했습니다. 기존의 수동 프롬프트 엔지니어링 방식에서 벗어나, 인간의 평가 점수와 모델 점수 간의 차이를 최소화하는 체계적인 최적화 루프를 구축함으로써 더 저렴한 오픈 소스 모델에서도 고성능을 유지할 수 있게 되었습니다. 결과적으로 모델 교체 시 발생하는 성능 저하 문제를 해결하고, 대규모 데이터 처리를 위한 비용 효율성과 신뢰성을 동시에 확보했습니다. **인간 평가 기반의 성능 측정 체계** * 관련성 판단 모델은 쿼리와 문서의 연관성을 1~5점 척도로 할당하며, 이를 인간 평가자의 점수와 비교하여 성능을 측정합니다. * 주요 평가지표로 NMSE(Normalized Mean Squared Error)를 사용하며, 이는 AI 점수가 인간의 판단에서 얼마나 벗어나는지를 0~100 사이의 수치로 나타냅니다. * 단순 점수 외에도 프로덕션 환경에서의 안정성을 위해 JSON 출력 형식이 올바른지, 구조적 가이드라인을 준수하는지를 엄격히 관리합니다. **고비용 모델에서 효율적인 모델로의 이식** * 초기에는 성능이 뛰어난 OpenAI의 o3 모델을 사용했으나, 서비스 규모가 확장됨에 따라 수천 배 더 많은 데이터 처리를 위한 비용 절감이 필요해졌습니다. * 상대적으로 저렴한 gpt-oss-120b 모델로 이전을 시도했으나, 기존 고성능 모델에 최적화된 프롬프트가 그대로 작동하지 않아 성능 저하가 발생했습니다. * 이를 해결하기 위해 수동으로 프롬프트를 수정하는 대신, DSPy를 통해 특정 모델에 최적화된 프롬프트를 자동 생성하는 방식을 선택했습니다. **DSPy와 GEPA를 활용한 프롬프트 최적화** * DSPy의 GEPA(Generalized Evaluation-based Prompt Adaptation) 옵티마이저를 사용하여 모델이 인간과 다른 판단을 내린 지점을 분석하고 피드백을 생성합니다. * 모델의 예측 점수와 인간의 점수 차이, 그리고 인간의 작성 이유(Rationale)를 결합하여 구체적인 피드백 루프를 구성합니다. * 피드백 과정에서 특정 키워드에 과적합(Overfitting)되지 않도록 일반적인 규칙을 도출하며, "최신성을 과소평가함"이나 "키워드 일치에 과도하게 비중을 둠" 같은 구체적인 오류 패턴을 수정합니다. * 이 최적화 루프는 '평가-피드백-프롬프트 수정-재평가' 과정을 반복하며 목표 지표인 NMSE를 최소화하는 최적의 프롬프트를 찾아냅니다. **결론 및 권장사항** LLM 시스템을 프로덕션 수준으로 확장할 때 가장 큰 장애물은 모델 변경이나 프롬프트 수정 시 발생하는 예기치 못한 성능 저하입니다. Dropbox의 사례처럼 DSPy와 같은 프레임워크를 활용해 프롬프트 엔지니어링을 '체계적인 최적화 프로세스'로 전환하면, 모델 이식성을 높이고 운영 비용을 획기적으로 낮추면서도 품질을 일정하게 유지할 수 있습니다. 특히 대규모 관련성 평가가 필요한 시스템이라면 수동 튜닝 대신 측정 가능한 지표 중심의 자동화된 최적화 루프를 구축하는 것을 권장합니다.

RFC 9457 준수 오류 응답으로 에이전트 토큰 비용 98% 절감하기 (새 탭에서 열림)

Cloudflare는 AI 에이전트가 에러 발생 시 불필요한 토큰을 낭비하지 않도록 RFC 9457 표준을 준수하는 마크다운(Markdown) 및 JSON 형식의 구조화된 에러 응답 기능을 도입했습니다. 기존의 무거운 HTML 페이지 대신 기계가 읽을 수 있는 지침을 제공함으로써 에러 응답의 페이로드 크기와 토큰 사용량을 98% 이상 절감했습니다. 이를 통해 AI 에이전트는 에러의 원인을 정확히 파악하고 재시도 여부나 대기 시간 등을 즉각적으로 판단하여 효율적인 워크플로우를 유지할 수 있게 되었습니다. ### 기존 HTML 에러 응답의 문제점 * 기존의 에러 페이지는 브라우저를 사용하는 사람을 위해 수백 줄의 HTML, CSS, 마크업으로 구성되어 있어 AI 에이전트에게는 불필요한 데이터가 너무 많았습니다. * 에이전트가 HTML을 파싱하더라도 단순히 "접근 거부"와 같은 상태만 알 수 있을 뿐, 재시도가 가능한지 또는 얼마나 기다려야 하는지에 대한 실행 가능한 지침을 얻기 어려웠습니다. * 에이전트 개발자들은 사이트별로 각기 다른 에러 페이지를 처리해야 하는 번거로움이 있었으며, 이는 높은 비용과 비효율성을 초래했습니다. ### RFC 9457 기반의 구조화된 응답 도입 * Cloudflare는 HTTP API의 에러 보고 표준인 RFC 9457(Problem Details for HTTP APIs)을 준수하는 응답을 제공합니다. * 에이전트가 요청 헤더에 `Accept: text/markdown`, `Accept: application/json`, 또는 `Accept: application/problem+json`을 포함하면 Cloudflare는 그에 맞는 구조화된 응답을 반환합니다. * 현재 DNS 오류, WAF 차단, 속도 제한(Rate limiting) 등을 포함하는 모든 '1xxx' 클래스 에러에 적용되었으며, 향후 Cloudflare가 생성하는 4xx 및 5xx 에러로 확대될 예정입니다. ### 에이전트를 위한 실행 가능한 지침 제공 * **마크다운 형식:** 기계가 읽을 수 있는 YAML 프론트매터(Frontmatter)와 사람이 읽을 수 있는 구체적인 지침(What happened, What you should do) 섹션으로 나뉩니다. * **핵심 데이터 필드:** 응답에는 `error_code`, `retryable`(재시도 가능 여부), `retry_after`(재시도 대기 시간), `owner_action_required`(소유자 조치 필요 여부) 등 에이전트의 제어 흐름에 직접 활용 가능한 필드가 포함됩니다. * **표준화된 스키마:** RFC 9457의 `type`, `status`, `title`, `detail`, `instance` 멤버를 사용하여 특정 API에 의존하지 않고도 범용적으로 에러를 해석할 수 있게 설계되었습니다. ### 효율성 및 구현 방식 * 실제 '1015(속도 제한)' 에러 응답을 기준으로 측정했을 때, HTML 대비 페이로드 크기와 토큰 사용량이 98% 이상 감소했습니다. * 이 기능은 Cloudflare 네트워크 전반에 자동으로 적용되므로 사이트 소유자가 별도로 설정할 필요가 없습니다. * 클라이언트가 명시적으로 마크다운이나 JSON을 요청하지 않는 한, 일반 브라우저 사용자에게는 이전과 동일한 HTML 페이지가 제공되어 하위 호환성을 유지합니다. AI 에이전트나 자동화 도구를 개발하고 있다면, 요청 헤더에 적절한 `Accept` 타입을 설정하는 것만으로도 인프라 비용을 획기적으로 줄이고 에러 처리 로직의 신뢰성을 높일 수 있습니다. 이는 더 이상 에러 페이지가 단순한 '차단벽'이 아니라 에이전트를 위한 '실행 지침'으로 기능함을 의미합니다.

토스페이먼츠의 Open API 생태계 (새 탭에서 열림)

토스페이먼츠는 Open API를 단순한 통신 수단을 넘어 수십 년간 안정적으로 운영되어야 할 핵심 인프라로 정의합니다. 20만 개 이상의 가맹점이 사용하는 환경에서 개발자의 인지 부하를 줄이고 연동 신뢰성을 높이기 위해, 리소스 중심의 인터페이스 설계와 자동화된 생태계 구축을 최우선 과제로 삼고 있습니다. 이러한 철학은 기술적 완성도를 넘어 가맹점 개발자가 겪는 전반적인 경험(DX)의 질을 결정짓는 근간이 됩니다. ### 리소스 중심의 일관된 인터페이스 설계 * **직관적인 경로 규칙**: 가맹점이 URL 구조만 보고도 기능을 예측할 수 있도록 `버전/도메인/리소스 고유 ID` 순서의 일관된 경로 체계를 사용합니다. 특정 리소스 지정 외의 조건은 쿼리 파라미터나 JSON 필드로 분리하여 명확성을 높였습니다. * **중첩 객체를 활용한 모듈화**: 카드 정보나 현금영수증 내역처럼 여러 API에서 반복되는 데이터는 JSON의 계층 구조를 활용해 객체 형태로 모듈화합니다. 이는 데이터 중복을 줄이고 응답의 의미를 명확하게 전달하며, null 체크 등 가맹점의 코드 로직을 간소화합니다. * **도메인별 객체 재사용**: 승인, 조회, 취소 등 연관된 도메인의 API들이 동일한 응답 객체를 공유하도록 설계하여, 개발자가 새로운 API를 연동할 때 추가적인 학습 없이 결과를 예측할 수 있게 합니다. * **자연어 기반 데이터 표현**: 시스템 효율을 위한 코드 값(예: SC0010) 대신 "현대", "국민"과 같은 직관적인 한글 데이터를 제공합니다. 또한 `Accept-Language` 헤더에 따라 영문 등으로 응답을 자동 전환하는 로컬라이제이션(Localization)을 지원합니다. * **표준화된 오류 처리**: HTTP 상태 코드로 큰 틀의 성공/실패를 구분하고, 상세한 에러 코드와 메시지를 담은 표준 객체를 응답 바디에 포함하여 가맹점이 상황에 맞춰 유연하게 대응할 수 있도록 돕습니다. ### 비동기 처리를 위한 안정적인 웹훅 체계 * **이벤트 기반 처리**: 즉각적인 응답이 어려운 비동기 결제 상황에서 서버가 클라이언트에 처리 완료를 알리는 웹훅 인터페이스를 API와 함께 제공합니다. * **데이터 구조의 일관성**: 웹훅을 통해 전달되는 데이터 페이로드를 일반 API 응답과 동일한 리소스 객체 구조로 설계하여 가맹점의 파싱 로직 중복을 방지합니다. * **지수 백오프(Exponential Backoff) 재전송**: 네트워크 이슈나 가맹점 서버 장애로 인한 웹훅 전송 실패 시, 수신 서비스의 회복 시간을 고려하여 점진적으로 재시도 간격을 늘리는 전략을 사용합니다. * **자가 조치 도구 제공**: 개발자가 직접 웹훅 전송 내역을 조회하고 필요 시 수동으로 재전송할 수 있는 기능을 개발자 센터를 통해 지원하여 운영 편의성을 높였습니다. ### 개발자 경험(DX) 강화를 위한 문서 자동화 * **OAS 기반 실시간 동기화**: 수동 문서 작성의 한계를 극복하기 위해 OpenAPI Specification(OAS)과 Springdoc 라이브러리를 활용하여 서버 코드와 문서가 실시간으로 동기화되는 시스템을 구축했습니다. * **문서의 신뢰성 확보**: API 스펙이 변경될 때마다 연동 문서가 즉시 업데이트되므로, 가맹점 개발자는 항상 실제 동작하는 서버와 일치하는 최신 명세를 바탕으로 안심하고 개발할 수 있습니다. 토스페이먼츠의 사례처럼 좋은 Open API는 단순히 기능의 유무를 넘어, 개발자가 '설명 없이도 이해할 수 있는' 직관적인 구조와 자동화된 지원 환경을 갖추어야 합니다. 특히 리소스 중심 설계와 API-웹훅 간 데이터 일관성은 가맹점의 연동 비용을 획기적으로 낮추는 실용적인 전략이 될 수 있습니다.