3장 · 에이전트 ① 사내 데이터 조회 — 절 목차01. 두뇌에 손발 달기 도구란 그냥 파이썬 함수02. LLM은 함수를 직접 실행하지 못한다03. 독스트링과 타입힌트가 모델에게 주는 설명서04. 따라하기 주문 조회 도구 만들기05. 따라하기 도구를 붙여 자동으로 호출시키기06. 따라하기 모델이 무엇을 부르려 했는지 들여다보기07. 없는 주문번호가 들어왔을 때08. 정리 체크리스트
정리 & 체크리스트
한 줄 요약
첫 번째 에이전트를 완성했습니다. 1장에서 못 풀던 세 질문 중 하나가 풀렸습니다. 4장에서는 도구를 둘로 늘리고, 그때 생기는 새로운 문제를 다룹니다.
1. 3장에서 만든 것
code/ch03_order_agent.py — 에이전트 ① 사내 데이터 조회
이 파일은 8장에서
주문담당담당자(워커)의 도구로 그대로 쓰입니다. 버리는 코드가 아닙니다.
연결 대상 : orders.csv, customers.csv (우리 회사의 정해진 값)
핵심 기술 : Function Calling
대표 질문 : "주문 O001203 어디까지 왔어요?"
| 함수 | 하는 일 |
|---|---|
get_order_status(order_id) |
도구 — CSV에서 주문을 찾아 문장으로 |
ask(question) |
도구를 쥐여 주고 질문 (자동 실행) |
peek(question) |
모델의 요청서만 들여다보기 (자동 실행 끔) |
2. 이 장의 핵심 내용 — 말로 설명할 수 있어야 할 것들
- 도구는 그냥 파이썬 함수다. 어딘가에 등록하거나 정해진 틀을 물려받는 절차가 없다.
config에tools=[함수]한 줄을 넣으면 도구가 된다. 2장 코드와의 유일한 차이다.- 모델은 함수를 직접 실행하지 못한다. "이 함수를 이 값으로 불러 달라"는 요청서를 만들 뿐이고, 실행은 우리 코드가 한다.
- 모델은 함수 본문을 볼 수 없다. 이름·독스트링·인자와 타입만 본다. 그래서 그 셋이 사용 설명서다.
- 타입힌트는 필수다. 모델에게 전달되는 실제 정보이기 때문이다.
- 도구의 반환값도 모델이 읽는다. 항목마다 이름을 붙여 돌려준다.
- 도구는 LLM 없이 먼저 돌려 본다. 문제가 생겼을 때 원인 후보를 줄이기 위해서다.
- 실패할 때 예외를 던지지 말고 설명 문장을 돌려준다. 모델이 읽고 상황을 설명해 준다.
- 환각은 거짓말이 아니라 빈칸을 메우려는 성질에서 비롯된다. 대책은 부탁이 아니라 빈칸을 채워 주는 것이다.
- 자동 함수 호출(AFC) 을 끄면 모델의 요청서를 직접 볼 수 있다.
function_calls가 비어 있으면 "이제 답할 수 있다"는 뜻이다. - 도구를 한 번 쓰면 LLM 호출이 두 번 일어난다. (일반화하면 도구 N번에 호출 N+1번 — 마지막 한 번이 "이제 답한다"이다. 4장에서 확인한다.)
- 도구 안에는 AI가 없다. AI가 하는 일은 언제 어느 도구를 쓸지 고르는 것뿐이다.
3. 체크리스트
- [ ]
python code/ch03_order_agent.py가 끝까지 돌아간다 - [ ]
[1]이 LLM 없이 즉시 나오는 이유를 설명할 수 있다 - [ ]
[2]의{'order_id': 'O001203'}이 무엇인지 설명할 수 있다 - [ ] 독스트링을 고치면 모델의 판단이 달라지는 것을 직접 확인했다
- [ ] 없는 주문번호에 지어내지 않는 이유를 세 겹으로 설명할 수 있다
- [ ]
ask()와peek()의 차이를 설명할 수 있다
4. 진행 상황
[1장에서 못 푼 세 질문]
✓ 사내 데이터 "주문 O001203은 어떤 상태인가요?" ← 3장 완료
□ 최신 정보 "요즘 스마트워치 시장 어때요?" ← 4장
□ 사내 문서 "불량 반품은 며칠 이내인가요?" ← 6장
5. 4장 예고 — 도구가 둘이 되면 생기는 일
4장에서는 도구를 두 개 줍니다.
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
tools=[get_product_info, search_web]
get_product_info— 우리 상품 정보 (CSV)search_web— 인터넷 검색 (DuckDuckGo, API 키 불필요)
그리고 이런 질문을 던집니다.
"승승 스마트워치 Fit 5는 얼마인가요? 요즘 스마트워치 시장 가격대와 비교하면 어느 수준인지도 알려주세요."
이 질문을 풀려면 두 도구를 순서대로 써야 합니다.
① get_product_info("승승 스마트워치 Fit 5") → 159,000원
② search_web("스마트워치 시장 가격대") → 5만~30만원대
③ 둘을 비교해서 답변
여기서 3장 방식으로는 부족해집니다. 자동 함수 호출은 이것도 처리해 주지만, 우리는 ①②③이 어떤 순서로 일어나는지 보고 싶습니다. 그리고 도구가 많아지면 몇 번 반복할지 통제해야 합니다.
그래서 4장에서는 자동을 끄고 for 루프를 직접 짭니다. 이 반복 구조에는 이름이 있습니다 — ReAct(Reasoning + Acting, 생각 · 행동 · 관찰).
생각(무엇을 할까) → 행동(도구 호출) → 관찰(결과 확인) → 다시 생각 → ...
5장부터는 이 루프를 라이브러리가 대신 돌립니다. 그러니 4장이 "안을 들여다보는 마지막 기회"입니다.