|
| 1 | +# Copyright (C) 2024 Intel Corporation |
| 2 | +# SPDX-License-Identifier: Apache-2.0 |
| 3 | + |
| 4 | +from config import RANKER_MODEL |
| 5 | +from fastrag.rankers import IPEXBiEncoderSimilarityRanker |
| 6 | +from haystack import Document |
| 7 | +from langsmith import traceable |
| 8 | + |
| 9 | +from comps.cores.mega.micro_service import ServiceType, opea_microservices, register_microservice |
| 10 | +from comps.cores.proto.docarray import RerankedDoc, SearchedDoc, TextDoc |
| 11 | + |
| 12 | + |
| 13 | +@register_microservice( |
| 14 | + name="opea_service@local_reranking", |
| 15 | + service_type=ServiceType.RERANK, |
| 16 | + endpoint="/v1/reranking", |
| 17 | + host="0.0.0.0", |
| 18 | + port=8000, |
| 19 | + input_datatype=SearchedDoc, |
| 20 | + output_datatype=RerankedDoc, |
| 21 | +) |
| 22 | +@traceable(run_type="llm") |
| 23 | +def reranking(input: SearchedDoc) -> RerankedDoc: |
| 24 | + documents = [] |
| 25 | + for i, d in enumerate(input.retrieved_docs): |
| 26 | + documents.append(Document(content=d.text, id=(i + 1))) |
| 27 | + sorted_documents = reranker_model.run(input.initial_query, documents)["documents"] |
| 28 | + ranked_documents = [TextDoc(id=doc.id, text=doc.content) for doc in sorted_documents] |
| 29 | + res = RerankedDoc(initial_query=input.initial_query, reranked_docs=ranked_documents) |
| 30 | + return res |
| 31 | + |
| 32 | + |
| 33 | +if __name__ == "__main__": |
| 34 | + # Use an optimized quantized bi-encoder model for re-reranking |
| 35 | + reranker_model = IPEXBiEncoderSimilarityRanker(RANKER_MODEL) |
| 36 | + reranker_model.warm_up() |
| 37 | + |
| 38 | + opea_microservices["opea_service@local_reranking"].start() |
0 commit comments