
    mi                        S r SSKrSSKrSSKrSSKrSSKJrJrJ	r	J
r
  SSKrSSKJrJr  SSKJr  SSKJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr   SSKJr  SSKJ r   Sr! SSK$J%r%  SSK&J'r'  Sr( SSK)J*r*  Sr+\RX                  " \-5      r. " S S5      r/g! \" a    Sr!\RF                  " S5         NQf = f! \" a    Sr(\RF                  " S5         Nbf = f! \" a    Sr+\RF                  " S5         Nyf = f)z4Pipeline manager for coordinating the entire system.    N)DictAnyOptionalList)	LLMClientPromptTemplate)PreferenceParser)build_user_vectorscore_patterns)CoLocationMiner)MemoryStore)PreferenceLearner)PatternEmbedder)IntentEncoder)IntentMapperTFz4Stage0 intent understanding components not available)PreferenceEncoder)PreferenceTrainerzGStage3 contrastive learning components not available (PyTorch required))IterationManagerz5Stage4 iterative interaction components not availablec            	       d   \ rS rSrSrS S\4S jjrS\S\4S jrS!S	\S
\	\
   S\\\4   4S jjr S!S\\\4   S\S\S\4S jjrS\4S jrS rS\\\4   4S jrS\S\\\4   4S jrS\
