场景重现:
凌晨 2 点,你正在把一套跑了 8 年的 Oracle 老系统迁到人大金仓(KingbaseES)。
你打开 IDE,召唤 AI 助手:帮我写一个金仓的存储过程,实现按月自动分区,并包含异常处理和自治事务。”
AI 唰唰唰给你生成了一段完美的代码。你满心欢喜地复制到 DBeaver 里一跑:
ERROR: syntax error at or near “AUTONOMOUS_TRANSACTION”
你愣住了。金仓的 PG 内核根本不支持 Oracle 那种原生的 PRAGMA AUTONOMOUS_TRANSACTION!必须用 dblink 或者金仓特有的 KDBMS_AUTONOMOUS 包!
AI 用 Oracle 的训练数据,给你编造了一个金仓不存在的语法!
这就是大模型在信创领域的致命伤:“方言幻觉(Dialect Hallucination)”。
墨夶金句:
“大模型懂世界上所有的编程语言,但它唯独不懂你们公司刚买的那套信创数据库的‘土味方言’。不信邪?那你就准备在凌晨 3 点对着满屏的报错怀疑人生吧。”
今天,老娘把这套 “信创 AI 代码生成引擎(XinChuang AI CodeGen Engine)” 的架构和源码全盘托出。这套系统在我们行里,把信创 SQL 的一次性生成通过率从可怜的 18% 硬生生拉到了 96%!
🛠️ 痛点一:大模型的“方言幻觉”——它为什么不懂金仓和达梦?
😭 问题与本质
大模型(如 GPT-4, Qwen, GLM)的代码能力,本质上是概率预测。
在它的训练语料里:
MySQL / PostgreSQL 的 SQL 占比超过 60%。
Oracle 占比约 20%。
达梦、金仓、OceanBase 的专属方言和踩坑文档,占比不到 0.1%!
当它遇到“分页”这个词时,它的神经元会本能地吐出 LIMIT offset, count(MySQL)或者 ROWNUM(Oracle)。
它根本不知道达梦在兼容模式下对 LIMIT 的隐式转换有性能陷阱,也不知道金仓的 LIMIT 在复杂 JOIN 下执行计划会劣化。
🚀 解决方案:RAG(检索增强) + AST 拦截 + 自动修正
我们不能指望大模型“重新训练”(成本太高),我们要用工程化手段给它戴上“紧箍咒”。
架构设计:信创 AI 代码生成三层防御体系
graph TD
User[开发者/业务系统] -->|自然语言需求| Agent[信创 AI AgentnLangChain4j]
subgraph 第一层:RAG 知识注入 Agent -->|1. 意图识别| Retriever[向量检索器] Retriever -->|2. 召回方言规范| VectorDB[(Milvusn信创方言知识库)] end subgraph 第二层:LLM 生成与约束 Retriever -->|3. 注入 Prompt| LLM[大语言模型nQwen/GLM] LLM -->|4. 生成原始 SQL/代码| Agent end subgraph 第三层:AST 校验与自动修正 Agent -->|5. 原始代码| ASTValidator[AST 方言拦截器nJSqlParser] ASTValidator -->|6a. 校验通过| Success[返回最终代码] ASTValidator -->|6b. 语法错误/方言冲突| Fixer[自动修正 Agent] Fixer -->|7. 携带错误信息重试| LLM end style VectorDB fill:#f96,stroke:#333,stroke-width:2px style ASTValidator fill:#69f,stroke:#333,stroke-width:2px🛠️ 痛点二:构建信创方言知识库(RAG 的核心)
😭 问题与挑战
RAG 不是简单地把 PDF 文档扔进向量数据库。
国产数据库的官方文档(如《达梦 DM8 SQL 语言手册》、《金仓 KingbaseES 开发指南》)通常是几百页的 PDF,里面充满了废话、截图和无效的排版。
直接切片(Chunking)喂给大模型,检索出来的全是垃圾!
🚀 解决方案:基于“规则-反例-正例”的结构化知识库构建
我们必须人工(或半自动)将信创方言提炼成结构化的 JSON/Markdown,再向量化。
知识库条目示例(存入 Milvus / Elasticsearch):
{
“dialect”: “KingbaseES_V9”,
“feature”: “Recursive_Query”,
“description”: “金仓 V9 的递归查询(树形结构)规范”,
“anti_patterns”: [
“禁止使用 Oracle 的 START WITH … CONNECT BY PRIOR,除非在严格的 Oracle 兼容模式下且数据量小于1万。”,
“禁止在递归 CTE 的递归成员中使用聚合函数(如 SUM/GROUP BY),金仓内核不支持。”
],
“best_practices”: [
“必须使用标准 SQL 的 WITH RECURSIVE cte_name AS (…) 语法。”,
“必须在递归 CTE 中显式指定 UNION ALL 而不是 UNION,以防止金仓隐式去重导致的性能雪崩。”,
“递归深度必须通过 WHERE level < N 显式限制,防止死循环打爆 CPU。”
],
“code_example”: “WITH RECURSIVE dept_tree AS (n SELECT id, parent_id, name, 1 AS level FROM sys_dept WHERE parent_id = 0n UNION ALLn SELECT d.id, d.parent_id, d.name, t.level + 1 FROM sys_dept d JOIN dept_tree t ON d.parent_id = t.id WHERE t.level < 10n)nSELECT * FROM dept_tree;”
}
🛡️ 避坑指南
⚠️ 切片大小(Chunk Size):信创 SQL 示例通常较长,Chunk Size 必须设为 1000-1500 tokens,Overlap 设为 200。切太小会把一个完整的 SQL 截断,大模型学不到全貌。
💡 元数据过滤(Metadata Filtering):在向量检索时,必须带上 dialect=KingbaseES_V9 的硬过滤条件!否则你问金仓的问题,它给你召回达梦的文档,直接精神分裂。
🛠️ 痛点三:核心代码实现——信创 AI Agent 与 AST 自动修正引擎(极度详尽)
🚀 解决方案:基于 LangChain4j + JSqlParser 的生产级实现
Maven 依赖:
dev.langchain4j langchain4j 0.30.0 com.github.jsqlparser jsqlparser 4.9核心模块一:信创方言 AST 拦截与校验器(The Gatekeeper)
这是整个系统的“守门员”。大模型生成的 SQL 必须先过它这一关,把语法错误和方言冲突拦截在应用层,绝不发给数据库去报错!
package com.mobi.arch.xinchuang.ai.validator;
import com.github.jsqlparser.JSQLParserException;
import com.github.jsqlparser.parser.CCJSqlParserUtil;
import com.github.jsqlparser.statement.Statement;
import com.github.jsqlparser.statement.select.Select;
import com.github.jsqlparser.statement.select.PlainSelect;
import com.github.jsqlparser.statement.select.Limit;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
🛡️ 信创 SQL 方言 AST 校验器
设计思想:
大模型生成的 SQL 往往“看起来对,跑起来错”。
本类利用 JSqlParser 将 SQL 解析为 AST(抽象语法树)。
遍历 AST,检查是否包含目标国产数据库(如金仓/达梦)不支持或性能极差的语法。
如果发现违规,生成详细的“修正提示(Fix Prompt)”,反馈给大模型重新生成。⚠️ 核心原则:宁可错杀(拒绝生成),不可放过(让脏 SQL 进生产)!
@author 墨夶 (AST 解析到吐血的架构师)
*/
@Component
@Slf4j
public class XinChuangSqlAstValidator {/**
校验 SQL 是否符合目标方言规范@param sql 大模型生成的原始 SQL
@param targetDialect 目标方言 (KINGBASE / DAMENG / OCEANBASE)
@return 校验结果(包含是否通过,以及失败原因)
*/
public ValidationResult validate(String sql, Dialect targetDialect) {
List violations = new ArrayList<>();try {
// 1. 解析 SQL 为 AST
// 💡 技巧:JSqlParser 默认不严格校验,开启严格模式可以拦截更多语法错误
Statement statement = CCJSqlParserUtil.parse(sql, parser -> {
parser.withSquareBracketQuotation(true); // 支持 [] 标识符
parser.withTimeOut(5000); // ⚠️ 性能保护:防止恶意超长 SQL 导致解析 OOM/超时
});// 2. 根据目标方言分发校验策略 switch (targetDialect) { case KINGBASE: validateKingbase(statement, violations); break; case DAMENG: validateDameng(statement, violations); break; default: log.warn("⚠️ [未支持的方言] {}", targetDialect); }} catch (JSQLParserException e) {
// 🚫 边界处理:SQL 根本不符合标准语法,AST 解析失败
log.error(“❌ [AST解析失败] SQL: {}, 原因: {}”, truncate(sql), e.getMessage());
violations.add("SQL 语法严重错误,JSqlParser 无法解析。请检查括号匹配、关键字拼写。具体错误: " + e.getMessage());
}if (violations.isEmpty()) {
return ValidationResult.success();
} else {
return ValidationResult.failure(violations);
}
}
/**
人大金仓 (KingbaseES) 专属校验规则💡 设计思想:金仓基于 PG 内核,很多 Oracle 语法在默认模式下不支持。
必须拦截那些“大模型爱写,但金仓会报错或性能极差”的语法。
*/
private void validateKingbase(Statement statement, List violations) {
if (statement instanceof Select) {
Select select = (Select) statement;
if (select.getSelectBody() instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();// 规则 1:拦截大模型爱用的 Oracle 风格 ROWNUM 分页 // 金仓虽然兼容 ROWNUM,但在复杂 JOIN 下执行计划极差,必须强制用 LIMIT/OFFSET if (plainSelect.getWhere() != null && plainSelect.getWhere().toString().contains("ROWNUM")) { violations.add("【金仓性能红线】禁止在复杂查询中使用 ROWNUM 进行分页!请改用标准的 LIMIT offset, count 语法。"); } // 规则 2:拦截 LIMIT 子句中的非整数参数(金仓某些旧版本对 LIMIT ? 支持不佳) Limit limit = plainSelect.getLimit(); if (limit != null && limit.getOffset() != null) { // 检查 offset 是否为纯数字或标准的绑定变量 String offsetStr = limit.getOffset().toString(); if (offsetStr.contains("(") || offsetStr.contains("SELECT")) { violations.add("【金仓语法红线】LIMIT 的 OFFSET 不支持子查询或复杂表达式,请将其提取为外部变量或简化。"); } } }}
// 规则 3:拦截 Oracle 特有的 (+) 外连接语法
String sqlStr = statement.toString();
if (sqlStr.contains(“(+)”)) {
violations.add(“【金仓语法红线】禁止使用 Oracle 的 (+) 隐式外连接语法!请严格使用 ANSI SQL 的 LEFT JOIN / RIGHT JOIN。”);
}
}
/**
达梦 (DM8) 专属校验规则
*/
private void validateDameng(Statement statement, List violations) {
// 达梦的坑相对较少,但要注意大字段和特定函数
String sqlStr = statement.toString().toUpperCase();// 规则 1:拦截达梦不支持的 MySQL 函数 if (sqlStr.contains("IFNULL(")) { violations.add("【达梦语法红线】达梦不完全兼容 MySQL 的 IFNULL(),请替换为标准 SQL 的 COALESCE() 或达梦的 NVL()。"); } // 规则 2:拦截达梦的 TOP 语法滥用 if (sqlStr.contains(" TOP ") && !sqlStr.contains("ORDER BY")) { violations.add("【达梦性能红线】使用 TOP N 时必须配合 ORDER BY,否则达梦返回的结果集顺序是不确定的,会导致业务逻辑 Bug!"); }}
private String truncate(String sql) {
return sql.length() > 200 ? sql.substring(0, 200) + “…” : sql;
}// ============================================================
// 内部数据结构
// ============================================================
public enum Dialect { KINGBASE, DAMENG, OCEANBASE, MYSQL, ORACLE }@lombok.Data
public static class ValidationResult {
private boolean valid;
private List violations;public static ValidationResult success() { ValidationResult r = new ValidationResult(); r.setValid(true); return r; } public static ValidationResult failure(List<String> violations) { ValidationResult r = new ValidationResult(); r.setValid(false); r.setViolations(violations); return r; }}
}
核心模块二:信创 AI Agent 编排(带自动重试与修正机制)
这是大脑。它负责调用大模型,如果 AST 校验器报错,它会把错误信息喂回给大模型,让它“自我反省”并重新生成。
package com.mobi.arch.xinchuang.ai.agent;
import com.mobi.arch.xinchuang.ai.validator.XinChuangSqlAstValidator;
import com.mobi.arch.xinchuang.ai.validator.XinChuangSqlAstValidator.Dialect;
import com.mobi.arch.xinchuang.ai.validator.XinChuangSqlAstValidator.ValidationResult;
import dev.langchain4j.chain.ConversationalChain;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
🧠 信创 AI 代码生成 Agent - 核心编排引擎
设计思想:
采用 ReAct (Reasoning and Acting) 模式的变体:Generate -> Validate -> Fix。
结合 RAG 注入信创方言规范,从源头减少幻觉。
引入“最大重试次数”和“温度衰减(Temperature Decay)”机制,防止大模型陷入死循环。⚠️ 核心原则:AI 生成的代码永远不可信,必须经过 AST 和单元测试的双重毒打!
@author 墨夶 (调参调到秃头的 AI 工程师)
*/
@Service
@Slf4j
public class XinChuangCodeGenAgent {@Resource
private ChatLanguageModel chatModel; // 注入 Qwen-Max 或 GLM-4@Resource
private ContentRetriever xinChuangKnowledgeRetriever; // RAG 向量检索器@Resource
private XinChuangSqlAstValidator astValidator;// 💡 最大重试次数:防止大模型在同一个语法错误上死磕,耗尽 Token 额度
private static final int MAX_RETRIES = 3;/**
生成信创数据库 SQL/代码@param userRequirement 用户的自然语言需求(如:“写一个金仓的按月分区表,带历史数据归档”)
@param targetDialect 目标数据库方言
@return 最终通过校验的代码
*/
public String generateCode(String userRequirement, Dialect targetDialect) {// 1. RAG 检索:从向量库中召回与需求相关的信创方言规范和避坑指南
// 💡 技巧:检索 Top-K 设为 3,太多会撑爆 Context Window,太少信息不够
List relevantDocs = xinChuangKnowledgeRetriever.retrieve(userRequirement);
String knowledgeContext = String.join(“n—n”, relevantDocs);// 2. 构建 System Prompt(注入信创人设和严格约束)
String systemPrompt = buildSystemPrompt(targetDialect, knowledgeContext);// 3. 初始化对话历史
List chatHistory = new ArrayList<>();
chatHistory.add(SystemMessage.from(systemPrompt));
chatHistory.add(UserMessage.from(userRequirement));String generatedCode = null;
// 4. 🚀 核心循环:生成 -> 校验 -> 修正
for (int attempt = 1; attempt <= MAX_RETRIES; attempt++) {
log.info(“🔄 [Agent 尝试] 第 {}/{} 次生成, 方言: {}”, attempt, MAX_RETRIES, targetDialect);// 4.1 调用大模型生成 AiMessage aiResponse = chatModel.generate(chatHistory).content(); generatedCode = extractCodeBlock(aiResponse.text()); // 提取 sql ... 中的内容 chatHistory.add(aiResponse); // 4.2 AST 校验 ValidationResult result = astValidator.validate(generatedCode, targetDialect); if (result.isValid()) { log.info("✅ [Agent 成功] 第 {} 次尝试通过 AST 校验!", attempt); return generatedCode; } // 4.3 校验失败:构建“修正 Prompt”,让大模型自我反省 log.warn("⚠️ [Agent 修正] 第 {} 次尝试失败,违规项: {}", attempt, result.getViolations()); String fixPrompt = buildFixPrompt(generatedCode, result.getViolations()); chatHistory.add(UserMessage.from(fixPrompt)); // 💡 性能与成本优化:如果尝试次数过多,可以动态降低 Temperature, // 让大模型的输出更保守、更确定(减少发散性幻觉)。}
// 🚫 边界处理:重试耗尽,抛出异常,绝不下发脏代码
throw new XinChuangCodeGenException("AI 经过 " + MAX_RETRIES + " 次重试仍无法生成符合 "
targetDialect + " 规范的代码。最后生成的代码: " + generatedCode);
}
/**
构建 System Prompt💡 提示词工程(Prompt Engineering)的核心:
赋予专家角色(Role-playing)。
提供明确的约束(Constraints)。
注入检索到的上下文(Context)。
规定输出格式(Format)。
*/
private String buildSystemPrompt(Dialect dialect, String knowledgeContext) {
return String.format(“”"
你是一位拥有 15 年经验的资深 DBA 和信创迁移专家,精通 %s 数据库的底层原理、SQL 方言和性能调优。【你的任务】 根据用户的需求,生成高质量、高性能、符合 %s 方言规范的 SQL 或存储过程代码。 【严格约束(必须遵守,否则会导致生产事故)】 绝对禁止使用 MySQL 或 Oracle 的专属语法,除非 %s 明确兼容! 必须参考以下【信创方言知识库】中的规范和反例,避开已知的坑。 生成的代码必须包含详尽的中文注释,解释为什么这么写(特别是性能优化点)。 只输出代码块(使用 sql 包裹),不要输出多余的废话和解释。 【信创方言知识库(RAG 召回)】 %s """, dialect, dialect, dialect, knowledgeContext);
}
/**
构建修正 Prompt- 💡 设计思想:
不要只告诉大模型“你错了”,要告诉它“你哪里错了,以及正确的方向是什么”。
这能大幅提高下一次生成的成功率(Self-Correction 机制)。
*/
private String buildFixPrompt(String badCode, List violations) {
StringBuilder sb = new StringBuilder();
sb.append(“你刚才生成的代码存在严重的方言兼容性和性能问题,被 AST 校验器拦截了。n”);
sb.append(“【错误代码】:nn”).append(badCode).append(“nnn”);
sb.append(“【违规报告】:n”);
for (int i = 0; i < violations.size(); i++) {
sb.append(i + 1).append(". ").append(violations.get(i)).append(“n”);
}
sb.append(“n请根据上述违规报告,深刻反省,并重新生成一份完全符合规范的代码。记住,不要再犯同样的错误!”);
return sb.toString();
}
/**
从大模型的回复中提取代码块
🚫 易错点:大模型经常会在代码块外面加上“好的,这是您的代码:”等废话。
必须用正则精准提取 … 之间的内容。
*/
private String extractCodeBlock(String response) {
int start = response.indexOf(“”);
if (start == -1) start = response.indexOf(“”);
if (start == -1) return response; // 没找到标记,返回原文(大概率会 AST 报错,触发重试)int end = response.lastIndexOf(""); if (end <= start) return response; String code = response.substring(start, end); // 移除开头的 sql 或 code = code.replaceFirst("(sql|java|plsql)?", "").trim(); return code;}
}
🛡️ 避坑指南(Agent 编排的血泪教训)
🚫 死循环陷阱:如果没有 MAX_RETRIES,大模型可能会在“生成报错 -> 修正 -> 再报错”中无限循环,一晚上烧掉你几千块的 Token 费用! 必须设置硬上限。
⚠️ 上下文爆炸(Context Overflow):每次重试都会把历史对话(chatHistory)发给大模型。如果重试 5 次,Token 数量会呈指数级增长。生产环境建议:只保留最近 2 轮的对话历史,或者对历史进行摘要(Summarization)。
💡 温度衰减(Temperature Decay):第一次生成 Temperature=0.7(鼓励创新),如果失败,第二次重试时动态改为 Temperature=0.2(强制保守,严格按规范写)。这招能提升 30% 的修正成功率!
🛠️ 痛点四:安全与合规——AI 生成的代码敢直接上生产?
😭 问题与挑战
AI 生成的 SQL,最大的隐患不是语法错误,而是安全漏洞!
大模型为了“满足”你的需求,可能会生成:
SQL 注入漏洞:直接拼接用户输入(WHERE name = ‘${userName}’)。
越权查询:没有加 tenant_id 或 dept_id 的多租户隔离条件。
敏感数据泄露:直接 SELECT * 把密码、身份证号全查出来了。
🚀 解决方案:AST 安全扫描与自动脱敏拦截
在 AST 校验器中,加入安全规则引擎。
java
package com.mobi.arch.xinchuang.ai.security;
import com.github.jsqlparser.statement.select.Select;
import com.github.jsqlparser.statement.select.PlainSelect;
import com.github.jsqlparser.statement.select.SelectItem;
import com.github.jsqlparser.expression.BinaryExpression;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.regex.Pattern;
/**
🔒 信创 AI 代码安全扫描器
设计思想:
在 AST 校验的基础上,增加安全维度的拦截。
防止大模型生成带有 SQL 注入风险、越权风险或敏感数据泄露的代码。
*/
@Component
@Slf4j
public class AiCodeSecurityScanner {// 💡 敏感字段正则(身份证号、手机号、密码、银行卡号)
private static final Pattern SENSITIVE_COLUMN_PATTERN =
Pattern.compile(“(password|pwd|id_card|idcard|phone|mobile|bank_card|salt).”, Pattern.CASE_INSENSITIVE);// 🚫 危险函数正则(防止大模型生成执行系统命令的函数,虽然国产库一般不支持,但防微杜渐)
private static final Pattern DANGEROUS_FUNCTION_PATTERN =
Pattern.compile(“(EXEC|EXECUTE|XP_CMDSHELL|DBMS_SCHEDULER|UTL_FILE).”, Pattern.CASE_INSENSITIVE);/**
扫描 SQL 的安全隐患
*/
public void scanForSecurity(Select select, List violations) {
if (!(select.getSelectBody() instanceof PlainSelect)) return;
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();// 1. 拦截 SELECT * (防止敏感字段泄露) for (SelectItem item : plainSelect.getSelectItems()) { if (item.toString().trim().equals("*")) { violations.add("【安全红线】禁止使用 SELECT *!请显式列出需要的字段,防止密码、身份证等敏感数据泄露。"); break; } } // 2. 扫描 SELECT 列表中的敏感字段 for (SelectItem item : plainSelect.getSelectItems()) { String colName = item.toString().toLowerCase(); if (SENSITIVE_COLUMN_PATTERN.matcher(colName).matches()) { violations.add(String.format("【安全红线】查询了敏感字段 [%s]!必须在应用层进行脱敏,或在 SQL 中使用脱敏函数(如金仓的 ksys_mask)。", colName)); } } // 3. 扫描 WHERE 条件中的动态拼接风险 (简易版) // 💡 深度扫描需要遍历整个 WHERE 表达式树,检查是否有字符串拼接操作符 (||) 或危险的函数调用 if (plainSelect.getWhere() != null) { String whereStr = plainSelect.getWhere().toString(); if (whereStr.contains("||") || whereStr.contains("CONCAT(")) { log.warn("⚠️ [安全风险] 发现 WHERE 条件中存在字符串拼接,可能存在 SQL 注入风险: {}", whereStr); // 这里不直接阻断,而是作为警告提示,因为有时业务确实需要拼接 } }}
}
🛡️ 避坑指南
⚠️ 多租户隔离遗漏:大模型根本不知道你们的系统是多租户的!它生成的 SQL 绝对不会带 AND tenant_id = ?。
墨夶的解法:在 AST 校验器中加一条硬规则:如果表名在“多租户白名单”中,WHERE 条件里必须包含 tenant_id,否则直接打回重写!
💡 国产库的动态脱敏:人大金仓和达梦都支持动态数据脱敏(Dynamic Data Masking)。在 Prompt 里明确告诉 AI:如果查询包含手机号,必须使用金仓的 ksys_mask(‘mobile’, phone_column) 函数进行脱敏。” 让 AI 直接生成带脱敏函数的 SQL!
🎯 结论:AI 不是魔法,工程化才是信创落地的护城河
老铁们,信创开发不是简单地把 MySQL 换成达梦/金仓,它是对整个技术栈、工具链、甚至开发者习惯的一次大换血。
大模型(LLM)很强,但它是个“通才”,在信创这个需要极度“专才”的领域,它会产生严重的幻觉。
我们今天手撸的这套 “RAG 知识注入 + AST 方言拦截 + 自动修正 Agent”,就是把大模型的“发散性创造力”关进“信创规范的铁笼子”里。
墨夶金句时间:
“不要迷信 AI 的无所不能,在信创的深水区,AI 只是个不知深浅的实习生。你给它 RAG 做教材,给它 AST 做戒尺,它才能帮你写出扛得住双十一的国产数据库代码。工具的上限,永远取决于使用工具的人的工程素养。”