跳到主要内容

Custom Tool Calls

大语言模型的Tool Use (function calling)是一项强大的功能,它允许模型在对话过程中调用外部工具或API来获取信息或执行特定任务。这种机制极大地扩展了大语言模型的能力,使其不仅能够基于已有知识回答问题,还能实时获取和处理外部数据,从而提供更准确、更及时的回应。

目前,有一些Playground能够支持工具调用的调试,但很少有平台能提供基于工具调用的完整端到端功能实现。在ConsoleX.ai平台上,用户不仅可以方便地调试Tool Calls,还可以基于Tool Calls实现AI对话的功能扩展,比如图片生成、触发外部工作流等。

以下是在ConsoleX上添加和使用Tool Calls的基本步骤:

1. 定义工具的JSON Schema描述

首先,在ConsoleX.ai的主界面右侧的菜单中,打开“启用工具调用”的开关,并找到"管理我的工具"的链接入口。点击后即可进入管理工具的界面。点击右上角的“创建新工具”按钮,在其中可以添加工具的JSON Schema结构描述。关于工具的JSON Schema的描述遵循OpenAI的函数调用格式,包括函数名称、描述、参数等信息。参见:https://platform.openai.com/docs/guides/function-calling。

比如我们想定义一个实现查询天气功能的工具,可以像这样撰写JSON Schema的描述:

{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
提示

定义的JSON Schema可以在ConsoleX上用于所有支持工具或函数调用的模型,例如OpenAI的gpt-4o、gpt-4o-mini,Anthropic的claude-3.5系列,以及Google Gemini的Gemini 1.5 Pro模型。如果您在自己的应用程序中调用不同模型的工具函数,请确保在通过JSON Schema定义工具函数时传入的参数符合模型支持的参数格式。

当你发起与支持工具调用的模型进行对话时,打开启用工具调用开关,并在当前对话中附加工具之后,大模型会根据你的提问并参考你提供的工具函数定义,自主决定是否需要调用函数。如需调用,大模型的回复中会包含需要调用函数的名称和所需参数。

例如你提出的问题是:

伦敦的天气如何?

如果函数调用被触发,这时大模型会返回函数调用所需的具体参数,例如这样:

getCurrentWeather{
"lat": "51.5074",
"lon": "-0.1278",
"units": "metric"
}

ConsoleX还提供强制工具调用的开关,如果打开,ConsoleX会在调用大模型的对话接口并传入工具列表时,遵循大模型的接口规范额外提供强制工具调用的选项。

每个大模型厂商对强制工具调用的支持有所不同,具体请参照各厂商的官方文档。

2. end-to-end调用函数

这时,你已经成功触发了一次函数调用,你应该可以在ConsoleX的界面中看到一个黄色的信息提示框,点击它你可以在弹出界面中看到大模型希望调用的函数名称以及与本次调用相关的参数信息。

但如果你想进一步调试函数调用的完整过程,那么你需要准备好可供调用的函数并将其发布到互联网上,然后让ConsoleX知道函数调用的具体地址和调用的方法是什么。

为了方便用户在ConsoleX上实现完整的函数调用和二次结果生成的过程,我们允许用户在工具函数的定义中包含了一个名为extraInfo的对象。在这个对象中可以包含一系列属性,用来指定该函数的调用地址和方法。

通过这种方式,用户可以方便地在ConsoleX上实现函数调用和二次结果生成的完整过程,我们目前支持调用任何的web函数,以及执行dify的workflow和make.com的scenerio。而且,ConsoleX还支持并行函数调用,可以同时调用多个函数,并根据这些函数的结果生成最终的回答。

例如,以下是一段用于查询天气的包含函数调用地址的配置:

{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"lat": {
"type": "string",
"description": "Latitude of the location"
},
"lon": {
"type": "string",
"description": "Longitude of the location"
},
"units": {"type": "string", "enum": ["standard", "imperial", "metric"]}
},
"required": ["location"]
},
"extraInfo": {
"method": "post",
"functionUrl": <the_url_of_the_get_current_weather_function>
"apiKey": <the_requireed_apikey_of_the_function>
}
}

加入你关于函数调用地址和方法的定义正确,并且函数功能正常,当你再次通过刚才的问题向大模型提问时:

伦敦的天气如何?

而这次大模型不仅会给出调用的函数名称和方法,而且会自动调用外部函数,并根据函数的回应生成最后的结果,例如像这样:

