ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

别盲目“人性化”LLM输出:可验证的工程化才是正道

别盲目“人性化”LLM输出:可验证的工程化才是正道 看到 “Humanising LLM Outputs Is Dumb” 这个标题很容易先被冒犯。毕竟这两年整个行业都在骂“AI 味”从对话机器人到 RAG 问答再到 Agent 编排几乎每个项目评审都要被问一句这个回答能不能再自然一点既然大家恨不得把模型输出调成人话凭什么说“人性化”是愚蠢的我的判断是这句话真正想说的不是“自然表达没有价值”而是把“更像人”当作 LLM 输出的核心优化目标是一个低级的工程错误。原因不复杂——“像人”不可度量、不可验收、不可回归。当团队用“像人”来指导产品迭代时本质上是在用审美偏好替代工程质量。而在绝大多数业务链路里LLM 输出的下游是接口、数据库、业务流程和用户操作它首先必须是对的、是可解析的、是可验证的然后才有资格谈语气和风格。这篇文章会拆清楚三件事大家骂的“AI 味”到底是什么为什么“人性化”不能作为工程目标实际项目里应该把精力放到哪些地方——结构化输出、可验证调用、评测与回归。如果你正在做 Agent、RAG 或对话产品而且被“输出太假”这个问题卡住建议看完再决定要不要继续调“人味”。1. 为什么我不建议把“更人性化”当作 LLM 输出优化的目标先看一个很常见的现象。产品上线后用户反馈“回答太模板化”“一看就是 AI 写的”于是团队开始一轮典型操作在 system prompt 里加一句“请用自然、亲切、像人类一样的方式说话”把 temperature 从 0.2 拉到 0.8甚至让模型在回答结尾加个表情符号。表面上是响应了用户声音实际上是把一个含糊的审美判断直接转成了模型的优化指令。问题在于这个指令本身没有任何可执行性。模型并不知道“像人”是什么。它只知道你的概率采样参数变了约束变少了于是从概率分布里抽出了更多“不常见”的 token。结果往往是输出确实不再像原来那么规整但也变得更加随机、更加不可控。做 LLM 应用的人要清楚一件事模型输出的质量从来不是单一维度。除了语气还有信息是否完整、事实是否准确、是否符合业务规则、是否安全合规、是否能被下游系统消费。在这些维度里语气是唯一一个无法用客观规则度量的东西。你不能写一个单元测试说“这句话像人这句话不像人”。所以当你把“更人性化”设为项目目标时你其实是在让团队围绕一个无法度量、无法验收、无法回归的指标做开发。这不是技术优化这是运气测试。我见过不少团队在“人性化”上耗了两三周最后用户还是觉得假或者说不上哪里不对。真正原因往往不是语气不够亲切而是回答信息不足、逻辑断裂、没有依据。把“AI 味”笼统归因于“不够像人”相当于病人发烧你不管感染只管退烧。2. “AI 味”是真实痛点但它本质不是“不够像人”既然大家都在说“AI 味”就要先把这个词拆开。它到底指什么常见的“AI 味”大概是这些表现回答永远是三段式第一条、第二条、第三条每条前面加粗小标题大量使用“首先”“其次”“最后”“总之”这类过渡词动不动就“作为一个语言模型”结尾喜欢升华总结“希望通过以上措施能够有效提升……”。这些写法放在任何一篇正式文档里可能都算合格但当用户问“我订单怎么还没发货”时收到的却是一篇六段式议论文那用户体验就是灾难。为什么模型会出现这种倾向因为预训练语料里这类高度结构化、带总结性的文本占了极大比例。模型学习到的是这样写最“安全”最“像标准答案”。再加上低 temperature 的设置让采样更保守模型就更倾向于走概率最高、结构最平稳的路径。所以“AI 味”在本质上不是“拟人度不够”而是模型对“模板化回答”的过度偏好。一个更普遍的误解是把 temperature 等同于“自然度”。其实 temperature 控制的是采样的随机性不是语言风格。调高 temperature 不会让输出变得更像人类它只会让输出更“跳”更容易出现逻辑断裂和事实错误。如果你想要稳定且自然的表达靠 temperature 是走错方向的。还有一个值得注意的点用户说“假”很多时候不是语气问题而是回答没有信息量。比如用户问“我的退款什么时候到账”模型答“您的退款正在处理中请您耐心等待哦”语气再亲切也是废话。用户真正想要的是“已经提交预计 3 个工作日内原路退回”。这不是人性化能解决的问题是信息链路和业务数据的问题。所以遇到“输出不自然”的反馈第一步不是改 prompt而是给 bad case 分类是语气问题是信息缺失是事实错误还是逻辑不通不同问题有完全不同的解法混在一起谈“人性化”什么都解决不了。3. “像人”为什么不是一个可执行的技术目标我把“像人”的问题归纳为三个“不可”不可度量、不可复现、不可归因。不可度量。什么叫像人一千个人有一千种判断。同一个回答产品经理觉得自然研发觉得啰嗦用户觉得敷衍。没有统一标准就没有办法做量化对比。没有量化就没有办法判断一次改动是变好还是变坏。不可复现。即使团队内部勉强达成共识认为这版输出“更有人味”这个结论也没法写进自动化验证。你不可能在 CI 里跑一条用例断言“本回答像人通过”。于是每次模型版本升级、每次 prompt 调整都得重新靠人眼去看靠感觉去判断回归成本极高。不可归因。假设上线一版“更像人”的回答后用户满意度确实提升了。但你没法证明这是“语气改善”带来的还是因为同时修了数据链路、加了兜底逻辑、优化了响应速度。目标一旦模糊功劳和责任都会变成一笔糊涂账。工程方法的核心是收敛到可验证的标准。你要么能测量要么能列举 pass/fail 规则否则就不应该把它当成优化对象。这很可能就是原题说 “dumb” 的真正含义不是反对自然语言而是反对用非工程的方法去解决工程问题。所以更合理的做法是把“听起来像人”这个模糊诉求转换成一系列可观察、可检查的行为规则。比如“回答必须包含订单号”“不得承诺无法核实的时间”“不得使用空泛安抚话术”。这些规则能写下来就能测试就能回归就能上线验证。到那时候你根本不需要关心输出像不像人你只需要关心规则有没有被满足。4. 强行“人性化” LLM 输出的工程代价如果你仍然想让输出“更像人”那就得接受几笔真实的成本。这些成本不是理论推演而是实际交付中会直接踩到的坑。第一笔成本是稳定性下降。为了让语气更自然团队往往调高 temperature、去掉格式限制、加入随机改写。结果同一个用户问题上午和下午的回答在结构和关键信息上都可能不一样。对于对话产品这或许还能忍对于 Agent 和流程自动化这就是灾难——下游解析不了状态对不上回归测试永远飘红。第二笔成本是事实性变差。越是追求“像人”模型就越倾向于把话补全。它会为了表达流畅而主动补充细节比如虚构订单状态、编造处理时间、猜测退款原因。在 RAG 场景里这种“补全”会直接制造幻觉而且比原来更隐蔽因为读起来很像正常人的陈述。第三笔成本是下游链路被破坏。LLM 应用里模型输出很多时候不是给用户看的而是给系统解析的。要么是工具调用的参数要么是结构化的 JSON要么是某个枚举值。如果为了让输出“自然”而牺牲格式下游解析的成功率会直线下降。你得到了一段“人味十足”的文本丢掉的是整个链路的可靠性。第四笔成本是安全合规风险。过度拟人化会误导用户让用户误以为自己在和真人交流这在客服、金融、医疗场景里尤其危险。语气一旦放松模型还容易给出过度承诺比如“您放心今天肯定到”。这类输出一旦成为证据团队要承担的责任远大于一篇“模板答复”。优化目标可度量性对准确性的影响对下游系统的影响更像人不可量化容易变差解析率可能下降信息完整可量化正面正面事实正确可量化正面正面格式稳定可量化中性正面看这张对比表就清楚了凡是可度量的目标几乎都是正向收益唯一不可度量的“像人”带来的往往是稳定性、准确性和下游兼容性的三重损失。所以我的观点很直接在大多数业务场景里追求“人性化”的投入产出比是负的。5. 哪些场景需要“自然”以及怎么正确设定目标当然我并不是说所有输出都该做成冷冰冰的 JSON。确实有一些场景自然表达本身就是产品体验的核心。比如口语陪练、闲聊陪伴、营销文案、个性化推荐语。这类场景用户消费的就是语言本身你给一段标准模板确实不合适。但即便是这类场景正确目标也不是“像人”而是“符合角色、语境和约束”。什么叫符合角色就是在 system prompt 里写清楚你是谁用户是谁你们在什么场景下对话哪些话可以说哪些话不能说。这比一句“请说得自然一点”有用得多。什么叫符合语境就是回答长度匹配问题复杂度用户问时间就别回一篇论文。什么叫符合约束就是不承诺不确定的事不编造不存在的功能越界时明确给出兜底。从技术手段上说少用抽象风格词多用具体锚点。与其写“用人类语言回复”不如给出两三条具体的话术示例让模型照着示例的语感走。温度参数也不要全局拉高对话型场景可以相对高一点但凡是涉及信息核实的回答温度越低越好。# 不推荐只有一句空泛的风格要求 system_prompt_vague 你是一个智能助手。请用自然、亲切、像真人一样的语气回答用户问题。 # 推荐明确角色、场景、约束和反例 system_prompt_clear 你是某电商平台的售后客服助手面向下单后遇到配送问题的用户。 回答约束 1. 先确认用户遇到的问题再给出可操作的解决方案。 2. 如果信息不足明确告诉用户需要提供哪些信息不要编造订单状态。 3. 不承诺无法核实的时间节点。 4. 语气保持简洁、具体不使用“首先/其次/总之”这类模板过渡句。 5. 不要模仿人类闲聊、不使用口头禅也不要主动暴露自己是 AI 或否认自己是 AI。 两个 prompt 的差别不在于“像人”这个词而在于后者给了模型可执行的边界。模型不需要知道“人话”是什么它只需要知道在你的业务里什么样的话是允许的什么样的话是禁止的。这才是可执行的“自然”。所以自然表达不该被当作一个全局目标而应该被拆成具体的场景要求。一个对话系统里开场白可以轻松一点问题确认要尽量简短涉及订单状态时必须严谨。也就是说语气要跟着任务走而不是全项目统一“人性化”。6. 更值得投入的工作可控输出与结构化交付如果你去看真正稳定落地的 LLM 应用会发现一个共性它们都在想尽办法降低模型的自由发挥空间。不是模型越自由越好而是模型越受限越好。这背后有一个核心判断在工程链路里LLM 的输出应该被当作“数据”来对待而不是当作“文案”来欣赏。它的价值在于正确表达意图、准确填充参数、稳定完成任务而不是让你读起来舒服。最常见的做法是工具调用function calling。与其让模型生成一段“用户想退款订单号是多少”的散文不如让它直接输出一个退款函数的参数列表# 以常见 OpenAI 兼容接口为例字段以你的 SDK 文档为准 from openai import OpenAI client OpenAI() tools [ { type: function, function: { name: create_order_refund, description: 为指定订单提交退款申请, parameters: { type: object, properties: { order_id: {type: string, description: 订单号}, reason: {type: string, description: 退款原因}, amount: {type: number, description: 退款金额单位元} }, required: [order_id, reason] } } } ] response client.chat.completions.create( modelgpt-4o-mini, # 模型名仅作示例以实际使用的模型为准 messages[ {role: system, content: 你是订单售后助手只负责识别用户意图并输出结构化参数。不要额外生成解释。}, {role: user, content: 我刚下的订单 20250601001 一直没发货想退款。} ], toolstools, tool_choiceauto, temperature0 ) print(response.choices[0].message.tool_calls)这样下游系统拿到的是字段、类型、参数名可以直接执行。它没有任何语气可言但它稳定、可校验、不会产生歧义。对于交易、工单、查询这类强流程场景这比任何“人性化”改写都更有价值。如果场景不涉及工具调用只需要输出结构化数据也可以用 JSON 模式约束响应格式from openai import OpenAI import json client OpenAI() response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你负责把用户问题转换为 JSON 分类结果。只输出 JSON 对象不要输出其他内容。}, {role: user, content: 我要投诉快递员服务态度差} ], response_format{type: json_object}, temperature0.2 ) result json.loads(response.choices[0].message.content) print(result)除了 API 层面的约束还可以在解码阶段做更硬的控制。约束解码的思路是在模型生成每个 token 时用有限状态机校验下一个 token 是否符合预设语法不允许就强制跳过。这样做出来的输出语法上一定是合法的价格昂贵但效果极强。具体是否要上取决于你的延迟预算和场景复杂度。需要注意的是无论用哪种方式控制输出后置校验都不能省。模型不是数据库它总有解析失败的时候。代码里围绕 JSON 解析、参数校验、缺失字段处理写 try-except是比 prompt 调参更值得投入的稳定性工作。一句话总结这一章先保证系统能接住输出再考虑输出给人什么感受。不能接住的“人性化”就没有资格上线。7. 建立评测体系别靠感觉调输出前面说了很多“不要做什么”那到底该做什么我认为最值得先做的一步是建立最小可用的输出评测体系。这里的原则很朴素先定义“通过”再调 prompt。没有评估标准所有优化都是在做随机游走。你今天觉得语气好了明天模型一升级可能又打回原形而你根本发现不了。一个简单可行的流程是收集 bad case → 按问题分类 → 制定规则 → 写成自动化脚本 → 每次改模型或 prompt 都跑一遍回归。评测集不需要一开始就很大三五十条有代表性的 bad case 就足够起步关键是可持续维护。举个例子针对客服回复场景你可以把“通过条件”定义得很机械# eval_sample.py # 前提先定义“通过”条件再评估模型输出而不是凭感觉打分 import json def check_output(sample, output): # 示例规则必须包含订单号并且不能出现模板句 required_field sample[expected_order_id] banned_phrases [作为一个语言模型, 首先, 总之, 很抱歉给您带来困扰] if required_field not in output: return False, 缺少必要字段 for phrase in banned_phrases: if phrase in output: return False, f命中禁用模板句: {phrase} return True, 通过 samples [ {expected_order_id: 20250601001, user_input: 订单没发货怎么办} ] for s in samples: # 实际项目中这里会调用你的 LLM 服务 output 您的订单 20250601001 当前状态为待发货我帮你核实后 24 小时内回复。 ok, reason check_output(s, output) print(ok, reason)运行方式很简单python eval_sample.py这个脚本虽然简陋但它给出了一个关键信号质量是可以被程序验证的。你会立刻知道这版输出有没有通过规则而不是等用户来告诉你“感觉不对”。如果有些质量维度实在无法用规则表达可以引入 LLM-as-judge 做辅助评估但要注意使用方式。不要只问裁判模型“这句话自然吗”这个维度太主观不同模型、不同温度下结果都会飘。更稳妥的做法是给出明确的评分维度和标准让裁判模型做分类或规则匹配而不是做审美判断judge_prompt 请根据以下维度对客服回复进行评分每个维度 0-5 分只输出 JSON 1. information_completeness是否包含核实订单号、处理时限等关键信息 2. safe_commitment是否承诺了不确定的内容 3. no_template_phrase是否出现模板腔 输出格式{score: 0-5, reason: 一句话解释} 评测体系的价值不在于第一版有多完美而在于它让团队从“感觉型优化”切换到“规则型优化”。只有当你能够回答“这版比上版好在哪个指标上”的时候你对 LLM 输出的质量控制才算真正开始。8. 常见误区与纠正思路这里整理几个我在实际项目里反复看到的误区方便对照排查。常见做法表面动机实际后果建议调高 temperature 让口吻更自然希望语气轻松随机性上升错误更难复现用 few-shot 和角色约束调整风格temperature 控制在稳定区间在 prompt 里写“用像人一样的方式说话”希望改变语气模型没有可执行依据输出随机波动给出具体风格锚点、示例话术、禁止项用户说“假”就改语气快速响应反馈掩盖信息不足或逻辑断裂先对 bad case 分类信息缺失、事实错误、语气问题靠几个人人工看几段话做评测省事直观主观、不可复现、无法回归建立最小评测集和自动化规则让模型自由发挥后再人工改写觉得人能兜住成本高、延迟高、结果不稳定限制输出范围优先结构化输出全局统一“人性化”风格保持品牌一致工具型场景解析失败率上升按任务类型分策略机器消费层走结构化人消费层再谈语气这些误区的共性是都试图用“让模型更像人”来解决业务问题却没有意识到模型输出只是整个系统里的一环。系统要的是稳定、正确、可验证而不是“看起来像个人在说话”。9. 给团队落地 LLM 应用的三条建议最后给正在做 LLM 应用的团队三点实际建议都是可以直接落地到迭代流程里的。第一条把输出分成机器消费和人消费两层。机器消费层包括 Agent 规划、工具参数、RAG 中间结果、分类标签全部走结构化输出不允许自由发挥。人消费层包括客服回复、对话内容再单独设计语气和风格。不要在同一个输出环节里混用两类目标否则会两头都做不好。第二条建立 bad case 库和回归集。每次改 prompt、换模型版本、调采样参数之前先跑一遍回归。不要靠“这次看起来好多了”做判断要让数据告诉你有没有变好。bad case 库要持续维护线上用户投诉是最宝贵的评测样本来源。第三条接受“LLM 输出不会完美”这个现实设计好降级路径。解析失败就重试或走兜底模板信息不足就问用户要低置信度就转人工。稳定系统的关键不是让模型永远正确而是让错误以可控的方式出现。如果团队还在纠结“输出不够像人”不妨先回答三个问题用户真正不满意的是什么你用什么指标衡量这个不满意改动之后如何防止问题再次出现如果答不上来那真正需要优化的可能不是模型输出而是你的评测方式。
返回列表