一、API是什么?
API即应用程序编程接口,是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式,通过预定义的函数或方法,来使用某个软件、库、操作系统或硬件的功能,而不需要深入了解其内部工作原理。
API 的类型
-
Web API:也叫做网络API或HTTP API,允许应用程序通过网络(通常是互联网)进行交互。Web API通常使用HTTP协议,传递JSON或XML格式的数据。例如,天气预报应用可以通过调用一个天气服务的Web API,获取当前的天气信息。
-
操作系统API:操作系统提供的API允许开发者访问硬件资源或系统服务。例如,Windows API允许程序访问文件系统、网络连接、显示图形等操作系统功能。
-
库或框架的API:编程语言中的库或框架通常提供API,允许开发者调用其功能。例如,Python的
requests
库提供了简单的API来发起HTTP请求。 -
硬件API:一些硬件设备(如显卡、传感器等)也提供API,供开发者控制或与设备通信。例如,图形API(如OpenGL、DirectX)用于开发3D图形应用。
这里我们主要讲解web API,教大家怎么使用网络的方式调用一些远程的API从而简化我们的程序。
二、为什么我们需要web API?
在如今庞大的互联网环境中,各个服务节点之间的交互是非常复杂的,每个服务器上都运行着不同的服务以供用户使用。当我们在开发一款应用时,我们可能需要为我们的应用添加一个天气查询功能,我们肯定不能自己在各地都成立气象站实时监测天气,当然这也不现实,首先是成本高昂,可实现性低,其次就是数据量庞大,处理这些数据的成本也高。那怎么办呢?当然是使用API来解决问题,我们自己不能做的事总会有别人做,别人将各地的天气数据收集好然后开放出相应的接口我们直接使用别人开放出来的接口即可。这样我们也不用在意这一切的实现,毕竟我们只需要调用接口就能知道某地的天气信息。当然,相对的,对方为我们提供了API的服务,其自身的成本也非常高昂,我们在调用某些API时,可能需要支付给API服务商一些费用。上面只是从用户出发的一个场景。下面我们从商户出发。假如,我作为一个商户,我开发了一款大模型。因为商业竞争原因,我不能将我的大模型直接开源,那我也想让我的用户使用,那应该怎么办呢?当然还是使用API,我不一定需要开源我的模型,我可以就我模型而言,开放相应的API给我的用户使用。这样我的用户只需要调用我的API就可以直接使用我的模型了。用户也可以就我模型的API开发新的应用,将我的服务嵌入到自己的软件中。当然,上面只是API一些常见的调用方式,API的使用场景还有很多,比如一些博客中的随机图片,每日一言,大多都是用API实现的。可以说API已经存在于我们生活中的方方面面。
三、需要准备什么?
这篇API的调用教程已经不只针对于纯新手了,在学习之前需要大家具备一定的python基础,能够看懂最基本的代码,以及知道怎么使用pip安装python库。
四、如何调用一个大语言模型的API
这篇文章是为了教会大家如何调用web API,这里我们主要使用百度千帆大模型进行演示。当大家会调用这个API以后,根据自己举一反三,后续许多API大家都能自行进行调用了。如果你准备好了,那就让我们开始吧!
这里我们直接在浏览器中搜索“百度开放平台”:
如果你没有搜到,可以直接点下面的链接直接进入:
百度开放平台:百度AI开放平台-全球领先的人工智能服务平台 (baidu.com)
进来以后就可以看到以下的界面了:
下面我们点击“文心大模型”:
再点击“百度智能云千帆大模型平台”:
点击以后就来到了以下界面:
往下滑就能看到百度推出的最新的几款模型:
这里我们主要教大家如何调用接口,以及如何阅读接口文档,这里我们随便选择一款模型,点击
“API文档”:
这里我们只是作为演示,也是为了教会大家如何使用,所以我就随便选取了一个模型的API文档,这里我选择的是“ERNIE 4.0”的API作为演示:
因为我们这里教大家API调用,更注重调用时的细节,虽说百度已经封装好了相关的SDK,调用起来更方便,但是为了学习API调用的原理,我们这里还是选择“HTTP”调用:
这里简单的来说一下两者的区别,SDK是封装好的一个库,我们可以直接使用并且不需要在意调用时的细节。HTTP调用是最原始的API调用方法,API的提供者通过开放一个网络接口,我们使用指定请求方式向接口请求数据,并且接收API接口的返回值。现在,相信你对API和SDK都有一定的了解了,那就让我们来看看文档吧!
这里我们首先看到“HTTP调用”方法的“鉴权说明”:
这里的鉴权主要是用于验证用户身份,之前也提到过,我们有的API是收费的或者为了防止API被滥用,许多API都设立鉴权,用于验证用户身份或者计费。
因为我们这里使用“access_token”鉴权,我们可以这里的链接了解这种鉴权方式:
当我们点击了上面的链接以后,来到了一篇新的文章,这篇文章会教我们如何鉴权:
这里我们使用”access_token鉴权认证“,所以我们看文章的第一部分:
在文档中,这里一共有三个步骤,分别是“获取API key和Secret Key”,“通过调用接口获取access token”,“使用accesstoken”:
根据文档的步骤,这里我们先去获取“API key和Secret Key”,同样的,我们可以点击提供的文档:
这里的两个key获取的步骤比较简单,就不详细讲解了,大家自行创建好应用就可以看到key了:
然后我们就可以进行下一步了,这里我们需要使用接口获取“access_token”,我们同样进入它的相关文档:
下面我们看到请求说明:
这里我们就需要写代码了,大家打开自己熟悉的IDE,这里我使用的是pycharm,如果你想知道pycharm的安装方法,可以看下面的教程:
pycharm安装教程:[python]我们应该如何正确的安装和汉化pycharm,并且导入开发环境?_python汉化-CSDN博客
我们可以在pycharm中新建一个工程并且导入一个python环境,如果你还不会导入开发环境,可以参考上面的教程。
如下图,我们的pycharm环境已经创建好了并且已经导入了一个python环境:
首先,既然要请求API接口,我们需要一个python中的网络请求库,这里我们在python中最常用的网络请求库是“requests”库,我们使用下面的命令来安装“requests”库:
pip install requests
在安装好requests库以后,我们就可以开始写代码了。
这里我们继续回到获取access token的文档:
我们首先在python代码中引用我们安装好的requests库:
然后我们要在这个文件中指定python的函数入口点,因为后面我们会封装许多函数,所以这里要指定一个python的入口点,这里在入口点的下方随便写一个函数防止报错:
下面我们来封装我们的第一个函数,用来获取access token:
在文档中我们可以看到,这里获取access token使用的是POST的请求方式,我们可以直接使用函数“requsts.post”函数,我们可以看到,这个函数的显性参数有这些:
这里我们需要填写的有“url”,“headers”,“data”几个,即使这里的“headers”参数在“requsts.post”函数中被明确要求,但是在API文档中headres参数被要求了值,这里我们仍然要将其加入:
这里我们首先就可以来写headres,我们可以使用一个字典来存放headres:
headers={
'Content-Type' : 'application/json',
'Accept': 'application/json'
}
这里的'Content-Type' : 'application/json'表示向服务器提供的数据是JSON格式的,这是在文档中被要求的。'Accept': 'application/json'表示期待服务器的回复也是JSON,这个是用户定义的,如果服务器的返回值默认是JSON这个也可以不写。
然后我们来写url,这里我们直接使用一个变量来装url就行了,这里在文档中,我们看到Query参数:
这里的Query参数我们需要填写在url中,如图:
这里的url大家按照我的格式写即可,注意观察我的url中的参数和文档中提到的Query参数:
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=oQhJMMU2YLjkPE8jbnUl7dlg&client_secret=l0sWf63eSYXAdL6ZNGWHA5eSFIPNZhm2"
将函数写完以后,就可以将我们封装的函数写道main函数中测试一下,如果前面都写对了的话,就可以得到下面的结果了:
如果你在这一步中,执行了函数但是没有值返回,你可以考虑查看url中的Query参数有没有写错,反复核对一下文档,请求url和和Query参数之间有没有用?分隔。如果返回一个错误的JSON,可以根据错误内容和错误代码解决相关问题。下面我们来举一个例子,也是作为一个错误复现,假如我将我的key中的一个字符删除,就会出现以下错误:
这里的“unknown client id”翻译过来就是“未知的用户id”这就表示我们的key错了。每一种以JSON形式返回的错误都是有解决方法的,如果在这一段JSON中没有直接提示错误也会提示错误码,大家可以对照文档下面的错误码查询解决办法:
我们现在将程序调到正常的状态,我们可以看到返回JSON数据中有一个access_token的键:
我们可以提取JSON中的这个键:
在代码中加入下面的代码:
returnjson = returndata.json()
access_token = returnjson.get("access_token")
print(access_token)
简单解释一下,“returnjson = returndata.json()”用于对返回值创建一个JSON的对象。
“access_token = returnjson.get("access_token")”,为了将JSON对象中的“access_token”键提取出来并存放在“access_token”变量中。
“print(access_token)”,将我们的access_token打印出来。
这样我们就得到了下面的结果:
我们可以为这个函数写一个返回值,直接将我们的access token作为函数的返回值:
至此,我们已经获取到了access token,让我们回到鉴权的文章中,我们可以看到,这里是最后一步,怎么使用access token:
这里我们直接将access token按照一定格式加在我们的API接口后面即可。现在我们不着急拼接,我们写一个调用API的函数,因为我们这里是调用的语言模型,我们就可以将我们说的话作为函数的传入参数,将AI的回复作为函数的返回值:
我们先调用一开始封装好的获取access token的函数,将我们的access token存放在一个变量中:
下面我们按照文档中的鉴权要求拼接url:
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="+access_token
这里的url如果你不确定有没有拼对,可以考虑将其打印出来:
打印出来得到以下结果:
这样就表示我们的url与accesstoken拼接成功了。注意,格式一定要一样,如果在这里出现问题,在后面肯定会调用失败,请反复检查是否使用?分隔,检查有没有加=号。
我们继续看API文档:
这里可以看到,我们这里的API请求方式仍然需要使用POST的方式,我们同样的将POST的请求函数写出来,再看看差什么,再考虑写什么?
这里我们url已经有了还差headers,和data。这里的headers我们直接复制上面个的就行:
最后我们来写data,这里我们再看文档:
这里的data我们要写成JSON格式的,里面要放一个键messages作为与AI的对话内容,也可以将AI的回复内容保存在其中让AI具有上下文能力,这里我们将文本转换为JSON并且存放在变量中,大家按照此格式写即可:
payload = json.dumps({
"messages": [{"role": "user", "content": "你好"}]
})
上面我们要的都凑齐了,我们下面来填写“requests.post”函数的参数,如下:
requests.post(url,headers=headers,data=payload)
我们同样的将其返回值打印出来:
大家可以看到,我们这里已经收到了AI的返回值了。
我们同样的,使用上面的代码将AI的回复提取出来:
returnjson = returndata.json()
baiduchat = returnjson.get("result")
print(baiduchat)
这里可以看到,AI的回复已经成功的被提取出来了:
我们这里将AI的回复内容作为函数的返回值,并且将传入的参数作为我们要对AI说的话放在messages中:
我们直接将这个函数的返回值打印出来:
可以看到,我们这里的回复已经打印出来了:
五、结语
在本次教程中,教了大家如何根据API的文档来调用API,自己阅读文档调用API也能更直观的感受一个API的调用过程。如果大家在调用API时遇到了我没有提到的问题,可以考虑多次阅读文档,或者使用文档中的请求示例。在使用请求示例时,直接将相关的key填入对应的位置即可。当然,本次教程是为了教会大家,如果遇到要调用API的场景,到底应该怎么办,怎么去准备需要的数据。这篇教程中我们首先为了鉴权去获取access token,然后又根据文档中的示例进行了鉴权。最后我们根据API文档中的参数,将我们对AI的对话填入messages中,最终完成的调用。不只是百度的API,有很多API的调用方式都与这个类似,在调用API时仔细阅读文档,观察哪些东西是必须的。最后,感谢大家观看!