目录

麒麟 AI 记忆助手 (Kylin AI Memory Agent)

面向 openKylin 的智能体记忆提取与精准遗忘系统——第三届中国研究生操作系统开源创新大赛参赛作品。
作品以deb安装包的形式提供,在OpenKylin 2.0 SP2 x64中测试,不保证在其他系统中稳定运行
作品下载:Kylin AI Memory Agent Download‌
下载链接: https://pan.baidu.com/s/1liRPkCocR5h4F3yjB0sUTA?pwd=1rid 提取码: 1rid

安装方式1

下载网盘所有文件放在同一个目录下
sudo mm-cli -o #开启维护模式之后按提示重启
sudo bash ./install.sh

安装方式2

下载网盘中两个文件:kylin-ai-runtime_1.1.0.1-ok0.11_amd64.deb为系统依赖,kylin-memory-agent_1.0.0_amd64.deb为作品文件
sudo mm-cli -o #开启维护模式之后按提示重启
sudo apt install ./kylin-ai-runtime_1.1.0.1-ok0.11_amd64.deb
sudo apt install ./kylin-memory-agent_1.0.0_amd64.deb
注意:必须先安装kylin-ai-runtime覆盖系统默认的版本,系统默认的版本有兼容性问题
注意2:安装方式1和安装方式2是等价的

功能概览

  • 记忆提取:通过 eBPF LSM 监控用户打开的文件(取完整路径),自动用 Apache Tika 库提取文本、向量化入库。扫描范围限定桌面目录,0 字节/提取失败的文件自动跳过
  • RAG 检索问答:向量搜索 top-K 相关内容(用脱敏后的 chunk 文本)拼入 prompt,调麒麟 AI SDK 回答;对话窗口可下拉切换引擎(自动发现已配置的云端/本地模型)
  • 精准遗忘:自然语言关键词搜索相关记忆,用户确认后永久删除 + 审计
  • 敏感信息识别 + 手动审查:正则 + BERT-NER(ONNX)双重检测 PII / 密钥 / 密码。三种全局模式:自动脱敏全部 / 自动允许全部 / 手动审查。手动模式下命中文件进待审查队列,审查窗口逐条显示类型+上下文、勾选决定脱敏,审查后才入库
  • 文件访问审计:eBPF 记录文件打开事件到 journald + SQLite,可编辑排除规则(exclude.conf)过滤噪音;支持 deny 列表拦截
  • 扫描开关:向量化扫描可通过托盘/控制面板开关(默认关,避免后台计算压力),按需开启;托盘与控制面板状态自动同步
  • GPU 加速:控制面板显示 GGUF(embedding)/ ONNX(敏感检测)的 GPU 启用状态,可按需下载 GPU 推理后端
  • OpenKylin桌面深度集成:系统托盘、peony 右键菜单、ukui 控制面板插件、UKUI 弹窗通知
  • 运行日志面板:统计窗口第三页实时显示全部日志(含 llama / ONNX 子进程、异常栈),与 journald 一致
  • 测试报告:在项目目录下单独提供

架构

┌─────────────── 用户交互 ───────────────┐
│  Swing 对话窗口(托盘常驻 / 快捷键)      │
│  peony 右键菜单 → ~/actions.data        │
│  ukui-control-center 配置面板            │
│  ukui-notification-daemon 通知           │
└────────────────┬──────────────────────┘
                 │
┌────────────────▼──────────────────────┐
│         Java 主程序(常驻后台)          │
│  ActionQueue   轮询 ~/actions.data      │
│  EbpfConsumer  读 journald file-audit   │
│  MemoryManager 解析→检测→向量化→RAG      │
│  SQLite        files/vectors/history/audit
└──────────┬────────────┬───────────────┘
           │            │
    JNI libmain.so   HTTP :8090
    (麒麟 AI SDK)    (llama.cpp embedding)
           │            │
   kylin-ai-runtime   llama-server
   (DeepSeek/Qwen)    (bge/nomic embed)

┌─────────── OS 级机制 ──────────────┐
│  eBPF LSM hook file_open  (机制1)   │
│  systemd-journald 审计    (机制2)   │
│  cgroup v2 资源限制       (机制3)   │
└────────────────────────────────────┘

目录结构

root/
├── Makefile                  顶层构建(编译全部 → stage → deb)
├── cuda-required/            WSL 专用构建(CUDA 编译环境)→ llama + PII
├── ebpf/file-audit-lsm-src/  eBPF 文件审计(C)
├── kylin-jni-v2/             AI SDK JNI 桥接 → libmain.so(C++)
├── llama.cpp/                llama.cpp 源码(已内置)+ build-llama.sh
├── pii-ner/                  PII NER 敏感信息检测(BERT+ONNX,C++)
└── memory-agent/             Java 主程序 + 插件 + 配置
    ├── build.gradle
    ├── src/main/java/
    │   ├── Main.java              入口(守护 / 命令行模式)
    │   ├── core/
    │   │   ├── Storage.java       SQLite 存储
    │   │   ├── FileParser.java    Tika 文本提取 + 分块
    │   │   ├── Embedding.java     llama.cpp HTTP 客户端 + 余弦相似度
    │   │   └── SensitiveDetector.java  正则敏感信息检测 + 脱敏
    │   ├── service/
    │   │   ├── MemoryManager.java 核心引擎(ingest/forget/search/RAG)
    │   │   ├── ActionQueue.java   actions.data 队列消费
    │   │   ├── EbpfConsumer.java  journald file-audit 事件消费
    │   │   └── LlamaServer.java   llama.cpp 进程管理(按需启停)
    │   ├── ui/
    │   │   ├── ChatWindow.java    Swing 对话窗口
    │   │   ├── TrayManager.java   系统托盘
    │   │   ├── StatsWindow.java   统计 + 审计日志窗口
    │   │   └── ModelDiscovery.java 读 GSettings 列模型
    │   └── jni/
    │       ├── KylinAINative.java native 声明
    │       └── KylinAI.java       封装 + dummy 降级
    ├── peony-plugin/         peony 右键菜单插件(C++ Qt)
    ├── ukcc-plugin/          控制面板插件(C++ Qt)
    ├── configs/              systemd user service + 自启动 desktop
    └── models/              embedding 模型 gguf(需自行下载)

以下内容为手动编译deb安装包的流程,非必需流程,建议直接使用网盘中提供的二进制deb文件

编译依赖

sudo apt install build-essential cmake pkg-config g++ clang llvm \
  qt5-qmake qtbase5-dev qtchooser qtbase5-dev-tools qttools5-dev-tools \
  libpeony-dev libukcc-dev libkysdk-qtwidgets-dev \
  libglib2.0-dev libbpf-dev libelf-dev zlib1g-dev linux-tools-generic \
  libkysdk-genai-nlp-dev libkylin-ai-base-dev libkysdk-ai-common-dev \
  default-jdk

# Gradle 7.6(JDK 8 兼容),或更高版本配 JDK 17+
sdk install gradle 7.6.4

# llama.cpp 已包含在 bs/llama.cpp/,无需 git clone
# 编译(自动检测 GPU:有 nvcc 就同时编 CUDA 后端):
cd bs/llama.cpp && ./build-llama.sh
#   ./build-llama.sh cpu    只编 CPU
#   ./build-llama.sh cuda   CPU + CUDA 都编
# 产物在 bs/llama.cpp/dist/,make stage 会自动打包进 deb

# embedding 模型(放入 memory-agent/models/)
huggingface-cli download CompendiumLabs/bge-small-zh-v1.5-gguf \
  bge-small-zh-v1.5-f16.gguf --local-dir memory-agent/models/

PII 敏感信息检测器(BERT NER + ONNX)部分

敏感信息检测走”正则 + BERT NER”双路合并:正则抓固定格式(手机号/身份证/API Key/私钥), NER 抓上下文相关 PII(人名/地址/组织)。NER 是独立 C++ 子进程,Java 用管道协议调用, 30 秒空闲自动回收。

由于这一部分需要cuda-toolkit, 无法在虚拟机中直接编译

所以在安装了cuda-toolkit的 WSL(推荐)里编译,CPU 版打包进 deb,GPU 版由控制面板按需下载:

# --- 在 WSL 里 ---
cd pii-ner
make deps        # 下载 ONNX Runtime(GPU) + nlohmann/json + cuDNN
make package     # 编译 → dist/(CPU .so + GPU .so 分目录)

# 模型放入 dist/model/(训练产物:model_int8.onnx + vocab.txt + labels.json)
# 训练见 pii-ner/scripts/train_ner.py

# 把 dist/ 拷回虚拟机的 pii-ner/ 下

deb 只打包 CPU 的 libonnxruntime.so.1。用户机器有 N 卡时,在麒麟控制面板点 “下载 GPU 推理后端”,会先检测 nvidia-smi,没 GPU 弹”不兼容”,有则下载 GPU 的 .so 到用户目录,下次扫描自动启用 GPU。

