用爬下来的唐诗宋词,我给自己做了个AI对诗小助手(附完整代码)

发布时间:2026/7/12 4:35:12

用爬下来的唐诗宋词,我给自己做了个AI对诗小助手(附完整代码) 用唐诗宋词构建AI对诗助手的完整实践指南从数据采集到智能应用的创意之旅记得去年深秋的一个周末我在书房整理旧书时偶然翻到一本泛黄的《唐诗三百首》。随手翻阅间突然萌生一个想法能否让这些千年流传的诗句与现代AI技术碰撞出新的火花于是这个将古典诗词与人工智能结合的对诗助手项目便诞生了。这个项目特别适合三类人群Python中级开发者想实践数据处理与AI应用结合的完整流程文学技术爱好者对传统文化与前沿科技融合感兴趣创意项目实践者寻找可展示的趣味编程作品整个项目最迷人的地方在于它完美展现了如何将原始数据转化为有温度的交互体验。下面我将完整分享这个项目的实现过程包括数据准备、模型训练和交互设计三个关键阶段。1. 诗词数据的高效采集与清洗1.1 构建稳定的数据采集管道获取优质诗词数据是整个项目的基础。我们采用Python的现代化爬虫工具链# 核心依赖库 import requests from bs4 import BeautifulSoup import json from tqdm import tqdm # 进度条显示 # 示例单页诗歌抓取函数 def fetch_poem_page(url): headers {User-Agent: Mozilla/5.0} try: response requests.get(url, headersheaders, timeout10) soup BeautifulSoup(response.text, html.parser) poem_data { title: soup.select_one(.poem-title).text.strip(), author: soup.select_one(.poem-author).text.strip(), content: \n.join([p.text for p in soup.select(.poem-content p)]), dynasty: soup.select_one(.poem-dynasty).text.strip() } return poem_data except Exception as e: print(f抓取失败: {url}, 错误: {str(e)}) return None提示在实际项目中建议设置合理的请求间隔(如3-5秒)并处理各种异常情况确保爬虫稳定运行。1.2 数据清洗的关键步骤原始采集的数据往往包含各种噪声我们需要进行系统化清洗文本规范化统一全角/半角标点去除HTML标签和特殊字符标准化换行符元数据提取分离诗题与副标题解析作者朝代信息识别诗词体裁(绝句、律诗等)内容校验过滤残缺不全的诗作排除非诗词内容验证文本编码一致性清洗后的数据结构示例{ id: T001, title: 春望, author: 杜甫, dynasty: 唐, type: 五言律诗, content: 国破山河在城春草木深。\n感时花溅泪恨别鸟惊心。\n烽火连三月家书抵万金。\n白头搔更短浑欲不胜簪。, tags: [忧国, 思乡, 战争] }1.3 高效存储方案对比根据项目规模不同可以选择合适的存储方式存储类型优点缺点适用场景JSON文件简单易用无需额外服务查询效率低小型项目(1000首)SQLite轻量级支持SQL查询并发性能有限中型项目MongoDB灵活schema扩展性强内存占用较高大型项目(1万首)MySQL成熟稳定事务支持需要单独部署需要复杂查询的项目对于大多数个人项目我推荐使用SQLite作为起步方案它既保持了简单性又提供了足够的查询能力。2. 构建智能对诗引擎2.1 大模型API的创意应用现代大语言模型为古诗创作提供了惊人能力。我们通过精心设计的prompt来引导模型def generate_poem_response(user_input, poem_context): prompt f 你是一位精通中国古典诗词的AI助手。请根据以下要求和上下文创作或分析诗歌 用户输入{user_input} 相关诗作{poem_context} 请按照以下规则响应 1. 若用户提供诗句创作符合格律的续写 2. 若用户描述意境生成相应主题的原创诗 3. 保持传统诗词的韵味和修辞手法 4. 输出包含诗作100字内的创作说明 示例输出格式 《春晓》 春眠不觉晓处处闻啼鸟。 夜来风雨声花落知多少。 创作说明这首五言绝句描绘... response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role: user, content: prompt}], temperature0.7, max_tokens500 ) return response.choices[0].message.content注意temperature参数控制创作随机性0.7适合平衡创意与规范性可根据需要调整。2.2 本地微调的小模型方案对于希望完全本地运行的用户可以考虑使用LLaMA等开源模型# 使用HuggingFace Transformers加载本地模型 from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer AutoTokenizer.from_pretrained(chinese-poem-llama) model AutoModelForCausalLM.from_pretrained(chinese-poem-llama) def local_poem_generation(prompt): inputs tokenizer(prompt, return_tensorspt) outputs model.generate(**inputs, max_length200) return tokenizer.decode(outputs[0], skip_special_tokensTrue)虽然效果略逊于商业API但这种方法完全离线适合对隐私要求高的场景。2.3 提升对诗质量的实用技巧经过多次实验我发现这些策略能显著改善输出质量上下文注入在prompt中包含相似风格的诗作格式约束明确指定字数、平仄要求多轮筛选生成3-5个候选然后人工选择最佳后处理自动检测并修正常见的格律错误实际应用中可以建立质量评估模块def evaluate_poem_quality(poem): # 评估维度包括 # 1. 格律符合度 (0-1) # 2. 意象连贯性 (0-1) # 3. 创意新颖度 (0-1) # 返回综合评分 pass3. 打造沉浸式交互体验3.1 命令行版本的快速实现对于快速验证概念命令行界面是最直接的选择import random def command_line_interface(): print(欢迎来到AI对诗助手输入诗句或主题或输入q退出) while True: user_input input( ) if user_input.lower() q: break # 从数据库随机选取相关诗作作为上下文 context_poem random.choice(poems_db) response generate_poem_response(user_input, context_poem) print(\nAI回应) print(response) print(-*40)这个基础版本虽然简单但已经能提供完整的核心功能体验。3.2 现代化Web界面开发使用Streamlit可以快速构建美观的Web应用import streamlit as st st.title( AI古典对诗助手) st.caption(与人工智能一起品味唐诗宋词的韵味) with st.sidebar: st.header(创作设置) style st.selectbox(诗歌风格, [豪放, 婉约, 田园, 边塞]) length st.slider(诗句长度, 4, 12, 8) user_input st.text_area(输入你的诗句或主题..., height100) if st.button(生成): with st.spinner(AI正在构思...): prompt f以{style}风格创作{length}句诗主题{user_input} result generate_poem_response(prompt, ) st.subheader(AI生成结果) st.write(result) if st.button(保存到收藏): save_to_favorites(result)这个界面加入了风格选择和长度控制大大提升了用户体验。3.3 移动端适配与社交分享为了让更多人可以体验我们还可以使用Flutter开发跨平台移动应用添加微信小程序版本实现作品分享功能加入用户收藏和评论系统关键代码结构lib/ ├── main.dart # 主入口 ├── models/ # 数据模型 │ ├── poem.dart │ └── user.dart ├── services/ # 服务层 │ ├── api.dart │ └── cache.dart └── views/ # 界面 ├── home.dart ├── create.dart └── share.dart4. 项目优化与扩展方向4.1 性能提升实战技巧随着诗词库增长需要考虑性能优化缓存策略from functools import lru_cache lru_cache(maxsize1000) def get_poem_by_id(poem_id): return db.query_poem(poem_id)异步处理import asyncio from aiohttp import ClientSession async def fetch_multiple_pages(urls): async with ClientSession() as session: tasks [] for url in urls: task asyncio.create_task(fetch_page(session, url)) tasks.append(task) return await asyncio.gather(*tasks)索引优化CREATE INDEX idx_poem_author ON poems(author); CREATE INDEX idx_poem_tags ON poems USING GIN(tags);4.2 有趣的扩展创意基础功能完成后可以考虑这些增强功能诗画结合用Stable Diffusion根据诗词生成配图语音朗诵接入TTS服务朗读诗作诗友对战多人在线对诗游戏风格迁移将现代诗转换为古典风格例如实现风格迁移的prompt设计请将以下现代诗转换为七言绝句的古典形式保持原意的同时符合古诗格律 原诗 《地铁站》 人群中这些面孔幽灵般闪现 湿漉漉的黑枝上花瓣点点。 转换要求 1. 严格遵循平仄规则 2. 使用传统意象 3. 保持原诗的瞬间美感4.3 项目部署与监控正式部署时需要考虑配置管理# config.yaml database: host: 127.0.0.1 port: 3306 name: poem_db user: admin api: rate_limit: 100/分钟 timeout: 30秒监控指标API响应时间错误率热门诗作排行用户活跃时段日志分析import logging from logging.handlers import RotatingFileHandler handler RotatingFileHandler(app.log, maxBytes1e6, backupCount3) formatter logging.Formatter(%(asctime)s - %(levelname)s - %(message)s) handler.setFormatter(formatter) logger.addHandler(handler)在项目开发过程中最令我惊喜的是AI对古典意象的理解能力。有一次我输入孤舟蓑笠翁AI续写出了寒江钓雪月明中的佳句这种超越简单模仿的创造性回应正是这个项目最迷人的地方。

相关新闻