Files
ai-g3sb-backman2.0/backend/agents/__pycache__/orchestrator.cpython-312.pyc
T

320 lines
33 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
2026-04-16 10:53:10 +08:00
Kài†ãóÊ—dZddlZddlZddlmZmZmZmZddlm Z m
2026-04-14 10:28:22 +08:00
Z
ddl m Z ddl
mZddlmZmZddlmZej(e«Ze Gd „d
««ZGd „d «Zy)
u]
Text2SQL 多智能体编排器
�调 Schema Linker�SQL Generator�Validator 三个Agent
éN)ÚDictÚListÚOptionalÚTuple)Ú dataclassÚfield)Ú
SchemaManager)Ú
SchemaIndexer)ÚDeepSeekClientÚDeepSeekConfig)ÚFewShotSelectorcóÔ—eZdZUdZeed<eed<ee¬«Z e
eed<ee¬«Z e
eed<ee¬«Z e
eed<dZ
eed <d
Zeeed <ee¬«Zeeefed <y
)
ÚGenerationResultuSQL生æˆ�结果ÚsqlÚvalid)Údefault_factoryÚerrorsÚwarningsÚ tables_usedéÚattemptsNÚ reasoningÚmetadata)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__ÚboolrÚlistrrrrrÚintrrÚdictrrÚany©óúbackend/agents/orchestrator.pyrrsw…áØ ƒHØ ƒKÙ¨dÔ3€FˆD�‰IÓ3Ù°Ô5€Hˆd�3‰iÓ5Ù"°4Ô8€K��c‘Ó8Ø€HˆcÓØ#€Iˆx˜‰}Ó#Ù$°TÔ:€Hˆd�3˜�8‰nÔ:r&rcó&—eZdZdZ d-dedeedeedeedede d e
d
e
d eed e d
2026-04-14 10:28:22 +08:00
e de
fd„Z e dedede defd„«Z
defd„Z d.dede deefd„Z d/dedeede deeeeffd„ZdZdede
fd„Z d/dedeede deefd„Zdeedeefd „Z d0ded!ed"ed#eedeedef d$„Z d1d%ed!ed"ededeedee
eeeeee eeff d&„Z d2ded"ed'e d(e
deedef d)„Zd3d*e
de
fd+„Zdefd,„Zy)4ÚText2SQLOrchestratoruã
Text2SQL 多智能体编排器
2026-04-16 10:53:10 +08:00
工作�程:
2026-04-16 10:53:10 +08:00
1. 粗筛候选表
2. Schema Linker:LLM 精筛表
3. 外键扩展 → 拼 Schema �集
4. SQL Generator:生� SQL
2026-04-14 10:28:22 +08:00
5. Validator:验� SQL
NÚschema_managerÚ
llm_clientÚdeepseek_api_keyÚdeepseek_configÚvector_db_pathÚ max_retryÚuse_vector_searchÚfewshot_enabledÚfewshot_samples_pathÚ
fewshot_top_kÚfewshot_min_ratingÚtranslate_english_to_zhc
óz—||_||_||_| |_|�||_n-|rt |«|_nt t
2026-04-14 10:28:22 +08:00
|¬««|_d|_||_||_ |
|_
| |_ d|_ |jr¸ tjdd«j«dv}
| �t!| «j#«}n.tjd«}|�|j#«}n|
rdnd}t%|xsd«|_ t'|jd d
«}t(j+d |
| |rd nd«t(j+d|›d|›�|jrdndz|jr dz«ydz«y#t,$r*}t(j/d
|›d�«d
2026-04-16 10:53:10 +08:00
|_ Yd}~Œsd}~wwxYw)u£
�始化编排器
2026-04-16 10:53:10 +08:00
Args:
schema_manager: Schema管�器实例
2026-04-16 10:53:10 +08:00
llm_client: �选:外部传入的 LLM Client(需具备 chat/chat_with_json 等方法)。
deepseek_api_key: DeepSeek API密钥(也�通过环境��DEEPSEEK_API_KEY)
deepseek_config: DeepSeek�置对象(优先于api_key)
vector_db_path: ��数�库路径
2026-04-16 10:53:10 +08:00
max_retry: 最大�试次数(包�首次生�)
use_vector_search: 是�使用��检索粗筛
translate_english_to_zh: 为 True 时(默认)对**所有**�空问��一次 LLM 归一(temperature=0),
输出一�标准中文供检索与生�;使�一语义的中英文表述对�,从而 SQL 一致。为 False 时
2026-04-14 10:28:22 +08:00
��归一(原样英文/中文)。环境�� ``TRANSLATE_EN_TO_ZH=false`` �关闭。
N)Úapi_keyÚFEWSHOT_USE_CHROMAÚfalse)Ú1ÚtrueÚyesÚFEWSHOT_DATA_PATHÚz$./data/experiences/all_samples.jsonlÚtrusts_chroma_ground_truthFu,Few-shotå·²å�¯ç”¨: top_k=%s, min_rating=%s%su7(Chroma 黄金库:检索ä¸�按 min_rating 过滤)uFew-shot加载失败: u,将使用标准生æˆ�u4[OK] Text2SQLOrchestratoråˆ�始化完æˆ�: max_retry=z, use_vector_search=z , fewshot=onu, nl→zh_norm=onu, nl→zh_norm=off)r*r/r0r5Údeepseekr r Ú
_vector_indexÚ_vector_db_pathr1r3r4Úfewshot_selectorÚosÚgetenvÚlowerrÚstripr
ÚgetattrÚloggerÚinfoÚ ExceptionÚwarning)Úselfr*r+r,r-r.r/r0r1r2r3r4r5Ú
use_chromaÚpathÚenv_pÚ_gtÚes r'Ú__init__zText2SQLOrchestrator.__init__,sÛ€ð>-ˆÔØ"ˆŒØ!2ˆÔØ'>ˆÔ$ð Ð !Ø&ˆD�MáÜ .¨Ó ?�•
ä .¬~ÐFVÔ/WÓ X�”
ð7;ˆÔØ-ˆÔð /ˆÔØ*ˆÔØ"4ˆÔØ $ˆÔà × Ò ð
-ÜŸY™YÐ';¸WÓE×KÑKÓMðRð�
2026-04-16 10:53:10 +08:00
ð
(Ð3ÜÐ3Ó4×:Ñ:Ó<‘DäŸI™IÐ&9Ó:�EØÐ(Ø$Ÿ{™{›}™ñ&0™rÐ5[˜Ü(7¸º ÀÓ(E�Ô%ܘd×3Ñ3Ð5QÐSXÓY�Ü— ‘ ØBØ!Ø&ÙQTÑMÐZ\ô ô � ‰ ðØ"˜ Ð#7Ð8IÐ7Jð
Là"&×"6Ò"6‘¸Bñ
@ð'+×&BÒ&BÐ"ñ
^õ
ðI]ñ
^õ
øô ò
-Ü—‘Ð!7¸°sÐ:RÐSÔTØ',�×$Ñ$ûð
2026-04-14 10:28:22 +08:00
-ús B7FÆ F:Æ F5Æ5F:Údialog_contextÚquestionÚmax_lenÚreturncó—|xsdj«}|xsdj«}|s|Sd|z}t|«t|«z|kr||zS|t|«z
}|dkr|| dS|d|j«|zS)uN拼接上文与当å‰�é—®å�¥ï¼ŒæŽ§åˆ¶æ€»é•¿ï¼Œä¼˜å…ˆä¿�留当å‰�é—®å�¥å®Œæ•´ã€‚r>õ
2026-04-16 10:53:10 +08:00
�当�用户问题】
2026-04-14 10:28:22 +08:00
éPN)rGÚlenÚrstrip)rTrUrVÚdcÚqÚtailÚrooms r'Ú_merge_dialog_for_modelz,Text2SQLOrchestrator._merge_dialog_for_model†s—€ð
2026-04-16 10:53:10 +08:00
Ò" ×
)Ñ
2026-04-14 10:28:22 +08:00
)Ó
+ˆØ
Š^˜× "Ñ "Ó $ˆÙ؈HØ/°!Ñ3ˆÜ ˆr‹7”S˜“YÑ  'Ò )ؘ‘9Ð Øœ˜T›Ñ"ˆØ �"Š9ؘ˜˜ �?Ð "Ø�%�4ˆy×ÑÓ! DÑ(Ð(r&có„—|j€)ddlm}|«}t||j¬«|_|jS)u*获å�–或创建å�‘é‡�索引(懒加载)r)Ú get_embedder)ÚembedderÚ persist_dir)rAÚutils.embeddingrcr
rB)rMrcrds r'Ú_get_vector_indexz&Text2SQLOrchestrator._get_vector_index—s?€à × Ñ Ð %Ý 4á#“~ˆHÜ!.Ø!Ø ×0Ñ0ô"ˆDÔ ð×!Ñ!Ð!r&Útop_kc óv—|js/tjd«|jj «S |j «}|j
|j«tjdt|xsd«|xsdddt|xsd«dkDrdndz«|j||d¬«}|D�cgc]}|d ‘Œ }}|dtd
t|««D�cgc],}|d tt|jd d ««d
«f‘Œ.}}tjdt|«|«|Scc}wcc}w#t$rf}tjd|›d�d¬«ddl} tj| j!««|jj «cYd}~Sd}~wwxYw)uÁ
阶段1:粗筛(��检索)
Args:
question: 用户问题
2026-04-16 10:53:10 +08:00
top_k: 返回�K个候选表
2026-04-14 10:28:22 +08:00
Returns:
2026-04-16 10:53:10 +08:00
候选表�列表
u6[Orchestrator] å�‘é‡�æ�œç´¢å·²ç¦�用,使用所有表uB[Orchestrator] 开始å�‘é‡�检索: query_chars=%s query_preview=%rr>NéÈõ…gš™™™™™¹?)ÚqueryrhÚscore_thresholdÚ
table_nameéÚscoreçéuJ[Orchestrator] å�‘é‡�ç²—ç­›: 命中=%s 张(阈值内),表å��+分: %su#[Orchestrator] å�‘é‡�检索失败: u,é™�级为使用所有表T)Úexc_infor)r0rIrJr*Ú list_tablesrgÚensure_index_for_schemar[ÚsearchÚminÚroundÚfloatÚgetrKÚerrorÚ tracebackÚ
2026-04-14 10:28:22 +08:00
format_exc)
rMrUrhÚindexerÚresultsÚrÚcandidate_tablesÚscoredrRr|s
2026-04-16 10:53:10 +08:00
r'Ú_coarse_filterz#Text2SQLOrchestrator._coarse_filter£s³€ð×%Ò%ä �K‰KÐPÔ QØ×&Ñ&×2Ñ2Ó4Ð 4ð! 5Ø×,Ñ,Ó.ˆGØ × +Ñ +¨D×,?Ñ,?Ô @ô
2026-04-14 10:28:22 +08:00
�K‰KØTÜ�H’N Ó#Ø’˜R  #Ð&´3°x²~À2Ó3FÈÒ3L©%ÐRTÑUô
ð
—n‘nØØØ #ð%óˆGñ :AÓA¹°A  ,£¸Ð ÐAð!Ð!8¤3 r¬3¨w«<Ó#8Ñ9óá9�Að�<‘¤%¬¨a¯e©e°G¸SÓ.AÓ(BÀAÓ"FÒGØ9ð
ðô
�K‰KØ\ÜÐ$Ó%Øô
ð
$Ð #ùò Bùòøôò 5Ü �L‰LÐ>¸q¸cÐA\Ð]ÐhlˆLÔ mÛ Ü �L‰L˜×-Ñ-Ó/Ô 0à×&Ñ&×2Ñ2Ó4Õ 4ûð  5ús=½BE à D?ÃE Ã*1EÄ#E Ä?
E Å F8ÅAF3Æ-F8Æ3F8r�Ú
2026-04-16 10:53:10 +08:00
max_tablesc óê—g}|D]G}|jj|«}|sŒ!|jxsd}|jd|›d|›�«ŒIdj |«}|j
j
2026-04-14 10:28:22 +08:00
||¬«} | jdg«}
| jdd«} |
2026-04-16 10:53:10 +08:00
d |}
| xsdj«} tjd
2026-04-16 10:53:10 +08:00
|
t| «| d d t| «d kDrd ndz«|
| fS)
2026-04-14 10:28:22 +08:00
u

阶段2:LLM精筛(Schema Linker Agent)
Args:
question: 用户问题
candidate_tables: 候选表列表
max_tables: 最多选择的表数
Returns:
2026-04-14 10:28:22 +08:00
(相关表列表, 推��由)
u æ— æ��è¿°ú- z: Ú
)rUÚ
table_listÚrelevant_tablesrr>NuALLM精筛选中表:%s | reasoning_chars=%s reasoning_preview=%riXrk) r*Ú get_tableÚcommentÚappendÚjoinr@Ú
2026-04-16 10:53:10 +08:00
select_tablesrzrGrIrJr[)
2026-04-14 10:28:22 +08:00
rMrUr�r„Ú table_infosÚtbl_nameÚtabler‹Útable_list_strÚresponser‰rÚrss
r'Ú_llm_select_tablesz'Text2SQLOrchestrator._llm_select_tablesÚs €ð$ˆ Û(ˆHØ×'Ñ'×1Ñ1°(Ó;ˆEÚØŸ-™-Ò6¨;�Ø×"Ñ" R¨ z°°G°9Ð#=Õ>ð )ð Ÿ™ ;Ó/ˆð—=‘=×.Ñ.ØØ%ð/ó
ˆð
#Ÿ,™,Ð'8¸"Ó=ˆØ—L‘L ¨bÓ1ˆ ð*¨+¨:Ð6ˆàŠo˜2×
$Ñ
2026-04-16 10:53:10 +08:00
$Ó
&ˆÜ� ‰ Ø OØ Ü �‹GØ ˆt�ˆH¤ R£¨3¢™°BÑ 7ô 
2026-04-14 10:28:22 +08:00
ð   Ð)Ð)r&)u 对手方u ç»�纪商u券商u å°�手方cól‡—‰sytˆfd„|jD««ryd‰j«vS)NFc3ó&•K—|]}|‰v–—Œ
y­w)Nr%)Ú.0ÚkrUs €r'Ú <genexpr>zJText2SQLOrchestrator._question_implies_broker_dimension.<locals>.<genexpr>søèø€Ð?Ñ&> ˆq�HŒ}Ñ&>ùsƒTÚbroker)r$Ú_BROKER_KEYWORDS_CNrF)rMrUs `r'Ú"_question_implies_broker_dimensionz7Text2SQLOrchestrator._question_implies_broker_dimension s2ø€ÙØÜ Ó? d×&>Ò&>Ó?Ô ?ØØ˜8Ÿ>™>Ó+Ð+Ð+r&r‰có—|j|«s|d|Sddg}|D�cgc] }|jj|«sŒ|‘Œ"}}|s|d|St«}g}|D])}||vsŒ|j |«|j |«Œ+|D]U}t
|«|k\rnE||vsŒ|jj|«sŒ4|j |«|j |«ŒWtjd||«|d|Scc}w)uò
问题涉�对手方/�纪商时,优先纳入 TSBBrokerContract 与 MCBroker(若 Schema 中存在),
��仅选中 VSBHK 报表视图�无 BrokerID,模型�照抄黄金范例列�导致校验失败。
2026-04-16 10:53:10 +08:00
NÚTSBBrokerContractÚMCBrokeruB对手方/ç»�纪商问题:优先纳入 %s,调整å�Žé€‰è¡¨ï¼š%s) r�r*rŠÚsetrŒÚaddr[rIrJ) rMrUr‰r„ÚpriorityÚtÚpresentÚseenÚmergeds r'Ú_prioritize_broker_tablesz.Text2SQLOrchestrator._prioritize_broker_tabless€ð×6Ñ6°xÔ@Ø" ; JÐ/Ð /à'¨Ð4ˆÙ&ÓK™h˜¨$×*=Ñ*=×*GÑ*GÈÕ*J’1˜hˆÐKÙØ" ; JÐ/Ð /ä‹uˆØˆÛˆAؘŠ}Ø—
‘
2026-04-14 10:28:22 +08:00
˜aÔ Ø—‘˜• ðó!ˆAÜ�6‹{˜jÒ(ÙØ˜Š} ×!4Ñ!4×!>Ñ!>¸qÕ!AØ—
‘
˜aÔ Ø—‘˜• ð !ô � ‰ ÐXÐZaÐciÔjØ�k�zÐ"Ð"ùò#Ls Ÿ C=ÁC=Ú table_namescó¶—t|«}|D�]
}|jj|«}|sŒ"|jD]N}|j|vsŒ|j |j«t jd|j›�«ŒP|jj«D]o}|jD]^}|j|k(sŒ|j|vsŒ"|j |j«t jd|j›�«Œ`Œq�Œ
t|«}t|«t|«kDrt jd|›d|›�«|S)u®
2026-04-16 10:53:10 +08:00
外键扩展:自动添加关�表
Args:
table_names: 已选中的表�列表
Returns:
2026-04-14 10:28:22 +08:00
扩展�的表�列表
u外键扩展:添加关�表 u外键扩展:添加引用表 u外键扩展:u → )
r¡r*rŠÚ foreign_keysÚ ref_tabler¢rIÚdebugÚ
2026-04-16 10:53:10 +08:00
get_tablesÚnamer!r[rJ)rMr©Úresultr�r‘ÚfkÚotherÚexpandeds r'Ú_expand_relationsz&Text2SQLOrchestrator._expand_relations1s€ô�[Ó!ˆä#ˆHØ×'Ñ'×1Ñ1°(Ó;ˆEÙØð×(Ô(�Ø—<‘< vÒ-Ø—J‘J˜rŸ|™|Ô,Ü—L‘LÐ#BÀ2Ç<Á<À.Ð!QÕRð)ð ×,Ñ,×7Ñ7Ö9�Ø×,Ô,�BØ—|‘| xÓ/°E·J±JÀfÒ4LØŸ
™
 5§:¡:Ô.ÜŸ ™ Ð'FÀuÇzÁzÀlÐ%SÕTñ-ò:ð$ô$˜“<ˆÜ ˆx‹=œ3˜{Ó+Ò +Ü �K‰K˜/¨+¨°e¸H¸:ÐFÔ Gàˆr&Ú
schema_strÚdialectÚvalidation_feedbackc ó"—ddlm}m}ddlm}|xsdj «} |}
| r| ›d|›�}
|j �r;|j�r. |jj|
2026-04-16 10:53:10 +08:00
|j|j¬«} | rùdjt| «D� �
2026-04-14 10:28:22 +08:00
cgc]'\} }
d| d z›d
|
j›d |
j›�‘Œ)c}
} «}t|jd d
«rd}nd}|›|›d|›�}t j#dt%| «| D�
cgc]}
2026-04-14 10:28:22 +08:00
|
j&‘Œc}
| D�
cgc]D}
2026-04-16 10:53:10 +08:00
t%|
jxsd«dkDr|
2026-04-14 10:28:22 +08:00
jxsddddzn|
jxsd‘ŒFc}
«|}|dk(rd}d}| rd| ›d�}||j-|||¬«z}|dk(r|dz
2026-04-14 10:28:22 +08:00
}|r|d|›�z
}d|dœd|dœg}|j.j1|dd ¬!«}|j2j «}d"|vrH||j5d"«d#z|j5d$|j5d"«d#z«j «}nKd$|vrG||j5d$«d%z|j5d$|j5d$«d%z«j «}|||«}d&}t%|«|kr|n|d|d'z}t j#d(t%|«|«|Scc}
} wcc}
wcc}
w#t($r#}t j+d|›�«Yd}~�Œ“d}~wwxYw))uª
SQL生�(SQL Generator Agent)
2026-04-16 10:53:10 +08:00
2026-04-14 10:28:22 +08:00
Args:
2026-04-16 10:53:10 +08:00
question: 用户问题
schema_str: Schema�述字符串
2026-04-14 10:28:22 +08:00
dialect: SQL方言
2026-04-16 10:53:10 +08:00
validation_feedback: �空时附加到用户�示(�试时传入上次校验错误)
2026-04-14 10:28:22 +08:00
dialog_context: �几轮对�摘�;与 ``question`` 一并供指代消解与续问。
Returns:
SQL语�
2026-04-16 10:53:10 +08:00
r)ÚSQL_GENERATOR_SYSTEMÚSQL_GENERATOR_USER)Únormalize_sql_for_dialectr>u
ã€�当å‰�问】)rUrhÚ
min_ratingz
u示例 ru
2026-04-16 10:53:10 +08:00
:
问题:u
SQL:
r?Fu以下为 Few-shot 黄金库(��库 chroma_fewshot)中已入库的标准问答,SQL 已作为正确答案维护。**请优先对�其中的表��列�与 T-SQL 写法习惯**,�结��当�Schema】生�查询;若与 Schema 冲�,以当� Schema 为准。
u/�考以下相似示例的SQL编写风格:
u
�当�Schema】
u?已注入 %s 个 few-shot 示例: qid=%s question_zh_preview=%rrZNrkuFew-shot检索失败: ÚtsqlzMicrosoft SQL Server (T-SQL)u–ã€�对è¯�上文】(用于ç�†è§£ã€Œè¿™/é‚£/å�Œæ ·/上é�¢/刚æ‰�ã€�等指代å�Šç»­é—®æ�¡ä»¶ï¼›è¯·ç»“å�ˆä¸‹æ–‡ã€Œå½“å‰�用户问题ã€�生æˆ� SQL。)
)ÚschemarUr¶u 
2026-04-16 10:53:10 +08:00
�硬性�求】目标库为 SQL Server(T-SQL):�止使用 MySQL �引� `;标识符如需引用请使用方括�,例如 [TableName]�[ColumnName]。字符串连接使用 `+`(与系统�示中的标准版�范例一致)。「今日�「当天�等与日期列比较时,使用 `CAST(GETDATE() AS DATE)`,**�止** `CURDATE()`�`NOW()`�`CURRENT_DATE`(MySQL)。�件请使用 T-SQL 惯用写法(例如 IS NOT NULL)。排版�须�守:关键字大写�SELECT �列一行缩进�WHERE 续行以 AND 开头�PascalCase 英文别�。
**ç¦�æ­¢**在å�•引å�·å­—符串字é�¢é‡�或 `N'…'` 中出现任何中日韩文字;业务中文须映射为 Schema 注释中的代ç �或通过维表 JOIN,勿写 `= '过户费'` 这类比对。uµ
2026-04-16 10:53:10 +08:00
�上次校验未通过】请根�下列错误修正 SQL,并输出完整�执行查询;表��列�必须与「当�Schema�中完全一致,��臆造字段�。
Úsystem)ÚroleÚcontentÚuserrqgð?)Ú temperatureÚtop_pz```sqléz```éià.u
…(日志已截断)u生�的SQL(chars=%s):
%s)Úconfig.promptsr¹rºÚutils.sql_parserr»rGr1rCÚselectr3r4r�Ú enumerateÚ question_zhrrHrIrJr[ÚqidrKrLÚformatr@ÚchatrÁÚfind)rMrUrµr¶r·rTr¹rºr»r]Úfewshot_questionÚexamplesÚiÚexÚexamples_promptÚintrorRÚ
dialect_labelÚprefixÚ user_contentÚmessagesr“rÚlimÚbodys r'Ú
_generate_sqlz"Text2SQLOrchestrator._generate_sqlUs•€÷, LÝ>àÒ" ×
)Ñ
2026-04-16 10:53:10 +08:00
)Ó
+ˆØ#ÐÙ
Ø"$ Ð%8¸¸
ÐCÐ ð × Ó  D×$9Ó$9ð
=Ø×0Ñ0×7Ñ7Ø-Ø×,Ñ,Ø#×6Ñ6ð8ó�ñ
2026-04-16 10:53:10 +08:00
Ø&,§k¡kä%.¨xÔ%8ô3á%8™E˜A˜rð" ! A¡#  n°R·^±^Ð4DÀJÈrÏvÉvÈhÒWØ%8ò3ó'�Oô˜t×4Ñ4Ð6RÐTYÔZð~ñð !T˜Ø$) 7¨?Ð*;Ð;SÐT^ÐS_Ð!`�JÜ—K‘KØYܘH›
2026-04-14 10:28:22 +08:00
Ù*2Ó3©( B˜Ÿ›¨(Ñ3ñHPóQñHPðBDÄ#ÀbÇnÁnÒFZÐXZÓB[Ð^`ÒB`˜2Ÿ>™>Ò/¨R°°"Ð5¸Ò=Ðgi×guÑguÒg{Ðy{Ñ|ðHPñQô ð ˆ
Ø �fÒ Ø:ˆMàˆÙ
ðLà�$�dðð
ð Ð 2× 9Ñ 9ØØØ!ð!:ó!
ñ
ˆ ð
�fÒ Ø ðBñ
2026-04-14 10:28:22 +08:00
ˆLñ Ø ðià&Ð'ð)ñ
ˆLðÐ*>Ñ ?ب Ñ 5ð
ˆð —=‘=×%Ñ% h¸CÀsÐ%ÓKˆØ×Ñ×$Ñ$Ó&ˆð �s‰?Ø�c—h‘h˜xÓ(¨1Ñ,¨S¯X©X°e¸S¿X¹XÀhÓ=OÐRSÑ=SÓ-TÐU×[Ñ[Ó]‰CØ
2026-04-16 10:53:10 +08:00
�c‰\Ø�c—h‘h˜u“o¨Ñ)¨#¯(©(°5¸#¿(¹(À5»/ÈAÑ:MÓ*NÐO×UÑUÓWˆCá'¨¨WÓ5ˆàˆÜ˜#“h #’o‰s¨3¨t°¨9Ð7OÑ+OˆÜ� ‰ Ð5´s¸3³xÀÔF؈
ùóa3ùò"4ùòQøäò
=Ü—‘Ð!7¸°sÐ;×<Ò<ûð
=úsEÁ A
K"Â,K
ÃA K"Ä
2026-04-14 10:28:22 +08:00
K Ä K"Ä&A KÅ/K"ËK"Ë" LË+L Ì Lrc óx—g}g}d}d} ddlm}
m} |
||¬«\} }
2026-04-14 10:28:22 +08:00
| s|j|
2026-04-16 10:53:10 +08:00
«| ||j|¬«\}}|s|j|«ddlm}m}||«\}}|s|j|«|dk(r||«\}}|s|j|«t|«dk(rGddl m
2026-04-14 10:28:22 +08:00
}||«\}}|dk(rd }|r|d
|›�z
}|j|«n|€|jd «|d v}|sì |jj||¬
«}t|jdg««}|rA|D�cgc]6}t!|t"«r$|j%d«s|j%d«s|‘Œ8}}|jdd«s|j|«|j|jdg««|jdg«}|rt&j)d|›�«|dk(r`t|«dk(rRd}|}|xsdj/«} | r| ›d|›�} |jj1|||¬«}!|›d|!›�} d}"| xs||"z} t|«dk(}#t&j3d|#t|«t|«|t|xsd««|rt&j3d |dd!«|rt&j3d"|dd!«|#|||| fScc}w#t*$r#}t&j-d|›�«Yd}~�Œd}~wwxYw#t*$r'}t&j-d|›�«|›d�} Yd}~Œîd}~wwxYw)#u±
SQL验�(程�验� + 库探针 + 按探针分支的 LLM)
Args:
2026-04-16 10:53:10 +08:00
sql: SQL语�
2026-04-14 10:28:22 +08:00
schema_str: Schema�述
2026-04-16 10:53:10 +08:00
dialect: 与生�一致的 SQL 方言(sqlglot �,默认 tsql)
2026-04-14 10:28:22 +08:00
question: 用户自然语言(探针为 0 时用于生�补充说明)
2026-04-16 10:53:10 +08:00
dialog_context: 会�上文;探针 0 时与 question 一并传入说明模型
Returns:
(是�通过, 错误列表, 警告列表, 库执行探针状�, 无数�时的用户说明)
探针:``1`` 至少一行数�;``0`` 执行�功但行数为 0;``-1`` 执行失败;``None`` 未�置库或未跑探针
2026-04-14 10:28:22 +08:00
Nr)Úvalidate_sql_syntaxÚvalidate_schema_consistency©r¶)Úcheck_dangerous_operationsÚ#check_no_cjk_in_sql_string_literalsr½)Úprobe_sql_execution_status_exéÿÿÿÿu™ã€�库探针结果:-1 执行失败】SQL 在目标库执行报错,系统将ä¾�æ�®ä¸‹åˆ—错误**自动é‡�新生æˆ�** SQL(请等待é‡�试结果)。u
2026-04-16 10:53:10 +08:00
æ•°æ�®åº“返回:u7未é…�ç½® database_url,已跳过数æ�®åº“执行探针)rärr)rr¾rzunknown_table:zunknown_column:rTrÚ suggestionsu优化建议:u/LLM验è¯�失败(é™�级为仅程åº�验è¯�): u½ã€�库探针结果:0 行】该 SQL 已在数æ�®åº“æˆ�功执行,但**返回数æ�®è¡Œæ•°ä¸º 0**(未查到匹é…�记录)。下方已附带完整 SQL 与原因分æž�,请一并阅读。r>rY)rUrr¾u
�问题分�】
u无数�说明生�失败: u{
�问题分�】
未能自动生æˆ�详细分æž�。请补充时间范围ã€�筛选æ�¡ä»¶æˆ–业务对象å�Žé‡�æ–°æ��问。u‹
�追问 — 请补充��次�问以�新生� SQL】
1. 请根�上述分�,尽�具体地补充或修正:**时间范围**�**业务对象**(账户/�约/代�等)�**筛选�径** 或 **您认为 SQL 中���的�件**。
2026-04-14 10:28:22 +08:00
2. 补充说明å�Žè¯·**é‡�æ–°å�‘起一次自然语言æ��é—®**(无需粘贴 SQL),系统会结å�ˆæ‚¨çš„æ–°æ��è¿°**é‡�新生æˆ�**查询。ul[validate] 程åº�+探针+LLM 汇总: valid=%s err_count=%s warn_count=%s db_execution_status=%s sql_chars=%su[validate] errors 预览: %séz[validate] warnings: %s)rÈrÞrßÚextendr*Úutils.validatorsrárâr[Údb.dbhub_toolsrãrŒr@Ú validate_sqlr!rzÚ
2026-04-16 10:53:10 +08:00
isinstancerÚ
startswithrIr­rKrLrGÚempty_result_user_feedbackrJ)$rMrrµr¶rUrTrrÚdb_execution_statusÚempty_feedbackrÞrßÚ syntax_okÚ
2026-04-14 10:28:22 +08:00
syntax_errorsÚ schema_okÚ
2026-04-16 10:53:10 +08:00
schema_errorsrárâÚ danger_okÚ
danger_errorsÚcjk_okÚ
cjk_errorsrãÚ db_probe_errÚmsgÚskip_validator_llmÚ
llm_resultÚ
llm_errorsrRrår×Úfb_qr]Úllm_fbÚfollowÚis_valids$ r'Ú
_validate_sqlz"Text2SQLOrchestrator._validate_sqlÎs¥€ð,ˆØˆØ-1ÐØ(,ˆ÷ Vñ$7°sÀGÔ#LÑ ˆ �=ÙØ �M‰M˜-Ô (ñ$?Ø �×$Ñ$¨gô$
Ñ ˆ �=ñØ �M‰M˜-Ô (÷ eÙ#=¸cÓ#BÑ ˆ �=ÙØ �M‰M˜-Ô (ð �fÒ Ù!DÀSÓ!IÑ ˆF�JÙØ—
‘
2026-04-14 10:28:22 +08:00
˜jÔ)ô ˆv‹;˜!Ò Ý Dá0MÈcÓ0RÑ -Ð  Ø" bÒ(ðjðñ ØÐ1°,°Ð@Ñ@�CØ—
2026-04-16 10:53:10 +08:00
‘
˜cÕ"Ø$Ð,Ø—‘ØMôð1°JÐ>Ðñ"ð
VØ!Ÿ]™]×7Ñ7¸CÈ
2026-04-16 10:53:10 +08:00
Ð7ÓS�
ä! *§.¡.°¸2Ó">Ó?�
2026-04-14 10:28:22 +08:00
áñ",ó"á!+˜AÜ% a¬Ô-àŸL™LÐ)9Ô:Ø Ÿ|™|Ð,=Ô>ò Ø!+ðð"ð"—~‘~ g¨tÔ4Ø—M‘M *Ô-à—‘ 
§¡¨z¸2Ó >Ô?Ø(Ÿn™n¨]¸BÓ?� ÙÜ—L‘L ?°;°-Ð!@ÔAð  !Ò #¬¨F« °qÒ(8ðQð
ðˆDØ Ò& B×-Ñ-Ó/ˆBÙØ˜Ð;¸H¸:ÐF�ð
ØŸ™×AÑAØ!ØØ%ðBó�ð
2026-04-16 10:53:10 +08:00
%+ 8Ð+CÀFÀ8Ð!L�ð`ð
ð -Ò6°¸&Ñ@ˆNä�v“; !Ñ#ˆÜ� ‰ ð
2à Ü �‹KÜ �‹MØ Ü �’ �r‹Nô
ñ Ü �K‰KÐ6¸¸rÀ¸
2026-04-14 10:28:22 +08:00
Ô CÙ Ü �K‰KÐ1°8¸B¸Q°<Ô @ؘ Ð+>ÀÐNÐNùòG"øô$ò