DataWhale组队学习笔记--llm-algo-leetcode(四)
文章目录Decoding Strategies 解码策略1. Temperature温度重塑概率的“平坦度”2. Top-k硬性的“名次截断”3. Top-p核采样 / Nucleus Sampling弹性的“累积概率截断”⚙️ 生产环境中的协同流水线 (The Pipeline) 典型应用场景参数搭配4.面试必考难点Top-p是如何用代码实现的Decoding Strategies 解码策略大语言模型在生成文本时并不是直接吐出具体的单词而是为词表中的每一个词输出一个原始得分Logits。为了将这些得分转化为最终的文本模型需要利用解码策略Decoding Strategies在词表中进行筛选和采样。在这个过程中Temperature、Top-k和Top-p是控制生成文本质量、流畅度与创造力最核心的三大参数。它们就像是三层协同工作的滤网一步步决定了最终输出的词汇。1. Temperature温度重塑概率的“平坦度”Temperature 本质上是一个概率调节器它作用于 Softmax 函数用来拉大或缩小候选词之间的“贫富差距”。其数学公式为P ( x i ) exp ⁡ ( z i / T ) ∑ j exp ⁡ ( z j / T ) P(x_i) \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}P(xi​)∑j​exp(zj​/T)exp(zi​/T)​其中z i z_izi​是词i ii的原始得分LogitsT TT就是温度参数。当T 1.0 T 1.0T1.0降温马太效应加剧。概率高的词被无限放大概率低的词被极度压缩。分布曲线变得非常“尖锐”。当T TT趋近于 0 时解码退化为贪婪搜索Greedy Search模型每次只选概率最高的那一个词输出绝对确定、严谨但缺乏多样性甚至容易陷入死循环。当T 1.0 T 1.0T1.0出厂默认保持模型原始计算出来的概率分布。当T 1.0 T 1.0T1.0升温劫富济贫。高概率词和低概率词之间的差距被缩小整体概率分布被“熨平”。那些原本概率极低的“冷门词”被选中的几率显著上升。模型会变得极具想象力和创意但过高如 1.5会导致语句逻辑混乱、胡言乱语幻觉。2. Top-k硬性的“名次截断”如果只靠调节温度当温度升高时一些完全不着边际的垃圾词如错别字、无关字符也可能被意外抽中。为了守住逻辑底线引入了 Top-k 机制。工作机制将所有候选词按照概率从大到小排序强制只保留前k kk个词将第k 1 k1k1名及之后的词全部剔除概率直接归零。剩下的k kk个词会重新按比例分配概率。局限性死板Top-k 是一个固定数值。词少不够用当句子很开放比如“今天我很…”后面可能有上百个合适的词强行只留k 50 k50k50会扼杀创意的火花。词多引入噪音当句子几乎只有一个正确答案比如“一加一等于…”后面只有“二”硬拉进来 50 个词凑数反而增加了犯错的概率。3. Top-p核采样 / Nucleus Sampling弹性的“累积概率截断”为了解决 Top-k 过于死板的问题Top-p 引入了动态候选池的概念。它不再关注“保留多少个词”而是关注“保留多少比例的概率”。工作机制同样将词按概率从高到低排序然后从头开始累加它们的概率。当累加概率刚好达到或超过阈值p pp通常在 0.8 到 0.95 之间时立刻停止截断。只有被包含进这个累积概率区间的词才会被保留其余的全部丢弃。自适应优势模型信心足时分布尖锐前 1、2 个词的概率加起来就达到了 90%候选池就自动收缩到只有这 1-2 个词保证绝对不出错。模型信心不足时分布平缓需要把前 100 个词加起来才够 90%候选池自动扩张到 100 个词提供丰富的选择。⚙️ 生产环境中的协同流水线 (The Pipeline)在真实的 LLM 推理框架如 vLLM、Hugging Face Transformers中这三个关键词并非孤立工作而是按严格的先后顺序形成了一条采样流水线[原始 Logits 得分] │ ▼ 1. Temperature ──► 缩放 Logits改变所有词的相对概率 │ ▼ 2. Top-k ───────► 硬截断只留下排名前 k 的词 │ ▼ 3. Top-p ───────► 在幸存词里进行累积概率筛选划定最终候选池 │ ▼ [重归一化采样] ──► 在最终候选池里抛随机骰子选出下一个 Token 典型应用场景参数搭配场景推荐配置调参核心思想 写代码 / 逻辑推理Temp 0.0 ~ 0.2Top-p 0.9Top-k 40追求精准、可复现。绝不允许模型自作聪明、胡乱发挥。 日常对话 / 事实问答Temp 0.5 ~ 0.7Top-p 0.9Top-k 50追求自然、生动。在保证事实基本准确的前提下让语气更有人情味。 创意写作 / 灵感风暴Temp 0.9 ~ 1.2Top-p 0.95Top-k 0 (禁用)追求发散、出人意料。放宽边界主动引导模型调用一些低概率但惊艳的词汇。4.面试必考难点Top-p是如何用代码实现的假设词表只有5个词排序后的概率分别是【0.5, 0.3, 0.1, 0.05, 0.05】。阈值p 0.85。1、计算累加和Cumulative Sumcumsum【0.5, 0.8, 0.9, 0.95, 1.0】2、找到那些累加和超过0.85的位置即[False, False, True, True, True]3、把这些位置对应的原始Logits强制设为-inf4、对剩下的有效Logits重新执行一次Softmax进行概率归一化。最后记住前面三步修改的是logits的筛选范围最后的Softmax和采样才决定真正输出哪个token。代码实现importtorchimporttorch.nn.functionalasFdefapply_temperature(logits:torch.Tensor,temperature:float)-torch.Tensor:#TODO1:温度下限与缩放tempmax(temperature,1e-6)returnlogits/tempdefapply_top_k(logits:torch.Tensor,top_k:int)-torch.Tensor:#Top-k截断。只保留值最大的Top_k个其余置为-inf。iftop_k0ortop_klogits.size(-1):returnlogits#TODO2:Top-K 截断filter_valuefloat(-inf)kth_values,_torch.topk(logits,top_k,dim-1,largestTrue,sortedTrue)kth_valueskth_values[...,-1:]#取最后一个第K大的值logitstorch.where(logitskth_values,torch.tensor(filter_value,devicelogits.device),logits)returnlogitsdefapply_top_p(logits:torch.Tensor,top_p:float)-torch.Tensor:#Top-p(Nucleus)核采样截断iftop_p0.0ortop_p1.0:returnlogits#1.首先需要将logits从大到小排序sorted_logits,sorted_indicestorch.sort(logits,descendingTrue)#2.对排序后的概率需要先算一遍Softmax计算累加和Cumulative Probabilitycumulative_probstorch.cumsum(F.softmax(sorted_logits,dim-1),dim-1)#TODO3Top-p核心逻辑sorted_indices_to_removecumulative_probstop_p sorted_indices_to_remove[...,1:]sorted_indices_to_remove[...,:-1].clone()sorted_indices_to_remove[...,0]0sorted_logits[sorted_indices_to_remove]float(-inf)restored_logitstorch.zeros_like(logits).scatter_(dim-1,indexsorted_indices,srcsorted_logits)returnrestored_logitsdefdecode_next_token(logits:torch.Tensor,temperature0.7,top_k50,top_p0.9):#1.调温logitsapply_temperature(logits,temperature)#2.Top-K截断通常先K后plogitsapply_top_k(logits,top_k)#3.Top-p截断logitsapply_top_p(logits,top_p)#4.概率重归一化probsF.softmax(logits,dim-1)#5.从概率分布中采样1个词next_tokentorch.multinomial(probs,num_samples1)returnnext_token# 运行此单元格以测试你的实现deftest_decoding():try:# 为了保证可重复性torch.manual_seed(42)vocab_size10# 伪造一组 Logits: [0.1, 2.3, 0.4, 1.2, -0.5, 4.0, 3.1, 0.0, 1.1, -1.0]# 最大的两个: index 5 (4.0), index 6 (3.1)logitstorch.tensor([[0.1,2.3,0.4,1.2,-0.5,4.0,3.1,0.0,1.1,-1.0]])print(原始 Logits (前10个单词):,logits.squeeze().tolist())# 1. 测试 Temperaturet_logitsapply_temperature(logits.clone(),0.5)# 温度 0.5 应该会让差异翻倍asserttorch.allclose(t_logits[0,5]-t_logits[0,6],(logits[0,5]-logits[0,6])*2),温度调节错误print(✅ Temperature 热量调节通过)# 2. 测试 Top-Kk_logitsapply_top_k(logits.clone(),3)# 只保留最大的三个5, 6, 1valid_count(k_logits!float(-inf)).sum().item()assertvalid_count3,fTop-K 截断没有正确执行保留了{valid_count}个值print(✅ Top-K 暴力截断通过)# 3. 测试 Top-p# 原始概率: [0.01, 0.10, 0.01, 0.03, 0.00, 0.54, 0.22, 0.01, 0.03, 0.00]# 降序: 0.54 (idx 5), 0.22 (idx 6), 0.10 (idx 1) ...# 累加和: 0.54, 0.76, 0.86# 所以只有 idx 5, 6, 1 会被保留p_logitsapply_top_p(logits.clone(),0.8)valid_count(p_logits!float(-inf)).sum().item()assertvalid_count3,fTop-p 核采样截断没算准保留了{valid_count}个值print(✅ Top-p (Nucleus) 核采样动态截断通过)# 4. 测试完整管线next_tokendecode_next_token(logits.clone(),temperature0.7,top_k50,top_p0.9)assertnext_token.shape(1,1),解码的词张量维度不对print(f\n✅ All Tests Passed! 解码策略实现通过测试。本次采样的下一个词汇 ID 是:{next_token.item()})exceptNotImplementedError:print(请先完成 TODO 部分的代码)raiseexcept(AttributeError,NameError,TypeError,ValueError,AssertionError,RuntimeError)ase:ifisinstance(e,AttributeError):print(代码未完成无法找到必要的属性)elifisinstance(e,NameError):print(代码可能未完成导致了变量未定义)elifisinstance(e,TypeError):print(代码可能未完成导致了操作错误)elifisinstance(e,ValueError):print(代码可能未完成导致了张量维度错误)elifisinstance(e,RuntimeError):print(代码可能未完成导致了运行时错误)else:print(代码可能未完成导致了断言失败)raiseNotImplementedError(请先完成 TODO 部分的代码)fromeexceptExceptionase:print(f❌ 测试失败:{e})raisetest_decoding()结果

