ERNIE-Functions-8K
百度自研的垂直场景大语言模型,适合对话问答中的外部工具使用和业务函数调用场景,结构化回答合成能力更强、输出格式更稳定,推理性能更优。基于eb-speed微调实现,可以支持在一个问题中使用多个函数插件,通过多次交互支持多轮的任务编排。本文介绍了相关API。
功能介绍
调用本接口,发起一次对话请求。
在线调试
平台提供了 API在线调试平台-示例代码 ,用于帮助开发者调试接口,平台集成快速检索、查看开发文档、查看在线调用的请求内容和返回结果、复制和下载示例代码等功能,简单易用,更多内容请查看API在线调试介绍。
SDK调用
使用说明
本文API支持通过Python SDK调用,调用流程请参考SDK安装及使用流程。
调用示例
以下以Python SDK调用多个函数为例,实现查询城市天气以及某公司股价等信息。
import os
import qianfan
import json
# 通过环境变量初始化认证信息
# 方式一:【推荐】使用安全认证AK/SK鉴权
# 替换下列示例中参数,安全认证Access Key替换your_iam_ak,Secret Key替换your_iam_sk,如何获取请查看https://cloud.baidu.com/doc/Reference/s/9jwvz2egb
os.environ["QIANFAN_ACCESS_KEY"] = "your_iam_ak"
os.environ["QIANFAN_SECRET_KEY"] = "your_iam_sk"
# 方式二:【不推荐】使用应用AK/SK鉴权
# 替换下列示例中参数,将应用API_Key、应用Secret key值替换为真实值
#os.environ["QIANFAN_AK"] = "应用API_Key"
#os.environ["QIANFAN_SK"] = "应用Secret_Key"
def get_current_weather(location, unit):
return "25度"
def get_current_price(company, exchange):
return 71
funcs = {
"get_current_weather": get_current_weather,
"get_current_price": get_current_price,
}
func_list = [
{
"name": "get_current_weather",
"description": "获得指定地点的天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "省,市名,例如:河北省,石家庄"
},
"unit": {
"type": "string",
"enum": ["摄氏度", "华氏度"]
}
},
"required": ["location"]
}
},
{
"name": "get_current_price",
"description": "获得指定公司的股价",
"parameters": {
"type": "object",
"properties": {
"company": {
"type": "string",
"description": "公司名,例如:腾讯,阿里巴巴"
},
"exchange": {
"type": "string",
"enum": ["纳斯达克", "上海证券交易所","香港证券交易所"]
}
},
"required": ["company", "exchange"]
},
"responses": {
"type": "object",
"properties": {
"price": {
"type": "int",
"description": "当日股票价格"
}
}
}
}
]
f = qianfan.ChatCompletion(model='ERNIE-Functions-8K')
query = "今天上海的天气,以及今天上汽的股票价格"
msgs = qianfan.QfMessages()
msgs.append(query,role='user')
resp = f.do(
messages=msgs,
functions=func_list
)
while True:
func_call_result = resp["function_call"]
func_name = func_call_result["name"]
kwargs = json.loads(func_call_result["arguments"])
func_resp = funcs[func_name](**kwargs)
func_content = json.dumps({
"return":func_resp
})
msgs.append(resp, role="assistant")
msgs.append(func_content, role="function")
resp = f.do(
messages=msgs,
functions=func_list
)
print(resp['body']['result'])
if resp.get("function_call") is None:
break
返回示例
今天上海的天气是25度摄氏度,天气晴朗。而今天上汽的股票价格为71元。
请求参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
messages | List[dict] | 是 | 聊天上下文信息。说明: (1)messages成员不能为空,1个成员表示单轮对话,多个成员表示多轮对话 (2)最后一个message为当前请求的信息,前面的message为历史对话信息 (3)必须为奇数个成员,成员中message的role必须依次为user、assistant (4)message中的content总长度不能超过24000个字符,且不能超过6144 tokens |
temperature | float | 否 | 说明: (1)较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定 (2)默认0.95,范围 (0, 1.0],不能为0 |
top_p | float | 否 | 说明: (1)影响输出文本的多样性,取值越大,生成文本的多样性越强 (2)默认0.7,取值范围 [0, 1.0] |
penalty_score | float | 否 | 通过对已生成的token增加惩罚,减少重复生成的现象。说明: (1)值越大表示惩罚越大 (2)默认1.0,取值范围:[1.0, 2.0] |
stream | bool | 否 | 是否以流式接口的形式返回数据,默认False · True:是,以流式接口的形式返回数据 · False:否 |
retry_count | int | 否 | 重试次数,默认1次 |
request_timeout | float | 否 | 请求超时时间,默认60秒 |
backoff_factor | float | 否 | 请求重试参数,用于指定重试的策略,默认为0 |
stop | List[string] | 否 | 生成停止标识。当模型生成结果以stop中某个元素结尾时,停止文本生成。说明: (1)每个元素长度不超过20字符 (2)最多4个元素 |
max_output_tokens | int | 否 | 指定模型最大输出token数,说明: (1)如果设置此参数,范围[2, 2048] (2)如果不设置此参数,最大输出token数为1024 |
user_id | string | 否 | 表示最终用户的唯一标识符 |
message说明
名称 | 类型 | 描述 |
---|---|---|
role | string | 当前支持以下: user: 表示用户 assistant: 表示对话助手 |
content | string | 对话内容,不能为空,说明:第一轮对话时,需要符合content内容格式规范,详见本文content格式说明 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
id | string | 本轮对话的id |
object | string | 回包类型。 chat.completion:多轮对话返回 |
created | int | 时间戳 |
sentence_id | int | 表示当前子句的序号。只有在流式接口模式下会返回该字段 |
is_end | bool | 表示当前子句是否是最后一句。只有在流式接口模式下会返回该字段 |
is_truncated | bool | 当前生成的结果是否被截断 |
finish_reason | string | 输出内容标识,说明: · normal:输出内容完全由大模型生成,未触发截断、替换 · stop:输出结果命中入参stop中指定的字段后被截断 · length:达到了最大的token数,根据EB返回结果is_truncated来截断 · content_filter:输出内容被截断、兜底、替换为**等 · function_call:调用了 |
search_info | search_info | 搜索数据,当请求参数enable_citation为true并且触发搜索时,会返回该字段 |
result | string | 对话返回结果 |
need_clear_history | bool | 表示用户输入是否存在安全,是否关闭当前会话,清理历史会话信息 True:是,表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息 False:否,表示用户输入无安全风险 |
flag | int | 说明:返回flag表示触发安全 |
ban_round | int | 当need_clear_history为True时,此字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round=-1 |
usage | usage | token统计信息 |
function_call | function_call | 由模型生成的函数调用,包含函数名称,和调用参数 |
usage说明
名称 | 类型 | 描述 |
---|---|---|
prompt_tokens | int | 问题tokens数 |
completion_tokens | int | 回答tokens数 |
total_tokens | int | tokens总数 |
search_info说明
名称 | 类型 | 描述 |
---|---|---|
search_results | List(search_result) | 搜索结果列表 |
search_result说明
名称 | 类型 | 描述 |
---|---|---|
index | int | 序号 |
url | string | 搜索结果URL |
title | string | 搜索结果标题 |
function_call说明
名称 | 类型 | 描述 |
---|---|---|
name | string | 触发的function名 |
thoughts | string | 模型思考过程 |
arguments | string | 请求参数 |
HTTP调用
鉴权说明
本文API,支持2种鉴权方式。不同鉴权方式,调用方式不同,使用Header、Query参数不同,详见本文请求说明。开发者可以选择以下任一种方式进行鉴权。
请求说明
- 基本信息
请求地址: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k
请求方式: POST
- Header参数
根据不同鉴权方式,查看对应Header参数。
访问凭证access_token鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
Content-Type | string | 是 | 固定值application/json |
基于安全认证AK/SK进行签名计算鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
Content-Type | string | 是 | 固定值application/json |
x-bce-date | string | 否 | 当前时间,遵循ISO8601规范,格式如2016-04-06T08:23:49Z |
Authorization | string | 是 | 用于验证请求合法性的认证信息,更多内容请参考鉴权认证机制,签名工具可参考IAM签名工具 |
- Query参数
只有访问凭证access_token鉴权方式,需使用Query参数。
访问凭证access_token鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
access_token | string | 是 | 通过API Key和Secret Key获取的access_token,参考Access Token获取 |
- Body参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
messages | List(message) | 是 | 聊天上下文信息。说明: (1)messages成员不能为空,1个成员表示单轮对话,多个成员表示多轮对话 (2)最后一个message为当前请求的信息,前面的message为历史对话信息 (3)必须为奇数个成员,成员中message的role必须依次为user、assistant (4)message中的content总长度不能超过24000个字符,且不能超过6144 tokens |
stream | bool | 否 | 是否以流式接口的形式返回数据,默认false |
temperature | float | 否 | 说明: (1)较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定 (2)默认0.95,范围 (0, 1.0],不能为0 |
top_p | float | 否 | 说明: (1)影响输出文本的多样性,取值越大,生成文本的多样性越强 (2)默认0.7,取值范围 [0, 1.0] |
penalty_score | float | 否 | 通过对已生成的token增加惩罚,减少重复生成的现象。说明: (1)值越大表示惩罚越大 (2)默认1.0,取值范围:[1.0, 2.0] |
stop | List(string) | 否 | 生成停止标识,当模型生成结果以stop中某个元素结尾时,停止文本生成。说明: (1)每个元素长度不超过20字符 (2)最多4个元素 |
max_output_tokens | int | 否 | 指定模型最大输出token数,说明: (1)如果设置此参数,范围[2, 2048] (2)如果不设置此参数,最大输出token数为1024 |
user_id | string | 否 | 表示最终用户的唯一标识符 |
message说明
名称 | 类型 | 描述 |
---|---|---|
role | string | 当前支持以下: user: 表示用户 assistant: 表示对话助手 |
content | string | 对话内容,不能为空。说明:第一轮对话时,需要符合content内容格式规范,详见本文content格式说明 |
content格式说明
针对第一轮对话content参数值,需符合一定格式规范,请参考以下内容。
步骤一:查看content模版,请查看第一轮对话content内容模版。
步骤二:准备模版中各参数,请查看参数说明。
步骤三:替换content模版相关参数。
- 第一轮对话content内容模版
注意:针对第一轮对话content参数,只需替换{}中内容,其他文字说明无需改动,即替换以下参数值: · 名称,对应的值 { $functions[i].name} · 描述,对应的值 { $functions[i].description} · 参数,对应的值 { $functions[i].parameters} · 你的问题,对应的值 {query}
接下来的所有对话中,你可以使用外部的工具来回答问题。
你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。
工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。
下面是工具列表:
名称:{ $functions[i].name}
描述:{ $functions[i].description}
参数:{ $functions[i].parameters}
如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:
Action: 使用的工具名称
Action Input: 使用工具的参数,json格式
如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。
你的问题:{query}
- 参数说明
function参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
$functions[i].name | string | 是 | 函数名 |
$functions[i].description | string | 是 | 函数描述 |
$functions[i].parameters | object | 是 | 函数请求参数,说明: (1)JSON Schema 格式,参考JSON Schema描述 (2)如果函数没有请求参数,parameters值格式如下: {"type": "object","properties": {}} |
其他参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
query | string | 是 | 问题描述 |
- 示例
第一轮对话content内容,替换各参数名称、描述、参数、你的问题值后,content示例如下。
注意:实际调用时,请参考调用示例,注意换行等格式。
接下来的所有对话中,你可以使用外部的工具来回答问题。
你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。
工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。
下面是工具列表:
名称:get_current_weather
描述:获得指定地点的天气
参数:{"type":"object","properties":{"location":{"type":"string","description":"省,市名,例如:河北省,石家庄"},"unit":{"type":"string","enum":["摄氏度","华氏度"]}},"required":["location"]}
名称:get_current_price
描述:获得指定公司的股价
参数: {"type":"object","properties":{"company":{"type":"string","description":"公司名,例如:腾讯,阿里巴巴"},"exchange":{"type":"string","enum":["纳斯达克","上海证券交易所","香港证券交易所"]}},"required":["company","exchange"]}
如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:
Action: 使用的工具名称
Action Input: 使用工具的参数,json格式
如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。
你的问题:上海市今天天气"}
响应说明
- 响应头Header参数
部分参数如下。
名称 | 描述 |
---|---|
X-Ratelimit-Limit-Requests | 一分钟内允许的最大请求次数 |
X-Ratelimit-Limit-Tokens | 一分钟内允许的最大tokens消耗,包含输入tokens和输出tokens |
X-Ratelimit-Remaining-Requests | 达到RPM速率限制前,剩余可发送的请求数配额,如果配额用完,将会在0-60s后刷新 |
X-Ratelimit-Remaining-Tokens | 达到TPM速率限制前,剩余可消耗的tokens数配额,如果配额用完,将会在0-60s后刷新 |
- 响应体参数
名称 | 类型 | 描述 |
---|---|---|
id | string | 本轮对话的id |
object | string | 回包类型 chat.completion:多轮对话返回 |
created | int | 时间戳 |
sentence_id | int | 表示当前子句的序号。只有在流式接口模式下会返回该字段 |
is_end | bool | 表示当前子句是否是最后一句。只有在流式接口模式下会返回该字段 |
is_truncated | bool | 当前生成的结果是否被截断 |
finish_reason | string | 输出内容标识,说明: · normal:输出内容完全由大模型生成,未触发截断、替换 · stop:输出结果命中入参stop中指定的字段后被截断 · length:达到了最大的token数,根据EB返回结果is_truncated来截断 · content_filter:输出内容被截断、兜底、替换为**等 |
search_info | search_info | 搜索数据,当请求参数enable_citation为true并且触发搜索时,会返回该字段 |
result | string | 对话返回结果 |
need_clear_history | bool | 表示用户输入是否存在安全风险,是否关闭当前会话,清理历史会话信息。说明: · true:是,表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息。 · false:否,表示用户输入无安全风险 |
flag | int | 说明:返回flag表示触发安全 |
ban_round | int | 当need_clear_history为true时,此字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round=-1 |
usage | usage | token统计信息 |
usage说明
名称 | 类型 | 描述 |
---|---|---|
prompt_tokens | int | 问题tokens数 |
completion_tokens | int | 回答tokens数 |
total_tokens | int | tokens总数 |
search_info说明
名称 | 类型 | 描述 |
---|---|---|
search_results | List(search_result) | 搜索结果列表 |
search_result说明
名称 | 类型 | 描述 |
---|---|---|
index | int | 序号 |
url | string | 搜索结果URL |
title | string | 搜索结果标题 |
注意 :同步模式和流式模式,响应参数返回不同,详细内容参考示例描述。
- 同步模式下,响应参数为以上字段的完整json包。
- 流式模式下,各字段的响应参数为 data: {响应参数}。
示例(单函数调用)
以访问凭证access_token鉴权方式为例,说明如何调用API,示例如下。
- 第一次请求
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”;替换示例中的创建服务时填写的API名称
curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{
"role": "user",
"content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气"
}
]
}'
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{
"role": "user",
"content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气"
}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
- 第一次响应
{
"id": "as-da3bnrr8tv",
"object": "chat.completion",
"created": 1712652144,
"result": "Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 306,
"completion_tokens": 23,
"total_tokens": 329
}
}
- 第二次请求
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”;替换示例中的创建服务时填写的API名称
curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{
"role": "user",
"content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气"
}
]
}'
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{"role": "user","content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气"},
{"role":"assistant","content":"Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}"},
{"role": "user", "content": "{\"temperature\": \"25\", \"unit\": \"摄氏度\", \"description\": \"晴朗\"}"}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
- 第二次响应
{
"id": "as-w36rnt8wqp",
"object": "chat.completion",
"created": 1712653479,
"result": "上海市今天的天气是晴朗,气温为25摄氏度。",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 385,
"completion_tokens": 28,
"total_tokens": 413
}
}
示例(多函数调用)
- 第一次请求
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”;替换示例中的创建服务时填写的API名称
curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{"role": "user", "content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"}
]
}'
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{"role": "user", "content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
- 第一次响应
{
"id": "as-da3bnrr8tv",
"object": "chat.completion",
"created": 1712652144,
"result": "Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 306,
"completion_tokens": 23,
"total_tokens": 329
}
}
- 第二次请求
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”;替换示例中的创建服务时填写的API名称
curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{"role": "user", "content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"},
{"role":"assistant","content":"Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}"},
{"role": "user", "content": "{\"temperature\": \"25\", \"unit\": \"摄氏度\", \"description\": \"晴朗\"}"}
]
}'
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{"role": "user", "content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"},
{"role":"assistant","content":"Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}"},
{"role": "user", "content": "{\"temperature\": \"25\", \"unit\": \"摄氏度\", \"description\": \"晴朗\"}"}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
- 第二次响应
{
"id": "as-cbxwy1ygfx",
"object": "chat.completion",
"created": 1712652884,
"result": "Action: get_current_price\nAction Input: {\"company\": \"上海汽车\", \"exchange\": \"上海证券交易所\"}",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 350,
"completion_tokens": 26,
"total_tokens": 376
}
}
- 第三次请求
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”;替换示例中的创建服务时填写的API名称
curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{"role": "user","content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"},
{"role": "assistant", "content": "Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}"},
{"role": "user", "content": "{\"temperature\": \"25\", \"unit\": \"摄氏度\", \"description\": \"晴朗\"}"},
{"role": "assistant", "content": "Action: get_current_price\nAction Input: {\"company\": \"上海汽车\", \"exchange\": \"上海证券交易所\"}"},
{"role": "user", "content": "{\"price\": \"100\"}"}
]
}'
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-func-8k?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{"role": "user","content": "接下来的所有对话中,你可以使用外部的工具来回答问题。\n你必须按照规定的格式来使用工具,当你使用工具时,我会在下一轮对话给你工具调用结果,然后你应该根据实际结果判断是否需要进一步使用工具,或给出你的回答。\n工具可能有多个,每个工具由名称、描述、参数组成,参数符合标准的json schema。\n\n下面是工具列表:\n名称:get_current_weather\n描述:获得指定地点的天气\n参数:{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"省,市名,例如:河北省,石家庄\"},\"unit\":{\"type\":\"string\",\"enum\":[\"摄氏度\",\"华氏度\"]}},\"required\":[\"location\"]}\n\n-\n名称:get_current_price\n描述:获得指定公司的股价\n参数: {\"type\":\"object\",\"properties\":{\"company\":{\"type\":\"string\",\"description\":\"公司名,例如:腾讯,阿里巴巴\"},\"exchange\":{\"type\":\"string\",\"enum\":[\"纳斯达克\",\"上海证券交易所\",\"香港证券交易所\"]}},\"required\":[\"company\",\"exchange\"]}\n\n\n如果你需要使用外部工具,那么你的输出必须按照如下格式,只包含2行,不需要输出任何解释或其他无关内容:\nAction: 使用的工具名称\nAction Input: 使用工具的参数,json格式\n\n如果你不需要使用外部工具,不需要输出Action和Action Input,请输出你的回答。\n你的问题:上海市今天天气,上汽股价"},
{"role": "assistant", "content": "Action: get_current_weather\nAction Input: {\"location\": \"上海市\", \"unit\": \"摄氏度\"}"},
{"role": "user", "content": "{\"temperature\": \"25\", \"unit\": \"摄氏度\", \"description\": \"晴朗\"}"},
{"role": "assistant", "content": "Action: get_current_price\nAction Input: {\"company\": \"上海汽车\", \"exchange\": \"上海证券交易所\"}"},
{"role": "user", "content": "{\"price\": \"100\"}"}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
- 第三次响应
{
"id": "as-w36rnt8wqp",
"object": "chat.completion",
"created": 1712653479,
"result": "上海市今天的天气是晴朗,气温为25摄氏度。\n\n至于上汽股价,当前的价格是100元。",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 385,
"completion_tokens": 28,
"total_tokens": 413
}
}
错误码
如果请求错误,服务器返回的JSON文本包含以下参数。
名称 | 描述 |
---|---|
error_code | 错误码 |
error_msg | 错误描述信息,帮助理解和解决发生的错误 |
例如Access Token失效返回以下内容,需要重新获取新的Access Token再次请求。
{
"error_code": 110,
"error_msg": "Access token invalid or no longer valid"
}
更多相关错误码,请查看错误码说明。