6월에 OpenAI가 function calling을 내놓고 반년 지났다. 그 사이 실제 서비스에 몇 개 붙였는데, 문서엔 안 나오는 함정들.
함정 1. 모델이 "함수를 부른 척"한다
분명 tool을 정의해놨는데 텍스트로 calculate(3,4) 같은 걸 그냥 응답 본문에 적는 경우가 있다. 특히 gpt-3.5-turbo에서 자주. 해결책은 tool_choice="required"로 강제하거나, 시스템 프롬프트에 "function만 사용"을 명시.
함정 2. 병렬 tool call
gpt-4-turbo(11월)에서 parallel tool calling이 들어왔다. 한 턴에 여러 함수를 동시에 부를 수 있음. 좋은데, 이게 오히려 불필요한 호출을 남발하는 경향. "사용자가 명시적으로 요청한 것만 호출"을 시스템 프롬프트에 박지 않으면 DB 쿼리 5개씩 날린다.
함정 3. schema 검증
tools = [{
"type": "function",
"function": {
"name": "search_products",
"description": "상품 검색. 카테고리와 가격 범위를 받아 결과 반환.",
"parameters": {
"type": "object",
"properties": {
"category": {"type": "string", "enum": ["electronics","apparel","food"]},
"min_price": {"type": "integer", "minimum": 0},
"max_price": {"type": "integer"},
},
"required": ["category"],
"additionalProperties": False
}
}
}]
enum과 required를 확실히 박는다. 그래도 min_price > max_price 같은 케이스는 모델이 그냥 낸다. 서버에서 pydantic으로 한번 더 검증하고 에러면 role: "tool"로 에러 메시지 돌려주면 대부분 자기 교정함.
함정 4. 응답 루프
tool 결과 → 모델이 또 다른 tool call → 결과 → ... 이게 무한루프 나는 경우 있음. max_turns 제한을 꼭 걸고, 같은 인자로 같은 함수 3번 부르면 break 하는 watchdog 추가.
잘 쓰면 RAG + agent의 핵심 축. 다만 "프롬프트로 시키면 될 일을 function으로 처리"하는 과설계를 조심해야 한다. 함수 10개 넘어가기 시작하면 모델이 고민을 많이 해서 latency가 눈에 띄게 증가한다.
댓글 없음:
댓글 쓰기