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

232 lines
22 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
±ØiMãóÊ—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©óúPC:\Users\24019\Desktop\backman-camel\text2sql_agent_camel\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
efd„Z
de fd„Z d)dedede
efd„Z d*dede
ededee
eeffd„ZdZdede fd„Z d*dede
edede
efd„Zde
ede
efd„Z d+dedededefd„Z d+d edededee e
ee
effd!„Z d,deded"ed#e def
d$„Zd-d%e de fd&„Zdefd'„Zy).ÚText2SQLOrchestratoru
Text2SQL 多智能体编排器
工作�程:
1. Schema Linker:粗筛 + LLM精筛,选出相关表
2. 外键扩展:自动包�关�表
3. SQL Generator:生�SQL
4. Validator:验�SQL,�通过则�试(最多max_retry次)
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_ratingc óx—||_||_||_|rt|«|_ntt |¬««|_d|_||_||_||_ |
|_
| |_ d|_ |jrR | xstjdd«} t| |j¬«|_ t j#d|
›d| ›�«t j#d |›d |›�|jr d
z«ydz«y#t$$r*}
t j'd|
›d �«d
|_ Yd}
~
Œbd}
~
wwxYw)uü
�始化编排器
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: 是�使用��检索粗筛
)Ú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Ú)r*r/r0r Údeepseekr Ú
_vector_indexÚ_vector_db_pathÚ_embedding_model_pathr1r3r4Úfewshot_selectorÚosÚgetenvr
ÚloggerÚinfoÚ ExceptionÚwarning)Úselfr*r+r,r-r.r/r0r1r2r3r4ÚpathÚes r'Ú__init__zText2SQLOrchestrator.__init__+sb€ð6-ˆÔØ"ˆŒØ!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�ñ
@õ
ð=?ñ
@õ
øô ò
-Ü—‘Ð!7¸°sÐ:RÐSÔTØ',�×$Ñ$ûð
-úsÂADÄ D9Ä D4Ä4D9Úreturncóš—|j€4ddlm}||j«}t ||j
¬«|_|jS)u*获å�–或创建å�‘é‡�索引(懒加载)r)Ú get_embedder)ÚembedderÚ persist_dir)r:Úutils.embeddingrJr<r
r;)rDrJrKs r'Ú_get_vector_indexz&Text2SQLOrchestrator._get_vector_indexusH€à × Ñ Ð %Ý 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š™™™™™¹?)ÚqueryrPÚscore_thresholdÚ
table_nameu粗筛候选表:Né
u ...(共u个)) r0r*Ú list_tablesrNÚcountr@rAÚ build_indexÚsearchÚdebugÚlen)rDrOrPÚ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 raÚ
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- z: Ú
)rOÚ
table_listÚrelevant_tablesrr8NuLLM精筛选中表:)
r*Ú get_tableÚcommentÚappendÚjoinr9Ú
select_tablesÚgetr@rA) rDrOrarcÚ table_infosÚtbl_nameÚtableriÚtable_list_strÚresponsergrs 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ÚkrOs €r'Ú <genexpr>zJText2SQLOrchestrator._question_implies_broker_dimension.<locals>.<genexpr>Õsøèø€Ð?Ñ&> ˆq�HŒ}Ñ&>ùsƒTÚbroker)r$Ú_BROKER_KEYWORDS_CNÚlower)rDrOs `r'Ú"_question_implies_broker_dimensionz7Text2SQLOrchestrator._question_implies_broker_dimensionÒs2ø€ÙØÜ Ó? d×&>Ò&>Ó?Ô ?ØØ˜8Ÿ>™>Ó+Ð+Ð+r&rgcó—|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*rhÚsetrjÚaddr]r@rA) rDrOrgrcÚ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*rhÚ foreign_keysÚ ref_tabler�r@r\Ú
get_tablesÚnamer!r]rA)rDrˆÚresultrorpÚ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Údialectc ó–—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
}
d|dœd|
dœg}|j*j-|«}|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} ~ �ŒVd} ~ wwxYw)uÛ
SQL生�(SQL Generator Agent)
Args:
question: 用户问题
schema_str: Schema�述字符串
dialect: SQL方言
Returns:
SQL语�
r)ÚSQL_GENERATOR_SYSTEMÚSQL_GENERATOR_USER)Únormalize_sql_for_dialect)rOrPÚ
min_ratingz
u示例 ru
:
问题:u
SQL:
u/�考以下相似示例的SQL编写风格:
u
�当�Schema】
u
已注入 u 个few-shot示例: uFew-shot检索失败: NÚtsqlzMicrosoft SQL Server (T-SQL))ÚschemarOr”uC
ã€�硬性è¦�求】目标库为 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 英文别å��。Úsystem)ÚroleÚcontentÚuserz```sqléz```éu生æˆ�çš„SQL:éÈú...)Úconfig.promptsr–r—Úutils.sql_parserr˜r1r=Úselectr3r4rkÚ enumerateÚ question_zhrr@r\r]ÚqidrBrCÚformatr9ÚchatržÚstripÚfind)rDrOr“r”r–r—r˜ÚexamplesÚiÚexÚexamples_promptrFÚ
dialect_labelÚ user_contentÚmessagesrrrs r'Ú
_generate_sqlz"Text2SQLOrchestrator._generate_sqls€÷" 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Ò Ø ðMñ
ˆLðÐ*>Ñ ?ب Ñ 5ð
ˆð
—=‘=×%Ñ% hÓ/ˆØ×Ñ×$Ñ$Ó&ˆð �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؈
ùó]3ùò
RmøÜò
=Ü—‘Ð!7¸°sÐ;×<Ò<ûð
=ús6¨A
HÁ5,H
Â!0HÃHÃ$ HÈ HÈ IÈ%IÉIrcó\—g}g}ddlm}m}|||¬«\}} |s|j| «|||j|¬«\}
} |
s|j| «ddlm} | |«\}
}|
s|j|« |jj||¬«}t|jdg««}|
rA|D�cgc]6}t|t«r$|jd«s|jd«s|‘Œ8}}|jd d
«s|j|«|j|jd g««|jd g«}|rtjd
|›�«t%|«dk(}|||fScc}w#t $r"}tj#d|›�«Yd}~Œ>d}~wwxYw)u)
SQL验�(Validator Agent + 程�验�)
Args:
sql: SQL语�
schema_str: Schema�述
dialect: 与生�一致的 SQL 方言(sqlglot �,默认 tsql)
Returns:
(是�通过, 错误列表, 警告列表)
r)Úvalidate_sql_syntaxÚvalidate_schema_consistency©r”)Úcheck_dangerous_operations)rr›rzunknown_table:zunknown_column:rTrÚ suggestionsu优化建议:u/LLM验è¯�失败(é™�级为仅程åº�验è¯�): N)r¥r·r¸Úextendr*Úutils.validatorsrºr9Ú validate_sqlr!rmÚ
isinstancerÚ
startswithr@r\rBrCr])rDrr“r”rrr·r¸Ú syntax_okÚ
syntax_errorsÚ schema_okÚ
schema_errorsrºÚ danger_okÚ
danger_errorsÚ
llm_resultÚ
llm_errorsrFr»Úis_valids r'Ú
_validate_sqlz"Text2SQLOrchestrator._validate_sqlhs¬€ð"ˆØˆ÷ Vñ$7°sÀGÔ#LÑ ˆ �=ÙØ �M‰M˜-Ô (ñ$?Ø �×$Ñ$¨gô$
Ñ ˆ �=ñØ �M‰M˜-Ô (õ @Ù#=¸cÓ#BÑ ˆ �=ÙØ �M‰M˜-Ô (ð RØŸ™×3Ñ3¸ÀJÐ3ÓOˆJä˜jŸn™n¨X°rÓ:Ó;ˆJáñ(óá'˜Ü! !¤SÔ)àŸ ™ Ð%5Ô6ØŸ<™<Ð(9Ô:ò Ø'ððð—>‘> '¨4Ô0Ø—
‘
˜jÔ)à �O‰O˜JŸN™N¨:°rÓ:Ô ;Ø$Ÿ.™.¨¸Ó;ˆKÙÜ— ‘ ˜¨{¨mÐ<Ô=ô
�v“; !Ñ#ˆØ˜ Ð)Ð)ùò-øô$ò RÜ �N‰NÐLÈQÈCÐP× QÑ Qûð Rús+Á=>FÂ;;E;Ã6A2FÅ;FÆ F+Æ F&Æ&F+Útop_k_candidatesÚinclude_schema_in_resultc
ó—tjd|dd›d�«d}d}g}d}g} ||jk�rttjd|dz›�«|dk(r‡|j||¬ «}
|j ||
«\} } |j || «} |j
| «}