
    j&              	       H   d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	  e j
        e          ZdZddedeeeef                  fd	Zd
edefdZdee         dee         defdZddeee                  dedee         fdZddee         dedeee         ef         fdZdS )    N)Any)	query_all)	embeddingrerankRuizhiApiErroru(   盗窃|抢劫|抢夺|诈骗|敲诈勒索   monthsreturnc                 n    dt          |            d}t          |dt          i          }d |D             S )Na  
        SELECT DISTINCT ON (a."ajxx_ajbh")
               a."ajxx_ajbh"    AS ajbh,
               a."ajxx_ajmc"    AS ajmc,
               a."ajxx_ay"      AS ay,
               a."ajxx_fasj"    AS fasj,
               a."ajxx_cbdw_mc" AS cbdw
        FROM "ywdata"."zq_zfba_ajxx" a
        JOIN "ywdata"."zq_zfba_xyrxx" x
          ON x."ajxx_join_ajxx_ajbh" = a."ajxx_ajbh"
        WHERE a."ajxx_ay" ~ %(pattern)s
          AND a."ajxx_fasj" IS NOT NULL
          AND a."ajxx_fasj" >= CURRENT_DATE - INTERVAL 'a   months'
          AND NULLIF(BTRIM(COALESCE(x."xyrxx_sfzh", '')), '') IS NOT NULL
          AND LENGTH(x."xyrxx_sfzh") = 18
          AND DATE_PART('year',
                AGE(a."ajxx_fasj"::date,
                    TO_DATE(SUBSTR(x."xyrxx_sfzh", 7, 8), 'YYYYMMDD'))
              ) < 18
          AND COALESCE(NULLIF(x."xyrxx_isdel_dm", ''), '0')::integer = 0
        ORDER BY a."ajxx_ajbh", a."ajxx_fasj" DESC
        LIMIT 30
    patternc                 ,    g | ]}t          |          S  )dict).0rs     J/home/longshao/multi-rider-rag/modules/ai_analyst/services/case_matcher.py
<listcomp>z-fetch_recent_qincai_cases.<locals>.<listcomp>&   s    """DGG"""    )intr   QINCAI_PATTERN)r	   sqlrowss      r   fetch_recent_qincai_casesr      sM     :=V  C. S9n566D""T""""r   cc                    g }|                      d          r|                    | d                    |                      d          r|                    | d                    |                      d          r|                    d| d                     |                      d          r|                    d| d                     d                    |          pdS )	Nayajmcfasju   时间:cbdwu   单位: u   未知案件)getappendjoin)r   partss     r   
_case_textr%   )   s    EuuT{{ QtWuuV}}  QvYuuV}} ,*qy**+++uuV}} ,*qy**+++88E??,n,r   abc                 (   t          d t          | |          D                       }t          j        t          d | D                                 }t          j        t          d |D                                 }|dk    s|dk    rdS |||z  z  S )Nc              3   &   K   | ]\  }}||z  V  d S Nr   )r   xys      r   	<genexpr>z%_cosine_similarity.<locals>.<genexpr>7   s*      **1a!e******r   c              3       K   | ]	}||z  V  
d S r*   r   r   r+   s     r   r-   z%_cosine_similarity.<locals>.<genexpr>8   &      ,,Q1q5,,,,,,r   c              3       K   | ]	}||z  V  
d S r*   r   r/   s     r   r-   z%_cosine_similarity.<locals>.<genexpr>9   r0   r   r   g        )sumzipmathsqrt)r&   r'   dotnorm_anorm_bs        r   _cosine_similarityr9   6   s    
**Aq		***
*
*CYs,,!,,,,,--FYs,,!,,,,,--F{{fkks&6/""r   333333?vectors	thresholdc                    g }t          |           }t          |          D ]S}t          |dz   |          D ]=}t          | |         | |                   }||k    r|                    |||d           >T|                    d d           |S )N   )ijscorec                     | d         S )NrA   r   )ps    r   <lambda>z$compute_similarity.<locals>.<lambda>G   s
    QwZ r   T)keyreverse)lenranger9   r"   sort)r;   r<   pairsnr?   r@   rA   s          r   compute_similarityrL   ?   s    EGA1XX ? ?q1ua 	? 	?A&wqz71:>>E	!!11u==>>>	? 
JJ''J666Lr   
   casestop_kc           
        	 t          |           dk     rg dfS d | D             		 t          	          }n6# t          $ r)}t                              d|           g dfcY d}~S d}~ww xY wt          |d          }|rt          |          dk    r	|d         d	                  }t          	fd
|dd         D             	fd|dd         D             z            }	 t          ||t          |t          |                              }|D ]/}|	                    d|	                    dd                    |d<   0n# t          $ r Y nw xY w|d|         dfS )zReturn (similar_pairs, used_embedding).

    When the embedding API is unavailable (e.g. 401), returns an empty list
    with ``used_embedding=False`` so the caller can fall back to pure-LLM
    analysis.
       Fc                 ,    g | ]}t          |          S r   )r%   )r   r   s     r   r   z*find_serial_candidates.<locals>.<listcomp>U   s    ***qZ]]***r   z<Embedding API unavailable (%s), falling back to LLM analysisNg?)r<   r   r?   c                 ,    h | ]}|d                   S )r@   r   r   rC   textss     r   	<setcomp>z)find_serial_candidates.<locals>.<setcomp>b   s!    ///qU1S6]///r      c                 ,    h | ]}|d                   S )r?   r   rT   s     r   rV   z)find_serial_candidates.<locals>.<setcomp>c   s!    111uQsV}111r   )rO   relevance_scorerA   rerank_scoreT)
rG   r   r   logwarningrL   listr   minr!   )
rN   rO   r;   excrJ   anchor
candidatesrerankedr   rU   s
            @r   find_serial_candidatesrc   K   s    5zzA~~5y**E***EE""   RTWXXX5y w$777E UauQx}%////E#2#J///1111eCRCj1112
 

	
#eS__*E*E  H  P P$%EE*;QUU7A=N=N$O$O.!!P 	 	 	D	 %=$s.   6 
A) A$A)$A)!AE 
EE)r   )r:   )rM   )loggingr4   typingr   shared.db.kingbaser   shared.ai.ruizhi_clientr   r   r   	getLogger__name__r[   r   r   r]   r   strr   r%   floatr9   rL   tupleboolrc   r   r   r   <module>rn      s~           ( ( ( ( ( ( E E E E E E E E E Eg!!;# #c #$tCH~2F # # # #8
-$ 
-3 
- 
- 
- 
-#$u+ #$u+ #% # # # #	 	T%[ 1 	e 	dSWj 	 	 	 	# #$t* #S #%T
TXHXBY # # # # # #r   