加入日志管理

This commit is contained in:
陈辅元
2026-04-16 10:53:10 +08:00
parent 284e02f41c
commit 695356a496
19 changed files with 582 additions and 181 deletions
+49 -6
View File
@@ -182,7 +182,11 @@ class Text2SQLOrchestrator:
indexer.ensure_index_for_schema(self.schema_manager)
# 检索
logger.info(f"[Orchestrator] 开始向量检索: query='{question[:50]}...'")
logger.info(
"[Orchestrator] 开始向量检索: query_chars=%s query_preview=%r",
len(question or ""),
(question or "")[:200] + ("…" if len(question or "") > 200 else ""),
)
results = indexer.search(
query=question,
top_k=top_k,
@@ -190,7 +194,15 @@ class Text2SQLOrchestrator:
)
candidate_tables = [r["table_name"] for r in results]
logger.debug(f"粗筛候选表:{candidate_tables[:10]}...(共{len(candidate_tables)}个)")
scored = [
(r["table_name"], round(float(r.get("score", 0.0)), 4))
for r in results[: min(25, len(results))]
]
logger.info(
"[Orchestrator] 向量粗筛: 命中=%s 张(阈值内),表名+分: %s",
len(candidate_tables),
scored,
)
return candidate_tables
except Exception as e:
@@ -239,7 +251,13 @@ class Text2SQLOrchestrator:
# 限制数量
relevant_tables = relevant_tables[:max_tables]
logger.info(f"LLM精筛选中表:{relevant_tables}")
rs = (reasoning or "").strip()
logger.info(
"LLM精筛选中表:%s | reasoning_chars=%s reasoning_preview=%r",
relevant_tables,
len(rs),
rs[:600] + ("…" if len(rs) > 600 else ""),
)
return relevant_tables, reasoning
_BROKER_KEYWORDS_CN = ("对手方", "经纪商", "券商", "對手方")
@@ -361,7 +379,12 @@ class Text2SQLOrchestrator:
for i, ex in enumerate(examples)
])
schema_str = f"参考以下相似示例的SQL编写风格:\n\n{examples_prompt}\n\n【当前Schema】\n{schema_str}"
logger.debug(f"已注入 {len(examples)} 个few-shot示例: {[ex.qid for ex in examples]}")
logger.info(
"已注入 %s 个 few-shot 示例: qid=%s question_zh_preview=%r",
len(examples),
[ex.qid for ex in examples],
[((ex.question_zh or "")[:80] + "…") if len(ex.question_zh or "") > 80 else (ex.question_zh or "") for ex in examples],
)
except Exception as e:
logger.warning(f"Few-shot检索失败: {e}")
@@ -419,7 +442,9 @@ class Text2SQLOrchestrator:
sql = normalize_sql_for_dialect(sql, dialect)
logger.debug(f"生成的SQL:{sql[:200]}...")
lim = 12000
body = sql if len(sql) <= lim else sql[:lim] + "\n…(日志已截断)"
logger.info("生成的SQL(chars=%s):\n%s", len(sql), body)
return sql
def _validate_sql(
@@ -562,6 +587,19 @@ class Text2SQLOrchestrator:
empty_feedback = (empty_feedback or prefix) + follow
is_valid = len(errors) == 0
logger.info(
"[validate] 程序+探针+LLM 汇总: valid=%s err_count=%s warn_count=%s "
"db_execution_status=%s sql_chars=%s",
is_valid,
len(errors),
len(warnings),
db_execution_status,
len(sql or ""),
)
if errors:
logger.info("[validate] errors 预览: %s", errors[:5])
if warnings:
logger.info("[validate] warnings: %s", warnings[:5])
return is_valid, errors, warnings, db_execution_status, empty_feedback
def generate(
@@ -608,7 +646,12 @@ class Text2SQLOrchestrator:
dc_raw = (dialog_context or "").strip()
retrieval_question = self._merge_dialog_for_model(dc_raw, question, 4000)
linker_question = self._merge_dialog_for_model(dc_raw, question, 6000)
logger.info(f"[GEN] 开始生成SQL:{question[:50]}...")
logger.info(
"[GEN] 开始生成SQL: question_chars=%s preview=%r dialog_context_chars=%s",
len(question or ""),
(question or "")[:300] + ("…" if len(question or "") > 300 else ""),
len(dc_raw) if dc_raw else 0,
)
attempt = 0
last_sql = None