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

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

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

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

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

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

2026/8/25 8:49:40 阅读更多 →

最新新闻

巴别鸟智巢AI知识库与自动化任务引擎实战

巴别鸟智巢AI知识库与自动化任务引擎实战

巴别鸟智巢AI知识库与自动化任务引擎实战 在企业级文件管理场景中,光有存储已经远远不够。如何让文件在团队协作中流动起来、如何让历史积累的知识真正被复用,才是现代云盘产品的核心命题。巴别鸟在这方面的解题思路中,有两个功能模块对开发者…

2026/8/26 14:07:10 阅读更多 →
构建机器学习模型识别图像AI生成内容的检测

构建机器学习模型识别图像AI生成内容的检测

随着生成式AI技术的飞速发展,AI生成的图像越来越逼真,以至于人眼难以分辨其真伪。在这种背景下,如何有效地识别真假图像,尤其是在深度伪造(Deepfake)技术的应用下,成为了当前亟待解决的技术难题。该问题不仅在媒体行业产生了巨大影响,同时也在网络安全、公众信任等多个…

2026/8/26 14:07:10 阅读更多 →
Google Landmark Retrieval 2020 地标图像检索

Google Landmark Retrieval 2020 地标图像检索

图像检索是计算机视觉中的一个重要任务,尤其在地标图像检索中,如何从庞大的图像数据库中快速精准地找到相似的地标图像,成为了实际应用中的难点。Google Landmark Retrieval 2020 竞赛以解决这一问题为目标,采用了图像特征嵌入技术,推动了地标识别与图像检索领域的发展。 …

2026/8/26 14:07:10 阅读更多 →
Umi-OCR 新手指南:3 分钟上手这款免费离线 OCR 识别工具

Umi-OCR 新手指南:3 分钟上手这款免费离线 OCR 识别工具

Umi-OCR 新手指南:3 分钟上手这款免费离线 OCR 识别工具 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语…

2026/8/26 14:07:10 阅读更多 →
用Dism备份系统,恢复系统,并创建新“虚拟”系统

用Dism备份系统,恢复系统,并创建新“虚拟”系统

比如说你想创建一个环境,用来开发、测试等。1、去windows官网下载安装包,比如下载到本地,名字为Win11_25H2_Chinese_Simplified_x64_v2.iso。2、提取其中的install.wim文件3、将install.wim释放出来4、启动Dismx64,最好以管理员身…

2026/8/26 14:07:10 阅读更多 →
推动RNA结构预测与生物医药发展

推动RNA结构预测与生物医药发展

RNA在生物体内的作用至关重要,其结构的复杂性使得RNA分子结构的准确预测成为科学研究中的一个关键难题。RNA的预测不仅对疾病治疗和药物研发有着重要影响,而且在气候变化和全球性问题的生物技术解决方案中也具有广泛的应用潜力。 本文将详细介绍Stanford Ribonanza RNA Fold…

2026/8/26 14:06:10 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/25 10:31:12 阅读更多 →
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/26 1:24:05 阅读更多 →