
    mi                        d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
 ddlZddlmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ 	 ddlmZ ddlm Z  dZ!	 ddl$m%Z% ddl&m'Z' dZ(	 ddl)m*Z* dZ+ ejX                  e-      Z. G d d      Z/y# e"$ r dZ! ejF                  d       Y Pw xY w# e"$ r dZ( ejF                  d       Y `w xY w# e"$ r dZ+ ejF                  d       Y vw xY w)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            	       @   e Zd ZdZddefdZdedefdZdded	ee	   de
eef   fd
Z	 dde
eef   dededefdZdefdZd Zde
eef   fdZdede
eef   fdZde	de	de
eef   fdZded	e	de
eef   fdZdede
eee   f   de
eef   fdZdede
eef   fdZy) PipelineManagerz-Manager for coordinating the entire pipeline.config_pathc                    t        |dd      5 }t        j                  |      | _        ddd       t        j                  d       t        |      | _        t        | j                  j                  di             | _
        t        | j                  d   d	   d
d      | _        | j                  j                  di       }|j                  dd      xr t        | _        |j                  dd      | _        |j                  dd      | _        t#               | _        | j                  r| j                  nd}t'        || j                  j                  di       j                  dd            | _        t+               | _        d| _        d| _        | j                  r	 t3        | j                  j4                  j7                               }t9        | j                  |      | _        t;        | j,                        | _        t        j                  dt=        |       d       | j                  j                  di       }|j                  dd      | _!        |j                  dd      xr tD        | _#        |j                  dd      | _$        |j                  dd      | _%        |j                  dd       | _&        |j                  d!d"      | _'        |j                  d#d$      | _(        d%| _)        i | _*        | j                  j                  d&i       }|j                  dd      xr tV        | _,        |j                  d'd(      | _-        |j                  d)d*      | _.        |j                  d+d      | _/        d| _0        | jX                  r	 tc        | j                  | j(                  | j$                  | j,                  | j                  | j.                  | j0                  | j^                  ,      | _0        t        j                  d-| jZ                   d.| j\                   d/       d| _2        d| _3        | jF                  r	 | j,                  jh                  jk                         }	|j                  d1d2      }
tl        jn                  jq                  | jP                        rts        |	|
3      | _2        tu        | j$                  | j,                  | jd                  |j                  d4d5      |j                  d6d7      |j                  d8d      | jN                  9      | _3        | jf                  jw                  | jP                         t        j                  d:| jP                          n|tu        | j$                  | j,                  d|	|
|j                  d4d5      |j                  d6d7      |j                  d8d      | jN                  ;	      | _3        t        j                  d<       t        j                  d>| j                   d?| jB                   d@| jF                   dA| jX                   d/	       y# 1 sw Y   xY w# t>        $ r,}t        jA                  d| d       d| _        Y d}~Gd}~ww xY w# t>        $ r,}t        jA                  d0| d       d| _,        Y d}~d}~ww xY w# t>        $ r2}t        jA                  d=| d       d| _#        d| _3        Y d}~d}~ww xY w)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_mapperr8   z5Stage4: IterationManager initialized (default_rounds=z, max_rounds=)z/Stage4: Failed to initialize IterationManager: 
hidden_dim   )	input_dimrA   marging333333?learning_rategMbP?use_cosine_loss)memory_storer<   modelrD   rE   rF   r0   z/Stage3: Loaded trained preference encoder from )	rG   r<   rH   rC   rA   rD   rE   rF   r0   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   r9   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trainerrH    get_sentence_embedding_dimensionospathexistsr   r   
load_model)selfr   fstage0_configr%   r)   estage3_configstage4_configrC   rA   s              M   /home/ubuntu/codebase/yexijia/保研/colocation_mvp/src/controller/manager.py__init__zPipelineManager.__init__4   s*    +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,="+#--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+#$sV   X,BX9 	BY1 =F$Z) ,X69	Y.!Y))Y.1	Z&:!Z!!Z&)	[$2([[$textreturnc                 4    g d}t        fd|D              S )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   &   K   | ]  }|v  
 y wN ).0krz   s     rx   	<genexpr>z/PipelineManager.is_ambiguous.<locals>.<genexpr>   s     /h19hs   )any)rr   rz   keywordss    ` rx   is_ambiguouszPipelineManager.is_ambiguous   s     n/h///    N
user_inputiteration_roundsc                    t         j                  d|        | j                  rS| j                  F|| j                  }n|| j
                  kD  r| j
                  }t         j                  d| d       t        j                  j                  |      }t        j                  }| j                  j                  ||      }| j                  j                  |      }| j                  j                  || j                  ||      }| j!                  ||d   |d	         }| xj"                  |z  c_        |||d   |d	   |t%        |d         t%        |d	         d
|j'                  di       d
d|d   |d   dS d}	d}
| j(                  r| j+                  |      rt         j                  d       	 | j,                  j/                  |      }|r| j0                  j3                  |      }|O| j4                  j7                  | j                  ||       d
}	|}
t         j                  d|j8                   d       n+t         j;                  d       nt         j;                  d       t         j                  d       t        j                  j                  |      }t        j                  }| j                  j                  ||      }t         jA                  d|        tC        d|       t         j                  d       | j                  j                  |      }t         j                  d|        t         j                  d       | jD                  jG                  |d   |d   |d         }t         j                  d t%        |       d!       t         j                  d"       |j'                  d#d$      }| jD                  jI                  ||%      }t         j                  d&t%        |       d'       d}d}| jJ                  r|dd( }|D ]*  }d)|vs| jL                  jO                  |d*         }||d)<   , d}| j(                  s| jJ                  rI| jP                  jS                  || j                  | j"                  +      }|t         j                  d,       || j4                  jU                  | j                        }|rtW        || jL                  jX                  j[                         -      }| j\                  rE| j^                  9ta        ||| j^                  | jb                  .      }t         j                  d/       n.ta        ||d| jb                  .      }t         j                  d0       || j(                  r| j4                  je                  | j                        }
|
rZ|
j'                  d1      rItg        jh                  |
d1         }| jP                  jk                  ||      }t         j                  d2       |t         j                  d3       tm        to        ||      d4 d
5      }|D cg c]  \  }}|	 }}}i }|D ]4  \  }}d6jq                  tm        |j'                  d*g                   }|||<   6 ||d(d z   }d
}t         j                  d7t%        |       d8       nt         j                  d9       t         j                  d:       | j!                  |||      }| xj"                  d;z  c_        |||||t%        |      t%        |      |||	|
d<S # t<        $ r%}t         j?                  d| d
       Y d}~d}~ww xY wc c}}w )=a  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=r@   r   system)queryr0   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)r0   interaction_roundz?Stage3: Using fused user vector (intent + feedback) for scoring)dim)rH   r/   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                     | d   S )N   r   )xs    rx   <lambda>z/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   )9rM   rN   rf   rj   rg   rh   r   PREFERENCE_EXTRACTION_PROMPTformatSYSTEM_PROMPTr=   generaterP   parse_preferencerunra   _generate_explanationrc   rX   rO   rR   r   r>   parser?   	to_vectorr;   save_intentshaperZ   rY   errordebugprintr9   mine_patternsgenerate_rulesr[   r<   encode_patternr:   r   get_user_profiler
   rH   rm   r]   rk   score_with_preferencer`   load_intentnparray_score_with_vectorsortedzipjoin)rr   r   r   preference_promptsystem_promptr   paramsiteration_resultr   r   r   intent_jsonr   ru   r   r&   r   r   r   top_patternsr   pattern_vecscoresuser_profileuser_vecrankedp_scorepattern_keys                                 rx   process_queryzPipelineManager.process_query   s    	(56 4#9#9#E'#'#=#= !D$:$::#'#9#9 KKFGWFXXYZ[ !/ K K R R% !S ! +88M??334Em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(//0C0CUK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Z[R  6s   0B4\" 9]"	]+]]r   r   r   c                    g }t        |dd d      D ]J  \  }}ddj                  |d         z   dz   }|j                  | d| d	|d
   dd|d   dd|d    d
       L |rdj                  |      nd}t        j                  j                  |d   |d   |d   |      }	t        j                  }
