langchain 在CrossEncoderReranker中,分数传递的排序不正确,

qzlgjiam  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(39)

检查其他资源

  • 为这个问题添加了一个非常描述性的标题。
  • 使用集成搜索在LangChain文档中进行了搜索。
  • 使用GitHub搜索查找类似的问题,但没有找到。
  • 我确信这是LangChain中的一个bug,而不是我的代码。
  • 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。

示例代码

from langchain_community.cross_encoders import HuggingFaceCrossEncoder

re_rank_model_name = "amberoad/bert-multilingual-passage-reranking-msmarco"
model_kwargs = {
                'device': device, 
                'trust_remote_code':True,
                }
re_rank_model = HuggingFaceCrossEncoder(model_name=re_rank_model_name, 
                                   model_kwargs = model_kwargs,
                                   )

from langchain.retrievers.document_compressors import CrossEncoderReranker
compressor = CrossEncoderReranker(model=re_rank_model, top_n=3)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever,
)

错误信息和堆栈跟踪(如果适用)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File */lib/python3.10/site-packages/langchain_core/retrievers.py:194, in BaseRetriever.invoke(self, input, config, **kwargs)
    175 """Invoke the retriever to get relevant documents.
176 
177 Main entry point for synchronous retriever invocations.
(...)
191     retriever.invoke("query")
192 """
    193 config = ensure_config(config)
--> 194 return self.get_relevant_documents(
    195     input,
    196     callbacks=config.get("callbacks"),
    197     tags=config.get("tags"),
    198     metadata=config.get("metadata"),
    199     run_name=config.get("run_name"),
    200     **kwargs,
    201 )

File *lib/python3.10/site-packages/langchain_core/_api/deprecation.py:148, in deprecated.<locals>.deprecate.<locals>.warning_emitting_wrapper(*args, **kwargs)
    146     warned = True
    147     emit_warning()
...
     47 docs_with_scores = list(zip(documents, scores))
---> 48 result = sorted(docs_with_scores, key=operator.itemgetter(1), reverse=True)
     49 return [doc for doc, _ in result[: self.top_n]]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

描述

排序时分数传递不正确。分类器为查询和文档之间的不相似性和相似性返回logits。您需要添加一个异常,如果模型产生两个分数,则取中间值,否则保持原样。
这是一个bug吗?

系统信息

系统信息

操作系统:Linux
操作系统版本:#172 -Ubuntu SMP Fri Jul 7 16:10:02 UTC 2023
Python版本:3.10.14(main,Apr 6 2024,18:45:05) [GCC 9.4.0]

软件包信息

langchain_core:0.2.3
langchain:0.2.1
langchain_community:0.2.1
langsmith:0.1.69
langchain_chroma:0.1.1
langchain_openai:0.1.8
langchain_text_splitters:0.2.0
langchainhub:0.1.17

wfveoks0

wfveoks01#

一些模型,例如amberoad/bert-multilingual-passage-reranking-msmarco,提供成对的分数:<不相关的分数,相关的分数>。然而,当前的HuggingFaceCrossEncoder没有考虑到这对分数。为了解决这个问题,我创建了一个拉取请求,修改编码器只考虑相关的分数。
请参考这条评论以获取更多详细信息。

7z5jn7bk

7z5jn7bk3#

请保持这个问题打开,直到PR被合并。

相关问题