大模型知识问答技能API接口
简介
Hi,您好,欢迎使用百度智能对话定制与服务平台(UNIT)机器人大模型技能API服务。
大模型技能现处于内测阶段,当且仅当您的申请审核通过后,才可在云端版-我的技能中配置与使用大模型技能。
本文档主要针对大模型技能(邀测制,可在官网首页申请)的API开发者,描述百度智能对话定制与服务平台中大模型技能对话接口服务的相关内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
- 在百度云控制台内提交工单,工单类型请选择人工智能-智能对话定制与服务平台UNIT服务;
- 进入UNIT开发者论坛发帖交流。
文档约定
参数结构约定
示例 | 说明 |
---|---|
+ | "+"号表示字段层级,首层为第0层级 |
aaa[].bbb | aaa是一个list,bbb是list中的一个元素的属性 |
aaa{}.bbb | aaa是一个kvdict,bbb是某个key下的一个value的属性 |
enum | 枚举值 |
optional | 用于描述应答参数,表明某个参数在应答中不一定存在 |
- 所有参数都使用 UTF8 编码
- 输入、输出中,所有begin、length字段的单位为字符(编码无关)
对话接口描述
基于用户输入的文本内容(语音输入最终也转为文本),返回机器人理解与应答的信息。调用本对话API的前提是您已经在 unit.baidu.com 创建了大模型技能,并添加了至少一篇文档且完成了学习。
请求说明
HTTP方法:POST
请求URL:
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/json |
Body中放置请求参数,参数详情如下:
请求参数说明
参数 | 类型 | 是否必需 | 说明 |
---|---|---|---|
skill_id | string | 必需 | 技能唯一标识,在『我的技能』的大模型问答技能列表中的技能ID |
query | string | 必需 | 本轮请求query(用户说的话) |
log_id | string | 必需 | 开发者需要在客户端生成的唯一id,用来定位请求,响应中会返回该字段。对话中每轮请求都需要一个log_id |
session_id | string | 必需 | session保存机器人的历史会话信息,由机器人创建,客户端从上轮应答中取出并直接传递,不需要了解其内容。如果为空,则表示清空session(开发者判断用户意图已经切换且下一轮会话不需要继承上一轮会话中的词槽信息时可以把session置空,从而进行新一轮的会话)。 开发者可以通过传送session_id的方式实现多轮对话。具体操作方式见【请求参数详细说明】 |
请求参数详细说明
利用session_id实现多轮对话
session保存了历史会话信息,随着对话的进行,在客户端和UNIT之间来回传递,并且被不断更新。理论上客户端与UNIT双方都可以对session进行更新与修改,然而,多数开发者并没有修改session的需求,而session数据的体量偏大,又对网络传输的流量与延时产生了额外的压力。
为了解决这一矛盾,UNIT支持基于session_id的会话托管:客户端在首轮对话时传入一个空的session_id字段,在应答阶段,UNIT会把会话信息托管在云端并且为其分配一个session_id。就可以基于历史会话信息与机器人进行多轮对话,而无需接触复杂的原始session。
总结起来,开发者可以使用以下方式与机器人对话API进行多轮对话:
- 客户端在首轮会话时以“session_id”为key传入一个空串,UNIT会把会话数据托管在云端,在应答中以“session_id”为key,返回一个用于指代云端的会话数据的ID号。如需进行多轮对话,客户端在后续对话中以“session_id”为key,继续传送前轮返回的ID号。在这种方式下,开发者没有办法修改会话数据。
注意:
- 只要传入一个空的session_id,即代表不再继承历史会话信息,后续将开始新的对话。
- session_id的有效期为30分钟,多轮对话间隔超过30分钟需重新开始对话。
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
error_code | int | 错误码,为0时表示成功 |
error_msg | string | 错误信息,errno!= 0 时存在 |
result | object | 返回数据对象,当errno为0时有效 |
+skill_id | string | 技能ID,同请求参数 |
+log_id | string | 开发者需要在客户端生成的唯一id,用来定位请求,响应中会返回该字段。对话中每轮请求都需要一个log_id |
+timestamp | string | interaction生成的时间(以interaction_id的生成时间为准)。格式:YYYY-MM-DD HH:MM:SS.fff (24小时制,精确到毫秒) |
+ref_id | string | 每轮对话自动生成的唯一ID |
+session_id | string | 本轮对话后更新的session_id信息,详情见【请求参数详细说明】 |
+query | string | 原始query |
+responses | object | 本轮应答信息 |
++status | int | 状态码,0为正常 |
++answer | string | 大模型技能答复 |
响应参数详细说明
请求示例代码
提示一:使用示例代码前,请记得替换其中的示例Token、请求参数等信息。
提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。
package com.baidu.ai.aip.unit;
import com.baidu.ai.aip.utils.HttpUtil;
/*
* unit对话服务
*/
public class UnitService {
/**
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/
private static String utterance() {
// 请求URL
String talkUrl = "https://aip.baidubce.com/rpc/2.0/unit/large/model/chat";
try {
// 请求参数
String params = "{\"skillId\":\"0000\",\"query\":\"你好\",\"logId\":\"unit-test-123\",\"sessionId\":\"\"}";
String accessToken = "#####调用鉴权接口获取的token#####";
String result = HttpUtil.post(talkUrl, accessToken, "application/json", params);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
utterance();
}
}
/*
* Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
*/
var https = require('https');
var qs = require('querystring');
var param = qs.stringify({
'access_token': '您的access_token'
});
var options = {
hostname: 'aip.baidubce.com',
path: '/rpc/2.0/unit/large/model/chat?' + param,
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=UTF-8'
}
};
var req = https.request(
options,
function (res) {
// 在标准输出中查看运行结果
res.pipe(process.stdout);
}
);
var postData = {
'skillId':'0000',
'query':'你好',
'logId':'unit-test-123',
'sessionId':''
};
// 携带数据发送https请求
req.write(JSON.stringify(postData));
req.end();
<?php
/**
* 发起http post请求(REST API), 并获取REST请求的结果
* @param string $url
* @param string $param
* @return - http response body if succeeds, else false.
*/
function request_post($url = '', $param = '')
{
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
// 初始化curl
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $postUrl);
curl_setopt($curl, CURLOPT_HEADER, 0);
// 要求结果为字符串且输出到屏幕上
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// post提交方式
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
// 运行curl
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
$token = '#####调用鉴权接口获取的token#####';
$url = 'https://aip.baidubce.com/rpc/2.0/unit/large/model/chat?access_token=' . $token;
$bodys = '{"skillId":"0000","query":"你好","logId":"unit-test-123","sessionId":""}';
$res = request_post($url, $bodys);
var_dump($res);
# encoding:utf-8
import requests
access_token = '#####调用鉴权接口获取的token#####'
url = 'https://aip.baidubce.com/rpc/2.0/unit/large/model/chat?access_token=' + access_token
post_data = "{\"skillId\":\"0000\",\"query\":\"你好\",\"logId\":\"unit-test-123\",\"sessionId\":\"\"}"
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(url, data=post_data, headers=headers)
if response:
print (response.json())
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;
using System.Net.Http;
namespace com.baidu.ai
{
public class Utterance
{
// unit对话接口
public static string unit_utterance()
{
string token = "#####调用鉴权接口获取的token#####";
string host = "https://aip.baidubce.com/rpc/2.0/unit/large/model/chat?access_token=" + token;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.ContentType = "application/json";
request.KeepAlive = true;
string str = "{\"skillId\":\"0000\",\"query\":\"你好\",\"logId\":\"unit-test-123\",\"sessionId\":\"\"}"; // json格式
byte[] buffer = Encoding.UTF8.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string result = reader.ReadToEnd();
Console.WriteLine("对话接口返回:");
Console.WriteLine(result);
return result;
}
}
}
#include <iostream>
#include <curl/curl.h>
// libcurl库下载链接:https://curl.haxx.se/download.html
// unit对话接口url
const static std::string get_utterance_url = "https://aip.baidubce.com/rpc/2.0/unit/large/model/chat";
static std::string s_get_utterance_result;
/**
* curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
* @param 参数定义见libcurl文档
* @return 返回值定义见libcurl文档
*/
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
// 获取到的body存放在ptr中,先将其转换为string格式
s_get_utterance_result = std::string((char *) ptr, size * nmemb);
return size * nmemb;
}
/**
* 调用对话接口,返回int格式的结果,具体格式解析见百度大脑文档
* @param json_result 以string格式返回的json格式的结果
* @param json_request_body 以string格式传递的json数据(如:{\"skillId\":\"0000\",\"query\":\"你好\",\"logId\":\"unit-test-123\",\"sessionId\":\"\"}; // json格式 )
* @param access_token 以string格式传入的access token数据,access token获取方式见access_token获取相关文档及代码
* @return 调用成功返回0,发生错误返回其他错误码
*/
int unit_utterance(std::string &json_result, const std::string json_request_body,
const std::string &access_token) {
std::string url = get_utterance_url + "?access_token=" + access_token;
CURL *curl = NULL;
CURLcode result_code;
int is_success = 0;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.data());
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_request_body.data());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
result_code = curl_easy_perform(curl);
if (result_code != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(result_code));
is_success = 1;
return is_success;
}
json_result = s_get_utterance_result;
curl_easy_cleanup(curl);
is_success = 0;
} else {
fprintf(stderr, "curl_easy_init() failed.");
is_success = 1;
}
return is_success;
}
#!/bin/bash
curl -i -k 'https://aip.baidubce.com/rpc/2.0/unit/large/model/chat?access_token={access_token}' --data '{"skillId":"0000","query":"你好","logId":"unit-test-123","sessionId":""}'
错误信息
错误码 | 类型 | 说明 |
---|---|---|
1 | Unknown error | 系统繁忙,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
2 | Service temporarily unavailable | 服务暂不可用,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
3 | Unsupported openapi method | 调用的API不存在,请检查后重新尝试 |
4 | Open api request limit reached | 集群超限额 |
6 | No permission to access data | 无权限访问该用户数据 |
17 | Open api daily request limit reached | 每天请求量超限额,如需更多配额请通过工单系统提交申请 |
18 | Open api qps request limit reached | QPS超限额,如需更多配额请通过工单系统提交申请 |
19 | Open api total request limit reached | 请求总量超限额,如需更多配额请通过工单系统提交申请 |
100 | Invalid parameter | 无效的access_token参数,请检查后重新尝试 |
110 | Access token invalid or no longer valid | access_token无效 |
111 | Access token expired | access_token过期 |
282000 | Internal error | 系统繁忙,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
282001 | Strategy process failed | 系统内部错误,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
282004 | Parameter[%s] invalid or missing | 请求参数格式不正确 |
282008 | The request content type is illegal. | 非法请求内容类型 |
282906 | The account cannot use the service | 账户请求服务受限,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |
292001~292015 | - | 请求参数错误,详见errorMsg字段描述 |
299001~299999 | - | 系统繁忙,如果持续出现该错误,请通过QQ群(805312106)或百度Hi群(1617262)联系技术支持团队 |