让 AI Agent 用一页 HTML 回答问题:Answer me with HTML 介绍与上手
一个把 Markdown 草稿渲染成可读 HTML 页面的 agent skill,模型只写内容,排版和绘图交给 CLI。
前言
用 AI Agent 写代码、做调研,经常会遇到一个问题:回答太长,读不动。
一大段终端文字里夹着流程、对比和结论,读完还要自己在脑子里画图。Karpathy 也提到过,随着 LLM 承担的工作越来越多,"跟上它的输出"本身变成了瓶颈,而图表和网页比纯文本好吸收得多。
最近看到一个叫 Answer me with HTML 的开源项目,思路很直接:让 Agent 用一页排版好的 HTML 来回答复杂问题。这篇文章介绍它是什么、怎么工作、怎么安装使用,以及我认为适合和不适合的场景。
它是什么
这是一个 agent skill,MIT 协议,兼容 Claude Code、Codex、Cursor、OpenCode 等能执行 shell 命令的 Agent。
装好之后,你照常提问:
> 解释一下 TCP 三次握手
> 梳理一下这个仓库的模块是怎么组织的
> Redis 还是 Memcached?
Agent 会判断这个问题值不值得做成页面。值得的话,它写一份简短的 Markdown 草稿,交给 skill 自带的 CLI(am),大约 50ms 后就得到一个单文件 HTML 页面,里面有时序图、状态图、对比表格等内容。
它不会滥用:一句话能答完的问题(比如 ls 怎么显示隐藏文件),依然只回一句话。
为什么不直接让模型写 HTML
模型现在写 HTML 已经不差,但项目作者发现了两个实际问题:
- 慢:一个像样的页面要一两分钟,时间大多花在几乎每次都一样的 CSS 上。
- 图不可靠:SVG 坐标要模型手算,箭头常常指向空白处。
作者统计了 9 个模型手写的页面,平均 4,893 tokens,构成如下:
| 页面组成 | 占比 | 使用该 skill 后 |
|---|---|---|
| SVG 图(坐标、路径) | 47% | CLI 生成 |
| CSS | 15% | CLI 生成 |
| HTML 标签 | 17% | CLI 生成 |
| 文字内容 | 21% | 模型以 Markdown 写 |
也就是说,真正属于"内容"的只有大约五分之一。
作者的对比测试(Claude Sonnet 5.5,3 个话题各跑 3 次取中位数)结果:
| 直接要 HTML | 使用 skill | |
|---|---|---|
| 模型输出 tokens | 4,893 | 612 |
| 耗时 | 31 s | 12 s |
输出 token 约少 8 倍,耗时约快 2.6 倍。需要说明的是,整体账单只下降约 15%,因为每一轮对话仍然要读取 system prompt、你的问题和历史上下文,这部分成本 skill 省不掉。另外这是作者自己的小规模测试,数据请当参考。
工作原理
核心思想是一句话:模型只负责内容,CLI 负责排版和绘图。
模型写的草稿大概长这样(节选自项目示例):
---
title: TCP three-way handshake
---
## A Three-way handshake {span=2}
```sequence num
Client -> Server: SYN, seq=x
Server -> Client: SYN+ACK, seq=y, ack=x+1
Client -> Server: ACK, ack=y+1
note Client, Server: ESTABLISHED
```
## C State changes {span=2}
```flow LR
(CLOSED) -> LISTEN: passive open
LISTEN -> SYN_RCVD: get SYN / send SYN+ACK
SYN_RCVD -> *ESTABLISHED: get ACK
```
CLI 接手之后会:
- 选择模板,安排面板(panel)位置
- 应用主题
- 用 dagre 自动布局流程图
- 按标签宽度计算时序图的间距
坐标是算出来的,不是猜出来的,所以标签不会被截断,网格里也不会有空洞。
如果草稿写错了,CLI 会返回出错的行号、组件名和一个正确示例,Agent 通常一次就能修好。
组件一览
Agent 会根据信息的"形状"选择组件:
| 组件 | 适合内容 |
|---|---|
flow |
架构、调用链、决策分支(自动布局) |
er |
数据模型:实体、字段(PK/FK/UK)、关系 |
sequence |
多方之间随时间的消息往来 |
tree |
目录、模块、分类体系 |
timeline |
历史、版本、阶段 |
annot |
对一句话逐词标注 |
callout |
结论、提示、警告 |
ask |
在页面上做决策,Agent 的建议默认选中 |
| 代码块 | 引用真实文件中的代码,或示意代码 |
| 表格 | 多方案对比,单元格写 ok / no / warn 会渲染成 ✓ ✗ ! |
想看某个组件的完整语法,可以运行 am help <component>。
特性
- 单文件、离线:每个页面就是一个
.html,没有 CDN 和 web 字体,打开即用,也方便分享。 - 三套主题:
blueprint(工程图风格)、shadcn(卡片风格)、paper(适合长文阅读),均支持亮/暗模式。 - 引用真实代码:代码块可以用
src=和lines=引用项目文件,页面上展示的就是原代码,不是模型重新敲的。项目目录之外的文件以及存放密钥的文件会被拒绝。 - 页面上直接作答:可以对任意面板写评论,也可以选择
ask里的选项,点击 Reply 后会把这些内容合成一条消息,粘贴回 Agent 即可继续对话。 - 保留源码:页面内嵌了生成它的 Markdown,点 "Copy source" 就能取回。
- 写作检查:基于 ASD-STE100(飞机维修手册使用的受控英语)检查长句、冗词、被动语态等,默认只警告,设为
strict则会拒绝不合格的草稿。 - 多语言:简体中文、繁体中文、英文、日文有专门的按钮和字体,其他语言按英文按钮显示。
安装
需要 Node.js 20 或更高版本,不需要 npm install,CLI 已经打包在 skill 里。
方式一:让 Agent 自己装(推荐)
把下面这句话贴给你的 Agent:
Install Answer me with HTML: read https://raw.githubusercontent.com/QingYunA/answer-me-with-html/main/INSTALL.md and follow it.
方式二:Claude Code 插件
/plugin marketplace add QingYunA/answer-me-with-html
/plugin install answer-me-with-html@answer-me-with-html
方式三:一条命令
npx skills add QingYunA/answer-me-with-html
它会询问要装到哪些 Agent。
方式四:手动复制(以 Claude Code 为例)
git clone --depth 1 https://github.com/QingYunA/answer-me-with-html.git /tmp/answer-me-with-html
cp -R /tmp/answer-me-with-html/skills/answer-me-with-html ~/.claude/skills/answer-me-with-html
装好后问一句 "Explain the TCP three-way handshake",如果得到了一个带图的页面,就说明安装成功。
使用
skill 安装在全局目录,不需要任何项目级配置。进入任意项目启动 Agent,直接提问即可,也可以明确要求,例如"用 HTML 解释一下这个模块"。
生成的页面保存在 ~/.answer-me-with-html/pages/,不在项目目录里,所以不会弄脏你的 git 仓库。
Always-on 模式
默认情况下,只有复杂问题才会生成页面。官方推荐开启 always-on 模式:每当 Agent 给出结论、总结、方案或对比时(哪怕很短),都会附带一个 2 到 4 个面板的小页面,不自动弹出浏览器,只在回复末尾给出 file:// 路径。
开启方法是让 Agent 把一条规则写进规则文件(如 ~/.claude/CLAUDE.md 或 AGENTS.md),README 里提供了现成的提示词可以直接贴给 Agent。关闭时删除这条规则即可。注意 Claude Code 在 plan mode 下不会生成页面。
常用设置
用 slash command 修改,不需要手动改配置文件:
/answer-me-with-html:config # 交互式询问要改什么(插件安装方式)
/answer-me-with-html:config open off # 不自动打开浏览器
终端里也可以直接用 CLI:
am config # 查看设置
am config set open off # 修改设置
am config reset # 恢复默认
am clean # 清理累积的页面
可配置项有 open、theme、mode、style、update_check 和 voice。
额外功能:Explainer 视频
对 Agent 说"做一个 3b1b 风格的 TCP 握手视频",它会在同样的草稿格式上,为每个节点额外写一句旁白,然后由 am video 生成播放器页面:
- 图随着旁白一步步构建,镜头跟随方括号里标注的节点
- 语音内置在页面中,离线可播放
- 带章节条、倍速按钮,以及浏览器端的导出按钮
- 加
--mp4可导出 MP4(需要 ffmpeg),加--webm可导出 WebM(不需要 ffmpeg)
Agent 只会在你明确要求时才做视频。
适合与不适合
适合
- 概念之间有关联,需要"画出来"才好懂的问题
- 多步骤流程、调用链、状态变化
- 多方案对比,需要表格加结论
- 梳理陌生代码库的结构
- 需要在页面上对方案做选择,再把决定回传给 Agent
不太适合 / 需要注意
- 简单问题没必要,好在它默认不会触发
- 依赖能执行 shell 命令的 Agent
- always-on 模式下,每次回复都多一步生成,会增加少量延迟
- 页面会持续累积,需要定期
am clean - 性能数据来自作者自己的小规模测试,实际效果取决于你的模型和问题
小结
这个项目的价值不只在"把回答变成网页",更在它的做法:
- 把模型不擅长又高度重复的部分交给确定性代码,比如坐标计算和 CSS。
- 让模型只写内容,用 Markdown 草稿作为中间表示,大幅减少输出量。
- 用结构化的报错让 Agent 自我修正,而不是靠重试碰运气。
这个思路可以迁移到很多"让 LLM 生成结构化产物"的场景。如果你经常被 Agent 的长文本回答淹没,值得装上试试。
参考链接
- 项目仓库:https://github.com/QingYunA/answer-me-with-html
- 项目网站:https://answer-me-with-html.com/
- 完整参考文档:https://github.com/QingYunA/answer-me-with-html/blob/main/docs/reference.md