| j                  j                  |	|
      }|S )zGenerate explanation for mining results.
        
        Args:
            params: Mining parameters
            patterns: Discovered patterns
            
        Returns:
            Explanation text
        N
   r   {, r   }. u    (参与率: participation_index.3fu   , 置信度: 
confidenceu
   , 大小: sizer@   
u   未发现满足条件的模式r   r   r   )r   r   r   r   r   )		enumerater   appendr   EXPLANATION_GENERATION_PROMPTr   r   r=   r   )rr   r   r   r   pattern_infoir   pattern_strpatterns_textexplanation_promptr   r   s               rx   r   z%PipelineManager._generate_explanation  s    #HSbM15JAw		')*< ==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           	         | j                   st        d       y| j                  st        d       y| j                  t        d       y| j                  j                  | j                        }|st        d       yt        |j                  dg             }t        |j                  dg             }||z   }|d	k(  rt        d
       y|d	k(  s|d	k(  rUt        d       t        d| d| d       t        d       t        d      j                         j                         }|dk7  ryt        dd        t        d       t        d| d| d| d       t        d d       	 | j                  j                  di       }|j                  dd      }| j                  j                  ||j                  dd      | j                        }|d   r|d   d    nd!}	|d   r|d   d	   nd!}
| j                  |||       t         j#                  d"|	d#       t        dd        t        d$       t        d%|        t        d&|
d#       t        d'|	d#       t        d(|
|	z
  d#       t        d)| j                          t        d d       | j                  j$                  | _        y*# t(        $ r3}t         j+                  d+| d*,       t        d-| d       Y d}~yd}~ww xY w).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   , 负: r@   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]   rl   r;   r   ra   rX   rO   inputstriplowerrL   trainrb   _save_training_historyrM   rN   rH   rk   rY   r   )rr   r   positive_countnegative_counttotal_feedbackresponserv   r   history
