|
| 1 | +# 함수 호출이란 무엇인가[[what-is-function-calling]] |
| 2 | + |
| 3 | +함수 호출은 **LLM이 환경과 상호작용하여 동작을 수행하는 방법**입니다. 처음에는 [GPT-4에서 도입되었으며](https://openai.com/index/function-calling-and-other-api-updates/), 이후 다른 모델에서도 구현되었습니다. |
| 4 | + |
| 5 | +에이전트의 도구처럼, 함수 호출은 모델에게 **주어진 환경에서 동작을 수행할 수 있는 능력**을 제공합니다. 다만 함수 호출 능력은 **모델 스스로 학습을 통해 체득한 것**이므로, 다른 에이전트 기법들보다 **프롬프트에 덜 의존**한다는 점입니다. |
| 6 | + |
| 7 | +Unit 1에서는 에이전트가 **도구를 사용하는 법을 학습한 것이 아니며**, 우리는 그저 도구 목록을 모델에게 제공했고, 모델이 **이 도구들을 활용해 계획을 생성할 것이라는 일반화 능력**에 의존했습니다. |
| 8 | + |
| 9 | +여기서는 **함수 호출을 통해 에이전트가 도구를 사용할 수 있도록 미세 조정(학습)**합니다. |
| 10 | + |
| 11 | +## 모델은 동작 수행을 어떻게 "학습"할까요?[[how-does-the-model-learn-to-take-an-action]] |
| 12 | + |
| 13 | +Unit 1에서는 에이전트의 일반적인 워크플로우를 살펴보았습니다. 사용자가 에이전트에 도구를 제공하고 질의를 전달하면, 모델은 다음 과정을 반복합니다. |
| 14 | + |
| 15 | +1. *사고(Think)* : 목표를 달성하기 위해 어떤 동작을 수행해야 할지 고민합니다. |
| 16 | +2. *행동(Act)* : 정해진 형식에 맞춰 행동을 수행하고, 일단 자신의 텍스트 응답 생성은 멈춥니다. |
| 17 | +3. *관찰(Observe)* : 행동의 실행 결과를 외부로부터 받아옵니다. |
| 18 | + |
| 19 | +API를 통한 “일반적인” 대화는 아래처럼 사용자("user")와 어시스턴트("assistant")가 메시지를 주고받는 형태로 구성됩니다. |
| 20 | + |
| 21 | +```python |
| 22 | +conversation = [ |
| 23 | + {"role": "user", "content": "I need help with my order"}, |
| 24 | + {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"}, |
| 25 | + {"role": "user", "content": "It's ORDER-123"}, |
| 26 | +] |
| 27 | +``` |
| 28 | + |
| 29 | +함수 호출은 이 대화의 흐름에 **새로운 역할("role")**을 추가합니다! |
| 30 | + |
| 31 | +1. **행동(Action)**을 위한 새로운 역할 |
| 32 | +2. **관찰(Observation)**을 위한 새로운 역할 |
| 33 | + |
| 34 | +[Mistral API](https://docs.mistral.ai/capabilities/function_calling/)를 예로 들면, 대화 구조가 이렇게 바뀌게 됩니다. |
| 35 | + |
| 36 | +```python |
| 37 | +conversation = [ |
| 38 | + { |
| 39 | + "role": "user", |
| 40 | + "content": "What's the status of my transaction T1001?" |
| 41 | + }, |
| 42 | + { |
| 43 | + "role": "assistant", |
| 44 | + "content": "", |
| 45 | + "function_call": { |
| 46 | + "name": "retrieve_payment_status", |
| 47 | + "arguments": "{\"transaction_id\": \"T1001\"}" |
| 48 | + } |
| 49 | + }, |
| 50 | + { |
| 51 | + "role": "tool", |
| 52 | + "name": "retrieve_payment_status", |
| 53 | + "content": "{\"status\": \"Paid\"}" |
| 54 | + }, |
| 55 | + { |
| 56 | + "role": "assistant", |
| 57 | + "content": "Your transaction T1001 has been successfully paid." |
| 58 | + } |
| 59 | +] |
| 60 | +``` |
| 61 | +> ...하지만 방금 함수 호출에 '새로운 역할'이 추가된다고 하지 않았나요? |
| 62 | +
|
| 63 | +**그렇기도 하고 아니기도 합니다.** 이 경우를 비롯해 많은 API에서, 모델은 수행할 동작을 "assistant" 메시지로 출력합니다. 그러면 이후 채팅 템플릿이 이 메시지를 함수 호출을 위한 **특수 토큰**으로 변환하여 처리합니다. |
| 64 | + |
| 65 | +- `[AVAILABLE_TOOLS]` – 사용 가능한 도구 목록 시작 |
| 66 | +- `[/AVAILABLE_TOOLS]` – 사용 가능한 도구 목록 종료 |
| 67 | +- `[TOOL_CALLS]` – 도구를 호출(즉, **Action** 수행) |
| 68 | +- `[TOOL_RESULTS]` – 동작 결과(“Observe”) |
| 69 | +- `[/TOOL_RESULTS]` – 관찰 종료(이제 모델이 이어서 응답을 생성할 수 있음) |
| 70 | + |
| 71 | +강의에서 함수 호출을 다시 다룰 예정이지만, 더 깊이 살펴보고 싶다면 [Mistral의 공식 문서](https://docs.mistral.ai/capabilities/function_calling/)를 참고하세요. |
| 72 | + |
| 73 | +--- |
| 74 | +이제 함수 호출이 무엇이고 어떻게 작동하는지 배웠으니, 아직 해당 기능이 없는 모델인 [google/gemma-2-2b-it]([google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it)에 새로운 특수 토큰을 덧붙이는 방식으로 함수 호출 기능을 직접 추가해보겠습니다. |
| 75 | + |
| 76 | +이를 위해서는 **먼저 미세 조정과 LoRA**를 이해해야 합니다. |
0 commit comments