Skip to content

032. AI 简历后端表结构与 OpenAI 格式代理

学习目标

这一节完成 AI 简历项目的后端基础,包括简历模板、用户简历和 OpenAI 格式代理。

学完后,你应该能理解:

  • AI 简历为什么要保存模板源码;
  • 预览图和导出图为什么可能不同;
  • 简历模板表和用户简历表分别存什么;
  • 为什么长文本字段要用 longtext
  • 通用 CRUD Router 如何快速生成接口;
  • lambda app 注册路由是什么写法;
  • LangChain / LangGraph 接口格式和 OpenAI 格式有什么差异;
  • 为什么要加 OpenAI 格式代理。

模板需要保存源码

AI 简历模板不只是一个图片。

它需要保存模板源码。

原因是:

  • 前端要根据源码渲染模板;
  • AI 修改模板时,改的是源码;
  • 用户选择模板时,本质上选择的是一份可编辑结构;
  • 后续导出图片或 PDF 也依赖模板源码。

所以模板表里要有字段保存源码内容。

这类字段通常会比较长,不能用普通短字符串。

预览图和导出图

模板会有预览图。

预览图通常会经过压缩,用来在列表里快速展示。

但用户真正导出的图片不一定压缩。

可以理解成:

图片类型用途
预览图列表展示,体积小,加载快
导出图最终使用,质量更高

所以模板表里要区分源码、预览资源和最终导出效果。

不要把“预览图片”当成模板本身。

简历模板表

简历模板表保存的是可复用模板。

它通常包括:

  • 模板 ID;
  • 模板名称;
  • 模板源码;
  • 预览图;
  • 创建时间;
  • 更新时间;
  • 其他描述信息。

模板是公共资源,多个用户都可以基于同一个模板创建自己的简历。

用户简历表

用户简历表保存的是用户自己的简历数据。

它通常包括:

  • 用户简历 ID;
  • 所属用户;
  • 使用的模板;
  • 简历源码;
  • 简历数据;
  • 预览或导出信息。

用户简历和模板不是一回事。

模板是“样式和结构”,用户简历是“某个人填写后的具体内容”。

为什么用 longtext

简历源码和简历数据都可能很长。

普通字符串字段不够用。

MySQL 里有多种文本类型,例如:

  • tinytext
  • text
  • mediumtext
  • longtext

longtext 能容纳更长文本,适合保存大段源码、JSON、富文本或 AI 生成内容。

虽然 longtext 也有上限,但对几万到几十万字符的学习项目内容通常足够。

创建表和导入数据

后端先执行 SQL 创建简历模板表,再导入模板数据。

用户简历表也一样:

  1. 执行建表 SQL;
  2. 导入初始化数据;
  3. 在数据库工具里确认数据存在;
  4. 创建对应 model 类;
  5. 注册通用 CRUD 路由。

这样前端就可以通过接口查询模板和用户简历。

注册通用路由

有了通用 CRUD 封装后,新增表不需要手写所有接口。

只要提供:

  • model 类;
  • 路由前缀;
  • 查询参数;
  • 新建参数;
  • 更新参数。

通用函数就能注册对应接口。

这就是前面抽 BasicModel 和通用 Router 的价值。

lambda app 是什么

注册路由时会看到类似 lambda app: ... 的写法。

它本质上就是一个匿名函数。

可以把它理解成:

py
def register(app):
    add_model_routes(app, ...)

写成 lambda 只是为了让注册配置更短。

如果你不熟悉 lambda,可以先把它看成“传一个函数进去,后面再执行”。

后端项目不必拆太碎

多个实战功能可以放在同一个后端项目里。

原因是很多能力会复用:

  • 文件上传;
  • 模型调用;
  • 用户信息;
  • 通用 CRUD;
  • 数据库连接;
  • 认证能力。

如果每个小项目都单独建后端,就要重复部署、重复写上传、重复维护环境。

学习阶段把多个项目能力合到一个后端,更容易复用基础能力。

前端 AI 对话组件的格式问题

AI 简历前端会用到对话组件。

有些对话组件默认只认识 OpenAI 格式的请求和响应。

但 LangChain、LangGraph 或不同模型平台的格式不一定完全一致。

如果直接把 LangGraph 的工具调用结果丢给组件,它可能无法正确显示:

  • 工具调用;
  • 工具中断;
  • 工具执行结果;
  • 多轮状态恢复。

要完整支持 LangGraph,需要专门封装前端组件。

为什么先做 OpenAI 格式代理

AI 简历项目为了先把功能跑通,会增加一个 OpenAI 格式代理接口。

它的目标是:

  • 入参尽量符合 OpenAI 格式;
  • 出参也尽量符合 OpenAI 格式;
  • 前端对话组件可以直接使用;
  • 暂时不深度改造前端组件。

这是一种工程取舍。

完整封装 LangGraph 组件会更强,但会花更多时间。当前先用 OpenAI 格式代理,把 AI 简历核心功能推进起来。

关闭不必要的深度思考

某些模型支持控制是否启用深度思考。

如果当前任务不需要深度思考,开启它可能只会增加等待时间和 token 消耗。

所以代理层可以根据模型能力传入对应参数,把不需要的思考过程关掉。

不同模型平台的参数名可能不同,不是所有模型都支持同一个参数。

AI 简历后端完成范围

到这里,AI 简历后端主要能力已经具备:

  • 简历模板表;
  • 用户简历表;
  • 通用查询接口;
  • 新建、更新、删除接口;
  • 文件上传接口;
  • OpenAI 格式代理接口。

后续重点会转向前端。

AI 简历的复杂度主要在前端:模板编辑、预览、对话、源码更新、图片导出和用户交互都会集中在前端实现。

AI Agent 课程学习文档。