# Tool_Calling - 飞桨大语言模型推理部署工具包

跳转至

# Tool_Calling

本文档介绍如何在 FastDeploy 中配置服务器以使用工具解析器（tool parser），以及如何在客户端调用工具。

## Ernie系列模型配套工具解释器

模型名称 | 解析器名称
--- | ---
baidu/ERNIE-4.5-21B-A3B-Thinking | ernie-x1
baidu/ERNIE-4.5-VL-28B-A3B-Thinking | ernie-45-vl-thinking

## 快速开始

### 启动包含解析器的FastDeploy

使用包含思考解析器和工具解析器的命令启动服务器。下面的示例使用 ERNIE-4.5-21B-A3B。我们可以使用 fastdeploy 目录中的 ernie-x1 思考解析器（reasoning parser）和 ernie-x1 工具调用解析器（tool-call parser）；从而实现解析模型的思考内容、回复内容以及工具调用信息：

    python -m fastdeploy.entrypoints.openai.api_server
        --model /models/ERNIE-4.5-21B-A3B \
        --port 8000 \
        --reasoning-parser ernie-x1 \
        --tool-call-parser ernie-x1

### 触发工具调用示例

构造一个包含工具的请求以触发模型调用工具：

    curl -X POST http://0.0.0.0:8000/v1/chat/completions \
      -H "Content-Type: application/json" \
      -d '{
        "messages": [
          {
            "role": "user",
            "content": "北京今天天气怎么样？"
          }
        ],
        "tools": [
          {
            "type": "function",
            "function": {
              "name": "get_weather",
              "description": "获取指定地点的当前天气",
              "parameters": {
                "type": "object",
                "properties": {
                  "location": {
                    "type": "string",
                    "description": "城市名，如：北京。"
                  },
                  "unit": {
                    "type": "string",
                    "enum": ["c", "f"],
                    "description": "温度单位：c = 摄氏度，f = 华氏度"
                  }
                },
                "required": ["location", "unit"],
                "additionalProperties": false
              },
              "strict": true
            }
          }
        ]
      }'

示例输出如下，可以看到成功解析出了模型输出的思考内容`reasoning_content`以及工具调用信息`tool_calls`，且当前的回复内容`content`为空,`finish_reason`为工具调用`tool_calls`：

    {
        "choices": [
            {
                "index": 0,
                "message": {
                    "role": "assistant",
                    "content": "",
                    "multimodal_content": null,
                    "reasoning_content": "User wants to ... ",
                    "tool_calls": [
                        {
                            "id": "chatcmpl-tool-bc90641c67e44dbfb981a79bc986fbe5",
                            "type": "function",
                            "function": {
                                "name": "get_weather",
                                "arguments": "{\"location\": \"北京\", \"unit\": \"c\"}"
                            }
                        }
                    ],
                    "finish_reason": "tool_calls"
                }
            }
        ]
    }

## 并行工具调用

如果模型能够生成多个并行的工具调用，FastDeploy 会返回一个列表：

    tool_calls=[
      {"id": "...", "function": {...}},
      {"id": "...", "function": {...}}
    ]

## 工具调用结果出现在历史会话中

如果前几轮对话中包含工具调用，可以按以下方式构造请求：

    curl -X POST "http://0.0.0.0:8000/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -d '{
      "messages": [
        {
          "role": "user",
          "content": "你好，北京天气怎么样？"
        },
        {
          "role": "assistant",
          "tool_calls": [
            {
              "id": "call_1",
              "type": "function",
              "function": {
                "name": "get_weather",
                "arguments": {
                  "location": "北京",
                  "unit": "c"
                }
              }
            }
          ],
          "thoughts": "用户需要查询北京今天的天气。"
        },
        {
          "role": "tool",
          "tool_call_id": "call_1",
          "content": {
            "type": "text",
            "text": "{\"location\": \"北京\",\"temperature\": \"23\",\"weather\": \"晴\",\"unit\": \"c\"}"
            }
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "get_weather",
            "description": "获取指定位置的当前天气。",
            "parameters": {
              "type": "object",
              "properties": {
                "location": {
                  "type": "string",
                  "description": "城市名称，例如：北京"
                },
                "unit": {
                  "type": "string",
                  "enum": [
                    "c",
                    "f"
                  ],
                  "description": "温度单位：c = 摄氏度，f = 华氏度"
                }
              },
              "additionalProperties": false,
              "required": [
                "location",
                "unit"
              ]
            },
            "strict": true
          }
        }
      ]
    }'

解析出的模型输出结果如下，包含思考内容`reasoning_content`与回复内容`content`，且`finish_reason`为`stop`：

    {
        "choices": [
            {
                "index": 0,
                "message": {
                    "role": "assistant",
                    "content": "北京今天的天气是晴天，气温为23摄氏度。",
                    "reasoning_content": "用户想...",
                    "tool_calls": null
                },
                "finish_reason": "stop"
            }
        ]
    }

## 编写自定义工具解析器

FastDeploy支持自定义工具解析器插件，可以参考以下地址中的`tool parser`创建：`fastdeploy/entrypoints/openai/tool_parser`

自定义解析器需要实现：

    # import the required packages
    # register the tool parser to ToolParserManager
    @ToolParserManager.register_module("my-parser")
    class ToolParser:
        def __init__(self, tokenizer: AnyTokenizer):
          super().__init__(tokenizer)

        # implement the tool parse for non-stream call
        def extract_tool_calls(self, model_output: str, request: ChatCompletionRequest) -> ExtractToolCallInformation:
          return ExtractedToolCallInformation(tools_called=False,tool_calls=[],content=text)

        # implement the tool call parse for stream call
        def extract_tool_calls_streaming(
            self,
            previous_text: str,
            current_text: str,
            delta_text: str,
            previous_token_ids: Sequence[int],
            current_token_ids: Sequence[int],
            delta_token_ids: Sequence[int],
            request: ChatCompletionRequest,
        ) -> DeltaMessage | None:
            return delta

通过以下方式启用自定义解析器：

    python -m fastdeploy.entrypoints.openai.api_server
    --model <模型地址>
    --tool-parser-plugin <自定义工具解释器的地址>
    --tool-call-parser my-parser