6장 · 데이터 조회 도구 구현왜 진짜 데이터에 연결해야 하는가 — 가짜 도구는 없는 주문도 배송 중이라고 한다주문 데이터와 pandas 조회 — 세 줄로 주문 하나를 찾는다반환값은 모델이 읽는다 — 실패도 사실로 돌려준다자동 함수 호출 — SDK가 왕복을 대신한다따라하기 — 주문 조회 도구 만들기정리와 체크리스트실습문제와 해답
6장. 데이터 조회 도구 구현
정리와 체크리스트
6장에서 배운 것
- 도구 함수 — 부르는 쪽도 반환값을 읽는 쪽도 모델인 함수. 모델이 읽고 옳게 판단할 수 있게 만듭니다.
- 반환값 설계 — 키 이름은 뜻이 드러나게, 필요한 것만 돌려줍니다.
- found 패턴 — 조회 실패를 예외로 멈추지 않고
found: False와 안내 문장으로 돌려주는 방식입니다. - NaN — CSV의 빈칸을 pandas로 읽었을 때의 값. 코드가 뜻을 해석해서 넘깁니다.
- 자동 함수 호출 — 파이썬 함수를
tools에 넘기면 SDK가 선언을 만들고 왕복을 대신합니다. maximum_remote_calls— 자동 왕복의 횟수 상한입니다.automatic_function_calling_history— 자동 왕복에서 오간 대화의 기록입니다.
한눈에 보는 핵심
def track_shipping(order_id: str) -> dict:
"""주문번호로 택배사·송장번호·출고일·배송완료일을 조회한다. 배송 위치 문의에 사용한다.
Args:
order_id: 하루마켓 주문번호. 'HR'로 시작한다.
"""
row = ORDERS[ORDERS["order_id"] == order_id]
if row.empty: # 없는 주문도 사실로 돌려준다
return {"found": False, "message": f"주문번호 {order_id} 를 찾을 수 없습니다."}
...
config=types.GenerateContentConfig(
system_instruction=SYSTEM, # 조회 결과 밖으로 나가지 않게
tools=[get_order_status, track_shipping], # 함수를 그대로
automatic_function_calling=types.AutomaticFunctionCallingConfig(
maximum_remote_calls=4 # 횟수 상한
),
)
| 함수의 이것 | 모델에게는 |
|---|---|
| 함수 이름 | 도구의 이름 |
| 독스트링 | 도구의 설명 — 쓸지 말지를 정하는 근거 |
| 타입힌트 | 인자의 이름과 타입 |
| 반환한 딕셔너리의 키 | 각 값의 뜻 |
| 코드가 한 일 | 모델이 한 일 |
|---|---|
| 주문이 있는지 확인 | 두 도구 중 하나를 고름 |
| 송장이 없으면 "출고 전"으로 해석 | 문장에서 주문번호를 찾아 넣음 |
| 주소·수령인을 빼고 돌려줌 | 받은 결과를 문장으로 옮김 |
체크리스트
- [ ]
pd.read_csv(..., dtype=str)에서dtype=str이 필요한 이유를 설명할 수 있다. - [ ] 주문 하나를 찾는 세 줄(조건으로 고르기,
.empty,.iloc[0])을 설명할 수 있다. - [ ] 반환값의 키를
"s","t"처럼 줄이면 안 되는 이유를 설명할 수 있다. - [ ] 없는 주문번호에 예외를 던지지 않고
found: False를 돌려주는 이유를 설명할 수 있다. - [ ] 두 도구가 수령인과 주소를 돌려주지 않는 이유를 설명할 수 있다.
- [ ] 자동 방식에서 독스트링을 지우면 무엇이 망가지는지 설명할 수 있다.
- [ ]
maximum_remote_calls가 무엇을 막는지 설명할 수 있다. - [ ]
[도구 호출]출력이 어디서 나오는지 안다. - [ ] 답변의 사실을
orders.csv의 값과 맞춰 확인했다. - [ ] 답변에서 도구 결과에 없는 문장을 하나 찾아 냈다.
한 줄 핵심
도구 함수의 설명과 반환값은 모델이 읽는 글입니다. 사실을 가르는 일은 코드가 하고, 모델은 갈라진 사실을 전합니다.