排序
排序
Gorse 合并来自多个推荐器的推荐,并对它们进行排序以产生最终的推荐列表。
配置
type是排序器类型。支持的排序器是:query_template是大语言模型重排的查询模板。当type为llm时,此字段是必需的。模板支持以下变量:feedback是用户的历史反馈。
document_template是大语言模型重排的文档模板。当type为llm时,此字段是必需的。模板支持以下变量:items是要排序的推荐物品列表。
feedback 和 items 的类型定义。
feedback 的类型是:
type FeedbackItem struct {
FeedbackType string
ItemId string
IsHidden bool
Categories []string
Timestamp time.Time
Labels any
Comment string
}items 的类型是:
type Item struct {
ItemId string
IsHidden bool
Categories []string
Timestamp time.Time
Labels any
Comment string
}recommenders是其推荐被合并和排序的推荐器的名称。值应为以下之一:latest使用最新的物品推荐器。collaborative使用协同过滤推荐器。non-personalized/NAME使用名称为NAME的非个性化推荐器。item-to-item/NAME使用名称为NAME的物品到物品推荐器。user-to-user/NAME使用名称为NAME的用户到用户推荐器。
early_stopping.patience是在没有改进的情况下,因子分解机训练将停止的 epoch 数。默认为10。
示例
在演示项目 GitRec 中,因子分解机用于对来自多个推荐器的推荐物品进行排序:
- 来自最新物品推荐器的最新仓库。
- 协同过滤推荐。
- 来自非个性化推荐器的过去一周最受关注的仓库。
- 来自物品到物品推荐器的相似仓库。
- 来自用户到用户推荐器的相似用户的积极反馈中的仓库。
[recommend.ranker]
type = "fm"
recommenders = ["latest", "collaborative", "non-personalized/most_starred_weekly", "item-to-item/neighbors", "user-to-user/neighbors"]算法
因子分解机
与矩阵分解的学习算法不同,负反馈用于因子分解机训练。训练数据集由下式构成
输入向量 的维度是物品、用户、物品标签和用户标签数量的总和:。对于一对 , 中的每个元素定义为
输入向量 的预测输出是
其中必须估计的模型参数是:,,。而 是两个向量的点积。参数通过带有 SGD 的 logit 损失进行优化。损失函数是
每个参数的梯度是
大语言模型重排
最近的研究表明,大型语言模型(如 ChatGPT)可以通过提示词工程有效地执行推荐[2:1][3]。Gorse 利用这种能力,通过使用 LLM 根据用户反馈和物品信息对推荐物品进行排序。
在使用大语言模型重排器之前,必须在配置文件的 [recommend.ranker.reranker_api] 中配置 Reranker API。还必须在排序器配置中提供查询模板和文档模板。推荐 GitHub 仓库的一个示例模板如下:
- 查询模板
You are a GitHub repository recommender system. Given a user is interested in the following repositories:
{% for repo in feedback -%}
- {{ repo.Comment }}
{% endfor -%}
Please sort repositories by the user's interests.- 文档模板
{{ item.Comment | replace(",", " ") | replace("\n", " ") }}feedback 包含用户最近的反馈,items 包含要排序的推荐物品列表。feedback 的数量可以通过 recommend.context_size 控制。大语言模型重排器渲染查询模板和文档模板,然后将其发送到 Reranker API。然后解析响应以提取排序后的物品 ID 列表。
API 兼容性
Gorse 支持 Jina/Cohere 风格的文本重排 API。它通过 POST 请求发送 model、query 和字符串数组 documents,使用 Authorization: Bearer <auth_token> 认证,并从响应顶层的 results 数组中读取文档的 index 和 relevance_score。
以下接口兼容这一基础文本重排协议:
| 服务 | 重排接口地址 |
|---|---|
| Jina AI | https://api.jina.ai/v1/rerank |
| Cohere | https://api.cohere.com/v2/rerank |
| 阿里云百炼 | /compatible-api/v1/reranks |
| 硅基流动 | https://api.siliconflow.cn/v1/rerank |
| vLLM | http://localhost:8000/rerank |
| llama.cpp (llama-server) | http://localhost:8080/v1/rerank |
url 必须填写包含路径的完整重排接口地址,而不是 API 基础地址。例如,除了上面的查询和文档模板,还可以配置 Jina AI:
[recommend.ranker.reranker_api]
auth_token = "<JINA_API_KEY>"
model = "jina-reranker-v2-base-multilingual"
url = "https://api.jina.ai/v1/rerank"这里的兼容性仅指基础文本请求和排序响应,并不涵盖所有服务专属选项。Gorse 不发送多模态文档,也不发送重排指令、截断设置等服务专属参数。声明兼容 OpenAI 的服务不一定兼容这一重排协议;认证方式、请求字段或响应格式不同的接口需要通过适配器接入。
Rendle, Steffen. "Factorization machines." 2010 IEEE International conference on data mining. IEEE, 2010. ↩︎
Liu, Junling, et al. "Is chatgpt a good recommender? a preliminary study." arXiv preprint arXiv:2304.10149 (2023). ↩︎ ↩︎
Dai, Sunhao, et al. "Uncovering chatgpt’s capabilities in recommender systems." Proceedings of the 17th ACM Conference on Recommender Systems. 2023. ↩︎
