
    Xj                         d dl Z d dlmZ d dlmZ d dlmZ d dlmZ  ee	          Z
dZ G d d          Z e            ZdS )	    N)Any)OpenAI)settings)
get_loggerug  你是一个专业的知识图谱构建助手。请从以下文档中提取关键实体和关系。

文档标题：{title}
文档内容：
{content}

请按照以下JSON格式返回：
{{
  "entities": [
    {{
      "name": "实体名称",
      "type": "PERSON|ORG|LOCATION|CONCEPT|TERM|LAW|DATE|MONEY|PERCENT",
      "description": "简短描述（可选）",
      "salience": 0.0-1.0
    }}
  ],
  "relations": [
    {{
      "source": "实体1名称",
      "target": "实体2名称",
      "type": "RELATED_TO|PART_OF|INSTANCE_OF|DEFINED_BY|REGULATES",
      "confidence": 0.0-1.0
    }}
  ]
}}

要求：
1. 只提取重要实体（至少出现2次或具有关键意义）
2. 每个文档提取5-20个实体
3. 关系要有明确语义
4. salience表示实体在文档中的重要性（0-1）
5. confidence表示关系的置信度（0-1）
6. 实体类型说明：
   - PERSON: 人名
   - ORG: 组织机构
   - LOCATION: 地点
   - CONCEPT: 概念术语
   - TERM: 专业术语
   - LAW: 法律法规
   - DATE: 日期时间
   - MONEY: 金额
   - PERCENT: 百分比

请只返回JSON，不要包含其他文字。c                   D   e Zd Zd ZddZ	 ddedededeeeeee	f                  f         fd	Z
d
eeee	f                  deeee	f                  fdZdeeee	f                  deeee	f                  fdZ	 ddeeeef                  dedeeee	f                  fdZdS )EntityExtractorc                     d S N )selfs    K/lsinfo/ai/hellotax_ai/base_platform/app/services/graph/entity_extractor.py__init__zEntityExtractor.__init__   s        Nc           	         |r	 ddl m}m} |                    |                              |                              |j        dk    |j        |j        |j        |j	        
                    d                                                     }|rN|j        rGt          |j                                        |j        j        p|j        j                  }||j        fS n4# t$          $ r'}t&                              d|            Y d }~nd }~ww xY wt*          j        r3t          t*          j        t*          j                  }|t*          j        fS dS )Nr   )ModelModelProviderchat)api_keybase_urlz#Failed to get model from database: )NN)app.models.providerr   r   queryjoinfiltertypeenabled
configuredr   isnotfirstproviderr   get_api_keyr   default_base_urlcode	Exceptionloggerwarningr   OPENAI_API_KEYOPENAI_BASE_URLGRAPH_ENTITY_EXTRACTION_MODEL)r   
db_sessionr   r   modelclientes          r   _get_model_configz!EntityExtractor._get_model_config   su    	JJDDDDDDDD $$U++T-((V
f,%-%0%-33D99  UWW   0U^ 0# % : : < <!&!8![EN<[  F #EJ// J J JHQHHIIIIIIIIJ" 	DH$;hF^___FHBCC|s   CC 
D)DD  titlecontent
max_lengthreturnc           	         |                      |          \  }}|st                              d           g g dS t          |          |k    r+|d |         dz   }t                              d| d           	 t
                              ||          }|j        j        	                    |ddd	d
|d	gddddi          }|j
        d         j        j        }	t          j        |	          }
|                     |
                    dg                     }|                     |
                    dg                     }t                              dt          |           dt          |           d| d           ||dS # t          j        $ r,}t                              d|            g g dcY d }~S d }~wt(          $ r,}t                              d|            g g dcY d }~S d }~ww xY w)Nz<No model configuration available, skipping entity extraction)entities	relationsz...zContent truncated to z charactersr/   r0   systemuZ   你是一个专业的知识图谱构建助手，擅长从文本中提取实体和关系。)roler0   userg333333?i  r   json_object)r*   messagestemperature
max_tokensresponse_formatr   r4   r5   z
Extracted z entities and z relations from ''z&Failed to parse LLM response as JSON: zEntity extraction failed: )r-   r$   r%   leninfoENTITY_EXTRACTION_PROMPTformatr   completionscreatechoicesmessager0   jsonloads_validate_entitiesget_validate_relationsJSONDecodeErrorerrorr#   )r   r/   r0   r1   r)   r+   
model_namepromptresponseresult_textresultr4   r5   r,   s                 r   extract_entitiesz EntityExtractor.extract_entities4   sY    "33J??
 	5NNYZZZ "444w<<*$$kzk*U2GKKG
GGGHHH	5-445'4RRF{.55  !)#  $77  !' 7 6  H #*1-5=KZ,,F..vzz*b/I/IJJH00K1L1LMMIKKcS]]cc#i..cc[`ccc   !)yAAA# 	5 	5 	5LLE!EEFFF "44444444 	5 	5 	5LL9a99::: "44444444	5s1   9D	F G2!F93G29G2!G-'G2-G2r4   c           	         h d}g }|D ]}|                     d          r|                     d          s-|d                                         }||vrd}t          |                     dd                    }|t          j        k     r|                    |d                                         ||                     dd          |d	           |S )
N>	   LAWORGDATETERMMONEYPERSONCONCEPTPERCENTLOCATIONnamer   r\   salience      ?description )r_   r   rb   r`   rK   upperfloatr   GRAPH_MIN_ENTITY_CONFIDENCEappendstrip)r   r4   valid_types	validatedentityentity_typer`   s          r   rJ   z"EntityExtractor._validate_entities\   s    

 

 

 	 	 	F::f%% VZZ-?-?  ...00K+--'VZZ
C8899H(>>>"6N0022'#)::mR#@#@ (	     r   r5   c                    h d}g }|D ]}|                     d          r*|                     d          r|                     d          sB|d                                         }||vrd}t          |                     dd                    }|t          j        k     r|                    |d                                         |d                                         ||d           |S )	N>   PART_OF	REGULATES
DEFINED_BY
RELATED_TOINSTANCE_OFsourcetargetr   rr   
confidencera   )rt   ru   r   rv   rd   )r   r5   rj   rk   relationrel_typerv   s          r   rL   z#EntityExtractor._validate_relations|   s   YYY	! 	 	HLL**||H-- !V,,
 '--//H{**'x||L#>>??JH@@@&x06688&x06688$",	     r      	documentsmax_concurrentc                    g }|D ]y}|                      |                    dd          |                    dd                    }|                    |                    d          |d         |d         d           z|S )	Nr/   rc   r0   r6   idr4   r5   )document_idr4   r5   )rT   rK   rh   )r   rz   r{   resultsdocrS   s         r   extract_entities_batchz&EntityExtractor.extract_entities_batch   s      
	 
	C**gggr**CGGIr4J4J +  F NN#&774== &z 2!'!4     r   r
   )r.   N)ry   )__name__
__module____qualname__r   r-   strintdictlistr   rT   rJ   rL   r   r   r   r   r   r      s_            @ LP&5 &5&5#&&547&5	c4S#X''	(&5 &5 &5 &5P4S#X+? DcSVhDX    @T$sCx.-A d4PSUXPX>FZ    6 FG d38n-?B	d38n	     r   r   )rH   typingr   openair   
app.configr   common_loggingr   r   r$   rB   r   entity_extractorr   r   r   <module>r      s                       % % % % % %	H		 p U U U U U U U Up #?$$   r   