#我的鸿蒙开发手记#鸿蒙原生编程语言仓颉与AI融合擦出新火花 原创

funnyLUO2025
发布于 2025-5-7 08:43
浏览
0收藏

#我的鸿蒙开发手记#鸿蒙原生编程语言仓颉与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"
      }
    ]
  }
}

这里添加了访问互联网的权限。

最终,示例效果如下:

#我的鸿蒙开发手记#鸿蒙原生编程语言仓颉与AI融合擦出新火花-鸿蒙开发者社区

更多演示效果,可以见B站视频

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