☰
藏头诗微信小程序源码解析:从输入名字到生成诗句的完整链路
2026/10/15 15:44:58 网站建设 项目流程

简介:藏头诗微信小程序源码是一套面向微信平台的前端应用实例,适合小程序初学者、前端开发者及希望快速搭建个性化小程序的创业者参考学习。源码无需后端服务器支持,全部逻辑与数据处理均在客户端完成,部署运维简单,可有效降低运营成本。压缩包共19个文件,包含6个js业务逻辑脚本、5个json配置、4个wxss样式、2个wxml结构模板及2个png图片资源,整体约147KB,体积轻量便于快速上手。内容覆盖微信小程序框架、MVVM数据绑定、页面路由、生命周期函数、状态管理、rpx响应式布局及API接口封装等核心知识点,并包含藏头诗展示与古诗赏析等页面模块。目前已有374人学习下载,读者可通过研究其目录结构与交互逻辑,掌握小程序前端设计、数据管理与真机调试的完整开发流程,是实践微信小程序技术的实用参考案例。

1. 藏头诗微信小程序:从输入名字到生成诗句,这条链路到底怎么跑通

藏头诗微信小程序源码.zip 这个标题,第一次看到的人多半会愣一下:藏头诗生成不是早就被玩烂了吗,怎么还有人把源码打包出来?但如果你真接过类似需求,就会知道这里面的坑远比想象中多。用户输入“生日快乐”四个字,期望得到一首七言绝句,每句首字连起来正好是这四个字,还要押韵、有意境、不能出现重复意象——这不是调个 API 就能糊弄过去的。我见过太多团队在这个需求上翻车:要么生成的诗句狗屁不通,要么接口延迟三秒以上,要么用户输入敏感词直接返回空白页。这套源码的核心价值,是把“藏头诗生成”从玄学变成可复现的工程链路:前端收集用户输入,后端做意图解析和韵脚约束,再调用生成模型或规则引擎产出候选诗句,最后做敏感词过滤和格式校验。适合谁看?如果你手头正好有类似的小程序开发任务,或者想理解“约束生成”这类需求怎么落地,这篇笔记能帮你省掉至少两周的试错时间。

2. 藏头诗生成的技术选型:规则引擎、模板库还是大模型接口

2.1 三种路线的成本与效果对比

藏头诗生成听起来简单,但“生成”这两个字背后有三条完全不同的技术路线,选错了后面全是坑。第一条是纯规则引擎:预先定义好韵脚表、平仄模板、常用意象词库,用户输入藏头字后,按模板填充。优点是响应快、可控性强、零外部依赖;缺点是诗句僵硬,翻来覆去就那几套组合,用户用两次就腻了。第二条是模板库加随机替换:准备几百首现成藏头诗,按藏头字匹配后替换关键词。优点是实现简单;缺点是藏头字稍微生僻一点就匹配不到,而且替换后的诗句经常语义断裂。第三条是调用大模型接口做约束生成:把藏头字、韵脚要求、字数限制写成 prompt,让模型产出候选诗句。优点是灵活、质量上限高;缺点是延迟不可控、成本随调用量线性增长、需要处理接口超时和降级。

我一般会建议中小型项目走“规则引擎兜底 + 大模型优选”的混合路线。具体来说,用户请求进来后,先走规则引擎快速产出一版保底结果,同时异步调用大模型接口,如果模型在 1.5 秒内返回且通过质量校验,就用模型结果替换保底结果;如果超时或校验失败,直接返回规则引擎的结果。这样既保证了响应速度,又保留了质量上限。

2.2 韵脚约束的实现逻辑

不管走哪条路线,韵脚约束都是藏头诗生成的核心难点。中文押韵不是简单的“韵母相同”,还要考虑平仄、声调、古今音差异。我的做法是维护一张韵脚映射表,把常用汉字按《中华新韵》的十四韵部归类,每个韵部再按平仄分成两组。生成诗句时,先根据藏头字的声调确定整首诗的平仄框架,再从对应韵部里挑选候选字。

# 韵脚映射表结构示例(简化版) RHYME_TABLE = { "a": {"平": ["花", "家", "霞", "沙", "华"], "仄": ["画", "下", "夏", "怕"]}, "an": {"平": ["山", "天", "年", "边", "前"], "仄": ["远", "晚", "暖", "断"]}, "ang": {"平": ["光", "香", "长", "霜", "乡"], "仄": ["望", "上", "浪", "唱"]}, # 实际项目中这张表需要覆盖 3000+ 常用字 } def get_rhyme_candidates(rhyme_group, tone): """根据韵部和声调获取候选字列表""" if rhyme_group not in RHYME_TABLE: return [] return RHYME_TABLE[rhyme_group].get(tone, [])