构建与安装

重要:不要在 VMware 共享文件夹 / Windows 共享文件挂载盘里编译。 这类文件系统不支持 Unix 符号链接,会导致 llama.cpp 链接 .so 失败 (failed to create symbolic link ... Operation not supported)。 build-llama.sh 已自动在原生路径 ~/.cache/llama-build 里编译再把产物 (已解引用为真实文件)拷回 dist/,所以 llama 部分没问题;但其他模块 (eBPF/JNI/插件)和 dpkg-deb 打包也建议在原生 fs 进行。 **推荐把整个 bs/ 拷到虚拟机的 ~/bs 再 make**,共享文件夹只用于传文件。

cp -r /var/mnt/Desktop/bs ~/bs    # 拷到原生 ext4 路径
cd ~/bs
make            # 编译全部子模块(含 llama.cpp)
make stage      # 收集到 ~/deb_files
make deb        # 打包 .deb

sudo dpkg -i kylin-memory-agent_1.0.0_*.deb   # postinst 自动按 GPU 选 CPU/CUDA 后端
systemctl --user enable --now kylin-memory-agent

GPU 自适应:deb 同时打包 CPU 和 CUDA 后端 .so,安装时 postinst 跑 nvidia-smi 判断——有 N 卡就启用 libggml-cuda.so,没有就只用 CPU。llama.cpp 的 GGML_BACKEND_DL 机制让 llama-server 运行时动态加载对应后端。

CUDA 后端只在目标机器有 N 卡时才有意义。没 GPU 就用默认的 make llama(只编 CPU)。 编 CUDA 需装 nvidia-cuda-toolkit(仅编译不需要物理 GPU,但 toolkit 有几 GB)。

完整构建流程:WSL 编译 + 虚拟机打包

llama 的 CPU/CUDA 后端和 PII 的 binary 需要在 WSL(有 CUDA 编译环境)里编。 虚拟机编本地模块(eBPF/JNI/插件/Java)+ 检查 WSL 产物 + 打包——WSL 产物缺了会直接报错。

# === 第一步:在 WSL 里编译 llama + PII(共享目录,不用拷贝)===
sudo apt install nvidia-cuda-toolkit cmake build-essential libcurl4-openssl-dev unzip

cd /mnt/c/Users/zyf/Desktop/bs/cuda-required
make            # 编 llama(CPU+CUDA) + PII,产物落在各模块 dist/
make check      # 确认产物齐全

# === 第二步:在 openKylin 虚拟机里打包(同一共享目录)===
cd /mnt/Desktop/bs
make deb         # 编本地模块 + 检查 WSL 产物 + 收集 + 打 deb

各目标语义:

  • make local — 只编本地模块(eBPF/JNI/peony/ukcc/Java),不碰 llama/pii
  • make stage — local + 检查 WSL 产物(llama/pii) + 收集到 ~/deb_files(WSL 产物缺则报错)
  • make deb — stage + 打包 .deb

虚拟机不需要 CUDA 环境。WSL 产物缺失时 stage/deb 会报错,提示去 cuda-required 编。

为什么 WSL 能编给 openKylin 用? build-llama.sh 默认加 -static-libstdc++ -static-libgcc, binary 只需 glibc 2.35、库需 2.38,正好 ≤ openKylin 的 2.38(已实测)。

路径:编译中间产物自动放 WSL 原生路径 ~/.cache/llama-build(共享盘不支持软链接), 最终 dist/ 是真实文件放共享盘。不用手动挪,不用拷贝——WSL 和虚拟机看同一份 /mnt/.../bs。 注意别把 LLAMA_BUILD_ROOT 或 STAGE_DIR 指到 /mnt。

纯 CPU 版:若不要 GPU,WSL 里 cd cuda-required && make pii PII_GPU=0, 再单独 cd ../llama.cpp && ./build-llama.sh cpu,虚拟机 make deb 打包。 详见 cuda-required/README.md。

运行时依赖(deb Depends)

libbpf1, libelf1, zlib1g, openjdk-8-jdk,
kylin-ai-runtime (= 1.1.0.1-ok0.11),
libkysdk-genai-nlp0 (= 1.1.0.1-ok1.2),
libkysdk-genai-nlp-dev (= 1.1.0.1-ok1.2)

麒麟 GenAI SDK 用 (= 版本) 锁死:JNI libmain.so 按特定 ABI 编译,版本不一致会有兼容性问题。

关于
2.9 GB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号