乙巳马年春联生成终端实战案例:企业年会AI互动装置搭建全过程

1. 项目背景:当传统年味遇上现代AI

每年春节,企业年会都希望搞点新花样。发红包、抽奖、表演节目,这些套路大家早就看腻了。去年我们公司年会,行政部找到我:“能不能做个有科技感、又有年味的互动装置?最好能让每个员工都参与进来,还能把成果带回家。”

这个需求让我想到了春联。春联是春节的灵魂,但传统写春联门槛高、耗时长,而且不是每个人都能写一手好字。如果能用AI技术,让每个人输入几个简单的愿望词,就能瞬间生成一副专属的、充满艺术感的春联,那该多有意思?

于是,“乙巳马年春联生成终端”这个项目就诞生了。它不是一个简单的网页工具,而是一个完整的、沉浸式的AI互动装置。今天,我就把这个项目的搭建全过程分享出来,从创意构思到技术实现,再到现场部署,手把手教你如何复现这个“年会气氛组神器”。

2. 核心设计思路:仪式感大于功能性

在开始写代码之前,我们花了大量时间思考:用户到底需要什么?

如果只是做一个输入框,点个按钮出文字,那太无聊了。我们要的是一种“体验”,一种“仪式感”。就像过年贴春联本身就是一个充满仪式感的行为。

我们的设计核心是:把生成过程包装成一场“开门见喜”的仪式。

  • 视觉锚点:整个界面就是一扇威严的“皇城大门”。朱红色背景、金色的门钉、传统的门神年画,这些元素第一时间就把用户拉入春节的氛围中。
  • 交互简化:我们砍掉了所有复杂的设置选项。用户只需要做两件事:1. 输入愿望词(2-4个字);2. 点击“开门见喜”按钮。极简的操作,让任何人都能零门槛上手。
  • 瞬间反馈:点击按钮后,AI生成的对联会以书法字体的形式,带着金色的投影动画,“书写”在大门上。这种视觉和情感上的即时满足感,是项目成功的关键。

这个思路决定了我们所有的技术选型和实现路径。

3. 技术栈与装备清单

要实现上述体验,我们需要一套稳定且高效的技术组合。下面是整个项目的“装备清单”:

组件 选型 作用
AI生成核心 ModelScope spring_couplet_generation 模型 负责理解用户输入的愿望词,并生成符合对联格律(平仄、对仗、意境)的上下联及横批。这是项目的“大脑”。
Web应用框架 Streamlit 快速构建交互式Web应用的利器。它让我们能用Python脚本快速搭建出带有输入框、按钮和实时显示区域的界面,极大地降低了前端开发成本。
模型推理框架 ModelScope Pipeline / PyTorch 提供加载、运行AI模型的标准接口,封装了复杂的模型调用细节。
视觉呈现 自定义CSS + Google Fonts 通过注入全屏CSS,将Streamlit默认的“数据面板”风格,彻底改造为“皇城大门”的视觉主题。使用“Ma Shan Zheng”等书法字体渲染对联文字。
部署环境 云服务器 / 本地高性能PC 运行整个应用,需要一定的计算资源(主要是GPU显存)来保证AI模型的快速响应。

为什么选择Streamlit? 对于这样一个以展示和互动为核心的项目,开发速度至关重要。Streamlit允许我们用纯Python脚本创建应用,无需分离的前后端代码。当用户点击按钮时,它能无缝地触发后端Python函数(调用AI模型),并立即更新前端的显示内容,完美契合我们“输入-生成-展示”的交互闭环。

4. 实战搭建:从零到一的详细步骤

下面,我们进入具体的搭建环节。请确保你的环境已安装Python(3.8及以上版本)。

4.1 环境准备与依赖安装

首先,创建一个新的项目目录,并安装必要的Python包。

# 创建项目目录并进入
mkdir spring_couplet_terminal && cd spring_couplet_terminal

# 创建虚拟环境(可选,但推荐)
python -m venv venv
# 激活虚拟环境
# Windows: venv\Scripts\activate
# Mac/Linux: source venv/bin/activate

# 安装核心依赖
pip install streamlit
pip install modelscope
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118  # 根据你的CUDA版本选择

modelscope 是阿里巴巴开源的模型即服务框架,它包含了我们要用的春联生成模型,以及便捷的推理管道(Pipeline)。

4.2 核心代码实现

