πŸš€ Master Prompt Engineering and building AI Agents in our NEW courses! Use PROMPTING20 for 20% off ➜ Enroll now
Function Calling

LLMs의 Function Calling

Function Calling μ‹œμž‘ν•˜κΈ°

Function Calling은 λŒ€κ·œλͺ¨μ–Έμ–΄λͺ¨λΈ(LLM)을 μ™ΈλΆ€ νˆ΄μ— μ•ˆμ •μ μΈ 연결을 톡해 효과적으둜 νˆ΄μ„ μ‚¬μš©ν•˜κ±°λ‚˜ μ™ΈλΆ€ APIμ™€μ˜ μƒν˜Έ μž‘μš©μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

GPT-4와 GPT-3.5 같은 LLM은 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•  λ•Œλ₯Ό κ°μ§€ν•œ ν›„ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ μΈμˆ˜κ°€ ν¬ν•¨λœ JSON을 좜λ ₯ν•˜λ„λ‘ λ―Έμ„Έ μ‘°μ •(fine-tuned)λ˜μ—ˆμŠ΅λ‹ˆλ‹€. Function Calling에 μ˜ν•΄ ν˜ΈμΆœλ˜λŠ” κΈ°λŠ₯은 AI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 도ꡬ 역할을 ν•˜λ©° ν•œ 번의 μš”μ²­μœΌλ‘œ ν•˜λ‚˜ 이상을 μ •μ˜(define)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ ν˜ΈμΆœμ€ μžμ—°μ–΄λ₯Ό API 호좜둜 λ³€ν™˜ν•˜μ—¬ LLM μ»¨ν…μŠ€νŠΈλ₯Ό κ²€μƒ‰ν•˜κ±°λ‚˜ μ™ΈλΆ€ 툴과 μƒν˜Έ μž‘μš©ν•΄μ•Ό ν•˜λŠ” LLM 기반 챗봇 λ˜λŠ” μ—μ΄μ „νŠΈλ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 ν•„μˆ˜μ μΈ κΈ°λŠ₯μž…λ‹ˆλ‹€.

Functional calling을 톡해 κ°œλ°œμžλŠ” λ‹€μŒμ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€:

  • μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•΄ μ™ΈλΆ€ νˆ΄μ„ 효율적으둜 μ‚¬μš©ν•  수 μžˆλŠ” λŒ€ν™”ν˜• μ—μ΄μ „νŠΈ. 예λ₯Ό λ“€μ–΄, "μ„œμšΈμ˜ λ‚ μ”¨λŠ” μ–΄λ•Œ?" 같은 μΏΌλ¦¬λŠ” get_current_weather(location: string, unit: '섭씨' | '화씨')같은 Function Call둜 λ³€ν™˜λ  κ²ƒμž…λ‹ˆλ‹€.
  • 데이터 μΆ”μΆœ 및 νƒœκΉ…(tagging)을 μœ„ν•œ LLM 기반 μ†”λ£¨μ…˜ (예: μœ„ν‚€λ°±κ³Ό κΈ°μ‚¬μ—μ„œ μ‚¬λžŒ 이름 μΆ”μΆœ)
  • μžμ—°μ–΄λ₯Ό API 호좜 λ˜λŠ” μœ νš¨ν•œ(valid) λ°μ΄ν„°λ² μ΄μŠ€ 쿼리둜 λ³€ν™˜ν•˜λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨
  • 지식을 기반으둜 μƒν˜Έ μž‘μš©ν•˜λŠ” λŒ€ν™”ν˜• 지식 검색 μ—”μ§„(conversational knowledge retrieval engines)

이번 κ°€μ΄λ“œμ—μ„œλŠ”, λ‹€μ–‘ν•œ μœ μŠ€μΌ€μ΄μŠ€λ₯Ό 톡해 GPT-4와 μ˜€ν”ˆμ†ŒμŠ€ λͺ¨λΈμ„ 톡해 ν”„λ‘¬ν”„νŒ…μ„ ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

GPT-4와 Function Calling

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ, λͺ¨λΈμ—κ²Œ μ£Όμ–΄μ§„ μœ„μΉ˜μ˜ 날씨λ₯Ό μ‘°νšŒν•˜λ„λ‘ μš”μ²­ν–ˆλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

