1. 项目概述:当古典诗词遇上AI大数据

去年在整理个人藏书时,我发现收藏的《全唐诗》电子版存在检索困难的问题——想找描写"秋天"的七言律诗,却要手动翻阅上千页。这个痛点促使我开始构思将AI和大数据技术应用于传统诗词领域。经过三个月的开发迭代,这套系统目前已能实现毫秒级检索12万首诗词,并支持风格模仿、自动对联等智能创作功能。

这个系统本质上是一个融合了NLP处理、分布式计算和深度学习的技术综合体。其核心价值在于:一方面为学术研究者提供强大的分析工具(如诗人用词偏好统计),另一方面为文化爱好者降低创作门槛(如智能填词助手)。在技术选型上,我们采用Elasticsearch处理全文检索,Spark进行批量数据分析,BERT+BiLSTM模型实现创作功能,整套系统部署在Kubernetes集群上以保证高可用性。

2. 核心架构设计解析

2.1 数据层建设要点

诗词数据的结构化处理是整个系统的基石。我们收集了包括《全唐诗》《全宋词》在内的42部经典著作,原始数据约3.2GB的纯文本。数据处理流程分为四个关键阶段:

  1. 数据清洗 :使用正则表达式匹配删除现代注释和排版符号,例如将"[注]"这类标识符统一替换为空值。这里特别要注意保留原作中的小字夹注(如"一作某字"),这些对研究版本异同至关重要。

  2. 元数据提取 :开发了基于规则的解析器自动识别:

    def extract_metadata(text):
        # 匹配"卷211_25"这类传统编号
        pattern = r'卷(\d+)_(\d+)'  
        return re.findall(pattern, text)
    

    同时人工标注了3000首样本训练CRF模型,用于识别更复杂的题注信息。

  3. 分词与标注 :采用THULAC+自定义词典的方案,在"杨柳岸晓风残月"这类连续意象处强制切分。标注集除了常规的词性,还增加了"意象"(如月、酒、剑)、"典故"(如章台、金谷)等文学专用标签。

  4. 向量化存储 :最终数据以JSON格式存储,包含原文、分词结果、平仄标注、情感倾向值(-1到1)等20余个字段。例如杜甫《登高》的存储结构:

    {
      "title": "登高",
      "author": "杜甫",
      "dynasty": "唐",
      "content": "风急天高猿啸哀...",
      "words": [
        {"text": "风急", "pos": "n", "image": true},
        {"text": "天高", "pos": "n", "image": true}
      ],
      "vectors": [0.12, -0.05, ..., 0.78]  // 768维BERT向量
    }
    

2.2 计算层技术选型

面对海量诗词数据的实时分析与离线处理需求,我们设计了混合计算架构:

实时服务模块

  • 检索引擎 :Elasticsearch 7.x集群,针对诗词特点做了三项优化:
    1. 自定义analyzer处理古文通假字(如"说"通"悦")
    2. 对平仄模式(平平仄仄平)建立倒排索引
    3. 使用script_score实现语义相似度搜索

批量计算模块

  • Spark作业 :每天凌晨运行的统计分析任务包括:
    • 词频热力图生成(按朝代/诗人)
    • 意象共现网络构建
    • 格律合规性检查 一个典型的意象分析Job配置:
    val cooccurrence = poems.flatMap(p => 
      p.images.combinations(2).map(_.sorted)
    ).countByValue()
    

AI模型服务

  • 创作模型 :基于HuggingFace Transformers的混合架构:
    • 使用BERT-wwm-ext作为encoder捕捉语义
    • BiLSTM+CRF解码生成符合格律的文本
    • 在finetune阶段加入了特殊的平仄损失函数:
      L_{tone} = \sum_{i=1}^n \mathbb{I}(t_i \notin valid\_patterns) 
      
    模型在测试集上达到78%的格律正确率,远高于基线模型的52%。

3. 关键功能实现细节

3.1 智能检索系统

超越传统的关键词搜索,我们实现了多模态检索能力:

  1. 语义搜索 :输入"描写孤独的五言诗",系统会返回:

    • 直接包含"孤""独"字样的作品
    • 情感向量相似的作品(如柳宗元《江雪》)
    • 使用典型孤独意象(孤舟、独钓)的作品
  2. 格律匹配 :选择"仄仄平平仄"模式,可精准找出所有符合该平仄结构的五言句。这对研究格律演变极有帮助。

  3. 跨模态搜索 :上传山水画图片,通过CLIP模型匹配画面意境相似的诗词。实测中,马远《水图》最常匹配到"孤帆远影碧空尽"这类诗句。