伦敦现在的天气是多云,温度约为17.24摄氏度。

这就是一次完整的端到端(end-to-end)数调用过程。你还可以在助手消息对话的下方看到绿色的信息标签,点击它会显示函数调用的所有中间过程信息,包括初次请求模型时返回的函数调用参数,以及调用函数的实际返回信息等。

以下是extraInfo扩展对象中可以包含的属性列表:

属性名说明
invoke是否发起函数调用,默认为true。如果为false,则以下其他属性定义均不会起作用。
functionType函数类型,允许的取值范围为:
- web,函数类型为通过web可访问的url地址
- dify_workflow,函数类型为dify的Workflow工作流
- make_workflow,函数类型为make上的Scenerio工作流
(对于Dify和Make.com工作流的支持通过UniWorkflow开源项目实现)
method有效取值范围为post或者get,用于指定发起函数调用的方式,默认是post
functionUrl函数的url访问地址,如果functionType的值为web,则需要传入function的调用url地址。
如果functionType为dify_workflow,则需要传入dify工作流的base_url。
如果functionType为make_workflow,则需要传入make.com工作流的调用url地址。
apiKey如果设置了此属性,在请求函数时会在请求头(header)中发送Authorization: Bearer your-function-call-api-key形式的鉴权信息。如果未设置,则不会在调用函数的请求头中包含Authorization鉴权信息。
process对于外部函数返回结果的处理方式,目前支持以下三种取值:
- template,这种情况下将需要定义template属性,其中包含显示信息的文本内容模版。
- output, 这种情况下,将会直接将以markdown格式在结果中显示函数的返回结果。
- formulate,这种情况下将会把外部函数返回的JSON信息用于通过大模型二次生成结果。
template当process的值为template时必须提供。template要求是一段文本字符串,其中可以包含占位的变量名,如果变量名与函数返回JSON信息中的属性名相一致,则会将占位的变量名替换为函数返回JSON信息中的相应属性值。

例如,以下是一个调用stable diffusion生成图片外部工具,并且将结果渲染成markdown格式并返回的extraInfo定义:

{
"invoke": true,
"functionType":"web",
"method":"POST",
"functionUrl":<the_url_of_the_image_generation_function>
"apiKey":<the_api_key_required_for_calling_the_function>
"process": "template",
"template": "The following is the image generated by stable diffusion:\n![image]({imageUrl})\n"
}
提示

注意:extraInfo对象及其包含的属性仅供在ConsoleX.ai上调试函数调用时使用,并不被大模型所支持,因此在你的LLM应用程序中使用工具的JSON Schema定义时,应该去掉其中的extraInfo扩展对象。

并行函数调用

并行函数调用(Parallel Function Calling)是一种先进的工具调用机制,它允许大语言模型同时调用多个外部工具或API,以获取更全面的信息或执行多项任务。这种机制大大提高了模型的处理效率和能力,使其能够更快速、更全面地回答复杂问题或完成复杂任务。

在ConsoleX.ai平台上,用户可以轻松实现并行数调用。以下是在ConsoleX上使用并行函数调用的步骤:

  1. 定义多个工具:在ConsoleX的工具管理界面中,定义多个你需要并行调用的工具,每个工具都应有其独特的JSON Schema描述。
  2. 启用工具调用:在对话设置中,确保"启用工具调用"的开关已打开,并在当前对话中附加你定义的多个工具。
  3. 发起对话:在对话中提出一个可能需要多个工具协同解答的问题。例如,"比较伦敦和纽约今天的天气,并生成一张对比图"。
  4. ConsoleX会将请求发送给支持并行函数调用的大模型,大模型自动识别需要调用多个工具,会同时返回所有工具函数的名称,以及每个工具函数调用所需的参数定义。
  5. 在对话界面中,你可以看到多个工具的调用结果,以及基于这些结果生成的综合回答。

并行函数调用的优势在于它能够同时获取多个信息源的数据,或执行多个相关任务,从而提供更全面、更高效的回答。例如,它可以同时查询多个城市的天气、比较不同股票的表现、或者同时使用多个AI模型生成图片并进行比较。

提示

不仅可以调用多个不同的函数,还可以多次调用同一个函数,并传入不同的参数,从而实现并行函数调用。

通过在ConsoleX上使用并行函数调用,开发者可以更好地模拟复杂的决策过程,提高AI应用的效率和智能程度,为用户提供更丰富、更有价值的交互体验。

参考