加入日志管理
This commit is contained in:
Binary file not shown.
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user