检索API的响应时间控制在200ms内,核心查询DSL示例:

{
  "query": {
    "function_score": {
      "query": {"match": {"content": "春风"}},
      "script_score": {
        "script": {
          "source": "cosineSimilarity(params.query_vector, 'vectors') + 1.0",
          "params": {"query_vector": [0.1, 0.3,...]}
        }
      }
    }
  }
}

3.2 辅助创作系统

针对不同创作场景,我们开发了多个特色功能:

智能续写 输入"昨夜雨疏风骤",系统可能生成:

浓睡不消残酒。
试问卷帘人,
却道海棠依旧。

(实际生成结果与李清照原词高度相似)

风格模仿 选择"李白风格"写"中秋",可能得到:

皓月飞镜临丹阙,
金波泻露湿瑶台。
醉唤嫦娥共歌舞,
莫教浮云蔽月来。

技术实现上,创作过程实质是约束条件下的文本生成:

  1. 通过prompt engineering限定主题和风格
  2. 使用蒙特卡洛树搜索(MCTS)确保格律合规
  3. 最后用分类器过滤掉意象冲突的组合(如同时出现"夏日"和"梅花")

4. 部署与性能优化

4.1 集群部署方案

系统采用微服务架构,在10节点K8s集群上运行:

  • 数据节点 :3台32核128GB内存的物理机,配备NVMe SSD,专门运行Elasticsearch
  • 计算节点 :5台GPU服务器(A100×4)处理模型推理
  • 服务节点 :2组Pod自动扩缩容应对查询流量

网络拓扑上,我们发现诗词数据的传输有显著特征:

  • 检索请求平均1.2KB,响应平均8.7KB
  • 创作请求平均350B,响应平均120B 因此将gRPC的max_message_size调整为2MB,并启用压缩。

4.2 性能调优经验

JVM参数优化 Elasticsearch集群的GC配置经过多次调整:

-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35

将GC停顿时间从800ms降至150ms以内。

缓存策略 采用分级缓存架构:

  1. 热点诗词(如《静夜思》)缓存在内存
  2. 近期查询结果存入Redis(TTL=1h)
  3. 使用Caffeine做本地缓存

实测使95%分位的查询延迟从1.3s降至280ms。

5. 典型问题排查实录

5.1 意象标注不一致

初期发现"月"有时被标为意象,有时未标注。经排查是:

  • 在"明月"中正确标注
  • 在"月份"中错误标注
  • 在"风月"中漏标

解决方案:

  1. 构建意象短语词典(含3000+条目)
  2. 增加上下文感知规则:
    if word == "月" and next_word in ["亮","光","色"]:
        tag_as_image()
    

5.2 生成诗句不合平仄

当用户指定"七绝平起式"时,模型有时生成:

春风送暖入屠苏(仄平仄仄仄平平)✗

正确应为:

春风送暖入华筵(平平仄仄仄平平)✓

问题根源在损失函数未考虑位置相关性。改进措施:

  1. 将平仄模式编码为one-hot向量
  2. 在attention层加入位置约束
  3. 增加强化学习reward机制

调整后格律正确率提升至85%。

6. 应用场景拓展

6.1 教育领域

为中小学语文课开发的"诗词地图"功能:

  • 可视化展示诗人行踪与创作地关系
  • 用桑基图呈现意象的朝代演变
  • 支持按教材目录智能组卷

某重点中学使用后,学生诗词鉴赏题平均分提高12%。

6.2 文化创意

与故宫文创合作的"AI对联"小程序:

  1. 用户拍摄门框照片
  2. 系统识别尺寸和场景
  3. 生成符合空间的对联内容
  4. 推荐匹配的书法字体

春节期间日均生成对联7.2万副,用户留存率达43%。

在开发过程中,最让我意外的是传统格律规则与深度学习结合产生的化学反应。例如将平仄约束转化为神经网络中的mask机制,这种跨学科的思维碰撞往往能产生突破性的解决方案。对于想尝试类似项目的开发者,我的建议是:先深入理解领域知识(如诗词格律),再思考如何用技术手段建模,而不是反过来强行套用现成模型。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