mixedbread-ai/ Alibaba-NLP / OpenAI GPTã«ãããªã©ã³ãã³ã°ãå®è£
ãµã³ãã«ä»ãã ã¯ããã« RAGãã¯ãããšããçŸä»£ã®æ
å ±æ€çŽ¢ã·ã¹ãã ã§ã¯ãããªã©ã³ã«ãŒïŒRerankerïŒããšåŒã°ããä»çµã¿ã䜿ãããããšããããŸãã æ€çŽ¢åè£ãåã«ããŒã¯ãŒããããããã¯ãã«æ€çŽ¢ã§ããã¯ã¢ããããã ãã§ãªããããã«é«ç²ŸåºŠãªã¢ãã«(ïŒãªã©ã³ã«ãŒ)ã§åã¹ã³ã¢ãªã³ã°ïŒåã©ã³ãã³ã°ïŒããããšã§ããŠãŒã¶ãŒãæ¬åœã«æ±ããŠããæ
å ±ãäžäœã«è¡šç€ºã§ããŸãã æ¬èšäºã§ã¯ãçè
ãå®éã«æ¥åäžã®æ€èšŒäœæ¥ã§å©çšããæ¬¡ã®3ã€ã®ã¢ãã«: mixedbread-ai/mxbai-rerank-v2 Alibaba-NLP/gte-multilingual OpenAIã®GPTïŒChatã¢ãã«ããªã©ã³ã«ãŒãšããŠæŽ»çšïŒ ã顿ã«ãç¹åŸŽãå®è£
äŸã玹ä»ããŸãã mixedbread-ai/ Alibaba-NLP / OpenAI GPTã«ãããªã©ã³ãã³ã°ãå®è£
ãµã³ãã«ä»ãã ã¯ããã« 1. ãªã©ã³ã«ãŒãšã¯ïŒ 2. åãªã©ã³ã«ãŒã¢ãã«ã®ç¹åŸŽ mixedbread-ai/mxbai-rerank-v2 Alibaba-NLP/gte-multilingual OpenAI GPTïŒChatã¢ãã«ããªã©ã³ã«ãŒãšããŠå©çšïŒ 3. å®è£
ãµã³ãã« mixedbread-ai/mxbai-rerank-v2 ã䜿ã£ããªã©ã³ã«ãŒ Alibaba-NLP/gte-multilingual ã䜿ã£ããªã©ã³ã«ãŒ OpenAI GPTïŒgpt-4.1-miniïŒã䜿ã£ããªã©ã³ã«ãŒ ãªã©ã³ãã³ã°ã®å®è¡ 4. ãŸãšã åèãªã³ã¯ 1. ãªã©ã³ã«ãŒãšã¯ïŒ ãªã©ã³ã«ãŒã¯ãæ
å ±æ€çŽ¢ã® ãç¬¬äºæ®µéç®ã ãæ
ãä»çµã¿ã§ãã äžæ¬¡æ€çŽ¢ ïŒ BM25ãªã©ã®ããŒã¯ãŒãæ€çŽ¢ããã¯ãã«æ€çŽ¢ã§åè£ææžã倿°ããã¯ã¢ãã ãªã©ã³ã«ãŒã«ããåã©ã³ãã³ã° ïŒ é«åºŠãªæå³çè§£ãèšèªèœåãæã€ã¢ãã«ã§ãäžæ¬¡æ€çŽ¢çµæãåè©äŸ¡ããŠé äœä»ã ãªã©ã³ã«ãŒã¯ãFAQæ€çŽ¢ããã¬ããžããŒã¹ã®ãã£ããããããªã©ããŠãŒã¶ãŒäœéšã®éµãšãªãéšåã§å©çšãããŠããŸãã 2. åãªã©ã³ã«ãŒã¢ãã«ã®ç¹åŸŽ mixedbread-ai/mxbai-rerank-v2 2025幎3æã«å
¬éãããæ¯èŒçæ°ããã®ã¢ãã« Apache 2.0ã§å
¬éãããŠãããåçšå©çšãå¯èœ 軜éã¢ãã«ãããCPUç°å¢ã§ã䜿ãããã å°çšã®ã©ã€ãã©ãª(mxbai_rerank)ããæè»œã«å©çšã§ãã Alibaba-NLP/gte-multilingual äžåœã®å€§äŒæ¥Alibaba補 Hugging Faceã§ã¢ãã«ãå
¬éãããŠãããtransformersã©ã€ãã©ãªããç°¡åã«å©çšã§ãã Apache 2.0ã§å
¬éãããŠãããåçšå©çšãå¯èœ 70èšèªä»¥äžã«å¯Ÿå¿ããŠãã(ããã)ãâ» æ¥æ¬èªãšè±èªã«å¯Ÿå¿ããŠããããšã¯ç¢ºèªæž OpenAI GPTïŒChatã¢ãã«ããªã©ã³ã«ãŒãšããŠå©çšïŒ å°çšã®ã©ã€ãã©ãª(opeaai)ãlangchainããç°¡åã«å©çšã§ãã ããã³ããã«ãã£ãŠæåãæè»ã«èª¿æŽã§ãã 髿§èœã¢ãã«ã䜿ãå Žåãé«ã粟床ãæåŸ
ã§ãã APIå©çšã®ããéçšã³ã¹ãã»ã¬ã€ãã³ã·ã«ã¯æ³šæ 3. å®è£
ãµã³ãã« äžèš3ã€ã®ã¢ãã«ãå®è£
ããŠã¿ãŸãã ããããã®ã¢ãã«ã®å®è£
ã®äºææ§ãä¿ã€ããã«æåã«ããŒã¿ã¯ã©ã¹ãšãªã©ã³ã«ãŒã®æœè±¡ã¯ã©ã¹ãå®è£
ããŠãããŸãã from abc import ABC, abstractmethod from pydantic import BaseModel, Field class RankResult (BaseModel): index: int score: float document: str = "" class BaseReranker (ABC): @ abstractmethod def rerank (self): pass mixedbread-ai/mxbai-rerank-v2 ã䜿ã£ããªã©ã³ã«ãŒ from mxbai_rerank import MxbaiRerankV2 class MxbaiReranker (BaseReranker): def __init__ ( self, model_name: str ã=ã "mixedbread-ai/mxbai-rerank-base-v2" , ): self.model = MxbaiRerankV2(model_name, device= "cpu" ) def rerank ( self, query: str , documents: list [ str ], return_documents: bool ã=ã True , top_n: int ã=ã 3 , ) -> list [RankResult]: results = self.model.rank( query, documents, return_documents=return_documents, top_k=top_n, ) return results mxbai_reranker = MxbaiReranker() Alibaba-NLP/gte-multilingual ã䜿ã£ããªã©ã³ã«ãŒ import torch from transformers import AutoModelForSequenceClassification, AutoTokenizer class AlibabaReranker (BaseReranker): def __init__ ( self, model_name: str = "Alibaba-NLP/gte-multilingual-reranker-base" ): self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModelForSequenceClassification.from_pretrained( model_name, trust_remote_code= True , torch_dtype=torch.float32, ) self.model = self.model.to( "cpu" ) self.model.eval() def rerank ( self, query: str , documents: list [ str ], return_documents: bool = True , top_n: int = 3 , ) -> list [RankResult]: pairs = [[query, doc] for doc in documents] with torch.no_grad(): inputs = self.tokenizer(pairs, padding= True , truncation= True , return_tensors= 'pt' , max_length= 512 ).to( "cpu" ) scores = self.model(**inputs, return_dict= True ).logits.view(- 1 , ).float() index = 0 rank_results = [] for p, s in zip (pairs, scores): rank_results.append( RankResult( index=index, score=s.item(), document=p[ 1 ] if return_documents else "" , ) ) index += 1 rank_results.sort(key= lambda x: x.score, reverse= True ) return rank_results[:top_n] alibaba_reranker = AlibabaReranker() OpenAI GPTïŒgpt-4.1-miniïŒã䜿ã£ããªã©ã³ã«ãŒ import os from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI API_KEY = "XXXXX" os.environ[ "OPENAI_API_KEY" ] = API_KEY RERANK_PROMPT = """queryãšãªãããã¹ããšè€æ°ã®ããã¹ããå«ãtext_listãäžããããŸãã text_listã®äžã®ããã¹ããšqueryã®å
å®¹ãæ¯èŒããqueryã®å
容ãšè¿ãé ã«text_listã®ããã¹ããäžŠã¹æ¿ããªããã ***æ¡ä»¶*** 1. queryãšã®å
容ãè¿ãé ã«äžŠã¹ãããã¹ãã®ã€ã³ããã¯ã¹ãšã¹ã³ã¢ã®ãªã¹ããè¿ãããšã 2. ã¹ã³ã¢ã¯0.0ãã1.0ã®ç¯å²ã§ãqueryãšã®å
容ãè¿ãã»ã©é«ããªãããã«ããããšã """ class RerankedIndex (BaseModel): index: list [ int ] = Field( default=[], description= "queryãšã®å
容ãè¿ãé ã«äžŠã¹ãããã¹ãã®ã€ã³ããã¯ã¹ã®ãªã¹ãã" ) score: list [ float ] = Field( default=[], description= "queryãšã®å
容ãè¿ãé ã«äžŠã¹ãããã¹ãã®ã¹ã³ã¢ã®ãªã¹ãã" ) class OpenaiReranker (BaseReranker): def ã__init__( self, model_name: str = "gpt-4.1-mini" , ): self.model = ChatOpenAI( model=model_name, max_tokens= 1000 , # temperature=0.0, top_p= 0.01 , seed= 42 , ) self.prompt = ChatPromptTemplate.from_messages( [ ( "system" , RERANK_PROMPT), ( "human" , "query: '{query}' \n text_list: '{text_list}'" ), ]) self.chain = self.prompt | self.model.with_structured_output(RerankedIndex) def _rerank_text ( self, query: str , text_list: str , ) -> int : res = self.chain.invoke({ "query" : query, "text_list" : text_list}) return res def rerank ( self, query: str , documents: list [ str ], return_documents: bool = True , top_n: int = 3 , ) -> list [RankResult]: text_list = [f "{i}. {doc}" for i, doc in enumerate (documents)] text_list = " \n " .join(text_list) res = _rerank_text(query, text_list) index_score_pairs = list ( zip (res.index, res.score)) rank_results = [] for idx, score in index_score_pairs: rank_results.append( RankResult( index=idx, score=score, document=documents[idx] if return_documents else "" , ) ) rank_results.sort(key= lambda x: x.score, reverse= True ) return rank_results[:top_n] openai_reranker = OpenaiReranker() ãªã©ã³ãã³ã°ã®å®è¡ å®è¡äŸ test_query = "Give me the first document." test_documents = [ "This is the first document." , "This is the second document." , "This is the third document." , "This is the fourth document." , "This is the fifth document." , ] res_mxbai = mxbai_reranker.rerank(test_query, test_documents, return_documents= True , top_n= 3 ) res_gte = alibaba_reranker.rerank(test_query, test_documents, return_documents= True , top_n= 3 ) res_openai = openai_reranker.rerank(test_query, test_documents, return_documents= True , top_n= 3 ) 4. ãŸãšã çè
ã®æ€èšŒã«ãããŠãªã©ã³ãã³ã°ã®ç²ŸåºŠã¯ã openai (gpt-4.1-mini) > mxbai > alibaba ãšãã£ãçµæã«ãªããŸããã (粟床ã¯å¯Ÿè±¡ã®ããã¹ã矀ã®å
容ã«ãããšããã倧ãããšæããŸãã...)ã å®è¡ã³ã¹ããæãé«ãopenaiã䜿ã£ããªã©ã³ã«ãŒã§æãè¯ãçµæãåŸãããã®ã¯åŠ¥åœãªããã«æããŸãã ãªã©ã³ã«ãŒã¯æ€çŽ¢äœéšã®åäžã«åœ¹ç«ã¡ãŸããåã¢ãã«ã®ç¹æ§ããããã¯ãèŠä»¶ã«å¿ããŠãæé©ãªéžæãæ€èšããŠã¿ãŠãã ããïŒ åèãªã³ã¯ mixedbread-ai/mxbai-rerank-base-v2 (HuggingFace) Alibaba-NLP/gte-multilingual-reranker-base (HuggingFace)