0

0

AutoGen 流式输出(Streaming)功能的实现与自定义解决方案

聖光之護

聖光之護

发布时间:2026-01-18 13:46:02

|

592人浏览过

|

来源于php中文网

原创

AutoGen 流式输出(Streaming)功能的实现与自定义解决方案

autogen 默认不支持真正的逐字流式输出,`stream=true` 仅影响底层 llm 调用的流式响应接收,但消息打印仍为整块渲染;需通过 monkey patching 重写 `_print_received_message` 方法,才能实现终端实时逐字符/逐词流式显示。

在 AutoGen 中启用 stream=True(如 llm_config = {"stream": True, ...})确实会触发底层大模型客户端(如 OpenAI SDK)以流式方式接收 token,但这仅限于内部数据流处理——AutoGen 的默认消息展示逻辑仍会等待整个响应完成后再一次性调用 print() 输出完整回复。因此,即使启用了流式请求,终端依然表现为“整句闪现”,而非预期的“打字机式”实时流式效果。

要实现真正可见的流式输出,关键在于拦截并重写 AutoGen 消息渲染行为。目前官方尚未提供开箱即用的流式打印接口,GitHub Issues 中也暂无原生支持计划(open streaming issues)。可行方案是采用 monkey patching,动态替换 ConversableAgent._print_received_message 方法:

import sys
import time
from typing import Optional
from autogen import ConversableAgent

# 自定义流式打印函数:逐字符输出,模拟打字效果
def _stream_print_received_message(
    self,
    message: dict,
    sender: Optional[ConversableAgent] = None,
    reviewer: Optional[ConversableAgent] = None,
):
    content = message.get("content", "")
    if not isinstance(content, str):
        return

    # 清除前导/尾随空白,避免空行干扰
    content = content.strip()
    if not content:
        return

    # 逐字符输出,可按需调整延迟(单位:秒)
    for i, char in enumerate(content):
        sys.stdout.write(char)
        sys.stdout.flush()  # 强制刷新缓冲区
        time.sleep(0.02)  # 可选:控制输出节奏(如需更快速度可设为 0.005)
    print()  # 换行

# 应用 monkey patch(需在 agent 初始化前执行)
ConversableAgent._print_received_message = _stream_print_received_message

⚠️ 注意事项

LALALAND
LALALAND

AI驱动的时尚服装设计平台

下载
  • 此 patch 需在创建任何 ConversableAgent 实例(包括 UserProxyAgent、AssistantAgent 等)之前执行,否则不会生效;
  • 若使用 GroupChatManager 或多代理协作场景,确保所有参与 agent 均继承该 patched 方法(因 GroupChatManager 本身也继承 ConversableAgent);
  • time.sleep() 延迟值可根据实际需求调整:设为 0 可实现极速流式(依赖终端刷新能力),但可能丢失“视觉流式感”;建议 0.01–0.03 秒间微调;
  • 该方法不改变消息内容或历史记录逻辑,仅影响控制台显示行为,所有 chat_history 和 last_message() 等 API 行为保持不变。

验证方式:运行你的原始代码(含 "stream": True)后,观察终端是否出现逐字符显现效果。若仍为整块输出,请检查 patch 是否在 agent 初始化前执行,或确认未被其他模块覆盖。

总之,AutoGen 的流式能力当前聚焦于 API 层响应流,可视化流式需开发者主动介入渲染层。这一 monkey patch 方案轻量、兼容性强,是现阶段最实用的工程化解法。未来若官方提供 on_token_callback 或 stream_display=True 等原生支持,可平滑迁移。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

185

2023.09.27

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6095

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

806

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1062

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1245

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

429

2025.12.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.8万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号