我们在上一篇中讲了 Agent + Markdown 作为私有知识库的可能性,今天我想分享一些我对 Markdown 的认识。

我与 Markdown 的不解之缘

我已经记不清第一次看到 Markdown 这个词是什么时候了,或许是第一次接触开源项目,看到项目下的 README.md,又或许是当年玩博客的时候,寻找好用的编辑器的时候发现的。

总之它在我的工作和生活中,出现的频率越来越高。因为我是一个程序员,所以接触得算是比较早的。早期只用它来写项目的文档。后来用 hugo 搭建了基于 Markdown 的个人网站,这样我可以把更多精力放在内容输出上,不用管排版这些琐事。再后来,市面上涌现了诸如 Obsidian、Logseq 这样优秀的双链笔记软件,它们无一例外地将 Markdown 作为底层格式,让它一跃成为了个人知识库管理(PKM)的绝对主力。现在呢,作为AI应用的开发者,几乎每天都用到它,因为几乎所有主流大模型的 API 在默认情况下都采用 Markdown 格式进行输出。

大模型的通用语言

你有没有好奇过,你在与AI对话的时候,AI应用是怎么展现那么丰富且有层次的内容的?比如下图是我与 Grok 的对话,它的回答包含了表格、无序列表。

Grok回答渲染效果

这只是比较简单的回答,它的表现力远不止于此。那它是怎么实现的?答案是 Markdown。模型层面给出的内容如下图:

Grok回答原始内容

我们可以把一个AI应用分成2个抽象层:模型层应用层。当我们发起提问时,应用层将问题转发给模型;模型经过计算,生成纯文本的 Markdown 内容作为回答;而像 Grok 网页端或手机 APP 这样的应用层,在接收到 Markdown 后,会利用内置的渲染器将其转换成丰富的视觉效果呈现给我们。这形成了一个完整的交互闭环:

  flowchart TD
    User((用户))

    subgraph App [应用层]
        Input[对话输入框]
        Renderer[Markdown 渲染器]
        Output[富文本视图展现]
        Renderer --> Output
    end

    subgraph Model [模型层]
        LLM(大语言模型)
    end

    User -- "1. 提问/输入提示词" --> Input
    Input -- "2. 转发请求" --> LLM
    LLM -- "3. 返回 Markdown 纯文本" --> Renderer
    Output -- "4. 呈现最终结果" --> User

所以,我们可以简单粗暴地理解为:Markdown 是大语言模型向人类表达世界的通用语言。

连接物理世界的桥梁

再问一个问题,你有没有好奇过,当你在AI对话框里上传一个文件,让AI帮你处理内容的时候,AI是怎么理解你的文件的?

答案还是 Markdown,AI应用会先通过一些技术来把你的文件(如:PDF、Word、Excel 和 PPT 等)转成 Markdown 文本格式,然后和你的提示词一起发送给大模型。反之,如果你让它帮你导出到新的文件里,应用层又做一次 Markdown -> 文件的转换。

基于这个需求,催生了转换工具项目,比较知名的有:

  • markitdown, 微软开源的 Python 工具,用于把 PDF、Word、Excel 和 PPT 等文件转换成 Markdown
  • pandoc,用于将 Markdown 转换成各种文件,诞生于 AI 时代之前,但这几年很火爆

这其实就是一个跨越“物理世界”与“AI 世界”的双向转换过程:

  flowchart LR
    subgraph 物理世界
        File1[PDF/Word/Excel 等源文件]
        File2[新的文档文件]
    end

    subgraph 转换工具层
        App1(比如 markitdown)
        App2(比如 pandoc)
    end

    subgraph AI模型层
        MD[Markdown 纯文本]
        LLM((大语言模型))
    end

    File1 -- "1. 用户上传" --> App1
    App1 -- "2. 解析转换" --> MD
    MD -- "3. 提供上下文" --> LLM
    LLM -- "4. 处理并输出" --> MD
    MD -- "5. 导出" --> App2
    App2 -- "6. 生成" --> File2

超丰富的表现力

我们再来看下 Markdown 的表现力

Markdown 的出现,最早是用来解决排版和可读性问题,发展到今天如此繁荣,为了适应各种场景,又引入了各种插件。

比如数学领域: 借助 MathJax 或 KaTeX 这样的渲染引擎插件,我们可以直接在 Markdown 中书写复杂的数学公式,而大模型在解答数理化问题时,也会自然地输出这类格式。通常只需用 $$$ 把公式代码包裹起来。例如,质能方程可以写成 $$E = mc^2$$ ;稍微复杂的积分公式,AI 也能轻松写出并在页面上完美渲染:

$$ \int_{a}^{b} x^2 dx = \frac{b^3 - a^3}{3} $$

以上代码会被渲染为:

比如图表:Mermaid Mermaid 是一个基于 JavaScript 的图表绘制工具。它允许你直接使用文本和代码来创建时序图、流程图、甘特图等。过去程序员要画一张架构图得在软件里拖拽半天,现在只要在 Markdown 代码块里标注 mermaid,用几行文本就能生成出直观的图表。因为它的本质是纯文本,这恰恰是大模型最擅长输出的格式!

例如,上面用来展示模型层应用层的交互框架图,也是通过 mermaid 渲染而成的,它的原始代码长这样:

  flowchart TD
    User((用户))

    subgraph App [应用层]
        Input[对话输入框]
        Renderer[Markdown 渲染器]
        Output[富文本视图展现]
        Renderer --> Output
    end

    subgraph Model [模型层]
        LLM(大语言模型)
    end

    User -- "1. 提问/输入提示词" --> Input
    Input -- "2. 转发请求" --> LLM
    LLM -- "3. 返回 Markdown 纯文本" --> Renderer
    Output -- "4. 呈现最终结果" --> User

结语

今天,在各种工具和 AI 的加持下,我们只需几行纯文本,就能瞬间撬动复杂的图表与精美的排版,获得了前所未有的效率提升。它帮我们把耗在“形式”上的时间夺回来,让我们能更专注于思考和“内容”本身。

本文也是用 Markdown 搓出来的 🤗