You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复基于Teams Toolkit开发的AI聊天机器人代码块输出格式异常问题

如何修复基于Teams Toolkit开发的AI聊天机器人代码块输出格式异常问题

我完全理解你现在的困扰——花了不少功夫用Teams Toolkit和VSCode搭好AI聊天机器人,结果输出代码块时格式全乱,试了各种Markdown技巧都没效果,确实让人头大。结合你提供的代码和场景,我整理了几个针对性的解决方案,你可以一步步尝试:

方案一:在Prompt中强制模型输出标准Markdown代码块

很多时候问题出在AI模型的输出规范上——模型可能没有严格遵循Markdown代码块格式,比如缺少语言标识、```前后没有换行,或者多余空格破坏了结构。你可以在Prompt里明确给模型下达“格式指令”:

  1. 打开你项目中prompts/chat.prompt文件(因为代码里指定了default_prompt="chat"
  2. 在系统提示词里添加强制格式要求,比如:
---
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-aibotbuilder依赖版本:旧版本可能存在Markdown渲染兼容问题,建议更新到最新稳定版:
pip install --upgrade teams-ai botbuilder-core botbuilder-schema
  • 避免特殊字符破坏格式:如果模型输出的代码里有HTML特殊字符(如&、<、>),可以在修复函数中添加转义处理,比如用html.escape()转义特殊字符。

按照这些步骤操作,应该能解决代码块格式混乱的问题。如果某一步遇到问题,可以针对性调整细节~

备注:内容来源于stack exchange,提问作者Joseph Sarkisian

火山引擎 最新活动