问题验证
- 我已经在文档和discord上搜索过答案。
问题
你好,我有一个(典型的)用例,其中向量索引基本上可以正常工作,但有时我提供一个与块完全匹配的查询,但我没有得到那个精确匹配。为了解决这个问题,我实现了一个QueryFusionRetriever,它将bm25(0.4)与vector(0.6)结合起来。当我单独尝试使用bm25时,我发现它仍然没有得到我想要的所有精确匹配。我读到降低k1
会使它对查询中更常见术语的出现不太偏向,但我在示例化BM25Retriever.from_defaults(nodes=nodes, ...)
时看不到如何改变k1
。
问题:
- 有没有办法尝试
k1
? - 你是否建议一个可以在节点上工作的检索引擎,以及一个更倾向于文本匹配而不是频率的检索引擎,而不仅仅是BM25?
谢谢
这是一个示例文档(样本):
###
Q: What is foo?
A: Foo stands for something funny
###
Q: Who are you?
A: I am all of us
###
<Many more Q/A where foo occurs>
在使用BM25时,当我使用retrieve("What is foo?")
时,它会偏向于其他Q/A,这些Q/A在foo的出现次数上更多,而我希望它返回得分更高的顶级Q/A。
1条答案
按热度按时间rpppsulh1#
rank_bm25
库来实验 BM25 中的k1
参数,而 LlamaIndex 的BM25Retriever
类依赖于该库。以下是如何修改BM25Retriever
类以包含k1
参数的示例:from rank_bm25 import BM25Okapi
class BM25Retriever(BaseRetriever):
def init(
self,
nodes: List[BaseNode],
tokenizer: Optional[Callable[[str], List[str]]],
similarity_top_k: int = DEFAULT_SIMILARITY_TOP_K,
k1: float = 1.5, # Default value for k1
callback_manager: Optional[CallbackManager] = None,
objects: Optional[List[IndexNode]] = None,
object_map: Optional[dict] = None,
verbose: bool = False,
) -> None:
try:
from rank_bm25 import BM25Okapi
except ImportError:
raise ImportError("Please install rank_bm25: pip install rank-bm25")
VectorStoreIndex
类。此外,你还可以使用
MetadataFilters
类处理VectorStoreIndex
中的精确匹配。以下是一个示例:这种配置确保查询通过使用
TEXT_SEARCH
模式并应用精确匹配过滤器来优先考虑精确匹配。