HBuilderX3.8.5+支持在本地调试云函数时使用uni-ai计费网关
注意
如果HBuilderX版本过低,在云函数的扩展库界面里找不到uni-ai。
LLM,全称为LargeLanguageModels,指大语言模型。
LLM的主要特点为输入一段前文,可以推导预测下文。
LLM不等于ai的全部,除了LLM,还有ai生成图片等其他模型。
用法:uniCloud.ai.getLLMManager(ObjectGetLLMManagerOptions);
参数说明GetLLMManagerOptions
您可以自行去大模型厂商处注册并填写相应的apiKey的参数。也可以通过DCloud来购买,即使用uni-ai计费网关。
uni-ai计费网关使用门槛低,并且可以一处充值,多模型体验。您无需在多个大模型厂商处申请,只需向DCloud购买token套餐,即可体验各种大模型的效果。
uni-ai计费网关的token计费单价与大模型厂商的定价相同,支持开具发票。
如何使用uni-ai计费网关
uni-ai计费网关目前支持付费使用国内大模型厂商minimax,以及微软与openai合作提供的基于azure的ChatGPT3.5(与openai的ChatGPT3.5一致)。
示例
在云函数或云对象中编写如下代码调用LLM服务:
//使用uni-ai计费网关,不指定provider,默认会走minimaxconstllmManager=uniCloud.ai.getLLMManager()//使用uni-ai计费网关,指定provider为azureconstllmManager=uniCloud.ai.getLLMManager({provider:'azure'})//不使用uni-ai计费网关,自行使用openaiconstllmManager=uniCloud.ai.getLLMManager({provider:'openai',apiKey:'yourkey',proxy:'www.yourdomain.com'//也可以是ip})如何测试是否配置成功
在您使用uni-ai计费网关后,且在云函数代码中做好配置后。您可以:
appId参数说明
使用uni-ai计费网关时,在云函数url化、定时触发、云函数单实例多并发,这3个场景需要传递客户端appId,即您应用的manifest.json里的appid。
关于proxy参数的说明
云函数无法直接连同openai的服务器,您需要自行配置代理。如果使用的代理需要用户名和密码,请在代理地址中加入用户名和密码,例如:username:password@host:port。
uni-ai在请求openai时会自动将openai的域名替换为配置的代理域名或ip,一般的反向代理服务器均可满足此需求。
在云函数或云对象中编写如下代码:
用法:llmManager.chatCompletion(ObjectChatCompletionOptions)
参数说明ChatCompletionOptions
messages参数说明
需注意messages末尾有个s,它是数组,而不是简单的字符串。其中每项由消息内容content和角色role组成。
一个最简单的示例:
awaitllmManager.chatCompletion({messages:[{role:'user',content:'你好'}]})role,即角色,有三个值:
当开发者需要为用户的场景设置背景时,则需在云端代码写死system,而用户输入的问题则被放入user中,然后一起提交给LLM。
例如,提供一个法律咨询的ai咨询助手。
开发者可以在system里限制对话背景,防止ai乱答问题。然后给用户提供输入框,假使用户咨询了:“谣言传播多少人可以定罪?”,那么拼接的message就是:
constmessages=[{role:'system',content:'你是一名律师,回答内容仅限法律范围。'},{role:'user',content:'谣言传播多少人可以定罪?'}]对于不支持system的情况,如baidu,只能把system对应的内容写到第一条user信息内,也可以达到一定范围内的控制效果。
assistant这个角色的内容,是ai返回的。当需要持续聊天、记忆前文时,需使用此角色。
因为LLM没有记忆能力,messages参数内需要包含前文,LLM才能记得之前聊天的内容。
以下的messages示例,是第二轮ai对话时发送的messages的示例。在这个示例中,第一个user和assistant的内容,是第一轮ai对话的聊天记录。最后一个user是第二轮对话时用户提的问题。
因为用户提问的内容“从上述方法名中筛选首字母为元音字母的方法名”,其中有代词“上述”,为了让ai知道“上述”是什么,需要把第一轮的对话内容也提交。
constmessages=[{role:'system',content:'以下对话只需给出结果,不要对结果进行解释。'},{role:'user',content:'以数组形式返回nodejsos模块的方法列表,数组的每一项是一个方法名。'},{role:'assistant',content:'以下是Node.js的os模块的方法列表,以数组形式返回,每一项是一个方法名:["arch","cpus","endianness","freemem","getPriority","homedir","hostname","loadavg","networkInterfaces","platform","release","setPriority","tmpdir","totalmem","type","uptime","userInfo"]'},{role:'user',content:'从上述方法名中筛选首字母为元音字母的方法名,以数组形式返回'}]在持续对话中需注意,messages内容越多则消耗的token越多,而LLM都是以token计费的。
token是LLM的术语,ai认知的语言是经过转换的,对于英语,1个token平均是4个字符,大约0.75个单词;对于中文,1个汉字大约是2个token。
如何在节省token和保持持续对话的记忆之间平衡,是一个挺复杂的事情。开发者需在适合时机要求ai对上文进行总结压缩,下次对话传递总结及总结之后的对话内容以实现更长的对话。
在上述例子中,还可以看到一种有趣的用法,即要求ai以数组方式回答问题。这将有利于开发者格式化数据,并进行后置增强处理。
model参数说明@model
每个AIProvider可以有多个model,比如对于openai,ChatGPT的模型是gpt-3.5-turbo,而gpt-4的模型就是gpt-4。不同模型的功能、性能、价格都不一样。
也有一些AIProvider只有一个模型,此时model参数可不填。
模型最大上下文token数、字数限制
openaigpt-3.5-turbo:4097azuregpt-3.5-turbo:8192abab4-chat、abab5-chat:4096
baidu文心千帆最后一个message的content长度(即此轮对话的问题)不能超过2000个字符;如果messages中content总长度大于2000字符,系统会依次遗忘最早的历史会话,直到content的总长度不超过2000个字符
tokensToGenerate参数说明
tokensToGenerate指生成的token数量限制,即返回的文本对应的token数量不能超过此值。注意这个值不是总token。
注意此值和传入messages对应的token数量,两者相加不可大于模型最大上下文token数。如果messages对应的token数为1024,当传递的tokensToGenerate参数大于(模型最大上下文token数-1024)时接口会抛出错误。
使用minimax时默认最多生成512个token的结果,也就是返回结果不会很长。如有需求请自行调整此值。
deploymentId参数说明
自行设置apikey调用azure接口时需要传deploymentId,使用uni-ai计费网关访问azure服务时需要传递model而不是deploymentId。目前通过uni-ai计费网关调用azure接口仅支持gpt-3.5-turbo这一个模型。
chatCompletion方法的返回值
在你的云函数中加载uni-cloud-ai扩展库,写下如下代码,ctrl+r运行,即可调用ai返回结果。
新增于HBuilderX正式版3.7.10+,alpha版HBuilderX3.8.0+。
uni-aichatCompletion接口支持传sseChannel参数的用法云端支持新增于2023年6月15日,HBuilderX3.8.5+支持在本地调试云函数时使用此用法。使用uni-ai计费网关流式响应时,sseChannel参数必填
实际上AI是逐渐生成下一个token的,所以可使用流式响应,类似不停打字的打字机那样,让前端用户陆续看到AI生成的内容。
以往云函数只有return的时候,才能给客户端返回消息。在流式响应中,需要云函数支持sse,在return前给客户端一直发送通知。
在调用chatCompletion接口时传递参数stream:true即可开启流式响应。使用uni-ai计费网关时还需要传递sseChannel才可以使用流式响应。
关于使用uni-ai计费网关时使用流式响应的说明
注意:
stream对象有四个事件:
注意,以上事件属于stream对象,不要和sseChannel的事件搞混了,云端调用sseChannel.write客户端就需要使用sseChannel.on('message')进行接受,例如sseChannel并没有optimizedMessage事件。
云函数代码示例
新增于HBuilderX3.8.2
包含AI生成图片等多媒体处理能力
用法:uniCloud.ai.getMediaManager(ObjectGetMediaManagerOptions);
参数说明GetMediaManagerOptions
参数说明ImageGenerationOptions
style参数说明
百度v1接口(AI作画-基础版)支持的风格:探索无限、古风、二次元、写实风格、浮世绘、lowpoly、未来主义、像素风格、概念艺术、赛博朋克、洛丽塔风格、巴洛克风格、超现实主义、水彩画、蒸汽波艺术、油画、卡通画
百度v2接口(AI作画-高级版)不支持传风格,如需指定风格可尝试在提示词内指定
resolution参数说明
百度v1接口支持以下分辨率:10241024、10241536、1536*1024
百度v2接口支持以下分辨率:512512、640360、360640、10241024、7201280、1280720
返回值
参数说明GetGeneratedImageOptions
参数status说明
百度v1接口支持的状态为:'RUNNING'(任务执行中)、'SUCCESS'(任务成功);
百度v2接口支持的状态为:'INIT'(任务创建中)、'WAIT'(任务等待中)、'RUNNING'(任务执行中)、'FAILED'(任务失败)、'SUCCESS'(任务成功);
参数securityCheckResult说明
审核状态有以下几种:'block'(违规)、'review'(需要人工核查)、'pass'(通过审核)
捕获错误的代码示例
try{awaitllmManager.chatCompletion({messages:[{role:'user',content:'你好'}]})}catch(e){console.log(e.errCode,e.errMsg)//TODO处理错误}完整错误码列表如下
常见错误信息
如了解uni-app,但未使用过uniCloud。请参考本章节继续。
注意uni-app客户端连接uniCloud不是通过uni.request。如果调用云函数是uniCloud.callFunction。(如调用云对象是uniCloud.importObject)
constcontent="你能给我提供什么服务"uni.showLoading();uniCloud.callFunction({name:"ai-demo",//这里是你的云函数的名称。如果你的云函数不叫ai-demo请自行更换data:{messages:[{role:'user',content}]}}).then(res=>{console.log(res);uni.showModal({content:JSON.stringify(res),showCancel:false});}).catch(e=>{uni.showModal({content:JSON.stringify(e),showCancel:false});}).finally(()=>{uni.hideLoading()})运行客户端项目,比如运行到web浏览器,即可联调客户端和云端。
如需在非uniCloud的传统服务器调用uni-ai,需要先在uniCloud上创建一个云函数或云对象,加载uni-cloud-ai扩展库,编写上述uni-ai的调用代码。
注意如果使用URL化后,将无法使用stream流式输出。
大语言模型的推理需要消耗很高的GPU算力,调用大模型需要在模型厂商处注册账户和付费。
uni-ai计费网关支持调用minimax、微软azureopenaiChatGPT3.5的对话接口,调用getLLMManager时如果不传provider会默认使用minimax作为服务商。
调整完毕后上传依赖uni-ai的云函数/云对象即可,注意即使没有修改也需要重新上传。
免费版取消后使用免费版可能遇到的错误
在免费版停用后,如果连接云端云函数时未使用uni-ai计费网关且未自行传递key信息,且未在2023年6月15日0点后更新云函数,则会遇到tokenisunusable错误。如果使用在2023年6月15日0点后更新了云函数,则会提示尚未购买uni-ai套餐。
此外使用HBuilderX3.8.4及之前的版本本地运行时无法使用uni-ai计费网关,因此也会遇到tokenisunusable错误。请使用云端云函数进行调试。
如何测试是否配置成功
使用uni-ai计费网关时,如需本地运行需要使用HBuilderX3.8.5及以上版本。