当前位置: 首页 > news >正文

用 PHP 玩向量数据库:一个从小说网站开始的小尝试

有时候折腾东西的起因特别随意。比如我这次,就是从一个“带点颜色”的小说网站开始的。网站里全是几万字的短文,看着还不错,但限制也不少:每天只能看几篇,而且没有任何搜索功能。

于是我写了个爬虫,把所有小说都抓了下来。数据一下子堆到本地,看似自由了,但新的麻烦随之而来——几万篇文章放在那里,如果想找某个题材、某种情节,几乎不可能。用关键词搜索顶多能凑合,但语义差一点就找不到,体验并不好。

这时我想到了向量数据库。

为什么用 Milvus

我的服务器规格很小,只有 2 核 2G,根本跑不动本地的 Milvus,更别说大规模向量化了。好在 Milvus 有托管服务,而且带免费额度。这样我就能换个思路:

  • Mac 本地:用开源模型先做文本向量化,把长篇小说切分成小段(比如 200 个汉字一块),再计算对应的向量。
  • Milvus 云端:专门存储和管理这些向量,负责后续的相似度检索。
  • 查询时:把搜索词同样向量化,发到 Milvus 去比对,得到语义上更接近的内容。

另外,向量化这一步我用的是 SiliconFlow 提供的模型,免费额度足够支撑实验,算是“白嫖”资源也能玩得转。

为什么要写 PHP 库

可能有人会问:Milvus 不是有 Python、Go SDK 吗?为什么非要用 PHP?

原因其实很简单:我的整个小说爬虫和阅读项目,本身就是用 PHP 写的。再硬插一门语言进去,工程会很乱。于是干脆自己写了一个 PHP 库,把常见的操作封装起来:

  • 创建集合(类似于建表)
  • 插入数据(上传向量和原文片段)
  • 向量检索(传入一个向量,返回相似度最高的结果)
  • 删除集合、清理数据

这样一来,整个流程都能在 PHP 项目里顺利跑通。

怎么用

举个简单的例子。假设我有一段文本 "这是一个测试文本",先在本地算好向量(这里假设是 [0.12, 0.85, ...]),然后通过库上传:

use Hejunjie\Milvus;$baseUrl = "http://your-milvus-host"
$apiKey = "your-apikey"$client = new Milvus\Client($baseUrl, $apiKey);// 插入数据
$client->entities()->insert("novels", ['article_id' => 14271'title' => '测试小说','content' => '这是一个测试文本','vector' => [0.12, 0.85, ...]
]);// 搜索
$results = $client->entities()->search("novels", [[0.11, 0.80, ...], // 搜索内容,通过 SiliconFlow 转换为向量[0.11, 0.80, ...], // 支持多个数据查询[0.11, 0.80, ...]
], 10);
print_r($results);

这样就能查到与输入向量最接近的 10 段文本。通过查询到的 id 就可以在本地数据库中查询对应的小说。
对我来说,只要输入大概的剧情方向,Milvus就能把拥有相似片段的小说找出来,比传统关键字搜索好用太多。

支持的方法

这个小库目前支持 Milvus 的常见操作,大致分成几类:

  • 集合(Collections) :创建、删除、重命名、加载/释放、获取状态、设置属性等。
  • 分区(Partitions) :创建、删除、加载/释放、查看列表、检查是否存在。
  • 索引(Indexes) :创建、删除、查看详情,或者列出所有索引。
  • 别名(Aliases) :创建、修改、删除别名,也可以查看现有别名。
  • 向量数据(Entities) :插入、更新(upsert)、删除、查询、向量搜索。
  • 其它:比如自定义请求、获取集合的统计信息等等。

简单来说,该有的基本操作都覆盖了,足够支撑一个小型项目的使用。

我的收获

这个库严格来说不算“生产级”,但它让我有一些新的体会:

  • 向量数据库没那么遥远。不一定要做推荐系统或大模型项目,哪怕只是个人的小需求,也能用上。
  • PHP 也能玩。虽然传统上大家都觉得 PHP 跟 AI 没关系,但只要敢接 API,就能接上去。
  • 动手才有意思。一开始只是因为“不爽”写了个爬虫,后来一步步衍生到向量搜索,最后顺手写了个小库。整个过程不算严肃,但很有乐趣。

