uni-ai.md 15.3 KB
Newer Older
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
1 2 3 4 5 6
# uni-ai

ai大潮来袭,如何把ai能力引入自己的应用中?几乎是每个开发者都在关心的问题。

`uni-ai`,定位就是开发者使用ai能力的最佳开发库,更丰富、更易用、更高效。

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
7 8
## 特点

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
9
1. 聚合
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
10

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
11 12 13 14 15 16 17
`uni-ai`,聚合了国内外各种流行的ai能力。包括
- 大语言模型LLM:chatGPT、GPT-4、文心一言以及一些优秀创业公司
- 图形能力:stable diffusion、midjourney等

`uni-ai`支持配置自己在AI厂商处申请的API Key和代理,也支持免配直接使用。

2. prompt辅助
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
18

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
自然语言谁都会说,但想提出一个好prompt来指挥ai满足自己的需求并不简单。

`uni-ai`整合了大量prompt模板,并且提供了 `format prompt``prompt插件市场`

举个例子,如果你需要写一个产品营销文案,你可以使用自然语言,如`请帮我编写一份产品营销文案,产品名称叫uni-app,它的特点是开发一次全端覆盖。`

但实际上,自然语言这么写是繁琐且容易纰漏的。format prompt是弹出一个表单,你在表单里填写:
```
产品名称:uni-app
目标用户:程序员
产品归类:前端应用开发框架
产品用途:使用该框架开发应用,一次编码可覆盖到Android app、iOS app、web、以及各家小程序,如微信、百度、支付宝、抖音、qq、京东等小程序和快应用。
卖点:高效、易学、生态完善
文风:技术风格
字数:500字
```

`uni-ai`,为你提供更好的prompt。

3. 私有数据训练
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
39

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52
目前的大模型,没有最新的、以及企业私有的数据。各家也未开放fine-turning微调模型。

如何把私有数据灌入ai中,几乎是每个企业都关心的事情。

`uni-ai`提供了一整套方案解决这个问题,只需把私有数据按指定格式提交到你的uniCloud服务空间,就可以自动把这些最新的、私有的知识加入到ai的回答中。

4. 开源项目

ai能力非常常见的应用场景,有智能客服和自动生成文稿。

`uni-ai`把这些常见场景对应的应用均已做好,并且开源。开发者可以直接拿走使用。