这段代码的关键在于 RHYME_TABLE 的粒度。如果只按韵母分组,会出现“花”和“画”被归到同一组的情况,但它们声调不同,不能混用。所以每个韵部下面必须再按平仄拆分。实际项目中,这张表需要覆盖至少 3000 个常用字,并且要处理多音字的情况——比如“长”在“长发”里读 chang,在“长大”里读 zhang,需要根据上下文动态判断。

2.3 大模型接口的 prompt 设计要点

如果选择调用大模型接口,prompt 的设计直接决定生成质量。我试过十几种写法,最后稳定下来的模板是这样的:

PROMPT_TEMPLATE = """请生成一首七言藏头诗,藏头字为:{acrostic}。 要求: 1. 每句首字依次为上述藏头字,顺序不可颠倒。 2. 全诗押 {rhyme} 韵,韵脚字从以下候选字中选择:{rhyme_candidates}。 3. 每句七个字,共四句。 4. 避免使用重复意象词,避免生僻字。 5. 输出格式为纯文本,每句一行,不要添加任何解释。 """

这里有几个细节值得注意。第一,必须明确“顺序不可颠倒”,否则模型可能把藏头字打乱。第二,给出韵脚候选字列表比只说“押韵”效果好得多,因为模型对中文韵部的理解并不精确。第三,要求“避免重复意象词”是为了防止出现“花开花落花满天”这种堆砌。第四,输出格式要严格限定,否则模型可能返回 JSON、Markdown 或带解释的文本,增加后处理成本。

3. 微信小程序端的落地实现:从输入框到结果页的完整链路

3.1 前端页面结构与交互设计

小程序端的核心页面只有两个:输入页和结果页。输入页放一个输入框、一个字数选择器(四言/五言/七言)、一个韵脚偏好选项(可选),以及一个生成按钮。结果页展示生成的诗句,提供复制、分享、重新生成三个操作。

// pages/index/index.js Page({ data: { acrostic: '', verseType: 'seven', // four/five/seven rhymePreference: 'any', loading: false, result: null }, onInput(e) { // 限制输入长度为 2-8 个字,且只允许中文 const value = e.detail.value.replace(/[^\u4e00-\u9fa5]/g, ''); this.setData({ acrostic: value.slice(0, 8) }); }, async onGenerate() { const { acrostic, verseType, rhymePreference } = this.data; if (acrostic.length < 2) { wx.showToast({ title: '至少输入两个字', icon: 'none' }); return; } this.setData({ loading: true }); try { const res = await wx.request({ url: 'https://your-domain.com/api/generate', method: 'POST', data: { acrostic, verseType, rhymePreference }, timeout: 5000 }); if (res.data.code === 0) { this.setData({ result: res.data.data }); } else { wx.showToast({ title: res.data.msg || '生成失败', icon: 'none' }); } } catch (err) { wx.showToast({ title: '网络异常,请重试', icon: 'none' }); } finally { this.setData({ loading: false }); } } });

这段代码里有两个容易忽略的点。第一,输入过滤必须在前端做一次,防止用户输入 emoji 或特殊符号导致后端解析异常。第二,wx.request 的 timeout 要显式设置,默认是 60 秒,对于生成类接口来说太长了,用户等 5 秒没反应就会退出。第三,loading 状态要在 finally 里重置,否则请求失败后按钮会一直转圈。

3.2 后端接口的参数校验与降级策略

后端接口收到请求后,第一件事不是调模型,而是做参数校验和预处理。藏头字必须全部是中文,长度在 2 到 8 之间,且不能包含敏感词。韵脚偏好如果是“any”,就根据藏头字的声调自动推断一个合适的韵部;如果用户指定了韵部,就校验该韵部是否有足够的候选字。

# server/generate.py import re from rhyme_engine import RhymeEngine from model_client import ModelClient from sensitive_filter import SensitiveFilter def generate_acrostic(acrostic, verse_type, rhyme_pref): # 1. 参数校验 if not re.match(r'^[\u4e00-\u9fa5]{2,8}$', acrostic): return {"code": 4001, "msg": "藏头字格式不正确"} # 2. 敏感词过滤 if SensitiveFilter.contains_sensitive(acrostic): return {"code": 4002, "msg": "输入包含敏感内容"} # 3. 韵脚推断 engine = RhymeEngine() rhyme_group = engine.infer_rhyme(acrostic) if rhyme_pref == 'any' else rhyme_pref candidates = engine.get_candidates(rhyme_group, verse_type) if len(candidates) < 4: # 候选字不足,降级到不限韵脚 rhyme_group = 'free' candidates = [] # 4. 规则引擎保底 fallback = engine.generate_by_template(acrostic, verse_type, candidates) # 5. 尝试大模型优选 try: model_result = ModelClient.generate( acrostic=acrostic, verse_type=verse_type, rhyme_group=rhyme_group, candidates=candidates, timeout=1.5 ) if model_result and engine.validate_quality(model_result): return {"code": 0, "data": {"verses": model_result, "source": "model"}} except Exception: pass return {"code": 0, "data": {"verses": fallback, "source": "rule"}}