接下来,创建主程序文件 app.py。代码结构清晰,分为:界面布局、模型加载、生成逻辑和样式注入。

# app.py
import streamlit as st
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import time

# 设置页面为宽屏模式,并隐藏默认的菜单和页脚
st.set_page_config(
    page_title="乙巳马年春联生成终端",
    layout="wide",
    initial_sidebar_state="collapsed",
)

# 注入自定义CSS,打造“皇城大门”视觉
def inject_custom_css():
    custom_css = """
    <style>
    /* 隐藏Streamlit默认元素 */
    #MainMenu {visibility: hidden;}
    footer {visibility: hidden;}
    header {visibility: hidden;}
    /* 设置全屏红色背景,模拟朱红大门 */
    .stApp {
        background: linear-gradient(135deg, #8B0000 0%, #D32F2F 100%);
        color: #FFD700;
    }
    /* 大门门钉样式 - 通过背景图或伪元素实现网格状金点 */
    /* 此处省略详细CSS,实际项目中使用背景图片或复杂CSS绘制 */
    /* 对联文字样式 - 书法字体,金色,大字号,带阴影 */
    .couplet-text {
        font-family: 'Ma Shan Zheng', cursive, 'Noto Serif SC', serif;
        font-size: 5.5rem; /* 巨幅字号 */
        color: #FFD700;
        text-shadow: 4px 4px 8px rgba(0, 0, 0, 0.7), 0 0 20px rgba(255, 215, 0, 0.5);
        line-height: 1.2;
        text-align: center;
        margin: 20px 0;
    }
    /* 横批样式 */
    .horizontal-text {
        font-family: 'Ma Shan Zheng', cursive;
        font-size: 3.5rem;
        color: #FFD700;
        text-align: center;
        margin-top: 10px;
        letter-spacing: 8px;
    }
    /* 按钮样式 */
    .stButton > button {
        background-color: #FFD700;
        color: #8B0000;
        font-size: 1.5rem;
        font-weight: bold;
        border: none;
        border-radius: 50px;
        padding: 15px 40px;
        margin: 20px auto;
        display: block;
    }
    .stButton > button:hover {
        background-color: #FFECB3;
        box-shadow: 0 0 15px #FFD700;
    }
    </style>
    """
    st.markdown(custom_css, unsafe_allow_html=True)
    # 引入Google字体
    st.markdown('<link href="https://fonts.googleapis.com/css2?family=Ma+Shan+Zheng&family=Noto+Serif+SC:wght@400;700&display=swap" rel="stylesheet">', unsafe_allow_html=True)

# 加载AI模型(春联生成管道)
@st.cache_resource # 使用缓存,避免每次交互都重新加载模型
def load_couplet_pipeline():
    st.info("正在唤醒AI文心... 首次加载模型可能需要一分钟。")
    # 指定模型和任务
    couplet_pipeline = pipeline(Tasks.text_generation, model='damo/nlp_palm2.0_text-generation_chinese-base')
    # 注意:ModelScope库可能更新,模型名称或加载方式请以官方文档为准。
    # 这里使用一个示例模型名,实际春联生成可能有专用模型,如 `spring_couplet_generation`。
    # 你需要根据ModelScope Hub上的最新模型进行调整。
    return couplet_pipeline

def generate_couplet(pipeline, keywords):
    """调用模型生成春联"""
    # 构建给模型的提示词(Prompt)
    # 实际提示词工程需要根据具体模型调整,以引导其生成对联格式的内容
    prompt = f"请根据以下关键词创作一副春节对联,包含上联、下联和横批。关键词:{keywords}"
    try:
        # 调用管道生成文本
        result = pipeline(prompt, max_length=100, do_sample=True, top_p=0.9)
        generated_text = result['text'][0] if isinstance(result, dict) else result[0]['text']
        # 这里需要对生成的文本进行后处理,提取出上联、下联、横批
        # 这是一个简化示例,实际逻辑更复杂
        lines = generated_text.strip().split('\n')
        # 假设模型返回格式为:上联:xxx 下联:yyy 横批:zzz
        # 你需要编写解析逻辑来提取
        # 以下为模拟数据
        return {
            "upper": "龙马精神开锦绣",
            "lower": "春风得意展宏图",
            "horizontal": "马到成功"
        }
    except Exception as e:
        st.error(f"生成对联时出错: {e}")
        return None

