要在 Haystack 中实现自定义排名函数,您可以创建一个自定义组件,根据您的特定标准对文档进行评分和重新排序。 Haystack 的模块化架构允许您替换或扩展其内置排名逻辑。 首先,定义一个继承自 BaseRanker
并实现 predict
方法的类,该方法计算文档相对于查询的分数。 此方法接收查询字符串和 Document
对象列表,并返回按相关性排序的评分文档列表。 您可以在此方法中访问文档内容、元数据或嵌入,以计算自定义分数。
例如,假设您想按文本相似度和发布日期的组合对文档进行排名。 您可以创建一个 CustomRanker
类,该类使用 BM25 分数(来自检索器)和文档元数据中的时间衰减因子。 这是一个简化的代码片段
from haystack.nodes import BaseRanker
from datetime import datetime
class CustomRanker(BaseRanker):
def predict(self, query, documents, time_decay_factor=0.1):
for doc in documents:
# Assume BM25 score is stored in doc.score
time_score = (datetime.now() - doc.meta["publish_date"]).days * time_decay_factor
doc.score = doc.score - time_score # Penalize older documents
return sorted(documents, key=lambda x: x.score, reverse=True)
此示例通过减去与文档年龄成正比的值来修改文档分数,在保留相关性的同时优先考虑较新的内容。 您还可以在此处集成机器学习模型、外部 API 或特定于领域的启发式方法。
要使用自定义排名器,请在检索器之后将其添加到您的 Haystack 管道中。 例如
pipeline = Pipeline()
pipeline.add_node(component=retriever, name="Retriever", inputs=["Query"])
pipeline.add_node(component=CustomRanker(), name="Ranker", inputs=["Retriever"])
实现后,使用不同的查询测试排名函数,以确保其行为符合预期。 您可以使用 precision@k 等指标将结果与基线排名器进行比较,或进行 A/B 测试。 如果性能缓慢,请考虑优化计算(例如,预计算元数据分数)或使用批处理。 自定义排名函数允许您根据业务规则、用户偏好或超出通用相关性的特定于领域的信号来定制搜索结果。