실무 Multi-Agent 오케스트레이션 6장 · 데이터 조회 도구 구현 2 / 7 ← 이전목차다음 → TechLead Cro

6장. 데이터 조회 도구 구현

주문 데이터와 pandas 조회 — 세 줄로 주문 하나를 찾는다

한 줄 요약

도구가 조회할 수 있는 정보는 모두 data/orders.csv 안에 있습니다. 이 파일을 pandas로 읽어 메모리에 올려 두고, 조건으로 고르기 → 비었는지 확인 → 첫 줄 꺼내기 세 줄로 주문 하나를 찾습니다.


1. orders.csv에 무엇이 있는가

data/orders.csv에는 주문 80건이 들어 있습니다. 한 줄이 주문 하나입니다.

열 뜻 비고
order_id 주문번호 HR + 날짜 + 일련번호
customer_id 주문한 고객 customers.csv와 이어집니다
product_name, option, quantity 상품명, 옵션, 수량
order_amount 결제 금액
ordered_at 주문 일시
order_status 주문 상태 결제완료 / 배송준비 / 배송중 / 배송완료 / 취소 / 반품접수
courier, tracking_no 택배사, 송장번호 출고 전에는 비어 있습니다
shipped_at, delivered_at 출고일, 배송완료일 그 단계 전에는 비어 있습니다
recipient, address 수령인, 배송지 개인정보

여기서 두 가지를 미리 봅니다.

  • 비어 있는 칸이 있습니다. 배송준비 상태인 주문에는 송장번호가 없습니다. 도구는 이 빈칸을 어떻게 돌려줄지 정해야 합니다.
  • 도착 예정일은 어디에도 없습니다. 데이터에 없는 것은 도구가 돌려줄 수 없고, 모델도 답해서는 안 됩니다.

2. 파일을 읽어 둔다

pandas는 표 모양의 데이터를 다루는 파이썬 라이브러리입니다. 2장에서 문의 로그 40건을 셀 때 이미 썼습니다.

ORDERS = pd.read_csv(DATA_DIR / "orders.csv", dtype=str)
부분 뜻
DATA_DIR / "orders.csv" config.py가 알려 주는 data 폴더 안의 파일. 어디서 실행해도 같은 파일을 가리킵니다
dtype=str 모든 열을 문자열로 읽습니다
ORDERS 읽은 표를 담아 둔 변수. 파일 맨 위에서 한 번만 읽고, 도구가 불릴 때마다 다시 읽지 않습니다

dtype=str은 꼭 필요합니다. 이것을 빼고 읽으면 pandas가 송장번호를 숫자로 받아들여, 83455521031이 83455521031.0이 됩니다. 송장번호와 주문 금액은 계산할 숫자가 아니라 그대로 전해야 할 글자입니다.


3. 주문 하나를 찾는 세 줄

두 도구가 똑같이 쓰는 조회입니다.

row = ORDERS[ORDERS["order_id"] == order_id]
if row.empty:
    return {"found": False, "message": f"주문번호 {order_id} 를 찾을 수 없습니다."}
r = row.iloc[0]
줄 하는 일
ORDERS[ORDERS["order_id"] == order_id] 주문번호가 같은 줄만 골라 냅니다. 안쪽 비교가 줄마다 참/거짓을 만들고, 바깥 ORDERS[...]가 참인 줄만 남깁니다
row.empty 골라 낸 결과가 0건이면 참입니다
row.iloc[0] 골라 낸 것 중 첫 줄을 꺼냅니다. 그 뒤로는 r["product_name"]처럼 열 이름으로 값을 읽습니다

가운데 줄이 없는 주문번호를 처리하는 자리입니다. 이 확인 없이 row.iloc[0]을 부르면 0건일 때 오류로 멈춥니다.


4. 빈칸은 어떻게 읽히는가

CSV의 빈칸을 pandas로 읽으면 NaN이라는 특별한 값이 됩니다. "값이 없음"을 뜻하는 표시이고, 문자열이 아닙니다. dtype=str로 읽어도 빈칸은 NaN으로 남습니다.

그래서 "송장번호가 있는가"는 이렇게 확인합니다.

if not isinstance(r["tracking_no"], str) or r["tracking_no"] == "":

"문자열이 아니거나, 빈 문자열이면"이라는 뜻입니다. 문자열이어야 할 칸이 문자열이 아니면 비어 있는 것입니다.

NaN을 확인하지 않고 그대로 돌려주면 모델은 "tracking_no": NaN 같은 낯선 값을 받습니다. 그것을 어떻게 읽을지는 모델의 짐작에 맡겨집니다. 빈칸의 뜻은 코드가 해석해서 넘겨야 합니다. 그 방법이 다음 절의 내용입니다.


핵심 정리

  • 도구가 돌려줄 수 있는 정보는 orders.csv의 열이 전부입니다. 도착 예정일은 없습니다.
  • dtype=str로 읽어야 송장번호가 숫자로 바뀌지 않습니다.
  • 주문 하나는 조건으로 고르기 → .empty 확인 → .iloc[0] 세 줄로 찾습니다.
  • CSV의 빈칸은 NaN으로 읽힙니다. 문자열인지 확인해 가려냅니다.
  • 파일은 한 번만 읽어 ORDERS에 담아 둡니다.
← 이전 절왜 진짜 데이터에 연결해야 하는가 — 가짜 도구는 없는 주문도 배송 중이라고 한다다음 절 →반환값은 모델이 읽는다 — 실패도 사실로 돌려준다
오명운 · macro@prag-ai.com