
    %~i$                    t    d Z ddlmZ ddlZddlmZ ddlmZ  ej                  e	      Z
g dZ G d d	      Zy)
uD   증분 업데이트 — 새 카톡 데이터로 기존 지식 보강    )annotationsN   )KnowledgeGraph)VectorStore)lowmediumhighc                  N    e Zd ZdZd	dZ	 d
	 	 	 	 	 ddZddZddZddZddZ	y)IncrementalUpdateruW   새 인사이트를 기존 지식 베이스와 비교하여 추가/보강/충돌 처리c                     || _         || _        y)uy   
        Args:
            vector_store: VectorStore 인스턴스
            graph: KnowledgeGraph 인스턴스
        N)_store_graph)selfvector_storegraphs      d/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/incremental_updater.py__init__zIncrementalUpdater.__init__   s     #    c                   dddg g d}|s|S g }|D ]  }|dxx   dz  cc<   |j                  dd      }|j                  dd      }t        |j                  dd            }| j                  j                         dk(  rO| j                  j	                  |g       |d	xx   dz  cc<   |d
   j                  |       |j                  |       | j                  j                  |j                  dd      dz   |j                  dd      z   d      }	|	sP| j                  j	                  |g       |d	xx   dz  cc<   |d
   j                  |       |j                  |       Q|	d   }
|
d   }||kD  rg| j                  j	                  |g       |d	xx   dz  cc<   |d
   j                  |       |j                  |       t        j                  d||       |