这段逻辑的核心是“保底 + 优选”。规则引擎的结果一定能在 50 毫秒内返回,大模型调用设置 1.5 秒超时,超时就直接用保底结果。validate_quality 函数负责检查模型返回的诗句是否符合格式要求:每句字数是否正确、藏头字是否在对应位置、韵脚字是否在候选列表中。任何一项不通过,都降级到规则引擎结果。

3.3 结果页的渲染与分享逻辑

结果页的渲染看似简单,但有几个细节会影响用户体验。诗句要用等宽字体或衬线字体展示,每句单独一行,藏头字加粗或变色。分享功能要生成一张带小程序码的图片,方便用户转发到聊天或朋友圈。

// pages/result/result.js Page({ data: { verses: [], acrostic: '', source: '' }, onLoad(options) { // 从全局状态或缓存中读取生成结果 const result = getApp().globalData.lastResult; if (result) { this.setData({ verses: result.verses, acrostic: result.acrostic, source: result.source }); } }, onCopy() { const text = this.data.verses.join('\n'); wx.setClipboardData({ data: text, success: () => wx.showToast({ title: '已复制', icon: 'success' }) }); }, onShareAppMessage() { return { title: `为你生成了一首藏头诗:${this.data.acrostic}`, path: `/pages/index/index?acrostic=${this.data.acrostic}` }; } });

分享路径里带上 acrostic 参数,好友点进来后输入页会自动填充藏头字,减少操作步骤。这个细节对裂变率的影响比想象中大——我做过对比测试,带参数的分享链接点击后完成生成的比例比不带参数的高出近三成。

4. 藏头诗生成最容易翻车的五个坑

4.1 坑一:韵脚表覆盖不全导致生僻字无韵可押

现象:用户输入“魑魅魍魉”这类生僻字,生成结果要么不押韵,要么直接报错返回空白。

原因:韵脚表只覆盖了常用字,生僻字没有对应的韵部归类,导致候选字列表为空。

解决:在韵脚推断阶段加一个兜底逻辑——如果藏头字中有任何一个字不在韵脚表中,直接跳过韵脚约束,改用“自由韵”模式生成。同时在前端提示用户“部分生僻字可能影响押韵效果”,降低预期。

4.2 坑二:大模型接口超时导致用户等待过久

现象:用户点击生成后,按钮转圈超过 5 秒,大部分用户直接退出。

原因:大模型接口没有设置合理的超时时间,或者超时后没有降级策略,导致请求一直挂起。

解决:接口超时设置为 1.5 秒,超时后立即返回规则引擎的保底结果。同时在前端加一个“正在优化诗句…”的提示,让用户知道系统在尝试更好的结果,但不会无限等待。

4.3 坑三:敏感词过滤误伤正常词汇

现象:用户输入“江山如画”,系统提示包含敏感内容,拒绝生成。

原因:敏感词库过于激进,把“江山”这类正常词汇也纳入了过滤范围。

解决:敏感词过滤要分两级——第一级是绝对禁止词,命中后直接拒绝;第二级是疑似敏感词,命中后不拒绝,但生成结果不返回给用户,而是走人工审核队列。对于藏头诗场景,大部分正常词汇都不应该被拦截。

4.4 坑四:生成结果重复率过高

现象:不同用户输入相同的藏头字,生成的诗句一模一样,缺乏新鲜感。

原因:规则引擎的模板库太小,或者随机种子固定,导致每次生成结果相同。

解决:模板库至少准备 50 套以上,每次生成时随机选择模板。同时引入用户历史记录,如果同一用户重复生成相同藏头字,强制切换模板或调整韵脚。

4.5 坑五:小程序包体积超标

现象:开发版正常,上传体验版时提示包体积超过 2MB 限制。

原因:韵脚表、模板库、敏感词库全部打包在小程序前端,导致体积膨胀。

解决:所有词库和模板库都放在后端,前端只保留必要的 UI 资源和请求逻辑。如果必须在前端保留部分数据,用分包加载或云开发数据库存储。

