文档目录
AI智能功能

简介

本文件面向DouPHP的AI智能功能开发者,系统性说明后台AI应用管理、提示词组装、内容生成(文本/翻译/批量)、图像生成(含参考图与横幅Banner)、异步任务提交与轮询、用量记录与审计等能力。文档覆盖聊天对话管理、知识库构建、模型调用、响应处理、任务调度、并发控制、结果缓存、错误重试等关键机制,并提供可操作的集成与扩展建议。

项目结构

AI相关代码主要分布在以下位置:

  • 配置:AI提示词、图片尺寸策略、Banner素材限制等集中配置
  • 控制器:后台AI应用列表、新增/编辑、删除、批量操作等入口
  • 服务层:应用策略、提示词组装、生成执行、任务提交、用量记录、批量幂等保护
  • 模型:AI应用数据表映射与查询构造器
  • 核心网关:AiGateway统一封装不同AI供应商驱动(在core/service/ai中)
graph TB
A["后台控制器<br/>AiController"] --> B["应用服务<br/>ApplicationService"]
B --> C["策略与校验<br/>ApplicationPolicy"]
B --> D["Schema构建<br/>SchemaBuilder(外部)"]
A --> E["任务服务<br/>TaskService"]
E --> F["异步任务仓库<br/>AsyncTaskRepository(外部)"]
A --> G["生成服务<br/>GenerateService"]
G --> H["提示词组装<br/>PromptComposer"]
G --> I["AI网关<br/>AiGateway(外部)"]
G --> J["用量记录<br/>UsageRecorder(外部)"]
G --> K["批量幂等保护<br/>BatchRequestGuard"]
G --> L["批量导入<br/>BatchImportManager(外部)"]

核心组件

  • 应用管理:提供AI应用的增删改查、按形态/任务类型筛选、模块字段动态加载、批量操作
  • 提示词引擎:按placement/task_type组合system/user消息,注入站点知识、表单快照、用户指令与应用默认要求
  • 生成执行:支持assist(单字段)、translate(翻译)、fill(结构化表单)、batch(批量入库);图像应用走文生图链路
  • 任务调度:对长耗时或异步驱动的任务进行提交与状态返回,前端轮询展示
  • 并发与幂等:批量生成使用短时文件锁防止重复提交
  • 用量与审计:记录每次调用的成功/失败、模型、管理员、IP、元数据与消息摘要

架构总览

整体采用“控制器-服务-网关”分层:

  • 控制器负责路由与视图渲染
  • 服务层编排业务逻辑(策略、提示词、生成、任务、用量)
  • 通过AiGateway统一对接底层驱动(文本/图像/视频),屏蔽供应商差异
  • 配置集中管理提示词模板、图片尺寸策略、Banner限制等
sequenceDiagram
participant U as "管理员"
participant C as "AiController"
participant S as "GenerateService"
participant P as "PromptComposer"
participant G as "AiGateway"
participant R as "UsageRecorder"
U->>C : 提交生成请求
C->>S : 调用generateField/generateForm/generateBatch
S->>P : 组装messages/imagePrompt
P-->>S : 返回消息或提示词
S->>G : chat/chatJson/generateImage/submitAsyncTask
G-->>S : 返回{success, data/error}
S->>R : 记录用量与审计
S-->>C : 返回结果或任务信息
C-->>U : 渲染结果或轮询任务

详细组件分析

应用管理与策略

  • 列表与分页:支持按placement、task_type、status筛选,并一次查询关联模型名称减少N+1
  • 新增/编辑:通过策略校验placement与task_type匹配性、模型是否支持该任务、必填字段约束
  • 删除与批量:二次确认、审计日志记录
  • 模块字段:按模块名动态返回字段定义,供前端渲染Schema
flowchart TD
Start(["进入应用管理"]) --> List["列表筛选与分页"]
List --> Create{"新增/编辑?"}
Create --> |是| Policy["策略校验<br/>placement-taskType匹配<br/>模型支持任务<br/>必填字段检查"]
Policy --> Save["写入数据库并审计"]
Create --> |否| Delete{"删除/批量?"}
Delete --> Confirm["二次确认"]
Confirm --> Remove["删除并审计"]
Remove --> End(["完成"])
Save --> End

