개요
대규모 언어 모델은 광범위한 일반 지식을 보유하고 있지만 도메인의 특정 측정항목, 데이터베이스 스키마 또는 계산 공식을 알지 못합니다. 이러한 컨텍스트가 없으면 모델이 추측하여 잘못된 SQL과 결함이 있는 분석으로 이어집니다.
RMI ADK 에이전트는 스킬 을 통해 이 제한사항을 해결합니다. 어제 Storrow Drive의 정체는 어느 정도였나요?라고 묻는 사용자를 생각해 보세요. 답변하려면 에이전트는 RMI가 정체를 여행 시간 지수 (TTI)로 표현한다는 것을 알아야 합니다. 이는 historical_travel_time 테이블에서 실시간 duration_in_seconds와 자유 흐름 static_duration_in_seconds의 비율입니다. 스킬이 없는 에이전트는 대신 average_speed 열을 발명하거나 (RMI는 범주형 속도만 보고하고 km/h는 보고하지 않음) 잘못된 수식을 적용하여 확신하지만 잘못된 답변을 생성할 수 있습니다.
에이전트에는 이 도메인 지식이 필요하지만 모든 측정항목 정의, 테이블 스키마, SQL 주의사항을 단일 시스템 프롬프트에 넣는 것은 비효율적입니다.
대규모 시스템 프롬프트의 제한사항
모든 도메인 규칙과 스키마를 단일 시스템 프롬프트에 넣으면 다음과 같은 여러 문제가 발생합니다.
- 비용 증가 및 응답 속도 저하: 모든 턴에서 거대한 프롬프트를 전송하면 토큰이 낭비되고 이러한 규칙이 필요하지 않은 질문에도 지연 시간이 늘어납니다.
- 요청 사항 준수 악화: 특이한 사례로 인해 프롬프트가 길어지면 모델이 특정 규칙을 무시하거나 잊을 가능성이 높아집니다.
- 유지보수 어려움: 모든 것을 하나의 프롬프트로 결합하면 다른 규칙을 손상시키지 않고 개별 규칙을 업데이트하거나 테스트하기가 어렵습니다.
스킬
에이전트 스킬 은 도메인 지식을 에이전트가 필요할 때만 로드하는 모듈식 폴더로 구성합니다. 각 스킬은 마크다운 안내와 YAML 헤더가 포함된 SKILL.md 파일이 있는 디렉터리입니다.
모든 것을 미리 로드하는 대신 에이전트는 각 스킬의 짧은 description만 기본 프롬프트에 보관합니다. 사용자가 스킬과 관련된 질문을 하면 에이전트는 해당 턴의 전체 안내를 로드합니다. 이렇게 하면 프롬프트가 작게 유지되고 실제 대화 기록을 위한 컨텍스트 공간이 절약됩니다.
스킬은 또한 관심사를 깔끔하게 분리합니다. 관련 없는 도메인에서 의도하지 않은 부작용을 일으킬 위험 없이 개별 기능을 격리하여 작성, 테스트, 업데이트할 수 있습니다. 프로덕션 에이전트는 일반적으로 하나의 거대한 프롬프트가 아닌 여러 개의 집중된 스킬을 사용합니다.
스킬 분석
SKILL.md 파일은 라우팅을 위한 YAML 헤더와 안내를 위한 마크다운 본문의 두 부분으로 구성됩니다.
1. YAML 헤더
---
name: rmi-traffic-metrics-grounding
description: >
Standard traffic performance metrics computable from RMI BigQuery
tables. Covers congestion severity (TTI), delay, travel time
reliability (LOTTR, BTI, PTI, CoV), congestion frequency, speed
breakdowns, and network-wide congestion rates. Use when the user asks
about traffic conditions, congestion, reliability, delay, or network
health.
---
모델은 description을 사용하여 스킬을 로드할지 결정합니다. 모델은 스킬을 로드하기 전에 이 설명만 확인하므로 다루는 주제, 일반적인 사용자 문구, 트리거 시점을 명확하게 나열해야 합니다.
2. 마크다운 본문
본문은 모델이 로드된 후 따르는 도메인별 안내를 제공합니다.
RMI 측정항목 스킬 본문에는 정확한 TTI 공식(duration_in_seconds / static_duration_in_seconds), 각 측정항목에 대해 검증된 BigQuery SQL 템플릿, 사용자 의도를 올바른 측정항목에 매핑하는 트리거 문구가 포함됩니다. 구조화되고 검증된 안내를 제공하면 모델이 그라운딩된 상태를 유지하고 스키마 또는 수식 세부정보를 추측하지 못하도록 할 수 있습니다.
ADK에 스킬 등록
스킬을 SkillToolset으로 그룹화하고 에이전트의 도구 목록에 추가합니다.
from google.adk import skills
from google.adk.tools import skill_toolset
rmi_skill_toolset = skill_toolset.SkillToolset(
skills=[
# TRAFFIC_METRICS_SKILL_DIR points to the skill's SKILL.md folder.
skills.load_skill_from_dir(TRAFFIC_METRICS_SKILL_DIR),
],
)
# root_agent = llm_agent.Agent(..., tools=[*bq_tools, rmi_skill_toolset])
여기서 TRAFFIC_METRICS_SKILL_DIR은 트래픽 측정항목 기반 스킬이 포함된 디렉터리를 가리킵니다.
스킬과 도구 번들
스킬은 텍스트 기반 안내이므로 모델에만 의존하여 복잡한 로직을 해석하고 실행하면 불일치가 발생할 수 있습니다. 실행 가능한 도구를 스킬에 연결하면 결정론이 제공됩니다. 코드는 엄격한 계산, 검증, API 상호작용을 처리하고 스킬은 모델에 언제 어떻게 사용할지 안내합니다.
도구를 번들로 묶으면 전역 컨텍스트가 부풀어 오르는 것을 방지할 수도 있습니다. 모든 전문 도구를 미리 노출하는 대신 도구는 해당 도메인 스킬이 활성 상태일 때만 로드되도록 범위가 지정됩니다.
YAML 헤더의 스킬에 특정 도구를 직접 연결할 수 있습니다.
metadata:
adk_additional_tools:
- calculate_custom_metric
이렇게 하면 모델이 도구 스키마와 사용 안내를 적시에 함께 수신하여 기본 도구 모음을 간결하게 유지할 수 있습니다.
예: 정체 쿼리 기반
- 사용자가 "저녁 퇴근 시간 동안 Storrow Drive의 정체는 어느 정도인가요?" 라고 묻습니다.
- 기본 시스템 프롬프트는 각 스킬의 이름과 설명만 광고하므로 에이전트는
rmi-traffic-metrics-grounding이 '정체'를 다루는 것을 확인하고load_skill을 호출하여 이 쿼리의 전체 안내를 가져옵니다. - 스킬이 로드되면 에이전트는 TTI 정의와 검증된 SQL 템플릿을 적용하여 공식을 추측하는 대신
historical_travel_time에 대한 비율을 계산합니다.
스킬의 본문은 쿼리에 필요할 때만 가져오므로 에이전트가 사용하지 않는 스킬은 컨텍스트에 입력되지 않아 기본 시스템 프롬프트가 작게 유지됩니다.
핵심 내용
- 도메인 안내 기반: 일반 모델 가정을 사용하는 대신 명시적 안내, 제약 조건, 비즈니스 로직을 제공합니다.
- 모듈식 스킬 사용: 토큰을 절약하고 지연 시간을 줄이며 정확성을 개선하기 위해 지식을 하나의 거대한 시스템 프롬프트가 아닌 집중된 스킬로 분할합니다.
- 명확한 설명 작성: 에이전트가 안정적으로 로드할 수 있도록 각 스킬의 설명에 특정 트리거 문구와 키워드를 포함합니다.
- 구체적인 예시 포함: 출력을 일관되고 정확하게 유지하기 위해 검증된 예시와 참조 워크플로를 스킬 본문에 추가합니다.
- 결정론을 위한 도구 번들: 실행 가능한 도구를 스킬에 연결하여 엄격한 검증 및 실행을 처리하면서 기본 도구 모음을 간결하게 유지합니다.
다음 단계
- 고급 스킬 패턴 살펴보기: 스킬을 사용하여 ADK 에이전트 빌드에 관한 개발자 가이드를 읽고 ADK 스킬에 관해 알아보세요.
참여자
Nathaniel Thomas | Google Maps Platform 소프트웨어 엔지니어링 인턴