Yuan Bo袁博

Yuan Bo · @Oldcircle袁博 · @Oldcircle

I build AI agents that show their work. 我做 AI agent,
让每个结论都有据可查。

Agent skills, developer tools, a research paper and some browser games. The ones I like best refuse to guess: a claim has to name the file it came from, observations are sealed before any reasoning starts, and every number is run before it goes on the page.

写 agent skill 和开发者工具,发过一篇论文,也做了些网页小游戏。我最满意的几个项目都不靠猜:结论要说明出自哪个文件,观察先封存、再推理,写到页面上的数字都先实际跑过一遍。

AI master's student at Harbin Institute of Technology, Shenzhen.哈尔滨工业大学(深圳)人工智能方向硕士在读。

  • 188GitHub stars on geo-sleuthgeo-sleuth 的 GitHub 星标
  • AACL2026 main-conference paper2026 主会论文
  • 20+games that run in a browser个网页小游戏

01

Selected work代表作

Two agent skills. Hand either one a photo and ask.两个 agent skill,用法都一样:丢一张照片进去,然后提问。

The photo: a clay oven in a field, a railway viaduct and a mountain behind it Region scan: candidate sites marked in orange across southern China Skyline fit: computed horizons drawn over the photo for the top candidates Answer: camera position and field of view on satellite imagery, within 2 m

Read the photo. Catenary masts on the viaduct mean an electrified railway, the mountain is about 3 km away, and the rice is harvested while the grass is still green. South China, as a bet, not a proof.读图。高架上的杆子是接触网支柱,说明是电气化铁路;陡峭的山在约 3 公里外;稻子已收割,草还绿着。先押华南,是判断,不是证明。

Region scan. Every railway bridge in the region from OpenStreetMap, 27,335 segments, with a 360° horizon computed every 400 m. 171 sites have flat ground nearby, a clear mountain within a few km and a flat horizon beside it.区域扫描。从 OpenStreetMap 取出区域内所有铁路桥,共 27,335 段,每 400 米用高程数据算一次 360° 地平线。附近平坦、几公里内有明显山峰、旁边地平线平坦的,只剩 171 处。

Skyline fit. 14,372 camera positions, each rendered with the ridge line it would see, leave 22. The top three are drawn back onto the photo: #1 only scored well because the oven hides a bump; #2, Qingyuan, fits from the foot of the mountain to the edge of the frame.天际线拟合。14,372 个候选机位各自渲染出能看到的山脊线,剩下 22 个。前三名画回照片核对:第一名的凸起正好藏在烤炉后面;第二名清远从山脚到画面边缘都贴合。

Pier count. The 17 piers in the photo become 17 bearings from the camera, and where they meet the railway the intersections must be evenly spaced. One spot is left: ±2 m, with the direction the camera faced.数桥墩。照片里 17 根桥墩变成从机位出发的 17 条方位线,它们和铁路线的交点必须间距均匀。最后只剩一个点:误差 ±2 米,朝向也一并给出。

Agent skill · Python · MITAgent skill · Python · MIT 协议

geo-sleuth

Finds where a photo was taken, and shows its work. When there is no sign, plate or landmark to read, OpenStreetMap geometry, elevation data, satellite tiles and street view carry the search. Every conclusion points at the command that produced it.

找出一张照片是在哪儿拍的,并把推理过程摊开给你看。照片里没有招牌、车牌、地标可读时,就靠 OpenStreetMap 几何、高程数据、卫星图和街景来搜。每个结论都指向产出它的那条命令。

27,335 → 171 → 22 → 3 → 1

Candidates left after each step, from every railway bridge in the region to one camera position.

每一步之后剩下的候选:从区域内所有铁路桥,一直收窄到一个相机位置。

npx skills add Oldcircle/geo-sleuth

Works with Claude Code, Codex, Cursor, Gemini CLI, OpenCode and GitHub Copilot.支持 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 和 GitHub Copilot。