S\
S\\\4   4S jrS\S
\
S\\\4   4S jrS\S\\\\   4   S\\\4   4S jrS\S\\\4   4S jrSrg)"PipelineManager1   z-Manager for coordinating the entire pipeline.config_pathc                    [        USSS9 n[        R                  " U5      U l        SSS5        [        R                  S5        [        U5      U l        [        U R                  R                  S0 5      S9U l
        [        U R                  S   S	   S
SS9U l        U R                  R                  S0 5      nUR                  SS5      =(       a    [        U l        UR                  SS5      U l        UR                  SS5      U l        [#        5       U l        U R                  (       a  U R                  OSn['        UU R                  R                  S0 5      R                  SS5      S9U l        [+        5       U l        SU l        SU l        U R                  (       a   [3        U R                  R4                  R7                  5       5      n[9        U R                  US9U l        [;        U R,                  5      U l        [        R                  S[=        U5       S35        U R                  R                  S0 5      nUR                  SS5      U l!        UR                  SS5      =(       a    [D        U l#        UR                  SS5      U l$        UR                  SS5      U l%        UR                  SS 5      U l&        UR                  S!S"5      U l'        UR                  S#S$5      U l(        S%U l)        0 U l*        U R                  R                  S&0 5      nUR                  SS5      =(       a    [V        U l,        UR                  S'S(5      U l-        UR                  S)S*5      U l.        UR                  S+S5      U l/        SU l0        U RX                  (       a   [c        U R                  U R(                  U R$                  U R,                  U R                  U R.                  U R0                  U R^                  S,9U l0        [        R                  S-U RZ                   S.U R\                   S/35        SU l2        SU l3        U RF                  (       Ga   U R,                  Rh                  Rk                  5       n	UR                  S1S25      n
[l        Rn                  Rq                  U RP                  5      (       a  [s        U	U
S39U l2        [u        U R$                  U R,                  U Rd                  UR                  S4S55      UR                  S6S75      UR                  S8S5      U RN                  S99U l3        U Rf                  Rw                  U RP                  5        [        R                  S:U RP                   35        Oz[u        U R$                  U R,                  SU	U
UR                  S4S55      UR                  S6S75      UR                  S8S5      U RN                  S;9	U l3        [        R                  S<5         [        R                  S>U R                   S?U RB                   S@U RF                   SAU RX                   S/3	5        g! , (       d  f       GN= f! [>         a)  n[        RA                  SU 3SS9  SU l         SnAGNXSnAff = f! [>         a)  n[        RA                  S0U 3SS9  SU l,         SnAGNSnAff = f! [>         a/  n[        RA                  S=U 3SS9  SU l#        SU l3         SnANSnAff = f)BzPInitialize pipeline manager.

Args:
    config_path: Path to configuration file
rutf-8encodingNz#Initializing pipeline components...mining)default_paramsdata	data_pathg      0@T)r!   distance_thresholduse_gpustage0enableddecay_lambdag?min_confidenceg333333?stage3use_preference_weightedF)r&   r)   )available_poi_typesz9Stage0: Intent understanding components initialized with z
 POI typesz0Stage0: Failed to initialize intent components: exc_infouse_contrastiveretrain_interval   alphagffffff?user_iduser_001model_save_pathz./models/preference_encoder.pthr   stage4default_rounds   
max_rounds   fusion_alpha)minerlearnermemoryembedder
llm_clientintent_encoderintent_mapperr9   z5Stage4: IterationManager initialized (default_rounds=z, max_rounds=)z/Stage4: Failed to initialize IterationManager: 
hidden_dim   )	input_dimrB   marging333333?learning_rategMbP?use_cosine_loss)memory_storer=   modelrE   rF   rG   r1   z/Stage3: Loaded trained preference encoder from )	rH   r=   rI   rD   rB   rE   rF   rG   r1   z[Stage3: Trainer initialized (no pre-trained model, will create new model on first training)z3Stage3: Failed to initialize contrastive learning: z3Pipeline initialized successfully (Stage0: enabled=z, Stage3: enabled=z, contrastive=z, Stage4: enabled=)<openyaml	safe_loadconfigloggerinfor   r>   r	   getpreference_parserr   r:   STAGE0_AVAILABLEstage0_enabledstage0_decay_lambdastage0_min_confidencer   r<   r   r;   r   r=   r?   r@   listfeature_countskeysr   r   len	Exceptionwarningstage3_enabledSTAGE3_CONTRASTIVE_AVAILABLEstage3_use_contrastivestage3_use_preference_weightedstage3_retrain_intervalstage3_alphastage3_user_idstage3_model_pathinteraction_countiteration_sessionsSTAGE4_AVAILABLEstage4_enabledstage4_default_roundsstage4_max_roundsstage4_fusion_alphaiteration_managerr   preference_modeltrainerrI    get_sentence_embedding_dimensionospathexistsr   r   
load_model)selfr   fstage0_configr&   r*   estage3_configstage4_configrD   rB   s              E   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/controller/manager.py__init__PipelineManager.__init__4   s0    +sW5..+DK 6 	9:#K0!1;;??8R8"
 %kk&)+6#

 "5+//	4@UEU#0#4#4^T#J %2%6%67G%M" "m373F3Ft//D(%$(KKOOHb$A$E$EF_af$g
 () #!,&*4::+D+D+I+I+K&L#&3DOOYl&m#%1$--%@"WX[\oXpWqq{|} "5+//	4@&3&7&78I5&Q&rVr#.;.?.?@Y[`.a+'4'8'89KR'P$)--gs;+//	:F!.!2!23DFg!h "# #% "5+//	5AVFV%2%6%67G%K"!.!2!2<!C#0#4#4^S#I  "&,)9** LL;;!]]##'#6#6"&"4"4!%!9!9	*& STXTnTnSoo|  ~B  ~T  ~T  }U  UV  W  X !%&&&'$ MM//PPR	*..|SA
 77>>$"8"899,="+#--D) $5%)[[!%"33,003?&3&7&7&O(5(9(9:KT(R $ 3 3$DL LL++D,B,BCKK"QRVRhRhQi jk $5%)[[!%""+#-,003?&3&7&7&O(5(9(9:KT(R $ 3 3
$DL KK }~ 	I$J]J]I^ _&&*&9&9%:.IdIdHe f&&*&9&9%:!= 	>G 65P  ,!QRSQTU`de&+##,T  ,!PQRPST_cd&+##,X  $!TUVTWXcgh.3+#$s]   X;!BY BZ D&Z9 6A9Z9 ;
Y

Z Y;;Z 
Z6Z11Z69
[2%[--[2textreturnc                 6   ^ / SQn[        U4S jU 5       5      $ )zCheck if user query is ambiguous (requires intent understanding).

Args:
    text: User query text
    
Returns:
    True if query is ambiguous, False otherwise
)	u   推荐u   适合u   开店u   选址u   发展u   建议u   应该u   想要u   希望c              3   ,   >#    U  H	  oT;   v   M     g 7fN ).0kr|   s     ry   	<genexpr>/PipelineManager.is_ambiguous.<locals>.<genexpr>   s     /h9hs   )any)rs   r|   keywordss    ` ry   is_ambiguousPipelineManager.is_ambiguous   s     n/h///    N
user_inputiteration_roundsc                    [         R                  SU 35        U R                  (       GaK  U R                  Gb=  Uc  U R                  nOX R
                  :  a  U R
                  n[         R                  SU S35        [        R                  R                  US9n[        R                  nU R                  R                  X4S9nU R                  R                  U5      nU R                  R                  UU R                  UUS9nU R!                  UUS   US	   5      nU =R"                  U-  sl        UUUS   US	   U[%        US   5      [%        US	   5      S
UR'                  S0 5      S
SUS   US   S.$ Sn	Sn
U R(                  (       a  U R+                  U5      (       a  [         R                  S5         U R,                  R/                  U5      nU(       a  U R0                  R3                  U5      nUbN  U R4                  R7                  U R                  X5        S
n	Un
[         R                  SUR8                   S35        O,[         R;                  S5        O[         R;                  S5         [         R                  S5        [        R                  R                  US9n[        R                  nU R                  R                  X4S9n[         RA                  SU 35        [C        SU5        [         R                  S5        U R                  R                  U5      n[         R                  SU 35        [         R                  S5        U RD                  RG                  US   US   US   S9n[         R                  S [%        U5       S!35        [         R                  S"5        UR'                  S#S$5      nU RD                  RI                  XS%9n[         R                  S&[%        U5       S'35        SnSnU RJ                  (       Ga  USS( nU H.  nS)U;  d  M  U RL                  RO                  US*   5      nUUS)'   M0     SnU R(                  (       d  U RJ                  (       aG  U RP                  RS                  UU R                  U R"                  S+9nUb  [         R                  S,5        Uc  U R4                  RU                  U R                  5      nU(       a  [W        UU RL                  RX                  R[                  5       S-9nU R\                  (       aC  U R^                  b6  [a        UUU R^                  U Rb                  S.9n[         R                  S/5        O+[a        UUSU Rb                  S.9n[         R                  S05        Uc  U R(                  (       a  U R4                  Re                  U R                  5      n
U
(       a`  U
R'                  S15      (       aJ  [f        Rh                  " U
S1   5      nU RP                  Rk                  UU5      n[         R                  S25        Ub  [         R                  S35        [m        [o        UU5      S4 S
S59nU VVs/ s H  u  nnUPM
     nnn0 nU H5  u  nnS6Rq                  [m        UR'                  S*/ 5      5      5      nUUU'   M7     UUS(S -   nS
n[         R                  S7[%        U5       S835        O[         R                  S95        [         R                  S:5        U R!                  XnU5      nU =R"                  S;-  sl        UUUUU[%        U5      [%        U5      UUU	U
S<.$ ! [<         a"  n[         R?                  SU 3S
S9   SnAGNSnAff = fs  snnf )=aQ  Process user query through the entire pipeline.

Args:
    user_input: User's natural language query
    iteration_rounds: Optional number of iteration rounds (for Stage4). 
                    If None, uses default from config or single-shot mode.
    
Returns:
    Dictionary containing extracted parameters, patterns, and explanation
zProcessing query: Nz,Stage4: Using iterative interaction mode (K=rA   r   system)queryr1   Kmining_paramsfinal_patternsfinal_rulesTfinal_similarity_scorestotal_roundsiteration_history)r   extracted_parameterspatternsrulesexplanationpattern_count
rule_count	re_rankedsimilarity_scoresintent_usedintent_datar   r   FzDStage0: Detected ambiguous query, performing intent understanding...z8Stage0: Generated initial user vector from intent (dim: z*Stage0: Failed to convert intent to vectorz)Stage0: Failed to parse intent from queryz'Stage0: Error in intent understanding: r+   z1Step 1: Extracting preferences from user input...zLLM response: llm_responsezStep 2: Parsing preferences...zExtracted parameters: z&Step 3: Mining co-location patterns...min_participationmax_pattern_sizepriority)r   r   r   zFound z	 patternsz'Step 4: Generating association rules...r'   g      ?)r'   z
Generated z rulesr/   	embeddingpattern)r1   interaction_roundz?Stage3: Using fused user vector (intent + feedback) for scoring)dim)rI   r0   z4Stage3: Using contrastive learning model for scoringz)Stage3: Using baseline scorer for scoringu_llmz9Stage0: Using intent vector for scoring (no feedback yet)z8Stage3: Re-ranking patterns based on user preferences...c                     U S   $ )N   r   )xs    ry   <lambda>/PipelineManager.process_query.<locals>.<lambda>  s    !A$r   )keyreverse,zStage3: Re-ranked z# patterns based on user preferenceszTStage3: No user vector available (no intent and no feedback), using original rankingz!Step 5: Generating explanation...r   )r   r   r   r   r   r   r   r   r   r   r   )9rN   rO   rg   rk   rh   ri   r   PREFERENCE_EXTRACTION_PROMPTformatSYSTEM_PROMPTr>   generaterQ   parse_preferencerunrb   _generate_explanationrd   rY   rP   rS   r   r?   parser@   	to_vectorr<   save_intentshaper[   rZ   errordebugprintr:   mine_patternsgenerate_rulesr\   r=   encode_patternr;   r   get_user_profiler
   rI   rn   r^   rl   score_with_preferencera   load_intentnparray_score_with_vectorsortedzipjoin)rs   r   r   preference_promptsystem_promptr   paramsiteration_resultr   r   r   intent_jsonr   rv   r   r'   r   r   r   top_patternsr   pattern_vecscoresuser_profileuser_vecrankedp_scorepattern_keys                                 ry   process_queryPipelineManager.process_query   s    	(56 4#9#9#E'#'#=#= !$:$::#'#9#9 KKFGWFXXYZ[ !/ K K R R% !S ! +88M??334E3\L++<<\JF  $5599 ++"$	  :   44 !12 /K ""&66" )(.,-=>)-8*!$%56F%G!H!"2="AB!%5%9%9:SUW%X## 0 @%56I%J & 4#4#4Z#@#@KK^_["1177
C ..88EE(//0C0CUX&*&1&^_d_j_j^kkl$mn'STNN#NO
 	GH*GGNN! O 
 '44//0A/X~l^45n\*45''88F,VH56 	<=::++$%89#$67J' , 

 	fS]O956 	=>$4c:

))()RjUF34 	 #CR=L (g-"&--">">wy?Q"RK+6GK(	 ( F ""d&9&944  //&*&<&< 5 
 %KK ab ~#{{;;D<O<OP04==CVCVCwCwCyzH 22t7L7L7X!6($"&"7"7"&"3"3	" $Z[ "7($"&"&"3"3	" $OP ~$"5"5"kk55d6I6IJ;??7#;#;HH[%9:E!\\<<\5QFKK [\ !VWf-&  /55fdaf5$&! &HAu"%((6!%%	22F+G"HK5:%k2 !' ((23-7 	0\1B0CCfghrs 	78005I 	!# %$* & ]e*"!2&&
 	
{  [FqcJUYZ[R  6s+   7B]	 ]	 ]	 ]8	
]5]00]5r   r   r   c                    / n[        USS S5       HJ  u  pVSSR                  US   5      -   S-   nUR                  U SU S	US
   S SUS   S SUS    S3
5        ML     U(       a  SR                  U5      OSn[        R                  R                  US   US   US   US9n	[        R                  n
U R                  R                  XS9nU$ )zGenerate explanation for mining results.

Args:
    params: Mining parameters
    patterns: Discovered patterns
    
Returns:
    Explanation text
N
   r   {, r   }. u    (参与率: participation_index.3fu   , 置信度: 
confidenceu
   , 大小: sizerA   
u   未发现满足条件的模式r   r   r   )r   r   r   r   r   )		enumerater   appendr   EXPLANATION_GENERATION_PROMPTr   r   r>   r   )rs   r   r   r   pattern_infoir   pattern_strpatterns_textexplanation_promptr   r   s               ry   r   %PipelineManager._generate_explanation  s    #HSbM15JA		')*< ==CK#R}M':O2PQT1U V%l3C8
76?BSSTV 6 4@		,/Ee ,IIPP$%89#$67J'"	 Q 
 '44oo../A.Xr   c           	         U R                   (       d  [        S5        gU R                  (       d  [        S5        gU R                  c  [        S5        gU R                  R                  U R                  5      nU(       d  [        S5        g[        UR                  S/ 5      5      n[        UR                  S/ 5      5      nX#-   nUS	:X  a  [        S
5        gUS	:X  d  US	:X  aV  [        S5        [        SU SU S35        [        S5        [        S5      R                  5       R                  5       nUS:w  a  g[        SS 35        [        S5        [        SU SU SU S35        [        S S35         U R                  R                  S0 5      nUR                  SS5      nU R                  R                  UUR                  SS5      U R                  S9nUS   (       a  US   S    OS!n	US   (       a  US   S	   OS!n
U R                  XGU5        [         R#                  S"U	S# 35        [        SS 35        [        S$5        [        S%U 35        [        S&U
S# 35        [        S'U	S# 35        [        S(X-
  S# 35        [        S)U R                   35        [        S S35        U R                  R$                  U l        g*! [(         a0  n[         R+                  S+U 3S*S,9  [        S-U S35         SnAgSnAff = f).uV   手动触发模型训练。

Returns:
    True if training succeeded, False otherwise
u   
❌ Stage3 未启用Fu   
❌ 对比学习未启用Nu:   
❌ 训练器未初始化（可能需要安装 PyTorch）uD   
❌ 未找到用户反馈数据，请先进行查询并提供反馈positivenegativer   u&   
❌ 没有反馈数据，无法训练uA   
⚠️  警告: 需要同时有正反馈和负反馈才能训练u     当前: 正反馈 u    个, 负反馈 u    个uF     建议: 至少各有 1 个反馈才能生成有效的 triplet 数据u     是否继续训练? (y/n): yr   <============================================================u   【Stage3 训练开始】u     反馈总数: u    (正: u   , 负: rA   r(   epochsr   
batch_size    )r   r   	save_pathloss        z(Stage3: Training completed, final loss: .4fu   【Stage3 训练完成】u     训练轮数: u     初始Loss: u     最终Loss: u     Loss下降: u     模型已保存: TzStage3: Training failed: r+   u   
❌ 训练失败: )r\   r   r^   rm   r<   r   rb   rY   rP   inputstriplowerrM   trainrc   _save_training_historyrN   rO   rI   rl   rZ   r   )rs   r   positive_countnegative_counttotal_feedbackresponserw   r   history
final_lossinitial_lossrv   s               ry   train_modelPipelineManager.train_model  s    ""*+**/0<<OP{{33D4G4GHYZ\--j"=>\--j"=>'8Q;<Q.A"5VX((88HHXX\]^Z\<=CCEKKMH36(m)*  07Gw~N^^_`am!	 KKOOHb9M"&&x4Fll(((,,\2>00 ) G 18,SJ1876?1-cL ''HKKB:cBRSTBvh- -.$VH-.N<"456N:c"234N<#<S"ABC'(>(>'?@AVHB-  %)LL$6$6D! 	LL4QC84LH(2./	s   7EK 
K?&K::K?c                 P   [        S5        [        S5        [        S5        [        S5        [        S5        [        5           [        S5      R                  5       nUR                  5       S;   a  [        S5        gUR                  5       S	;   a  U R	                  5         Ma  U(       d  Mj  U R                  U5      nU R                  U5        US
   (       Ga  U R                  (       Ga  U R                  US
   5      n/ nUS
   SS  H-  nUR                  5       nSU;   a  US	 UR                  U5        M/     U R                  R                  UUS   UUS9  UR                  S/ 5      nUR                  S/ 5      nU H  n[        U[        5      (       a  UR                  S/ 5      n	O[        U[         5      (       a  UO/ n	U	(       d  MM  U R"                  R%                  U	5      n
U R                  R'                  U R(                  U
5        M     U H  n[        U[        5      (       a  UR                  S/ 5      n	O[        U[         5      (       a  UO/ n	U	(       d  MM  U R"                  R%                  U	5      n
U R                  R+                  U R(                  U
5        M     [,        R/                  S[1        U5       S[1        U5       S35        GM  ! [2         a    [        S5         g[4         a/  n[,        R7                  SU 3SS9  [        SU 35         SnANMSnAff = f)z$Run interactive pipeline (CLI mode).r   u.   交互式 Co-location 模式挖掘系统 (MVP)u   输入 'quit' 或 'exit' 退出u'   输入 'train' 手动触发模型训练Tu   请输入查询: )quitexitqu	   再见！)r  trainingr   Nr/   r   r   )r   r   r   feedbacklikedisliker   z"Stage3: Feedback saved to memory (z liked, z
 disliked)u   

再见！zError processing query: r+   u   错误: )r   r   r  r  r  r   _display_resultsr\   collect_feedbackcopyr   r<   add_sessionrP   
isinstancedictrV   r=   r   add_positiverb   add_negativerN   rO   rY   KeyboardInterruptrZ   r   )rs   r   resultr  patterns_to_saver   pattern_copyliked_patternsdisliked_patternspattern_listr   rv   s               ry   run_pipelinePipelineManager.run_pipeline!  s   h>?h/078N&"#67==?
##%)>>+&##%)>>$$&! ++J7 %%f- *%%$*=*=*=#44VJ5GHH (*$#)*#5cr#:'.||~&,6 ,[ 9(//= $; KK++(%&<=!1!)	 ,  &.\\&"%=N(0Y(C%#1%gt44+2;;y"+EL6@$6O6O7UWL'<*.--*F*F|*TK KK44T5H5H+V $2 $5%gt44+2;;y"+EL6@$6O6O7UWL'<*.--*F*F|*TK KK44T5H5H+V $5 KK"DSEXDYYa"%&7"8!9!E FK T % o& &7s;dKn%%&s?   8K =$K #K ,DK BK  A3K L%-	L%6%L  L%r  c                    [        S5        [        S5        [        S5        [        S5        US   n[        SUS    35        [        SUS	    35        [        S
US    35        UR                  SS5      S:  a  [        S5        [        SUS    35        UR                  S/ 5      nU(       aJ  [        US5       H:  u  pE[        SU SUR                  SS5       SUR                  SS5       S35        M<     UR                  SS5      (       a!  [        S5        [        S5        [        S5        US   nUR                  SS5      nUR                  S0 5      nU(       a  [        SUS     S!35        O[        SUS     S"35        U(       a  [        US#S$ S5       H  u  pIS%S&R                  U	S'   5      -   S(-   n
S)U	S*   S+ 3S,U	S-   S+ 3S.U	S/    3S0U	S1    3/nU(       aC  U(       a<  S2R                  [	        U	S'   5      5      nX;   a  X   nUR                  S3US+ S435        [        S5U S6U
 35        [        S7S&R                  U5       35        M     O[        S85        UR                  S9/ 5      nU(       a  [        S:UR                  S;S5       S"35        [        US#S$ S5       Hm  u  pOS%S&R                  US<   5      -   S(-   nS%S&R                  US=   5      -   S(-   n[        S5U S6U S>U 35        [        S?US-   S+ S@USA   SB SCUSD   S+ 35        Mo     O[        SE5        [        SF5        [        SG5        [        S5USH    35        [        SI5        g#)Jz\Display results in a formatted way.

Args:
    result: Result dictionary from process_query
=
============================================================u   系统输出:r   u   
【提取的参数】r   u     最小参与率: r   u     最大模式大小: r   u     优先级: r   r   r   r   u   
【迭代历史】u     总轮数: r   u	     轮次 u	   : 发现 total_patternsu    个模式, total_rulesu
    个规则r   Fu   
【排序优化】u?     ✓ 已根据您的历史偏好对模式进行个性化排序u3     ✓ 相似度越高的模式越符合您的兴趣r   r   u   
【发现的模式】 (共 r   u/    个) [已根据您的历史偏好优化排序]u    个)Nr   r   r   r   r   u   参与率: r   r   u   置信度: r   u   大小: r   u   实例数: instance_countr   u   相似度: u    ⭐z  r   z     u      未发现满足条件的模式r   u   
【关联规则】 (共 r   
antecedent
consequentu    → u        置信度: u   , 支持度: supportr   u   , 提升度: liftu   
【关联规则】 (共 0 个)u&     未生成满足条件的关联规则u   
【解释】r   z=============================================================
)r   rP   r   r   r   r   )rs   r  r   r   r   
round_infor   r   r   r   r   
info_partsr   
similarityr   ruleantecedent_strconsequent_strs                     ry   r   PipelineManager._display_results{  s    	ooh 	'(./#F+>$?#@AB&v.@'A&BCDfZ0123 ::na(1,()M&"8!9:; &

+> C %./@!%DMAIaS	*..AQST2U1VVb'^^M1=>jJ K &E
 ::k5))()STGH *%JJ{E2	"JJ':B?1&2I1JJyz{1&2I1J%PQ'"q9
!DIIgi.@$AACG "'*?"@!EF!',"7!<=wv/0!'*:";!<=	
 !2"%((6')2D+E"FK"7%6%C
"))K
37Gt*LM1#R}-.dii
3456' :* 45 

7B'.vzz,/J.K5QR$U3BZ3!$tyyl1C'D!Ds!J!$tyyl1C'D!Ds!J1#R/u^4DEF(l);C(@ A$$(OC#8 9$$(L#57 8	 4 46:; 	6-()*+or   c                   ^ [        S5        [        S5        [        S5        [        S5        [        S5      R                  5       n[        S5        [        S5      R                  5       nS[        S	[        4U4S
 jjnU" U5      U" U5      S.n[        US   5      n[        US   5      n[        SU SU S35        U$ )zCollect user feedback on patterns.

Args:
    patterns: List of patterns shown to user
    
Returns:
    Dictionary containing like and dislike feedback
r(  u   【用户反馈采集】r   uW   请选择感兴趣的模式编号（逗号分隔，如 1,3,5），直接回车跳过：zlike> uN   请选择不感兴趣的模式编号（逗号分隔），直接回车跳过：z	dislike> r|   r}   c                   > U R                  5       (       d  / $  U R                  S5       Vs/ s H  n[        UR                  5       5      S-
  PM!     nn/ nU H3  nSUs=::  a  [        T5      :  d  M  O  M  UR	                  TU   5        M5     U$ s  snf ! [
         a    [        R                  SU  35        / s $ f = f)z@Parse comma-separated indices and return corresponding patterns.r   r   r   zInvalid input format: )r  splitintrY   r   
ValueErrorrN   r[   )r|   r   indicesvalid_patternsidxr   s        ry   parse_indices7PipelineManager.collect_feedback.<locals>.parse_indices  s    ::<<	
7;zz#G!3qwwy>A-G!#"CC/#h-//&--hsm< # &% H  !7v>?	s(   B &BB 4B B $B>=B>)r  r  r  r  u   
已记录反馈: u    个喜欢, u    个不喜欢)r   r   r  strrV   rY   )rs   r   
like_inputdislike_inputr?  r  
like_countdislike_counts    `      ry   r   PipelineManager.collect_feedback  s     	o()hgh8_**,
^_k*002	 	 	" "*-$]3

 &)*
HY/0#J<|M?-XYr   feedback_countr   r	  c                    SSK nSSKJn  Sn[        R                  " [        R                  R                  U5      SS9  [        R                  R                  U5      (       a'   [        USSS	9 nUR                  U5      nSSS5        OS
/ 0nUR                  5       R                  S5      UUUS   (       a  US   S   OSUS   (       a  US   S   OSUS   S.n	WS
   R                  U	5        [        USSS	9 nUR                  XSSS9  SSS5        g! , (       d  f       N= f!   S
/ 0n N= f! , (       d  f       g= f)u   保存训练历史到文件。

Args:
    feedback_count: 触发训练时的反馈总数
    epochs: 训练轮数
    history: 训练历史（包含loss列表）
r   N)datetimezlogs/training_history.jsonT)exist_okr   r   r   	trainingsz%Y-%m-%d %H:%M:%Sr   r   )timerG  r   r
  r  loss_historyw   F)indentensure_ascii)jsonrI  ro   makedirsrp   dirnamerq   rJ   loadnowstrftimer   dump)
rs   rG  r   r	  rR  rI  history_pathrt   history_datatraining_records
             ry   r  &PipelineManager._save_training_history  s'    	%3
BGGOOL1DA 77>>,''1,g>!#'99Q<L ?>
 (,L LLN++,?@,18'&/"-d29&/GFOA.t#FO
 	[!((9 ,g6!IIlaeID 76) ?>1 +R0" 76s6   $D& /DD& :D1
D#D& #D& &D.1
D?r   c                    U R                   (       a  U R                  c  [        S5      eX R                  :  a  U R                  n[        R
                  R                  US9n[        R                  nU R                  R                  X4S9nU R                  R                  U5      nSSKJn  U" U R                  UUS9nU R                  R                  XR                  5      Ul        [#        [$        R&                  " 5       5      n	UUUS.U R(                  U	'   U R                  R+                  XU R,                  S	9n
S
nSnUR                   Gb  U R.                  R1                  U R                  5      n[2        R5                  SUSL 35        U(       Ga<  Sn[2        R5                  SUR7                  5        35        UR9                  S/ 5      UR9                  S0 5      R9                  S5      UR9                  S0 5      R9                  S/ 5      UR9                  S0 5      R9                  S0 5      UR9                  S0 5      R9                  S0 5      UR9                  S5      S.n[;        US   S5      (       a  US   R=                  5       US'   [2        R5                  SUR9                  S5       S[?        UR9                  S/ 5      5       35        O[2        R5                  S5        U	U
S   UU
S   U
S   U
R9                  S0 5      U
S   UUUS.
n[2        R5                  S U S!U(       a  [A        UR7                  5       5      OS 35        U$ )"zStart an interactive iteration session (Stage4).

Args:
    query: User query
    iteration_rounds: Number of iteration rounds
    
Returns:
    Dictionary containing session_id and first round results
NzStage4 is not enabledr   r   r   )IterationState)r1   r   r7   )stater   r   rm   Fz,Stage4 start_iteration: Loaded intent data: Tz%Stage4 start_iteration: Intent keys: r   intentbusinesspattern_preference
importancerisk
created_atr   rb  rc  rd  re  rf  tolistz:Stage4 start_iteration: Flattened intent_data - business: z, patterns: zOStage4 start_iteration: state.user_vector is None, skipping intent data loadingroundr   r   r   is_final)

session_idri  r   r   r   r   rj  r   r   r   z:Stage4 start_iteration: Returning result with intent_used=z, intent_data keys=)!rg   rk   r;  ri   r   r   r   r   r>   r   rQ   r   controller.iteration_managerr^  rb   init_user_vectoruser_vectorrA  uuiduuid4re   run_one_iteration_steprm   r<   r   rN   rO   rX   rP   hasattrrh  rY   rV   )rs   r   r   r   r   r   r   r^  r_  rk  round_resultr   r   loaded_intentr  s                  ry   start_iterationPipelineManager.start_iteration'  s    ""d&<&<&D455444#55 +GGNN O 
 '44//0A/X''88F 	@'''
 !22CCEK^K^_ &
/

+ --DDU\`\h\hDi ( KK33D4G4GHMKKF}\`G`Fabc"CMDVDVDXCYZ[ +..w; - 1 1(B ? C CJ O*7*;*;Hb*I*M*MNbdf*g"/"3"3Hb"A"E"ElTV"W)--h;??K"/"3"3L"A ;w/::+6w+?+F+F+HK(XYdYhYhisYtXu  vB  CF  GR  GV  GV  Wk  mo  Gp  Cq  Br  s  tKKij %!'*,$Z0!'*!-!1!12Er!J$Z0&&
 	PQ\P]]p  NYqu  wB  wG  wG  wI  rJ  _c  qd  e  	fr   rk  r  c           
         XR                   ;  a  [        SU 35      eU R                   U   nUS   nUS   nU R                  R                  UUU R                  SS9nU R
                  (       aT  U R                  bG  U R                  R                  b0  U R                  R                  U l        [        R                  S5        SnSnUR                  b  U R                  R                  U R                  5      n	U	(       a  S	nU	R                  S
/ 5      U	R                  S0 5      R                  S5      U	R                  S0 5      R                  S/ 5      U	R                  S0 5      R                  S0 5      U	R                  S0 5      R                  S0 5      U	R                  S5      S.n[        US
   S5      (       a  US
   R!                  5       US
'   UR#                  5       (       dV  U R                  R%                  XEU R                  S9n
U
S   UR&                  U
S   U
S   U
R                  S0 5      UU
S   UUS.	$ U R                  R)                  XE5      nUR*                  UR&                  US   US   UR                  S0 5      US	UUS.	$ )zProcess feedback, train model, and return next iteration round (Stage4).

Args:
    session_id: Iteration session ID
    feedback: Dictionary with 'positive' and 'negative' pattern lists
    
Returns:
    Dictionary containing next round results
Invalid session_id: r_  r   r8   )r_  r  rm   training_epochsNz1Updated preference_model reference after trainingFTr   ra  rb  rc  rd  re  rf  rg  rh  r`  ri  r   r   r   rj  )	ri  r   r   r   r   training_resultrj  r   r   )re   r;  rk   update_and_trainrm   r^   rI   rl   rN   r   rn  r<   r   rb   rP   rr  rh  is_completerq  r7   _final_rankcurrent_round)rs   rk  r  sessionr_  r   rz  r   r   rt  rs  final_results               ry   next_iterationPipelineManager.next_iteration~  s    4443J<@AA))*5 " 00AALL	 B 
 &&4<<+CHZHZHf$(LL$6$6D!LLLM ( KK33D4G4GHM" +..w; - 1 1(B ? C CJ O*7*;*;Hb*I*M*MNbdf*g"/"3"3Hb"A"E"ElTV"W)--h;??K"/"3"3L"A ;w/::+6w+?+F+F+HK(   ""11HHt|| I L
 &g. % 0 0(4%g.%1%5%56I2%N#2(4**
 
  11==eLL ,, % 0 0(4%g.%1%5%56I2%N#2 **
 
r   c           
         XR                   ;  a  [        SU 35      eU R                   U   nUS   nUS   nUS   nU R                  R                  X45      nU R	                  UUS   US   5      n/ nUR
                   HL  n	UR                  U	S   U	R                  SS	5      U	R                  S
S	5      U	R                  SS5      S.5        MN     Sn
SnUR                  b  U R                  R                  U R                  5      nU(       a  Sn
UR                  S/ 5      UR                  S0 5      R                  S5      UR                  S0 5      R                  S/ 5      UR                  S0 5      R                  S0 5      UR                  S0 5      R                  S0 5      UR                  S5      S.n[        US   S5      (       a  US   R                  5       US'   U R                   U	 US   US   UR                  S0 5      UUUU
US.$ )zGet final results after all iterations (Stage4).

Args:
    session_id: Iteration session ID
    
Returns:
    Dictionary containing final results and explanation
rx  r_  r   r   r   r   ri  r)  r   r*  user_vector_normr   )ri  r)  r*  r  FNTr   ra  rb  rc  rd  re  rf  rg  rh  r   )r   r   r   r   r   r   r   r   )re   r;  rk   r}  r   r	  r   rP   rn  r<   r   rb   rr  rh  )rs   rk  r  r_  r   r   r  r   r   
round_datar   r   rt  s                ry   finalize_iteration"PipelineManager.finalize_iteration  s9    4443J<@AA))*5 "  --99%H 00$!
 --J$$#G,",..1A1"E)~~mQ?$.NN3Es$K	&  ( ( KK33D4G4GHM" +..w; - 1 1(B ? C CJ O*7*;*;Hb*I*M*MNbdf*g"/"3"3Hb"A"E"ElTV"W)--h;??K"/"3"3L"A ;w/::+6w+?+F+F+HK( ##J/ %Z0!'*!-!1!12Er!J&!2&&	
 		
r   )rM   r=   r?   r@   rd   rk   re   r;   r>   r<   r:   rl   rQ   rT   rS   rU   ra   r\   rc   r`   r^   r_   rb   rh   rg   rj   ri   rm   )zconfig/config.yamlr   )__name__
__module____qualname____firstlineno____doc__rA  rz   boolr   r   r:  r   r   r   rV   r   r  r%  r  r  r  ru  r   r  r  __static_attributes__r   r   ry   r   r   1   s}   7K>C K>Z
0 
0 
0`
 `
x} `
X\]`be]eXf `
F =A!DcN !(,!59!EH!FMT M^X&tUtCH~ Un+ +$sCx. +Z&ES &E# &EPTUXZ]U]P^ &EPUS UC UDcN UnR RS$s)^8L RQUVY[^V^Q_ RhE
S E
T#s(^ E
r   r   )0r  loggingro   numpyr   ro  typingr   r   r   r   rK   llmr   r   
preferencer	   preference.scorerr
   r   r   corer   memory.storer   learning.learnerr   learning.embedderr   llm.intent_encoderr   llm.intent_mapperr   rR   ImportErrorr[   embedding.encoderr   learning.trainerr   r]   rl  r   rf   	getLoggerr  rN   r   r   r   ry   <module>r     s    :  	   , ,  * ' X   $ . -L0._32#' M=
 
		8	$f
 f
1  LOOJKL  _#( OO]^_  MOOKLMs6   B !B5 0C B21B25CCC21C2