스킬을 사용하여 도메인 전문 지식에 RMI ADK 에이전트 그라운딩

개요

대규모 언어 모델은 광범위한 일반 지식을 보유하고 있지만 도메인의 특정 측정항목, 데이터베이스 스키마, 계산 공식은 알지 못합니다. 이 컨텍스트가 없으면 모델이 추측하여 잘못된 SQL과 결함이 있는 분석이 발생합니다.

RMI ADK 에이전트는 기술을 통해 이 제한사항을 해결합니다. '어제 Storrow Drive의 교통 체증이 얼마나 심했어?'라고 묻는 사용자를 생각해 보세요. 답변하려면 에이전트가 RMI가 historical_travel_time 표에서 실시간 duration_in_seconds와 자유 흐름 static_duration_in_seconds의 비율인 이동 시간 지수 (TTI)로 혼잡을 표현한다는 것을 알아야 합니다. 기술이 없는 에이전트는 대신 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

이렇게 하면 모델이 도구 스키마와 사용 지침을 적시에 함께 수신하여 기본 도구 세트를 간결하게 유지할 수 있습니다.

예: 교통 체증 질문의 그라운딩

  1. 사용자가 "저녁 러시아워에 Storrow Drive의 교통 체증은 어느 정도야?"라고 질문합니다.
  2. 기본 시스템 프롬프트는 각 스킬의 이름과 설명만 광고하므로 에이전트는 rmi-traffic-metrics-grounding가 '혼잡'을 다루는 것을 확인하고 load_skill을 호출하여 이 질문에 대한 전체 안내를 가져옵니다.
  3. 스킬이 로드되면 에이전트는 TTI 정의와 검증된 SQL 템플릿을 적용하여 공식을 추측하는 대신 historical_travel_time에 대한 비율을 계산합니다.

스킬의 본문은 쿼리에 필요할 때만 가져오기 때문에 에이전트가 사용하지 않는 스킬은 컨텍스트에 입력되지 않아 기본 시스템 프롬프트가 작게 유지됩니다.

핵심 내용

  • 도메인 안내에 기반: 일반적인 모델 가정에 의존하지 않고 명시적인 안내, 제약 조건, 비즈니스 로직을 제공합니다.
  • 모듈식 스킬 사용: 토큰을 절약하고 지연 시간을 줄이며 정확성을 개선하기 위해 하나의 거대한 시스템 프롬프트 대신 지식을 집중된 스킬로 분할합니다.
  • 명확한 설명 작성: 에이전트가 안정적으로 로드되도록 각 스킬의 설명에 구체적인 트리거 문구와 키워드를 포함합니다.
  • 구체적인 예시 포함: 검증된 예시와 참조 워크플로를 스킬 본문에 추가하여 출력의 일관성과 정확성을 유지합니다.
  • 결정성을 위한 번들 도구: 엄격한 검증 및 실행을 처리하면서 기본 도구 세트를 간결하게 유지하기 위해 실행 가능한 도구를 스킬에 연결합니다.

다음 단계

참여자

나다니엘 토마스 | Google Maps Platform 소프트웨어 엔지니어링 인턴