上一篇用 Schema 固定了输出“长什么样”。本篇继续控制输出“怎么说”把角色职责、目标受众、语域、品牌规则与禁用表达拆成可测试的维度。角色设定的价值是提供决策视角而不是一句“你是世界顶级专家”带来的心理暗示。一、痛点同一个“专业”团队有十种理解产品经理说“专业”可能指术语准确法务理解为谨慎限定市场团队则希望自信、有节奏。若只写“以专业友好的口吻”模型没有可执行边界输出会随主题漂移。更糟的是把“扮演医生”误当成医疗资质把“你有数据库权限”误当成真实授权。角色文本不能创造知识、工具或权限。可操作的风格规格至少包含五项发言者职责、读者画像、沟通目标、语言规则、禁止项。例如“你是 SaaS 客服编辑”说明职责“读者是首次配置单点登录的管理员”限定知识水平“帮助其完成下一步”定义目标“短句、主动语态、术语首次解释”是可观察规则“不承诺修复时间、不责怪用户”是风险边界。二、原理把人格形容词变成文本特征模型对常见角色具有统计关联但“资深”“温暖”“极客”等词覆盖范围太宽。应把抽象形容词翻译为结构和词汇约束每段不超过三句、先结论后原因、使用“你”而非“用户”、避免感叹号、风险声明紧邻建议。少量正反例可以展示边界但仍需量表判断而非只凭个人喜好。风格规则要服从事实与安全规则。可规定优先级为不虚构与合规要求高于任务完整性任务完整性高于品牌语气品牌语气高于装饰偏好。当“保持肯定”与“证据不足”冲突时必须表达不确定。角色不会改变这一优先级。下面程序实现一个轻量风格检查器。它不能取代人工评审却能稳定发现感叹号、禁用承诺、段落过长和术语未解释等机械问题。importrefromdataclassesimportdataclassdataclass(frozenTrue)classStylePolicy:forbidden:tuple[str,...]max_sentences_per_paragraph:intrequire_heading:boolterms:dict[str,str]definspect(text:str,policy:StylePolicy)-list[str]:issues[]forphraseinpolicy.forbidden:ifphraseintext:issues.append(fforbidden:{phrase})if!intextorintext:issues.append(punctuation:exclamation)paragraphs[p.strip()forpintext.split(\n\n)ifp.strip()]forindex,paragraphinenumerate(paragraphs,1):sentences[xforxinre.split(r[。],paragraph)ifx.strip()]iflen(sentences)policy.max_sentences_per_paragraph:issues.append(fparagraph:{index}:too_long)ifpolicy.require_headingandnottext.lstrip().startswith(## ):issues.append(structure:missing_heading)forterm,explanationinpolicy.terms.items():iftermintextandexplanationnotintext:issues.append(fterm:{term}:unexplained)returnissues policyStylePolicy(forbidden(保证解决,绝对不会),max_sentences_per_paragraph3,require_headingTrue,terms{SLA:服务级别协议},)good## 处理建议\n\n请先保存日志。SLA服务级别协议以合同为准。bad我们保证解决请查看 SLA。随后等待。不要担心。print(fgood{inspect(good,policy)})print(fbad{inspect(bad,policy)})运行输出good[] bad[forbidden:保证解决, punctuation:exclamation, paragraph:1:too_long, structure:missing_heading, term:SLA:unexplained]三、实现建立风格卡与双层验收先从十篇已批准内容中抽取共同特征不要凭空发明品牌声线。访谈编辑时使用成对选择“直接还是委婉”“短句还是叙述”“是否允许幽默”并记录适用场景。形成一页风格卡三项必须做、三项禁止做、术语表、两个正例和两个反例。不同渠道可继承核心卡再覆盖长度与称呼。fromdataclassesimportdataclassdataclass(frozenTrue)classStyleCard:channel:strmax_chars:intaddress:strforbidden:tuple[str,...]cards{support:StyleCard(support,500,你,(保证,肯定)),release:StyleCard(release,1200,用户,(史诗级,颠覆)),in_app:StyleCard(in_app,80,你,(尊敬的,赋能)),}defcheck(text:str,card:StyleCard)-list[str]:errors[]iflen(text)card.max_chars:errors.append(too_long)ifnottext.startswith(card.address):errors.append(wrong_address)hits[wordforwordincard.forbiddenifwordintext]ifhits:errors.append(forbidden:,.join(hits))returnerrors samples[(support,你可以先刷新订单页若状态未更新请提供订单号。),(release,用户现在可以导出筛选后的工单。),(in_app,尊敬的用户你的导出已完成。),]forchannel,textinsamples:errorscheck(text,cards[channel])print(f{channel}: valid{noterrors}errors{errors})运行输出support: validTrue errors[] release: validTrue errors[] in_app: validFalse errors[wrong_address, forbidden:尊敬的]提示中按固定顺序写角色职责、受众、任务、事实材料、风格卡和输出格式。先让结构化阶段产生事实草稿再单独进行风格改写改写阶段明确不得新增、删除或改变事实。双层验收也对应分开程序检查长度、禁词、结构与术语人工量表检查清晰、尊重、可信和品牌一致性。对多个场景不要复制整份提示。核心事实规则与品牌规则共用渠道差异做参数如channelsupport、max_chars500。每个参数必须映射到明确规则不能让模型自行猜测“社交媒体风格”。版本升级时用同一组内容做 A/B 盲评避免评审知道新版本后产生期待偏差。四、踩坑角色越夸张效果不一定越好“你是拥有二十年经验的顶尖律师”没有提供适用法域、日期或资料来源反而容易让输出显得过度确信。应写“以合同审阅助手视角识别风险不提供法律结论引用条款位置无法判断时说明需律师确认”。这把角色转成职责和边界。第二个坑是风格覆盖内容。为了“温暖”模型可能弱化安全警告为了“简洁”可能省略关键步骤。因此关键字段先结构化锁定风格阶段只改表达。第三个坑是禁词清单无限增长。大量词面规则会误伤正常语境应优先说明背后的风险原则并让静态检查器只负责少数明确红线。跨语言时不要逐字翻译风格卡。中文的礼貌、称呼和句长与英文不同应由目标语言编辑提供本地正反例。评测也按渠道分层适合帮助中心的严谨长文放进应用内提示就可能完全失败。五、验证风格一致但不牺牲事实建立二十条覆盖正常、投诉、风险告知和信息不足的盲测材料。先检查事实保持率再检查硬规则通过率最后由评审对清晰度、语气一致性和行动指引按统一量表打分。任何风格版本若降低事实保持率都不能上线即使主观分更高。同时测量评审一致性。两名评审经常相反说明“友好”等评分项定义仍模糊需要添加锚点示例。上线后采集用户是否完成下一步、是否重复咨询等行为指标不能只看文本“像不像品牌”。下一篇将处理更长、更复杂的任务把大提示拆成有输入输出契约的步骤判断何时串行、并行或加入人工审批并避免错误在链路中悄悄放大。参考来源MicrosoftPrompt engineering techniquesGooglePeople AI GuidebookNielsen Norman GroupTone of Voice Dimensions 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《提示词工程实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。