【独立开发日记 005】为了学 RAG,我周末手搓了一个“懂人话”的游戏推荐系统

【独立开发日记 005】为了学 RAG,我周末手搓了一个“懂人话”的游戏推荐系统

从一个简单的想法到可用的产品,分享 Game Odyssey 的诞生过程。

Hello,我是小兔大白糖。

这周不聊沉重的架构,聊点轻松的——打游戏

作为一个有娃的中年人,周末好不容易把神兽哄睡了,有了点属于自己的时间,想找个游戏放松一下。打开 Steam 翻了半天,又去论坛爬楼,最后还是没选出来玩什么。

我的需求其实很明确,但也很模糊:“我想找一款类似《对马岛之魂》的开放世界游戏,画面要好,但不要太肝,适合周末玩玩。”

这种需求,传统的“标签筛选”根本搞不定。搜“开放世界”会出来一堆你不想要的,搜“动作”又太泛。市面上的推荐大多是“热门榜单”,并不懂我当下的心境。

正好最近我在研究 RAG(检索增强生成) 技术,职业病犯了:这不就是典型的 RAG 场景吗?

用户说人话 -> 系统理解语义 -> 向量库检索 -> LLM 生成推荐理由。

于是,我花了一个周末,当做练手项目,写了这个 Game Odyssey

初衷:做给自己玩的玩具

起初没想做成 SaaS,纯粹是想验证一下:在不花钱买 OpenAI API 的前提下,纯本地化的 RAG 到底能不能打?

我想解决两个痛点:

  1. 搜索太笨: 我想用自然语言搜游戏,而不是点标签。
  2. 技术验证: 都在吹本地大模型,我想亲手试试 Apple Silicon (M系列芯片) 跑 RAG 的真实体验。

我的“穷游”技术栈

既然是练手,原则就是零成本、全掌控

  • 大脑 (LLM): Ollama + Qwen2.5:3b
    • 体验: Qwen 的中文能力很惊喜。3B 模型在我的 Macbook Rro 上跑起来大概 2-3 秒响应,完全可接受。
  • 理解 (Embedding): MLX + Qwen3-Embedding-4B
    • 理由: 专门为苹果芯片优化的 MLX 框架,跑 Embedding 飞快。它能把“放松”、“不肝”这种模糊概念变成向量。
  • 记忆 (Database): PostgreSQL + pgvector
    • 理由: 几千条游戏数据,Postgres 装个插件就够了,没必要上专业的向量数据库。

技术栈:

  • 前端:React + TypeScript + Tailwind(快速出界面)
  • 后端:Python + FastAPI(异步 API 很顺手)
  • 数据库:PostgreSQL + pgvector(向量检索一把梭)
  • LLM:Ollama(本地运行,不用 API Key)
简单的架构图 简单的架构图

踩坑:AI 的“直男思维”

虽然是练手,但也遇到了一些挺有意思的坑。

1. “我也推荐我自己” 最开始,我问“推荐类似《对马岛之魂》的游戏”,系统返回的第一个推荐就是《对马岛之魂》。 从向量检索的角度看,这没毛病,它确实和自己最相似。但从用户体验看,这是废话。 解决: 我得在 Prompt 里严厉地告诉 LLM:“如果用户提到了某款游戏,千万别再推荐它”,同时在后端代码里做了 ID 过滤。

2. 幻觉与格式 我想让 LLM 返回 JSON 格式以便前端渲染卡片。但本地小模型(3B)有时候很倔,聊嗨了就开始写小作文,或者自创 JSON 格式。 解决: 既然管不住 AI,就管好自己。我写了一套“脏解析”逻辑,正则、关键字匹配轮番上,终于兜住了底。

最终效果

现在,我可以舒服地问它:“推荐几款适合带孩子一起玩的 Switch 游戏,要简单的。” 它能理解“带孩子”意味着双人、画风可爱、难度低,然后推荐《马里奥赛车》或者《星之卡比》,而不是给我推荐《黑魂》。

简单的架构图 简单的架构图 简单的架构图

写在最后

这个项目目前还是个 Demo,但我把它开源了(稍后整理好放出)。

通过这个项目,我把 RAG 的完整流程(数据清洗、向量化、检索、Prompt 工程)彻底跑通了一遍。纸上得来终觉浅,绝知此事要躬行。

如果你也是技术人,想学 RAG 但不知道从哪下手,不妨也试着从自己身边的小痛点开始,造个轮子玩玩。

完整代码已开源:https://github.com/ICEMAN-CN/game-reco.git