Skip to content

功能实现 ​

这篇按功能说明背后的实现方式,和功能介绍一一对应。

随机抽星:官方数据 + 人设生成 ​

两条数据线的组合。先调 NASA 官方 API 拿真实的天文数据和图片:NASA Image and Video Library 拿图片、APOD(每日天文图片)拿当日内容、Exoplanet Archive 拿系外行星参数,每个数据点带来源标注。再把拿到的数据交给大模型,为这个天体生成儿童能读懂的科普说明和性格设定。

容错上,NASA 接口有 4.5 秒超时,超时或失败就退回本地准备好的资料,不会编造数据——科普产品宁可不展示,不能展示错的。模型生成的结果是 JSON,解析时逐字段校验,不合法就退回模板人设。

星体聊天:先分类、再生成 ​

聊天回复遵循一条"先分类、再生成"的管线。输入先过本地规则判定——危险内容拦截、隐私保护、话题边界(具体规则见儿童安全),命中即返回准备好的引导话术,请求不会到达模型。

通过判定的输入再调用模型。模型的 prompt 里注入四块内容:该星体的知识卡片、语义检索到的相关资料、最近几轮对话、用户这次的问题,并要求回复必须依据这些资料、资料不足要明说"不确定"、神话和科学事实必须分开讲。没配模型密钥时,整条管线退回本地知识卡片组装回复,应用照常运行——这是演示现场没网也不白屏的底气。

语音用浏览器原生能力:Speech Recognition 做语音输入,speechSynthesis 按偏好列表挑选中文女声做温柔朗读,零外部服务依赖。

星空图鉴:应用内语义检索 ​

卡片内容是人工准备并审核的静态数据。搜索不是简单的关键词匹配,而是应用内实现的语义检索:对查询和文档做中文分词(连续汉字段做二元切分,加上英文单词),建词频向量,算 cosine 相似度,按阈值过滤后返回。

因为语料就是自己的知识卡片,量不大,检索在内存里即可完成,不需要向量数据库——这是刻意取舍:语料几百条,维护一个向量库的成本远大于收益。

星空课堂与记忆库:localStorage 持久化 ​

课堂内容同样是人工准备的静态数据。已学/未学状态、抽到的星体记忆条目(星体身份、图片、事实、生成的人设)都存在浏览器 localStorage,读取时逐字段做类型校验,数据坏了就当空处理。记忆库点进某个星体的"继续聊天"走的是和聊天功能同一条管线,只是人设来自抽星时大模型生成的结果。

愿望卡:纯前端渲染 + 安全过滤 ​

愿望卡是纯前端拼装:选星体 + 愿望文本 + 样式渲染成卡片,截图保存用浏览器的下载能力。愿望文本在保存前经过和聊天同一套安全过滤(见儿童安全),含个人信息或危险内容的会被拦截。卡片数据存 localStorage。

模型配置:三级降级 ​

所有模型调用统一走一个 provider 选择链:有阿里云 DashScope Key 就用 qwen3-max,否则看 OpenAI 兼容端点,一个密钥都没有时应用照常运行(退回本地兜底内容)。由于用的是 Vercel AI SDK 的 OpenAI 兼容层,切换 provider 只是换环境变量,代码零改动。