final_lossinitial_lossru   s               rx   train_modelz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   $EJ- -	K)6)K$$K)c                    t        d       t        d       t        d       t        d       t        d       t                	 	 t        d      j                         }|j                         dv rt        d       y|j                         d	v r| j	                          \|s_| j                  |      }| j                  |       |d
   r| j                  r| j                  |d
         }g }|d
   dd D ]*  }|j                         }d|v r|d= |j                  |       , | j                  j                  ||d   ||       |j                  dg       }|j                  dg       }|D ]}  }t        |t              r|j                  dg       }	nt        |t               r|ng }	|	s=| j"                  j%                  |	      }
| j                  j'                  | j(                  |
        |D ]}  }t        |t              r|j                  dg       }	nt        |t               r|ng }	|	s=| j"                  j%                  |	      }
| j                  j+                  | j(                  |
        t,        j/                  dt1        |       dt1        |       d       X# t2        $ r t        d       Y yt4        $ r2}t,        j7                  d| d       t        d|        Y d}~Md}~ww xY w)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_sessionrO   
isinstancedictrU   r<   r   add_positivera   add_negativerM   rN   rX   KeyboardInterruptrY   r   )rr   r   resultr  patterns_to_saver   pattern_copyliked_patternsdisliked_patternspattern_listr   ru   s               rx   run_pipelinez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+2;;y"+EL6@$6O7UWL'*.--*F*F|*TK KK44T5H5H+V $2 $5%gt4+2;;y"+EL6@$6O7UWL'*.--*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?   6J ;"J J !DJ &BJ (A1J K+1K+9(K&&K+r  c                 h   t        d       t        d       t        d       t        d       |d   }t        d|d           t        d|d	           t        d
|d           |j                  dd      dkD  ryt        d       t        d|d           |j                  dg       }|rIt        |d      D ]:  \  }}t        d| d|j                  dd       d|j                  dd       d       < |j                  dd      r!t        d       t        d       t        d       |d   }|j                  dd      }|j                  di       }|rt        d|d     d!       nt        d|d     d"       |rt        |d#d$ d      D ]  \  }}	d%d&j                  |	d'         z   d(z   }
d)|	d*   d+d,|	d-   d+d.|	d/    d0|	d1    g}|r>|r<d2j                  t	        |	d'               }||v r||   }|j                  d3|d+d4       t        d5| d6|
        t        d7d&j                  |               nt        d8       |j                  d9g       }|rt        d:|j                  d;d       d"       t        |d#d$ d      D ]m  \  }}d%d&j                  |d<         z   d(z   }d%d&j                  |d=         z   d(z   }t        d5| d6| d>|        t        d?|d-   d+d@|dA   dBdC|dD   d+       o nt        dE       t        dF       t        dG       t        d5|dH           t        dI       y#)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   rO   r   r   r   r   )rr   r  r   r   r   
