如何修复基于Teams Toolkit开发的AI聊天机器人代码块输出格式异常问题
如何修复基于Teams Toolkit开发的AI聊天机器人代码块输出格式异常问题
我完全理解你现在的困扰——花了不少功夫用Teams Toolkit和VSCode搭好AI聊天机器人,结果输出代码块时格式全乱,试了各种Markdown技巧都没效果,确实让人头大。结合你提供的代码和场景,我整理了几个针对性的解决方案,你可以一步步尝试:
方案一:在Prompt中强制模型输出标准Markdown代码块
很多时候问题出在AI模型的输出规范上——模型可能没有严格遵循Markdown代码块格式,比如缺少语言标识、```前后没有换行,或者多余空格破坏了结构。你可以在Prompt里明确给模型下达“格式指令”:
- 打开你项目中
prompts/chat.prompt文件(因为代码里指定了default_prompt="chat") - 在系统提示词里添加强制格式要求,比如:
--- system: - 你是专业技术助手,所有代码输出必须使用**标准Markdown代码块格式**: - 用```包裹代码内容 - 在```后第一行明确指定代码语言(如`python`、`java`) - 代码块前后必须保留单独换行,例如: ```python def hello_world(): print("Hello World") ``` - 禁止输出不完整或格式错误的代码块 ---
这样模型会更严格地按照规范输出代码,从源头减少格式问题。
方案二:手动修复模型响应的代码块格式
如果模型偶尔还是输出不规范的代码块,你可以在发送消息前手动处理响应内容,强制修正格式。
步骤1:添加格式修复函数
在bot.py中新增一个用于规范代码块的工具函数:
import re def fix_code_blocks(content: str) -> str: # 确保```前后有单独换行,避免和其他文本粘连 content = re.sub(r'(?<!\n)```', '\n```', content) content = re.sub(r'```(?!\n)', '```\n', content) # 给未指定语言的代码块添加默认语言标识(可选,比如默认python) content = re.sub(r'```\s*\n', r'```python\n', content) return content
步骤2:修改消息发送函数
更新你现有的send_markdown函数,在发送前调用修复函数:
from botbuilder.schema import TextFormatTypes async def send_markdown(context: TurnContext, text: str): # 先修复代码块格式,再发送 fixed_content = fix_code_blocks(text) await context.send_activity( text=fixed_content, text_format=TextFormatTypes.MARKDOWN # 使用枚举值更可靠,避免字符串拼写错误 )
方案三:用自适应卡片展示代码块(更稳定的格式)
如果Markdown格式在Teams里始终有兼容问题,自适应卡片是更稳妥的选择——它的样式由Teams客户端原生渲染,格式稳定性远高于普通Markdown。关键是如何实现“仅在用户请求代码时触发”:
步骤1:添加自适应卡片发送函数
在bot.py中新增发送代码卡片的函数:
from botbuilder.core import CardFactory async def send_code_card(context: TurnContext, content: str): # 提取代码块内容和语言标识 code_match = re.search(r'```(\w+)?\n(.*?)```', content, re.DOTALL) if not code_match: # 没有有效代码块, fallback 到普通Markdown发送 await send_markdown(context, content) return code_lang = code_match.group(1) or "unknown" code_content = code_match.group(2).strip() # 构建自适应卡片 adaptive_card = { "type": "AdaptiveCard", "version": "1.5", "body": [ { "type": "TextBlock", "text": f"### {code_lang} 代码示例", "weight": "Bolder", "size": "Medium", "spacing": "Small" }, { "type": "TextBlock", "text": f"```\n{code_content}\n```", "fontType": "Monospace", "wrap": True, "spacing": "Medium" } ] } # 发送自适应卡片 await context.send_activity( attachments=[CardFactory.adaptive_card(adaptive_card)] )
步骤2:添加触发逻辑
修改消息处理逻辑,自动判断是否需要发送自适应卡片:
@bot_app.message_activity() async def on_message(context: TurnContext, state: TurnState): # 调用AI生成响应 planner_result = await planner.complete(context, state) response_text = getattr(planner_result, "response", "") # 判断是否包含代码块,是则发送自适应卡片,否则用普通Markdown if "```" in response_text: await send_code_card(context, response_text) else: await send_markdown(context, response_text)
额外小提示
- 检查
teams-ai和botbuilder依赖版本:旧版本可能存在Markdown渲染兼容问题,建议更新到最新稳定版:
pip install --upgrade teams-ai botbuilder-core botbuilder-schema
- 避免特殊字符破坏格式:如果模型输出的代码里有HTML特殊字符(如&、<、>),可以在修复函数中添加转义处理,比如用
html.escape()转义特殊字符。
按照这些步骤操作,应该能解决代码块格式混乱的问题。如果某一步遇到问题,可以针对性调整细节~
备注:内容来源于stack exchange,提问作者Joseph Sarkisian