- uni-cms,内置了智能内容生成。[详见](https://uniapp.dcloud.net.cn/uniCloud/uni-cms.html)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
53 54
- uni-im,内置了智能客服(暂未发布)

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
55 56

这些完善的项目,包括了前端页面(全端可用)、云对象、云数据库等全套代码,开箱即用。
C
chenruilong 已提交
57
![](https://web-assets.dcloud.net.cn/unidoc/zh/202304112225875.png)
DCloud_JSON's avatar
DCloud_JSON 已提交
58

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
59 60 61 62 63 64 65 66 67 68
5. 费用优化

ai能力调用,是需要按token数量付费的。token太少会回答不准,太多则费用太高。

`uni-ai`提供了多种取舍策略,方便开发者平衡效果和费用。

6. 后置命令处理

ai都是回答文字内容,但实际场景中经常需要自动化执行一些命令。

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
69
`uni-ai`提供了action机制,让ai变的更加强大。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
70

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
71
例如,请ai帮忙写一段代码,其中涉及了未引用的三方插件,那么action可以通知HBuilder弹出下载这个插件的界面,不但代码生成了,其中的插件也自动下载了。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
72 73 74 75 76 77


使用简单的js api,快速开始你的ai之旅吧!

```js
// 因涉及费用,ai能力调用均需在服务器端进行,也就是uniCloud云函数或云对象中
雪洛's avatar
雪洛 已提交
78
let llm = uniCloud.ai.getLLMManager({
雪洛's avatar
雪洛 已提交
79
  provider
雪洛's avatar
雪洛 已提交
80 81 82 83
})
llm.chatCompletion({
  messages: [{
    role: 'user',
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
84
    content: '你好,ai'
雪洛's avatar
雪洛 已提交
85 86
  }]
})
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
87 88
```

雪洛's avatar
雪洛 已提交
89
## API@api
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
90

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
91
> 新增于HBuilderX 3.7.13+
雪洛's avatar
雪洛 已提交
92

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
93
ai作为一种云能力,相关调用被整合到uniCloud中。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
94

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
95
如您的服务器业务不在uniCloud上,可以把云函数URL化,把`uni-ai`当做http接口调用。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
96 97 98

在实际应用中,大多数场景是直接使用uni-im和uni-cms的ai功能,这些开源项目已经把完整逻辑都实现,无需自己研究API。

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
99 100 101
ai能力由`uni-cloud-ai`扩展库提供,在云函数或云对象中,对右键或在package.json中配置`uni-cloud-ai`扩展库。
如何使用扩展库请参考:[使用扩展库](cf-functions.md#extension)

雪洛's avatar
雪洛 已提交
102 103
### 获取LLM服务商实例@get-llm-manager

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
104 105 106 107 108
LLM,全称为Large Language Models,指大语言模型。

LLM的主要特点为输入一段前文,可以推导预测下文。

LLM不等于ai的全部,除了LLM,还有ai生成图片等其他模型。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
109

雪洛's avatar
雪洛 已提交
110 111
用法:`uniCloud.ai.getLLMManager(Object GetLLMManagerOptions);`

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
112 113
注意需在相关云函数或云对象中加载`uni-cloud-ai`[使用扩展库](cf-functions.md#extension),否则会报找不到ai对象。

雪洛's avatar
雪洛 已提交
114 115
**参数说明GetLLMManagerOptions**

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
116 117 118 119 120 121
|参数		|类型	|必填	|默认值	|说明																																	|
|---		|---	|---	|---	|---																																	|
|provider	|string	|否		|-		|llm服务商,目前支持`openai``baidu``minimax`。不指定时由uni-ai自动分配																|
|apiKey		|string	|否		|-		|llm服务商的apiKey,如不填则使用uni-ai的key。如指定openai和baidu则必填																			|
|accessToken|string	|否		|-		|llm服务商的accessToken。目前百度文心一言是必填,如何获取请参考:[百度AI鉴权认证机制](https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu)	|
|proxy		|string	|否		|-		|可有效连接openai服务器的、可被uniCloud云函数连接的代理服务器地址。格式为IP或域名,域名不包含http前缀,协议层面仅支持https。配置为`openai`时必填													|
雪洛's avatar
雪洛 已提交
122 123 124 125

**示例**

```js
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
126 127 128 129 130 131 132 133
// 不指定provider
const llm = uniCloud.ai.getLLMManager()

// 指定openai,需自行配置相关key,以及中转代理服务器
const openai = uniCloud.ai.getLLMManager({
  provider: 'openai',
  apiKey:'your key',
  proxy:'www.yourdomain.com' //也可以是ip
雪洛's avatar
雪洛 已提交
134 135 136
})
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
137 138 139 140
现阶段,不指定provider时,uni-ai分配的ai引擎无需开发者支付费用。同时也不会自动分配到gpt-4等比较昂贵但精准的模型上。如有变化会提前公告。

开发者使用openai等已经商用的ai时,需自行向相关服务商支付费用。

雪洛's avatar
雪洛 已提交
141 142 143 144 145 146
### 对话@chat-completion

用法:`llm.chatCompletion(Object ChatCompletionOptions)`

**参数说明ChatCompletionOptions**

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
147 148 149 150 151 152 153
|参数		|类型	|必填	|默认值				|说明																									|兼容性说明					|
|---		|---	|---	|---				|---																									|---						|
|messages	|array	|是		| -					|提问信息																								|							|
|model		|string	|否		|默认值见下方说明		|模型名称。每个AI Provider有多个model,见下方说明															|百度文心一言不支持此参数	|
|maxTokens	|number	|否		|-					|生成的token数量限制,需要注意此数量和传入的message token数量相加不可大于4096							|百度文心一言不支持此参数	|
|temperature|number	|否		|1					|较高的值将使输出更加随机,而较低的值将使输出更加集中和确定。建议temperature和top_p同时只调整其中一个	|百度文心一言不支持此参数	|
|topP		|number	|否		|1					|采样方法,数值越小结果确定性越强;数值越大,结果越随机													|百度文心一言不支持此参数	|
雪洛's avatar
雪洛 已提交
154

雪洛's avatar
雪洛 已提交
155 156
**messages参数说明**

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
157
需注意messages末尾有个`s`,它是数组,而不是简单的字符串。其中每项由消息内容content和角色role组成。
雪洛's avatar
雪洛 已提交
158

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
159 160 161 162 163 164 165 166 167 168
一个最简单的示例:

```js
await llm.chatCompletion({
  messages: [{
    role: 'user',
    content: '你好'
  }]
})
```
雪洛's avatar
雪洛 已提交
169

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
role,即角色,有三个值:

- system 系统,对应的content一般用于对话背景设定等功能。system角色及信息如存在时只能放在messages数组第一项。baidu不支持此角色
- user 用户,对应的content为用户输入的信息
- assistant ai助手,对应的content为ai返回的信息

当开发者需要为用户的场景设置背景时,则需在云端代码写死system,而用户输入的问题则被放入user中,然后一起提交给LLM。

例如,提供一个法律咨询的ai咨询助手。

开发者可以在system里限制对话背景,防止ai乱答问题。然后给用户提供输入框,假使用户咨询了:“谣言传播多少人可以定罪?”,那么拼接的message就是:

```js
const messages = [{
    role: 'system',
    content: '你是一名律师,回答内容仅限法律范围。'
  },{
    role: 'user',
    content: '谣言传播多少人可以定罪?'
  }]
```

雪洛's avatar
雪洛 已提交
192
对于不支持system的情况,如baidu,只能把system对应的内容写到第一条user信息内,也可以达到一定范围内的控制效果。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
193

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
194
> 注意:对于法律、医学等专业领域需要准确回答的,建议使用gpt-4模型。其他模型更适合闲聊、文章内容生成。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
195 196 197 198 199 200 201 202 203

assistant这个角色的内容,是ai返回的。当需要持续聊天、记忆前文时,需使用此角色。

因为LLM没有记忆能力,messages参数内需要包含前文,LLM才能记得之前聊天的内容。

以下的messages示例,是第二轮ai对话时发送的messages的示例。在这个示例中,第一个user和assistant的内容,是第一轮ai对话的聊天记录。
最后一个user是第二轮对话时用户提的问题。

因为用户提问的内容“从上述方法名中筛选首字母为元音字母的方法名”,其中有代词“上述”,为了让ai知道“上述”是什么,需要把第一轮的对话内容也提交。
雪洛's avatar
雪洛 已提交
204 205 206 207

```js
const messages = [{
    role: 'system',
雪洛's avatar
雪洛 已提交
208
    content: '以下对话只需给出结果,不要对结果进行解释。'
雪洛's avatar
雪洛 已提交
209 210
  },{
    role: 'user',
雪洛's avatar
雪洛 已提交
211
    content: '以数组形式返回nodejs os模块的方法列表,数组的每一项是一个方法名。'
雪洛's avatar
雪洛 已提交
212 213
  }, {
    role: 'assistant',
雪洛's avatar
雪洛 已提交
214
    content: '以下是 Node.js 的 os 模块的方法列表,以数组形式返回,每一项是一个方法名:["arch","cpus","endianness","freemem","getPriority","homedir","hostname","loadavg","networkInterfaces","platform","release","setPriority","tmpdir","totalmem","type","uptime","userInfo"]'
雪洛's avatar
雪洛 已提交
215 216
  }, {
    role: 'user',
雪洛's avatar
雪洛 已提交
217
    content: '从上述方法名中筛选首字母为元音字母的方法名,以数组形式返回'
雪洛's avatar
雪洛 已提交
218 219 220
  }]
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
221
在持续对话中需注意,messages内容越多则消耗的token越多,而LLM都是以token计费的。
雪洛's avatar
雪洛 已提交
222

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
223
token是LLM的术语,ai认知的语言是经过转换的,对于英语,1个token平均是4个字符,大约0.75个单词;对于中文,1个汉字大约是2个token。
雪洛's avatar
雪洛 已提交
224

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
225
如何在节省token和保持持续对话的记忆之间平衡,是一个挺复杂的事情。开发者需在适合时机要求ai对上文进行总结压缩,下次对话传递总结及总结之后的对话内容以实现更长的对话。
雪洛's avatar
雪洛 已提交
226

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
227 228 229 230
DCloud在[uni-im](https://uniapp.dcloud.net.cn/uniCloud/uni-im.html)[uni-cms](https://uniapp.dcloud.net.cn/uniCloud/uni-cms.html)中,
已经写好了这些复杂逻辑。开发者直接使用DCloud封装好的开源项目模板即可。

在上述例子中,还可以看到一种有趣的用法,即要求ai以数组方式回答问题。这将有利于开发者格式化数据,并进行后置增强处理。
雪洛's avatar
雪洛 已提交
231

雪洛's avatar
雪洛 已提交
232 233
**可用模型**

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
每个AI Provider可以有多个model,比如对于openai,ChatGPT的模型是`gpt-3.5-turbo`,而gpt-4的模型就是`gpt-4`。不同模型的功能、性能、价格都不一样。

也有一些AI Provider只有一个模型,此时model参数可不填。

如果您需要非常精准的问答,且不在乎成本,推荐使用`gpt-4`。如果是普通的文章内容生成、续写,大多数模型均可胜任。

|服务商	|接口			|模型																						|
|---	|---			|---																						|
|openai	|chatCompletion	|gpt-4、gpt-4-0314、gpt-4-32k、gpt-4-32k-0314、gpt-3.5-turbo(默认值)、gpt-3.5-turbo-0301	|
|minimax|chatCompletion	|abab4-chat、abab5-chat(默认值)															|


**chatCompletion方法的返回值**

|参数						|类型				|必备		|默认值	|说明														|兼容性说明				|
|---						|---				|---		|---	|---														|---					|
|id							|string				|openai必备	| -		|本次回复的id												|仅openai返回此项		|
|reply						|string				|是			| -		|ai对本次消息的回复											|						|
|choices					|array<object>|否			|-		|所有生成结果												|百度文心一言不返回此项	|
||--finishReason		|string				|否			|-		|截断原因,stop(正常结束)、length(超出maxTokens被截断)	|						|
||--message			|object				|否			|-		|返回消息													|						|
|  |--role	|string				|否			|-		|角色														|						|
|  |--content|string				|否			|-		|消息内容													|						|
|usage						|object				|是			|-		|本次对话token消耗详情										|						|
||--promptTokens		|number				|否			|-		|输入的token数量											|minimax不返回此项		|
||--completionTokens	|number				|否			|-		|生成的token数量											|minimax不返回此项		|
||--totalTokens		|number				|是			|-		|总token数量												|						|

雪洛's avatar
雪洛 已提交
262

雪洛's avatar
雪洛 已提交
263 264 265
**示例**

```js
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
266 267 268 269 270 271 272 273 274
const llmManager = uniCloud.ai.getLLMManager()
const res = await llmManager.chatCompletion({
	messages: [{
		role: 'user',
		content: 'uni-app是什么,20个字以内进行说明'
	}]
	})
console.log(res);

DCloud_JSON's avatar
DCloud_JSON 已提交
275
```
雪洛's avatar
雪洛 已提交
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299


### 错误码@err-code

在调用uni-cloud-ai提供的api时,如果出现错误,接口会将错误对象抛出。如需处理此类错误需对错误进行捕获

**示例**

```js
try {
  await llm.chatCompletion({
    messages: [{
      role: 'user',
      content: '你好'
    }]
  })
} catch (e) {
  console.log(e.errCode, e.errMsg)
  // TODO 处理错误
}
```

完整错误码列表如下

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
300 301 302 303 304
|错误码	|错误描述					|
|--		|--							|
|50001	|缺少参数					|
|50002	|参数错误					|
|60001	|服务商接口抛出的错误		|
雪洛's avatar
雪洛 已提交
305
|60002	|接口调用凭证、key等信息有误|
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
306 307
|60003	|触发了服务商限流策略		|

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
308
## 非uniCloud服务器调用
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
309

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
310 311 312 313 314 315 316 317 318
如果您需要在非uniCloud的传统服务器调用uni-ai,需要先在uniCloud上创建一个云函数或云对象,加载uni-cloud-ai扩展库,编写上述uni-ai的调用代码。

然后将云函数或云对象进行URL化,转成http接口,[详见](http.md)

如果在您的传统服务器和uniCloud云函数之间需要建立安全通信机制,可使用s2s公共模块,[详见](uni-cloud-s2s.md)

## 后续版本计划

uni-ai会持续快速迭代,未来会陆续提供:
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
319 320 321 322 323 324 325 326 327 328
- stream流式输出
- 聚合更多ai引擎
- 提供私有数据训练方案
- 提供prompt辅助和插件市场
- 后置命令处理

## 常用用途

目前生成式ai的主要用途有:
- 文章生成、润色、续写:常见于生成文案、文书、宣传资料、营销邮件、笑话、诗词等。[uni-cms](https://uniapp.dcloud.net.cn/uniCloud/uni-cms.html)中,已经内置了这个功能
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
329
- 闲聊:情感咨询、常识问答
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
330 331 332 333 334 335
- 翻译:各国各民族语言翻译
- 代码注释补充和简单代码生成:需使用openai,其他provider在代码领域的能力暂时还不行

如对生成内容有较高的准确性要求,一方面使用gpt-4等高级的模型;另一方面需要追加专业甚至私有的语料训练。目前gpt-4未开放微调,但uni-ai正在开发其他私有数据训练方案,后续会升级提供。


DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
336
## 合规注意
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
337 338 339 340 341

国内使用ai,需注意合规性。

- ai生成的文章,如发布到互联网上,应当调用内容安全审查后再发布。比如[uni内容安全](https://ext.dcloud.net.cn/plugin?id=5460)[uni-cms](https://uniapp.dcloud.net.cn/uniCloud/uni-cms.html)已经内置了uni内容安全,只需在配置里开启即可。
- 如开放给用户聊天使用,也应该通过内容安全来管控,避免出现违法违规内容,导致被下架