ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

第40章:【高级篇综合实战】从零打造生产级 FastAPI 平台

第40章:【高级篇综合实战】从零打造生产级 FastAPI 平台 1. 项目背景业务场景SaaS 工厂是一个面向中小企业的多租户管理平台支持用户管理、租户隔离、权限控制RBACABAC、消息通知、审计日志、开放 API 等功能。公司决定用 FastAPI 从零构建——这是高级篇第 31-39 章的最终综合实战。你作为技术负责人需要交付一个具备生产治理能力的平台化方案。这不仅仅是写代码——而是将前面 39 章的全部知识体系串联为一个可落地的工程方案高级篇技能来源章节在本章的应用ASGI 协议理解第 31 章自定义 ASGI 中间件做平台级限流路由注册源码第 32 章自定义 APIRoute 做租户注入依赖注入源码第 33 章多租户上下文依赖 权限矩阵Pydantic 高级用法第 34 章TypeAdapter 批量校验 model_validator框架扩展第 35 章统一响应 审计路由 Router 工厂流式导出第 36 章审计日志流式导出性能优化第 37 章uvloop GC 调优安全合规第 38 章RBAC 字段脱敏 哈希链审计SRE 实践第 39 章SLO 降级 故障演练验收标准核心链路用户注册→登录→创建租户→添加成员→数据操作全链路测试通过P99 200ms缓存命中时核心链路可用性 99.95%全链路追踪覆盖率 100%每个接口都有 Trace安全清单全部通过RBAC/字段脱敏/审计链/依赖扫描2. 项目设计场景项目 Final Review。大师把所有架构图铺在会议桌上——这是 39 章的技术结晶。大师铺开架构图这不是一个’项目’——这是一个’平台模板’。之后公司所有新服务都基于这个模板搭建。我们先过一遍架构全景┌─────────────────────────────────┐ │ API Gateway (Nginx) │ └─────────┬───────────────────────┘ │ ┌───────────────┼───────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │ Auth API │ │ Tenant API │ │ Public API │ │ (8001) │ │ (8002) │ │ (8003) │ │ JWT OAuth │ │ RBAC ABAC │ │ Rate Limited │ └──────┬──────┘ └──────┬───────┘ └────────┬─────────┘ │ │ │ └────────────────┼─────────────────────┘ │ ┌─────────────┼─────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌──────────┐ ┌─────────────────┐ │ PostgreSQL │ │ Redis │ │ Celery Worker │ │ (Per Tenant │ │(Cache │ │ (Notifications │ │ DB Schema) │ │ Queue) │ │ Audit) │ └─────────────┘ └──────────┘ └─────────────────┘ │ │ │ └─────────────┼──────────────┘ │ ┌─────────────┴─────────────────┐ │ Observability Stack │ │ Prometheus Grafana Jaeger │ └───────────────────────────────┘小胖惊叹“这张图值 40 章架构层能看到基础篇的分层、中级篇的缓存/队列/部署、高级篇的源码/扩展/安全——一个都没少。”小白“最关键的设计决策是什么所有 39 章的技术都在但相互矛盾怎么办”大师三个核心决策数据库隔离策略多租户选择共享数据库 租户 ID 过滤而非每个租户独立数据库。因为目标客户是中小企业——单个租户数据量小独立数据库运维成本远大于实现复杂度。服务拆分粒度初期 3 个服务Auth / Tenant / Public API——不是 10 个微服务。拆得太细运维成本 解耦收益。等业务量上来后再拆。框架扩展 vs 依赖注入可以注入的行为用 DI租户上下文、当前用户必须全局的行为用框架扩展统一响应、审计路由、中间件。这是经过 39 章实践验证的决策——不是拍脑袋。小胖“那这个平台和之前第 15 章、第 30 章的综合实战最大的区别是什么我感觉每个级别都在搭系统。”小白抢答“不是搭系统是搭可复用的平台基础。第 15 章是’能跑就行’的单体第 30 章是’能拆就行’的双服务——但第 40 章的目标是’之后所有项目都基于这个模板搭’。区别在于——前面的综合实战是终点交付即结束这次的综合实战是起点交付后作为土壤所有新服务都在上面生长。”大师“小白总结到位。我再补充一个维度——治理能力。第 15 章没有降级、没有 SLO、没有审计链、没有字段脱敏。这个平台把这些’治理能力’作为标配——就像新楼盘的消防系统和电梯——不是选配是基础。”技术映射平台工程Platform Engineering是 SRE 的进阶——不只为单一服务提供可靠性而是为全公司的所有服务提供一个内部开发者平台IDP。这个平台模板就是 IDP 的最小可行产品MVP——之后逐步增加模板化生成新服务cookiecutter、统一 CI/CD 流水线、自服务开发者门户Backstage。小胖“那我有一个实际的问题——团队现在只有 5 个人真的需要搭这么复杂的平台吗感觉 30% 的时间都在写基础设施代码。”大师这个担忧很合理。我给你一个’渐进式平台’路线图——不是一次搭完而是按需长出来阶段优先级做的事团队规模Day 1P0统一响应格式 统一异常处理 配置管理1-3 人Week 2P0多租户依赖注入 RBAC 权限3-5 人Month 1P1审计日志哈希链 降级开关 SLO Dashboard5-8 人Month 3P2自定义 OpenAPI 供应商文档 TypeScript SDK 生成8-15 人Month 6P2平台模板 pip 包化 cookiecutter 项目生成器15 人你看——Day 1 只需要做两件事代码量不超过 500 行。但这个路线图保证了 6 个月后的你不会后悔今天的架构决策。小白“最后一个问题——多租户的’行级隔离’共享 DB tenant_id 过滤和’独立数据库’各有什么风险什么时候该从行级隔离升级到独立数据库”大师“关键决策因素——单个租户的数据量和安全隔离要求。共享数据库的风险是一个租户的大查询拖慢整库比如导出 100 万行数据影响其他租户。独立数据库的风险是运维成本每个租户一个数据库——1000 个租户 1000 个数据库备份/迁移/监控全翻 1000 倍。升级信号当某个租户的数据超过 10GB 或 QPS 超过 1000就应该考虑独立数据库——但在此之前行级隔离 数据库连接池隔离足够。”3. 项目实战——分 10 步交付生产级平台分步实现步骤一平台级应用工厂融合第 16/35 章——目标一行代码生成完整 FastAPI 应用坑预警create_platform_app()被 3 个服务调用——如果工厂函数中有import uvloop; uvloop.install()它只会生效一次uvloop 的install()是全局的、幂等的。但如果工厂函数同时被测试代码调用——测试通常用默认 asyncio 事件循环——uvloop 的全局替换可能导致部分测试框架如 pytest-asyncio行为异常。解决在工厂函数中通过环境变量UVLOOP_ENABLEDtrue控制是否启用 uvloop——生产环境启用测试环境禁用。app/platform.py——统一的 FastAPI 平台工厂函数fromfastapi_commonsimportcreate_domain_router,UnifiedJSONResponse,AuditedRoutedefcreate_platform_app(module_name:str,version:str)-FastAPI:平台工厂——生成带有完整治理能力的 FastAPI 应用importuvloop;uvloop.install()appFastAPI(titlef平台 -{module_name},versionversion,default_response_classUnifiedJSONResponse,)# 中间件第 21 章app.add_middleware(TraceMiddleware)app.add_middleware(SensitiveDataMaskMiddleware)# 可观测性第 24 章setup_metrics(app)setup_tracing(app)# 降级管理器第 39 章app.state.degradationDegradationManager()returnapp步骤二多租户数据隔离融合第 33/38 章app/core/multitenant.py——跨所有服务共享的租户核心模块# 租户上下文全链路可用tenant_ctx:contextvars.ContextVar[int]contextvars.ContextVar(tenant_id,default0)# 租户注入路由自定义 APIRoute第 32/35 章classTenantAwareRoute(AuditedRoute):所有路由自动注入租户上下文defget_route_handler(self):originalsuper().get_route_handler()asyncdefhandler(request:Request):# 从 Header/JWT 解析 tenant_idtenant_idrequest.headers.get(X-Tenant-ID)iftenant_id:tenant_ctx.set(int(tenant_id))returnawaitoriginal(request)returnhandler# 租户隔离的 Repository 基类第 33 章classTenantRepository(BaseRepository[ModelType]):asyncdefget_all(self,db:AsyncSession,**filters):stmtselect(self.model)iftenant_id:tenant_ctx.get():stmtstmt.where(self.model.tenant_idtenant_id)# ... 应用 filters ...returnawaitdb.execute(stmt)步骤三权限系统融合第 38 章 RBAC ABACapp/core/permissions.py——集中的权限管理复用第 38 章方案增加租户级权限# 系统角色 租户角色classSystemRole(str,Enum):SUPER_ADMINsuper_admin# 平台TENANT_OWNERtenant_owner# 租户所有者TENANT_MEMBERtenant_member# 动态权限校验融合角色 租户上下文asyncdefrequire_tenant_permission(perm:Permission):def_check(userDepends(get_current_user),tenantDepends(get_current_tenant)):ifuser.system_roleSystemRole.SUPER_ADMIN:returnTruemembershipget_membership(user.id,tenant)ifpermnotinROLE_PERMISSIONS.get(membership.role,set()):raiseForbiddenException(f缺少权限:{perm.value})returnTruereturnDepends(_check)步骤四审计日志哈希链融合第 38 章——目标不可篡改的审计记录复用第 38 章的AuditService和哈希链验证——作为平台级功能所有服务写入同一个audit_logs表按tenant_id分区。在平台层面增加一个定时 Celery Beat 任务——每 24 小时自动验证一次哈希链完整性并将最新的chain_head_hash备份到外部只读存储S3/OSS。如果验证失败发现篡改痕迹立即触发 P0 告警。坑预警哈希链的保护范围仅限于已存储的审计日志——如果攻击者有数据库 root 权限他可以修改所有日志的current_hash使其自洽。防御措施将每天的chain_head_hash定时写入外部不可变存储如 AWS S3 Object Lock 的 Compliance mode 或区块链存证服务——这样即使数据库被全量篡改外部锚定的哈希也能暴露出总长度/最终哈希不一致的问题。步骤五流式导出 断点续传融合第 36 章——目标零内存压力的百万行数据导出复用第 36 章的StreamingResponse 游标分页——作为平台级的数据导出模块。平台级实现要求支持 CSV/Excel 两种格式通过?formatcsv|xlsx切换支持按租户过滤X-Tenant-IDheader 自动注入 WHERE 条件支持字段选择?columnsid,name,status大文件下载支持 Range 断点续传FileResponse自动处理导出过程中客户端断开时自动停止数据库查询request.is_disconnected()检查坑预警StreamingResponse配合request.is_disconnected()需要传入request对象给生成器。如果生成器是在路由函数之外定义的如独立的 generator 函数需要通过参数绑定传入。另一个坑Excel 格式xlsxwriter不支持流式——要先写到临时文件再返回FileResponse而非StreamingResponse。对于超大 Excel 文件建议分片导出多个 xlsx 文件再打包 zip 下载。步骤六自定义 OpenAPI 生成器融合第 23/35 章app/core/openapi_platform.py——平台级文档定制defplatform_openapi(app:FastAPI,tenant_id:int|NoneNone):根据租户生成定制 OpenAPI 文档——隐藏其他租户的功能schemaget_openapi(titleapp.title,versionapp.version,routesapp.routes)iftenant_id:# 根据租户的订阅计划过滤可见接口planawaitget_tenant_plan(tenant_id)visible_tags{认证授权,用户管理}ifplanpro:visible_tags.add(高级分析)schema[paths]{p:mforp,minschema[paths].items()ifany(tinvisible_tagsforminm.values()fortinm.get(tags,[]))}returnschema步骤七SRE 驾驶舱 API融合第 39 章app/api/v1/admin/sre.py——运维管理接口routerAPIRouter(prefix/admin/sre,tags[SRE 驾驶舱],dependencies[Depends(require_platform_admin)])router.get(/slo-status,summarySLO 状态)asyncdefslo_status():返回当前所有 SLO 的剩余 Error Budgetreturnawaitcompute_error_budgets()router.post(/degradation,summary设置降级级别)asyncdefset_degradation(level:str):awaitdegradation.set_level(DegradationLevel(level))# 同时广播到 Redis——所有实例生效return{level:level}router.get(/audit/verify-chain,summary验证审计日志哈希链)asyncdefverify_audit_chain(db:AsyncSessionDepends(get_db)):returnawaitAuditService(db).verify_chain()步骤八Docker Compose 全量编排融合第 26 章services:auth-api:{build:./services/auth,ports:[8001:8001]}tenant-api:{build:./services/tenant,ports:[8002:8002]}public-api:{build:./services/public,ports:[8003:8003]}postgres:{image:postgres:16-alpine}redis:{image:redis:7-alpine}celery-worker:{build:./services/tenant,command:celery...}prometheus:{image:prom/prometheus}grafana:{image:grafana/grafana,ports:[3000:3000]}jaeger:{image:jaegertracing/all-in-one,ports:[16686:16686]}步骤九压测验证 安全检查# 完整端到端压测k6 run scripts/loadtest/platform_e2e.js--vus500--duration10m# 安全检查清单pip-audit# → 0 vulnerabilitiescurl/api/v1/admin/audit/verify-chain# → {verified: true}# RBAC 权限矩阵校验自动化测试pytest tests/security/-v步骤十交付物清单交付物说明platform/完整项目代码3 个服务 共享核心platform/ARCHITECTURE.md架构图 技术决策记录platform/DEPLOYMENT.mdK8s 部署清单 环境变量矩阵platform/SECURITY.md安全检查清单platform/CHANGELOG.mdAPI 变更日志完整代码清单本项目完整代码见column/code/chapter40/包含 3 个服务、共享核心、完整基础设施配置和文档。测试验证下面是一套完整的端到端验收测试——覆盖从基础设施到业务的全栈验证。建议在 CI 中作为pre-release阶段的检查项。# ═══════════════════════════════════════════════# 1. 环境启动 冒烟测试# ═══════════════════════════════════════════════dockercompose up-d# 等所有服务 healthydockercomposeps--formattable {{.Name}}\t{{.Status}}# ═══════════════════════════════════════════════# 2. 多租户全链路测试# ═══════════════════════════════════════════════# 2a. 创建租户 1 租户管理员curl-s-XPOST http://localhost:8002/api/v1/tenants\-HAuthorization: Bearer$PLATFORM_ADMIN_TOKEN\-d{name:租户A 科技公司}# → tenant_id: 1# 2b. 租户 1 的管理员注册 创建成员curl-s-XPOST http://localhost:8001/api/v1/auth/register\-d{username:alice,tenant_id:1,role:tenant_owner,...}# 2c. 租户 2 创建一个相同用户名的用户——应该成功不同租户隔离curl-s-XPOST http://localhost:8001/api/v1/auth/register\-d{username:alice,tenant_id:2,role:tenant_owner,...}# → 两个 alice 在不同租户下互不冲突# 2d. 验证租户隔离——租户 1 看不到租户 2 的数据curl-shttp://localhost:8002/api/v1/users\-HX-Tenant-ID: 1\-HAuthorization: Bearer$TENANT1_TOKEN# 只返回 tenant_id1 的用户# ═══════════════════════════════════════════════# 3. 权限测试# ═══════════════════════════════════════════════# 3a. 普通成员尝试删除用户 → 403curl-s-XDELETE http://localhost:8002/api/v1/users/1\-HAuthorization: Bearer$MEMBER_TOKEN-w\nHTTP %{http_code}# HTTP 403# 3b. 租户管理员删除本租户用户 → 200curl-s-XDELETE http://localhost:8002/api/v1/users/1\-HAuthorization: Bearer$TENANT_ADMIN_TOKEN-w\nHTTP %{http_code}# HTTP 204# 3c. 字段级脱敏验证——普通成员看到脱敏手机号curl-shttp://localhost:8002/api/v1/users/2\-HAuthorization: Bearer$MEMBER_TOKEN|python-c import sys,json; djson.load(sys.stdin) assert 138****5678 in str(d) # 脱敏后 # ═══════════════════════════════════════════════# 4. 审计链完整性验证# ═══════════════════════════════════════════════curl-shttp://localhost:8002/api/v1/admin/audit/verify-chain# {verified: true, total_logs: 1523, errors: []}# ═══════════════════════════════════════════════# 5. 降级演练第 39 章# ═══════════════════════════════════════════════# 5a. 开启 READ_ONLY 降级curl-XPOST http://localhost:8002/api/v1/admin/sre/degradation\-HAuthorization: Bearer$ADMIN_TOKEN\-d{level:read_only}# 5b. 验证只读模式下写入被拒绝curl-s-XPOST http://localhost:8002/api/v1/orders\-HAuthorization: Bearer$TOKEN\-d{product_id:1,quantity:1}-w\nHTTP %{http_code}# HTTP 503 — 系统处于只读维护模式# 5c. 恢复curl-XPOST http://localhost:8002/api/v1/admin/sre/degradation\-HAuthorization: Bearer$ADMIN_TOKEN\-d{level:full}# ═══════════════════════════════════════════════# 6. 压测验证# ═══════════════════════════════════════════════k6 run scripts/loadtest/platform_e2e.js--vus500--duration10m# P95 200ms, 错误率 0.1%# ═══════════════════════════════════════════════# 7. 安全检查清单# ═══════════════════════════════════════════════pip-audit# → 0 vulnerabilitiescurl/api/v1/admin/audit/verify-chain# → {verified: true}pytest tests/security/-v# → 全部通过kubectl get secrets-oyaml|greppassword# 检查 K8s Secret 是否明文# ═══════════════════════════════════════════════# 8. 交付验收# ═══════════════════════════════════════════════echo 平台交付验收检查清单 echo☐ 多租户数据隔离测试通过echo☐ RBAC ABAC 权限测试通过echo☐ 字段级脱敏验证通过echo☐ 审计哈希链完整性验证通过echo☐ 降级开关4 个级别生效echo☐ 1000 并发压测 P95 200msecho☐ 全链路 Jaeger Trace 覆盖率 100%echo☐ 自定义 OpenAPI 按租户过滤生效echo☐ 依赖扫描 0 漏洞echo☐ Docker Compose 一键启动echo☐ K8s 部署清单完整4. 项目总结优点 缺点对比维度本平台方案Django SaaS 框架自研微服务全家桶低代码平台定制灵活性极高源码级控制中Django 约束极高低开发效率中需手写模块高Django Admin低极高性能高ASGI 异步中WSGI高平台决定学习成本高需理解 40 章中极高低适用场景✓ 本平台方案适用于需要多租户数据隔离的 SaaS 产品需要细粒度权限控制的企业后台有专职后端团队的公司作为公司所有后续 FastAPI 项目的起始模板✗ 不适用简单 CMS 或 Landing Page——WordPress/Strapi 更合适原型验证阶段——过度架构设计会拖慢 MVP 交付注意事项共享核心shared kernel的版本管理当多个服务共享app/core模块时必须统一版本——用 monorepo 管理或发布为内部 pip 包fastapi-platform-core1.0.0。数据库 Schema 隔离 vs 行级隔离本章用了行级隔离tenant_id 列。如果租户需要的隔离级别更高独立 Schema需要改 Repository 的数据库连接逻辑。不要追求一次性完美这个平台模板应该随着实际业务需求迭代——不要在第 1 天就把所有 39 章的技术都塞进去。常见踩坑经验案例一共享核心模块的 import 地狱现象from app.core.permissions import require_permission在 auth 服务报ModuleNotFoundError: No module named app.models——因为permissions.py内部 import 了app.models.User而 auth 服务没有 User 模型。根因共享核心模块内部耦合了 domain 模型——它不再是纯核心。解决核心模块只包含纯逻辑配置、异常类、工具函数不 import 任何 domain 模型。案例二多服务部署的数据库迁移竞态现象auth 服务和 tenant 服务同时执行alembic upgrade head——两者都看到了同一个数据库的同一个迁移版本——并发写入alembic_version表造成版本混乱。根因多个服务共享数据库时没有协调迁移执行顺序。解决使用 K8s Job 作为初始化容器initContainer单独执行迁移——在所有服务 Pod 之前完成数据库迁移仅由一个 Job 执行。案例三平台模板与具体业务之间的剪刀差现象平台模板维护了 6 个月后团队发现模板和实际项目的差异越来越大——模板的新特性无法合并回项目。根因模板作为起点被 fork 后各自独立演化——没有向上游贡献的机制。解决将平台模板发布为 pip 包 项目通过继承/插件扩展——而非 fork 修改。模板升级后项目只需pip install --upgrade fastapi-platform-core。案例四多租户的tenant_ctxcontextvar 在 BackgroundTasks 中泄漏现象租户 A 的管理员导出了审计日志后台任务任务执行时tenant_ctx.get()返回了租户 B 的 ID——导出的日志混入了其他租户的数据。根因Python 的contextvars在asyncio.Task创建时会复制父 Task 的上下文——但如果后台任务线程池复用了线程而tenant_ctx没有被显式 set依赖自动从 Header 解析后台任务读到的可能是上一个请求残留在同一线程中的值。解决后台任务中一律显式传递tenant_id作为函数参数而非依赖 contextvar或者在任务创建时手动ctx.run(coro)传入正确的 contextvar 快照。案例五平台模板的 CI 执行时间从 3 分钟膨胀到 25 分钟现象随着平台功能增加3 个服务 × 3 种测试 × 安全检查CI 时间从 3 分钟涨到 25 分钟——开发者提交代码后要等近半小时才有反馈。根因每个服务都跑了完整的单元测试 集成测试 端到端测试——但其实不是每次提交都需要全跑。修改了auth服务的代码不需要跑tenant服务的集成测试。解决按服务拆 CI Job——auth-test、tenant-test、public-test并行执行GitHub Actions 的 matrix strategy。端到端测试只在main分支合并后跑不在 PR 中。安全检查pip-audit缓存结果——依赖不变时跳过。思考题终级如果未来需要从共享数据库 tenant_id 过滤升级为独立数据库 per tenant——当前架构的哪些模块需要改Repository 层的TenantRepository怎么适配路由层的租户解析怎么变请画出改造前后的数据库连接逻辑对比图。终级为本平台增加计费模块——根据租户的 API 调用次数计费。提示在中间件层面统计每个tenant_id的请求数量用 RedisZINCRBY滑动窗口计数器Celery Beat 每分钟汇总到计费服务的数据库。考虑如果 Redis 挂了如何确保计费数据不丢失降级方案架构设计题当前平台 3 个服务共享一个 Redis 和 PostgreSQL——当平台发展到 100 个租户、每天 100 万次 API 调用时哪些组件会成为瓶颈请提出至少 3 个架构演进方向如读写分离、缓存分片、服务拆分并评估每个方向的实施成本和收益。答案提示第 1 题核心改动在get_tenant_db依赖——从 “返回共享数据库会话 WHERE tenant_id” 变为 “返回 tenant_id 对应的独立数据库会话”。需要维护tenant_db_mapping表tenant_id → database_url在租户创建时自动初始化独立数据库和迁移。第 2 题中间件中ZINCRBY tenant:daily:calls 1 {tenant_id}key 带日期Celery Beat 每分钟ZRANGEBYSCORE汇总后清零。Redis 挂了时降级为本地内存计数器collections.Counter——但多实例不共享、重启丢失——对计费场景来说意味着该分钟的计费数据丢失财务上可用 Redis 恢复后补录。第 3 题第一个瓶颈大概率是 Redis热点 key 连接数→ 用 Redis Cluster 分片 本地缓存第 19 章的多级缓存。第二个是 PostgreSQL 的tenant_id列过滤没有利用分区表 → 使用 PostgreSQL 的PARTITION BY LIST (tenant_id)原生分区。第三个是 API 层本身的连接数 → 水平扩容 Nginx 限流。详见第 37 章的性能优化和第 39 章的 SRE 容量规划。全专栏完结。恭喜你完成了从Hello World到生产级平台的 40 章修炼之旅。回顾这趟旅程——你从第 1 章的 ASGI 协议入门到第 15 章交付第一个单体服务到第 30 章构建电商订单中台再到第 40 章从零打造生产级多租户平台。FastAPI 不仅是工具——它是一扇窗通往现代 Python Web 工程的完整知识体系。附录 A提供了源码阅读路线图附录 B是推荐工具链速查表附录 C复述了章节编写模板附录 D提供了各部门的推广阅读建议。愿你写出的每一行代码都能经得起生产环境的检验。延伸阅读与资源Java 工程师进阶从 JVM 生产排障到OpenJDK原理NumPy 从入门到生产落地全链路实战指南科学计算/向量化Redis 8 实战精讲从 CRUD 到源码构建高可用缓存系统Redis 实战修炼与原理进阶Python 3实战精进从脚本到高并发订单引擎python入门Rquests从菜鸟脚本到企业级SDK的网络实战圣经Milvus向量数据库实战修炼从 0 到 1精通向量检索与生产落地MongoDB 实战进阶与内核修炼后端工程师的 AI 转型第一课Ollama 与私有化大模型实战10倍开发者的 Dify 魔法书从零构建全栈 AI 应用后端工程师转型AI第一课-Ollama 与私有化大模型实战大型语言模型(LLM) vLLM 高性能推理落地实战Agent开发之LlamaIndex 实战修炼与源码进阶大语言模型Transformers 实战修炼与源码剖析
返回列表