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/10/17 7:53:15 阅读更多 →
PICAXE编程进阶:从输入输出到项目实战的嵌入式系统开发指南

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

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

2026/10/16 14:01:39 阅读更多 →
ECL模型计量与应用全解析:从风险建模到业务决策落地

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

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

2026/10/16 15:38:01 阅读更多 →

最新新闻

URL Protocol自定义协议:从注册表到网页唤起本地程序全攻略

URL Protocol自定义协议:从注册表到网页唤起本地程序全攻略

你有没有遇到过这样的需求:网页上某个按钮,点击后最好直接唤起本地安装的客户端程序,而不是让用户自己去安装目录找快捷方式。比如网盘网页版点“打开客户端”、在线文档点“编辑”,几乎所有主流的桌面软件都在用这种交互。实现这…

2026/10/18 14:14:23 阅读更多 →
豆瓣电影Top250爬虫+Flask后台+PyEcharts可视化全流程

豆瓣电影Top250爬虫+Flask后台+PyEcharts可视化全流程

简介:这是一套面向计算机专业本科生的毕业设计与课程大作业实战项目,基于PythonFlask构建豆瓣电影数据的全链路处理系统,涵盖网络爬虫采集、SQLite本地存储、后端业务逻辑开发及前端可视化展示四大核心环节,适合中等难度项目实践与…

2026/10/18 14:14:23 阅读更多 →
SpeedTree 10到UE5 Nanite:告别纸片树冠的透射与季节重构

SpeedTree 10到UE5 Nanite:告别纸片树冠的透射与季节重构

“纸片树冠”这个说法,干这行的人一听就懂。就是那种树干做得挺像样,树冠却靠几张交叉面片硬撑,远看还行,一走近或者镜头稍微压低,立刻露馅的植被资产。2023年以后再拿这种东西放到Nanite工作流里,其实已经…

2026/10/18 14:14:23 阅读更多 →
Unity自动化构建与SVN自动提交:构建产物一键发布方案

Unity自动化构建与SVN自动提交:构建产物一键发布方案

Unity打包后自动复制到指定位置并SVN提交做项目做久了就会发现,真正消耗时间的不一定是写代码,而是那些"重复但必须做"的收尾工作。尤其多人在线协作的项目里,每次出包测试版,要么手动把构建产物拖到共享目录&#xff0…

2026/10/18 14:14:23 阅读更多 →
网页看板娘实战指南:从Live2D部署到性能优化

网页看板娘实战指南:从Live2D部署到性能优化

1. 为什么网页需要一个"会动"的看板娘如果你做过几年前端或者个人站点的维护,应该对这样一类现象不陌生:一个功能完善、内容扎实的博客或产品页,上线后总感觉少了点什么。少了"活气"。静态页面再精致,用户打开…

2026/10/18 14:14:23 阅读更多 →
谷歌AI Agent白皮书核心解读:从编排层到工具调用的落地实践

谷歌AI Agent白皮书核心解读:从编排层到工具调用的落地实践

简介:谷歌《2025谷歌AI Agent白皮书》系统梳理了生成式人工智能代理的设计蓝图,面向人工智能工程师、架构师与技术决策者,帮助读者理解代理与传统模型的本质差异,以及如何借助数据库检索、API调用等外部工具自主规划并执行任务。这…

2026/10/18 14:13:22 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →