CLOVA Studio 운영자5 Posted April 9 공유하기 Posted April 9 Function calling, 쉽게 알아보기 LLM 에이전트가 우리의 모든 질문에 답변할 수 있다면 얼마나 편리할까요? 하지만 LLM은 미리 학습한 데이터를 기반으로 답변하기 때문에 실시간 정보 제공이나 외부 데이터 활용에 한계가 있습니다. 이러한 문제를 해결하기 위해 등장한 기술이 바로 'Function calling'입니다. 이 기능은 LLM이 외부 도구를 활용해 필요한 정보를 가져올 수 있도록 돕는 역할을 합니다. 모델이 스스로 해결할 수 없는 질문이 있을 때, 외부에서 정보를 받아와 더 정확한 답변을 제공할 수 있습니다. 이처럼 LLM이 외부 시스템이나 API를 사용할 수 있기 때문에, Function calling을 '도구(tool)'라고도 부릅니다. Function calling은 스킬(참고: 스킬 트레이너)과 유사해 보일 수 있지만 차이가 있습니다. 스킬은 트레이너 내에 API를 등록해 모델이 스스로 답변까지 생성해 주는 반면, 이 기능은 개발자가 외부 API를 직접 실행해야 합니다. 또한, Function calling은 API뿐만 아니라 스크립트나 라이브러리 내 함수 호출도 가능하다는 점에서 차이가 존재합니다. Function calling이 무엇인지, 그리고 어떻게 활용할 수 있는지 소개해드리겠습니다. Quote 자세한 Chat Completions v3 API의 Function calling 가이드는 여기를 참고해주세요. Function calling은 어떻게 작동할까요? Function calling은 LLM(대규모 언어 모델)이 사용자의 질문에 맞춰 미리 정의된 함수를 사용해 필요한 기능을 실행하도록 돕는 방식입니다. 예를 들어, 사용자가 ❶"오늘 강남구 날씨는 어때?"라고 질문하면, ❷모델은 이 질문을 전달 받아 분석해 ❸사전에 정의된 함수 중 get_weather를 사용해야 한다고 판단합니다. 이 과정에서 모델은 "강남구"라는 위치 정보와 "2025-04-17"이라는 날짜를 파라미터로 추출합니다. 여기서 중요한 점은, 모델은 함수를 직접 호출하지 않는다는 것 입니다. 대신, 모델은 사용할 함수를 결정하고 필요한 매개변수를 포함한 데이터를 생성합니다. 즉, 사용자의 요청에 따라 미리 정의된 함수 중 어떤 것을 사용하고 어떤 값을 넣어야 할지 결정하는 역할을 합니다. 이후, ❹외부의 날씨 서비스 API에 연결해 ❺실시간 날씨 데이터를 받아오고, ❻그 정보를 모델에게 전달하면 ❼ 모델이 최종답변을 완성합니다. 이를 통해 ❽"현재 강남구의 온도는 18도 이고, 날씨는 흐립니다." 와 같은 응답을 제공할 수 있습니다. Function calling은 실제로 어떻게 사용하나요? 앞서 설명드린 동작 과정을 바탕으로, "사용자 입력 → 모델이 tool 선택 → 외부 함수 결과 전달 → 최종 응답 생성" 이라는 흐름이 코드에서 어떻게 구현되는지 아래 예시를 참고해주세요. Step 1: 사용자 메시지+함수 정의 전송 사용자 입력과 함께 사용할 수 있는 함수 목록을 모델에 전달합니다. 모델은 이를 바탕으로 어떤 도구(tool)를 사용할지 결정합니다. Quote { "messages" : [ { "content" : "오늘 강남구 날씨는 어때?", "role" : "user" } ], "tools" : [ { "function" : { "description" : "날씨를 알려줄 수 있는 도구", "name" : "get_weather", "parameters" : { "properties" : { "location" : { "description" : "서울, 대전, 부산 등의 위치 정보", "type" : "string" }, "date" : { "description" : "2023-08-01 같은 형태의 날짜 문자열. 날씨를 알고 싶은 날짜", "type" : "string" } }, "required" : [ "location" ], "type" : "object" } } }, { "function" : { "description" : "여행지를 추천해 줄 수 있는 도구", "name" : "get_travel_info", "parameters" : { "properties" : { "location" : { "description" : "The city and state, e.g. San Francisco, CA", "type" : "string" }, "date" : { "description" : "\"2023-08-01~2023-09-01\" 같은 형태의 날짜 쌍 문자열. 여행 날짜 범위", "type" : "string" } }, "required" : [ "location" ], "type" : "object" } } } ], "toolChoice" : "auto" } 응답 결과 Quote { "status": { "code": "20000", "message": "OK" }, "result": { "message": { "role": "assistant", "content": "", "toolCalls": [ { "id": "call_1234", "type": "function", "function": { "name": "get_weather", "arguments": { "location": "강남구", "date": "2025-04-17" } } } ] }, "finishReason": "tool_calls", "created": 1743173620, "seed": 2393118890, "usage": { "promptTokens": 295, "completionTokens": 43, "totalTokens": 416 } } } Step 2: toolCallId에 대한 함수 결과 전달 모델이 사용자 입력에 대해 get_weather 함수를 호출해야 한다고 판단했습니다. 이제 실제 날씨 API를 호출한 결과를 "role": "tool" 메시지로, toolCallId와 함께 전달합니다. 이때는 함수 정의를 다시 포함하지 않아도 되지만, 이후에 사용자로부터 추가 질문(예: "그럼 부산 날씨는 어때?")이 들어올 가능성이 있다면 해당 함수 정의를 다시 포함해 전달하는 것이 좋습니다. Quote { "messages": [ { "role": "user", "content": "오늘 강남구 날씨는 어때?" }, { "role": "assistant", "content": "", "toolCalls": [ { "id": "ccall_1234", "type": "function", "function": { "name": "get_weather", "arguments": { "location": "강남구", "date": "2025-04-17" } } } ] }, { "role": "tool", "toolCallId": "call_1234", "content": "{ \"location\": \"강남구\", \"temperature\": \"18도\", \"condition\": \"흐림\" }" } ], "seed": 0, "topP": 0.8, "topK": 0, "maxTokens": 1024, "temperature": 0.57, "repeatPenalty": 1.0, "stopBefore": [] } Step 3: 최종 응답 생성 모델은 전달받은 함수 결과를 바탕으로 사용자에게 자연스러운 형태의 최종 응답을 생성합니다. Quote { "status": { "code": "20000", "message": "OK" }, "result": { "message": { "role": "assistant", "content": "현재 강남구의 날씨는 흐리며, 기온은 18도로 확인됩니다. 외출 시 가벼운 겉옷을 준비하시는 것이 좋겠습니다. 날씨 변화에 유의하시어 건강에 유의하시기 바랍니다." }, "finishReason": "stop", "created": 1743176858, "seed": 3680689198, "usage": { "promptTokens": 92, "completionTokens": 44, "totalTokens": 136 } } } Function calling, 이렇게 사용해보세요! 1. 외부 시스템과 연동된 LLM 에이전트 설계하기 Function calling은 LLM이 외부 데이터를 활용하여 더욱 다양한 기능을 제공할 수 있도록 만들어줍니다. 이를 통해 단순한 질의응답을 넘어 고객의 다양한 요구를 충족시키고 반영할 수 있습니다. Shopping LLM 에이전트에서 특정 상품의 재고를 조회하는 방법 Shopping 에이전트를 제작할 때, 여러 가지 함수들을 사전에 정의합니다. 여기에는 재고 조회, 상품 정보 조회, 결제 처리 등 다양한 함수를 포함할 수 있습니다. 예를 들어, 사용자가 특정 상품의 재고를 물어볼 경우엔 getCount 함수를 사용할 수 있습니다. 이 함수는 특정 상품의 ID와 사용자가 위치한 지역 코드를 기반으로 상품의 재고 수량을 확인할 수 있습니다. Function calling은 먼저 사용자의 쿼리(예: “이 상품 재고 있나요?”)에서 getCount 함수를 선택하고 필요한 파라미터(상품 ID, 지역 코드)를 추출합니다. 이후 함수를 실행한 결과값(예.재고:5권)을 모델에게 전달하면 모델이 최종 답변을 생성하여 사용자에게 응답할 수 있습니다. 2. 작업 자동화를 통해 업무 효율성 증진하기 기존의 작업 자동화 방식은 명확한 룰 베이스에 기반한 반복 업무에 특화되어 있었지만, LLM으로 이러한 한계를 극복할 수 있게 되었습니다. 이때 Function calling은 외부 시스템과 연동을 통해 자동화 영역을 확장하고, 더 많은 작업을 처리하도록 도와줍니다. 매일 아침 최신 기사들의 내용을 요약하여 사내 게시판에 업로드하기 뉴스 API를 통해 최신 뉴스를 수집한 후, LLM 모델을 사용하여 각 기사의 핵심 내용을 요약할 수 있습니다. (참고 : 시간이 부족한 모두를 위한 요약 API, 이렇게 활용하세요) 사내 게시판에 업로드하기 위해 uploadnews 함수를 미리 정의하며, 이 함수는 게시글의 제목과 내용을 입력값으로 받습니다. 이후 Function calling을 사용해, LLM이 요약한 내용에서 제목과 본문을 추출하고 이를 uploadnews 함수에 전달합니다. uploadnews 함수가 실행되면 사내 게시판에 요약된 뉴스들이 게시되고, 이를 확인할 수 있습니다. 3. 필요한 정보 추출하기 Function calling은 일반적인 LLM보다 자연어 문서에서 핵심 정보를 추출하는 작업에 더욱 효과적입니다. 1) 명확하게 정해진 형식(스키마)에 맞춰 핵심 데이터 추출 가능 특정 책에 대한 작가명과 출판사를 추출하는 상황을 가정해봅시다. Function calling을 활용하면, 마치 설문지를 작성하 듯 질문에 맞춰 데이터를 정리된 형식으로 반환하여 이를 바탕으로 답변을 생성합니다. 이처럼 데이터를 구조화된 형식을 정의하면, LLM이 자연어 기반의 문서로부터 필요한 정보를 항목별로 추출할 수 있도록 도와줍니다. 2) JSON 형식의 결과 데이터를 별도의 변환 과정 없이 추가 작업 가능 뉴스 정보 추출이 완료되면, 추출된 정보를 저장하는 추가 작업이 필요합니다. 일반적인 LLM의 답변은 자유로운 형태로 제공되지만, 구체적인 형식이나 구조가 부족해 문서화나 저장을 위해 추가 작업이 필요할 때가 있습니다. 이때 Function calling을 사용하면 추출된 데이터를 JSON 형식으로 바로 응답받을 수 있어 별도의 변환 작업이 필요하지 않습니다. 추출된 데이터를 DB에 저장할 때는 정리된 설문지를 그대로 보관하는 것처럼, JSON 형식으로 받은 데이터를 그대로 전달할 수 있습니다. Function calling 성능 업그레이드 비법 1. 자세한 설명과 함께 직관적인 이름 사용하기 함수 및 매개변수의 이름은 쉽게 알아볼 수 있도록 명확하게 지정하는 것이 중요합니다. 약어나 줄임말은 지양하고, 함수가 언제 호출되어야 하는지 설명을 함께 제공하는 것이 좋습니다. 복잡한 함수의 경우, 각 매개변수가 어떤 역할을 수행하는지 설명해주면 도움이 됩니다. 함수 설명은 최소 3~4문장 이상으로 구성하여, 함수의 사용 시점과 제한 사항 그리고 매개변수가 함수의 동작에 미치는 영향을 포함합니다. 2. 명확한 매개변수 지정하기 직관적인 매개변수의 이름과 함께 설명을 제공합니다. 예를 들어, 날짜 형식을 필요로 하는 매개변수의 경우 YYYY-MM-DD 또는 DD/MM/YY와 같은 형식을 명확히 설명하여 사용자가 올바르게 입력할 수 있도록 합니다. 3. 열거형으로 명확한 매개변수 값 제한하기 가능하다면 매개변수에 열거형(enum)을 사용하여 값을 제한하는 것이 좋습니다. 예를 들어, 티셔츠의 사이즈를 선택할 때 S, M, L과 같은 옵션으로 값을 명확하게 제한하면 모델이 더 정확하게 작동할 수 있습니다. 이를 통해 잘못된 값이나 예상치 못한 값이 반환되는 상황을 줄일 수 있습니다. { "name": "pick_tshirt_size", "description": "사용자가 원하는 티셔츠 사이즈를 선택할 때 사용", "parameters": { "type": "object", "properties": { "size": { "type": "string", "enum": ["s", "m", "l"], "description": "사용자가 선택한 티셔츠 사이즈" } }, "required": ["size"], "additionalProperties": false } } 4. 함수의 개수 최적화하기 한 번에 너무 많은 함수를 사용하지 않도록, 10~20개 내외로 유지하는 것이 좋습니다. 그 이상이 되면 모델이 올바른 함수를 선택하는 데 어려움을 겪을 수 있습니다. 필요한 기능이 많다면, 함수들을 논리적으로 그룹화하거나 여러 도구(tool)로 나누어 사용해보세요. 마무리 CLOVA Studio Chat Completions v3 API의 Function calling의 기능을 알아보고 활용법을 알아보았습니다. 외부 데이터를 가져오고 실제 액션을 수행할 수 있는 Function calling을 어떻게 활용할 수 있을지 고민해보세요.🚀 2 링크 복사 다른 사이트에 공유하기 More sharing options...
Recommended Posts
게시글 및 댓글을 작성하려면 로그인 해주세요.
로그인