提示词组装与知识库

  • 两维选择:按task_type取system提示词,按placement取instruction
  • 上下文注入:站点基础信息、表单快照、当前字段值、用户当次要求、应用默认要求
  • 图像提示词:banner风格、标题/副标题排版、画布尺寸与裁切区、参考图用法指令
classDiagram
class PromptComposer {
+compose(app, options) array
+instruction(placement, vars) string
+imagePrompt(app, options) string
-formatFormSnapshot(snapshot) string
-bannerTextInstruction(options) string
-bannerLayout(app, options) string
}
class SiteKnowledgeBuilder {
+build() string
}
class PromptCatalog {
+system(task_type) string
+label(key) string
+instruction(placement, vars) string
+bannerStyle(style) string
+bannerMaterial(mode) string
}
PromptComposer --> PromptCatalog : "读取模板与标签"
PromptComposer --> SiteKnowledgeBuilder : "获取站点知识"

生成执行(文本/翻译/批量/图像)

  • assist:单字段正文生成,支持图像应用时走文生图链路
  • translate:纯文本翻译,保留HTML结构与占位
  • fill:按JSON Schema生成结构化字段,返回给前端回填
  • batch:生成items数组后批量导入到对应模块,支持异步驱动自动转任务
  • 图像应用:尺寸归一化、极端比例裁剪、参考图解析(data URI或附件号转base64)
sequenceDiagram
participant C as "控制器"
participant G as "GenerateService"
participant P as "PromptComposer"
participant GW as "AiGateway"
participant UR as "UsageRecorder"
C->>G : generateField/generateForm/generateBatch
alt 文本路径
G->>P : compose()
P-->>G : messages
G->>GW : chat/chatJson(modelId, messages/schema)
GW-->>G : {success,data/error}
else 图像路径
G->>P : imagePrompt()
P-->>G : prompt
G->>GW : generateImage(modelId, params)
GW-->>G : {success,result}
end
G->>UR : record(result, app_id, admin_id, ip, metadata, messages/prompt)
G-->>C : 返回正文/字段/导入结果/任务信息

异步任务与轮询

  • 提交:当目标驱动为异步时,GenerateService/TaskService会提交任务并落账,返回task_id与status
  • 轮询:由TaskController直接调用AiGateway::pollAsyncTask(本服务不参与轮询逻辑)
  • 列表:支持按status、task_type筛选,聚合模型/供应商/管理员名称
sequenceDiagram
participant UI as "后台界面"
participant TS as "TaskService"
participant GW as "AiGateway"
UI->>TS : submit(appId, prompt, post)
TS->>GW : submitAsyncTask(modelId, {prompt}, meta)
GW-->>TS : {success, task_id, status}
TS-->>UI : 返回任务ID与状态
UI->>GW : pollAsyncTask(task_id)
GW-->>UI : 返回任务结果或进度

并发控制与幂等

  • 批量生成指纹:基于管理员、应用、提示词、数量、上下文的哈希作为指纹
  • 短时文件锁:防止同一指纹在短时间内重复提交,过期自动释放
  • 失败清理:生成失败时主动释放锁,避免死锁
flowchart TD
A["开始批量生成"] --> B["计算指纹"]
B --> C{"获取锁成功?"}
C --> |否| E["拒绝重复提交"]
C --> |是| D["执行生成流程"]
D --> F{"成功?"}
F --> |是| G["释放锁"]
F --> |否| H["释放锁并报错"]
G --> I["结束"]
H --> I
E --> I

图像生成与尺寸归一化

  • 尺寸策略:按模型族/供应商预设范围或固定集合归一化,极端比例自动换基础尺寸并记录裁切区
  • 参考图:仅当上游支持图生图时解析,支持data URI与附件号转base64,最多4张且单张有限制
  • Banner:支持风格、主副标题排版、画布尺寸与裁切区指令
