当前位置:   article > 正文

【鸿蒙】大模型对话应用(一):大模型接口对接与调试

大模型接口

Demo介绍

本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。

DecEco Studio版本:DevEco Studio 3.1.1 Release

HarmonyOS API版本:API9

关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局

官方接口文档

此链接为当前时间(2024-1-26)文档链接地址,可能发生迁移变更,以官方为准。

阿里云通义千文API接口文档地址:通义千问API如何使用_模型服务灵积(DashScope)-阿里云帮助中心

百度智能云千帆大模型API接口文档地址:鉴权介绍 - 千帆大模型平台 | 百度智能云文档

新建项目

API9,Stage模型(需要联网)

资源同步下载结束后,打开预览器,可正常预览页面

实现API接口调用

新建http目录,在其中并在此目录下新建两个ts文件,分别实现调用阿里云和百度的API接口

申请网络权限

1、对接阿里云API

开通服务并获得API-KEY

请参照:如何开通DashScope并创建API-KEY_模型服务灵积(DashScope)-阿里云帮助中心

开通完成后,可在工作台拿到接口请求的鉴权信息:API-KEY,发起http时请求头header需要携带

参照文档实现请求方法

根据接口文档构造请求体,发起http请求,完成大模型对话

接口文档:通义千问API如何使用_模型服务灵积(DashScope)-阿里云帮助中心

实现ALiYunHttpUtils 类的 request 方法。

  1. import http from '@ohos.net.http';
  2. import hilog from '@ohos.hilog';
  3. class ALiYunHttpUtils {
  4. request(question: string) {
  5. hilog.info(0x0000, 'testTag', 'ALiYunHttpUtils request invoke. question: %{public}s', question);
  6. // 1 createHttp接口创建请求
  7. let httpRequest = http.createHttp();
  8. // 2 发起请求
  9. httpRequest.request(
  10. // 请求地址
  11. "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation",
  12. // 请求options: HttpRequestOptions
  13. {
  14. // 请求方式
  15. method: http.RequestMethod.POST,
  16. // 请求头
  17. header: {
  18. "Content-Type": "application/json",
  19. // 这里的Authorization 就是刚才工作台查看的 API-KEY
  20. "Authorization": "sk-0bxxxxxxxxxxxxxxxxc3" // 脱敏处理
  21. },
  22. // 请求体
  23. extraData: {
  24. "model": "qwen-plus", // 指定用于对话的通义千问模型名
  25. "input": {
  26. "messages": [
  27. {
  28. "role": "user",
  29. "content": question // 请求发起方传入的问题
  30. }
  31. ]
  32. }
  33. }
  34. }, (err, data: http.HttpResponse) => {
  35. if (err) {
  36. hilog.error(0x0000, 'testTag', 'Failed to request ALiYun. Cause: %{public}s', JSON.stringify(err) ?? '');
  37. httpRequest.destroy();
  38. } else {
  39. hilog.error(0x0000, 'testTag', 'Request ALiYun success. data: %{public}s', JSON.stringify(data.result));
  40. httpRequest.destroy();
  41. }
  42. })
  43. }
  44. }
  45. export default new ALiYunHttpUtils;
调用http请求方法

在index页面加载的时候,调用ALiYunHttpUtils.request方法

刷新页面触发请求

刷新或重启Preview预览器,index页面重新加载,会执行aboutToAppear方法;

打开Log控制台,可看到请求结果

2、对接百度API

创建应用

登录平台,创建应用,可得到应用的API Key 和 Secret Key;这两个信息在调用鉴权信息接口时会用到。

开通服务(计费)

添加应用后,会默认预置一部分服务,可在【在线服务】菜单页查看;

大部分服务都需要付费开通,有几个免费的本人不太会用(尴尬。。)有免费的策略各位也可以分享一下 嘿嘿~

开通了一个计费的,个人测试使用,调用不会很频繁

鉴权认证

根据鉴权接口文档,实现鉴权接口请求

文档地址:获取access_token - 千帆大模型平台 | 百度智能云文档

实现BaiduHttpUtils类的 request 方法。

