|
# MiniMax-M1 函数调用(Function Call)功能指南 |
|
|
|
## 📖 简介 |
|
|
|
MiniMax-M1 模型支持函数调用功能,使模型能够识别何时需要调用外部函数,并以结构化格式输出函数调用参数。本文档详细介绍了如何使用 MiniMax-M1 的函数调用功能。 |
|
|
|
## 🚀 快速开始 |
|
|
|
### 聊天模板使用 |
|
|
|
MiniMax-M1 使用特定的聊天模板格式处理函数调用。聊天模板定义在 `tokenizer_config.json` 中,你可以在代码中通过 template 来进行使用。 |
|
|
|
```python |
|
from transformers import AutoTokenizer |
|
|
|
def get_default_tools(): |
|
return [ |
|
{ |
|
{ |
|
"name": "get_current_weather", |
|
"description": "Get the latest weather for a location", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"location": { |
|
"type": "string", |
|
"description": "A certain city, such as Beijing, Shanghai" |
|
} |
|
}, |
|
} |
|
"required": ["location"], |
|
"type": "object" |
|
} |
|
} |
|
] |
|
|
|
# 加载模型和分词器 |
|
tokenizer = AutoTokenizer.from_pretrained(model_id) |
|
prompt = "What's the weather like in Shanghai today?" |
|
messages = [ |
|
{"role": "system", "content": [{"type": "text", "text": "You are a helpful assistant created by Minimax based on MiniMax-M1 model."}]}, |
|
{"role": "user", "content": [{"type": "text", "text": prompt}]}, |
|
] |
|
|
|
# 启用函数调用工具 |
|
tools = get_default_tools() |
|
|
|
# 应用聊天模板,并加入工具定义 |
|
text = tokenizer.apply_chat_template( |
|
messages, |
|
tokenize=False, |
|
add_generation_prompt=True, |
|
tools=tools |
|
) |
|
``` |
|
|
|
## 🛠️ 函数调用的定义 |
|
|
|
### 函数结构体 |
|
|
|
函数调用需要在请求体中定义 `tools` 字段,每个函数由以下部分组成: |
|
|
|
```json |
|
{ |
|
"tools": [ |
|
{ |
|
"name": "search_web", |
|
"description": "搜索函数。", |
|
"parameters": { |
|
"properties": { |
|
"query_list": { |
|
"description": "进行搜索的关键词,列表元素个数为1。", |
|
"items": { "type": "string" }, |
|
"type": "array" |
|
}, |
|
"query_tag": { |
|
"description": "query的分类", |
|
"items": { "type": "string" }, |
|
"type": "array" |
|
} |
|
}, |
|
"required": [ "query_list", "query_tag" ], |
|
"type": "object" |
|
} |
|
} |
|
] |
|
} |
|
``` |
|
|
|
**字段说明:** |
|
- `name`: 函数名称 |
|
- `description`: 函数功能描述 |
|
- `parameters`: 函数参数定义 |
|
- `properties`: 参数属性定义,key 是参数名,value 包含参数的详细描述 |
|
- `required`: 必填参数列表 |
|
- `type`: 参数类型(通常为 "object") |
|
|
|
### 模型内部处理格式 |
|
|
|
在模型内部处理时,函数定义会被转换为特殊格式并拼接到输入文本中: |
|
|
|
``` |
|
]~!b[]~b]system ai_setting=MiniMax AI |
|
MiniMax AI是由上海稀宇科技有限公司(MiniMax)自主研发的AI助理。[e~[ |
|
]~b]system tool_setting=tools |
|
You are provided with these tools: |
|
<tools> |
|
{"name": "search_web", "description": "搜索函数。", "parameters": {"properties": {"query_list": {"description": "进行搜索的关键词,列表元素个数为1。", "items": {"type": "string"}, "type": "array"}, "query_tag": {"description": "query的分类", "items": {"type": "string"}, "type": "array"}}, "required": ["query_list", "query_tag"], "type": "object"}} |
|
</tools> |
|
|
|
If you need to call tools, please respond with <tool_calls></tool_calls> XML tags, and provide tool-name and json-object of arguments, following the format below: |
|
<tool_calls> |
|
{"name": <tool-name>, "arguments": <args-json-object>} |
|
... |
|
</tool_calls>[e~[ |
|
]~b]user name=用户 |
|
OpenAI 和 Gemini 的最近一次发布会都是什么时候?[e~[ |
|
]~b]ai name=MiniMax AI |
|
``` |
|
|
|
### 模型输出格式 |
|
|
|
模型会以以下格式输出函数调用: |
|
|
|
```xml |
|
<think> |
|
Okay, I will search for the OpenAI and Gemini latest release. |
|
</think> |
|
<tool_calls> |
|
{"name": "search_web", "arguments": {"query_tag": ["technology", "events"], "query_list": ["\"OpenAI\" \"latest\" \"release\""]}} |
|
{"name": "search_web", "arguments": {"query_tag": ["technology", "events"], "query_list": ["\"Gemini\" \"latest\" \"release\""]}} |
|
</tool_calls> |
|
``` |
|
|
|
## 📥 函数调用结果处理 |
|
|
|
### 解析函数调用 |
|
|
|
您可以使用以下代码解析模型输出的函数调用: |
|
|
|
```python |
|
import re |
|
import json |
|
|
|
def parse_function_calls(content: str): |
|
""" |
|
解析模型输出中的函数调用 |
|
""" |
|
function_calls = [] |
|
|
|
# 匹配 <tool_calls> 标签内的内容 |
|
tool_calls_pattern = r"<tool_calls>(.*?)</tool_calls>" |
|
tool_calls_match = re.search(tool_calls_pattern, content, re.DOTALL) |
|
|
|
if not tool_calls_match: |
|
return function_calls |
|
|
|
tool_calls_content = tool_calls_match.group(1).strip() |
|
|
|
# 解析每个函数调用(每行一个JSON对象) |
|
for line in tool_calls_content.split('\n'): |
|
line = line.strip() |
|
if not line: |
|
continue |
|
|
|
try: |
|
# 解析JSON格式的函数调用 |
|
call_data = json.loads(line) |
|
function_name = call_data.get("name") |
|
arguments = call_data.get("arguments", {}) |
|
|
|
function_calls.append({ |
|
"name": function_name, |
|
"arguments": arguments |
|
}) |
|
|
|
print(f"调用函数: {function_name}, 参数: {arguments}") |
|
|
|
except json.JSONDecodeError as e: |
|
print(f"参数解析失败: {line}, 错误: {e}") |
|
|
|
return function_calls |
|
|
|
# 示例:处理天气查询函数 |
|
def execute_function_call(function_name: str, arguments: dict): |
|
""" |
|
执行函数调用并返回结果 |
|
""" |
|
if function_name == "get_current_weather": |
|
location = arguments.get("location", "未知位置") |
|
# 构建函数执行结果 |
|
return { |
|
"role": "tool", |
|
"name": function_name, |
|
"content": json.dumps({ |
|
"location": location, |
|
"temperature": "25", |
|
"unit": "celsius", |
|
"weather": "晴朗" |
|
}, ensure_ascii=False) |
|
} |
|
elif function_name == "search_web": |
|
query_list = arguments.get("query_list", []) |
|
query_tag = arguments.get("query_tag", []) |
|
# 模拟搜索结果 |
|
return { |
|
"role": "tool", |
|
"name": function_name, |
|
"content": f"搜索关键词: {query_list}, 分类: {query_tag}\n搜索结果: 相关信息已找到" |
|
} |
|
|
|
return None |
|
``` |
|
|
|
### 将函数执行结果返回给模型 |
|
|
|
成功解析函数调用后,您应将函数执行结果添加到对话历史中,以便模型在后续交互中能够访问和利用这些信息。 |
|
|
|
#### 单个结果 |
|
|
|
假如模型调用了 `search_web` 函数,您可以参考如下格式添加执行结果,`name` 字段为具体的函数名称。 |
|
|
|
```json |
|
{ |
|
"data": [ |
|
{ |
|
"role": "tool", |
|
"name": "search_web", |
|
"content": "search_result" |
|
} |
|
] |
|
} |
|
``` |
|
|
|
对应如下的模型输入格式: |
|
``` |
|
]~b]tool name=search_web |
|
search_result[e~[ |
|
``` |
|
|
|
|
|
#### 多个结果 |
|
假如模型同时调用了 `search_web` 和 `get_current_weather` 函数,您可以参考如下格式添加执行结果,`name` 字段为"tools",`content`包含多个结果。 |
|
|
|
```json |
|
{ |
|
"data": [ |
|
{ |
|
"role": "tool", |
|
"name": "tools", |
|
"content": "Tool name: search_web\nTool result: test_result1\n\nTool name: get_current_weather\nTool result: test_result2" |
|
} |
|
] |
|
} |
|
``` |
|
|
|
对应如下的模型输入格式: |
|
``` |
|
]~b]tool name=tools |
|
Tool name: search_web |
|
Tool result: test_result1 |
|
|
|
Tool name: get_current_weather |
|
Tool result: test_result2[e~[ |
|
``` |
|
|
|
虽然我们建议您参考以上格式,但只要返回给模型的输入易于理解,`name` 和 `content` 的具体内容完全由您自主决定。 |
|
|