一日一技:如何正確渲染大模型返回的Markdown?

我們經常讓大模型返回markdown格式的文本,然後通過Pythonmarkdown庫把文本渲染成HTML

但不知道大家有沒有發現,大模型返回的Markdown並不是標準的Markdown。特別是當返回的內容包含列表時,大模型返回的內容有問題。例如下面這段文本:

**關於這個問題,我有以下看法**
* 第一點
* 第二點
* 第三點

你粗看起來沒有問題,但當你使用markdown模塊去把它渲染成HTML時,你會發現渲染出來的結果不符合你的預期,如下圖所示:

這是因為標準的Markdown對換行非常敏感,列表項與它上面的文本之間,必須有一個空行,才能正確解析,如下圖所示:

不僅是空行,還有多級列表的縮進問題。標準Markdown的子列表項縮進應該是4個空格,但大模型返回的子列表縮進經常只有3個空格,這就導致解析依然有問題。如下圖所示:

而且這個空行問題和縮進問題,我嘗試過反覆在Prompt裏面強調,但大模型依然會我行我素,無論是國產大模型還是Claude或者Gemini 2.5 Pro這些最新大模型,都有這個問題。

我曾經一度被憋得沒辦法,讓大模型給我返回JSON,我再寫代碼把JSON解析出來手動拼接成標準Markdown。

後來,我發現主要的問題還是Python的markdown庫對格式要求太嚴格了,其實換一個更寬容的庫就可以解決問題。於是我找到了mistune這個庫。使用它,直接就解決了所有問題。如下圖所示:

mistune的用法非常簡單:

import mistune

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

並且它天然支持數學公式、腳註等等高級語法。更多高級操作,可以查看它的官方文檔[1]。

參考文獻

[1] 官方文檔: https://mistune.lepture.com/en/latest/guide.html