
한국어 LLM Function Call 평가
📌 Function Call (펑션 콜) 이란?
LLM의 Function Call (펑션 콜) 기능은 모델이 API 호출, 데이터 처리, 계산 등의 작업을 수행할 수 있도록 하는 기능입니다.
이를 통해 사용자는 자연어 입력을 기반으로 특정 함수를 실행하는 방식으로 모델을 활용할 수 있습니다.
🔍 평가 대상 모델
다음 모델들의 Function Call 성능을 평가합니다:
- Qwen/Qwen2.5-72B-Instruct-AWQ
- Linkbricks-Horizon-AI-Llama-3.3-Korean-70B-sft-dpo-AWQ
- deepseek-ai/DeepSeek-R1-Distill-Qwen-14B
- deepseek-ai/DeepSeek-R1-Distill-Llama-8B
- deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
- deepseek-ai/deepseek-llm-7b-chat
🛠️ 평가 데이셋 및 지표 설명
Single-turn 지표 설명
지표 | 평가 기준 | Pass 조건 | 예시 |
---|---|---|---|
exact | 정확한 문자열 일치 | 모델의 답변이 정답과 100% 동일해야 Pass | 정답: "오늘 날씨는 맑습니다." 모델 답변: "오늘 날씨는 맑습니다." → Pass 모델 답변: "오늘 날씨가 맑아요." → Fail |
4_random | 랜덤 4개 중 하나와 일치 | 정답 후보 4개 중 하나와 완전히 동일하면 Pass | 정답 후보: ["사과", "바나나", "포도", "오렌지"] 모델 답변: "바나나" → Pass 모델 답변: "수박" → Fail |
8_random | 랜덤 8개 중 하나와 일치 | 정답 후보 8개 중 하나와 완전히 동일하면 Pass | 정답 후보: ["사과", "바나나", "포도", "오렌지", "수박", "망고", "딸기", "복숭아"] 모델 답변: "망고" → Pass |
4_close | 의미적으로 유사한 4개 중 하나와 일치 | 정답 후보 4개 중 하나와 의미가 충분히 비슷하면 Pass | 정답 후보: ["매우 좋다", "정말 좋아", "기분이 최고야", "너무 만족스러워"] 모델 답변: "기분이 너무 좋네요!" → Pass (의미 유사) |
8_close | 의미적으로 유사한 8개 중 하나와 일치 | 정답 후보 8개 중 하나와 의미가 충분히 비슷하면 Pass | 정답 후보: ["맛있어요", "정말 맛나다", "최고의 음식", "너무 맛있어", "대단한 요리", "진짜 맛있다", "환상적인 맛", "끝내줘요"] 모델 답변: "이 음식 정말 끝내주네요!" → Pass (의미 유사) |
Multi-turn 지표 설명
지표 | 평가 기준 | Pass 조건 | 예시 |
---|---|---|---|
Call | API 호출이 정상적으로 이루어졌는지 평가 | API 호출이 정상적으로 성공하면 Pass | 사용자의 요청에 따라 create_user 함수가 호출되어, 사용자 정보가 정확히 전달되면 Pass (JSON 형태로 {"name": "John", "email": "john@example.com", "password": "password123"} ) |
Completion | 모델이 응답을 끝까지 잘 생성했는지 평가 | 응답이 중단 없이 완전하게 생성되면 Pass | 질문에 대한 답변이 중간에 끊기지 않고 전체 내용을 담고 있으면 Pass (하나의 긴 문장이 끝까지 출력됨) |
Slot | 필수 정보가 모델 응답에 포함되었는지 평가 | 모든 필수 정보가 포함되어 있으면 Pass | 예를 들어, 사용자 계정 생성 시 "이름", "이메일", "비밀번호"와 같은 필수 항목이 모두 응답에 포함되면 Pass |
Relevance | 모델 응답이 질문과 얼마나 관련이 있는지 평가 | 응답이 질문과 높은 연관성을 가지면 Pass | 예를 들어, 사용자가 "새 계정을 만들고 싶습니다."라고 요청했을 때, 계정 생성에 필요한 정보를 묻는 응답이 나오면 질문과 관련성이 높아 Pass |
Common 지표 설명
지표 | 평가 기준 | Pass 조건 | 예시 |
---|---|---|---|
Call | API 호출이 정상적으로 이루어졌는지 평가 | API 호출이 정상적으로 성공하면 Pass | 사용자의 요청에 따라 create_user 함수가 호출되어, 사용자 정보가 정확히 전달되면 Pass (예: JSON 형태로 {"name": "John", "email": "john@example.com", "password": "password123"} ) |
Reject | 적절한 함수가 없을 때, 적절한 응답을 하는가 | 적절한 함수가 없을 때, 적절한 응답을 하는가 | "하늘의 색을 바꿔줘" 같은 요청에 대해 "해당 요청을 수행할 수 없습니다."와 같은 자연스러운 답변을 하면 Pass |
Slot-all | 필요한 모든 정보가 없는 경우, 추가 정보를 요청하는가 | 필요한 모든 정보가 없는 경우, 추가 정보를 요청하는가 | "세탁물 수거 서비스 신청하고 싶은데 가능한가요?" → "세탁물을 수거할 위치와 날짜, 시간을 알려주세요.” (질문에 정보 아예 없음) |
Slot-some | 일부 정보가 부족한 경우, 부족한 정보만 요청하는가 | 일부 정보가 부족한 경우, 부족한 정보만 요청하는가 | "택시 불러줘. 출발지는 롯데시네마 위례야." → "도착 위치를 알려주세요.” (질문에 일부 정보 없음) |
📂 평가 데이터 설명
- 카카오 Function Call 한국어 데이터셋 : FunctionChat-Bench
- Function call Pass/Fail 판별 모델 : gpt-4-0125-preview
- Single-turn : 25가지의 기능
- multi-turn : 45가지의 기능
🗄️ 입력데이터 예시
{
"serial_num": 1,
"messages": [
{"role": "system", "content": null},
{"role": "user", "content": "새 계정을 만들고 싶습니다."},
{"role": "assistant", "content": "네, 도와드릴 수 있습니다. 성함과 이메일 주소, 비밀번호를 알려주시겠어요?"},
{"role": "user", "content": "내 이름은 John이고, 이메일은 john@example.com이고, 비밀번호는 password123이에요."}
],
"tools": [
{
"type": "function",
"function": {
"name": "create_user",
"description": "새로운 사용자 계정을 생성한다.",
"parameters": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "사용자의 이름"},
"email": {"type": "string", "description": "사용자의 이메일 주소"},
"password": {"type": "string", "description": "사용자의 비밀번호"}
},
"required": ["name", "email", "password"]
}
}
}
],
"temperature": 0.1,
"tool_choice": "auto",
"ground_truth": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "random_id",
"type": "function",
"function": {
"name": "create_user",
"arguments": "{\"name\": \"John\", \"email\": \"john@example.com\", \"password\": \"password123\"}"
}
}
]
},
"type_of_output": "call"
}
📊 평가 리포트 예시
- 결과: Pass
- 평가 항목: Call
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "random_id",
"type": "function",
"function": {
"name": "create_user",
"arguments": "{\"name\": \"John\", \"email\": \"john@example.com\", \"password\": \"password123\"}"
}
}
]
}
{
"reasoning": "exact-eval\n\n\npass\npass\n"
}