A real desk photo. The case file is sealed before the first deduction is written.一张真实的桌面照片。写第一条推理之前,观察清单已经封存。

Agent skill · MIT · no API keyAgent skill · MIT 协议 · 无需 API Key

Holmes 福尔摩斯

Reads a photo the way Sherlock Holmes reads a stranger. It lists what it can see and seals the list before it reasons. Each conclusion cites the observations it rests on and offers another explanation, and then you grade it.

像福尔摩斯读陌生人一样读一张照片。先把看到的东西列出来、封存清单,然后才开始推理。每条结论都引用它依据的观察,并给出另一种可能的解释,最后由你来打分。

16observations条观察
6deductions条推理
5hits条命中
1miss条落空
0made up条编造
npx skills add Oldcircle/holmes-skill

Graded by the desk's owner. Works with any agent that reads SKILL.md and can see images.由桌子的主人逐条打分。任何能读 SKILL.md、能看图的 agent 都能用。

02

Tools for agents给 agent 用的工具

Memory that stays in shape, a way of teaching, a one-click setup, and a look inside the loop.让记忆文件不走样,把一套教学法做成 skill,一键装好环境,再看清 agent 每一步在干什么。

$ trellis lint examples/vault --explain

reference-deploy-runbook.md
  ✗ T201:1  not listed in MEMORY.md — unreachable
      → Add a one-line hook to MEMORY.md, or delete the file.

MEMORY.md
  ! T301:13  hook carries a chronicle detail: '2026-04-18'
      → Dates belong in the file or the git log.

project-checkout.md
  ! T303:11  relative time reference: 'last week'
      → Write the absolute date. Memory outlives the session that wrote it.

Python · zero dependencies · MITPython · 零依赖 · MIT 协议

Trellis

The discipline layer for file-based agent memory. Keep the markdown files your agent already understands, and add the budgets, ownership rules and linter that stop them from quietly rotting after a few months.

给文件式 agent 记忆加一层纪律。agent 已经会读的 markdown 文件照旧用,再补上预算、归属规则和一个 linter,免得它们用上几个月就越写越乱。

View on GitHub在 GitHub 上查看 ↗
RuleWhat the learner said
Define each term where it first appears“None of these parameters are defined. I can't follow any of it.”
Every derivation line names its reason“There's no derivation. I can't see where this formula comes from.”
Run a number before writing itNobody complained. It still caught four false statements.
规矩触发它的那句话
术语首现必定义「这一上来这几个参数就没定义啊,搞得我根本看不懂」
推导每行带依据「这里都没有推导,我看不懂这公式是怎么来的」
有数字必先跑没人抗议,但它拦下了四个错误陈述

Claude Code skill · in ChineseClaude Code skill · 中文

deep-lecture

A way of teaching, packaged as a skill. Read the primary sources, run every number, publish a one-page interactive lecture, then patch it in place wherever the learner gets lost.

把一套教学方法做成 skill:先读原始来源,把每个数字跑一遍,做成一页可交互的课件发布出去;学的人哪里没看懂,就当场改哪里。

View on GitHub在 GitHub 上查看 ↗
  • OpenCode
  • Claude Code
  • Kimi Code
  • Qwen Code
  • Codex CLI
  • Gemini CLI
  • Hermes
  • OpenClaw
  • Goose

Press Enter without changing anything to get the recommended three.

什么都不动直接按 Enter,就是推荐的三件套。

Windows · Shell · ChineseWindows · Shell · 中文

wsl-agent-kit

Double-click once on Windows to get WSL2, your pick of nine AI agents and a Chinese office workspace. API keys from Chinese providers work out of the box.

在 Windows 上双击一次:装好 WSL2,从九个 AI agent 里任选,配好中文办公工作区。国内 API Key 即插即用。

View on GitHub在 GitHub 上查看 ↗

03

Research研究