LLMλ§ŒμœΌλ‘œλŠ” μ»·μ˜€ν”„ ν¬μΈνŠΈκ°€ μžˆλŠ” 데이터 μ„ΈνŠΈλ‘œ ν›ˆλ ¨μ„ ν–ˆκΈ°λ•Œλ¬Έμ— 이 μš”μ²­μ— 응닡할 수 μ—†μŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 LLM을 μ™ΈλΆ€ 툴과 κ²°ν•©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λͺ¨λΈμ˜ ν•¨μˆ˜ 호좜 κΈ°λŠ₯을 ν™œμš©ν•˜μ—¬ μΈμˆ˜μ™€ ν•¨κ»˜ ν˜ΈμΆœν•  μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό κ²°μ •ν•œ λ‹€μŒ μ΅œμ’… 응닡을 λ°˜ν™˜ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ OpenAI APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό λ‹¬μ„±ν•˜λŠ” 방법에 λŒ€ν•œ κ°„λ‹¨ν•œ μ˜ˆμž…λ‹ˆλ‹€. Let's say a user is asking the following question to the model:

μ„œμšΈμ˜ λ‚ μ”¨λŠ” μ–΄λ•Œ?

Function Calling을 μ‚¬μš©ν•˜μ—¬ 이 μš”μ²­μ„ μ²˜λ¦¬ν•˜λ €λ©΄ 첫 번째 λ‹¨κ³„μ—μ„œ OpenAI API μš”μ²­μ˜ μΌλΆ€λ‘œ 전달할 날씨 ν•¨μˆ˜λ‚˜ ν•¨μˆ˜ μ§‘ν•©(set)을 μ •μ˜ν•©λ‹ˆλ‹€:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "μ£Όμ–΄μ§„ μœ„μΉ˜μ˜ 날씨λ₯Ό μ‘°νšŒν•˜κΈ°",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "λ„μ‹œμ™€ 지역ꡬ, e.g. μ„œμšΈνŠΉλ³„μ‹œ, 관악ꡬ",
                    },
                    "unit": {
                        "type": "string", 
                        "enum": ["섭씨", "화씨"]},
                },
                "required": ["location"],
            },
        },   
    }
]

μœ„μ˜ get_current_weather μ£Όμ–΄μ§„ μœ„μΉ˜μ— 따라 κ·Έ μ§€μ—­μ˜ 날씨λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 이 ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό μš”μ²­μ˜ μΌλΆ€λ‘œ μ „λ‹¬ν•˜λ©΄ μ‹€μ œλ‘œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ§€λŠ” μ•Šκ³  ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 데 ν•„μš”ν•œ μΈμˆ˜κ°€ ν¬ν•¨λœ JSON 객체만 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 이λ₯Ό λ‹¬μ„±ν•˜λŠ” 방법에 λŒ€ν•œ λͺ‡ κ°€μ§€ μ½”λ“œ μŠ€λ‹ˆνŽ«μž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆκ² μ§€μš”:

def get_completion(messages, model="gpt-3.5-turbo-1106", temperature=0, max_tokens=300, tools=None):
    response = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
        max_tokens=max_tokens,
        tools=tools
    )
    return response.choices[0].message

μ•„λž˜λŠ” μ‚¬μš©μžμ˜ μ§ˆλ¬Έμ„ κ΅¬μ„±ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€:

messages = [
    {
        "role": "user",
        "content": "μ„œμšΈμ˜ λ‚ μ”¨λŠ” μ–΄λ–„?"
    }
]

λ§ˆμΉ¨λ‚΄, μœ„μ˜ get_completionν•¨μˆ˜μ™€ messages와 tools λͺ¨λ‘λ₯Ό ν•¨κ»˜ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€:

response = get_completion(messages, tools=tools)

응닡(request) κ°μ²΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='...', function=Function(arguments='{"location":"μ„œμšΈ","unit":"섭씨"}', name='get_current_weather'), type='function')])

특히 인수(argument) κ°μ²΄μ—λŠ” λͺ¨λΈμ΄ μΆ”μΆœν•œ μ€‘μš”ν•œ μΈμˆ˜λ“€μ΄ ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ μš”μ²­μ„ μ™„λ£Œν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.

