在2025年的文章推荐场景下文本嵌入模型性能对比中,我们评估了本文嵌入模型在相似推荐上的表现。在文章发布之后的半年内,阿里云和谷歌相继推出了新一代的开源本文嵌入模型,分别是阿里云的qwen3-embedding和谷歌的embeddinggemma。最近gorse-cli工具也新增了文本嵌入模型的基准测试功能,本文将使用gorse-cli和playground数据集,对热门的开源本文嵌入模型进行一次全面的评测。
Gorse 推荐系统在 v0.5.2 到 v0.5.5 版本引入了可视化编排推荐流程和 大语言模型重排 两大新功能。本文将介绍如何结合这两项功能,使用可视化流程编辑器创建一个使用大语言模型重排器进行排序的推荐流程。
和那些常见的前端、后端以及如日中天的AI开源项目不同,项目的潜在用户很难相对直接地感受到一个开源推荐系统的作用。因此,Gorse 的作者打造了 GitRec,一个专门为 GitHub 仓库设计的推荐系统。这个项目既可以展示 Gorse 的基本能力,也能帮助他们在海量的开源项目中发现有趣且有用的仓库。
在长达一年半的开发后,Gorse v0.5 正式发布。本次发布包含破坏性更改,因此值得写一篇文章来介绍新特性和升级指南。
新特性
新的数据结构
-
用户的
Subscribe字段移除。在早期的设计中,Subscribe字段用于存储用户订阅的标签,但实际上并没有被使用。类似订阅这样的业务逻辑驱动的推荐建议使用外部推荐API来实现。 -
用户和物品的
Labels字段支持任意JSON对象。在此基础上,部分推荐算法可以指定使用的嵌套字段。例如在物物推荐算法中,可以指定使用Labels.embedding嵌入向量来计算物品相似度。 -
反馈新增
Value字段。Value字段用于表示反馈的强度,例如视频观看的百分比、商品的评分等。一方面,正负反馈可以根据Value字段设置阈值来区分;另一方面,未来的更新会结合Value字段作为权重更好地训练推荐模型。插入反馈时,可以选择累加(POST)Value字段,或者覆盖(PUT)原有的Value字段。
感谢进迭时空提供的Bianbu Cloud RISC-V云计算实例,Gorse目前已经完成对于RISC-V架构的支持。
下载方式
RISC-V版本的Gorse暂时没有提供Docker镜像,您可以选择:
- 在Release页面下载二进制文件压缩包gorse_linux_riscv64.zip
- 或者自行编译二进制文件或者Docker镜像
向量嵌入技术可以将图片、文字等信息转换为高维向量,从而能够在搜素推荐等场景下,通过计算向量之间的距离来计算图片、文本等原始内容之间的相关性。其中本文嵌入用到最多,市面上主要的AI服务商都会为他们的用户提供本文嵌入API,另外也有很多开源文本嵌入模型可供自行部署使用。目前主流的文本嵌入模型的评估标准为MTEB,但是MTEB并没有评估文本嵌入模型在推荐系统中的能力,而本文将尝试评估文本嵌入模型在推荐场景下的表现。
GitHub Actions为托管于GitHub上的项目提供了多种持续集成运行环境,包括三种操作系统Linux、macOS和Windows,以及两种架构AMD64和ARM64。这些环境对于大部分项目来说完全足够,但是RISC-V开发者会发现自己很难在GitHub Actions上运行RISC-V工作流。商业公司可以使用自托管(参考Supporting runners on 64bit RISC-V)或者服务商(RISC-V Runners和Cloud-V),但是对于个人开发者来说是一笔巨大的支出。
在大语言模型流行的当下,低精度浮点数对于开发者们不再陌生,而其中BF16是其中支持范围最广的低精度浮点格式。本文将介绍如何在Go语言中使用BF16。
BF16介绍
+---------+--------+--------+
| 1符号位 | 8指数位 | 7尾数位 |
+---------+--------+--------+
AVX512是英特尔发布的最新最新一代SIMD指令,能够在一个指令周期内对512位数据进行处理,相当于16个单精度浮点数或者8个双精度浮点数。Gorse推荐系统中的推荐模型训练和推理过程需要大量的向量计算工作,AVX512理论上能够带来一定的加速效果。然而比较遗憾的是,Go语言的编译器并不能自动生成使用SIMD指令的机器码。
MinIO曾经开源过一个将英特尔汇编转换为Go汇编的工具c2goasm。首先,将需要向量化的函数用C语言实现,通过Clang编译出包含SIMD指令的汇编。然后,由于Go汇编是支持AVX512的,将Intel汇编指令转换成Go汇编,即可通过汇编调用SIMD实现的函数。c2goasm的方案十分有效,然而项目已经将近4年没有更新,经过测试也无法处理AVX512指令。
能够编译成一个单独的二进制文件是Go语言的一大特色,避免了部署时繁琐的依赖管理。然而,如果项目包含了前端代码,在编译的时候就需要想办法将前端产物嵌入到Go二进制文件中。编译流程大致如下:
- 编译前端代码。
- 将前端生成物转换为Go嵌入文件。例如,rakyll/statik这个项目就能够将任何文件嵌入到Go源代码中。另外,Go语言目前提供了官方资源嵌入方案embed,可以在编译期间完成嵌入,免去步骤2。
- 构建Go代码。
