FastAPI 集成通义千问(Qwen)实战 Day1:非流式调用与 SSE 流式输出
FastAPI 集成通义千问Qwen实战 Day1非流式调用与 SSE 流式输出关键词FastAPI、通义千问、Qwen、OpenAI 兼容协议、SSE 流式、Python本文记录我在招聘系统项目里接入大模型能力的第一天用阿里云百炼DashScope提供的兼容 OpenAI 协议接口先跑通原生脚本再封装成 FastAPI 接口覆盖「一次性返回」和「打字机式流式返回」两种最常见姿势。一、背景与技术选型项目里想给简历 / JD 模块加智能能力JD 自动生成、简历要点提取等第一步是把大模型调通。选型模型通义千问qwen-plus阿里云百炼平台提供协议百炼提供兼容 OpenAI的接口所以直接用官方openaiSDK只需改base_url和api_key即可不用学新 SDKWeb 框架FastAPI项目本身后端就是 FastAPI Tortoise ORM MySQL两种链路非流式请求完等模型生成完毕一次性返回完整回答流式SSE边生成边推前端打字机效果环境依赖pipinstallopenai fastapi uvicornAPI Key 在阿里云百炼控制台获取用环境变量DASHSCOPE_API_KEY注入不要硬编码进代码。二、先跑通原生脚本脱离 Web 框架在写接口前先用最小脚本验证链路通不通。2.1 非流式调用llm/case1.pyimportosfromopenaiimportOpenAI clientOpenAI(# 若没有配置环境变量请用百炼API Key将下行替换为api_keysk-xxxapi_keyos.getenv(DASHSCOPE_API_KEY),base_urlhttps://ws-ulkao56twirebft4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,)completionclient.chat.completions.create(# 模型列表https://help.aliyun.com/zh/model-studio/getting-started/modelsmodelqwen-plus,messages[{role:system,content:You are a helpful assistant.},{role:user,content:人为什么要睡觉?},],temperature0.75,)print(completion.choices[0].message.content)要点OpenAI(api_key..., base_url...)初始化客户端base_url 指向百炼的兼容模式 /v1client.chat.completions.create(...)发起对话参数model模型名messages对话历史每项{role: ..., content: ...}。system设定人设user是用户输入temperature采样温度越大越发散取结果completion.choices[0].message.content2.2 流式调用llm/case2.pyimportosfromopenaiimportOpenAI clientOpenAI(api_keyos.environ[DASHSCOPE_API_KEY],base_urlhttps://ws-ulkao56twirebft4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,)completionclient.chat.completions.create(modelqwen-plus,messages[{role:system,content:You are a helpful assistant.},{role:user,content:请介绍一下自己}],streamTrue,# 开启流式stream_options{include_usage:True}# 拿 token 用量)chunks[]forchunkincompletion:ifchunk.choices:choicechunk.choices[0]ifchoice.delta:deltachoice.deltaifdelta.content:print(delta.content)chunks.append(delta.content)# 暂存片段res.join(chunks)# 最后 join比 高效print(res)要点streamTrue开启流式stream_options{include_usage: True}才能拿到 token 用量逐块迭代chunk.choices[0].delta.content是这一小段增量文本用list暂存片段最后.join(chunks)拼接——比字符串逐次高效三、封装成 FastAPI 接口3.1 请求体校验app/schemas/llm_case1.pyfrompydanticimportBaseModel,FieldclassLLMCase1(BaseModel):question:strField(...,title问题,description问题)只收一个question字段用 Pydantic 做参数校验。3.2 接口app/apis/llm/case1_api.pycase1非流式一次性返回importosfromfastapiimportAPIRouterfromopenaiimportOpenAIfromapp.schemas.llm_case1importLLMCase1 llm_day01_routerAPIRouter(prefix/llm-day01,tags[LLM-DAY01])llm_day01_router.post(/case1,summaryLLM-DAY01-CASE1)asyncdefcase1_api(llmCase1Request:LLMCase1):clientOpenAI(api_keyos.getenv(DASHSCOPE_API_KEY),base_urlhttps://ws-ulkao56twirebft4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,)completionclient.chat.completions.create(modelqwen-plus,messages[{role:system,content:你是一个智能助手},{role:user,content:llmCase1Request.question},],temperature0.75,)ai_replycompletion.choices[0].message.contentreturn{code:1,message:请求成功,data:{ai_reply:ai_reply},}返回沿用项目统一的响应信封{code, message, data}。case2SSE 流式输出fromstarlette.responsesimportStreamingResponsedefstream_chunk(user_question:str):clientOpenAI(api_keyos.environ[DASHSCOPE_API_KEY],base_urlhttps://ws-ulkao56twirebft4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,)completionclient.chat.completions.create(modelqwen-plus,messages[{role:system,content:You are a helpful assistant.},{role:user,content:user_question}],streamTrue,stream_options{include_usage:True})forchunkincompletion:ifchunk.choices:choicechunk.choices[0]ifchoice.delta:deltachoice.deltaifdelta.content:yieldfdata:{delta.content}\n\n# SSE 标准格式data: xxx\n\nyielddata: [done]\n\n# 结束标记llm_day01_router.post(/case2,summaryLLM-DAY01-CASE2)asyncdefcase2_api(llmCase1Request:LLMCase1):returnStreamingResponse(contentstream_chunk(llmCase1Request.question),media_typetext/event-stream)要点stream_chunk是一个生成器函数含yield逐片产出 SSE 文本SSE 格式固定为data: 内容\n\n必须是双换行前端EventSource才能正确切分事件最后yield data: [done]\n\n作为结束信号通知前端回答完毕用StreamingResponse(content生成器, media_typetext/event-stream)把生成器包成流式响应FastAPI 普通函数不能yield流式必须返回StreamingResponse3.3 路由注册app/apis/llm/__init__.py预留空文件做包入口main.py里注册# main.pyfromapp.apis.llm.case1_apiimportllm_day01_router app.include_router(llm_day01_router)启动后接口路径POST /llm-day01/case1非流式POST /llm-day01/case2SSE 流式四、踩坑清单重点API Key 别硬编码用环境变量。但注意代码里两处不一致——非流式用os.getenv缺省返回None静默失败生成器里用os.environ[...]缺省会抛KeyError。建议统一用os.getenv并显式判断为空时返回友好错误。base_url 与 Key 地域强绑定百炼的 base_url 必须是兼容模式/v1且要和 API Key 所属地域一致否则鉴权直接失败。SSE 必须双换行data: xxx\n\n少一个\n前端EventSource解析不出事件。流式结束要发标记最后yield data: [done]\n\n让前端知道回答结束、关闭连接。流式拿 token 用量stream_options{include_usage: True}才有chunk.usage。字符串拼接用 list join流式片段别用用chunks.append后.join(chunks)性能更好。FastAPI 流式不能用普通函数 yield必须返回StreamingResponse并传入生成器。temperature 按场景调demo 用 0.75 偏发散生产场景如 JD 生成建议调低拿稳定输出。五、小结Day1 跑通了通义千问在 FastAPI 下的两种调用姿势非流式适合后台任务、批量处理SSE 流式适合对话界面、打字机效果后续可继续做多轮对话维护messages历史工具调用function calling接招聘业务 API落地招聘场景JD 自动生成、简历要点提取、候选人匹配注本文所有代码片段均来自当天真实提交的后端文件llm/case1.py、llm/case2.py、app/apis/llm/case1_api.py、app/schemas/llm_case1.py、main.py仅做脱敏API Key 走环境变量。

相关新闻

重磅!商标注册成功后的监测与维护服务你了解吗?

重磅!商标注册成功后的监测与维护服务你了解吗?

重磅!商标注册成功后的监测与维护服务,你了解吗?“商标注册证终于拿到手了,这下可以高枕无忧了!”如果你也这么想,可能正在犯一个大多数创业者都会犯的错误——拿到注册证,只是品牌保护这场马拉…

2026/8/4 3:49:26 阅读更多 →
PICAXE编程进阶:从输入输出到项目实战的嵌入式系统开发指南

PICAXE编程进阶:从输入输出到项目实战的嵌入式系统开发指南

1. 项目概述:从入门到实践,解锁PICAXE编程的核心技能上次我们聊了PICAXE编程的入门,搭建了环境,点亮了第一个LED,算是和这个小家伙打了个招呼。很多朋友反馈说,感觉像是刚拿到驾照,只会直行和倒…

2026/8/4 3:48:26 阅读更多 →
ECL模型计量与应用全解析:从风险建模到业务决策落地

ECL模型计量与应用全解析:从风险建模到业务决策落地

1. 从“黑盒”到“白盒”:ECL模型究竟是什么?如果你在金融、风控或者数据分析领域工作,最近几年肯定没少听到“ECL模型”这个词。它就像一个突然闯入大家视野的“明星”,在各种报告、监管要求和项目方案里频繁出现。但说实话&…

2026/8/4 3:48:26 阅读更多 →

最新新闻

ACS NANO CrSBr 反铁磁自旋滤波隧道结

ACS NANO CrSBr 反铁磁自旋滤波隧道结

ACS NANO CrSBr 反铁磁自旋滤波隧道结Electrical Control and High-Bias Enhancement of Magnetoresistance in CrSBr Spin-Filter TFETs导读 导读:基于范德华反铁磁体 CrSBr 的垂直自旋滤波隧道场效应晶体管(Spin-TFET),实现了栅…

2026/8/4 4:20:43 阅读更多 →
扫地机器人自动回充技术全解析:激光雷达与视觉导航的实战对比

扫地机器人自动回充技术全解析:激光雷达与视觉导航的实战对比

1. 项目概述:扫地机“回家”背后的技术江湖扫地机器人能自己“回家”充电,这大概是它最让人省心的功能之一。从早期的“找不着北”到现在的精准回充,背后是一套复杂且不断演进的技术体系。我拆解和测试过市面上主流的几十款机型,发…

2026/8/4 4:20:43 阅读更多 →
数字信号最佳接收三步法:从原理到实践,掌握通信系统性能分析核心

数字信号最佳接收三步法:从原理到实践,掌握通信系统性能分析核心

这次我们来看一个通信原理中的核心概念:数字信号的最佳接收。对于通信、电子信息、自动化等相关专业的学生和工程师来说,理解最佳接收是掌握现代数字通信系统性能分析的关键。它直接关系到系统设计的核心指标——误码率。很多教材和课程会从复杂的数学推…

2026/8/4 4:20:43 阅读更多 →
SpringBoot+Vue校园疫情防控系统开发实战

SpringBoot+Vue校园疫情防控系统开发实战

1. 项目概述:校园疫情防控系统的技术架构与核心价值校园疫情防控系统是一套基于SpringBootVueMySQL技术栈的完整解决方案,专为教育机构常态化防疫管理设计。这个开源项目最吸引人的特点是"开箱即用"——开发者下载源码后无需复杂配置即可本地运…

2026/8/4 4:20:43 阅读更多 →
BLE Mesh技术解析:从广播信道到洪泛通信的物联网组网实践

BLE Mesh技术解析:从广播信道到洪泛通信的物联网组网实践

1. 从“点对点”到“多对多”:BLE Mesh的设计动机如果你玩过传统的蓝牙设备,比如连接一个耳机或者一个手环,你肯定熟悉那个“配对-连接-通信”的流程。这种经典蓝牙(Bluetooth Classic)或者BLE(Bluetooth L…

2026/8/4 4:20:43 阅读更多 →
直方图均衡化原理与Python实现:从基础到CLAHE实战

直方图均衡化原理与Python实现:从基础到CLAHE实战

1. 项目概述:直方图均衡化是什么,以及为什么你需要它 如果你处理过图像,尤其是那些在光线不佳条件下拍摄的照片,你肯定遇到过“对比度不足”的问题。整张照片看起来灰蒙蒙的,亮的地方不够亮,暗的地方不够暗…

2026/8/4 4:19:43 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →