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

347 lines
39 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
TQàiJ ãóÒ—dZddlZddlZddlmZmZmZmZmZddl m
2026-04-14 10:28:22 +08:00
Z
m Z ddl m
Z
ddlmZddlmZmZddlmZmZej,e«Ze
2026-04-14 10:28:22 +08:00
Gd „d
««ZGd „d «Zy)
u]
2026-04-14 10:28:22 +08:00
Text2SQL 多智能体编排器
�调 Schema Linker�SQL Generator�Validator 三个Agent
éN)ÚCallableÚDictÚListÚOptionalÚTuple)Ú dataclassÚfield)Ú
SchemaManager)Ú
SchemaIndexer)ÚDeepSeekClientÚDeepSeekConfig)ÚExperienceSampleÚ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 d4dedeedeedeedede d e
d
e
2026-04-14 10:28:22 +08:00
d eed e d
e de
fd„Z e dedede defd„«Z
defd„Z d5dede deefd„Z d6dedeede deeeeffd„ZdZdede
fd„Z d6dedeede deefd„Zdeedeefd „Zdd!œd"eeeefd#eeegdfdefd$„Z d7ded%ed&ed'ed(ed)eedeed#eeegdfdefd*„Z d8ded%ed&ed)eedeed#eeegdfdefd+„Z d9d,ed%ed&ededeedee
eeeeee eeff d-„Z d:ded&ed.e d/e
deed#eeegdfde fd0„Z!d;d1e
de
fd2„Z"defd3„Z#y)<ÚText2SQLOrchestratoruã
Text2SQL 多智能体编排器
工作�程:
1. 粗筛候选表
2. Schema Linker:LLM 精筛表
2026-04-14 10:28:22 +08:00
3. 外键扩展 → 拼 Schema �集
4. SQL Generator:生� SQL
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Ú
2026-04-14 10:28:22 +08:00
fewshot_top_kÚfewshot_min_ratingÚtranslate_english_to_zhc
óX—||_||_||_| |_|�||_n-|rt |«|_nt t
|¬««|_d|_||_||_ |
|_
| |_ d|_ |jr  tjdd«j«dv}
| �t!| «j#«}n.tjd«}|�|j#«}n|
rdnd}t%|xsd«|_ t&j)d |
›d
| ›�«d|_t&j)d|›d|›�|jrdndz|jr dz«ydz«y#t*$r*}t&j-d |›d �«d
|_ Yd}~Œzd}~wwxYw)u£
�始化编排器
Args:
schema_manager: Schema管�器实例
llm_client: �选:外部传入的 LLM Client(需具备 chat/chat_with_json 等方法)。
deepseek_api_key: DeepSeek API密钥(也�通过环境��DEEPSEEK_API_KEY)
deepseek_config: DeepSeek�置对象(优先于api_key)
vector_db_path: ��数�库路径
max_retry: 最大�试次数(包�首次生�)
2026-04-16 10:53:10 +08:00
use_vector_search: 是�使用��检索粗筛
2026-04-14 10:28:22 +08:00
translate_english_to_zh: 为 True 时(默认)对**所有**�空问��一次 LLM 归一(temperature=0),
输出一�标准中文供检索与生�;使�一语义的中英文表述对�,从而 SQL 一致。为 False 时
��归一(原样英文/中文)。环境�� ``TRANSLATE_EN_TO_ZH=false`` �关闭。
N)Úapi_keyÚFEWSHOT_USE_CHROMAÚfalse©Ú1ÚtrueÚyesÚFEWSHOT_DATA_PATHÚz$./data/experiences/all_samples.jsonluFew-shotå·²å�¯ç”¨: top_k=z
, min_rating=uFew-shot加载失败: u,将使用标准生æˆ�Fu4[OK] Text2SQLOrchestratoråˆ�始化完æˆ�: max_retry=z, use_vector_search=z , fewshot=onu, nl→zh_norm=onu, nl→zh_norm=off)r,r1r2r7Údeepseekr r
Ú
_vector_indexÚ_vector_db_pathr3r5r6Úfewshot_selectorÚosÚgetenvÚlowerr ÚstriprÚloggerÚinfoÚ ExceptionÚwarningÚ_last_fewshot_golden)Úselfr,r-r.r/r0r1r2r3r4r5r6r7Ú
use_chromaÚpathÚenv_pÚes r)Ú__init__zText2SQLOrchestrator.__init__,sÔ€ð>-ˆÔØ"ˆŒØ!2ˆÔØ'>ˆÔ$ð Ð !Ø&ˆD�MáÜ .¨Ó ?�•
ä .¬~ÐFVÔ/WÓ X�”
ð7;ˆÔØ-ˆÔð /ˆÔØ*ˆÔØ"4ˆÔØ $ˆÔà × Ò ð
2026-04-16 10:53:10 +08:00
-ÜŸY™YÐ';¸WÓE×KÑKÓMðRð�
ð
(Ð3ÜÐ3Ó4×:Ñ:Ó<‘DäŸI™IÐ&9Ó:�EØÐ(Ø$Ÿ{™{›}™ñ&0™rÐ5[˜Ü(7¸º ÀÓ(E�Ô%Ü— ‘ Ø/°
2026-04-16 10:53:10 +08:00
¨ð?"Ø"4Ð!5ð7ôðBFˆÔ!ä� ‰ ðØ"˜ Ð#7Ð8IÐ7Jð
Là"&×"6Ò"6‘¸Bñ
@ð'+×&BÒ&BÐ"ñ
2026-04-16 10:53:10 +08:00
^õ
2026-04-14 10:28:22 +08:00
ðI]ñ
^õ
øôò
2026-04-16 10:53:10 +08:00
-Ü—‘Ð!7¸°sÐ:RÐSÔTØ',�×$Ñ$ûð
2026-04-14 10:28:22 +08:00
-ús BE6Å6 F)Å? F$Æ$F)Údialog_contextÚquestionÚmax_lenÚreturncó—|xsdj«}|xsdj«}|s|Sd|z}t|«t|«z|kr||zS|t|«z
2026-04-16 10:53:10 +08:00
}|dkr|| dS|d|j«|zS)uN拼接上文与当å‰�é—®å�¥ï¼ŒæŽ§åˆ¶æ€»é•¿ï¼Œä¼˜å…ˆä¿�留当å‰�é—®å�¥å®Œæ•´ã€‚rAõ
2026-04-14 10:28:22 +08:00
�当�用户问题】
éPN)rIÚlenÚrstrip)rUrVrWÚdcÚqÚtailÚrooms r)Ú_merge_dialog_for_modelz,Text2SQLOrchestrator._merge_dialog_for_model†s—€ð
Ò" ×
)Ñ
)Ó
+ˆØ
Š^˜× "Ñ "Ó $ˆÙ؈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)rCÚutils.embeddingrdr rD)rOrdres 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:
2026-04-14 10:28:22 +08:00
question: 用户问题
2026-04-16 10:53:10 +08:00
top_k: 返回�K个候选表
Returns:
2026-04-14 10:28:22 +08:00
候选表�列表
u6[Orchestrator] å�‘é‡�æ�œç´¢å·²ç¦�用,使用所有表uB[Orchestrator] 开始å�‘é‡�检索: query_chars=%s query_preview=%rrANéÈõ…gš™™™™™¹?)ÚqueryriÚscore_thresholdÚ
table_nameéÚscoreçéuJ[Orchestrator] å�‘é‡�ç²—ç­›: 命中=%s 张(阈值内),表å��+分: %su#[Orchestrator] å�‘é‡�检索失败: u,é™�级为使用所有表T)Úexc_infor)r2rJrKr,Ú list_tablesrhÚensure_index_for_schemar\ÚsearchÚminÚroundÚfloatÚgetrLÚerrorÚ tracebackÚ
2026-04-14 10:28:22 +08:00
format_exc)
rOrVriÚindexerÚresultsÚrÚcandidate_tablesÚscoredrSr}s
r)Ú_coarse_filterz#Text2SQLOrchestrator._coarse_filter£s³€ð×%Ò%ä �K‰KÐPÔ QØ×&Ñ&×2Ñ2Ó4Ð 4ð! 5Ø×,Ñ,Ó.ˆGØ × +Ñ +¨D×,?Ñ,?Ô @ô
�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 Ä?
2026-04-14 10:28:22 +08:00
E Å F8ÅAF3Æ-F8Æ3F8r‚Ú
max_tablesc óê—g}|D]G}|jj|«}|sŒ!|jxsd}|jd|›d|›�«ŒIdj |«}|j
j
||¬«} | jdg«}
| jdd«} |
d |}
| xsdj«} tjd
|
t| «| d d t| «d kDrd ndz«|
| fS)
u

