도구 검색과 동적 로딩
OpenRouter의 내장 도구 검색과 지연 로딩을 설정하고 모델의 함수 호출 요청을 확인한다.
도구가 많아지면 생기는 문제
- 함수 호출에는 이름·설명·인자 스키마가 필요.
- 모든 도구 정의를 매번 넣으면 사용하지 않는 설명도 입력 토큰을 차지.
- 도구 검색(tool search): 필요한 기능을 먼저 찾고 해당 도구의 정의만 모델에 제공하는 방법.

- 위: 도구 정의를 모두 로딩해 컨텍스트의 큰 부분을 차지.
- 아래: 검색한 정의만 로딩해 대화와 작업에 쓸 공간 확보.
- Anthropic의 비교 예시: 사용량 77.2k 토큰 → 8.7k 토큰.
그림 출처: Anthropic, Introducing advanced tool use.
실습 준비
- 함수 호출 실습에서 준비한
client,model을 같은 노트북에서 이어 사용.
- 준비 파일 다운로드: tool_search_setup.py
- 파일을 내려받아 노트북의 현재 폴더에 업로드.
재고·배송 함수의 이름·설명·입력 형식 임포트
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과 상품 이름이 지정되는지 확인.
서비스의 내장 기능과 비교
퀴즈
이번 실습에서 defer_loading을 True로 지정하는 목적은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.