1.更新生成内容的提示词
根据大纲生成内容的AI还是不太稳定,调了好久提示词,越调越不听话,越调格式越跑偏,最后干脆改变描述逻辑重写了一遍,比之前稳定多了。
public final static String system_content = "以下共分为四部分,分别为{格式描述}、{任务描述}、{格式讲解}、{任务举例}。" +
"{格式描述}" +
"【格式1】:封面页(换行) 标题:XXXXXXX(换行) 副标题:XXXXXXX(换行) 目录页(换行) XXX(换行) XXX(换行) XXX(换行) 内容页(换行) XXX(换行)" +
"【格式2】:封面页(换行) 标题:XXXXXXX(换行) 副标题:XXXXXXX(换行) 目录页(换行) XXX:XXXX(换行) XXX:XXXX(换行) XXX:XXXX(换行) 内容页(换行) XXX:XXXXXXXX(换行) 结尾页(换行) XXXXXX" +
"{任务描述}" +
"有两种可能的任务,每次只会是其中一种,根据输入的内容进行判断。" +
"第一种任务是,输入为一个PPT文件的主题,请根据该主题,严格按照【格式1】生成PPT的大纲。" +
"第二种任务是,输入为严格按照【格式1】提供的大纲,请根据大纲的各部分,严格按照【格式2】生成PPT的详细内容。" +
"注意:给出并且只给出严格按照指定格式生成的输出即可;不要添加任何加粗或符号;不需要对用户的任何问候、询问或提示。" +
"{格式讲解}" +
"以下是对【格式1】和【格式2】的讲解:" +
"1.“封面页”“目录页”“内容页”各代表一页幻灯片。" +
"2.“封面页”中,“标题:”后的“XXXXXXX”表示PPT文件的主题,“副标题:”后的“XXXXXXX”是对主题的简要解释。" +
"3.“目录页”中,“XXX”分别对应各“内容页”的主题,注意数量和内容要完全一致。" +
"4.“内容页”有多页,3页到5页。【格式1】中,“内容页”后的“XXX”是该内容页的主题,后面不需要再细分小标题;【格式2】中,“内容页”后的“XXX:XXXXXXXX”是对小主题的详细描述,后面的“XXXXXXXX”装入内容文本框,一定不要遗漏冒号。" +
"5.注意注意:每一个内容页都必须要有“内容页”作为开头!每一个内容页都必须要有“内容页”作为开头!每一个内容页都必须要有“内容页”作为开头!" +
"6.“结尾页”是根据前面的内容生成,装入结尾页内容“XXXXXX”。注意【格式1】与【格式2】中已经说明,第一种任务生成大纲时不需要结尾页,第二种任务生成内容时需要结合全文给出结尾页。" +
"7.我描述的所有“XXX”“XXXX”“XXXXXXX”等仅表示占位符,并不代表具体内容或字数限制。" +
"{任务举例}" +
"第一种任务举例:输入“鲜花”,输出“封面页 标题:鲜花 副标题:探索不同种类与花语 目录页 鲜花种类介绍 鲜花与花语 鲜花养护知识 内容页 鲜花种类介绍 内容页 鲜花与花语 内容页 鲜花养护知识”" +
"第二种任务举例:举例:输入“封面页 标题:鲜花 副标题:探索不同种类与花语 目录页 鲜花种类介绍 鲜花与花语 鲜花养护知识 内容页 鲜花种类介绍 内容页 鲜花与花语 内容页 鲜花养护知识”,输出“封面页 标题:鲜花 副标题:探索不同种类与花语 目录页 鲜花种类介绍:概述各类鲜花的特征与分布 鲜花与花语:了解不同鲜花所代表的意义 鲜花养护知识:掌握保持鲜花新鲜的方法 内容页 鲜花种类介绍:玫瑰、郁金香、百合、康乃馨等,各有其独特的形态与花语。 内容页 鲜花与花语:玫瑰代表爱情,郁金香代表优雅,百合代表纯洁,康乃馨代表母爱。 内容页 鲜花养护知识:正确的剪枝、水位控制、温度调节以及避免直射日光,是保持鲜花长久鲜艳的关键。 结尾页 通过对鲜花的种类、花语以及养护知识的深入了解,我们可以更好地欣赏和利用这些大自然的美丽赠礼。”";
2.更新PPT翻译部分
PPT翻译方面由于安全性限制(浏览器出于安全性考虑,不允许网页随意访问用户的文件系统路径,以防止恶意代码对用户的文件进行未经授权的访问或修改)前端和之前的后端代码无法适配,所以改了改代码,不再是输入路径进行处理,而是改成用户选择文件。
改后代码如下:
PPTModifier:
package top.pulselink.chatglmT;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PPTModifier {
public static void modifyPPT(ChatClient chatClient, String inputPath, String outputPath) throws IOException {
// 读取PPT文件
FileInputStream inputStream = new FileInputStream(inputPath);
XMLSlideShow ppt = new XMLSlideShow(inputStream);
inputStream.close();
// 获取每个幻灯片
for (XSLFSlide slide : ppt.getSlides()) {
// 获取幻灯片中的文本框
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFTextBox) {
XSLFTextBox textBox = (XSLFTextBox) shape;
String originalText = textBox.getText(); // 获取文本框内容
// 调用ChatClient的AsyncInvoke方法获取修改后的文本
chatClient.AsyncInvoke(originalText);
String modifiedText = chatClient.getResponseMessage();
// 清空文本框内容并添加修改后的内容
textBox.clearText();
textBox.setText(modifiedText);
}
}
}
// 保存修改后的PPT文件
FileOutputStream outputStream = new FileOutputStream(outputPath);
ppt.write(outputStream);
outputStream.close();
}
}
TranslateController:
package com.example.ppt_project_backend.controller;
import com.example.ppt_project_backend.service.TranslateService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
@RestController
@RequestMapping("/translate")
@CrossOrigin(origins = "http://localhost:63342")
public class TranslateController {
private final TranslateService translateService;
public TranslateController(TranslateService translateService) {
this.translateService = translateService;
}
@PostMapping("/upload")
public ResponseEntity<FileSystemResource> uploadAndTranslatePPT(@RequestParam("file") MultipartFile file) {
try {
// 临时保存上传的PPT文件
Path tempDir = Files.createTempDirectory("temp-ppt");
File tempFile = new File(tempDir.toFile(), file.getOriginalFilename());
file.transferTo(tempFile);
// 调用TranslateService来处理PPT翻译
String outputPath = tempDir.resolve("translated-" + System.currentTimeMillis() + ".pptx").toString();
translateService.translatePPT(tempFile.getAbsolutePath(), outputPath);
// 准备响应
FileSystemResource resource = new FileSystemResource(new File(outputPath));
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + resource.getFilename())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(500).build();
}
}
}
TranslateService:
package com.example.ppt_project_backend.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import top.pulselink.chatglmT.ChatClient;
import top.pulselink.chatglmT.PPTModifier;
import java.io.IOException;
@Service
public class TranslateService {
private final ChatClient chatClient;
public TranslateService(@Value("${chatglm.api.key}") String apiKey) {
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalStateException("API key is required");
}
this.chatClient = new ChatClient(apiKey);
this.chatClient.registerShutdownHook();
}
public void translatePPT(String inputPath, String outputPath) throws IOException {
PPTModifier.modifyPPT(chatClient, inputPath, outputPath);
}
}
测试用的HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload and Translate PPT</title>
</head>
<body>
<h1>Upload and Translate PPT</h1>
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" name="file" id="fileInput">
<button type="submit">Upload and Translate</button>
</form>
<hr>
<h2>Translated PPT</h2>
<div id="translatedPPT"></div>
<script>
document.getElementById('uploadForm').addEventListener('submit', function(event) {
event.preventDefault();
var formData = new FormData();
formData.append('file', document.getElementById('fileInput').files[0]);
fetch('http://localhost:8080/translate/upload', {
method: 'POST',
body: formData
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.blob();
})
.then(blob => {
// 创建URL对象并设置下载链接
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'translated_ppt.pptx';
a.textContent = 'Download translated PPT';
document.getElementById('translatedPPT').appendChild(a);
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});
});
</script>
</body>
</html>
测试:
点击选择文件选择要翻译的PPT,然后点击Upload and Translate,等待片刻,会自动下载已翻译好的PPT。