阶段2:LLM精筛(Schema Linker Agent)
Args:
question: 用户问题
candidate_tables: 候选表列表
max_tables: 最多选择的表数
Returns:
(相关表列表, 推��由)
u æ— æ��è¿°ú- z: Ú
)rVÚ
table_listÚrelevant_tablesrrANuALLM精筛选中表:%s | reasoning_chars=%s reasoning_preview=%riXrl) r,Ú get_tableÚcommentÚappendÚjoinrBÚ
select_tablesr{rIrJrKr\)
rOrVr‚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×
$Ñ
$Ó
&ˆÜ� ‰ Ø OØ Ü �‹GØ ˆt�ˆH¤ R£¨3¢™°BÑ 7ô 
ð   Ð)Ð)r()u 对手方u ç»�纪商u券商u å°�手方cól‡—‰sytˆfd„|jD««ryd‰j«vS)NFc3ó&•K—|]}|‰v–—Œ
y­w©Nr')Ú.0ÚkrVs €r)Ú <genexpr>zJText2SQLOrchestrator._question_implies_broker_dimension.<locals>.<genexpr>søèø€Ð?Ñ&> ˆq�HŒ}Ñ&>ùsƒTÚbroker)r&Ú_BROKER_KEYWORDS_CNrH)rOrVs `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,模型�照抄黄金范例列�导致校验失败。
NÚTSBBrokerContractÚMCBrokeruB对手方/ç»�纪商问题:优先纳入 %s,调整å�Žé€‰è¡¨ï¼š%s) rŸr,r‹Úsetr�Úaddr\rJrK) rOrVrŠ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ؘŠ}Ø—
‘
˜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�Œ
2026-04-14 10:28:22 +08:00
t|«}t|«t|«kDrt jd|›d|›�«|S)u®
外键扩展:自动添加关�表
Args:
table_names: 已选中的表�列表
Returns:
扩展�的表�列表
u外键扩展:添加关�表 u外键扩展:添加引用表 u外键扩展:u → )
r£r,r‹Ú foreign_keysÚ ref_tabler¤rJÚdebugÚ
get_tablesÚnamer#r\rK)rOr«Ú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ØŸ
2026-04-14 10:28:22 +08:00
™
 5§:¡:Ô.ÜŸ ™ Ð'FÀuÇzÁzÀlÐ%SÕTñ-ò:ð$ô$˜“<ˆÜ ˆx‹=œ3˜{Ó+Ò +Ü �K‰K˜/¨+¨°e¸H¸:ÐFÔ Gàˆr(©Úsql_stream_callbackÚmessagesr¸có —|j}|�ct|d«rW g}|j|dd¬«D]}|sŒ|j|«||«Œ dj |«j «S|j|dd¬«}|jxsdj «S#t $r }tjd|«Yd}~ŒVd}~wwxYw)uÃ
