快速结论:该报错通常发生在 Gradio 5.x 升级后,Chatbot 或 Markdown 组件无法渲染 LaTeX 公式的场景。优先排查两点:一是确认是否通过 latex_delimiters 参数正确传递分隔符;二是检查 Python 字符串中反斜杠是否被转义,建议使用 raw string(r"...")或对反斜杠进行双重转义。
适用环境:Gradio 5.20.1(Darwin/macOS),gradio_client 1.7.2,Python 3.x(Issue 中未明确标注具体版本)。问题在 Gradio 5.x 全系版本中可复现,4.44 版本工作正常。
最快修复方案:在 gr.Chatbot 或 gr.Markdown 中显式传入 latex_delimiters 参数;同时对包含 LaTeX 反斜杠的字符串使用 raw string 前缀(r"...")或调用 replace("\\", "\\\\") 进行转义。此方案已在 Issue 评论中被确认有效。
注意事项:raw string 仅在代码中直接定义字符串时有效,若文本来自外部数据源(如模型输出或文件),需使用 replace 或正则表达式处理;gr.ChatInterface 本身不支持 latex_delimiters 参数,需通过外部 gr.Chatbot 实例传入。
问题场景
用户在 Gradio 5.20.1 中构建包含数学公式展示的应用,使用 gr.Markdown 或 gr.Chatbot 渲染 LaTeX 内容。升级前(4.44 版本)可正常渲染,升级后公式不再被解析,而是以纯文本形式输出。用户还尝试了 Deepseek 模型输出中常见的 \[...\] 和 \(...\) 分隔符,均无法生效。
报错原文
Rendering LaTeX from a source (how to escape the backslashes?)
No Errors
The text gets printed without rendering
原因分析
可能原因有二:
- 参数传递错误:用户在示例中将
delimiters作为独立变量定义,但未将其传给gr.Markdown或gr.Chatbot的latex_delimiters参数。Gradio 5.x 要求通过该参数显式声明 LaTeX 分隔符。 - Python 字符串转义:Python 中
\是转义字符,LaTeX 命令(如\frac)中的反斜杠会被 Python 吞掉,导致最终传给 Gradio 的字符串中反斜杠丢失。Issue 评论确认,使用 raw string(r"...")或对反斜杠进行双重转义(replace("\\", "\\\\"))可以解决。
此外,gr.ChatInterface 不直接暴露 latex_delimiters 参数,需通过外部 gr.Chatbot 实例传入,这可能是部分用户配置失败的原因。
环境排查
- Gradio 版本:确认当前版本是否为 5.x(5.20.1 已复现),4.44 可正常工作。
- Python:确认 Python 3.x 环境,反斜杠转义行为与版本无关。
- 依赖:检查 gradio-client 版本是否与 gradio 主版本匹配(Issue 中 1.7.2 存在未安装提示,但不影响本问题)。
- 系统:macOS 已确认,Windows/Linux 未在 Issue 中验证,但大概率同样适用。
解决步骤
- 显式传递
latex_delimiters:在gr.Markdown或gr.Chatbot中直接传入分隔符列表,不要在外部定义变量而不引用:delimiters = [ {"left": "$$", "right": "$$", "display": True}, {"left": "$", "right": "$", "display": False}, ] gr.Markdown("...", latex_delimiters=delimiters) - 处理反斜杠转义:若字符串来自代码定义,使用 raw string 前缀:
text = r"This is inline math: $E = mc^2$ and \frac{a}{b}"若文本来自外部数据源(文件、模型输出、API),则对反斜杠进行双重转义:
text = text.replace("\\", "\\\\") - ChatInterface 特殊处理:由于
gr.ChatInterface不支持latex_delimiters参数,需创建外部gr.Chatbot实例并传入该参数,再将其传给ChatInterface的chatbot参数。 - 模型输出实时转换(可选):Issue 中用户提供了一个
reformat_math函数,将\[...\]和\(...\)转换为$$...$$和$...$,可在流式输出中对文本进行预处理:import re def reformat_math(text): text = re.sub(r"\\\[\s*(.*?)\s*\\\]", r"$$\1$$", text, flags=re.DOTALL) text = re.sub(r"\\\(\s*(.*?)\s*\\\)", r"$\1$", text, flags=re.DOTALL) return text
验证方法
修复后运行带有 LaTeX 公式的 Markdown 或 Chatbot 示例,检查公式是否以数学格式渲染(而非纯文本)。对于模型输出场景,确认流式生成过程中每个增量片段都能正确显示公式,且无乱码或丢失反斜杠的问题。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Question]: Chat doesn't retrieve answer from knowledge](https://www.chat-gpts.plus/wp-content/uploads/2026/08/8022-2eace44f-768x403.jpg)