round_infor   r   r   r   r   
info_partsr   
similarityr   ruleantecedent_strconsequent_strs                     rx   r  z 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 %./@!%DMAz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
7!DIIgi.@$AACG "'*?"@!EF!',"7!<=wv/0!'*:";!<=	
 !2"%((6')2D+E"FK"&77%6{%C
"))K
37Gt*LM1#R}-.dii
3456' :* 45 

7B'.vzz,/J.K5QR$U3BZ34!$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                 |   t        d       t        d       t        d       t        d       t        d      j                         }t        d       t        d      j                         }dt        d	t        ffd
} ||       ||      d}t        |d         }t        |d         }t        d| d| d       |S )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> rz   r{   c                 d   | j                         sg S 	 | j                  d      D cg c]  }t        |j                               dz
    }}g }|D ].  }d|cxk  rt              k  sn |j	                  |          0 |S c c}w # t
        $ r t        j                  d|         g cY S w xY w)z@Parse comma-separated indices and return corresponding patterns.r   r   r   zInvalid input format: )r   splitintrX   r   
ValueErrorrM   rZ   )rz   r   indicesvalid_patternsidxr   s        rx   parse_indicesz7PipelineManager.collect_feedback.<locals>.parse_indices  s    ::<	
7;zz#G!3qwwy>A-G!#"CC/#h-/&--hsm< # &% H  !7v>?	s(   B	 #BB	 )B	 B	 	#B/.B/)r  r  r  r  u   
已记录反馈: u    个喜欢, u    个不喜欢)r   r   r   strrU   rX   )rr   r   
like_inputdislike_inputr5  r  
like_countdislike_counts    `      rx   r  z 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                 j   ddl }ddlm} d}t        j                  t        j                  j                  |      d       t        j                  j                  |      r*	 t        |dd	      5 }|j                  |      }ddd       nd
g i}|j                         j                  d      |||d   r|d   d   nd|d   r|d   d   nd|d   d}	d
   j                  |	       t        |dd	      5 }|j                  ||dd       ddd       y# 1 sw Y   xY w#  d
g i}Y xY w# 1 sw Y   yxY w)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   )timer;  r   r  r  loss_historyw   F)indentensure_ascii)jsonr=  rn   makedirsro   dirnamerp   rI   loadnowstrftimer   dump)
rr   r;  r   r  rF  r=  history_pathrs   history_datatraining_records
             rx   r   z&PipelineManager._save_training_history  s$    	%3
BGGOOL1DA 77>>,'1,g>!#'99Q<L ?
 (,L LLN++,?@,18'&/"-d29&/GFOA.t#FO
 	[!((9 ,g6!IIlAaeID 76) ?>1 +R0" 76s0   !D /DD 3D)DD D&)D2r   c                    | j                   r| j                  t        d      || j                  kD  r| j                  }t        j
                  j                  |      }t        j                  }| j                  j                  ||      }| j                  j                  |      }ddlm}  || j                  ||      }| j                  j                  || j                        |_        t#        t%        j&                               }	|||d| j(                  |	<   | j                  j+                  ||| j,                  	      }
d
}d}|j                   z| j.                  j1                  | j                        }t2        j5                  d|du        |rMd}t2        j5                  d|j7                                 |j9                  dg       |j9                  di       j9                  d      |j9                  di       j9                  dg       |j9                  di       j9                  di       |j9                  di       j9                  di       |j9                  d      d}t;        |d   d      r|d   j=                         |d<   t2        j5                  d|j9                  d       dt?        |j9                  dg                     nt2        j5                  d       |	|
d   ||
d   |
d   |
j9                  di       |
d   |||d
}t2        j5                  d | d!|rtA        |j7                               nd        |S )"a
  Start 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)r0   r   r6   )stater   r   rl   Fz,Stage4 start_iteration: Loaded intent data: Tz%Stage4 start_iteration: Intent keys: r   intentbusinesspattern_preference
importancerisk
created_atr   rU  rV  rW  rX  rY  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_idr\  r   r   r   r   r]  r   r   r   z:Stage4 start_iteration: Returning result with intent_used=z, intent_data keys=)!rf   rj   r1  rh   r   r   r   r   r=   r   rP   r   controller.iteration_managerrQ  ra   init_user_vectoruser_vectorr6  uuiduuid4rd   run_one_iteration_steprl   r;   r   rM   rN   rW   rO   hasattrr[  rX   rU   )rr   r   r   r   r   r   r   rQ  rR  r^  round_resultr   r   loaded_intentr  s                  rx   start_iterationzPipelineManager.start_iteration'  s    ""d&<&<&D455d444#55 +GGNN O 
 '44//0A-/X''88F 	@'''
 !22CCE4K^K^_ &
/

+ --DDUF\`\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   r^  r  c           
         || j                   vrt        d|       | j                   |   }|d   }|d   }| j                  j                  ||| j                  d      }| j
                  rR| j                  F| j                  j                  0| j                  j                  | _        t        j                  d       d}d}|j                  | j                  j                  | j                        }	|	rd	}|	j                  d
g       |	j                  di       j                  d      |	j                  di       j                  dg       |	j                  di       j                  di       |	j                  di       j                  di       |	j                  d      d}t        |d
   d      r|d
   j!                         |d
<   |j#                         sZ| j                  j%                  ||| j                        }
|
d   |j&                  |
d   |
d   |
j                  di       ||
d   ||d	S | j                  j)                  ||      }|j*                  |j&                  |d   |d   |j                  di       |d	||d	S )a6  Process 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: rR  r   r7   )rR  r  rl   training_epochsNz1Updated preference_model reference after trainingFTr   rT  rU  rV  rW  rX  rY  rZ  r[  rS  r\  r   r   r   r]  )	r\  r   r   r   r   training_resultr]  r   r   )rd   r1  rj   update_and_trainrl   r]   rH   rk   rM   r   ra  r;   r   ra   rO   re  r[  is_completerd  r6   _final_rankcurrent_round)rr   r^  r  sessionrR  r   rl  r   r   rg  rf  final_results               rx   next_iterationzPipelineManager.next_iteration~  s    T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vt|| I L
 &g. % 0 0(4%g.%1%5%56I2%N#2(4**
 
  11==eVLL ,, % 0 0(4%g.%1%5%56I2%N#2 **
 
r   c           
         || j                   vrt        d|       | j                   |   }|d   }|d   }|d   }| j                  j                  ||      }| j	                  ||d   |d         }g }|j
                  D ]K  }	|j                  |	d   |	j                  dd	      |	j                  d
d	      |	j                  dd      d       M d}
d}|j                  | j                  j                  | j                        }|rd}
|j                  dg       |j                  di       j                  d      |j                  di       j                  dg       |j                  di       j                  di       |j                  di       j                  di       |j                  d      d}t        |d   d      r|d   j                         |d<   | j                   |= |d   |d   |j                  di       ||||
|dS )zGet final results after all iterations (Stage4).
        
        Args:
            session_id: Iteration session ID
            
        Returns:
            Dictionary containing final results and explanation
        rj  rR  r   r   r   r   r\  r   r   r!  user_vector_normr   )r\  r   r!  ru  FNTr   rT  rU  rV  rW  rX  rY  rZ  r[  r   )r   r   r   r   r   r   r   r   )rd   r1  rj   ro  r   r  r   rO   ra  r;   r   ra   re  r[  )rr   r^  rq  rR  r   r   rr  r   r   
round_datar   r   rg  s                rx   finalize_iterationz"PipelineManager.finalize_iteration  s:    T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   )zconfig/config.yamlr~   )__name__
__module____qualname____doc__r6  ry   boolr   r   r0  r   r   r   rU   r   r  r  r  r  r   rh  r   rs  rw  r   r   rx   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{  loggingrn   numpyr   rb  typingr   r   r   r   rJ   llmr   r   
preferencer	   preference.scorerr
   r   r   corer   memory.storer   learning.learnerr   learning.embedderr   llm.intent_encoderr   llm.intent_mapperr   rQ   ImportErrorrZ   embedding.encoderr   learning.trainerr   r\   r_  r   re   	getLoggerrx  rM   r   r   r   rx   <module>r     s    :  	   , ,  * ' X   $ . -L0._32#' M=
 
		8	$f
 f
1  LGOOJKL  _#( GOO]^_  MGOOKLMs6   B !B4 0C B10B14CCC/.C/