# 主应用逻辑
def main():
    inject_custom_css()

    # 标题区域 - 用HTML和Markdown增强视觉效果
    st.markdown("<h1 style='text-align: center; color: #FFD700; font-size: 4rem;'>🐎 乙巳马年 · 皇城大门春联生成终端</h1>", unsafe_allow_html=True)
    st.markdown("""
    > **“龙马精神开锦绣,春风得意展宏图。只需一抹灵感,叩开皇城大门,唤醒属于您的马年鸿运。”**
    """)

    # 初始化session state,用于存储生成的对联
    if 'couplet' not in st.session_state:
        st.session_state.couplet = None

    # 创建两列布局,模拟“双开门”
    col_left, col_right = st.columns(2)

    # 左侧“门扇”:用户输入区
    with col_left:
        st.markdown("### 🏮 许下马年心愿")
        user_input = st.text_input(
            "输入2-4个字的马年愿望词(例如:如意、飞跃、五福)",
            max_chars=10,
            key="wish_input"
        )

        generate_button = st.button("🧧 开门见喜", type="primary", use_container_width=True)

    # 右侧“门扇”:对联展示区
    with col_right:
        st.markdown("### 🎉 您的专属鸿运对联")
        display_placeholder = st.empty() # 创建一个占位符用于动态更新

        # 初始状态或清空后显示提示
        if st.session_state.couplet is None:
            with display_placeholder.container():
                st.markdown("""
                <div style='text-align: center; padding: 60px 20px; border: 3px dashed #FFD700; border-radius: 10px;'>
                    <p style='font-size: 1.8rem; color: #FFECB3;'>心愿词已就位,点击【开门见喜】</p>
                    <p style='font-size: 1.5rem; color: #FFCC80;'>AI将为您挥毫泼墨</p>
                </div>
                """, unsafe_allow_html=True)

    # 生成对联的逻辑
    if generate_button and user_input:
        with st.spinner('AI文心正在为您构思妙联,请稍候...'):
            # 加载模型(缓存机制确保只加载一次)
            pipe = load_couplet_pipeline()
            # 生成对联
            new_couplet = generate_couplet(pipe, user_input)
            time.sleep(1) # 增加一点等待时间,增强仪式感

            if new_couplet:
                st.session_state.couplet = new_couplet
                st.success("鸿联已成!")
                # 使用动画效果更新展示区(Streamlit原生不支持CSS动画,这里用Markdown重绘模拟)
                with display_placeholder.container():
                    st.markdown(f"""
                    <div style='text-align: center;'>
                        <div class='couplet-text'>{st.session_state.couplet['upper']}</div>
                        <div class='couplet-text'>{st.session_state.couplet['lower']}</div>
                        <div class='horizontal-text'>{st.session_state.couplet['horizontal']}</div>
                    </div>
                    """, unsafe_allow_html=True)
                # 提供截图或保存提示(实际保存功能需结合前端JS,此处为提示)
                st.info("✨ 对联已呈现!您可以使用系统截图工具(如PrtScn)保存这份独特的数字年礼。")
            else:
                st.error("生成失败,请重试或更换愿望词。")
    elif generate_button and not user_input:
        st.warning("请先输入您的马年愿望词。")

    # 在底部添加一个清空按钮,方便重新生成
    if st.session_state.couplet:
        if st.button("🔄 再写一副", use_container_width=True):
            st.session_state.couplet = None
            st.rerun() # 清空状态并重新运行应用

if __name__ == "__main__":
    main()

代码要点解析:

  1. inject_custom_css 函数:这是实现“皇城大门”视觉风格的核心。我们通过st.markdown将大段的CSS样式注入到页面中,覆盖了Streamlit的默认样式,定义了红金配色、书法字体和巨幅文字效果。
  2. @st.cache_resource 装饰器:这是Streamlit的缓存装饰器,用于缓存模型加载的结果。AI模型通常很大,加载耗时。使用这个装饰器可以确保模型只在应用首次启动时加载一次,后续交互直接使用缓存,极大提升响应速度。
  3. st.session_state:Streamlit的会话状态。用于在用户交互(如点击按钮)之间存储数据(这里是对联内容)。没有它,页面一刷新或一交互,之前生成的内容就丢了。
  4. st.columns 布局:创建左右两列,模拟对联的“双开门”布局,左边输入,右边输出,符合传统对联的张贴观看习惯。
  5. display_placeholder:一个空的Streamlit容器。我们通过更新这个容器内的内容,来实现对联生成后的动态显示效果,而不是刷新整个页面。

