Refactor api_server.py to import environment setup and schema loading from bootstrap.py, enhancing modularity. Introduce a new function in Text2SQLOrchestrator to prioritize VCUserAccessibleFunction in table selection, improving SQL generation accuracy. Update validation logic to enforce restrictions on CJK characters in SQL string literals, ensuring compliance with business rules. Enhance prompts to clarify SQL generation constraints regarding date conditions and CJK usage.
This commit is contained in:
Binary file not shown.
@@ -302,6 +302,28 @@ class Text2SQLOrchestrator:
|
||||
logger.info("对手方/经纪商问题:优先纳入 %s,调整后选表:%s", present, merged)
|
||||
return merged[:max_tables]
|
||||
|
||||
_VC_USER_ACCESSIBLE_FUNCTION = "VCUserAccessibleFunction"
|
||||
|
||||
def _prioritize_vc_user_accessible_function(
|
||||
self, relevant_tables: List[str], max_tables: int = 5
|
||||
) -> List[str]:
|
||||
"""
|
||||
若 Schema 中存在 VCUserAccessibleFunction,则置于选表列表最前,便于模型先根据
|
||||
FunctionID / DatabaseView 等列定位业务视图,再关联其余表生成 SQL。
|
||||
"""
|
||||
vc = self._VC_USER_ACCESSIBLE_FUNCTION
|
||||
if not self.schema_manager.get_table(vc):
|
||||
return relevant_tables[:max_tables]
|
||||
|
||||
rest = [t for t in relevant_tables if t != vc]
|
||||
merged = [vc] + rest
|
||||
logger.info(
|
||||
"已优先纳入目录视图 %s(置于选表前列),当前选表:%s",
|
||||
vc,
|
||||
merged[:max_tables],
|
||||
)
|
||||
return merged[:max_tables]
|
||||
|
||||
def _expand_relations(self, table_names: List[str]) -> List[str]:
|
||||
"""
|
||||
外键扩展:自动添加关联表
|
||||
@@ -413,8 +435,9 @@ class Text2SQLOrchestrator:
|
||||
"**禁止** `CURDATE()`、`NOW()`、`CURRENT_DATE`(MySQL)。"
|
||||
"条件请使用 T-SQL 惯用写法(例如 IS NOT NULL)。"
|
||||
"排版仍须遵守:关键字大写、SELECT 每列一行缩进、WHERE 续行以 AND 开头、PascalCase 英文别名。"
|
||||
"\n**禁止**在单引号字符串字面量或 `N'…'` 中出现任何中日韩文字;"
|
||||
"业务中文须映射为 Schema 注释中的代码或通过维表 JOIN,勿写 `= '过户费'` 这类比对。"
|
||||
"\n在 `WHERE`/`HAVING`/`JOIN ON` 及 `CASE/WHEN` 的**条件**中,**禁止**用含中日韩的 `'`/`N'…'` 字面量与代码型列比对;"
|
||||
"业务中文须映射为 Schema 注释中的代码或通过维表 JOIN(勿写 `= '过户费'`)。`SELECT` 或 `CASE … THEN/ELSE` 的展示用中文标签允许。"
|
||||
"若用户问题与对话上文均未要求按时间筛选,不得在 WHERE 中擅自添加日期列条件(与系统提示 1b 一致)。"
|
||||
)
|
||||
|
||||
if validation_feedback:
|
||||
@@ -577,8 +600,9 @@ class Text2SQLOrchestrator:
|
||||
"**禁止** `CURDATE()`、`NOW()`、`CURRENT_DATE`(MySQL)。"
|
||||
"条件请使用 T-SQL 惯用写法(例如 IS NOT NULL)。"
|
||||
"排版仍须遵守:关键字大写、SELECT 每列一行缩进、WHERE 续行以 AND 开头、PascalCase 英文别名。"
|
||||
"\n**禁止**在单引号字符串字面量或 `N'…'` 中出现任何中日韩文字;"
|
||||
"业务中文须映射为 Schema 注释中的代码或通过维表 JOIN,勿写 `= '过户费'` 这类比对。"
|
||||
"\n在 `WHERE`/`HAVING`/`JOIN ON` 及 `CASE/WHEN` 的**条件**中,**禁止**用含中日韩的 `'`/`N'…'` 字面量与代码型列比对;"
|
||||
"业务中文须映射为 Schema 注释中的代码或通过维表 JOIN(勿写 `= '过户费'`)。`SELECT` 或 `CASE … THEN/ELSE` 的展示用中文标签允许。"
|
||||
"若用户问题与对话上文均未要求按时间筛选,不得在 WHERE 中擅自添加日期列条件(与系统提示 1b 一致)。"
|
||||
)
|
||||
|
||||
if validation_feedback:
|
||||
@@ -659,9 +683,9 @@ class Text2SQLOrchestrator:
|
||||
if not danger_ok:
|
||||
errors.extend(danger_errors)
|
||||
|
||||
# T-SQL:禁止中文等业务词出现在字符串字面量(如 FeeNatureID = '过户费')
|
||||
# T-SQL:禁止中文出现在 WHERE/HAVING/ON/CASE 条件等比对语境(展示用 CASE THEN/ELSE 允许)
|
||||
if dialect == "tsql":
|
||||
cjk_ok, cjk_errors = check_no_cjk_in_sql_string_literals(sql)
|
||||
cjk_ok, cjk_errors = check_no_cjk_in_sql_string_literals(sql, dialect=dialect)
|
||||
if not cjk_ok:
|
||||
errors.extend(cjk_errors)
|
||||
|
||||
@@ -845,6 +869,9 @@ class Text2SQLOrchestrator:
|
||||
relevant_tables = self._prioritize_broker_tables(
|
||||
linker_question, relevant_tables
|
||||
)
|
||||
relevant_tables = self._prioritize_vc_user_accessible_function(
|
||||
relevant_tables
|
||||
)
|
||||
|
||||
# 1.3 外键扩展
|
||||
expanded_tables = self._expand_relations(relevant_tables)
|
||||
@@ -856,6 +883,14 @@ class Text2SQLOrchestrator:
|
||||
include_columns=True,
|
||||
max_columns_per_table=20
|
||||
)
|
||||
if self._VC_USER_ACCESSIBLE_FUNCTION in expanded_tables:
|
||||
filtered_schema_str += (
|
||||
"\n\n【选表提示】已包含视图 "
|
||||
+ self._VC_USER_ACCESSIBLE_FUNCTION
|
||||
+ "(列含 UserID、FunctionID、Category、Name、DatabaseView)。"
|
||||
"生成 SQL 时可先通过该视图用 DatabaseView / FunctionID 等定位目标业务视图或功能,"
|
||||
"再与 Schema 中其余表做 JOIN 或子查询;若问题已明确具体表名,可直接查询该表。"
|
||||
)
|
||||
logger.info(f" 选中表:{relevant_tables},扩展后:{expanded_tables}")
|
||||
else:
|
||||
# 重试:在子 Schema 中并入「上次失败 SQL」实际引用到的表,并对齐程序校验与生成上下文
|
||||
|
||||
Reference in New Issue
Block a user