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

277 lines
27 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
y®ÜižjãóÊ—dZddlZddlZddlmZmZmZmZddlm Z m
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©óúCC:\Users\24019\Desktop\backman-camel\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*dedeedeedeededed e d
e d eed ed
ede fd„Z
de fd„Z d+dedede
efd„Z d,dede
ededee
eeffd„ZdZdede fd„Z d,dede
edede
efd„Zde
ede
efd„Z d-dededed eedef
d!„Z d.d"ededededee e
ee
eeeeeff
d#„Z d/deded$ed%e def
d&„Zd0d'e de fd(„Zdefd)„Zy)1ÚText2SQLOrchestratoruã
Text2SQL 多智能体编排器
工作�程:
1. 粗筛候选表
2. Schema Linker:LLM 精筛表
3. 外键扩展 → 拼 Schema �集
4. SQL Generator:生� SQL
5. Validator:验� SQL
NÚschema_managerÚdeepseek_api_keyÚdeepseek_configÚembedding_model_pathÚvector_db_pathÚ max_retryÚuse_vector_searchÚfewshot_enabledÚfewshot_samples_pathÚ
fewshot_top_kÚfewshot_min_ratingÚtranslate_english_to_zhc
ó¨—||_||_||_| |_|rt |«|_nt t
|¬««|_d|_||_||_ ||_
|
|_ | |_ d|_
|jrR | xstjdd«}
t!|
|j¬«|_
t"j%d|
›d| ›�«t"j%d |›d |›�|jrd
ndz|jr dz«ydz«y#t&$r*}t"j)d|›d �«d
|_
Yd}~Œsd}~wwxYw)um
�始化编排器
Args:
schema_manager: Schema管�器实例
deepseek_api_key: DeepSeek API密钥(也�通过环境��DEEPSEEK_API_KEY)
deepseek_config: DeepSeek�置对象(优先于api_key)
embedding_model_path: Qwen3-Embedding模型路径
vector_db_path: ��数�库路径
max_retry: 最大�试次数(包�首次生�)
use_vector_search: 是�使用��检索粗筛
translate_english_to_zh: 无中日韩字符的英文问�是�先译为中文�走检索与生�
)Úapi_keyNÚFEWSHOT_DATA_PATHz$./data/experiences/all_samples.jsonl)r-uFew-shotå·²å�¯ç”¨: top_k=z
, min_rating=uFew-shot加载失败: u,将使用标准生æˆ�Fu4[OK] Text2SQLOrchestratoråˆ�始化完æˆ�: max_retry=z, use_vector_search=z , fewshot=onÚu , en→zh=onu
, en→zh=off)r*r/r0r5r Údeepseekr Ú
_vector_indexÚ_vector_db_pathÚ_embedding_model_pathr1r3r4Úfewshot_selectorÚosÚgetenvr
ÚloggerÚinfoÚ ExceptionÚwarning)Úselfr*r+r,r-r.r/r0r1r2r3r4r5ÚpathÚes r'Ú__init__zText2SQLOrchestrator.__init__,s�€ð:-ˆÔØ"ˆŒØ!2ˆÔØ'>ˆÔ$ñ Ü*¨?Ó;ˆD�Mä*ÜÐ'7Ô8óˆDŒMð
7;ˆÔØ-ˆÔØ%9ˆÔ"ð /ˆÔØ*ˆÔØ"4ˆÔØ $ˆÔà × Ò ð
-Ø+ò¬r¯y©yØ'Ø:ó0�ô)8ØØ)-×)CÑ)Cô)�Ô%ô— ‘ Ø/°
¨ð?"Ø"4Ð!5ð7ôô � ‰ ðØ"˜ Ð#7Ð8IÐ7Jð
Là"&×"6Ò"6‘¸Bñ
@ð"&×!=Ò!=ˆ~ñ
Tõ
ðDSñ
Tõ
øô ò
-Ü—‘Ð!7¸°sÐ:RÐSÔTØ',�×$Ñ$ûð
-úsÂADÄ EÄ' E Å EÚreturncóš—|j€4ddlm}||j«}t ||j
¬«|_|jS)u*获å�–或创建å�‘é‡�索引(懒加载)r)Ú get_embedder)ÚembedderÚ persist_dir)r;Úutils.embeddingrKr=r
r<)rErKrLs r'Ú_get_vector_indexz&Text2SQLOrchestrator._get_vector_indexzsH€à × Ñ Ð %Ý 4á# D×$>Ñ$>Ó?ˆHÜ!.Ø!Ø ×0Ñ0ô"ˆDÔ ð×!Ñ!Ð!r&ÚquestionÚtop_kcó¢—|js|jj«S|j«}|j «dk(r2t
j
d«|j|jd¬«|j||d¬«}|D�cgc]}|d‘Œ }}t
jd|d d
›d t|«›d �«|Scc}w)
uÁ
阶段1:粗筛(��检索)
Args:
question: 用户问题
top_k: 返回�K个候选表
Returns:
候选表�列表
ru$å�‘é‡�索引为空,正在构建...T©Ú
force_rebuildgš™™™™™¹?)ÚqueryrQÚscore_thresholdÚ
table_nameu粗筛候选表:Né
u ...(共u个)) r0r*Ú list_tablesrOÚcountrArBÚ build_indexÚsearchÚdebugÚlen)rErPrQÚindexerÚresultsÚrÚcandidate_tabless r'Ú_coarse_filterz#Text2SQLOrchestrator._coarse_filter†s×€ð×%Ò%à×&Ñ&×2Ñ2Ó4Ð 4à×(Ñ(Ó*ˆð �=‰=‹?˜aÒ Ü �K‰KÐ>Ô ?Ø × Ñ  × 3Ñ 3À4Ð Ô Hð—.‘.ØØØð!ó
ˆñ 6=Ó=±W°˜A˜l›O°WÐÐ=Ü� ‰ Ð)Ð*:¸3¸BÐ*?Ð)@À Ì#ÐN^ÓJ_ÐI`Ð`fÐgÔhØÐùò>s C rbÚ
max_tablescó„—g}|D]G}|jj|«}|sŒ!|jxsd}|jd|›d|›�«ŒIdj |«}|j
j
||¬«} | jdg«}
| jdd«} |
d |}
tjd
|
›�«|
| fS) u

