LabHub
배우기 러닝패스 코스

AI 에이전트 — 모델이 아니라 그래프 · 도구 호출과 결과 검증 · 실습

인자를 지어낸 한 번의 호출

LabHub 에서 이어서 보기

목표

도구를 부르는 쪽의 규율을 코드로 적는다. 계약 표를 한 곳에 두고, 고른 인자를 부르기 전에 재고, 돌려받은 결과를 믿지 않고 재고, 실패를 예외가 아니라 값으로 다뤄 사유를 상태에 남기고, 그 사유로 다음 시도를 고치고, 같은 인자로 두 번 부르지 않게 기억한다.

왜 중요한가

도구를 붙인 에이전트가 처음 깨지는 자리는 모델이 아니라 호출 경계다. 모델이 인자 이름을 하나 지어내면 TypeError 가 그래프 밖으로 튀어나와 실행 전체가 끝나고, 상태도 지나온 길도 남지 않는다. 더 나쁜 쪽은 예외가 나지 않는 경우다 — 도구가 빈 목록을 돌려줬는데 그 위에 "재고 3곳" 이라는 문장이 만들어진다.
그래서 이 실습은 계약을 값으로 적는 것에서 시작한다. 이름·인자 스키마·돌려주는 모양·실제 함수를 표 하나에 묶어 두면, 재는 코드가 도구마다 필요 없고 부르는 문이 한 곳으로 좁아진다. 그 문 앞에서 인자를 재고, 문 뒤에서 결과를 재고, 문 앞에 기억을 둔다.
인자를 고르는 자리는 이 실습에서 규칙으로 대신합니다. 실제 에이전트는 그 자리(pick 노드)에서 모델에게 도구 이름과 인자를 묻습니다. 나머지 구조는 똑같습니다 — 오히려 모델이 고를수록 부르기 전 검증이 더 필요합니다.
채점기는 여러분이 적어 둔 설명을 믿지 않습니다. 여러분의 모듈을 실제로 불러 검증 함수를 매번 다른 값으로 두드려 보고, 도구 몸통이 몇 번 돌았는지를 세어 "부르기 전에 막았는가" 를 확인합니다. sku·지역·개수는 실행마다 바뀝니다.

단계

1. /root/work/agtool/tools.py 에 자료(REGIONS·STOCK)와 MAX_ROWS·CALLS, 도구 둘(stock_lookup·legacy_stock), 계약 표 TOOLS 를 만드세요.
2. validate_args(name, args) 를 만들어 부르기 전에 인자를 재게 하세요. 통과하면 빈 문자열, 아니면 사유 하나를 돌려줍니다.
3. call_tool(name, args) 를 만들어 검증을 통과한 호출만 실제로 부르게 하세요. 예외는 밖으로 내지 않고 {"ok", "value", "error"} 로 돌려줍니다.
4. validate_result(name, value) 를 만들고 call_tool 이 결과도 재게 하세요. 사유는 shape·empty·too_big·range 입니다.
5. CACHEcache_key(name, args) 를 만들어 같은 도구를 같은 인자로 두 번 부르지 않게 하세요. 성공만 기억합니다.
6. State 와 노드 넷(pick·fetch·reply·giveup), build_naive()·run_naive(order) 를 만들어 실패를 예외가 아니라 경로로 다루세요.
7. MAX_ATTEMPTS·REPAIRS·can_repair·repair 노드와 build_graph()·handle(order) 를 더해 사유를 보고 고쳐 다시 시도하게 하세요.
8. /root/work/agtool/tool_report.json/root/work/agtool/tool_report.md 에 확인한 것을 기록하세요.

참고

단계 8개

  1. 계약을 값으로 한 곳에 적는다
  2. 부르기 전에 인자를 잰다
  3. 잘못된 인자로는 부르지 않는다
  4. 돌려준 것을 믿지 않는다
  5. 같은 것을 두 번 묻지 않는다
  6. 실패를 경로로 다룬다
  7. 사유를 보고 고쳐 다시 시도한다
  8. 재어 본 것을 기록한다