所以说,整个过程严格意义上没什么“高大上”的地方,就是一个普通人遇到小问题,忍不住折腾了一下,最后顺手造了个小轮子。

现在呢,我终于可以随心所欲地在几万篇小说里搜索想要的片段了,再也不用翻到眼花还找不到 😂

项目地址 👉 zxc7563598/php-milvusr


文章转载自:

http://zBSyGKyq.bdkhL.cn
http://c2BJBaSp.bdkhL.cn
http://r6cvFtY7.bdkhL.cn
http://aZXlE9jZ.bdkhL.cn
http://VYXGZxcs.bdkhL.cn
http://koNiei9s.bdkhL.cn
http://LSFKWFom.bdkhL.cn
http://htsw7J7w.bdkhL.cn
http://hT6Yw4ye.bdkhL.cn
http://UM4FWtXC.bdkhL.cn
http://utcBeTDn.bdkhL.cn
http://RxBiEyCx.bdkhL.cn
http://tmFrgVaB.bdkhL.cn
http://6VZiQS36.bdkhL.cn
http://FDm5Co35.bdkhL.cn
http://a0hxrkcb.bdkhL.cn
http://xXD4YiKS.bdkhL.cn
http://zJKYCrFe.bdkhL.cn
http://Pz9P05g1.bdkhL.cn
http://zNBGpWhF.bdkhL.cn
http://yoACGD53.bdkhL.cn
http://miDbBi12.bdkhL.cn
http://l6ZuLfhw.bdkhL.cn
http://c3lyOLXP.bdkhL.cn
http://yUMYbVNG.bdkhL.cn
http://Jg0trpJZ.bdkhL.cn
http://1JhThV9G.bdkhL.cn
http://3LCkxgmI.bdkhL.cn
http://lgC584By.bdkhL.cn
http://9pKkSE0U.bdkhL.cn
http://www.dtcms.com/a/370204.html

相关文章:

  • [光学原理与应用-432]:非线性光学 - 既然光也是电磁波,为什么不能直接通过电生成特定频率的光波?
  • python调用mysql
  • redis-----事务
  • 集成学习(随机森林算法、Adaboost算法)
  • 形式化方法与安全模型
  • Python两种顺序生成组合
  • 【Python自动化】 21 Pandas Excel 操作完整指南
  • Unity与硬件交互终极指南:从Arduino到自定义USB设备
  • Codeforces Round 1046 (Div. 2) vp补题
  • 【LeetCode热题100道笔记】二叉树的右视图
  • Day22_【机器学习—集成学习(1)—基本思想、分类】
  • 自动化运维,ansible综合测试练习题
  • 【面试题】领域模型持续预训练数据选取方法
  • OpenHarmony之USB Manager 架构深度解析
  • 新服务器初始化:Git全局配置与SSH密钥生成
  • 主流分布式数据库集群选型指南
  • 【Proteus仿真】定时器控制系列仿真——秒表计数/数码管显示时间
  • python advance -----object-oriented
  • 开源与定制化对比:哪种在线教育系统源码更适合教育培训APP开发?
  • 【51单片机-B030】【protues仿真】基于51单片机万年历系统
  • mysql 是否“100%”地解决幻读?
  • 分布式系统的设计哲学:架构模式全面介绍与选型策略
  • windows11 安装charm成功
  • IPD流程落地:IPMT的开发评审逻辑
  • 数字化赋能全球扩张:名创优品携手巨益科技的信息化转型深度实践
  • OpenCV - 图像的IO操作
  • Windows 11 手动下载安装配置 uv、配置国内源
  • Wisdom SSH 是一款搭载强大 AI 助手的工具,能显著简化服务器配置管理流程。
  • Linux基础知识(二)
  • Redis 在互联网高并发场景下的应用--个人总结