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。
实现工具调用工作流
实现工具使用需要在聊天历史中添加特定顺序的消息,以便模型能够保持上下文。
两步消息流程
工具调用不是单一事件,而是需要在聊天历史中包含两条不同的消息:
- The Tool Call: 包含
tool_calls字段的助手消息,指定函数名称和要使用的参数。 - The Tool Response: 角色为
tool的消息,指定函数名称和内容(即被调用函数的输出)。
如果缺少这两条消息,模型无法将工具响应与原始请求及传入的参数关联起来。
实际执行
由于大型语言模型生成的是文本而非执行代码,开发者必须手动处理执行。该过程遵循以下流程:
- Prompt Generation: 将聊天和工具传递给
tokenizer.apply_chat_template以生成提示。 - Model Generation: 模型生成工具调用请求(例如使用
<tool_call>等标签)。 - Manual Execution: 开发者解析模型的请求,执行相应的 Python 函数,并将工具调用和工具响应都追加到聊天历史中。
- Final Response: 将更新后的聊天传回模型,以生成面向用户的最终自然语言响应。
当前限制与未来方向
虽然输入格式现已统一,但输出格式仍然因模型而异。当模型发出工具调用时,它会使用自身的原生格式,这要求开发者在将其加入统一聊天格式之前使用 json.loads() 或正则表达式来解析请求。
Hugging Face 正在研发解决方案,以进一步统一这些响应格式,从而进一步简化流程。
Sources
- OriginalTool Use, Unified