o
    ÏŠTj5  ã                   @  sZ   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ G d	d
„ d
ƒZdS )u(  RAG retriever: embed a query, search the FAISS index, return citable chunks.

The index and metadata are produced by scripts/build_index.py. Chunks below the configured
minimum similarity are dropped so the LLM never sees irrelevant context (which also keeps the
prompt short â€” an energy win).
é    )ÚannotationsN)ÚPathé   )ÚEmbedder)ÚRetrievedChunk)ÚConfigc                   @  s(   e Zd Zddd„Zdd„ Zddd„ZdS )Ú	RetrieverÚcfgr   c                 C  sb   || _ t| dd¡ƒ| _t| dd¡ƒ| _t|ƒ| _| d¡}|d | _	|d | _
d | _g | _d S )Nzretrieval.top_ké   zretrieval.min_scoreg333333Ó?zdata.kb_dirzindex.faisszindex.meta.json)r	   ÚintÚgetÚtop_kÚfloatÚ	min_scorer   ÚembedderZresolveÚ
index_pathÚ	meta_pathÚ_indexÚ_meta)Úselfr	   Zkb_dir© r   úsrc/agent/retriever.pyÚ__init__   s   




zRetriever.__init__c                 C  s�   | j d urd S dd l}| j ¡ r| j ¡ std| j› d�ƒ‚| t| jƒ¡| _ t| jddd��}t	 
|¡| _W d   ƒ d S 1 sAw   Y  d S )Nr   zRAG index not found at z#. Run scripts/build_index.py first.Úrzutf-8)Úencoding)r   Úfaissr   Úexistsr   ÚFileNotFoundErrorZ
read_indexÚstrÚopenÚjsonÚloadr   )r   r   Úfr   r   r   Ú_load   s   
ÿ"ÿzRetriever._loadÚqueryr   Úreturnúlist[RetrievedChunk]c           	   	   C  s    |   ¡  | j |¡ dd¡}| j || j¡\}}g }t|d |d ƒD ]*\}}|dk r,q#t|ƒ| j	k r4q#| j
t|ƒ }| t|d | dd¡t|ƒd�¡ q#|S )Nr   éÿÿÿÿr   ÚtextÚsourceÚunknown)r(   r)   Úscore)r#   r   Zembed_queryZreshaper   Úsearchr   Úzipr   r   r   r   Úappendr   r   )	r   r$   ZqvecZscoresZidxsÚresultsr+   ÚidxÚmr   r   r   r,   +   s   ÿzRetriever.searchN)r	   r   )r$   r   r%   r&   )Ú__name__Ú
__module__Ú__qualname__r   r#   r,   r   r   r   r   r      s    
r   )Ú__doc__Z
__future__r   r    Zpathlibr   Z
embeddingsr   Úpromptr   Zsettingsr   r   r   r   r   r   Ú<module>   s    