C.W.K.
Stream
Lesson 05 of 05 · published

Tool Contract Test

~24 min · evaluation, regression, fixtures, ci

Level 0호기심 많은 독자
0 XP0/48 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Tool 은 바뀌어. Schema 는 drift 해. 모델은 업데이트해. Contract 가 drift 하면 fail 하는 test 가 없으면 — agent 는 누군가 알아채기 전 몇 주를 조용히 degrade 해. Tool contract test 는 사 둘 수 있는 가장 싼 보험이야.

세 모양으로 시작:

  1. Schema validity: 모든 tool 정의가 valid JSON Schema 이고, provider SDK 를 경고 없이 round-trip. 빠른 unit test 하나.
  2. Selection accuracy: prompt 와 호출돼야 할 tool 을 짝지은 fixture 파일. 작은 (싼) 모델로 각 prompt 돌리고, tool name 검사, pass/fail 율 보고. 모델 지능 측정 아니야 — 네 description 이 여전히 제대로 steering 하는지 측정하는 거야.
  3. Argument correctness: 더 작은 fixture 셋에 핵심 인자도 assert. 모델이 user 메시지에서 customer_id="C-9" 를 잘 넘겼나? 날짜를 정확하게 format 했나? Argument test 가 description regression 을 잡아.

함정은 over-test. Tool call 사이의 모델 prose 의 정확한 단어를 assert 하지 마 — release 마다 의미 없이 drift 해. 구조 를 assert 해: 어느 tool, 어떤 인자, loop 종료 여부. Prose assertion 은 flake 인내하는 end-to-end test 에 남겨둬.

Tool description 이나 schema 가 바뀔 때 CI 에서 돌리고, provider 의 latest model 로 nightly 돌려. 모델 업그레이드가 selection 율을 조용히 바꾸는 걸 처음 잡았을 때 — 왜 이게 항상 진짜 카테고리의 test 였는지 이해하게 될 거야.",

Code

최소 fixture 기반 test·python
import pytest, json

FIXTURES = json.load(open("tests/tool_fixtures.json"))

@pytest.mark.parametrize("prompt,expected_tool", [(f["prompt"], f["tool"]) for f in FIXTURES])
def test_tool_selection(prompt, expected_tool, agent):
    resp = agent.one_turn(prompt)
    actual = next((b.name for b in resp.content if b.type == "tool_use"), None)
    assert actual == expected_tool, f"{prompt!r}: expected {expected_tool}, got {actual}"
Fixture 파일 모양·json
[
  {"prompt": "where is order 9912?", "tool": "search_orders"},
  {"prompt": "show me the new arrivals in shoes", "tool": "search_catalog"},
  {"prompt": "refund order 9912 — wrong size", "tool": "propose_refund"},
  {"prompt": "what's your return policy?", "tool": null}
]

External links

Exercise

Agent 하나에 10-prompt fixture 파일 작성. 'tool 없이 그냥 말' 이 정답인 prompt 세 개 포함. Suite 돌려. 정확 selection 비율이 baseline — 적어둬. 이제 tool description 하나 바꾸고 다시 돌려 — 비율이 움직이는 거 봐. 그 움직임이 네 test 가 동작하는 증거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.