阶段2:LLM精筛(Schema Linker Agent)
Args:
question: 用户问题
candidate_tables: 候选表列表
max_tables: 最多选择的表数
Returns:
(相关表列表, 推��由)
u æ— æ��è¿°ú- z: Ú
)rPÚ
table_listÚrelevant_tablesrr9NuLLM精筛选中表:)
r*Ú get_tableÚcommentÚappendÚjoinr:Ú
select_tablesÚgetrArB) rErPrbrdÚ table_infosÚtbl_nameÚtablerkÚtable_list_strÚresponserirs 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Ð+<Ð=Ô>Ø  Ð)Ð)r&)u 对手方u ç»�纪商u券商u å°�手方cól‡—‰sytˆfd„|jD««ryd‰j«vS)NFc3ó&•K—|]}|‰v–—Œ
y­w)Nr%)Ú.0ÚkrPs €r'Ú <genexpr>zJText2SQLOrchestrator._question_implies_broker_dimension.<locals>.<genexpr>Úsøèø€Ð?Ñ&> ˆq�HŒ}Ñ&>ùsƒTÚbroker)r$Ú_BROKER_KEYWORDS_CNÚlower)rErPs `r'Ú"_question_implies_broker_dimensionz7Text2SQLOrchestrator._question_implies_broker_dimension×s2ø€ÙØÜ Ó? d×&>Ò&>Ó?Ô ?ØØ˜8Ÿ>™>Ó+Ð+Ð+r&ricó—|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*rjÚsetrlÚaddr^rArB) rErPrirdÚpriorityÚtÚpresentÚseenÚmergeds r'Ú_prioritize_broker_tablesz.Text2SQLOrchestrator._prioritize_broker_tablesÞs€ð×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�Œ
t|«}t|«t|«kDrt jd|›d|›�«|S)u®
外键扩展:自动添加关�表
Args:
table_names: 已选中的表�列表
Returns:
扩展�的表�列表
u外键扩展:添加关�表 u外键扩展:添加引用表 u外键扩展:u → )
r‚r*rjÚ foreign_keysÚ ref_tablerƒrAr]Ú
get_tablesÚnamer!r^rB)rErŠÚresultrqrrÚfkÚotherÚexpandeds r'Ú_expand_relationsz&Text2SQLOrchestrator._expand_relationsüs€ô�[Ó!ˆä#ˆ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}|j
rÒ|j rÆ |j j||j|j¬«}|r‘djt|«D� �
cgc]'\} }
d| dz›d|
j›d |
j›�‘Œ)c}
} «} d
| ›d |›�}tjd t!|«›d
|D�
cgc]}
|
j"‘Œc}
›�«|}
|dk(rd}
|j)|||
¬«}|dk(r|dz
}|r|d|›�z
}d|dœd|dœg}|j*j-|dd¬«}|j.j1«}d|vrH||j3d«dz|j3d|j3d«dz«j1«}nKd|vrG||j3d«dz|j3d|j3d«dz«j1«}|||«}tjd|dd ›d!�«|Scc}
} wcc}
w#t$$r#} tj'd| ›�«Yd} ~ �Œcd} ~ wwxYw)"uB
SQL生�(SQL Generator Agent)
Args:
question: 用户问题
schema_str: Schema�述字符串
dialect: SQL方言
validation_feedback: �空时附加到用户�示(�试时传入上次校验错误)
Returns:
SQL语�
r)ÚSQL_GENERATOR_SYSTEMÚSQL_GENERATOR_USER)Únormalize_sql_for_dialect)rPrQÚ
min_ratingz
u示例 ru
:
问题:u
SQL:
u/�考以下相似示例的SQL编写风格:
u
�当�Schema】
u
已注入 u 个few-shot示例: uFew-shot检索失败: NÚtsqlzMicrosoft SQL Server (T-SQL))ÚschemarPr–u 
�硬性�求】目标库为 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)ÚroleÚcontentÚuserggð?)Ú temperatureÚtop_pz```sqléz```éu生æˆ�çš„SQL:éÈú...)Úconfig.promptsr™ršÚutils.sql_parserr›r1r>Úselectr3r4rmÚ enumerateÚ question_zhrrAr]r^ÚqidrCrDÚformatr:Úchatr¡ÚstripÚfind)rErPr•r–r—r™ršr›ÚexamplesÚiÚexÚexamples_promptrGÚ
dialect_labelÚ user_contentÚmessagesrtrs r'Ú
_generate_sqlz"Text2SQLOrchestrator._generate_sql s¦€÷& LÝ>ð × Ò  D×$9Ò$9ð
=Ø×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Ü—L‘L :¬c°(«m¨_Ð<PÑckÓQlÑckÐ]_ÐRT×RXÓRXÐckÑQlÐPmÐ!nÔoð ˆ
Ø �fÒ Ø:ˆMà)×0Ñ0ØØØ!ð1ó
ˆ ð
�fÒ Ø ðBñ
ˆ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Ø
�c‰\Ø�c—h‘h˜u“o¨Ñ)¨#¯(©(°5¸#¿(¹(À5»/ÈAÑ:MÓ*NÐO×UÑUÓWˆCá'¨¨WÓ5ˆä� ‰ � s¨4¨C y k°Ð5Ô6؈
ùóq3ùò
RmøÜò
=Ü—‘Ð!7¸°sÐ;×<Ò<ûð
=ús6¨A
H)Á5,H
Â!0H)ÃH$Ã$ H)È H)È) IÈ2IÉIrcóD—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
|›�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(r6t|«dk(r(d} |jj/|||¬«}|›d|›�}t|«dk(}|||||fScc}w#t*$r"}t&j-d|›�«Yd}~Œ{d}~wwxYw#t*$r'}t&j-d|›�«|›d�}Yd}~Œsd}~wwxYw)uT
SQL验�(程�验� + 库探针 + 按探针分支的 LLM)
Args:
sql: SQL语�
schema_str: Schema�述
dialect: 与生�一致的 SQL 方言(sqlglot �,默认 tsql)
question: 用户自然语言(探针为 0 时用于生�补充说明)
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éÿÿÿÿunæ•°æ�®åº“执行验è¯�失败:SQL 在目标库执行报错(探针状æ€� -1),将æ�®æ­¤é‡�新生æˆ� SQL。u æ•°æ�®åº“返回:u7未é…�ç½® database_url,已跳过数æ�®åº“执行探针)rÂrr)rržrzunknown_table:zunknown_column:rTrÚ suggestionsu优化建议:u/LLM验è¯�失败(é™�级为仅程åº�验è¯�): uÉ该 SQL 已在数æ�®åº“æˆ�功执行,但返回的数æ�®è¡Œæ•°ä¸º 0(未查到匹é…�记录)。请将下方 SQL 与说明一并核对;若ä¸�符å�ˆé¢„期,请补充或调整æ�¡ä»¶å�Žå†�次æ��问。)rPrržu
�分�与建议】
u无数�说明生�失败: u~
�分�与建议】
未能自动生æˆ�详细分æž�。请补充时间范围ã€�筛选æ�¡ä»¶æˆ–业务对象å�Žé‡�æ–°æ��问。)rªr¼r½Úextendr*Úutils.validatorsr¿rÀr^Údb.dbhub_toolsrÁrlr:Ú validate_sqlr!roÚ
isinstancerÚ
startswithrAr]rCrDÚempty_result_user_feedback) rErr•r–rPrrÚdb_execution_statusÚempty_feedbackr¼r½Ú syntax_okÚ
syntax_errorsÚ schema_okÚ
schema_errorsr¿rÀÚ danger_okÚ
danger_errorsÚcjk_okÚ
cjk_errorsrÁÚ db_probe_errÚmsgÚskip_validator_llmÚ
llm_resultÚ
llm_errorsrGrÃÚprefixÚllm_fbÚis_valids r'Ú
_validate_sqlz"Text2SQLOrchestrator._validate_sqlysú€ð(ˆØˆØ-1ÐØ(,ˆ÷ Vñ$7°sÀGÔ#LÑ ˆ �=ÙØ �M‰M˜-Ô (ñ$?Ø �×$Ñ$¨gô$
Ñ ˆ �=ñØ �M‰M˜-Ô (÷ eÙ#=¸cÓ#BÑ ˆ �=ÙØ �M‰M˜-Ô (ð �fÒ Ù!DÀSÓ!IÑ ˆF�JÙØ—
‘
˜jÔ)ô ˆv‹;˜!Ò Ý Dá0MÈcÓ0RÑ -Ð  Ø" bÒ(ð3ðñ ØÐ0°°Ð?Ñ?�CØ—
‘
˜cÕ"Ø$Ð,Ø—‘ØMôð1°JÐ>Ðñ"ð
VØ!Ÿ]™]×7Ñ7¸CÈ
Ð7ÓS�
ä! *§.¡.°¸2Ó">Ó?�
áñ",ó"á!+˜AÜ% a¬Ô-àŸL™LÐ)9Ô:Ø Ÿ|™|Ð,=Ô>ò Ø!+ðð"ð"—~‘~ g¨tÔ4Ø—M‘M *Ô-à—‘ 
§¡¨z¸2Ó >Ô?Ø(Ÿn™n¨]¸BÓ?� ÙÜ—L‘L ?°;°-Ð!@ÔAð  !Ò #¬¨F« °qÒ(8ð{ð
ð
ØŸ™×AÑAØ%ØØ%ðBó�ð
%+ 8Ð+FÀvÀhÐ!O�ô�v“; !Ñ#ˆØ˜ Ð+>ÀÐNÐNùòU"øô$ò
VÜ—‘Ð!PÐQRÐPSÐT×UÑUûð
Vûô ò
Ü—‘Ð!>¸q¸cÐBÔCà�hð}ð}õûð
úsCÄ>IÄ?;H<Å:A2IÈ%I/È<IÉ I,É
I'É'I,É/ JÉ8JÊJÚtop_k_candidatesÚinclude_schema_in_resultc
óà—ddlm}|xsdj«}i}|}|jr�||«rˆ |jj |«j«} | rGt
| «dk\r9| }||d<| |d<tjd| dd t