# 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: {"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"}} If you need to call tools, please respond with XML tags, and provide tool-name and json-object of arguments, following the format below: {"name": , "arguments": } ... [e~[ ]~b]user name=用户 OpenAI 和 Gemini 的最近一次发布会都是什么时候?[e~[ ]~b]ai name=MiniMax AI ``` ### 模型输出格式 模型会以以下格式输出函数调用: ```xml Okay, I will search for the OpenAI and Gemini latest release. {"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\""]}} ``` ## 📥 函数调用结果处理 ### 解析函数调用 您可以使用以下代码解析模型输出的函数调用: ```python import re import json def parse_function_calls(content: str): """ 解析模型输出中的函数调用 """ function_calls = [] # 匹配 标签内的内容 tool_calls_pattern = r"(.*?)" 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` 的具体内容完全由您自主决定。