d   }|
j                  dd      }| j                  j                  |      }|rt        |j                  dd            nd}||k(  }||k(  }|r|r| j                  ||      }| j                  ||      }| j                  j	                  |g       |dxx   dz  cc<   |d   j                  |       |j                  |       t        j                  d|||       | j                  j	                  |g       |d	xx   dz  cc<   |d
   j                  |       |j                  |       t        j                  d||        |r| j                  |       t        j                  d|d	   |d   |d          |S )u  새 인사이트를 기존 DB와 비교하여 업데이트.

        각 new_insight에 대해:
        1. vector_store.search_similar()로 유사 인사이트 검색
        2. 가장 유사한 것의 distance 확인:
           - distance > threshold → 신규 (new): 그대로 추가
           - distance <= threshold → 유사 인사이트 존재
             - 같은 카테고리 + 같은 타입 → 보강 (augment): key_points 병합, 참여자 추가
             - 같은 카테고리 + 다른 타입 → 신규로 취급
             - 다른 카테고리 → 신규로 취급

        Returns:
            {
                "new": int, "augmented": int, "total_processed": int,
                "new_ids": [str], "augmented_ids": [str]
            }
        r   )new	augmentedtotal_processednew_idsaugmented_idsr   r   id categorytyper   r   title summary)top_kdistanceu.   신규 인사이트 추가: %s (distance=%.4f)r   r   u.   인사이트 보강: %s ← %s (distance=%.4f)uN   신규 인사이트 추가 (카테고리/타입 불일치): %s (distance=%.4f)u>   증분 업데이트 완료 — 신규: %d, 보강: %d, 총: %d)getstrr   countadd_insightsappendsearch_similarloggerinfo	get_by_id_get_full_insight_augment_insight_rebuild_graph)r   new_insightssimilarity_thresholdstatsall_current_insightsnew_insightnew_idnew_categorynew_typesimilartopr#   existing_idexisting_categoryexisting_metaexisting_typesame_category	same_typeexisting_fullr   s                       r   updatezIncrementalUpdater.update   sh   *  
 L ,.' L	K#$)$ __T2.F&??:r:L;??6267H {{  "a'((+7e!i ''/$++K8 kk00,s2[__YPR5SS 1 G
 ((+7e!i ''/$++K8!*C:H..((+7e!i ''/$++K8LfV^_ "$i$'GGJ$;! !% 5 5k B:GC))&"56R  !-0A A$5	 Y$($:$:;$VM $ 5 5m[ QIKK,,i[9+&!+&/*11+>(//	:KKH# 	 KK,,k];%LA%L)$++F3(//<KKh QL	^   45L%L+#$		
 r   c                   t        |      }t        |j                  dg             }t        |j                  dg             }|dd }t        |      }|D ])  }||vs|j	                  |       |j                  |       + ||d<   t        |j                  dg             }	t        |j                  dg             }
t        |	|
z        |d<   t        |j                  dg             }t        |j                  dg             }t        ||z        |d<   t        |j                  dg             }t        |j                  dg             }t        ||z        |d<   |j                  dd      }| j                  |      |d<   |S )uP  기존 인사이트에 새 정보를 보강.

        - key_points: 기존 + 새 것 (중복 제거)
        - participants: 합집합
        - related_topics: 합집합
        - tags: 합집합
        - summary: 기존 유지 (자동 수정 위험)
        - confidence: 보강 횟수에 따라 상향 (low→medium→high)
        
key_pointsNparticipantsrelated_topicstags
confidencer   )dictlistr$   setr(   add_upgrade_confidence)r   existingr4   r   existing_kpnew_kp	merged_kpseen_kpkpexisting_participantsnew_participantsexisting_rtnew_rtexisting_tagsnew_tagscurrent_confs                   r   r.   z#IncrementalUpdater._augment_insight   s|    N	 8<<b9:koolB78N	k" 	 B   $B	  #,	, !$HLL$D E{~rBC$()>AQ)Q$R	.! (,,'7<=[__%5r:;&*;+?&@	"# HLL45{vr23 !9:	&  ||L(;"&":":<"H	,r   c                    	 t         j                  |      }t        |dz   t        t               dz
        }t         |   S # t        $ r Y yw xY w)uH   confidence를 한 단계 상향한다: low → medium → high → high.r   r   )_CONFIDENCE_LEVELSindexminlen
ValueError)r   currentidxnew_idxs       r   rL   z&IncrementalUpdater._upgrade_confidence   sO    	$**73C#'3'9#:Q#>?G%g.. 		s   <? 	A
Ac                    |d|iS t        |      }|j                  dg        |j                  dg        |j                  dg        |j                  dg        |S )u   VectorStore 메타데이터로부터 insight dict를 재구성한다.

        VectorStore.get_by_id()가 리스트 필드를 자동 역직렬화하므로
        key_points, participants 등이 이미 list로 복원됨.
        r   rC   rD   rE   rF   )rH   
setdefault)r   
insight_idmetaresults       r   r-   z$IncrementalUpdater._get_full_insight   sc     <*%%d,+."-*B/&"%r   c                    	 | j                   j                  |       t        j                  dt	        |             y# t
        $ r }t        j                  d|       Y d}~yd}~ww xY w)u<   KnowledgeGraph를 갱신된 인사이트로 재빌드한다.u-   KnowledgeGraph 재빌드 완료: %d개 노드u#   KnowledgeGraph 재빌드 실패: %sN)r   build_from_insightsr*   r+   r^   	Exceptionwarning)r   updated_insightsexcs      r   r/   z!IncrementalUpdater._rebuild_graph   sT    	GKK++,<=KKGM]I^_ 	GNN@#FF	Gs   := 	A&A!!A&N)r   r   r   r   )g333333?)r0   
list[dict]r1   floatreturnrH   )rM   rH   r4   rH   rp   rH   )r`   r%   rp   r%   )re   r%   rf   zdict | Nonerp   rH   )rl   rn   rp   None)
__name__
__module____qualname____doc__r   rA   r.   rL   r-   r/    r   r   r   r      sI    a GK{&{>C{	{z-f"Gr   r   )ru   
__future__r   loggingknowledge_graphr   r   r   	getLoggerrr   r*   r[   r   rv   r   r   <module>r{      s<    J "  + %			8	$ / \G \Gr   