芋道源碼相信很多朋友都很瞭解了,今天我們試著基於FastGPT實現芋道框架的代碼生成。芋道的代碼生成,是基於資料庫表欄位實現的,那我們的思路就是看看如何使用GPT幫我們生成資料庫表結構,只要資料庫表欄位有了,代碼也就生成好了。實現這個需求我們就需要用到FastGPT的高級編排功能。編排的整體思路如下 ...
芋道源碼相信很多朋友都很瞭解了,今天我們試著基於FastGPT實現芋道框架的代碼生成。芋道的代碼生成,是基於資料庫表欄位實現的,那我們的思路就是看看如何使用GPT幫我們生成資料庫表結構,只要資料庫表欄位有了,代碼也就生成好了。實現這個需求我們就需要用到FastGPT的高級編排功能。編排的整體思路如下:
FastGPT應用編排
- 1.登錄FastGPT,打開應用菜單,點擊右上角"新建"按鈕,創建一個AI應用(選擇"簡單的對話"模板即可)。
- 2.進入高級編排頁面,先定義"對話開場白",然後點擊右上角保存按鈕。
- 3.根據前述的整體思路,開始第一個AI環節:需求分析和模型設計。我們需要選擇該環節對話模型(本文我選擇GPT4-Turbo演示)和設計需求分析提示詞。提示詞主要是預設身份,並給出需求分析的要求,我這裡主要是要求將需求抽象為模型和欄位,並以markdown格式輸出。配置完成後,保存,然後測試看下效果。
- 4.第二個AI環節:判斷用戶是否已對需求分析和模型設計是否滿意,是否可以進入下一環節。在這裡我們需要在AI每一次輸出需求分析和模型設計後,調用FastGPT的"問題分類"模塊,判斷用戶意圖。同樣的,我們需要選擇分類模型,設計分類提示詞,並測試分類結果。
- 5.第三個AI環節:用戶已經對需求分析和模型設計結果完成確認,那麼接下來就需要讓AI幫我們生成SQL語句了。在這裡我們為方便後續SQL語句的提取,要求AI以json數組形式返回建表SQL語句,並且要求AI在每張表按芋道規範添加公共欄位(如創建者、創建時間、修改者、修改時間、邏輯刪除、租戶ID欄位),大家也可以添加自己的要求。
- 6.第四個AI環節(可選):如果只是為滿足單表代碼生成,這一步就可以直接跳過。這個環節主要是讓AI根據模型設計和生成的SQL來分析這些表之間是否存在主子表、樹表,並且將分析結果使用json格式將分析結果返回,方便後續調用介面生成主子表和樹表代碼用。
- 7.將AI生成好的SQL和表關係數據做為參數,調用我們自定義的介面,生成代碼並返回代碼下載地址,我們將代碼下載地址顯示在頁面上,用戶就可以愉快下載了。
- 8.掃碼關註我的微信公眾號,回覆"芋道助手"就可以獲取完整的FastGPT應用配置了(包含提示詞)。
附:芋道自定義介面示例(供參考)
- 1.我們在芋道工程中自定義一個介面(使用路徑傳參是因為這樣在FastGPT介面配置中傳遞固定參數很方便,介面也比較好管理),接收上述參數,提取SQL併在資料庫建表、按芋道規範生成代碼。這裡給出介面示例:
@PermitAll
@PostMapping("busi/{busiType}")
public FastCommonRespVO busi(@PathVariable("busiType") String busiType, @RequestBody Map<String, Object> reqMap) {
log.info("請求參數: {}", JSONUtil.toJsonStr(reqMap));
FastCommonRespVO fastCommonRespVO = new FastCommonRespVO();
fastCommonRespVO.setResponse("\\n失敗了");
FastBusiTypeEnum fastBusiTypeEnum = FastBusiTypeEnum.getByBusiCode(busiType);
if (fastBusiTypeEnum != null) {
FastService fastService = SpringUtil.getBean("fast".concat(fastBusiTypeEnum.getBusiCode()).concat("ServiceImpl"));
try {
// doBusi方法會返回一個完整的代碼下載地址
fastCommonRespVO.setResponse("\\n".concat(fastService.doBusi(reqMap)));
} catch (Exception e) {
log.error("執行業務邏輯失敗,異常原因:{}", ExceptionUtils.getStackTrace(e));
fastCommonRespVO.setResponse("\\n執行業務邏輯失敗:".concat(e.getMessage()));
}
} else {
fastCommonRespVO.setResponse("\\n非法的業務類型(busiType參數)");
}
log.info("響應結果: {}", JSONUtil.toJsonStr(fastCommonRespVO));
return fastCommonRespVO;
}
- 2.這裡還需要在芋道中自定義一個代碼下載介面,方便用戶下載。
@PermitAll
@GetMapping("/download/codegen/{codegenId}")
public void downloadCodegen(@PathVariable("codegenId") String codegenId,
HttpServletResponse response) throws IOException {
log.info("請求參數: codegenId={}", codegenId);
// 根據生成代碼記錄ID查詢相關表記錄ID
Set<String> tableIds = stringRedisTemplate.opsForSet().members(codegenId);
if (CollectionUtils.isEmpty(tableIds)) {
throw exception(ErrorCodeConstants.AIGC_FAST_NOT_FOUND_RECORD);
}
// 生成代碼
Map<String, String> codes = new HashMap<>();
for (String tableId : tableIds) {
codes.putAll(codegenApi.generationCodes(Long.valueOf(tableId)));
}
// 構建 zip 包
String[] paths = codes.keySet().toArray(new String[0]);
ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipUtil.zip(outputStream, paths, ins);
// 輸出
ServletUtils.writeAttachment(response, "codegen.zip", outputStream.toByteArray());
}