Grad student at the University of Ottawa. I build AI that runs on the device instead of behind an API, and I keep the state on disk so I can go back and check what it did.
The thing that keeps pulling me back is one specific annoyance: an answer arrives in a chat window, the tab closes, and next week I'm asking the same question from scratch. Most of what's below is some attempt at that. A correction I can replay. A tool call that either validates or fails loudly. A log I can open the next morning.
I'm in Ottawa. Email is bwang105@uottawa.ca.
A chat-first iPhone app. A fine-tuned on-device model reads what you said, picks exactly one of five capabilities (music, messaging, navigation, web search, a direct answer), and puts the result back in the conversation. The routing decision never leaves the phone.
The model lives in kAir-models: Qwen3.5-0.8B with a LoRA adapter trained on Apple Silicon via MLX-LM, a closed catalog of five tools, and a frozen JSON schema, so a malformed call fails validation instead of failing quietly. Artifacts are meant to go out in three layers (HF → GGUF → Core ML / ONNX); the Core ML export is scaffolded and I haven't exercised it yet.
The eval is 22 examples. That shows the pipeline runs end to end and nothing more, and the README says not to deploy it.
The main interface is a correction box, not a dashboard. When the assistant gets something wrong you fix it, and the fix stays as local evidence instead of disappearing into chat history.
State sits in local JSON: conversations, memory, tasks, review queue. Retrieval is a BM25 variant with IDF, document-length normalization, Chinese bigrams and recency weighting. With no API key it still runs on deterministic fallback replies; with one, the key stays server-side.
Regmark takes a product and checks whether the shop tells the same story about it in four places: the page, its JSON-LD, the merchant feed, and the AI-agent endpoints. When price, stock or shipping disagree, it says which surface is wrong and by how much.
The checkout probe is a separate, opt-in step. Putting an item in a cart writes to the shop, so it only runs with --checkout and proof that the shop is yours.
17 rules. npx regmark demo runs it against a shop with known problems; in CI it fails when a rule goes over budget and writes SARIF, JUnit, JSON, Markdown or a single self-contained HTML report.
CERT r4.2: 330,285 user-day windows, 1,364 of them malicious. Stage one is an XGBoost screener that cuts the queue to the top 3% of ranked windows while keeping 89.74% of the malicious ones, about a 30× reduction in what a person has to read. Stage two writes graph-informed narratives and scores them with TF-IDF, rules and an LLM.
Best fusion run: 0.81 recall at F1 0.43. Plain TF-IDF plus logistic regression was still the strongest single model, which is why the LLM only scores stage two. Course project for CSI 5388, Group 8.
A Tencent PCG QQ-track hackathon prototype. It reads a group chat where everyone wants a different dinner, turns the scattered constraints into an editable vote card, and waits for you to approve it. It doesn't post on your behalf unless you say so, and it leaves a memory trail afterwards.
Six directional interviews sit behind it, all with university students who use QQ groups. Four raised AI overreach or monitoring concerns, and the permission step exists because of that.
The public repo is a sanitized showcase. The local project has a MaaS key and competition material in it, so it stays private.
| Revo | Trade-in marketplace for second-hand electronics: cart, checkout, multi-city pricing, order tracking. The FastAPI + PostgreSQL backend and the storefront are mirrored under my account. |
| Career CoPilot | uOttawa ELG/DTI/GNG 5902, Team 8. An AI-powered career platform: resume rewrite with ATS checks, an interview simulator, verified profiles. The repo holds the plan for taking an existing MVP to production, not the app code. |
| Go!Gosling | Pre-launch site for a desktop-first open-source agent. No build step, English / French / Chinese, a waitlist instead of an App Store link. |
| Real-Time Object Detection | YOLO11 + OpenCV over webcam, video or RTSP, picking CUDA, Apple MPS or CPU on its own. |
- Write the contract first. Markdown spec, JSON schema, acceptance criteria, then code. Skip it and I rewrite the thing twice.
- No keys in public repos. Nothing public here carries an API key, a real conversation, or competition material.
- Put the caveat next to the number. 22 eval examples is 22; a 0.41% positive rate changes what an F1 means.
- Keep a gate between "it runs" and "it ships." Tests, smoke runs, and for multi-agent work an explicit contract each side has to satisfy.
I use AI heavily while building. The diff still gets read, and the merge is my call.
AI / ML — Python, PyTorch, MLX, LoRA / QLoRA, Qwen, XGBoost, scikit-learn, OpenCV, Ultralytics YOLO Apple — Swift, SwiftUI, Core ML, iOS 17+ app architecture Web / backend — FastAPI, Node.js, TypeScript, React, PostgreSQL, SQLite, REST Everyday — git, GitHub Actions, Docker, a lot of markdown
kairwang.cloud · LinkedIn · bwang105@uottawa.ca
中文介绍
渥太华大学研究生。项目都不大,共同点是模型尽量跑在本机,做完的事都留得下能查的记录。
- kAir:聊天优先的 iOS 应用。端侧微调过的 Qwen3.5-0.8B 读懂一句话,从五个能力里选一个(音乐、消息、导航、搜索、直接回答),结果回到对话里。路由这一步不出手机。配套的 kAir-models 负责工具路由:LoRA 加冻结的 JSON schema,五个工具,产物按三层走(HF → GGUF → Core ML / ONNX),Core ML 那层搭好了但还没跑通。评估只有 22 条,README 里写明了不要部署。
- Personalized Learning Assistant:本地优先的学习助手,主界面是纠错框,不是仪表盘。你纠正它的地方会作为本地证据留下来。状态全在本地 JSON,检索是自己写的 BM25 变体(IDF、文档长度归一、中文二元组、时效权重),没有 API key 也能离线跑。
- Regmark:开源的店铺一致性审计工具。同一个商品在页面、JSON-LD、商品 Feed 和 AI agent 端点各说各话时,它把差异指出来。结账探测是可选步骤,要先证明店铺是你的才会跑。17 条规则,能进 CI。
- Hierarchical Insider Threat Detection:课程项目。XGBoost 把 CERT r4.2 的 33 万个 user-day 筛到前 3%,同时保住 89.74% 的恶意窗口;第二阶段用图信息生成叙述再打分,融合后召回 0.81。
- 小虾 / QQ Claw:腾讯 PCG QQ 赛道黑客松作品。把群里散落的约束变成一张可编辑的投票卡,先问你,再发出去。
Last updated: 2026


