
    +#h                         d dl mZ d dlmZmZmZ d dlZd dlmZ 	 d dl	Z	d dl
mZ  G d dej                        Zy# e$ r	  ed      w xY w)	    )defaultdict)ListOptionalUnionN)dotdict)QdrantClientz]The 'qdrant' extra is required to use QdrantRM. Install it with `pip install dspy-ai[qdrant]`c                   t     e Zd ZdZ	 d	dededef fdZd
deee	e   f   de
e   dej                  fdZ xZS )QdrantRMaX  
    A retrieval module that uses Qdrant to return the top passages for a given query.

    Assumes that a Qdrant collection has been created and populated with the following payload:
        - document: The text of the passage

    Args:
        qdrant_collection_name (str): The name of the Qdrant collection.
        qdrant_client (QdrantClient): A QdrantClient instance.
        k (int, optional): The default number of top passages to retrieve. Defaults to 3.

    Examples:
        Below is a code snippet that shows how to use Qdrant as the default retriver:
        ```python
        from qdrant_client import QdrantClient

        llm = dspy.OpenAI(model="gpt-3.5-turbo")
        qdrant_client = QdrantClient()
        retriever_model = QdrantRM("my_collection_name", qdrant_client=qdrant_client)
        dspy.settings.configure(lm=llm, rm=retriever_model)
        ```

        Below is a code snippet that shows how to use Qdrant in the forward() function of a module
        ```python
        self.retrieve = QdrantRM("my_collection_name", qdrant_client=qdrant_client, k=num_passages)
        ```
    qdrant_collection_nameqdrant_clientkc                 B    || _         || _        t        |   |       y )N)r   )_qdrant_collection_name_qdrant_clientsuper__init__)selfr   r   r   	__class__s       T/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/retrieve/qdrant_rm.pyr   zQdrantRM.__init__-   s%     (>$+1    query_or_queriesreturnc                    t        |t              r|gn|}|D cg c]  }|s|	 }}||n| j                  } | j                  j                  | j
                  f||d|}t        t              }|D ]*  }|D ]#  }	||	j                  xx   |	j                  z  cc<   % , t        |j                         d d      d| }
|
D cg c]  \  }}t        d|i       }}}|S c c}w c c}}w )a\  Search with Qdrant for self.k top passages for query

        Args:
            query_or_queries (Union[str, List[str]]): The query or queries to search for.
            k (Optional[int]): The number of top passages to retrieve. Defaults to self.k.
        Returns:
            dspy.Prediction: An object containing the retrieved passages.
        N)query_textslimitc                     | d   S )N    )xs    r   <lambda>z"QdrantRM.forward.<locals>.<lambda>T   s
    1Q4 r   T)keyreverse	long_text)
isinstancestrr   r   query_batchr   r   floatdocumentscoresorteditemsr   )r   r   r   kwargsqueriesqbatch_resultspassages_scoresbatchresultsorted_passagespassage_passagess                 r   forwardzQdrantRM.forward8   s    *C0 ! 	
 &+1++ADFF7++77((Q6=QQIOQ &e," 	AE A0FLL@0A	A !!!#GGIK GVV
G['23VV' ," Ws   C!C!C&)   )N)__name__
__module____qualname____doc__r%   r   intr   r   r   r   dspy
Predictionr7   __classcell__)r   s   @r   r
   r
      sa    @ 		 #	 $	 		!c49n(= !(3- !dhdsds !r   r
   )collectionsr   typingr   r   r   r>   	dsp.utilsr   	fastembedr   r   ImportErrorRetriever
   r   r   r   <module>rG      sR    # ( (  *It}} I  
g s	   
< A
