Hugging Face 统一工具使用 API

Hugging Face 发布了统一的工具使用 API,旨在使工具调用能够在多个流行模型系列之间便携,包括 Mistral、Cohere、NousResearch 和 Llama。此更新减少了在聊天中实现工具时对特定模型的修改需求,提供了一种标准化的方式来传递工具并管理聊天历史。

通过聊天模板标准化工具定义

统一的 API 利用现有聊天模板系统的扩展。通过使用 Jinja 模板,系统能够以特定模型所需的正确控制标记和格式渲染聊天,同时允许开发者以模型无关的格式编写聊天。

将工具传递给模板

为了确保 API 在不同编程语言中直观易用,Hugging Face 实现了双重工具定义方法:

  • JSON Schema: 底层聊天模板期望工具以 JSON Schema 的形式定义。
  • Python Integration: 对于 Python 用户,API 会自动将 Python 函数转换为 JSON Schema。为此,开发者应提供清晰的函数名、准确的类型提示以及完整的文档字符串(包括参数的文档字符串),因为这些信息用于生成模型读取的 Schema。

实现工具调用工作流

实现工具使用需要在聊天历史中添加特定顺序的消息,以便模型能够保持上下文。

两步消息流程

工具调用不是单一事件,而是需要在聊天历史中包含两条不同的消息:

  1. The Tool Call: 包含 tool_calls 字段的助手消息,指定函数名称和要使用的参数。
  2. The Tool Response: 角色为 tool 的消息,指定函数名称和内容(即被调用函数的输出)。

如果缺少这两条消息,模型无法将工具响应与原始请求及传入的参数关联起来。

实际执行

由于大型语言模型生成的是文本而非执行代码,开发者必须手动处理执行。该过程遵循以下流程:

  1. Prompt Generation: 将聊天和工具传递给 tokenizer.apply_chat_template 以生成提示。
  2. Model Generation: 模型生成工具调用请求(例如使用 <tool_call> 等标签)。
  3. Manual Execution: 开发者解析模型的请求,执行相应的 Python 函数,并将工具调用和工具响应都追加到聊天历史中。
  4. Final Response: 将更新后的聊天传回模型,以生成面向用户的最终自然语言响应。

当前限制与未来方向

虽然输入格式现已统一,但输出格式仍然因模型而异。当模型发出工具调用时,它会使用自身的原生格式,这要求开发者在将其加入统一聊天格式之前使用 json.loads() 或正则表达式来解析请求。

Hugging Face 正在研发解决方案,以进一步统一这些响应格式,从而进一步简化流程。

Sources