本文档介绍了用于解析和验证Llama模型输出中工具调用的工具实用程序。这些实用程序处理模型生成的各种格式的函数调用的提取和验证。有关提示格式和工具集成模式的信息,请参阅提示格式。
工具实用程序提供用于从Llama模型输出中解析、验证和提取结构化工具调用的函数。模型可以生成多种格式的工具调用,这些实用程序负责将原始文本输出转换为应用程序可执行的结构化数据。
工具实用程序系统包括
来源: models/llama3/tests/api/test_tool_utils.py9-13 models/llama3/tests/api/test_tool_utils.py16-22
工具集成系统基于datatypes.py中定义的几种基本数据类型构建
Role枚举包括tool作为其值之一,用于标识包含工具结果的消息
BuiltinTool枚举定义了Llama模型中可用的内置工具
ToolCall类表示一个工具调用,包含唯一ID、工具名称和参数
来源: models/datatypes.py21-26 models/datatypes.py28-33 models/datatypes.py39-59 models/datatypes.py93-113
工具实用程序处理Llama模型生成的三种主要工具调用格式
函数标签格式使用类似XML的语法,通过ToolUtils.maybe_extract_custom_tool_call()方法进行处理
| 组件 | 语法 | 示例 |
|---|---|---|
| 起始标签 | <function=name> | <function=getWeather> |
| 参数 | JSON 对象 | {"location":"New York","date":"2023-08-05"} |
| 完整调用 | <function=name>{args} | <function=getWeather>{"location":"New York","date":"2023-08-05"} |
Python列表格式将函数调用表示为Python表达式,通过is_valid_python_list()进行验证,并通过parse_python_list_for_function_calls()进行解析
| 格式 | 描述 | 示例 |
|---|---|---|
| 单次调用 | [function_name(param=value)] | [get_boiling_point(liquid_name="water", celcius=True)] |
| 多次调用 | [func1(...), func2(...)] | [get_boiling_point(liquid_name="water"), get_melting_point(substance="ice")] |
| 混合类型 | 支持字符串、数字、布尔值 | [process_data(name="sample", value=42, active=True)] |
JSON格式遵循OpenAI函数调用规范
从函数标签格式字符串中提取工具名称和参数
验证字符串是否表示有效的Python函数调用列表
| 有效示例 | 无效示例 |
|---|---|
[get_weather(city="NYC")] | [](空列表) |
[func1(), func2()] | [func("positional")](位置参数) |
[calc(x=5.2, y=10)] | get_weather(city="NYC")(不在列表中) |
将有效的Python列表字符串解析为结构化的函数调用数据
来源: models/llama3/tests/api/test_tool_utils.py16-22 models/llama3/tests/api/test_tool_utils.py25-76 models/llama3/tests/api/test_tool_utils.py77-130
is_valid_python_list()函数强制执行有效函数调用列表的特定规则
| 模式 | 示例 | 描述 |
|---|---|---|
| 单个函数 | [get_weather(city="NYC")] | 一个带有关键字参数的函数 |
| 多个函数 | [func1(a=1), func2(b=2)] | 列表中有多个函数 |
| 混合数据类型 | [calc(x=5.2, flag=True, name="test")] | 字符串、数字、布尔值 |
| 空参数 | [initialize()] | 无参数函数 |
| 复杂参数 | [func(data={"key": "value"})] | 嵌套字典和列表 |
| 模式 | 示例 | 原因 |
|---|---|---|
| 空列表 | [] | 必须至少包含一个函数调用 |
| 位置参数 | [func("arg1", "arg2")] | 只允许关键字参数 |
| 非函数项 | [func(), "string", 42] | 列表必须只包含函数调用 |
| 嵌套列表 | [[func()]] | 无嵌套列表结构 |
| 裸函数 | func() | 必须用列表方括号括起来 |
| 语法错误 | <FileRef file-url="https://github.com/meta-llama/llama-models/blob/01dc8ce4/func(a=1 | 缺少闭合括号或引号 |
parse_python_list_for_function_calls()函数处理复杂的参数类型
| 输入格式 | 解析输出 |
|---|---|
[analyze_text(content="Hello, world!", language="en")] | [("analyze_text", {"content": "Hello, world!", "language": "en"})] |
[calculate_volume(radius=5.2, height=10)] | [("calculate_volume", {"radius": 5.2, "height": 10})] |
[process_data(name="sample", value=42, active=True, ratio=3.14)] | [("process_data", {"name": "sample", "value": 42, "active": True, "ratio": 3.14})] |
[get_info(data={"name": "water"}, values=[100, 101])] | [("get_info", {"data": {"name": "water"}, "values": [100, 101]})] |
来源: models/llama3/tests/api/test_tool_utils.py93-130
工具实用程序与核心数据结构集成,以处理模型输出
来源: models/llama3/tests/api/test_tool_utils.py9-13 models/llama3/tests/api/test_tool_utils.py16-22
工具实用程序处理各种边缘情况和错误条件
| 错误类型 | 输入示例 | 验证结果 |
|---|---|---|
| 空列表 | [] | is_valid_python_list()返回False |
| 位置参数 | [func("arg1", "arg2")] | is_valid_python_list()返回False |
| 混合内容 | [func(), "string", 42] | is_valid_python_list()返回False |
| 语法错误 | [func(a=1 | is_valid_python_list()返回False |
| 嵌套结构 | [[func()]] | is_valid_python_list()返回False |
解析实用程序正确处理了多种边缘情况
[initialize()]解析为[("initialize", {})][analyze_text(content="Hello, world!")]保留字符串值中的空格[func(data={"key": [1, 2, 3]})]处理嵌套的字典和列表[func1(a=1), func2(b=2)]返回每个函数的元组列表来源: models/llama3/tests/api/test_tool_utils.py36-76 models/llama3/tests/api/test_tool_utils.py108-130
要使用工具实用程序处理模型输出
is_valid_python_list()进行Python列表格式验证ToolCall对象以执行来源: models/llama3/tests/api/test_tool_utils.py9-13 models/llama3/tests/api/test_tool_utils.py16-22
is_valid_python_list()验证输入| 用例 | 推荐格式 | 实用函数 |
|---|---|---|
| 简单工具调用 | 函数标签 | maybe_extract_custom_tool_call() |
| 类代码表达式 | Python 列表 | parse_python_list_for_function_calls() |
| 多个同步调用 | Python 列表 | parse_python_list_for_function_calls() |
| 复杂的嵌套参数 | Python 列表 | parse_python_list_for_function_calls() |
来源: models/llama3/tests/api/test_tool_utils.py25-76 models/llama3/tests/api/test_tool_utils.py77-130
工具集成扩展了Llama模型的能力,使其超越了训练数据,允许它们通过定义的工具和函数访问外部信息并执行操作。工具集成系统的模块化设计提供了定义、调用和处理工具的灵活性,使开发人员能够构建将Llama模型的语言能力与外部系统的实际实用性相结合的复杂AI应用程序。