注意:此处BaiduHttpUtils.request方法仅完成了鉴权接口调用,还未进行真正的对话

  1. import hilog from '@ohos.hilog';
  2. import http from '@ohos.net.http';
  3. class BaiduHttpUtils {
  4. request(question: string) {
  5. hilog.info(0x0000, 'testTag', 'BaiduHttpUtils request invoke. question: %{public}s', question);
  6. // 先鉴权
  7. // 1 createHttp接口创建请求
  8. let httpRequest = http.createHttp();
  9. // 2 发起请求
  10. httpRequest.request(
  11. // 请求地址
  12. // 参数grant_type 固定值client_credentials
  13. // 参数client_id 应用的API Key
  14. // 参数client_secret 应用的Secret Key
  15. "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=asxxxxxxxxxxHo&client_secret=ihxxxxxxxxgG",
  16. {
  17. method: http.RequestMethod.POST,
  18. header: {
  19. "Content-Type": "application/json"
  20. }
  21. }, (err, data: http.HttpResponse) => {
  22. if (err) {
  23. hilog.error(0x0000, 'testTag', 'Failed to request BaiDu. Cause: %{public}s', JSON.stringify(err) ?? '');
  24. httpRequest.destroy();
  25. } else {
  26. hilog.error(0x0000, 'testTag', 'Request BaiDu success. data: %{public}s', JSON.stringify(data.result));
  27. httpRequest.destroy();
  28. }
  29. }
  30. )
  31. }
  32. }
  33. export default new BaiduHttpUtils;

在index页面加载的时候,调用BaiduHttpUtils.request方法

鉴权通过后,可在接口返回中获取后续对话接口所需要的鉴权信息access_token

发起对话请求

拿到access_token后,可根据上述开通的服务对应的接口文档,发起对话请求

实现BaiduHttpUtils类的 chatRequest方法,在鉴权结束后调用

  1. import hilog from '@ohos.hilog';
  2. import http from '@ohos.net.http';
  3. class BaiduHttpUtils {
  4. request(question: string) {
  5. hilog.info(0x0000, 'testTag', 'BaiduHttpUtils request invoke. question: %{public}s', question);
  6. // 先鉴权
  7. // 1 createHttp接口创建请求
  8. let httpRequest = http.createHttp();
  9. // 2 发起请求
  10. httpRequest.request(
  11. // 请求地址
  12. // 参数grant_type 固定值client_credentials
  13. // 参数client_id 应用的API Key
  14. // 参数client_secret 应用的Secret Key
  15. "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=asxxxxxxxxHo&client_secret=ihxxxxxxxxgG",
  16. {
  17. method: http.RequestMethod.POST,
  18. header: {
  19. "Content-Type": "application/json"
  20. }
  21. }, (err, data: http.HttpResponse) => {
  22. if (err) {
  23. hilog.error(0x0000, 'testTag', 'Failed to request BaiDu. Cause: %{public}s', JSON.stringify(err) ?? '');
  24. httpRequest.destroy();
  25. } else {
  26. hilog.error(0x0000, 'testTag', 'Request BaiDu success. data: %{public}s', JSON.stringify(data.result));
  27. httpRequest.destroy();
  28. // 携带认证信息 发起对话请求
  29. let respToken: BaiDuToken = JSON.parse(data.result.toString())
  30. this.chatRequest(respToken.access_token, question)
  31. }
  32. }
  33. )
  34. }
  35. chatRequest(token: string, question: string) {
  36. // 通常情况不建议把token打印出来 此处为了方便调试
  37. hilog.info(0x0000, 'testTag', 'BaiduHttpUtils chaRequest invoke. token: %{public}s, question: %{public}s', token, question);
  38. // 1 createHttp接口创建请求
  39. let httpRequest = http.createHttp();
  40. // 2 发起请求
  41. httpRequest.request(
  42. // 请求地址
  43. "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + token,
  44. {
  45. method: http.RequestMethod.POST,
  46. header: {
  47. "Content-Type": "application/json"
  48. },
  49. extraData: {
  50. "messages": [
  51. {
  52. "role": "user",
  53. "content": question
  54. }
  55. ]
  56. }
  57. }, (err, data: http.HttpResponse) => {
  58. if (err) {
  59. hilog.error(0x0000, 'testTag', 'Failed to request BaiDu. Cause: %{public}s', JSON.stringify(err) ?? '');
  60. httpRequest.destroy();
  61. } else {
  62. hilog.error(0x0000, 'testTag', 'Request BaiDu success. data: %{public}s', JSON.stringify(data.result));
  63. httpRequest.destroy();
  64. }
  65. })
  66. }
  67. }
  68. export default new BaiduHttpUtils;
  69. class BaiDuToken {
  70. access_token: string
  71. expires_in: number
  72. session_key: string
  73. // ...
  74. }
刷新页面触发请求

刷新或重启Preview预览器,index页面重新加载,会执行aboutToAppear方法;

打开Log控制台,可看到请求结果

至此,两个大模型的API接口对接完成,下一步可以开始设计对话页面。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号