将大模型生成数据存入Excel,并用增量的方式存入Excel
1. 需求与要解决的问题
首先就是大模型对话特别耗时,所以通过需要异步执行。
其次是中间对话会有终端或像死锁的那种情况,循环不再继续,所以要增量存到Excel。
最后就是多线程并发,与并发线程数量的控制,因为模型不支持太多线程并发执行。
2. 代码
@Async
@Override
public void generateMilitaryDescription() {
log.info("开始执行 generateMilitaryDescription 方法");
String outputPath = "/Users/fanzhen/Documents/tuijian-java-copy/src/main/java/com/landinn/common/client/military_descriptions.xlsx";
XSSFWorkbook workbook;
XSSFSheet sheet;
int[] rowIndex = {
1}; // 行索引初始化
// 用于存储已存在的 golaxy_node_id 和 golaxy_vocab_id
Set<String> existingVocabIds = new HashSet<>();
// 检查文件是否存在
File file = new File(outputPath);
if (file.exists()) {
try (FileInputStream fileIn = new FileInputStream(file)) {
workbook = new XSSFWorkbook(fileIn); // 读取现有文件
sheet = workbook.getSheetAt(0); // 获取第一个工作表
rowIndex[0] = sheet.getLastRowNum() + 1; // 计算新数据的起始行
log.info("检测到现有文件,从第 {} 行开始追加", rowIndex[0]);
// 将现有的golaxy_vocab_id 存入集合
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
// 从第 1 行开始读取数据
Row row = sheet.getRow(i);
if (row != null) {
Cell vocabIdCell = row.getCell(1); // 第 2 列为 golaxy_vocab_id
if (vocabIdCell != null && vocabIdCell.getCellType() == CellType.STRING) {
existingVocabIds.add(vocabIdCell.getStringCellValue());
}
}
}
} catch (IOException e) {
log.error("读取现有文件时出错: {}", e.getMessage(), e);
return;
}
} else {
// 如果文件不存在,则创建