Maeiee系统之关键词管理

在捣鼓 qutebrowser 的过程中,我将搜索引擎封装成了一个函数,只需调用,即可将相关资讯入库。这让我开始意识到关键词的重要性。

关键词,即进行搜索时使用的检索词,发散一些,记 0.0 Obsidian 介绍 笔记时添加的 Tag 也算作此类。这里所说的关键词,仅是词语本身,不是指那些高级的搜索引擎检索技术。


关键词的背后

一个词的背后,就是一片未知世界

比如 Andrej Karpathy,搜索这个关键词,能得到关于这位大佬的生平贡献,最近动态。如果你是 AI 研究者,这些资料是非常有价值的。不仅如此,每篇网页都是互联网这张大网的一个节点,透过超链接,能几乎无穷地发散下去。仅仅一个词,背后就是海量的知识


跟踪关键词

只要你感兴趣的东西,哪怕再小众,长久跟踪下去,就能收集到足够信息

举例来说,在我的工作领域,即移动端开发领域,搭载 PowerVR GE8320 GPU 的联发科芯片,OpenGL 有个 Bug,会导致用 Flutter 开发的 App 运行崩溃。

GPU 的驱动都是闭源的,这个问题成为我们组里面的离职标志,凡是接手这个问题的,最终都会因没有进展而离职。

我长期跟踪 PowerVR GE8320 这个关键词,发现除了 Flutter 社区外,Unity 游戏引擎社区也发现了这一问题。由于游戏开发者对 OpenGL 更加熟悉,尽管驱动是闭源的,但他们也锁定了导致崩溃的 OpenGL 操作,并在 Unity 引擎新版本中通过适配加以规避。这里存在一个信息差,我就有机会成为那个在 Flutter 社区修复这一问题的人。


关键词的组合

人的想象力十分有限的,互联网上的精彩让人意想不到

假设我拥有了 100 个关键词,将他们随机组装会碰撞出什么?举个例子,我把 Flutter 与 Linux 组装,这让我找到了 sony/flutter-embedded-linux: Embedded Linux embedding for Flutter。Flutter 官方不是支持 Linux 吗?Sony 这是整了个啥?它专门用于嵌入式领域,不再依赖 X11 和 GTK,并精简依赖,同时添加了 Wayland、DRM 支持。

意想不到是不是?原本我只是在手机上用 Flutter 开发 App,这回我脑子里已经在想,要不要搞个开发板搭个什么硬件小系统了。这是什么?这就是创造力

组合的背后,是新的可能。新的可能,就是未来的希望

当然,人的希望不只一种,不能说别的都不做,仅靠这里的“碰词儿”。但它很好。


关键词的分类

这是一个效率问题,比如我对 maeiee 感兴趣,对 可爱猪猪 感兴趣,但是对 maeiee 可爱猪猪 我毫无兴趣,这是无意义的搜索。

每个关键词都可添加多个分类

有了分类后,从分类中得到的关键词组合,都是高度相关的。从中进行组合,碰撞出火花的概率更高。

但有没有一种可能,跨类别能碰出更大火花呢?只是我自己想不到而已

的确是可能的,跨类别也是允许组合的。通过分类后,更加合理,分类内多碰撞,分类间少碰撞,实现平衡。


跟踪好的组合

碰出好的组合,是一件很幸运的事情,能让我高兴很久。比如 dataview 电子书,解决了我的电子书管理难题,同时也加强了我对 0.0 Obsidian 介绍 的掌握。

对于这种高质量组合,我想要长期关注。这与《跟踪关键词》一节相同,再往上翻翻回顾以下吧。


网站只是个函数

开头说道,“我将搜索引擎封装成了一个函数”,每个函数就是一个渠道,我可以选择关键词用哪些渠道。

比如,大多数关键词通常都要打通搜索引擎。

而有的,比如 线性代数,我可能希望在视频网站上搜索,只要将搜索网站也封装成一个函数,就 OK 了。


网站 as SDK

说网站只是个函数,是针对外部使用者来说的。

通常,网站的功能是很多的,尤其是聚合站点,有大量频道、用户。

从这一角度上来说,网站又像是一个 SDK,或者说一系列函数。

RSSHub 是这一领域的最佳实践之一。


互联网是张网

不要忘记,互联网是网状的。本文中的关键词,充其量只是钥匙。

假设我们有 100 个关键词,便是 100 把钥匙,能解锁 100 个世界。

假设每个世界中有 100 篇好文章,这遍是 1w 篇文章。

这 1w 篇文章进而可能又连带出 10w 篇文章,如此下去,无穷无尽。


Step1:声明关键词

我们不停留在理论阶段,接下来真正进行开发。

注意

接下来的内容不是一篇开发教程。后续内容,是我的核心开发思路。我相信这些思路同样有价值。

最初我想搭建一个关键词的 CRUD 界面,但是太麻烦了,在 MVP 阶段,怎么成本低怎么来。因此我最终选择直接将关键词写在代码里。代码示例如下:

KEYWORDSS = [
    {
        "name": "Flutter",
        "interval_days": 1,  # 每天搜索一次
        "category": ["技术", "编程", "移动开发"],
    },
    {
        "name": "WebAssembly",
        "interval_days": 1,  # 每天搜索一次
        "category": ["技术", "编程", "WebAssembly", "前端"],
    },
]
意外收获

我将关键词写在代码里,意外“组合”了编辑器的 GitHub Copilot 功能,在 AI 的辅助下,不仅这些 JSON 字段可以自动补全,而且关于关键词、分类它也能自动联想,太酷了!

首先,在 AI 的帮助下,我为每个关键词添加了 description 字段:

{
	"name": "Flutter",
	"description": "Flutter 是 Google 开发的一款开源移动应用软件开发工具,用于为 Android 和 iOS 开发应用。",
	"interval_days": 1,  # 每天搜索一次
	"category": ["技术", "编程", "移动开发"],
},

比如,我在 Colipot Chat 中使用如下 Prompt:

根据 KEYWORDS 中的 "name",请为我推荐几个关键词,按照我代码中的结构,并自动生成好分类,interval_days 统一为 1 就好。另外 BLACK_LIST 黑名单中的不要给出。

如此重复这个 Prompt,我瞬间就收获了大量关键词。这就是前文所说的意外收获,哈哈哈!

未来系统结合 LLM

在代码中写死关键词,只是 MVP 时临时解决办法,后续还是要有 CRUD GUI,到时候可以加一个功能,共关键词中随机选择部分,然后调用 LLM 进行启发式推荐,哈哈哈!


Step2:调度系统

在我的个人系统中,已经存在一套调度系统,在该调度系统中,支持对网站、搜索引擎的爬虫调度。在该系统中,每个网站,或者每个搜索引擎关键词是一个爬虫。

在本文中的关键词系统,存在大量关键词,我面临一个选择:为每个关键词单独创建一个爬虫(在 MongoDB 中有相应实体),或者为整个调度系统创建一个爬虫。

为整个调度系统创建一个爬虫,需要系统内部持久化状态,比如上次抓取时间。这些都需要重新开发。

还是开发成本越低越好,如此看来,还是每个关键词创建一个爬虫好一些。在 MongoDB 中创建的实体多不是问题,再说几百上千个并不多。

在我已有的调度系统中,一个搜索引擎爬虫如下:

{
  "_id": { ... },
  "name": "Flutter",
  "crawler_type": "search",
  "feed": null,
  "interval": "4",
  "proxy": false,
  "params": "flutter"
}

本文作者:Maeiee

本文链接:Maeiee系统之关键词管理

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!