当前位置: 首页 > news >正文

装闭 RenoPit 源码解析(05):FastAPI与Celery如何执行AI装修分析

AI 装修闭坑分析可能包含多张图片、多份合同以及多次大模型调用,不适合让 FastAPI 请求一直阻塞。装闭 RenoPit 在 fthux/RenoPit 中使用 Celery 和 Redis 编排这条长任务链,本篇分析任务从入队到结束的全过程。

一、FastAPI 只负责启动任务

用户点击“开始分析”后,ProjectPagePOST /api/projects/{id}/analyze发送请求。trigger_analysis()首先查询项目、图片和文件,并判断三类输入是否至少存在一种:

  • 可分析图片;
  • 已上传文档;
  • 非空的用户补充说明。

输入为空时返回 400;项目已经处于analyzing时返回 409。校验通过后,接口先把项目状态提交为analyzing,再投递任务:

from..tasks.analysisimportrun_analysis_task run_analysis_task.delay(project_id)

如果入队失败,接口会把状态恢复为pending。因此浏览器收到成功响应时,数据库已经记录了分析中的状态,任务也已经进入 Redis。

二、Celery 如何连接 Redis

tasks/celery_app.py创建 Celery 实例,Broker 使用 Redis 0 号库,结果后端使用 1 号库:

celery_app=Celery("renovation_analyzer",broker=settings.CELERY_BROKER_URL,backend=settings.CELERY_RESULT_BACKEND,include=["app.tasks.analysis"],)

任务消息和结果采用 JSON 序列化。task_acks_late=True表示任务执行完成后才确认消息,worker_prefetch_multiplier=1让 Worker 每次只预取一个长任务。软、硬时间限制都设置为 1200 秒,以容纳串行的图片和文档分析。

Docker Compose 中的backendcelery_worker使用同一份代码和环境变量,但启动命令不同。Worker 不接收 HTTP 请求,只监听 Redis 队列。

三、run_analysis_task 是总编排器

Celery 实际执行的是run_analysis_task(project_id)。它不是直接调用一次 LLM 就结束,而是按六个阶段组织任务:

验证项目

状态改为 analyzing

设计图综合分析

逐份文档分析

成功文档是否不少于两份

跨文档核查

汇总状态

completed 或 failed

第三步调用run_analysis_sync()处理图片、已提取文本和用户说明。设计图分析失败不会立刻终止整个任务,因为合同与报价单分析可以独立完成。

四、文档分析按文件串行执行

任务会查询当前项目中extracted_text非空,且类型为 PDF、DOCX、TXT 或 Markdown 的文件。每份文件调用一次run_document_analysis_sync(),结果追加到doc_results

单份文档异常会被捕获并记录为失败,不会阻断下一份文件。这样一份无法解析的合同不会让其他报价单全部失去分析机会。

当文档结果数量不少于两份时,任务继续调用run_cross_check_sync()。该阶段会比较合同和报价单中的金额、项目、责任条款等信息,并把差异写回综合分析结果。

五、项目完成状态如何判定

任务结束时分别计算:

design_ok=result.get("status")=="completed"doc_ok_count=sum(1foritemindoc_resultsifitem.get("status")=="completed")

只要设计分析成功,或者至少一份文档分析成功,项目就被标记为completed。完成消息会汇总设计问题数、文档成功数和跨文档差异数。

只有设计分析与全部文档分析都失败时,项目状态才写为failed。最外层异常同样会落入失败分支,并把错误信息提供给后续 SSE 接口读取。

六、停止分析如何改变状态

POST /projects/{id}/stop只接受当前状态为analyzing的项目。接口把项目恢复为pending,再找到最近一条processingpendingAnalysis,将其标为failed,错误信息写成“用户手动停止”。

状态提交后,SSE 轮询会观察到pending并发送stopped事件。项目页据此关闭进度条并恢复开始分析按钮。

七、异步任务调用链小结

RenoPit 把 HTTP 请求和 AI 计算分成两个进程:FastAPI 完成输入校验、状态更新和任务投递;Celery Worker 完成设计分析、文档分析、交叉核查和最终状态汇总。Redis 负责传递任务,PostgreSQL 则是两个进程共同认可的业务状态来源。

这条任务链的完整代码可以在 fthux/RenoPit 中查看。下一篇将继续分析浏览器如何通过 SSE 观察数据库状态,并把后台任务转换为实时进度条和完成跳转。

http://www.jsqmd.com/news/1255765/

相关文章:

  • C4996警告终极解决方案:从安全函数到跨平台实践
  • TDA3处理器PCB设计实战:电源与信号完整性及LPDDR2接口优化
  • GetQzonehistory终极指南:5分钟免费备份你的QQ空间所有历史记录
  • 在windows10里的apache2.4加php7.2的环境下上安装Laravel5.8框架
  • 2026年兴化黄金回收实测:紫金城黄金回收深度体验与里下河水乡变现避坑全指南(预约专线:18051266258) - 钦扬网络
  • 糖脂代谢紊乱的病理特征、临床风险与研究策略
  • Django计算机毕设之基于Django的智慧校园团员信息台账管理系统设计 高校团员发展与信息归档管理系统(完整前后端 代码+说明文档+LW,调试定制等)
  • 生命涌现的小龙虾技能之【Visual Summarization Skill | 视觉摘要智述技能】简介
  • AI信息评估:修辞模式如何影响可信度判断与系统设计
  • 用steam32显示屏做万年历
  • TAS5782M闭环D类功放:从架构原理到硬件设计的音频系统集成方案
  • 昇腾CANN算子优化与AI加速计算实践
  • TFLite Micro农业场景声音分类部署实战:鸟鸣、虫鸣与机械噪音的多类别端侧识别系统
  • C++ --vector
  • AI数据分析工具:让文科研究更高效
  • 2026互联网猎头服务市场概览:AI人才缺口、机构对比与选型指南 - 资讯快报
  • 考虑 Stribeck 摩擦特性的无刷直流电机驱动 EMB 执行器耦合建模及仿真分析(Simulink仿真实现)
  • Rust WebAssembly 边缘计算实战:从 120ms 冷启动到 5ms 的 WASM 推理优化复盘
  • 拒绝广告干扰:2026工厂空压制氮真空系统服务商选择指南 - 城刊速递
  • 佛山回收名牌包常见套路,线上高价引流上门不断压价 - 全城热点
  • 深入解析ADC32RF42:时钟、SYSREF同步与DDC链实战指南
  • AI 在社交前端中的应用:智能好友推荐与动态流个性化排序
  • AI驱动的本地化搜索优化:提升企业到店转化率
  • Anritsu安立 MT8870A无线测试套件
  • 2026年有源滤波器厂家分类与选型指南:多谐波源场景看定制能力 - 城刊速递
  • 华为MetaERP Oracle Fusion Financials 会计核算架构深度分析报告基于 Oracle Fusion Cloud Financials 26C 官方文档体系整理,涵盖设计哲
  • 阴阳师自动化脚本终极指南:如何用OnmyojiAutoScript解放双手,告别重复操作
  • 番茄小说下载器完整指南:三步快速下载离线阅读番茄小说
  • 佛山二手奢侈品包包变现,警惕商家夸大磨损恶意砍价 - 全城热点
  • ADS127L01高精度ADC:工业振动分析与宽频带信号采集实战指南