
#我的鸿蒙开发手记#鸿蒙原生编程语言仓颉与AI融合擦出新火花 原创
#我的鸿蒙开发手记#鸿蒙原生编程语言仓颉与AI融合擦出新火花
当前DeepSeek国货自研给国家挣了口气!学习AI正当时,另有仓颉、HarmonyOS NEXT 加持,把握时代热点。因此,我将课程“HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)”里面学习到的知识点跟大家分享一下。
什么是仓颉
仓颉编程语言是华为自研的编程语言。虽然是一种比较小众的编程语言,但非常适合用于鸿蒙开发应用设计,需要从多个方面考量:
- 独特性与创新性:要是你的毕业设计追求创新和独特,采用仓颉编程语言能让你的项目在众多作品中脱颖而出。评审老师可能会对这种新颖的尝试产生兴趣。
- 前瞻性:仓颉编程语言也可以开发纯血鸿蒙应用、DeepSeek大模型应用,具有非常强的前瞻性。
普适性:虽然仓颉编程语言是一门新的语言,但仓颉编程语言的语法与市面上主流的开发语言语法类似,比如JavaScript、TypeScript、ArkTS或Java等等。只要会一点编程的你,必然能轻松入门。 - 学习成本:由于仓颉编程语言相对小众,资料和教程有限,自主学习难度较大。如果时间有限,可能难以在规定时间内掌握并完成毕业设计。这里推荐参加视频课程,由专业讲师全程面向0基础讲解,从0到1带领学员快速掌握仓颉编程语言。另外,本课程安排了华为仓颉编程语言入门课程“第4章 智能AI助手项目–快速带你上手仓颉编程语言”,整整有275分钟时长,相信学完这章,便能完全掌握仓颉编程语言的核心语法及常用API了。
与AI融合
课程使用AI大模型包括:讯飞星火Spark Lite、阿里云通义、FLUX、Qwen-Audio、通义万相、DeepSeek等大模型。
为啥要选这些大模型?
讯飞星火、阿里云通义等都是头部AI供应商,业界有比较好的口碑及知名度,采用这些大模型,比较稳定,也有比较好的售后服务。
其次,这些大模型所擅长的领域各不相同,因此,需要针对不同的实现功能来选型大模型。比如,如果是文本内容输出,则可以选用讯飞星火、阿里云通义、DeepSeek;如果是图片识别,则可以选用通义万相等。
最后,课程所选用的大模型,都是免费的。这有利于最低成本学习本课程。要知道,学习本课程的大部分都是在校学生。让学生剩下大模型的费用吃饭的时候加多个鸡腿不香吗?
本课程使用AI大模型接口是 阿里云通义、讯飞星火、DeepSeek等免费模型接口,但实际上你可用按照本课程原理,对接市面上任意大模型,比如ChatGPT ,毕竟市面上的大模型太多了,有收费也有免费。但万变不离其宗!因为,市面主流的大模型接口 无论是 DeepSeek 还是 阿里云通义、讯飞星火 等,都是参考的 ChatGPT 的实现,因此,接口的格式上都是雷同的。
【实战】实现大语言模型接口的调用
本节演示实现大语言模型接口的调用的核心过程。
请求模型
encoding.json 包用于对 JSON 数据的处理,实现 String, JsonValue, DataModel 之间的相互转换。
在src/main/cangjie/
目录下新建api_request.cj:
package ohos_app_cangjie_entry
// 导包
import serialization.serialization.Serializable
import serialization.serialization.DataModel
import serialization.serialization.DataModelStruct
import serialization.serialization.field
import encoding.json.*
/**
API请求调用
*/
public class ApiRequest <: Serializable<ApiRequest> {
public ApiRequest(
public var model: String,
public var messages: Array<Message>
) {}
public func serialize(): DataModel {
DataModelStruct()
.add(field<String>('model', model))
.add(field<Array<Message>>('messages', messages))
}
public static func deserialize(dm: DataModel): ApiRequest {
let dms = match (dm) {
case d: DataModelStruct => d
case _ => throw Exception('this data is not DataModelStruct')
}
ApiRequest(
String.deserialize(dms.get('model')),
Array<Message>.deserialize(dms.get('messages'))
)
}
}
因为ApiRequest引用了Message类,因此,Message也需要做序列化处理:
package ohos_app_cangjie_entry
// 导包
import serialization.serialization.Serializable
import serialization.serialization.DataModel
import serialization.serialization.DataModelStruct
import serialization.serialization.field
import encoding.json.*
public class Message <: Serializable<Message> {
public Message(
public var role: String,
public var content: String
) {}
public func serialize(): DataModel {
DataModelStruct()
.add(field<String>('role', role))
.add(field<String>('content', content))
}
public static func deserialize(dm: DataModel): Message {
let dms = match (dm) {
case d: DataModelStruct => d
case _ => throw Exception('this data is not DataModelStruct')
}
Message(
String.deserialize(dms.get('role')),
String.deserialize(dms.get('content'))
)
}
}
发起HTTP请求
import net.http.HttpRequest
import ohos.net.http.createHttp
import encoding.json.*
import ohos.net.http.HttpRequestOptions
import ohos.net.http.RequestMethod
import ohos.net.http.HttpData
import ohos.net.http.HttpDataType
import std.collection.HashMap
import ohos.hilog.Hilog
// ...省略非核心内容
// 发送按钮
Button('发送')
.shape(ShapeType.Normal)
.height(40)
.width(70)
.fontSize(16)
.fontColor(0xFFFFFF)
.borderRadius(6)
.backgroundColor(0x4397F7)
.onClick(
{
e =>
// 写入到消息列表
let message = Message('user', chatInput)
msgList.append(message)
// 网络请求
let httpRequest = createHttp()
// 构造请求对象
let messages = Array<Message>([message])
let apiRequest = ApiRequest('lite', messages)
let newDm = apiRequest.serialize()
let requestData: String = newDm.toJson().toJsonString()
// 构造请求参数
let option = HttpRequestOptions(
method: RequestMethod.POST,
extraData: HttpData.STRING_DATA(requestData),
expectDataType: HttpDataType.STRING, // 期望返回类型
usingCache: true,
header: HashMap<String, String>(
[
('content-type', 'application/json'),
('accept', 'application/json'),
('authorization', 'Bearer ' + apiToken)
]
)
)
// 发起请求
httpRequest.request(
apiUrl,
{
err, resp =>
if (let Some(e) <- err) {
Hilog.error(0, 'ai', 'exception: ${e.message}')
throw e
}
if (let Some(r) <- resp) {
Hilog.info(0, 'ai', '响应码:${r.responseCode.getValue()}')
Hilog.info(0, 'ai', '响应结果:${r.result.toString()}')
// TODO
} else {
Hilog.error(0, 'ai', 'resp is none')
}
// 销毁
httpRequest.destroy()
},
options: option
)
// 清空对话框
chatInput = ''
}
)
.opacity(sendButtonOpacity)
声明权限
在module.json5配置文件加上对权限的声明:
{
"module": {
// ...省略非核心内容
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
}
}
这里添加了访问互联网的权限。
最终,示例效果如下:
更多演示效果,可以见B站视频