그런 λ‹€μŒ μ‹€μ œ 날씨λ₯Ό μœ„ν•΄ μ™ΈλΆ€ 날씨 APIλ₯Ό ν˜ΈμΆœν•΄λ„ μ’‹μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžμ˜ 원 μ§ˆλ¬Έμ— λŒ€ν•œ μ΅œμ’… 응닡을 μš”μ•½ν•œ λͺ¨λΈμ— 전달할 날씨 정보가 있으면 λ§μ΄μ§€μš”.

Notebooks

λ‹€μŒμ€ OpenAI APIλ₯Ό μ‚¬μš©ν•˜μ—¬ Function Calling을 μ‚¬μš©ν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” κ°„λ‹¨ν•œ μ˜ˆκ°€ μžˆλŠ” Notebookμž…λ‹ˆλ‹€:

μ˜€ν”ˆ μ†ŒμŠ€ LLM의 Function Calling

μ˜€ν”ˆ μ†ŒμŠ€ LLM을 μ‚¬μš©ν•œ Function Calling에 λŒ€ν•œ 더 λ§Žμ€ λ‚΄μš©μ„ κ³§ κ³΅κ°œν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

Function Calling μœ μŠ€μΌ€μ΄μŠ€

λ‹€μŒμ€ LLM의 Function Calling κΈ°λŠ₯의 이점을 얻을 수 μžˆλŠ” μ‚¬μš© 사둀 λͺ©λ‘μž…λ‹ˆλ‹€:

  • λŒ€ν™”ν˜• μ—μ΄μ „νŠΈ: κΈ°λŠ₯ ν˜ΈμΆœμ€ μ™ΈλΆ€ APIλ‚˜ μ™ΈλΆ€ 지식 κΈ°λ°˜μ„ ν˜ΈμΆœν•˜μ—¬ 보닀 κ΄€λ ¨μ„± 있고 μœ μš©ν•œ 응닡을 μ œκ³΅ν•¨μœΌλ‘œμ¨ λ³΅μž‘ν•œ μ§ˆλ¬Έμ— λ‹΅λ³€ν•˜λŠ” λ³΅μž‘ν•œ λŒ€ν™”ν˜• μ—μ΄μ „νŠΈλ‚˜ 챗봇을 λ§Œλ“œλŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μžμ—°μ–΄ 이해: μžμ—°μ–΄λ₯Ό κ΅¬μ‘°ν™”λœ JSON λ°μ΄ν„°λ‘œ λ³€ν™˜ν•˜κ³  ν…μŠ€νŠΈμ—μ„œ κ΅¬μ‘°ν™”λœ 데이터λ₯Ό μΆ”μΆœν•˜λ©° λͺ…λͺ…λœ 개체(entity) 인식, 감정 뢄석, ν‚€μ›Œλ“œ μΆ”μΆœ λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μˆ˜ν•™ 문제 ν’€κΈ°: Function Calling을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 단계와 λ‹€μ–‘ν•œ μœ ν˜•μ˜ κ³ κΈ‰ 계산이 ν•„μš”ν•œ λ³΅μž‘ν•œ μˆ˜ν•™ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • API 톡합(Integration): LLMκ³Ό μ™ΈλΆ€ APIλ₯Ό 효과적으둜 ν†΅ν•©ν•˜μ—¬ 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μž…λ ₯에 λ”°λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” QA μ‹œμŠ€ν…œμ΄λ‚˜ ν¬λ¦¬μ—μ΄ν‹°λΈŒ μ–΄μ‹œμŠ€ν„΄νŠΈλ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. 일반적으둜 Function Calling은 μžμ—°μ–΄λ₯Ό μœ νš¨ν•œ API 호좜둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 정보 μΆ”μΆœ: κΈ°μ‚¬μ—μ„œ κ΄€λ ¨ λ‰΄μŠ€ κΈ°μ‚¬λ‚˜ μ°Έκ³ λ¬Έν—Œμ„ κ²€μƒ‰ν•˜λŠ” λ“± μ£Όμ–΄μ§„ μž…λ ₯μ—μ„œ νŠΉμ • 정보λ₯Ό μΆ”μΆœν•˜λŠ” κΈ°λŠ₯ ν˜ΈμΆœμ„ 효과적으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ°Έκ³ λ¬Έν—Œ