相关新闻

精准匹配需求,这家亚克力胶供应商凭什么获专业口碑?

精准匹配需求,这家亚克力胶供应商凭什么获专业口碑?

在建筑、家居和工业制造领域,亚克力材料因其优异的透光性、加工性和耐候性,被广泛应用于展示柜、鱼缸、灯具及装饰面板等场景。然而,亚克力材料的粘接一直是行业痛点:普通胶水难以满足粘接强度、透明度和耐老化性的综合要求&#…

2026/9/24 9:40:25 阅读更多 →
技术白皮书 | HyperLane:GPU 虚拟化技术

技术白皮书 | HyperLane:GPU 虚拟化技术

GPU 虚拟化技术使得多个操作系统能够共享同一颗 GPU,每个系统均可独立提交任务且互不干扰。随着高性能平台需要同时处理越来越多的工作负载,这项功能在汽车、数据中心和消费类设备中的需求日益增长。 这份十五页的白皮书介绍了 GPU 虚拟化的概念&#x…

2026/9/21 11:42:03 阅读更多 →
成电信软图形与动画(二)2026年期末真题

成电信软图形与动画(二)2026年期末真题

一、简答(6小题,共32分)1.(4)动画制作分为哪三个阶段?每个阶段的主要任务是什么?2.(4)试解释空间分区表示中八叉树方法。3.(6)在关键帧动画中&…