flowchart TD
S["输入size/contentAlign/banner"] --> V["校验size格式与contentAlign"]
V --> R{"极端比例?"}
R --> |是| N["映射到合法gen_size"]
R --> |否| P["保持原尺寸"]
N --> T["计算band_ratio"]
P --> T
T --> M["解析参考图(若支持)"]
M --> Q["组装imagePrompt"]
Q --> O["调用generateImage"]

依赖关系分析

  • 控制器依赖服务层,服务层依赖策略、提示词、网关、仓库、记录器等
  • 模型提供数据访问与查询构造器
  • 配置集中管理提示词与图片策略
graph LR
AC["AiController"] --> AS["ApplicationService"]
AC --> GS["GenerateService"]
AC --> TS["TaskService"]
AS --> AP["ApplicationPolicy"]
GS --> PC["PromptComposer"]
GS --> AG["AiGateway"]
GS --> BRG["BatchRequestGuard"]
TS --> AR["AsyncTaskRepository"]
AS --> AM["AiApplication"]

性能与成本优化

  • 批量上限与策略:通过策略限制批量条数,避免单次过大请求导致超时或高成本
  • 尺寸归一化:将非标准尺寸映射到模型支持范围,减少失败重试与无效调用
  • 异步任务:长耗时任务自动转异步,提升用户体验并降低同步阻塞
  • 用量记录:每次调用记录成功/失败、模型、管理员、IP、元数据与消息摘要,便于成本核算与质量监控
  • 并发保护:短时文件锁防止重复提交,降低重复成本与资源浪费

故障排查指南

  • 应用未找到或状态异常:检查应用是否存在、状态是否为启用、placement是否与请求匹配
  • 模型与任务不匹配:检查task_type与model_code/provider_code是否满足媒体/文本任务约定
  • 提示词为空:图像应用需确保最终提示词非空,否则抛出错误
  • 批量重复提交:检查短时锁是否被占用,必要时清理缓存目录中的锁文件
  • 参考图解析失败:确认上游支持图生图、文件存在且大小不超过限制、路径正确

结论

DouPHP的AI智能功能以清晰的分层与策略化设计,实现了文本生成、翻译、批量入库与图像生成的完整闭环。通过提示词引擎、尺寸归一化、异步任务、用量记录与并发保护,兼顾了易用性、稳定性与成本控制。开发者可在此基础上扩展新的AI工作流、接入更多供应商、定制提示词与策略,以满足多样化业务需求。

附录:集成与扩展指南

  • 集成不同AI供应商

    • 通过AiGateway统一接口调用chat/chatJson/generateImage/submitAsyncTask,无需修改上层服务
    • 在配置中声明模型代码、供应商代码与图片尺寸策略,确保策略与驱动一致
    • 参考路径:admin/service/ai/GenerateService.php:102-786、config/ai.php:100-166
  • 自定义AI工作流

    • 在GenerateService中新增方法,复用PromptComposer与AiGateway,结合策略与用量记录
    • 如需异步,遵循submitAsyncIfNeeded模式,返回任务信息供前端轮询
    • 参考路径:admin/service/ai/GenerateService.php:758-786
  • 扩展AI功能模块

    • 新增模块字段:通过SchemaBuilder与模块字段接口动态返回字段定义
    • 新增批量导入:实现BatchImportManager的supports/import接口
    • 参考路径:admin/service/ai/ApplicationService.php:340-347
  • 提示词与知识库

    • 在config/ai.php中维护system/instruction/labels/banner_styles等模板
    • 通过SiteKnowledgeBuilder注入站点基础信息,增强生成相关性
    • 参考路径:config/ai.php:31-98、admin/service/ai/Prompt/PromptComposer.php:51-288
  • 性能与成本监控

    • 利用用量记录与审计日志分析调用量、成功率、失败原因
    • 调整批量上限、尺寸策略与异步阈值,平衡体验与成本
    • 参考路径:admin/service/ai/GenerateService.php:131-156、config/ai.php:100-166
添加日期:2026-10-05