
简介这是一本系统探讨自然语言生成NLG领域数据驱动方法与实证评估的专著面向NLP研究者、算法工程师及高校相关专业学生尤其适合希望了解如何通过语料库和实验设计来提升生成文本质量的读者。书中首先厘清NLG与自然语言理解NLU的差异即生成本质上是一个选择问题而非消歧问题并结合天气预报、医学信息总结等实际场景说明其应用价值。在此基础上作品详细阐述了该领域从依赖知识库的传统方法向概率模型与语义透明语料库转型的必然性讨论了文本到文本生成任务中常见的一致性与连贯性难题并介绍了基于高斯混合模型的内容排序、生成挑战共享任务、标准评估度量等前沿实践帮助读者建立起从问题建模、语料构建到系统评测的完整链路。压缩包内为1个PDF文件共6.24MB内容为英文专著的中文翻译版。已有114人浏览学习适合作为自然语言处理进阶学习的参考书与实验设计指南。1. 两条路线之争自然语言生成到底靠经验还是靠数据做自然语言生成NLG这几年我被问得最多的一个问题就是写文案、写摘要、生成对话到底是靠规则模板靠谱还是靠模型数据靠谱问出这个问题的人多半是被网上两派观点搞糊涂了。一派说老牌NLG全靠人工写规则、写模板精准可控不出错另一派说深度学习时代还谈什么模板端到端生成才是王道。我的真实看法是这两派压根不在一个赛道上。所谓经验方法本质是“把语言生成拆成可解释的规则系统”适合业务边界清晰、输出格式固定的场景所谓数据导向本质是“从大规模语料里学出语言分布”适合开放域、多样化表达的场景。真正成熟的项目往往是先想清楚自己的约束条件再决定在二者之间怎么取一个平衡点。就拿最常见的电商评论自动回复来说。如果只是针对“物流慢”“质量差”“尺码偏小”这几个固定问题做回复模板完全够用还能保证每一句回复都合法合规但如果希望用户问什么都能答甚至带点语气变化和情感温度光靠模板就撑不住了必须引进数据驱动的生成模型。这篇文章我想结合自己做NLG系统的一些实际经验把这两条路线的拆解、落地和踩坑过程详细展开说一遍。既有从零搭规则引擎的工程细节也有训练和微调生成模型的完整路径还会聊到我最近折腾的一个新问题——“自然语言生成的JS脚本到底要不要自己实现MCP还是直接用现成的”。这个话题虽然听起来偏工具链但它背后牵涉到NLG项目里一个特别关键的取舍逻辑值得单开一节讲。2. 从规则到模型NLG系统的整体设计思路2.1 经验方法的核心框架内容规划、句子规划与表层实现先聊经验方法。做规则驱动NLG圈内有个经典的三段式划分内容规划what to say、句子规划how to say、表层实现surface realization。这三个层次分别是决定说什么、怎么组织结构、最终用哪些词句落地的环节。我最早接手的一个项目是给企业内部做周报自动生成。最初产品经理的想法特别简单就是把本周的工单数据、项目进展、风险项填进一个Word模板。后来做着做着我发现纯模板有两个硬伤一是同一个风险项在不同周次里描述方式完全一样读者很快就审美疲劳二是如果某个周次没有数据模板就把那一节空着读起来非常突兀。于是我把内容规划这一层单独拎了出来。先定义好周报里可能出现的内容块比如“本周关键进展”“待推进事项”“风险预警”“下周期待”然后给每个内容块配备一个条件触发器——只有数据满足特定条件时才输出这个块。这样做的好处是内容的选择是由数据和规则共同决定的而不是被固定结构绑定。到了句子规划层我才开始处理语句顺序和连贯性到了表层实现层才真正去匹配句式模板进行时态、单复数、专业术语的统一。这一套流程跑通之后周报的可读性提升了一个档次。但我也必须承认规则系统的维护成本会随业务复杂度指数上升。每新增一种内容类型就要写对应的触发条件、模板、优先级判断规则之间还会互相打架。这个现象在业内有个很形象的说法叫“规则雪崩”。2.2 数据导向的核心逻辑端到端生成与条件控制数据导向的方法论则完全是另一个思路。它不显式定义“先规划内容再生成句子”而是把整个生成过程建模成条件概率问题给定输入数据或控制条件让模型直接产出目标文本。经典的做法是序列到序列模型比如基于Transformer架构的编码器-解码器模型输入是结构化数据序列输出是自然语言序列。我用数据导向方法做的第一个完整项目是电商平台的商品卖点生成。输入是商品的规格参数、用户评价标签、价格区间等结构化信息输出是3到5句话的卖点文案。最开始我尝试直接用现成的中文预训练模型做微调素材是平台积累的几十万条历史优质文案。训练过程其实没有想象中那么玄乎。首先把每条历史文案和对应的商品结构化信息配对拼成一个输入序列然后在模型训练阶段让模型学习从“信息序列”映射到“文案序列”。推理阶段给定新的商品信息模型自主决定先写哪项参数、用什么形容词、如何组织逻辑。试跑了一个版本后我有点惊讶模型生成的文案流畅度已经能赶上初级运营的水平而且几乎不会出现模板方法里常见的“每句话都以功能开头”的机械感。但数据导向并不是没有代价。最大的问题就是不可控。同样的商品信息模型有时会写“轻至200g携带毫无负担”有时会突然冒出一句“适合作为礼物送给朋友”——这句话完全没有数据依据。如果在金融、医疗这类高合规场景这种自由发挥是绝对不被允许的。所以我后来基本形成了一个判断标准**合规要求越高的场景经验规则的占比应该越重多样性要求越高的场景数据模型的占比应该越重。**两种方法不是替代关系而是互补关系。3. 经验方法的核心细节与实操要点3.1 模板不是简单填空变量、条件与次序处理说到规则驱动的NLG很多人误以为就是写一堆字符串模板然后做拼接。事实上一套能上线的模板系统需要考虑的细节远比“填空”复杂得多。首先是变量处理。同一个变量在不同语境下可能需要不同的表述形式。比如一个时间变量在“项目启动”语境下可能显示为“2024年3月1日”在“距离项目启动还有”语境下就需要输出“还有29天”这就需要模板引擎能根据不同槽位调用不同的变量格式化函数。其次是条件渲染。我见过最朴素的做法是在模板里塞满if-else看起来没什么问题可一旦条件嵌套了两三层整个模板就会变得没法维护。我后来采用的方式是把条件抽成独立的谓词函数每个谓词负责一个业务判断模板只负责声明“什么条件下显示哪一段内容”。这样模板的阅读性好很多也容易做单元测试。第三点是次序处理。在生成一段包含多个信息点的文本时信息点的先后顺序往往直接影响读者的理解。规则系统里我会定义一个排序器根据信息点的业务优先级、时间顺序、逻辑关系等维度动态调整输出顺序。比如周报里“风险预警”永远排在“关键进展”之后因为要先亮出成绩再说问题这是内部沟通的隐性规则。3.2 规则引擎的避坑经验和维护策略规则系统最大的坑是规则冲突。当规则数量超过几百条后A规则产生的输出可能违反了B规则的前提条件这种冲突在开发环境里很难提前发现。我的做法是给每条规则加一组前后置条件声明然后在启动时跑一遍全量规则自检检测是否存在“循环依赖”“不可达规则”“条件冲突”三类问题。另一个常见问题是文本多样性差。纯模板生成的文本句子结构高度重复读者一眼就能看出是机器写的。我通常会为同一个内容块准备多种句式变体然后在输出时根据上下文轮换选择。这里的轮换不能是完全随机不然相邻两段会显得风格跳跃而是要定义一个平滑的分布策略保证整体风格保持一致。规则系统的维护还必须考虑版本管理。很多人觉得模板不是代码不需要走严格的版本控制。实际上模板逻辑对业务的影响非常直接一次失误的模板更新可能让全部对外文案出错。我建议把模板文件纳入代码仓库管理每次改动走评审和回归测试流程输出样例要进行对比审查。这一点上吃过亏的人应该深有体会。4. 数据导向实践从语料处理到生成模型落地4.1 数据是数据导向项目最大的隐形门槛很多刚接触NLG的开发者以为数据导向就是找到一堆文本丢给模型训练就完事了。真正上手后会发现数据清洗和配对才是工作量最大的环节甚至占掉整个项目60%以上的时间。以商品卖点生成为例要训练一个合格的生成模型首先得做好结构化数据的字段对齐不同商品类目的规格项名称差异巨大手机讲“存储容量”衣服讲“面料成分”这些字段必须统一映射到一个中间表示上其次要清洗文案中的广告违禁词、敏感词还要去掉带有强时效性的促销信息否则模型会把“国庆大促”当作卖点特征学进去。文本去重同样不能忽略。电商文案里同一个商品往往有大量相似描述如果这些重复样本进入训练集模型会对高频句式产生严重过拟合生成结果变得异常单调。我处理的方法是先做基于n-gram重叠度的近似去重再人工抽检一批确认去重后语料的多样性仍然足够。4.2 模型选型、微调与生成控制参数模型选型的问题我走过一段弯路。早期的尝试直接用通用预训练模型在业务语料上做全量微调效果并不好因为通用模型的知识分布和业务数据分布相差太大训练容易不稳定。后来改为两阶段方案先在通用中文语料上做继续预训练让模型适应目标领域的词汇和表达习惯再用业务数据做有监督微调。经过这一轮调整后生成质量有了明显提升。在推理阶段参数控制是个精细活。temperature值调太低生成结果接近贪心解码很稳但容易重复调太高文本流畅度会下降甚至出现语法错误。top-p采样同样需要配合调整。我常用的组合是temperature设0.85、top_p设0.9既能保证多样性又能控制质量。不过这个值不是通用的文本长度越长参数越要保守否则长文本容易跑偏。还有一个关键技巧是加入控制编码。在训练时把文本风格、字数范围、情感倾向这些属性打成特殊token拼到输入序列里推理时通过指定控制token来引导模型生成不同风格的文本。这种做法相当于在数据导向的框架里引入了人工经验的约束效果往往比单纯调采样参数来得更稳定。4.3 自动评估与人工评估配合使用评估生成质量是数据导向NLG里最容易糊弄、也最不该糊弄的环节。纯自动评估指标BLEU和ROUGE在生成式NLG上的表现一直存在争议尤其是面对多样化的文本表达自动指标常常出现“分数很高但内容质量很差”的情况。我现在的做法是自动评估和人工评估相结合自动评估负责大规模粗筛主要监控语义相似度、关键词覆盖率和文本流畅度人工评估负责小批量精判建立维度打分表从准确性、完整性、可读性和合规性四个维度打分。重点提一下人工评估的标尺一致性。多人参与的人工评估很容易出现“松紧不一”的问题所以评估前要先做一轮校准测试让评估者对同一批样本打分讨论分数差异统一标准后再进入正式评估流程。这样做出来的评估结果才有跨版本对比的意义。5. 工程落地JS脚本、MCP选型与自然语言生成工具的实践思考5.1 为什么要在前端跑自然语言生成最近圈子里讨论很热的一个问题是自然语言生成能力怎么落地到JS脚本里以及在这个过程中需不需要自己实现MCPModel Context Protocol还是直接用现成的MCP实现。我理解大家的焦虑毕竟现在各种“MCP服务器”满天飞概念还在快速演化谁都不想选错方向更不想重复造轮子。先来厘清MCP到底是什么。MCP是一个开放协议用来标准化AI模型与外部工具、数据源之间的交互方式。你在前端或者后端脚本里挂一个MCP客户端就等于给模型装了一组可以随时调用的“插头”这些插头连的是搜索接口、数据库、业务API或者任何你想让模型使用的资源。回到自然语言生成场景来看MCP解决的其实不是“怎么生成文本”而是“模型在生成文本时需要获取哪些上下文、调用哪些工具”的问题。至于JS脚本里跑自然语言生成最常见的需求是浏览器端或Node.js端做轻量级文本生成比如表单自动填写的语义补全、客服聊天框里的实时应答建议、内容管理后台的摘要生成。在这些场景里直接调用远程服务端的大模型API当然可行但中间这一层MCP协议却是能不能实现“模型自动检索知识库、调用业务工具、再生成回答”的关键。5.2 自研MCP和直接用现成的怎么选我个人的倾向是能用现成MCP的情况下绝对不要自己实现MCP。原因很简单MCP的价值在于生态互通官方或社区已经有一批成熟的服务器实现覆盖了文件读写、数据库查询、HTTP请求、搜索等常见能力。你自己写一个MCP服务器不仅要处理JSON-RPC通信、能力协商、工具注册这些技术细节还要维护后续的协议升级兼容成本并不低。但在两种情况下我会认真考虑自研。第一种是私有协议或安全要求极高的情况比如企业内部数据完全不允许出内网或者业务服务使用的认证方式非常特殊现成MCP根本适配不了第二种是对性能有极致要求的场景标准MCP实现的调度开销过大需要裁剪协议来降低延迟。这两种情况在整个需求池里占比其实很小大部分人碰到的问题现成方案都能解决。如果你真决定用现成的MCP我的选择排序是这样的先看官方或主流框架自带的MCP客户端能力再看社区公认的通用服务器实现最后才考虑自己封装。选型时重点确认三件事一是这个实现的活跃度和发布频率二是有没有一个可回退的降级方案三是它支持的工具类型是否覆盖你的核心业务。5.3 一个极简落地示例JS脚本里调用远程NLG服务给一个比较通用的落地骨架。假设你在Node.js环境里做一个自动摘要功能前端采集到一段用户反馈文本后后端脚本需要调用NLG服务生成摘要然后把摘要写回数据库。这个过程里MCP负责的是模型与外部存储之间的连接。第一步初始化客户端并连接你选择的MCP服务器第二步把用户反馈文本作为输入参数传给NLG模型中负责摘要生成的那个工具第三步拿到模型返回的摘要后通过另一个数据写入工具持久化到数据库第四步在异常分支里做好错误处理和重试逻辑。伪代码大概长这样import { MCPClient } from some-org/mcp-client; const client new MCPClient({ endpoint: ... }); await client.connect(); const feedback req.body.feedback; const result await client.callTool(nlg_summarize, { input_text: feedback, max_length: 120 }); await client.callTool(db_insert, { collection: summaries, record: { feedback, summary: result.text, created_at: Date.now() } });这段代码没什么高深的但它展示了一个核心变化以前你要为每个外部能力写独立的集成代码现在这些都收敛成了一组标准化工具调用维护起来清爽很多。当然真实项目里还要处理鉴权、超时、限流、模型输入规约等细节但整体架构方向就是这样。6. 常见问题与排查技巧实录6.1 生成空洞、信息重复的排查思路数据导向生成最常遇到的问题就是模型输出“车轱辘话”翻来覆去表达同一个意思看起来字数够了实际没有新增信息。这种问题我一般会按三个层次排查。第一层看输入信号。检查结构化输入里是否包含足够的区分信息如果输入的数据本身就高度相似模型自然会输出雷同文本。这种情况不是模型的问题是上游数据质量的问题。第二层看解码参数。把temperature和top_p调高一些增加采样随机性但注意不要一次调太多否则会从“重复”跳到“胡说”。第三层看训练数据。如果训练语料里同一个商品的文案高度同质化即使解码参数调得合理模型也会在概率分布上偏好高频句式这时候需要回到数据清洗环节做更激进的长尾优化。6.2 MCP连接报错和超时的常见原因MCP相关的报错我遇到的90%以上都和协议版本或网络策略有关。先说协议版本MCP还在快速迭代阶段客户端和服务端的版本如果跨度太大握手阶段就会失败。遇到不明原因的连接报错第一件事就是比对两端版本号而不是反复改代码。再说网络策略。MCP服务器通常暴露在某个内网地址或云服务地址如果部署环境里的防火墙策略没有放行对应端口连接时就会出现超时。排查这类问题可以在目标机器上手动跑一次客户端连接脚本绕开你的业务代码确认网络层是不是通的。这个方法虽然原始但能帮你快速切分问题的责任边界。6.3 混合方案里规则与模型的冲突处理项目做到后期我几乎总能遇到规则和模型同时存在的情况而两者的输出一旦不一致处理起来就非常棘手。比如规则引擎判定某句话合规但模型生成时用了一个违禁词的变体这类冲突不能简单以一方为准而是要在系统层面建立降级机制。我的经验是把规则的判定结果作为硬约束把模型的生成结果作为候选排序依据。也就是说先让模型生成多个候选文本再用规则引擎做合规校验通过校验的候选才进入最终排序环节。这种“生成校验排序”的流水线结构既保住了数据驱动的多样性也兜住了经验方法的底线。在金融、医疗等合规要求比较高的场景我强烈建议采用这种架构而不是让模型直接输出最终文本。7. 写在最后的一点实际体会做NLG项目这些年一个特别深的体会是不管经验方法还是数据导向真正的难点都不在模型和算法上而是在于你想清楚“这个文本生成之后要承担什么责任”。如果是给人做参考的可以自由度高一点如果是直接对外发布的就必须要在可控性上下功夫。另一个体会是关于MCP这类新工具的。我见过不少团队一看到新技术就想自研总觉得用别人的东西不够酷、不够定制化。但在自然语言生成这个领域迭代速度极快今天还在用的方案可能三个月后就过时了。把精力放在自己的核心业务逻辑上工具链尽量采用成熟方案反而能走得更远。最后再分享一个小技巧。无论是规则模板还是生成模型我都建议在系统上线后持续做输出日志的采集和分析。NLG系统的退化往往不是突然发生的而是缓慢积累的。定期对生成的文本做抽样检查比对表达偏好和用户反馈的变化趋势你往往能比用户更早发现问题。这些日志和数据才是项目长期运维里最宝贵的资产。本文还有配套的精品资源点击获取