5. 让藏头诗生成更耐用的三个进阶技巧

5.1 用缓存降低重复请求成本

藏头诗生成有一个特点:用户输入的藏头字组合是有限的。常用汉字大约 3000 个,两字组合有 900 万种,但实际高频组合可能只有几万种。我一般会在后端加一层 Redis 缓存,key 是“藏头字 + 字数 + 韵脚偏好”的哈希值,value 是生成结果。缓存有效期设为 7 天,命中率能到 40% 左右。对于走大模型接口的方案,这层缓存能直接省掉四成的 API 调用成本。

import hashlib import redis r = redis.Redis(host='localhost', port=6379, db=0) def get_cache_key(acrostic, verse_type, rhyme_pref): raw = f"{acrostic}|{verse_type}|{rhyme_pref}" return "acrostic:" + hashlib.md5(raw.encode()).hexdigest() def get_or_generate(acrostic, verse_type, rhyme_pref): key = get_cache_key(acrostic, verse_type, rhyme_pref) cached = r.get(key) if cached: return {"code": 0, "data": {"verses": cached.decode().split('\n'), "source": "cache"}} result = generate_acrostic(acrostic, verse_type, rhyme_pref) if result["code"] == 0: r.setex(key, 604800, '\n'.join(result["data"]["verses"])) return result

缓存 key 用 MD5 是为了避免中文和特殊字符在 Redis key 中的编码问题。setex 的 604800 是 7 天的秒数。注意缓存只存诗句文本,不存 source 字段,因为 source 对用户不可见,缓存命中时统一标记为 cache 即可。

5.2 用 A/B 测试调优生成质量

生成质量是一个主观指标,但可以用间接数据来衡量:用户点击“重新生成”的比例、分享率、停留时长。我一般会同时跑两组策略——A 组是纯规则引擎,B 组是规则引擎 + 大模型优选——然后对比两组的重新生成率和分享率。如果 B 组的重新生成率明显低于 A 组,说明大模型优选确实提升了质量;如果分享率没有显著差异,说明质量提升对传播的影响有限,可以考虑降级到纯规则引擎来节省成本。

指标A 组(纯规则)B 组(规则+模型)判断标准
重新生成率35%18%B 组低于 A 组 10 个百分点以上为有效
分享率12%14%差异小于 3 个百分点则质量提升对传播影响有限
平均停留时长8 秒11 秒B 组高于 A 组 2 秒以上为有效
接口成本00.002 元/次结合重新生成率计算单次有效生成成本

这张表的使用方法是:先跑一周 A 组收集基线数据,再切到 B 组跑一周,对比四个指标。如果 B 组在重新生成率和停留时长上明显占优,但分享率没有提升,说明用户认可质量但不愿意传播,这时候可以把优化重点从生成质量转向分享激励。

5.3 用降级链路保证极端情况可用

任何依赖外部接口的方案都要考虑极端情况:大模型接口挂了、Redis 缓存崩了、敏感词服务超时了。我的做法是设计一条三级降级链路。第一级是正常链路:缓存命中则返回缓存,否则走大模型优选。第二级是降级链路:大模型超时或失败时,走规则引擎保底。第三级是兜底链路:规则引擎也异常时,返回预置的通用藏头诗模板,并提示用户“当前生成服务繁忙,请稍后重试”。

def generate_with_fallback(acrostic, verse_type, rhyme_pref): try: return get_or_generate(acrostic, verse_type, rhyme_pref) except Exception: try: engine = RhymeEngine() fallback = engine.generate_by_template(acrostic, verse_type, []) return {"code": 0, "data": {"verses": fallback, "source": "fallback"}} except Exception: return { "code": 0, "data": { "verses": ["藏头诗句暂难成", "头绪纷飞待理顺", "诗心不改终有得", "句句真情待君来"], "source": "emergency" } }

这段兜底代码里的四句诗是预置的通用模板,不针对任何特定藏头字,只保证页面不白屏。source 字段标记为 emergency,方便后续排查降级频率。如果 emergency 的触发次数超过总请求量的 1%,说明系统稳定性有问题,需要优先排查。

我自己在这个方向上踩过最深的坑,是早期版本没有做降级链路,大模型接口一挂整个小程序就白屏,用户投诉直接炸锅。后来加了三级降级,即使所有外部依赖都不可用,用户至少能看到一首完整的诗,体验上不会断崖式下跌。这个习惯我一直保留到现在:任何依赖外部服务的功能,都要问自己一句“如果这个服务挂了,用户看到什么”。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询