a
    h}                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
Z
d dlZd dlmZ ee jZed ZeddZd	d
ddZG dd dZdddddddZdS )    )annotationsN)Path)ListDictAny)SentenceTransformerZindexesZEMB_MODEL_NAMEz&sentence-transformers/all-MiniLM-L6-v2intcourseidc                 C  s   t d|  d }t d|  d }| r0| sFtd|  d| dtt|}|jddd	}t|}W d    n1 s0    Y  |	d
g }||fS )NZcourse_z.faissz
.meta.jsonu   Índice do curso u    não encontrado ()rzutf-8)encodingchunks)
	INDEX_DIRexistsFileNotFoundErrorfaissZ
read_indexstropenjsonloadget)r
   Zidx_path	meta_pathindexfZmetar    r   /var/www/html/assistant/rag.py_load_index   s    (r   c                   @  s>   e Zd ZddddZddddd	ZdddddddZdS )	Retrieverr   r	   c                 C  s$   || _ tt| _t|\| _| _d S )N)r
   r   	EMB_MODELmodelr   r   r   )selfr
   r   r   r   __init__    s    
zRetriever.__init__z	List[str]z
np.ndarray)textsreturnc                 C  s2   | j j|dd}t|tr(tj|dd}|dS )NT)Znormalize_embeddingsZfloat32)Zdtype)r    encode
isinstancelistnpZarrayZastype)r!   r#   Zvecsr   r   r   _embed%   s    
zRetriever._embed   r   List[Dict[str, Any]])querykr$   c                 C  s   |  |g}| j|t|t| j\}}t|r>|d  ng }t|rV|d  ng }g }tt||D ]z\}\}}	|dk sl|t| jkrql| j| }
|	|d t
|	ttfrtd|	 nd |
dd|
dd|
ddd ql|S )	Nr      g      ?text sourceurl)rankZscorer/   r1   r2   )r)   r   searchminlenr   tolist	enumeratezipappendr&   r   floatr   )r!   r,   r-   ZqvDIZoutr3   ZidxZdistcr   r   r   r4   +   s"    




zRetriever.searchN)r*   )__name__
__module____qualname__r"   r)   r4   r   r   r   r   r      s   r   r   r+   )course_namequestionpassagesr$   c                 C  s~   g }t |dD ]D\}}|d| d|dd d|dd d|d	d d	 qd| }d
|  d| d| d}|S )Nr.   [z] r1   r0    r2   
r/   zCurso: z!

Contexto (trechos relevantes):
z

Pergunta: u{   

Responda de forma objetiva, usando apenas o contexto acima. Se faltar informação, explique o que falta e não invente.
)r8   r:   r   joinstrip)rB   rC   rD   Z	ctx_linesipZcontextpromptr   r   r   build_prompt?   s    >rM   )Z
__future__r   osr   pathlibr   Ztypingr   r   r   r   Znumpyr(   Zsentence_transformersr   __file__ZresolveparentZBASE_DIRr   getenvr   r   r   rM   r   r   r   r   <module>   s    