SQL 生�相关的一次 LLM 调用:�选��回调(将原始 completion 文本分片回传)。
无回调或���失败时与��� chat 行为一致。
NÚ chat_streamrrgð?)Ú temperatureÚtop_prAu.[GEN] chat_stream 失败,回退é�žæµ�å¼�: %s) rBÚhasattrr»r�rŽrIrLrJrMÚchatÚcontent)rOr¹r¸ÚdsÚpartsÚpiecerSÚmsgs r)Ú_sql_chat_completion_textz.Text2SQLOrchestrator._sql_chat_completion_textUsÆ€ð�]‰]ˆØ Ð *¬w°r¸=Ô/Ið
TØ#%�ØŸ^™^¨HÀ#ÈS˜^ÖQ�EÚØŸ ™  UÔ+Ù+¨EÕ2ðRð—w‘w˜u“~×+Ñ+Ó-Ð-ð�g‰g�h¨C°sˆgÓ;ˆØ— ‘ Ò!˜r×(Ñ(Ó*Ð*øôò
2026-04-14 10:28:22 +08:00
TÜ—‘ÐOÐQR×SÑSûð
TúsœB$¸9B$Â$ C
Â-CÃC
Ú
schema_strÚdialectÚgoldenÚ golden_scoreÚvalidation_feedbackc óÚ—ddlm} m}
ddlm} |j
xsdj
«} ttjdd««}
t| «|
2026-04-14 10:28:22 +08:00
kDr| d|
dz} |}|d k(rd
}|xsdj
«}d}|rd |›d �}||
j||jxsdj
«| |||¬
«z}|d k(r|dz
}|r|d|›�z
}d| dœd|dœg}tjd|j|«|j!||¬«}d|vrH||j#d«dz|j#d|j#d«dz«j
«}nKd|vrG||j#d«dz|j#d|j#d«dz«j
«}| ||«}d}t|«|kr|n|d|dz}tjdt|«|«|S)u—
Chroma few-shot 库内 SQL 视为正确答案:在高分相似命中下,仅让模型调整�件/字��以匹�当�问题。
r)ÚGOLDEN_SQL_ADAPT_SYSTEMÚGOLDEN_SQL_ADAPT_USER©Únormalize_sql_for_dialectrAÚFEWSHOT_GOLDEN_SQL_PROMPT_MAXÚ16000Nu'
-- …(标准答案过长,已截断)ÚtsqlúMicrosoft SQL Server (T-SQL)uqã€�对è¯�上文】(用于ç�†è§£æŒ‡ä»£ä¸Žç»­é—®æ�¡ä»¶ï¼›è¯·ç»“å�ˆã€Œå½“å‰�用户问题ã€�调整 WHERE 等。)
ú
)rÉÚgolden_questionÚ
2026-04-14 10:28:22 +08:00
golden_sqlÚschemarVrÇõ 
�硬性�求】目标库为 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™
�上次校验未通过】请在�留标准答案主干的��下修正 SQL;表��列�必须与「当� Schema 片段�中完全一致。
Úsystem©ÚrolerÀÚuseru5[GEN] 黄金 few-shot æ�¡ä»¶é€‚é…�: qid=%s score=%.4fr·ú```sqléú```ééà.õ
…(日志已截断)u-生�的SQL(黄金适�,chars=%s):
%s)Úconfig.promptsrÌrÍÚutils.sql_parserrÏrrIr$rFrGr\ÚformatÚ question_zhrJrKÚqidrÅÚfind)rOrVrÆrÇrÈrÉrÊrUr¸rÌrÍrÏÚgsqlÚmax_sqlÚ
dialect_labelr^ÚprefixÚ user_contentr¹rÚlimÚbodys r)Ú_generate_sql_golden_adaptz/Text2SQLOrchestrator._generate_sql_golden_adaptms:€÷ RÝ>à—
‘
2026-04-16 10:53:10 +08:00
Ò ˜b×'Ñ'Ó)ˆÜ”b—i‘iÐ ?ÀÓIÓJˆÜ ˆt‹9�wÒ Ø˜˜�>Ð$NÑNˆDàˆ
2026-04-14 10:28:22 +08:00
Ø �fÒ Ø:ˆMàÒ" ×
)Ñ
)Ó
+ˆØˆÙ
ðEØ�$�dðð
ð
Ð 5× <Ñ <Ø%Ø#×/Ñ/Ò5°2×<Ñ<Ó>ØØØØ!ð
!=ó!
2026-04-14 10:28:22 +08:00
ñ
ˆ ð �fÒ Ø ðBñ
ˆLñ Ø ðYà&Ð'ð)ñ
ˆLðÐ*AÑ Bب Ñ 5ð
ˆô
2026-04-14 10:28:22 +08:00
� ‰ Ø CØ �J‰JØ ô
ð
×,Ñ,Ø Ð*=ð-ó
2026-04-14 10:28:22 +08:00
ˆð �s‰?Ø�c—h‘h˜xÓ(¨1Ñ,¨s¯x©x¸¸s¿x¹xÈÓ?QÐTUÑ?UÓ/VÐW×]Ñ]Ó_‰CØ
�c‰\Ø�c—h‘h˜u“o¨Ñ)¨C¯H©H°U¸C¿H¹HÀU»OÈaÑ<OÓ,PÐQ×WÑWÓYˆCá'¨¨WÓ5ˆàˆÜ˜#“h #’o‰s¨3¨t°¨9Ð7OÑ+OˆÜ� ‰ ÐDÄcÈ#ÃhÐPTÔU؈
r(c ó&—ddlm}m}ddlm} d|_|xsdj
«}
|} |
r|
›d|›�} tjdd«j«d v} tjd
d«j«d v}
ttjd d ««}t|jxr|jj«}|
r|sd
} | r�|jr‘|jr…|jj| |j ¬«}|r\|d|k\rT|dj"xsdj
«r3|\}}|j%||||||||¬«}|j&|f|_|S|j�r|j�r |jj)| |j*|j ¬«}|rÜdj-t/|«D��cgc]'\}}d|dz›d|j0›d|j"›�‘Œ)c}}«}d|›d|›�}t2j5dt7|«|D�cgc]}|j&‘Œc}|D�cgc]D}t7|j0xsd«dkDr|j0xsddddzn|j0xsd‘ŒFc}«|}|dk(rd}d}|
2026-04-14 10:28:22 +08:00
rd|
›d�}||j=|||¬«z}|dk(r|d z
}|r|d!|›�z
2026-04-14 10:28:22 +08:00
}d"|d#œd$|d#œg}|j?||¬%«}d&|vrH||jAd&«d'z|jAd(|jAd&«d'z«j
«}nKd(|vrG||jAd(«d)z|jAd(|jAd(«d)z«j
«}| ||«}d*}t7|«|kr|n|d|d+z}t2j5d,t7|«|«|Scc}}wcc}wcc}w#t8$r#}t2j;d|›�«Yd}~�Œnd}~wwxYw)-u7
SQL生�(SQL Generator Agent)
2026-04-16 10:53:10 +08:00
Args:
question: 用户问题
schema_str: Schema�述字符串
dialect: SQL方言
validation_feedback: �空时附加到用户�示(�试时传入上次校验错误)
dialog_context: �几轮对�摘�;与 ``question`` 一并供指代消解与续问。
sql_stream_callback: 若�供且 LLM 支� chat_stream,则在 SQL 主生�/黄金适�时��回传原始文本分片。
Returns:
SQL语�
r)ÚSQL_GENERATOR_SYSTEMÚSQL_GENERATOR_USERrÎNrAu
2026-04-14 10:28:22 +08:00
ã€�当å‰�问】ÚFEWSHOT_GOLDEN_REUSEr>r<ÚFEWSHOT_GOLDEN_ONLY_CHROMAÚFEWSHOT_GOLDEN_MIN_SCOREz0.88F)Ú
min_ratingr)rVrÆrÇrÈrÉrÊrUr¸)rVrir÷rÔu示例 u
:
问题:u
SQL:
u/�考以下相似示例的SQL编写风格:
u
2026-04-14 10:28:22 +08:00
�当�Schema】
u?已注入 %s 个 few-shot 示例: qid=%s question_zh_preview=%rr[rluFew-shot检索失败: rÒrÓu–ã€�对è¯�上文】(用于ç�†è§£ã€Œè¿™/é‚£/å�Œæ ·/上é�¢/刚æ‰�ã€�等指代å�Šç»­é—®æ�¡ä»¶ï¼›è¯·ç»“å�ˆä¸‹æ–‡ã€Œå½“å‰�用户问题ã€�生æˆ� SQL。)
)r×rVrÇrØuµ
�上次校验未通过】请根�下列错误修正 SQL,并输出完整�执行查询;表��列�必须与「当�Schema�中完全一致,��臆造字段�。
2026-04-16 10:53:10 +08:00
rÙrÚrÜr·rÝrÞrßràrárâu生æˆ�çš„SQL(chars=%s):
%s)!rãròrórärÏrNrIrFrGrHrzr"rEÚis_chroma_backendr3Úselect_best_with_scorer6rrðrçÚselectr5rŽÚ enumeraterærJrKr\rLrMrårÅrè)rOrVrÆrÇrÊrUr¸ròrórÏr^Úfewshot_questionÚ golden_reuseÚ only_chromaÚ
golden_minÚ chroma_okÚbestÚexÚscÚsql_outÚexamplesÚiÚexamples_promptrSrërìrír¹rrîrïs r)Ú
_generate_sqlz"Text2SQLOrchestrator._generate_sqlÅs·€÷0 LÝ>à$(ˆÔ!ØÒ" ×
2026-04-14 10:28:22 +08:00
)Ñ
)Ó
+ˆØ#ÐÙ
2026-04-14 10:28:22 +08:00
Ø"$ Ð%8¸¸
ÐCÐ ä—y‘yÐ!7¸Ó@×FÑFÓHðM
2026-04-14 10:28:22 +08:00
ð
ˆ ô
—i‘iÐ <¸fÓE×KÑKÓMðR
ð
ˆ ô
œ2Ÿ9™9Ð%?ÀÓHÓIˆ
ÜØ × !Ñ !Ò M d×&;Ñ&;×&MÑ&Mó
ˆ ñ ™yØ ˆLñ
2026-04-14 10:28:22 +08:00
Ø×$Ò$Ø×%Ò%à×(Ñ(×?Ñ?Ø Ø×2Ñ2ð@óˆDñ
ؘ‘G˜zÒ)ؘ!‘W—[‘[Ò& B×-Ñ-Ô/à‘��BØ×9Ñ9Ø%Ø)Ø#ØØ!#Ø(;Ø#1Ø(;ð:ó �ð.0¯V©V°R¨L�Ô)Ø�ð × Ó  D×$9Ó$9ð
2026-04-14 10:28:22 +08:00
=Ø×0Ñ0×7Ñ7Ø-Ø×,Ñ,Ø#×6Ñ6ð8ó�ñ
Ø&,§k¡kä%.¨xÔ%8ô3á%8™E˜A˜rð" ! A¡#  n°R·^±^Ð4DÀJÈrÏvÉvÈhÒWØ%8ò3ó'�Oð$UÐUdÐTeÐe}ðIð~Jð"K�JÜ—K‘KØYܘH›
Ù*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ô ð ˆ
2026-04-16 10:53:10 +08:00
Ø �fÒ Ø:ˆMàˆÙ
ðLà�$�dðð
ð Ð 2× 9Ñ 9ØØØ!ð!:ó!
2026-04-14 10:28:22 +08:00
ñ
2026-04-16 10:53:10 +08:00
ˆ ð
�fÒ Ø ðBñ
ˆLñ Ø ðià&Ð'ð)ñ
ˆLðÐ*>Ñ ?ب Ñ 5ð
ˆð ×,Ñ,Ø Ð*=ð-ó
ˆð
�s‰?Ø�c—h‘h˜xÓ(¨1Ñ,¨S¯X©X°e¸S¿X¹XÀhÓ=OÐRSÑ=SÓ-TÐU×[Ñ[Ó]‰CØ
�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؈
ùóQ3ùò4ùòQøäò
2026-04-14 10:28:22 +08:00
=Ü—‘Ð!7¸°sÐ;×<Ò<ûð
2026-04-16 10:53:10 +08:00
=úsDÆ
A
2026-04-14 10:28:22 +08:00
O$Ç,O
È.O$È4O ÉO$É
A OÊO$ÏO$Ï$ PÏ-P Ð Prc óx—g}g}d}d} ddlm}
m} |
||¬«\} }
| s|j|
«| ||j|¬«\}}|s|j|«ddlm}m}||«\}}|s|j|«|dk(r||«\}}|s|j|«t|«dk(rGddl m
}||«\}}|dk(rd }|r|d
2026-04-16 10:53:10 +08:00
|›�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)
2026-04-14 10:28:22 +08:00
Args:
sql: SQL语�
schema_str: Schema�述
dialect: 与生�一致的 SQL 方言(sqlglot �,默认 tsql)
question: 用户自然语言(探针为 0 时用于生�补充说明)
dialog_context: 会�上文;探针 0 时与 question 一并传入说明模型
2026-04-14 10:28:22 +08:00
Returns:
(是�通过, 错误列表, 警告列表, 库执行探针状�, 无数�时的用户说明)
探针:``1`` 至少一行数�;``0`` 执行�功但行数为 0;``-1`` 执行失败;``None`` 未�置库或未跑探针
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
æ•°æ�®åº“返回:u7未é…�ç½® database_url,已跳过数æ�®åº“执行探针)rrr)rr×rzunknown_table:zunknown_column:rTrÚ suggestionsu优化建议:u/LLM验è¯�失败(é™�级为仅程åº�验è¯�): u½ã€�库探针结果:0 行】该 SQL 已在数æ�®åº“æˆ�功执行,但**返回数æ�®è¡Œæ•°ä¸º 0**(未查到匹é…�记录)。下方已附带完整 SQL 与原因分æž�,请一并阅读。rArZ)rVrr×u
�问题分�】
u无数�说明生�失败: u{