目录
引言
在人工智能与物联网技术飞速发展的今天,嵌入式系统作为连接物理世界与数字世界的桥梁,承担着越来越重要的角色。智能体与嵌入式系统紧密相连、相互赋能。智能体为嵌入式系统注入 “智慧”,使其具备自主决策与交互能力;嵌入式系统则为智能体提供运行载体,二者结合极大拓展了应用边界。
CangjieMagic 智能体框架凭借其高效、灵活的特点,成为众多开发者在嵌入式场景下实现智能应用的有力工具。本文将以树莓派 4B 为硬件平台,带领大家深入体验 CangjieMagic 智能体框架在嵌入式系统中的实战应用。
CangjieMagic 对嵌入式开发板的要求
CangjieMagic 智能体框架是基于仓颉编程语言构建的 LLM Agent 开发框架,其主要特点包括:Agent DSL、支持 MCP 协议,支持模块化调用,支持任务智能规划。Cangjie Agent DSL 是一个用于定义和管理 Agent 的专用语言。它允许开发人员通过结构化的系统提示词、工具和各类协作策略来增强 Agent 的功能。
目前CangjieMagic 主要还是在x86、鸿蒙、苹果电脑等几个平台进行开发和测试,开发者缺少对嵌入式开发板的测试。由于Cangjie的runtime没有开源,且只支持x86_64的Linux和Windows,以及AARCH64的Linux和鸿蒙,以及MacOS这几个平台,所以目前还无法在RISC-V平台上运行。本文主要讨论AARCH64的Linux平台,这个也是目前在嵌入式开发板中最多的平台之一。
Cangjie编译器主要支持Ubuntu 18.0以上版本,所以其支持的AARCH64的GCC编译器是7.5以上版本,GLIBC是2.27。所以开发板的系统不应低于这个标准,比如我测试了米尔的TH507开发板,由于其自带镜像的GLIBC是2.25,除非升级镜像中的库文件,否则没法运行Cangjie的代码。测试中还发现,Cangjie编译器cjc对Ubuntu的AARCH64的GCC比较友好,而一些第三方的编译器可能不能很好适配。
我的测试基于树莓派 4B,这是一款性能强劲、功能丰富且价格亲民的单板计算机,配备四核 64 位 ARM Cortex-A72 处理器、最高 8GB 内存,支持千兆以太网、USB 3.0、双频 Wi-Fi 等多种接口。它的优点是镜像不断更新升级,所以适配CangjieMagic要容易些。
编译环境准备
本地编译
Cangjie是可以在树莓派4B上实现本地编译的。需要先从仓颉语言的网站上下载SDK:下载中心-仓颉编程语言官网。在其中选择AARCH64版本的编译器。
下载后解压安装包,然后运行evsetup脚本设置环境变量。
source cangjie/envsetup.sh
先编写了一个简单的 “Hello World” 仓颉程序,存放在名为 “hello_world” 的目录下,源文件为 “hello.cj”。
// hello.cj
main() {
println("你好,仓颉")
}
然后使用下面的命令生成可执行文件main:
cjc hello.cj
编译完成后,会生成可执行文件main。直接运行这个文件,就可以打印"你好,仓颉",这就说明当前的开发板是支持仓颉语言的。
CangjieMagic也是可以本地编译的,但是并不建议这么做,因为CangjieMagic太复杂了,本地编译会非常慢,也可能会因为内存不够崩溃,所以还是建议交叉编译CangjieMagic。
交叉编译
首先需要再x86_64的Ubuntu中安装AARCH64的编译器:
sudo apt install gcc-aarch64-linux-gnu
然后需要拷贝aarch64开发包中以下三个目录的文件到x86_64的Linux软件包的对应目录:
- cangjie/runtime/lib/linux_aarch64_llvm/
- cangjie/modules/linux_aarch64_llvm/
- cangjie/lib/linux_aarch64_llvm/
交叉编译Cangjie程序至少需要以下5个文件:
- Scrt1.o、crti.o和crtn.o文件在/usr/aarch64-linux-gnu/lib/目录下。
- crtbeginS.o和crtendS.o' '文件在/usr/lib/gcc-cross/aarch64-linux-gnu/11目录下( 路径有可能因为操作系统的不同而不同)。
此时需要使用--toolchain <value>或者-B <value>指定编译工具链中,二进制文件存放的路径。二进制文件包括:编译器、链接器、工具链等提供的 C 运行时目标文件(例如 crt0.o、 crti.o等)。在准备好编译工具链后,可以在将其存放在一个自定义路径,然后通过 --toolchain <value> 向编译器传入该路径,即可让编译器调用到该路径下的二进制文件进行交叉编译。
可以对前面的hello.cj进行一下交叉编译:
cjc hello.cj --target aarch64-unknown-linux-gnu -B /usr/aarch64-linux-gnu/lib/ -B /usr/lib/gcc-cross/aarch64-linux-gnu/11
编译完成后,会生成可执行文件main。 使用file命令检查一下确实生成了aarch64的文件。
developer@developer:~/IDEProjects$ file main
main: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
实战测试
程序编写
先建立一个demo目录,然后使用下面的命令创建工程:
cjpm init
添加对本项目的依赖,需要修改新建项目的 cjpm.toml
[dependencies]
magic = { git = "https://gitcode.com/Cangjie-TPC/CangjieMagic.git", branch = "dev" }
拷贝如下代码至 main.cj
中,并在代码中设置大语言模型服务商的 API key。这里使用的是华为云的DeepSeek服务,有关设置可以参考:在CangjieMagic智能体框架中集成华为云的DeepSeek服务-CSDN博客
package demo
import magic.dsl.*
import magic.prelude.*
import magic.config.Config
@agent[model: "deepseek:DeepSeek-R1"]
class BlackCatAssistant {
@prompt(
"你是黑猫警长的助手"
"当接到群众通知后,你需要唱起黑猫警长的专属 BGM 并安抚群众情绪"
)
}
main() {
Config.env["DEEPSEEK_API_KEY"] = "xxxx-s0EOCKOlxbfhJBU_V2KVHw57BBDnRD759eF6didZRS9HD2KhKS36y5s9Q7bMuPRQE0NC6v5bkOdA"
Config.env["DEEPSEEK_BASE_URL"] = "https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/8a062fd4-7367-4ab4-a936-5eeb8fb821c4/v1/"
let agent = BlackCatAssistant()
let result = agent.chat("一只耳来啦")
println(result)
}
对cjpm.toml文件的修改
如果直接对工程实施cjpm build,会出现如下错误:
error: conditional compilation have not supported this condition: 'ohos'
==> /home/developer/.cjpm/git/magic/b7cfcb0216ae48e896f16c20592a7c94689fc380/src/log/log_utils_ohos.cj:8:7:
|
8 | @When[ohos == "true"]
| ^
|
1 error generated, 1 error printed.
这是因为有几个文件只能在ohos下进行编译,所以修改cjpm.toml文件,设置ohos为false。在文件中加入如下代码(2025年6月3日,官方已经把我的pr合并进去了,所以最新的文件中已经包括了下面这一行,不过仅针对本机编译):
[target.aarch64-unknown-linux-gnu]
compile-option = "--cfg \"ohos=false\""
如果是交叉编译,还需要加入-B选项以指定启动文件的位置:
[target.aarch64-unknown-linux-gnu]
compile-option = "-B /usr/aarch64-linux-gnu/lib/ -B /usr/lib/gcc-cross/aarch64-linux-gnu/11 --cfg \"ohos=false\""
上面的路径有可能因为操作系统的不同而不同。
一共有两个cjpm.toml要修改,一个是/home/developer/.cjpm/git/magic/b7cfcb0216ae48e896f16c20592a7c94689fc380目录下的,另一个是demo目录下的。
编译后需要将canjie/runtime目录下aarch64的文件和demo/target目录下的aarch64的文件都打包拷贝到开发板上。
运行结果
使用export LD_LIBRARY_PATH目录设置好所需要的库文件路径,然后运行程序就可以看到结果了。
结束语
智能体和嵌入式系统的结合促进了新技术的融合与创新。随着人工智能算法、机器学习技术的不断发展,智能体可以在嵌入式系统上实现更高级的功能,如基于深度学习的图像识别、自然语言处理等。同时,物联网技术的兴起让嵌入式设备能够连接到网络,智能体可以通过网络获取更多信息,与其他智能体或系统进行交互协作,进一步拓展应用场景。例如,在智慧城市中,分布在各处的嵌入式智能设备(如智能路灯、智能交通信号灯)通过智能体的协同工作,实现资源优化配置和城市管理的智能化。
目前看,仓颉团队的工作中心不在嵌入式系统方面,所以相关的支持还不是很完善,需要我们自己做一些探索和尝试。