logo

도구 검색과 동적 로딩

OpenRouter의 내장 도구 검색과 지연 로딩을 설정하고 모델의 함수 호출 요청을 확인한다.

도구가 많아지면 생기는 문제

  • 함수 호출에는 이름·설명·인자 스키마가 필요.
  • 모든 도구 정의를 매번 넣으면 사용하지 않는 설명도 입력 토큰을 차지.
  • 도구 검색(tool search): 필요한 기능을 먼저 찾고 해당 도구의 정의만 모델에 제공하는 방법.

모든 도구를 처음부터 제공할 때와 검색한 도구만 로딩할 때의 컨텍스트 사용량 비교

  • 위: 도구 정의를 모두 로딩해 컨텍스트의 큰 부분을 차지.
  • 아래: 검색한 정의만 로딩해 대화와 작업에 쓸 공간 확보.
  • Anthropic의 비교 예시: 사용량 77.2k 토큰 → 8.7k 토큰.

그림 출처: Anthropic, Introducing advanced tool use.

실습 준비

  • 함수 호출 실습에서 준비한 client, model을 같은 노트북에서 이어 사용.

재고·배송 함수의 이름·설명·입력 형식 임포트

from tool_search_setup import tool_definitions
도구 실행할 함수 조회 자료 예시
재고 조회 get_stock 무선 마우스 7개, 기계식 키보드 0개
배송 조회 get_delivery A101 배송 중, A102 배송 완료

1. 도구의 로딩을 미루고 내장 검색 켜기

{
  "type": "function",
  "function": {
    "name": "get_stock",
    # API에 등록한 도구 정의를 처음부터 모델에 모두 보여주지 않고 검색 후 로딩.
    "defer_loading": true 
  }
}
  • 재고·배송 도구 정의에 모두 defer_loading: True가 포함
# OpenRouter가 도구를 검색하고 호출 인자를 검사하도록 설정
search_config = {
    # 검색·로딩에 사용할 통신 규약 버전
    "protocol": "v1",
    # 모델·제공자에 맞게 OpenRouter가 검색·호출을 중계
    "profile": "portable",
    # 호출 인자가 도구의 입력 스키마에 맞는지 검사
    "validation": "runtime",
    # 이름·설명·인자를 패턴으로 검색하고 최대 2개 도구 반환
    "search": {"type": "regex", "max_results": 2},
}

2. 질문하고 함수 호출 요청 확인하기

messages = [{"role": "user", "content": "무선 마우스는 지금 몇 개 남아 있나요?"}]

# 검색·로딩과 도구 선택을 OpenRouter에 맡기고 요청을 한 번 보냄
response = client.chat.completions.create(
    model=model,
    messages=messages,
    # 두 도구를 API에 등록하되 모델에는 검색한 정의만 로딩
    tools=tool_definitions,
    # 한 응답에서 여러 도구를 병렬 호출하지 않도록 설정
    parallel_tool_calls=False,
    # extra_body: SDK 공통 인자에 없는 OpenRouter 설정을 요청 본문에 추가
    # deferred_tools: 위의 설정으로 OpenRouter 내장 검색·로딩 활성화
    extra_body={"deferred_tools": search_config},
)

# 모델이 요청한 함수 이름과 인자 확인
message = response.choices[0].message
message.tool_calls
  • tool_calls: 모델이 호출하려는 함수의 이름·인자·호출 ID. 재고 질문에서 get_stock과 상품 이름이 지정되는지 확인.

서비스의 내장 기능과 비교

퀴즈

문제 1 / 4맞음: 0힌트: 0틀림: 0채점중: 0남음: 4

이번 실습에서 defer_loading을 True로 지정하는 목적은?

  • ○도구 정의를 검색 후 필요한 시점에 로딩
  • ○도구 실행 결과를 검색 전 미리 계산
  • ○도구 정의를 요청에서 영구적으로 제거
  • ○조회 함수의 실행을 모델에 위임

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.