Metarank:实时个性化服务
文档 | 官网 | 社区 Slack | 博客 | 示范
什么是Metarank?
Metarank是一个开源排名服务。它可以帮助你建立个性化的语义/神经搜索和推荐系统。
如果你只是想快速入门,试试:
为什么选择Metarank?
通过Metarank,你可以让现有的搜索和推荐系统变得更智能:
- 将客户信号(如点击和购买)整合到排名中——并为最大化点击率(CTR)进行优化!
- 追踪访客资料,通过实时个性化使搜索结果适应用户操作。
- 使用LLM的双编码和交叉编码模式,让你的搜索更好地理解查询的真实含义。
Metarank非常快速:
- 针对重排序延迟进行了优化,即使是大结果集,它也可以在10-20毫秒内处理。查看基准测试。
- 作为无状态的云原生服务(通过Redis管理状态),它可以横向扩展并处理成千上万的RPS。详情请参阅Kubernetes部署指南。
节省你的开发时间:
- Metarank可以开箱即用地计算几十种典型的排名信号:点击率(CTR)、引用来源、用户代理、时间等——你不需要为大多数常见的排名因素编写自定义的临时代码。查看文档中支持的全部排名信号列表。
- 与许多可能的流处理系统集成以摄取访客信号:详情请参阅数据源。
你能用Metarank构建什么?
Metarank帮助你建立用于搜索和推荐的高级排名系统:
- 语义搜索:使用最先进的LLM使你的Elasticsearch/OpenSearch理解你的查询意图。
- 推荐:传统的协同过滤和新式的语义内容推荐。
- 学习排序:优化你的现有搜索。
内容
博客文章:
聚会和会议讲座:
- 构建一个开源在线学习排序引擎,Haystack EU 23,幻灯片
- 克服搜索和推荐系统中的位置和展示偏见,柏林Data Natives聚会,幻灯片
- 学习排序:深度、快速、精准——任选两个,DataTalks聚会,幻灯片
主要特征
演示
你可以在demo.metarank.ai上体验Metarank的演示:
演示本身和使用的数据都是开源的,你可以在GitHub仓库中获取训练事件和配置文件的副本。
一分钟了解Metarank
让我们展示如何在不到一分钟的时间内开始使用基于LambdaMART的重排序进行内容个性化:
- 准备数据:我们将从demo.metarank.ai获取数据集和配置文件。
- 以独立模式启动Metarank:它将导入数据,训练ML模型并启动API。
- 发送几个请求到API。
第一步:准备数据
我们将使用ranklens数据集,它在我们的演示中使用,所以只需下载数据文件
curl -O -L https://github.com/metarank/metarank/raw/master/src/test/resources/ranklens/events/events.jsonl.gz
第二步:准备配置文件
我们将再次使用演示中的配置文件。它使用内存存储,因此不需要其他依赖项。 <SOURCE_TEXT>
curl -O -L https://raw.githubusercontent.com/metarank/metarank/master/src/test/resources/ranklens/config.yml
第三步:启动 Metarank!
在最后一步中,我们将使用 Metarank 的 standalone
模式,该模式将训练和运行 API 合并为一个命令:
docker run -i -t -p 8080:8080 -v $(pwd):/opt/metarank metarank/metarank:latest standalone --config /opt/metarank/config.yml --data /opt/metarank/events.jsonl.gz
在 Metarank 启动并处理数据时,你会看到一些有用的输出。一旦完成,你可以向 localhost:8080
发送请求以获取个性化结果。
这里我们将通过点击其中一部电影并观察结果与几部电影进行互动。
首先,让我们看看 Metarank 在我们与其互动之前提供的初始输出
# 获取一些项目的初始排名
curl http://localhost:8080/rank/xgboost \
-d '{
"event": "ranking",
"id": "id1",
"items": [
{"id":"72998"}, {"id":"67197"}, {"id":"77561"},
{"id":"68358"}, {"id":"79132"}, {"id":"103228"},
{"id":"72378"}, {"id":"85131"}, {"id":"94864"},
{"id":"68791"}, {"id":"93363"}, {"id":"112623"}
],
"user": "alice",
"session": "alice1",
"timestamp": 1661431886711
}'
# {"item":"72998","score":0.9602446652021992},{"item":"79132","score":0.7819134441404151},{"item":"68358","score":0.33377910321385645},{"item":"112623","score":0.32591281190727805},{"item":"103228","score":0.31640256043322723},{"item":"77561","score":0.3040782705414116},{"item":"94864","score":0.17659007036183608},{"item":"72378","score":0.06164568676567339},{"item":"93363","score":0.058120639770243385},{"item":"68791","score":0.026919880032451306},{"item":"85131","score":-0.35794106000271037},{"item":"67197","score":-0.48735167237049154}
# 告诉 Metarank 在上一个请求中向用户展示了哪些项目及其顺序
# 可选地,我们可以包括由 Metarank 或你的内部检索系统计算的分数
curl http://localhost:8080/feedback \
-d '{
"event": "ranking",
"fields": [],
"id": "test-ranking",
"items": [
{"id":"72998","score":0.9602446652021992},{"id":"79132","score":0.7819134441404151},{"id":"68358","score":0.33377910321385645},
{"id":"112623","score":0.32591281190727805},{"id":"103228","score":0.31640256043322723},{"id":"77561","score":0.3040782705414116},
{"id":"94864","score":0.17659007036183608},{"id":"72378","score":0.06164568676567339},{"id":"93363","score":0.058120639770243385},
{"id":"68791","score":0.026919880032451306},{"id":"85131","score":-0.35794106000271037},{"id":"67197","score":-0.48735167237049154}
],
"user": "test2",
"session": "test2",
"timestamp": 1661431888711
}'
现在,让我们与项目
93363
互动
# 点击 id 为 93363 的项目
curl http://localhost:8080/feedback \
-d '{
"event": "interaction",
"type": "click",
"fields": [],
"id": "test-interaction",
"ranking": "test-ranking",
"item": "93363",
"user": "test",
"session": "test",
"timestamp": 1661431890711
}'
现在,Metarank 将对项目进行个性化处理,响应中的项目顺序将有所不同
# 个性化相同的项目列表
# 它们将按照 Metarank 返回的不同顺序返回
curl http://localhost:8080/rank/xgboost \
-d '{
"event": "ranking",
"fields": [],
"id": "test-personalized",
"items": [
{"id":"72998"}, {"id":"67197"}, {"id":"77561"},
{"id":"68358"}, {"id":"79132"}, {"id":"103228"},
{"id":"72378"}, {"id":"85131"}, {"id":"94864"},
{"id":"68791"}, {"id":"93363"}, {"id":"112623"}
],
"user": "test",
"session": "test",
"timestamp": 1661431892711
}'
# {"items":[{"item":"93363","score":2.2013986484185124},{"item":"72998","score":1.1542776301073876},{"item":"68358","score":0.9828904282341605},{"item":"112623","score":0.9521647429731446},{"item":"79132","score":0.9258841742518286},{"item":"77561","score":0.8990921381835769},{"item":"103228","score":0.8990921381835769},{"item":"94864","score":0.7131600718467729},{"item":"68791","score":0.624462038351694},{"item":"72378","score":0.5269765094008626},{"item":"85131","score":0.29198666089255343},{"item":"67197","score":0.16412780810560743}]}
有用的链接
接下来呢?
如果你有任何问题,请随时加入我们的 Slack!
许可证
本项目根据 Apache 2.0 许可证发布,具体内容请参见 许可证 文件。 </SOURCE_TEXT>