八周带你手搓AI应用-第二周-让AI更像人-第1天-流式输出改造

恭喜你跨入了第二周!如果说第一周是让 AI "学会说话",那么第二周的第一天就是让 AI "更像人"。

在科研或办公场景中,如果你让 AI 生成一份 3000 字的"聚酰亚胺实验大纲",普通模式下你需要盯着屏幕死等 30 秒,而流式输出能让你在第 1 秒就开始阅读。


第一站:解密流式输出 (Streaming)

是什么? 流式输出(Streaming)是一种数据传输技术。传统模式下,大模型必须把整个句子生成完,再一次性打包发给你(就像邮寄一整箱书);而流式输出是模型每生成一个字符(Token),就立刻发给客户端一个片段(就像发传单,一张一张发)。

为什么这么设计?

  1. 极速响应(降低首字延迟): 大模型生成长文本非常耗时。流式输出能让用户在几百毫秒内看到第一个字,极大地缓解了焦虑,提升了用户体验。
  2. 节省内存: 对于超长文本,不需要在服务器端积攒所有内容再发送,数据像流水一样流过。
  3. 交互感: 模拟人类思考和打字的过程,更有"对话"的感觉。

第二站:核心逻辑 ------ 迭代响应对象

是什么? 在 Python 中,当开启 stream=True 后,返回的不再是一个简单的对象,而是一个可迭代的生成器(Generator) 。你需要用 for 循环去"遍历"这个水龙头里流出的每一个水滴。

关键概念:Chunk(数据块) 每一个"水滴"被称为一个 chunk。它包含了一小段文字内容(delta content)。你需要把这些内容实时打印出来,并且不换行


🚀 今日最终里程碑:实现"打字机"聊天机器人

今天我们要改造 chat.py,将原本"憋大招"式的回复变成"逐字蹦出"的打字机效果。

1. 核心代码改造点:
  • 参数增加:stream=True
  • 处理逻辑:由 await client.chat.completions.create 变为 await ... 之后接一个异步循环 async for
2. 实战示例代码

在 Cursor 中新建文件 day8_stream_chat.py

python 复制代码
import os
import asyncio
from openai import AsyncOpenAI
from dotenv import load_dotenv

load_dotenv()

async def stream_chat():
    client = AsyncOpenAI(
        api_key=os.getenv("API_KEY"),
        base_url=os.getenv("BASE_URL")
    )

    print("🤖 AI 助手(流式模式)已就绪。")
    
    while True:
        user_input = input("\n👤 用户: ")
        if user_input.lower() == 'exit': break

        print("🤖 AI: ", end="", flush=True) # end="" 保证不自动换行,flush=True 强制刷新缓冲区

        # 1. 开启 stream=True
        response = await client.chat.completions.create(
            model=os.getenv("MODEL_NAME"),
            messages=[{"role": "user", "content": user_input}],
            stream=True  # 👈 关键参数
        )

        full_reply = ""
        # 2. 异步迭代返回的每一个 chunk
        async for chunk in response:
            # 3. 提取 delta 内容 (大模型正在蹦出的字)
            content = chunk.choices[0].delta.content
            if content:
                print(content, end="", flush=True) # 实时打印
                full_reply += content
        
        print() # 最后打印一个换行

if __name__ == "__main__":
    asyncio.run(stream_chat())

💡 关键细节说明:

  1. print(content, end="", flush=True)
    • end="":告诉 Python 打印完不要换行,因为 AI 还没说完。
    • flush=True:强制让文字立刻出现在屏幕上。默认情况下,Python 会等缓冲区满了才打印,不加这个参数你会发现文字还是一坨一坨跳出来的。
  2. delta vs message
    • 在非流式模式下,我们读取的是 choices[0].message.content
    • 在流式模式下,内容藏在 choices[0].delta.content 中。这是一个微小的属性变化,请务必注意。

学习技巧:对比感知

运行程序后,输入一个长问题(例如:"请写一篇关于聚酰亚胺未来发展的500字综述")。观察文字像瀑布一样流出的过程。

今日思考: 在流式模式下,我们如何像第四天那样,把这段"流出来"的完整回答保存到 history 列表中,以维持下一轮对话的记忆?(提示:代码中的 full_reply 变量就是为了干这个活的)。

明天我们将挑战第二周的高峰:Function Calling,让 AI 开始操作你的本地代码!

相关推荐
战族狼魂16 分钟前
GPT-5.6与Grok 4.5重磅发布
人工智能·算法·大模型·大语言模型
m沐沐44 分钟前
【深度学习】dlib 人脸关键点检测
人工智能·深度学习·opencv·计算机视觉·pycharm·人脸识别·关键点检测
happyprince1 小时前
2026年07月09日全球AI前沿动态
人工智能
ACP广源盛139246256731 小时前
IX8024 PCIe4.0 交换芯片@ACP# RK3588:嵌入式 AI PC 标准化扩展方案
大数据·人工智能·分布式·单片机·嵌入式硬件
研究员子楚1 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
明哥聊AI1 小时前
测试时计算与推理模型深度解析:从o1到o3到DeepSeek-R1的技术演进(2026最新)
人工智能
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
梦想三三1 小时前
Git与GitHub基础入门:从零开始掌握版本控制与代码托管(完整图文教程)
人工智能·git·elasticsearch·github
xd1855785551 小时前
敲门砖工坊-求职信定制的HarmonyOS开发实践
人工智能·华为·harmonyos·鸿蒙