乙巳马年春联生成终端从零开始:多轮对话式春联精修(Refine)功能设计
1. 引言:从“一键生成”到“对话精修”
想象一下这个场景:你输入了“如意”二字,期待AI为你生成一副完美的马年春联。几秒钟后,一副对联出现在屏幕上。上联不错,但下联的意境似乎差了点意思;横批很工整,但总感觉少了点“马年”的灵动气息。这时候,你该怎么办?
在传统的AI生成工具里,你只能重新输入关键词,再生成一次,然后祈祷下一次的结果会更好。这个过程就像抽盲盒,充满了不确定性。
今天,我们要为“乙巳马年·皇城大门春联生成终端”设计一个全新的功能:多轮对话式春联精修(Refine)。这个功能的核心思想很简单——让生成春联的过程,变成一场你和AI之间的“对联创作研讨会”。
你不再是被动接受结果的用户,而是主动参与的“对联编辑”。你可以告诉AI:“下联能不能更豪迈一些?”、“横批加点马年的元素”、“整体风格再喜庆一点”。AI会根据你的反馈,实时调整和优化,直到生成让你完全满意的作品。
这篇文章,我将带你从零开始,完整设计并实现这个“对话精修”功能。你会看到:
- 为什么单纯的“生成”不够,我们还需要“精修”?
- 如何设计一个自然、高效的对话交互流程?
- 背后的技术架构如何支撑多轮、有记忆的对话?
- 最终的用户体验会是怎样的?
无论你是前端开发者、后端工程师,还是对AI应用交互设计感兴趣的产品人,这篇文章都将为你提供一个完整的、可落地的设计案例。让我们开始吧。
2. 核心需求与设计目标
在动手写代码之前,我们必须想清楚:我们到底要解决什么问题?用户需要什么?一个好的设计目标,是成功的一半。
2.1 用户痛点分析
基于对原有“一键生成”模式的观察,我们总结了三个核心痛点:
- 结果不可控:用户输入“吉祥”,可能得到一副关于家庭和睦的对联,也可能得到一副关于事业成功的对联。用户无法精细控制生成的方向。
- 调整成本高:如果对生成结果不满意,用户只能修改关键词重新生成。但修改关键词是一个“黑盒”操作,用户不知道改成什么词才能得到想要的效果,往往需要多次试错。
- 缺乏创作参与感:整个过程是单向的“输入-输出”,用户像一个下达指令的指挥官,而不是共同创作的伙伴。这降低了工具的趣味性和用户粘性。
2.2 “对话精修”功能的设计目标
针对以上痛点,我们为“精修”功能设定四个明确的设计目标:
- 目标一:精准控制。允许用户针对对联的局部(上联、下联、横批)或整体(风格、意境、用词)提出具体的修改意见。
- 目标二:渐进优化。修改过程应该是迭代的、可累积的。用户可以在上一轮修改的基础上,提出新的要求,AI能理解并综合所有历史指令。
- 目标三:交互自然。交互方式必须极其简单、符合直觉。最好就像和一位有经验的“对联老师傅”聊天一样自然。
- 目标四:保持仪式感。这是“皇城大门”终端最重要的品牌特质。精修功能不能破坏原有的“开门见喜”沉浸式视觉体验,而是要融入其中。
简单来说,我们要做的不是增加一个复杂的“高级设置”面板,而是创造一种用自然语言指导AI进行创作的对话体验。
3. 交互流程与界面设计
设计目标明确了,接下来就要把它变成用户手指可触碰、眼睛可看到的界面。这一部分,我们聚焦于前端的交互设计。
3.1 核心交互流程设计
我们设计了一个四步循环的精修流程,它像一场优雅的舞蹈:
- 生成初稿:用户输入核心关键词(如“如意”),点击“开门见喜”,生成第一版春联。这和我们之前的功能完全一样。
- 触发精修:在生成的春联下方,出现一个全新的UI模块:“🧐 对联精修坊”。这里有一个输入框,提示语是“告诉AI您想如何修改这幅对联…”。
- 输入指令:用户在此输入自然语言指令。例如:
- 局部修改:“下联的‘福’字能不能换成‘运’字?”
- 风格调整:“整体感觉再喜庆、热闹一些。”
- 意境深化:“上联的意境可以更开阔,有‘马踏飞燕’的那种气势。”
- 用词替换:“横批‘万事如意’有点普通,换个更文雅的说法。”
- 迭代优化:用户点击“精修”按钮。AI根据当前春联和用户的指令,生成一副新的、符合要求的春联。新对联替换旧对联,同时,精修输入框被清空,等待用户下一轮指令。这个循环可以一直进行下去。
关键设计点:精修输入框旁边,我们设计了一个“指令示例”的折叠面板。点击可以展开,看到一些典型的精修指令例子,帮助不知道如何下手的用户快速上手。
3.2 界面元素与视觉融合
“皇城大门”的视觉风格是庄严、喜庆的。精修功能的UI必须无缝融入,不能显得突兀。
- 位置:“对联精修坊”模块位于生成的对联区域正下方,与上方的“愿望输入区”和“开门见喜按钮”形成垂直动线。
- 视觉风格:
- 使用与门钉同色的“琥珀金”作为输入框的边框和按钮颜色。
- 输入框背景采用半透明的深红色,与朱砂红门背景相协调。
- 按钮图标使用“✍️”(书写的手)替代普通的箭头,更符合“精修”的语义。
- 状态反馈:当AI正在处理精修指令时,按钮变为加载状态,并且输入框上方出现一行小字:“AI老师傅正在斟酌字句…”,用拟人化的语言缓解等待焦虑。
这个设计确保了功能强大,但界面极其简洁,用户需要关注的只有一个输入框和一个按钮。
4. 技术架构与后端实现
华丽的界面背后,需要一个聪明且稳定的“大脑”来支撑。这就是我们的后端服务需要完成的任务。
4.1 系统架构图
首先,通过一张图来理解整个精修功能的数据流:
用户前端 (Streamlit) | | (发送精修指令 + 当前对联文本) V 后端API服务 (FastAPI) | | (构建带历史记忆的Prompt) V AI 模型服务 (PALM) | | (返回精修后的对联文本) V 后端API服务 (FastAPI) | | (格式化并返回结果) V 用户前端 (Streamlit) -> 更新UI展示4.2 核心难点:如何让AI理解“精修”?
这是本功能最核心的技术挑战。我们使用的PALM模型是一个文本生成模型,它本身不具备“记忆”和“理解上下文修改指令”的固有能力。我们需要通过巧妙的提示词工程来赋予它这种能力。
我们不能简单地把用户指令和当前对联扔给模型说“改一下”。那样模型很可能会完全重写,而不是精修。
我们的解决方案是:构建一个结构化的、带有多轮对话历史的Prompt。
后端Python代码示例(核心逻辑):
# 假设我们有一个处理精修请求的API端点 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import json # 初始化模型管道(假设已初始化) couplet_pipeline = pipeline(Tasks.text_generation, model='damo/spring_couplet_generation') def refine_couplet(current_couplet, user_instruction, conversation_history=[]): """ 精修春联的核心函数 :param current_couplet: dict, 当前对联,格式如 {'upper': '上联', 'lower': '下联', 'horizontal': '横批'} :param user_instruction: str, 用户的本轮精修指令 :param conversation_history: list, 历史对话记录,每个元素是 (instruction, refined_couplet) :return: dict, 精修后的新对联 """ # 1. 构建系统指令,定义AI的角色和能力 system_prompt = """你是一位精通中国古典文学和对联创作的AI助手。你的任务是帮助用户精修一副春联。 用户会给你一副现有的春联,并提出修改意见。你必须严格遵循以下原则: 1. **保持核心**:尽量保留原对联的架构、核心意象和大部分用词。 2. **精准修改**:只根据用户指令修改需要调整的部分。 3. **保证工整**:修改后仍需符合对联的平仄、对仗和字数要求。 4. **风格一致**:修改后的用词和风格应与原对联保持一致。 请根据以下对话历史和当前指令,输出精修后的春联。输出格式必须是严格的JSON:{"upper": "上联文本", "lower": "下联文本", "horizontal": "横批文本"} """ # 2. 组织对话历史上下文 history_context = "" for i, (inst, old_couplet) in enumerate(conversation_history[-3:]): # 只保留最近3轮历史,防止token过长 history_context += f"\n[第{i+1}轮修改]\n用户要求:{inst}\n修改前对联:{old_couplet}\n" # 3. 构建当前请求的Prompt current_couplet_str = json.dumps(current_couplet, ensure_ascii=False) user_prompt = f""" {history_context} [当前对联] {current_couplet_str} [用户本次修改指令] {user_instruction} 请输出精修后的春联JSON: """ # 4. 组合完整Prompt并调用模型 full_prompt = system_prompt + user_prompt # 注意:实际调用需要根据PALM模型的输入格式进行调整 # 这里是一个简化的示意 result = couplet_pipeline(full_prompt, max_length=500) generated_text = result['text'] # 5. 从模型输出中解析JSON(这里需要做健壮的解析和错误处理) try: # 假设模型输出中包含一个JSON块 # 实际应用中可能需要用正则表达式提取 refined_couplet = json.loads(generated_text) # 验证结构 assert all(key in refined_couplet for key in ['upper', 'lower', 'horizontal']) return refined_couplet except (json.JSONDecodeError, AssertionError): # 如果解析失败,返回原对联或一个错误标记 # 在实际产品中,这里应该有更复杂的降级策略 return current_couplet # 示例调用 if __name__ == "__main__": current = {'upper': '龙马精神开锦绣', 'lower': '春风得意展宏图', 'horizontal': '马到成功'} instruction = "横批‘马到成功’有点俗,换一个更雅致、有古文韵味的" history = [] # 第一次精修,无历史 new_couplet = refine_couplet(current, instruction, history) print(f"精修结果:{new_couplet}") # 可能输出:{'upper': '龙马精神开锦绣', 'lower': '春风得意展宏图', 'horizontal': '骏业宏开'}代码逻辑解读:
- 系统指令:我们首先告诉AI它扮演的角色和必须遵守的规则,这是引导其行为的关键。
- 历史上下文:我们将过去几轮的用户指令和当时的对联状态组织成文本,作为背景信息提供给AI,让它知道我们是如何一步步修改过来的。
- 当前状态与指令:清晰给出当前需要修改的对联文本和用户的新指令。
- 结构化输出要求:强制要求AI以JSON格式输出,方便我们程序解析。这比让AI输出自由文本要可靠得多。
4.3 会话状态管理
为了支持多轮对话,后端需要维护一个简单的会话状态。我们可以为每个用户会话生成一个唯一的session_id,并将(instruction, couplet_before_refine)这样的配对存入缓存(如Redis)或数据库。当用户发起新一轮精修时,根据session_id取出历史记录,构建Prompt。
5. 前端与后端集成
设计好了,后端逻辑也通了,最后一步就是让前后端联动起来。
5.1 Streamlit前端代码示例
我们在原有的Streamlit应用中加入精修模块。
import streamlit as st import requests import json # 初始化session state,用于存储多轮对话历史 if 'conversation_history' not in st.session_state: st.session_state.conversation_history = [] # 存储格式: [{'instruction': '...', 'couplet_before': {...}}, ...] if 'current_couplet' not in st.session_state: st.session_state.current_couplet = None # --- 原有的皇城大门UI布局(简化) --- st.markdown("""<style>/* 原有的全屏CSS样式 */</style>""", unsafe_allow_html=True) st.title("🐎 乙巳马年 · 皇城大门春联生成终端") # 愿望输入区 wish_keyword = st.text_input("写下您的马年愿望词(如:如意、飞跃)", key="wish_input") if st.button("🧧 开门见喜", use_container_width=True): # 调用原始生成API with st.spinner('门神正在挥毫...'): # 假设生成API返回对联字典 generated = generate_initial_couplet(wish_keyword) # 这是一个假想的函数 st.session_state.current_couplet = generated st.session_state.conversation_history = [] # 重新生成时,清空精修历史 st.rerun() # 刷新页面显示结果 # --- 显示当前对联 --- if st.session_state.current_couplet: couplet = st.session_state.current_couplet # 这里用HTML/CSS渲染皇城大门风格的对联(原有逻辑) st.markdown(f""" <div class='couplet-container'> <div class='upper-line'>{couplet['upper']}</div> <div class='lower-line'>{couplet['lower']}</div> <div class='horizontal-line'>{couplet['horizontal']}</div> </div> """, unsafe_allow_html=True) # --- 全新的“对联精修坊”模块 --- st.markdown("---") st.subheader("✍️ 对联精修坊") st.caption("对生成的对联不满意?告诉AI您的修改想法,让它为您优化。") # 指令输入框 refine_instruction = st.text_area( "告诉AI您想如何修改这幅对联...", placeholder="例如:'下联能不能更豪迈一些?' 或 '横批加点马年的元素'", height=80, key="refine_input" ) # 指令示例(可折叠) with st.expander("💡 不知道怎么写?点击查看指令示例"): st.markdown(""" * **局部调整**:`“下联的‘展宏图’改成‘创辉煌’。”` * **风格变化**:`“整体风格再古朴、典雅一点。”` * **意境修改**:`“上联的意境可以更侧重于家庭团圆。”` * **用词替换**:`“感觉‘锦绣’这个词有点普通,换个更生动的。”` """) col1, col2 = st.columns([1, 5]) with col1: refine_button = st.button("开始精修", type="primary", use_container_width=True) # 处理精修请求 if refine_button and refine_instruction: if st.session_state.current_couplet: with st.spinner('AI老师傅正在斟酌字句...'): # 准备请求数据 payload = { 'current_couplet': st.session_state.current_couplet, 'instruction': refine_instruction, 'history': st.session_state.conversation_history } # 调用精修后端API try: # 假设后端API地址为 /api/refine response = requests.post('http://your-backend-api/api/refine', json=payload) if response.status_code == 200: new_couplet = response.json() # 更新会话状态:1.保存本轮历史 2.更新当前对联 st.session_state.conversation_history.append({ 'instruction': refine_instruction, 'couplet_before': st.session_state.current_couplet.copy() }) st.session_state.current_couplet = new_couplet st.success("对联已精修完成!") st.rerun() # 刷新页面显示新对联 else: st.error("精修失败,请稍后再试。") except Exception as e: st.error(f"网络请求出错:{e}") else: st.warning("请先生成一副对联再进行精修。")5.2 关键集成点说明
- 状态管理:我们利用Streamlit的
st.session_state来存储当前对联和多轮对话历史。这样在用户交互时,状态得以保持。 - 异步交互:点击“精修”按钮后,前端显示加载状态,并向后端发起POST请求。后端处理完成后,前端更新界面。这个过程是异步的,用户体验流畅。
- 历史记录:每次成功精修后,我们将
(用户指令,精修前的对联)保存到历史中。这个历史会被发送给后端,用于构建下一次精修的上下文。
6. 总结与展望
6.1 功能总结
回顾一下,我们为“皇城大门春联生成终端”成功设计并实现了一个多轮对话式精修功能。它实现了:
- 精准的局部控制:用户可以对上下联、横批的任何部分提出修改意见。
- 渐进式的迭代优化:基于对话历史的精修,让创作过程可以不断深化。
- 自然流畅的交互:一个简单的输入框,像聊天一样完成复杂修改。
- 完美的视觉融合:新功能模块无缝融入原有的皇城美学设计,不破坏仪式感。
这个功能将工具从“智能打印机”升级为“智能创作伙伴”,极大地提升了产品的实用性、趣味性和用户粘性。
6.2 未来优化方向
这是一个强大的起点,但仍有进化空间:
- 指令理解增强:可以引入一个小型分类模型,预先识别用户指令的类型(如“改词”、“调风格”、“变意境”),从而调用更针对性的精修策略。
- 视觉化反馈:当用户要求“更喜庆”时,除了修改文字,是否可以微调UI的色调或增加动画效果?让反馈不止于文本。
- 多模态精修:未来是否可以支持用户上传一张参考图片(如一幅古画),说“生成类似这种意境的对联”?这将打开更广阔的创作空间。
- 社区与分享:允许用户将精修过程(从初稿到终稿的指令序列)保存为“创作故事”,并分享给他人学习。
从“生成”到“精修”,我们迈出的这一步,本质上是让AI从“执行者”变为“协作者”。这不仅是功能的增加,更是交互范式的转变。希望这个案例能为你设计下一代AI应用带来启发。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。