摄影:产品经理
简单做个家宴

我们经常让大模型返回Markdown格式的文本,然后通过Python的markdown库把文本渲染成HTML。

但不知道大家有没有发现,大模型返回的Markdown并不是标准的Markdown。特别是当返回的内容包含列表时,大模型返回的内容有问题。例如下面这段文本:

1
2
3
4
**关于这个问题,我有以下看法**
* 第一点
* 第二点
* 第三点

你粗看起来没有问题,但当你使用markdown模块去把它渲染成HTML时,你会发现渲染出来的结果不符合你的预期,如下图所示:

这是因为标准的Markdown对换行非常敏感,列表项与它上面的文本之间,必须有一个空行,才能正确解析,如下图所示:

不仅是空行,还有多级列表的缩进问题。标准Markdown的子列表项缩进应该是4个空格,但大模型返回的子列表缩进经常只有3个空格,这就导致解析依然有问题。如下图所示:

而且这个空行问题和缩进问题,我尝试过反复在Prompt里面强调,但大模型依然会我行我素,无论是国产大模型还是Claude或者Gemini 2.5 Pro这些最新大模型,都有这个问题。

我曾经一度被憋得没办法,让大模型给我返回JSON,我再写代码把JSON解析出来手动拼接成标准Markdown。

后来,我发现主要的问题还是Python的markdown库对格式要求太严格了,其实换一个更宽容的库就可以解决问题。于是我找到了mistune这个库。使用它,直接就解决了所有问题。如下图所示:

mistune的用法非常简单:

1
2
3
import mistune

html = mistune.html('一段markdown')

并且它天然支持数学公式、脚注等等高级语法。更多高级操作,可以查看它的官方文档