缘起
给一个还没见面的人起名字,是件奇怪的事 —— 你还不知道他会成为谁,却要先替他选定一个要用一辈子的符号。
我自己给孩子起名字,前后折腾了近半年。十几本起名书堆在桌上,AI 跑了五十多轮,又去查重名、 查重名企业、查同名学者,最后定下的名字全国重名不到 10 人 —— 出自苏轼那句「人生如逆旅,我亦是行人」, 是我五年前抄在练字本上的一句。
这轮折腾让我确信一件事:起名不是灵感问题,是工程问题。约束太多 —— 平仄要顺、字形要稳、 寓意要可追溯、方言里不能有歧义,还要避开长辈名讳和满街重名的爆款。靠人脑翻字典,能遍历的组合非常有限。
所以这件事被拆成两段:先检索,再生成。检索负责把《诗经》《楚辞》、唐诗宋词里的 可用字与搭配捞出来,附上出处、笔画与五行;生成负责在具体语境里把它们组合成一个有叙事的名字。 剩下的硬约束 —— 多音字、方言谐音、地名雷同 —— 不交给模型判断,交给规则层兜底。
一个名字的四道工序
-
采集约束
姓氏、性别、出生时间、风格偏好与避讳字,构成一次取名的输入条件集。
-
检索语料
从诗词典籍与字书中取出候选字,带上出处、笔画与五行属性,作为生成的素材池。
-
生成候选
模型在约束内产出名字,同时给出典故、释义与命名意图 —— 名字要能解释得清来历。
-
规则过滤
多音字、方言谐音、地名雷同、重名度过高的组合直接淘汰。这一步不指望模型,用规则。
-
多维评分
五行、音韵、字形、寓意、独特性分别打分,不合并成一个玄学总分 —— 分数说明的是「哪些维度更强」,判断权留给人。
技术实现
请求路径:小程序 → nginx(终结 TLS)→ Node 服务 → SQLite / 模型接口
-
一套代码,两个运行环境
后端零外部依赖,用模块解析钩子把
wx-server-sdk重定向到本地兼容层,云函数代码可以原样复用 —— 迁移时业务逻辑一行没改。 - 流式输出 取名结果通过 SSE 增量回传,首字约 2 秒、五个名字约 7 秒,比原来的二十多秒好等得多。客户端做增量 UTF-8 解码,避免中文被切在半个字上。
- 请求的收敛 客户端把并发的登录请求合并成一次,登录态失效时自动重登并重放原请求 —— 页面代码不需要感知登录状态。
- 数据与隐私 小程序默认使用微信授权登录,服务端不存储用户数据;收藏的名字仅保存在本地缓存中。
开发手记
-
2026-09-20
让模型「闭嘴」:思考模式与 JSON 截断
默认开启思考的模型会把思维链计入输出上限,表现为「返回格式错误」,实际是被截断。显式关闭思考后正文 token 回到充裕区间。教训是先看
finish_reason再改 prompt —— length 说明输出被截断,不是模型没按格式输出。 -
2026-09-18
从云开发搬到自建后端
4049 条记录迁移并逐字段校验。关键决策是「不重写」:保留云函数的调用签名,在 Node 侧做一层兼容,业务代码原样跑。
-
2026-09-18
把取名改成流式
一次请求从二十多秒变成首字两秒。旧的同步接口保留作降级路径 —— 客户端基础库不支持分块传输时自动回落,不留死角。
-
2026-04-22
小程序改名为「芽起一名」
「芽」取破土新生之意 —— 名字这件事,本来就是给一个新生命的第一份东西。改名当天把代码与文案里的旧标识一次性替换干净,从此对外只用这一个名字。
-
2026-03-15
小程序首版上线
取名与解析两条主链路,五个页面。上线当天最担心的是 AI 超时 —— 实测二十多秒,能用,但不好等。这也为后来改成流式埋下了伏笔。
关于本站
本站是个人技术项目小站,用于记录本人开发「芽起一名」微信小程序的过程与技术学习笔记。
本站为个人非经营性网站,不提供付费服务,不涉及新闻、出版、教育、医疗、药品等 需前置审批的内容。页面内容均为个人开发记录,不构成任何商业宣传。