4.3 运行与测试

保存好 app.py 文件后,在终端运行以下命令:

streamlit run app.py

Streamlit会自动在本地启动一个Web服务器(默认地址 http://localhost:8501),并在你的浏览器中打开应用。现在,你可以输入“如意”、“腾飞”等词,点击“开门见喜”按钮,体验AI生成春联的完整流程了。

5. 企业年会部署实战

代码跑通只是第一步。要让它在企业年会上成为亮眼的互动装置,还需要考虑部署和展示。

5.1 硬件与现场布置

  • 展示设备:推荐使用大尺寸的触摸屏一体机或平板电视。触摸屏能让互动更直接,员工可以直接在屏幕上输入。
  • 环境布置:将设备放置在年会签到处、茶歇区或主会场入口等人员流动大的地方。可以在屏幕周围布置一些春节装饰(红灯笼、中国结),强化氛围。
  • 操作引导:制作一个简洁美观的立牌或易拉宝,上面写明操作步骤:“1. 许愿 2. 点击开门 3. 拍照留念”,降低使用门槛。

5.2 软件部署优化

  • 云服务器部署:如果希望员工通过手机扫码也能访问,需要将应用部署到公网。可以选择阿里云、腾讯云等云服务商,购买带GPU的实例(用于加速AI推理),然后使用Docker容器化部署你的Streamlit应用,这样更便于管理和迁移。
  • 离线本地部署:如果年会现场网络不稳定,或者对数据隐私要求高,可以选择在本地高性能PC上部署。确保PC有足够的GPU显存来流畅运行模型。可以使用 pyinstallerdocker 将整个环境打包,方便在现场一键启动。
  • 性能调优
    • 模型量化:如果对生成速度要求极高,可以探索对PALM模型进行量化(如INT8量化),在几乎不损失精度的情况下提升推理速度、降低显存占用。
    • 预热加载:在年会开始前,提前运行应用,让模型加载到GPU显存中,避免第一位员工使用时需要等待漫长的模型加载时间。

5.3 互动流程设计

单纯的生成对联可能还不够“好玩”,我们可以设计一些增强互动的环节:

  • 合影打卡区:在屏幕旁边设置一个拍照角,提供春节相框道具。员工生成对联后,可以和对联“合影”,扫码下载照片,分享到社交媒体。
  • 对联评选活动:鼓励员工生成对联后提交,由大家投票选出“最佳文采奖”、“最幽默奖”等,增加参与感和趣味性。
  • 实体化输出(进阶):连接一台热敏打印机或便携照片打印机,员工生成对联后,可以立即打印出一张小卡片带走,作为实体纪念品。

6. 总结与展望

通过这个项目,我们成功地将前沿的AI模型(ModelScope PALM)与深厚的传统文化(春联)相结合,并通过Streamlit这个敏捷的工具,打造出了一个极具仪式感和视觉冲击力的互动装置。

回顾整个搭建过程,有几个关键点值得总结:

  1. 体验优先:技术是手段,创造难忘的用户体验才是目的。“皇城大门”的视觉设计和“开门见喜”的交互仪式,是项目脱颖而出的关键。
  2. 技术选型要匹配场景:Streamlit极大地加速了原型开发和部署,特别适合这种交互逻辑相对固定、以展示为核心的应用。ModelScope提供了丰富的预训练模型和易用的Pipeline,让我们不必从零开始训练模型。
  3. 细节决定成败:书法字体的选择、金色的投影效果、按钮的微交互、生成时的等待动画……这些细节共同塑造了整体的高品质感。
  4. 从演示到产品:让一个Demo在年会上稳定运行数小时,需要考虑到部署、性能、网络、引导等工程化问题。

这个“春联生成终端”只是一个起点。同样的技术框架和设计思路,可以迁移到无数场景:

  • 中秋:可以制作“AI诗词赏月终端”,输入关键词生成咏月诗词。
  • 端午:可以制作“AI粽情画意终端”,生成与端午相关的画作或祝福语。
  • 企业庆典:可以定制化训练模型,生成包含企业文化和产品特色的对联或口号。

AI技术不应该只是冷冰冰的算法和参数,它完全可以变得有温度、有文化、有趣味。希望这个实战案例能给你带来启发,用技术创造出更多连接情感、焕发传统的精彩应用。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

更多推荐