# Guia de Uso de Function Call no MiniMax-M1 [FunctionCall中文使用指南](./function_call_guide_cn.md) ## 📖 Introdução O modelo MiniMax-M1 possui suporte para chamadas de funções (Function Call), permitindo que o modelo identifique quando funções externas precisam ser chamadas e gere os parâmetros dessas chamadas em um formato estruturado. Este documento fornece instruções detalhadas sobre como utilizar o recurso de chamadas de funções do MiniMax-M1. ## 🚀 Início Rápido ### Usando o Template de Chat O MiniMax-M1 utiliza um template específico de chat para lidar com chamadas de funções. Este template é definido no arquivo `tokenizer_config.json` e pode ser utilizado no seu código através do 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" } } ] # Modelo de carga e tokenizador 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}]}, ] # Habilitar ferramentas de chamada de função tools = get_default_tools() # Aplicar modelo de bate-papo e adicionar definições de ferramentas text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, tools=tools ) ``` ## 🛠️ Definição de Function Call ### Estrutura da Função As funções precisam ser definidas no campo `tools` do corpo da requisição. Cada função é composta pelos seguintes elementos: ```json { "tools": [ { "name": "search_web", "description": "Search function.", "parameters": { "properties": { "query_list": { "description": "Keywords for search, with list element count of 1.", "items": { "type": "string" }, "type": "array" }, "query_tag": { "description": "Classification of the query", "items": { "type": "string" }, "type": "array" } }, "required": [ "query_list", "query_tag" ], "type": "object" } } ] } ``` **Descrição dos Campos:** * `name`: Nome da função * `description`: Descrição da função * `parameters`: Definição dos parâmetros da função * `properties`: Definições dos parâmetros, onde a chave é o nome do parâmetro e o valor contém a descrição * `required`: Lista de parâmetros obrigatórios * `type`: Tipo de dado (geralmente "object") ### Formato Interno de Processamento do Modelo Internamente, as definições de funções são convertidas para um formato especial e concatenadas ao texto de entrada: ``` ]~!b[]~b]system ai_setting=MiniMax AI MiniMax AI is an AI assistant independently developed by MiniMax. [e~[ ]~b]system tool_setting=tools You are provided with these tools: {"name": "search_web", "description": "Search function.", "parameters": {"properties": {"query_list": {"description": "Keywords for search, with list element count of 1.", "items": {"type": "string"}, "type": "array"}, "query_tag": {"description": "Classification of the 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=User When were the most recent launch events for OpenAI and Gemini?[e~[ ]~b]ai name=MiniMax AI ``` ### Formato de Saída do Modelo O modelo gera chamadas de função no seguinte formato: ```xml Ok, vou procurar a versão mais recente do OpenAI e do Gemini. {"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\""]}} ``` ## 📥 Processamento dos Resultados da Function Call ### Fazendo o Parse das Chamadas de Função Você pode utilizar o código abaixo para extrair as chamadas de função a partir da saída do modelo: ```python import re import json def parse_function_calls(content: str): """ Parse function calls from model output """ function_calls = [] # Corresponder conteúdo dentro das tags 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() # Analisar cada chamada de função (um objeto JSON por linha) for line in tool_calls_content.split('\n'): line = line.strip() if not line: continue try: # Chamada de função de formato JSON de análise 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 call: {function_name}, Arguments: {arguments}") except json.JSONDecodeError as e: print(f"Parameter parsing failed: {line}, Error: {e}") return function_calls # Exemplo: Manipular função de consulta de clima def execute_function_call(function_name: str, arguments: dict): """ Execute function call and return result """ if function_name == "get_current_weather": location = arguments.get("location", "Unknown location") # Resultado da execução da função de construção return { "role": "tool", "name": function_name, "content": json.dumps({ "location": location, "temperature": "25", "unit": "celsius", "weather": "Sunny" }, ensure_ascii=False) } elif function_name == "search_web": query_list = arguments.get("query_list", []) query_tag = arguments.get("query_tag", []) # Simular resultados de pesquisa return { "role": "tool", "name": function_name, "content": f"Search keywords: {query_list}, Categories: {query_tag}\nSearch results: Relevant information found" } return None ``` ### Retornando os Resultados das Funções para o Modelo Após interpretar e executar as funções, você deve adicionar os resultados na sequência de mensagens, para que o modelo os utilize nas respostas seguintes. #### Resultado Único Se o modelo solicitar a função `search_web`, retorne no seguinte formato, com o campo `name` igual ao nome da ferramenta: ```json { "data": [ { "role": "tool", "name": "search_web", "content": "search_result" } ] } ``` Formato correspondente no input do modelo: ``` ]~b]tool name=search_web search_result[e~[ ``` #### Vários Resultados Se o modelo solicitar simultaneamente `search_web` e `get_current_weather`, envie da seguinte forma, usando `name` como "tools" e colocando todos os resultados no campo `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" } ] } ``` Formato correspondente no input do modelo: ``` ]~b]tool name=tools Tool name: search_web Tool result: resultado1 Tool name: get_current_weather Tool result: resultado2[e~[ ``` Embora esse seja o formato recomendado, desde que a entrada seja clara para o modelo, os valores de `name` e `content` podem ser adaptados conforme a necessidade.