Jump to content

CLOVA Studio 운영자5

Administrators
  • 게시글

    4
  • 첫 방문

  • 최근 방문

  • Days Won

    1

Everything posted by CLOVA Studio 운영자5

  1. 들어가며 본 쿡북에서는 CLOVA Studio의 Chat Completions v3 API를 활용해, 외부 데이터를 조회하거나 도구를 실행하고 그 결과를 반영해 응답하는 AI 어시스턴트를 구축하는 방법을 소개합니다. Chat Completions v3 API 가이드는 다음 링크를 참고해 주세요. (링크) 작동 원리 본 쿡북에서는 금융 어시스턴트를 제작하는 과정을 예제로 다룹니다. 먼저, 어시스턴트의 작동 원리를 살펴보겠습니다. 사용자가 입력한 내용은 messages와 사전에 정의된 tools(functions) 정보가 함께 Function calling 모델에 전달되어 검토됩니다. Function calling 모델은 적합한 function을 선택하고 arguments 값을 응답하는데, 이 과정에서 사용자 발화가 정의된 tools와 무관하다고 판단이 되면 고정 응답이 반환됩니다. 생성된 Function calling 응답은 사용자가 직접 실행하여 그 결과를 messages에 업데이트한 뒤, 다시 Chat Completions API에 전달합니다. Chat Completions이 호출되면 설정된 시스템 프롬프트와 파라미터 값에 기반하여 LLM이 최종 답변을 생성합니다. 사용 시나리오 다음으로, 금융 어시스턴트의 사용 시나리오를 살펴보겠습니다. 시나리오는 아래와 같이 1) 특정 종목의 주가 정보 2) 주식 주문 3) 환율 계산기 도구와 4) 고정 응답으로 구성됩니다. 다음 가이드를 따라 금융 어시스턴트를 직접 만들어 보고, 자신만의 AI 어시스턴트로 확장해 보세요! 🚀 환경 설정 필요한 라이브러리 설치 및 임포트 FinanceDataReader는 국내 및 해외의 금융 데이터(주가, 지수 등)를 불러올 수 있는 파이썬 오픈소스 라이브러리 입니다. 다음 코드를 실행하여 필요한 라이브러리를 설치하고 임포트 하세요. Chat Completions v3 API 요청 정의 Chat Completions v3 API를 통해 함수 호출(Function calling)과 일반 대화 응답 생성을 모두 처리할 수 있습니다. 요청 본문에 도구 정의(tools)를 함께 전달하면, 사용자의 입력에 따라 필요한 도구가 자동으로 선택되고 실행됩니다. 이때 주식 데이터 조회(get_stock_data), 주식 주문(order_stock), 환율 계산(calculate_currency)의 세 가지 도구를 사용할 수 있으며, "toolChoice": "auto"로 설정하면 도구 선택이 자동으로 이뤄집니다. 반대로, 도구를 포함하지 않은 요청은 일반 LLM 응답 생성으로 처리됩니다. 이 경우 temperature, maxTokens 등의 생성 파라미터를 활용해 응답의 스타일과 길이를 조절할 수 있습니다. 성능과 목적에 따라 적합한 모델(HCX-DASH-002, HCX-005)을 선택하여 활용해 주세요. def chat_completions(messages, tools=None, tool_choice="auto", **generation_params): url = "YOUR_API_URL" # 테스트 앱/서비스 앱을 통해 발급 받은 Chat Completions API 호출 경로를 입력하세요. headers = { "Authorization": "Bearer YOUR_API_KEY", # 본인이 발급 받은 API Key를 입력하세요. "X-NCP-CLOVASTUDIO-REQUEST-ID": "YOUR_REQUEST_ID", # 본인이 발급 받은 API의 요청 ID를 입력하세요. "Content-Type": "application/json" } data = { "messages": messages, "toolChoice": tool_choice if tools else "none", **generation_params } if tools: data["tools"] = tools response = requests.post(url, headers=headers, json=data) return response.json() Tools 정의 도구 호출을 활용하려면, API 요청 본문에 사용할 함수 목록을 tools 필드에 정의해야 합니다. 아래는 이 예제에서 사용되는 세 가지 함수 정의입니다. get_stock_data: 특정 종목의 주가나 거래량을 조회합니다. order_stock: 주식을 매수하거나 매도할 수 있습니다. 시장가 또는 지정가 주문을 지원합니다. calculate_currency: 특정 금액을 다른 통화로 환산할 수 있습니다. 각 함수는 이름(name), 설명(description), 입력 파라미터(parameters)로 구성되며, 파라미터는 모두 JSON Schema 형식으로 정의됩니다. 이 정의를 통해 LLM은 어떤 도구가 어떤 인자를 필요로 하는지 이해하고, 사용자 입력에 따라 적절히 호출할 수 있게 됩니다. tools = [ { "type": "function", "function": { "name": "get_stock_data", "description": "특정 종목의 현재 혹은 과거 주가와 거래량을 조회할 수 있습니다.", "parameters": { "type": "object", "properties": { "ticker": { "description": "조회할 종목 코드(ticker)입니다. ex. 네이버의 종목코드는 035420", "type": "string" }, "date": { "description": "조회 날짜입니다. (형식: 'YYYY-MM-DD')", "type": "string" }, "result_type": { "description": "조회 유형입니다.", "type": "string", "enum": ["price", "volume"] } }, "required": ["ticker", "date", "result_type"] } } }, { "type": "function", "function": { "name": "order_stock", "description": "시장가/지정가로 주식을 주문할 수 있습니다.", "parameters": { "type": "object", "properties": { "ticker": { "description": "주문할 종목 코드(ticker)입니다. ex. 네이버의 종목코드는 035420", "type": "string" }, "action_type": { "description": "매수/매도를 지정합니다.", "type": "string", "enum": ["매수", "매도"] }, "shares": { "description": "주문 주식 수를 설정합니다.", "type": "integer" }, "order_type": { "description": "주문 유형을 지정합니다.", "type": "string", "enum": ["시장가", "지정가"] }, "order_price": { "description": "지정가일 경우 가격을 설정합니다.", "type": "number" } }, "required": ["ticker", "action_type", "shares", "order_type"] } } }, { "type": "function", "function": { "name": "calculate_currency", "description": "환율 계산을 도와줍니다.", "parameters": { "type": "object", "properties": { "from_currency": { "description": "환전 대상 화폐 종류를 설정합니다.", "type": "string", "enum": ["KRW", "USD", "EUR", "JPY"] }, "to_currency": { "description": "환전하고자 하는 화폐 종류를 설정합니다.", "type": "string", "enum": ["KRW", "USD", "EUR", "JPY"] }, "amount": { "description": "총 환전 대상 금액입니다. (from_currency 기준)", "type": "number" }, "date": { "description": "환율 기준 날짜입니다. (형식: 'YYYY-MM-DD')", "type": "string" } }, "required": ["from_currency", "to_currency", "amount", "date"] } } } ] 사용자 함수 정의 앞서 정의한 세 가지 도구를 처리하는 사용자 정의 함수를 구현합니다. 사용자 함수는 API 뿐만 아니라 데이터베이스, 로컬 또는 클라우드 저장소의 파일 등 다양한 소스 및 기능과 연동하여 활용될 수 있습니다. get_stock_data 파이썬 오픈소스 라이브러리(FinanceDataReader)를 활용해 주식 데이터를 조회하는 함수를 정의합니다. 종목 코드와 날짜를 기반으로, 해당 시점의 주가 또는 거래량 데이터를 반환합니다. 이외 다양한 금융 데이터 소스와 연동하거나, 데이터 처리 로직을 추가해 보다 심화된 결과를 제공할 수 있습니다. def get_stock_data(ticker, date, result_type): stock_data = fdr.DataReader(ticker, date) if stock_data.empty: return [{"name": "get_stock_data", "response": f"{ticker}에 대한 {date} 데이터가 없습니다."}] row = stock_data.iloc[0] if result_type == "price": return [{"name": "get_stock_data", "response": {"date": date, "price": float(row['Close'])}}] elif result_type == "volume": return [{"name": "get_stock_data", "response": {"date": date, "volume": int(row['Volume'])}}] else: return [{"name": "get_stock_data", "response": "잘못된 조회 유형입니다. '가격' 또는 '거래량'만 조회 가능합니다."}] order_stock 주식 주문을 처리하는 함수를 정의합니다. 종목 코드, 주문 유형(매수, 매도) 등을 바탕으로 처리한 결과를 반환합니다. 현재는 예제로서 단순 메시지를 반환하지만, 실제로는 주문 데이터를 DB에 기록하거나 주문 API를 호출하는 방식으로 확장 가능합니다. def order_stock(ticker, action_type, shares, order_type, order_price=None): if order_type == "지정가" and (order_price is None or order_price <= 0): return [{"name": "order_stock", "response": "지정가 주문에는 유효한 가격이 필요합니다."}] # DB 연동하여 확장 가능 return [{"name": "order_stock", "response": f"{ticker} 종목 {shares}주 {order_type}로 '{action_type}' 주문 완료"}] calculate_currency 환율 계산을 수행하는 함수를 정의합니다. 환전할 금액, 통화 종류 등을 입력 받아 계산 결과를 반환합니다. 현재는 예제로서 하드코딩 된 가상의 고정 환율 데이터를 사용하고 있지만, 실제로는 로컬 파일(json, xls, txt 등) 또는 외부 API를 통해 데이터를 읽어오는 방식으로 확장할 수 있습니다. def calculate_currency(from_currency, to_currency, amount, date): exchange_rates = { "KRW": {"USD": 0.0006725, "EUR": 0.0006178, "JPY": 0.09817}, "USD": {"KRW": 1487.07, "EUR": 1.0884, "JPY": 150.99}, "EUR": {"KRW": 1618.79, "USD": 0.9188, "JPY": 138.74}, "JPY": {"KRW": 10.187, "USD": 0.00662, "EUR": 0.00721}, } rate = exchange_rates.get(from_currency, {}).get(to_currency) if not rate: return [{"name": "calculate_currency", "response": "지원되지 않는 통화입니다."}] converted_amount = round(amount * rate, 2) return [{"name": "calculate_currency", "response": f"{converted_amount} {to_currency}"}] 함수 실행 처리 다음으로 정의한 process_tool_calls는 해당 도구에 정의된 함수와 매개변수를 매핑하여 동적으로 실행해 주는 역할을 합니다. 이를 통해 다양한 도구 호출 시 공통 로직을 단순화할 수 있습니다. def process_tool_calls(tool_name, arguments): tool_map = { "get_stock_data": get_stock_data, "order_stock": order_stock, "calculate_currency": calculate_currency } func = tool_map.get(tool_name) # 추출한 매개변수를 키워드 인수로 함수에 전달하여 실행합니다. return func(**arguments) 실행 및 테스트 사용자 요청을 처리하고 최종 응답을 생성하는 전체 실행 과정을 테스트합니다. 사용자 쿼리를 입력하면 적합한 도구를 선택해 실행한 결과를 AI 대화 흐름에 추가하여 응답을 제공합니다. 사용자 요청이 정의된 도구와 일치하지 않거나, 적합한 도구를 선택할 수 없는 경우 "toolCalls"가 비어 있을 수 있습니다. 다음 코드에서는 이러한 상황을 감지하고 적절한 오류 메시지를 반환하도록 처리합니다. query = "YOUR_QUERY" messages = [{"role": "user", "content": query}] print(f"User: {query}") # Step 1. 요청 — 입력 및 함수 정의 전달 function_response = chat_completions( messages = messages, tools = tools ) # Step 2. 응답 — 호출할 함수 및 인수 추출 tool_calls = function_response.get("result", {}).get("message", {}).get("toolCalls", []) try: if not tool_calls: # 도구 호출이 없을 경우 error_message = "죄송하지만, 입력하신 내용은 제가 처리할 수 있는 범위를 벗어났습니다. 주식 정보나 환율 계산과 관련된 요청으로 다시 시도해 주세요." messages.append({"content": error_message, "role": "assistant"}) print(f"Assistant: {error_message}") else: # 도구 호출이 있을 경우 messages.append({"role": "assistant", "content": "", "toolCalls": tool_calls}) tool_call = tool_calls[0] print(f"\nAssistant: {tool_call}\n") # Step 3. 함수 실행 — 응답 기반으로 실제 함수 호출 tool_call_id = tool_call["id"] tool_name = tool_call["function"]["name"] arguments = tool_call["function"]["arguments"] results = process_tool_calls(tool_name, arguments) messages.append({"role": "tool", "content": str(results), "toolCallId": tool_call_id}) print(f"Tool: {results}\n") # Step 4. 요청 — 함수 실행 결과 전달 chat_response = chat_completions( messages = messages, seed = 0, topP = 0.8, topK = 0, maxTokens = 1024, temperature = 0.5, repeatPenalty = 1.1, stopBefore = [], includeAiFilters = True ) # Step 5. 응답 — 최종 답변 추출 final_answer = chat_response.get("result").get("message").get("content") print(f'Assistant: {final_answer}') except Exception as e: error_message = f"요청 처리 중 오류가 발생했습니다: {str(e)}" messages.append({"content": error_message, "role": "assistant"}) print(f"Assistant: {error_message}") 다음은 위 코드 실행 시 출력 예시입니다. 이 출력은 사용자 요청이 Function calling과 사용자 정의 함수를 거쳐 최종 응답으로 생성되는 단계를 순차적으로 보여줍니다. output sample 1 User: 네이버 그저께 주가 Assistant: {'id': 'call_abA5RsWViXcaCa7FCWg1eoDf', 'type': 'function', 'function': {'name': 'get_stock_data', 'arguments': {'ticker': '035420', 'date': '2025-04-06', 'result_type': 'price'}}} Tool: [{'name': 'get_stock_data', 'response': {'date': '2025-04-06', 'price': np.float64(191800.0)}}] Assistant: 네이버의 그저께 주가는 191,800원이었습니다. output sample 2 User: 엔비디아 10주를 100불에 매도해줘 Assistant: {'id': 'call_Vy7hJQnTicsB1PFa4tscjl0W', 'type': 'function', 'function': {'name': 'order_stock', 'arguments': {'ticker': 'NVDA', 'action_type': '매도', 'shares': 10, 'order_type': '지정가', 'order_price': 100}}} Tool: [{'name': 'order_stock', 'response': "NVDA 종목 10주 지정가로 '매도' 주문 완료"}] Assistant: 사용자님께서 말씀하신 NVDA 종목 10주에 대한 지정가 매도 주문이 완료되었습니다. output sample 3 User: 만원을 달러로 환전하면 얼마인가요 Assistant: {'id': 'call_b7ianfYh9jiEk1csGgWCZKiI', 'type': 'function', 'function': {'name': 'calculate_currency', 'arguments': {'from_currency': 'KRW', 'to_currency': 'USD', 'amount': 10000, 'date': '2025-04-08'}}} Tool: [{'name': 'calculate_currency', 'response': '6.76 USD'}] Assistant: 만 원(10,000 KRW)을 달러로 환전하면 약 6.76 USD입니다. (환율은 2025년 4월 8일 기준입니다.) output sample 4 User: 오늘 날씨 어때? Assistant: 죄송하지만, 입력하신 내용은 제가 처리할 수 있는 범위를 벗어났습니다. 주식 정보나 환율 계산과 관련된 요청으로 다시 시도해 주세요. 실전 활용 팁 이 섹션에서는 Function calling에서 복잡한 사용자 요청을 효과적으로 처리하는 방법을 예시와 함께 알아봅니다. 예를 들어, 특정 종목의 주가를 조회하면서 동시에 주식 주문을 처리하는 복잡한 멀티 쿼리 시나리오도 쉽게 해결할 수 있습니다. 1. 병렬 도구 호출: 여러 도구를 동시에 실행하기 여러 도구를 동시에 호출한 뒤, 그 결과를 종합하여 사용자 요청에 응답할 수 있습니다. 복잡한 요청을 단계별로 실행할 때 유용합니다. User: 지금 테슬라 주가 얼마야? 시장가로 20주 매수 주문해줘. Assistant: [{'id': 'call_eeYdvrLHG69sYFJgC95XBjCd', 'type': 'function', 'function': {'name': 'get_stock_data', 'arguments': {'ticker': 'TSLA', 'date': '2025-04-08', 'result_type': 'price'}}}, {'id': 'call_fsVYRYX5hGI9OvzObPe4gxqG', 'type': 'function', 'function': {'name': 'order_stock', 'arguments': {'ticker': 'TSLA', 'action_type': '매수', 'shares': 20, 'order_type': '시장가'}}}] Tool: [{'name': 'get_stock_data', 'response': {'date': '2025-04-08', 'price': 233.2899932861328}}] Tool: [{'name': 'order_stock', 'response': "TSLA 종목 20주 시장가로 '매수' 주문 완료"}] Assistant: 현재(2025년 4월 8일) 테슬라(TSLA)의 주가는 **233.29** 달러입니다. 또한 요청하신 대로 시장가로 20주를 매수하는 주문을 완료했습니다. 추가적인 도움이 필요하시면 말씀해 주세요! 2. 도구 간 의존성 처리: 특정 도구의 출력 결과를 다른 도구의 입력으로 사용하기 한 도구의 출력이 다른 도구의 입력으로 사용되는 경우, 시스템 프롬프트와 큐(queue)를 활용하여 도구 간 의존성을 처리할 수 있습니다. Function calling 호출 시 시스템 프롬프트에 의존성을 "@도구이름.출력키" 형식으로 명시하게끔 하여 각 도구가 필요한 데이터를 다른 도구의 결과에서 자동으로 참조하도록 설정합니다. 그리고 각 도구 호출은 큐로 관리하며, 의존성이 해결된 도구부터 순차적으로 실행해 결과를 축적하고, 의존성이 충족되지 않은 도구는 다시 큐에 삽입해 처리합니다. 결과적으로 모든 호출이 처리된 후 최종 응답을 생성하여 사용자에게 제공합니다. User: 오늘 테슬라 주가 알려주고 한화로 계산하면 얼마인지 계산해줘 Assistant: {'id': 'call_QqLOLiZYwgqG44mXXNP2ktHL', 'type': 'function', 'function': {'name': 'get_stock_data', 'arguments': {'ticker': 'TSLA', 'date': '2025-04-08', 'result_type': 'price'}}} Tool: {'date': '2025-04-08', 'price': 233.2899932861328} Assistant: {'id': 'call_Gc7gkcZUItMKF3n6sw3p6nw3', 'type': 'function', 'function': {'name': 'calculate_currency', 'arguments': {'from_currency': 'USD', 'to_currency': 'KRW', 'amount': 233.2899932861328, 'date': '2025-04-08'}}} Tool: 346487.31 KRW Assistant: 2025년 4월 08일 기준으로 테슬라(TSLA)의 주가는 **233.29 USD**이며, 이를 한화로 환산하면 약 **346,487원**입니다. 마무리 CLOVA Studio의 Chat Completions v3 API를 활용해, 도구(Function)를 호출하고 자연스러운 대화 응답을 생성하는 방법을 살펴보았습니다. 이번 쿡북을 통해 Function calling의 작동 원리를 이해하고, 이를 활용해 자신만의 데이터 소스와 도구를 결합하여 AI 어시스턴트를 제작해 보시길 바랍니다!
  2. Function calling, 쉽게 알아보기 LLM 에이전트가 우리의 모든 질문에 답변할 수 있다면 얼마나 편리할까요? 하지만 LLM은 미리 학습한 데이터를 기반으로 답변하기 때문에 실시간 정보 제공이나 외부 데이터 활용에 한계가 있습니다. 이러한 문제를 해결하기 위해 등장한 기술이 바로 'Function calling'입니다. 이 기능은 LLM이 외부 도구를 활용해 필요한 정보를 가져올 수 있도록 돕는 역할을 합니다. 모델이 스스로 해결할 수 없는 질문이 있을 때, 외부에서 정보를 받아와 더 정확한 답변을 제공할 수 있습니다. 이처럼 LLM이 외부 시스템이나 API를 사용할 수 있기 때문에, Function calling을 '도구(tool)'라고도 부릅니다. Function calling은 스킬(참고: 스킬 트레이너)과 유사해 보일 수 있지만 차이가 있습니다. 스킬은 트레이너 내에 API를 등록해 모델이 스스로 답변까지 생성해 주는 반면, 이 기능은 개발자가 외부 API를 직접 실행해야 합니다. 또한, Function calling은 API뿐만 아니라 스크립트나 라이브러리 내 함수 호출도 가능하다는 점에서 차이가 존재합니다. Function calling이 무엇인지, 그리고 어떻게 활용할 수 있는지 소개해드리겠습니다. Function calling은 어떻게 작동할까요? Function calling은 LLM(대규모 언어 모델)이 사용자의 질문에 맞춰 미리 정의된 함수를 사용해 필요한 기능을 실행하도록 돕는 방식입니다. 예를 들어, 사용자가 ❶"오늘 강남구 날씨는 어때?"라고 질문하면, ❷모델은 이 질문을 전달 받아 분석해 ❸사전에 정의된 함수 중 get_weather를 사용해야 한다고 판단합니다. 이 과정에서 모델은 "강남구"라는 위치 정보와 "2025-04-17"이라는 날짜를 파라미터로 추출합니다. 여기서 중요한 점은, 모델은 함수를 직접 호출하지 않는다는 것 입니다. 대신, 모델은 사용할 함수를 결정하고 필요한 매개변수를 포함한 데이터를 생성합니다. 즉, 사용자의 요청에 따라 미리 정의된 함수 중 어떤 것을 사용하고 어떤 값을 넣어야 할지 결정하는 역할을 합니다. 이후, ❹외부의 날씨 서비스 API에 연결해 ❺실시간 날씨 데이터를 받아오고, ❻그 정보를 모델에게 전달하면 ❼ 모델이 최종답변을 완성합니다. 이를 통해 ❽"현재 강남구의 온도는 18도 이고, 날씨는 흐립니다." 와 같은 응답을 제공할 수 있습니다. Function calling은 실제로 어떻게 사용하나요? 앞서 설명드린 동작 과정을 바탕으로, "사용자 입력 → 모델이 tool 선택 → 외부 함수 결과 전달 → 최종 응답 생성" 이라는 흐름이 코드에서 어떻게 구현되는지 아래 예시를 참고해주세요. Step 1: 사용자 메시지+함수 정의 전송 사용자 입력과 함께 사용할 수 있는 함수 목록을 모델에 전달합니다. 모델은 이를 바탕으로 어떤 도구(tool)를 사용할지 결정합니다. 응답 결과 Step 2: toolCallId에 대한 함수 결과 전달 모델이 사용자 입력에 대해 get_weather 함수를 호출해야 한다고 판단했습니다. 이제 실제 날씨 API를 호출한 결과를 "role": "tool" 메시지로, toolCallId와 함께 전달합니다. 이때는 함수 정의를 다시 포함하지 않아도 되지만, 이후에 사용자로부터 추가 질문(예: "그럼 부산 날씨는 어때?")이 들어올 가능성이 있다면 해당 함수 정의를 다시 포함해 전달하는 것이 좋습니다. Step 3: 최종 응답 생성 모델은 전달받은 함수 결과를 바탕으로 사용자에게 자연스러운 형태의 최종 응답을 생성합니다. 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을 어떻게 활용할 수 있을지 고민해보세요.🚀
  3. @MRN님 안녕하세요! 문의주신 내용이 실제 스킬셋 서비스 API 호출이 아닌 스킬 트레이너 내 데이터 수집 페이지에서 "Step2의 결과호출" 부분을 수정하고 싶으신 것으로 이해했는데 맞을까요? Step 2 액션입력 부분의 키워드를 수정하시고 "적용" 버튼을 누르시면 결과 호출을 다시 하실 수 있습니다. 혹시 문의주신 내용과 다르다면 조금 더 구체적인 설명을 부탁드리겠습니다. 감사합니다.
  4. 안녕하세요. 샘플 스킬셋 호출을 위한 호출옵션 예제 전달드립니다. 발급 받으신 X-Naver-Client-Id 와 X-Naver-Client-Secret을 각 필드에 입력 후, 적용하기 버튼을 누르시고 쿼리를 실행하시면 됩니다. { "baseOperation": { "header": { "X-Naver-Client-Id": "", "X-Naver-Client-Secret": "" }, "query": null, "requestBody": null } } 혹시 다른 궁금하신 점이 있으시다면 말씀주세요. 감사합니다.
×
×
  • Create New...