[docs]classOpenVINOReranker(BaseDocumentCompressor):""" OpenVINO rerank models. """ov_model:Any=None"""OpenVINO model object."""tokenizer:Any=None"""Tokenizer for embedding model."""model_name_or_path:str"""HuggingFace model id."""model_kwargs:Dict[str,Any]=Field(default_factory=dict)"""Keyword arguments passed to the model."""top_n:int=4"""return Top n texts."""def__init__(self,**kwargs:Any):super().__init__(**kwargs)try:fromoptimum.intel.openvinoimportOVModelForSequenceClassificationexceptImportErrorase:raiseImportError("Could not import optimum-intel python package. ""Please install it with: ""pip install -U 'optimum[openvino,nncf]'")frometry:fromhuggingface_hubimportHfApiexceptImportErrorase:raiseImportError("Could not import huggingface_hub python package. ""Please install it with: ""`pip install -U huggingface_hub`.")fromedefrequire_model_export(model_id:str,revision:Any=None,subfolder:Any=None)->bool:model_dir=Path(model_id)ifsubfolderisnotNone:model_dir=model_dir/subfolderifmodel_dir.is_dir():return(not(model_dir/"openvino_model.xml").exists()ornot(model_dir/"openvino_model.bin").exists())hf_api=HfApi()try:model_info=hf_api.model_info(model_id,revision=revisionor"main")normalized_subfolder=(NoneifsubfolderisNoneelsePath(subfolder).as_posix())model_files=[file.rfilenameforfileinmodel_info.siblingsifnormalized_subfolderisNoneorfile.rfilename.startswith(normalized_subfolder)]ov_model_path=("openvino_model.xml"ifsubfolderisNoneelsef"{normalized_subfolder}/openvino_model.xml")return(ov_model_pathnotinmodel_filesorov_model_path.replace(".xml",".bin")notinmodel_files)exceptException:returnTrueifrequire_model_export(self.model_name_or_path):# use remote modelself.ov_model=OVModelForSequenceClassification.from_pretrained(self.model_name_or_path,export=True,**self.model_kwargs)else:# use local modelself.ov_model=OVModelForSequenceClassification.from_pretrained(self.model_name_or_path,**self.model_kwargs)try:fromtransformersimportAutoTokenizerexceptImportErrorase:raiseImportError("Unable to import transformers, please install with ""`pip install -U transformers`.")fromeself.tokenizer=AutoTokenizer.from_pretrained(self.model_name_or_path)
[docs]defrerank(self,request:Any)->Any:query=request.querypassages=request.passagesquery_passage_pairs=[[query,passage["text"]]forpassageinpassages]length=self.ov_model.request.inputs[0].get_partial_shape()[1]iflength.is_dynamic:input_tensors=self.tokenizer(query_passage_pairs,padding=True,truncation=True,return_tensors="pt")else:input_tensors=self.tokenizer(query_passage_pairs,padding="max_length",max_length=length.get_length(),truncation=True,return_tensors="pt",)outputs=self.ov_model(**input_tensors,return_dict=True)ifoutputs[0].shape[1]>1:scores=outputs[0][:,1]else:scores=outputs[0].flatten()scores=list(1/(1+np.exp(-scores)))# Combine scores with passages, including metadataforscore,passageinzip(scores,passages):passage["score"]=score# Sort passages based on scorespassages.sort(key=lambdax:x["score"],reverse=True)returnpassages