恭喜你!前四天你已经打通了 AI 应用的“逻辑链路”。今天(第 5 天),我们要进入工程性能的分水岭:从“线性思维”转向“并发思维”。
“理解高并发与非阻塞”是区分“写脚本的”和“做系统的”关键标志。
第一站:解密asyncio—— 为什么要学它?
1. 什么是asyncio?
asyncio是 Python 用于编写并发代码的库。
- 同步 (Synchronous):像排队买奶茶,前面的人没拿到,你就得在那干等着,什么也干不了。
- 异步 (Asynchronous):像在餐厅扫码点餐,点完后你可以继续和朋友聊天、刷手机,等菜好了服务员会叫你。
2. 为什么要学它?
- 场景痛点:大模型的响应通常很慢(有时需要几秒甚至十几秒)。如果你在同步模式下连续处理 10 个文档,程序会一个接一个等待,总耗时 = 10 × 等待时间。
- 异步优势:使用异步,你可以同时发出 10 个请求。程序在等待 AI 返回结果的“空窗期”,会去处理其他任务。总耗时 ≈ 最慢的那个请求的时间。
- 职业进阶:现代 AI 框架(如 FastAPI, LangChain)底层全是异步。看不懂
async/await,你将很难阅读和重构复杂的 AI 项目源码。
第二站:核心概念——三个关键词
event loop(事件循环):它是大管家,负责调度任务。谁准备好了(菜好了),它就让谁执行。async def:定义一个“协程”函数。这种函数调用时不会立即执行,而是返回一个协程对象。await:挂起标志。告诉管家:“我现在要等 AI 回复了,你先去忙别的吧,等回复到了再回来叫我。”
🚀 今日最终里程碑:编写异步 AI 请求脚本
由于requests库是同步的,不支持异步。我们需要安装aiohttp(异步 HTTP 库)或直接使用 OpenAI 的异步 SDK。为了让你以后能无缝对接各大模型,我们直接学习官方异步 SDK的用法。
1. 安装异步环境
在终端执行:pip install openai
2. 编写异步请求代码
新建文件day5_async_bot.py:
importasyncioimporttimefromopenaiimportAsyncOpenAI# 导入异步客户端# 1. 初始化异步客户端 (以硅基流动为例)client=AsyncOpenAI(api_key="你的API_KEY",base_url="https://api.siliconflow.cn/v1")asyncdefask_ai(task_id,question):""" 这是一个异步协程函数 """print(f"🚀 任务{task_id}: 发出请求 -{question[:15]}...")start_time=time.time()# 2. 使用 await 挂起请求,等待期间 CPU 会去处理其他任务response=awaitclient.chat.completions.create(model="Qwen/Qwen2.5-7B-Instruct",messages=[{"role":"user","content":question}])end_time=time.time()content=response.choices[0].message.contentprint(f"✅ 任务{task_id}: 耗时{end_time-start_time:.2f}s | 返回:{content[:20]}...")asyncdefmain():print("--- 异步并发测试开始 ---")start_total=time.time()# 3. 同时启动 3 个不同的任务# 注意:这里只是创建了任务,并没有阻塞运行tasks=[ask_ai(1,"请解释什么是高分子材料的蠕变现象?"),ask_ai(2,"如何提高 CPI 薄膜的耐热性?"),ask_ai(3,"总结聚酰亚胺在航空航天领域的三个应用。")]# 4. 并发执行所有任务awaitasyncio.gather(*tasks)end_total=time.time()print(f"\n✨ 所有任务完成!总耗时:{end_total-start_total:.2f}s")print("提示:你会发现总耗时远小于 3 个任务耗时的总和。")if__name__=="__main__":# 5. 启动事件循环asyncio.run(main())验证环节:体会“非阻塞”
- 观察日志:你会发现任务 1、2、3 的“发出请求”是几乎同时打印出来的,而不是等 1 完了才打印 2。
- 对比耗时:
- 同步模式:耗时 ≈ 3s + 3s + 3s =9s
- 异步模式:耗时 ≈max(3s, 3.2s, 2.8s) ≈ 3.2s
- 使用场景感悟:想象一下第 6 周你要做“合同批量审核”,如果不学异步,老板让你审 100 份合同,你可能要让老板等 10 分钟;用了异步,可能只需 30 秒。
💡 学习技巧:不要掉进细节深渊
异步编程有很多高级特性(如Lock,Queue,Semaphore),今天请全部忽略。 你只需要记住这个公式:async def定义函数 +await调用耗时操作 +asyncio.gather批量并发。