Knowledge graph question answering: let a small model do most of the work, and call the large one only when it is needed.知识图谱问答:大部分活交给小模型,只在确实需要时才调用大模型。

RouterKGQA pipeline: a specialized LLM generates a reasoning path; if the path is unreachable in the knowledge graph, a general LLM repairs it; the query is then executed with constraint relaxation
AACL-IJCNLP 2026 · Main ConferenceAACL-IJCNLP 2026 · 主会

RouterKGQA: Specialized–General Model Routing for Constraint-Aware Knowledge Graph Question Answering

Bo Yuan*, Hexuan Deng*, Xuebo Liu, Min Zhang · *equal contribution· *共同一作

A small specialized model drafts the reasoning path over the knowledge graph. When that path cannot be reached in the graph, a large general model is called in to repair it. Accuracy goes up while the cost stays close to the small model's.

小的专用模型先在知识图谱上生成推理路径;路径在图里走不通时,才调用大的通用模型来修。准确率更高,开销仍接近只用小模型。

+3.57F1 over the previous bestF1 超过此前最好结果
+0.49Hits@1 over the previous bestHits@1 超过此前最好结果
1.15LLM calls per question每题平均 LLM 调用次数

Averaged across benchmarks.各基准上的平均值。

04

Simulations and visual explainers模拟与可视化

Agents living in small worlds, and a model you can look inside.在小世界里自己过日子的 agent,还有一个能钻进去看的模型。

backprop-viz: the loss chapter, with the cross-entropy formula beside the 3D blocks of the LM head and softmax 反向传播可视化:「损失」一章,交叉熵公式旁边是输出头和 softmax 的 3D 方块

Next.js · WebGL · English / 中文Next.js · WebGL · 中英双语

backprop-viz

A 3D walkthrough of a GPT's backward pass. Every block sits where it sits in the forward pass but holds the gradient instead of the tensor. The numbers are computed live and checked against numerical derivatives.

GPT 反向传播的 3D 交互演示。每个方块的位置和前向传播时一样,装的却是梯度而不是张量。数字是实时算出来的,并用数值导数校验过。

Built on Brendan Bycroft's llm-viz.基于 Brendan Bycroft 的 llm-viz。

Anima's Godot front end: a pixel-art seaside town with a bakery, a café and a harbour, and a character's line of dialogue

TypeScript · Godot · DeepSeek

Anima

Seven anime characters share a seaside town, and each one is its own LLM agent. Every tick they decide what to do next from what they need, who they remember and what they can see. Friendships, grudges and gossip come out of the interactions.

七个动漫角色住在同一个海边小镇,每个角色都是独立的 LLM agent。每个 tick,他们根据自己的需求、记得的人和眼前发生的事,决定下一步做什么;友谊、积怨和流言都在互动中自然出现。

> observe()
[Spring 12 · 09:30 · Sunny] Stamina 245/270 · Gold ¥850 · …
> go_to("Pierre")
> till_area(3, 4)
> water_all()
{watered: 30, partial: true, stopped: "low_stamina"}

Python · MCP serverPython · MCP 服务器

Stardew Anima

Lets an LLM play Stardew Valley the way a person does, through 28 intent-level tools for farming, fishing, foraging and talking to villagers. No screenshots, no vision.

让 LLM 像人一样玩星露谷物语:通过 28 个意图级工具种地、钓鱼、采集、和村民聊天。不截图,也不用视觉。

BlockFire: first-person view of a voxel forest with a zombie approaching, rifle and block hotbar in the HUD

Three.js · one HTML file · playableThree.js · 单个 HTML 文件 · 可在线玩

BlockFire 方块火线

Minecraft meets first-person shooter: dig, build walls and hold off waves of zombies. Bullets break blocks, and zombies can't climb more than 1.2 blocks.

我的世界 × 第一人称射击:挖方块、搭工事、守住一波波僵尸。子弹能打碎方块,僵尸爬不上 1.2 格以上的落差。