Skip to main content
AI报告系统是一个基于模板驱动的智能报告生成平台,通过集成大语言模型和JSON Schema约束,实现高质量、结构化的报告自动生成。

1.1 核心特性

  • 模板驱动: 基于Word模板,支持书签和占位符动态替换
  • AI增强: 集成大语言模型进行内容润色和结构化提取
  • JSON约束: 使用JSON Schema确保输出格式的一致性和数据完整性
  • 自动化流程: 端到端的报告生成,从模板解析到文件下载

1.2 技术架构

用户输入 → 内容润色(可选) → AI结构化提取 → JSON修复 → Word模板填充 → 文件下载

2. 核心组件

2.1 服务层组件

AiReportConfService

报告配置服务接口,定义了报告模板管理的核心业务逻辑:
  • 模板上传与解析
  • 配置信息管理
  • 报告生成协调

AiReportConfServiceImpl

报告配置服务实现类,负责:
  • Word文档解析(书签、占位符识别)
  • AI模型调用与结果处理
  • 模板填充与文件生成

2.2 控制器层

AiReportConfController

报告管理REST控制器,提供以下API端点:
方法路径功能描述
POST/aiReportConf/parse解析Word模板文档
POST/aiReportConf/download生成并下载报告

3. 模板管理流程

3.1 模板配置流程

步骤1: 模板文件上传

通过文件服务上传Word模板文件,支持.docx格式。

步骤2: 模板解析

使用parseDoc方法解析Word文档结构:
// 解析Word文档中的书签和占位符
List<AnchorContext> bookmarkList = DefaultAnchors.BOOKMARK_ANCHOR.locate(document);
List<AnchorContext> placeholderList = DefaultAnchors.PLACEHOLDER_ANCHOR.locate(document);

步骤3: 字段配置

report_marked字段中配置JSON格式的字段映射关系。

步骤4: 模板保存

将解析后的模板信息和配置保存到数据库。

3.2 模板解析功能

系统支持两种类型的占位符:
  • 书签(Bookmark): Word文档中的书签标记
  • 占位符(Placeholder): 自定义的文本占位符

4. 报告生成流程

4.1 请求参数

AiReportCompletionsDTO

字段类型描述
reportIdLong报告配置ID
modelStringAI模型标识
promptString生成提示词
polishString是否需要AI润色

4.2 生成流程详解

步骤1: 内容润色(可选)

polish参数为YES时,系统会对用户输入进行AI润色:
if (YesNoEnum.YES.getCode().equals(completionsDTO.getPolish())) {
    String chatted = aiAssistant.getKey().chat(
        PromptBuilder.render("report-polish.st", 
            Map.of("reportTitle", reportConfEntity.getReportTitle(),
                   "reportPrompt", reportConfEntity.getReportPrompt(),
                   "prompt", completionsDTO.getPrompt(),
                   "username", SecurityUtils.getUser().getName(),
                   "systemTime", DateUtil.now()))
    );
    completionsDTO.setPrompt(chatted);
}

步骤2: 结构化数据提取

  1. 构建JSON Schema: 根据模板字段配置构建数据约束
  2. AI模型调用: 使用JSON Assistant模型提取结构化数据
  3. 数据修复: 使用JSONRepairUtil.repair()修复JSON格式
// 构建JSON Schema
JsonSchema jsonSchema = JsonSchema.builder()
    .name("ReportResult")
    .rootElement(JsonObjectSchema.builder()
        .addProperties(fieldProperties)
        .required(fieldNames)
        .build())
    .build();

// 调用AI模型
ChatResponse chatted = aiJSONAssistant.getLeft().chat(builder.build());
String repair = JSONRepairUtil.repair(chatted.aiMessage().text());

步骤3: 模板填充与下载

将AI生成的结构化数据填充到Word模板中:
// 将AI生成的数据填充到Word模板
Map bean = JSONUtil.toBean(repair, Map.class);
EasyWord.of(templateInputStream).doWrite(bean).toOutputStream(response.getOutputStream());

5. 提示词模板

5.1 报告润色模板 (report-polish.st)

## 核心目标
{reportPrompt}

## 输入信息
{prompt}

参考资料:当前时间:{systemTime},用户名:{username}。

## 输出要求
* 输出内容必须是优化后的报告本身,应清晰、简洁、准确地反映报告内容。
* 不得包含任何markdown语法的修饰字符例如:``` ** ###

5.2 系统提示词模板 (report-system-json.st)

您应该始终遵循指令并输出一个有效的JSON对象。请根据指令使用指定的JSON对象结构。
当前时间: {systemTime}

5.3 用户提示词模板 (report-user-json.st)

请根据提供的 JSON Schema,严格解析并格式化以下用户输入内容 (`{userInput}`) 为格式化为一个 JSON 对象。

在处理过程中,请遵循以下规则:
1. **严格遵守 Schema**: 输出的 JSON 对象必须完全符合 JSON Schema 中定义的结构、字段类型和约束。
2. **解析与提取**: 从用户输入中准确提取信息,填充到 JSON 对象的相应字段中。
3. **补充与优化**: 如果用户输入中的信息对于某个 Schema 字段不规范、不完整或缺失,请根据 Schema 的定义和用户输入的上下文,尝试进行合理的补充或优化,确保字段值有效且符合预期。
4. **输出格式**: 仅输出最终生成的 JSON 对象字符串,不包含任何额外文本、解释或标记。

## JSON Schema
{jsonSchema}