2026/9/22 10:41:18 阅读更多 →

最新新闻

MDN混合密度网络:解决多模态回归与不确定性建模

MDN混合密度网络:解决多模态回归与不确定性建模

1. 为什么传统回归模型在“一个输入对应多个合理输出”时会失效?我第一次在工业质检场景里撞上这个问题,是在调试一个金属表面缺陷尺寸预测模型。产线上的同一类划痕,在不同光照角度、不同焦距下,标注员给出的长度值存在0.3mm的合…

2026/9/24 19:40:12 阅读更多 →
Spring Boot 4.0.3与JDK25高并发云原生升级实践指南

Spring Boot 4.0.3与JDK25高并发云原生升级实践指南

Spring Boot 4.0.3 在 2025 年底正式发布的时候,说实话我一开始没太在意,毕竟 3.x 系列已经用得很顺手了。直到我把一个测试项目升级到 4.0.3 并配合 JDK 25 跑起来之后,才意识到这一次升级不是简单换版本号那么简单——模块化重构、云原生适…

2026/9/24 19:40:12 阅读更多 →
IDEA报错Cannot Save Settings:Source root duplicated的排查与修复

IDEA报错Cannot Save Settings:Source root duplicated的排查与修复

每次遇到 "Cannot Save Settings" 我都觉得这东西比编译报错更让人头大——编译错吧,至少有行号有堆栈,你能顺着线索去查。而 "Source root ... is duplicated in module ..." 这个弹窗,只在你想保存设置或者改项目结构的…

2026/9/24 19:40:12 阅读更多 →
C#货车称重前端源码解析:WinForms地磅系统开发与Excel导出

C#货车称重前端源码解析:WinForms地磅系统开发与Excel导出

简介:本资源为基于C#语言的货车称重PC前端设计源码,面向从事物流称重系统开发的C#程序员及.NET学习者,可用于快速搭建稳定可靠的称重数据处理客户端。压缩包共71个文件,约20.46MB,以21个cs源代码文件为核心&#xff0c…

2026/9/24 19:40:12 阅读更多 →
Python语音特征提取实战:MFCC参数调优与避坑指南

Python语音特征提取实战:MFCC参数调优与避坑指南

简介:这份资源面向语音信号处理与人工智能方向的初学者及进阶学习者,提供一套基于Python与Jupyter Notebook的语音特征提取实践材料,可用于语音识别、情感分析等场景的入门与练手。压缩包共222个文件,约29.87MB,以png图…

2026/9/24 19:40:12 阅读更多 →
从零设计数据库:SchoolDB四张核心表DDL建表语句全解析

从零设计数据库:SchoolDB四张核心表DDL建表语句全解析

开头部分,我先直接聊点实际的。数据库设计这个事,网上讲“增删改查”的教程一抓一大把,但真到了要你从零落库的时候,很多人会在最简单的起点上卡住:这几张表到底怎么建?字段类型怎么选?约束加不…

2026/9/24 19:39:11 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →