新手程序员必看:高效利用大模型进行决策,收藏这篇详细指南! 本文探讨了如何利用大模型进行高效决策避免不必要的文本生成。通过将请求视为决策而非文本生成模型可返回每个答案的分数帮助应用程序更精确地选择。文章详细介绍了Jev的工作原理并对比了打分与结构化输出的区别最后通过SGLang展示了如何在本地实现类似功能。对于希望优化LLM应用的小白和程序员来说本文提供了实用的方法和建议。许多 LLM 调用并不需要新写出的文本。应用程序已经知道可能的答案它只需要模型从中选择一个。假设一张客服工单写道“同一项订阅我被扣了两次费。”应用程序需要把它分配给三个团队之一账单billing、技术支持technical support或账户访问account access。普通的 LLM 调用会让模型写出一个答案。它可能返回一句话、一个标签或一个 JSON 对象。应用程序等待这段文本解析它然后提取所选团队。但如果每个合法答案都已经知道这就是不必要的。事实上一种更好、更高效的方式是把同一个请求当作一个决策来对待这正是 Jev 所做的事情。应用程序向 Jev 提供工单/查询和三个允许的答案。模型随后一次性返回每个答案的分数我们很快就会讨论具体如何实现billing 0.91 technical support 0.06 account access 0.03这里 billing 以最高概率被选中而且应用程序代码实际上可以看到它获胜的优势有多明显。这就是我们将在本地复现的 Jev 的行为。我们将提供输入查询和允许的答案。在一次打分请求中模型将返回一个决策和一个概率分布而无需生成句子或 JSON 对象。虽然 Jev 是闭源的但这种推理模式在几个开源语言模型中已经可用。更具体地说我们将使用 SGLang通过 /v1/score来实现它用 Qwen 和 DeepSeek 模型进行测试并与结构化输出和普通文本生成进行对比。提前说明一下预期本文复现的是推理路径而不是完整的 Jev 系统。Jev 还包括打分端点无法提供的训练和校准工作。另外我们将在当前生产环境中的 AI 智能体系列课程中继续探讨 Jev涉及过滤、护栏guardrails、执行安全等内容。固定答案打分不同于结构化输出很容易把 Jev 的机制与结构化输出混淆因为两种方法都限制了应用程序接收的内容但它们在推理服务器内部做的工作不同。对于上面讨论的同一个客服工单结构化输出可能从模型得到如下输出{”team”: ”billing”}指定的 schema 防止了无效对象但它本身并不会替你选出团队。不过这一点还可以进一步改进因为在底层模型仍然是逐个 token 地生成开头花括号、字段名、值和结尾花括号。生成结束后应用程序再去读取 team 字段。而使用打分Jev 所做的事情应用程序可以把三个团队作为完整合法结果列表提供给服务器。服务器可以读取每个结果的一个模型分数并返回本文开头所示的分布。它不会生成 JSON 对象。我们还可以返回全部三个值而不是只返回 billing这样应用程序代码可以对两种结果区别对待结果 1结果 2billing 0.91billing 0.46technical 0.06technical 0.44account 0.03account 0.10例如在上述两种情况下两者都会选择 billing。但第一个有明显的偏好第二个几乎平局。应用程序可以自动路由第一张工单并在需要时将第二张送去人工复核。而且模型只会提供这些分数应用程序代码将为下游使用设定规则。例如可以要求最高答案超过 0.80并且领先第二名至少 0.20。这些阈值存在于代码中可以被测试和修改。0.91 这个值意味着 billing 获得了这三个选择中 91% 的概率质量。它并不能证明模型有 91% 的时间是正确的。我们需要带标注的样例来衡量这一点。这就是我们稍后将要讨论的校准问题。但与此同时请记住结构化输出生成的是一个合法对象而固定答案打分返回的是应用程序已知答案上的一个分布。LLM 如何生成第一个输出 token在讨论如何将因果语言模型变成 Jev 风格的模型之前最好先理解 LLM 中普通的生成步骤。分词器tokenizer首先将提示词转换为 token ID。模型处理该序列并为下一个位置产生一个向量。该向量对模型词表中的每个 token 都有一个数字。例如Qwen 的词表包含数万个 token因此该向量包含数万个数字。这些原始数字是 logits。logit 越大表示模型越倾向于将该 token 作为下一个接续。这些值尚不是概率。在正常生成过程中服务器对这个向量应用模型的解码规则温度等选择一个 token并将其追加到提示词中。然后模型为下一个位置产生一个新的词表大小的向量。生成/解码重复这一过程直到到达停止 token 或输出上限。但当我们想做有界决策时我们只关心第一个向量。回顾上面讨论的支持工单路由示例。应用程序接受三个答案billingtechnical supportaccount access在提示词中我们可以给每个答案分配一个短标签A billing B technical support C account access提示词以要求返回一个标签结尾Route the support ticket into exactly one category. Ticket: I was charged twice for the same subscription. Allowed labels: A billing B technical support C account access Return only the label. Label:“Label:” 是提示词的最后一段文本。因此下一个位置就是模型通常会生成 A、B 或 C 的位置。处理完这个提示词后模型将为该位置产生其常规的词表大小向量。该向量将包含 token A 的 logit、B 和 C 的 logits以及词表中所有其他 token 的 logits。打分路径随后可以执行四个操作找到 A、B、C 的 token ID。在词表向量的对应位置读取三个 logits。忽略所有其他 logit。在这三个选定值上应用 softmax。如果选定的 logits 是 8.2、5.5 和 4.8受限 softmax 产生的结果约为 0.91、0.06 和 0.03。我们可以将这些位置映射回 billing、technical support 和 account access。归一化被限制在所声明的选项内。我们并不是在问 A 在整个词表上是否有 91% 的概率。我们问的是在应用程序排除了所有其他响应之后模型如何在 A、B、C 之间分配其偏好。这正是 SGLang 已经在 /v1/score 中实现的操作。它让提示词通过模型读取所请求的 token 位置的分数并返回这些分数。这使我们不必修改 Qwen 的实现也不必自己提取最终张量。顺便说一下答案使用 A、B、C 而不是直接对billing、“technical support”、account access这些词打分的原因是一个可见的词不一定是单个 token。例如“billing” 对一种分词器可能是一个 token对另一种分词器可能是多个 token。“technical support” 肯定会跨越多个位置。比较这些短语需要序列打分。模型必须先给第一个 token 打分将其追加再给下一个 token 打分最后合并整个短语的值。长度也成为了比较的一部分。但单 token 标签避免了这个问题。每个选项由同一个输出位置上的一个词表条目表示而语义含义仍出现在提示词中A billing questions and payment problems B product errors and technical failures C login, password, and account access problems模型在处理提示词时会读取这些描述。标签只是我们随后检查其 logit 的那个 token。我们仍然必须验证每个标签是单个 token。例如分词器通常会将前导空格编码为 token 的一部分。因此字符串 “A” 和 A 可能具有不同的 token ID。聊天模板还可能在答案位置之前紧挨着放置空格或控制 token。为避免这种情况请使用模型的聊天模板渲染完整提示词。确定答案位置预期的准确接续文本。将该接续文本发送到 /tokenize。如果产生的不是单个 token就拒绝该标签。这个标签映射保留在打分客户端内部。应用程序发送的是语义化的选项如 billing 和 technical_support。它从不发送 token ID也从不接收 A、B、C。这就是公共 API 与模型标签保持独立的含义。最后当所列选项不穷尽时答案列表还需要一条逃生通道。例如如果一起安全事件到达一个只提供 billing、technical support 和 account access 的路由器受限 softmax 仍然会把所有概率质量分配给这三个错误选项。为避免这种情况请在没有任何命名选项可能正确时添加 OTHER 或 ESCALATE。使用 SGLang 实现本地打分端点本地示例只需要一个推理服务器。SGLang 将 Qwen 加载到 GPU 内存中并暴露其原生 HTTP 端点。我们的 Python 脚本直接向该服务器发送请求。完整流程如下用 Qwen 模型启动 SGLang。将决策写成带字母标签的提示词。要求 SGLang 对这些标签进行分词。向/v1/score发送一个请求。将返回的概率映射回选项。第 1 步用 SGLang 启动 Qwen创建一个 Python 环境并安装这里用到的两个包。然后启动模型服务器。首次启动会从 Hugging Face 下载模型。后续启动会复用本地缓存。加载完成后Qwen 会驻留在内存中SGLang 监听 30000 端口。这个 SGLang 进程就是推理服务。在执行下面的客户端时请保持它运行。第 2 步定义选项并构建提示词创建 decide.py代码如下。该字典记录每个答案的两种表示形式A 是我们打分的 token。“billing” 是返回给应用程序的含义。它们的顺序必须在分词、打分和结果映射过程中保持不变。提示词以 “Label:” 结尾。我们想要的是模型对接下来出现的那个 token 的分数。我们不要求 SGLang 生成该 token。第 3 步解析标签的 token ID在提示词下方添加这段代码。SGLang 的 /tokenize 端点返回 Qwen 分词器产生的整数 ID。我们拒绝任何变成多个 token 的标签。打分请求需要每个答案对应一个词表位置。对于 Qwen/Qwen2.5-0.5B-Instruct输出如下A - [32] B - [33] C - [34]每个列表包含一个整数。因此我们知道了每个标签占据一个 token。后续的打分请求将读取词表位置 32、33 和 34。这个检查还防止我们假设不同模型的分词方式相同。一个适用于 Qwen 的标签在另一种分词器下可能被拆分。第 4 步向 SGLang 请求三个概率接下来添加打分请求query 包含完整提示词。空的items表示我们对紧随其后的位置打分。label_token_ids 告诉 SGLang 从 Qwen 的词表大小输出中读取哪三个条目。apply_softmax 将这些条目归一化为概率。响应中有一个分数列表因为 items 包含一个条目。我们用同一个 Qwen checkpoint 运行了这个提示词得到{”scores”: [0.68, 0.31, 0.01]}三个位置分别对应 A、B、C。softmax 之前的选定 logits 为 25.27、24.46 和 21.18。不同硬件和精度设置下可能出现微小的数值差异。官方端点参考文档说明每个返回列表遵循 label_token_ids 的顺序。因此第一个分数属于 A第二个属于 B第三个属于 C。第 5 步将模型标签转换回决策用映射代码结束脚本。然后在第二个终端运行脚本。SGLang 在 /v1/score 背后完成这个计算。一个 SGLang 进程负责标签分词、运行一次 Qwen并返回选定的概率。在这个例子中billing 获胜但概率只有 0.678。一个要求 0.70 的策略会将这张工单送去复核而不是自动路由。这个阈值应该来自带标注样例上的评估。测量打分延迟与自回归生成的对比上面的单请求示例展示了机制。我们还构建了一个小型应用来测试该机制在大量决策下的表现。部署的 demo 支持多个开源模型如 Qwen 3 4B、Qwen 2.5 0.5B 和 1.5B、SmolLM2 1.7B、TinyLlama 1.1B 以及 DeepSeek-R1-Distill-Qwen 1.5B。Jev 风格的通道调用决策方法result engine.decide(request) answer result[”answers”][”decision”] choice answer[”choice”] probabilities answer[”probabilities”]在 decide() 方法内部SGLang 通过 /v1/score 接收提示词。请求包含 A、B、C 的 token ID。SGLang 运行提示词读取那三个 next-token 分数将它们归一化然后停止。响应中不包含任何生成的 token。标准通道在同一引擎上调用生成方法result engine.generate_response( case[”state”], case[”question”], list(case[”criteria”].items()), max_tokens32, )该方法将相同的状态、问题和选项发送到 /v1/chat/completions。Qwen 生成一个答案和简短解释最多 32 个 token。应用程序在前 100 个字符中搜索一个允许的选项名称。当解析出的选项与存储的标签匹配时该案例被标记为正确。此外还使用固定的本地数据集模拟了 100 个案例。当前数据集涵盖支持工单路由、候选人筛选和费用审核。它们的预期标签让界面可以同时显示速度和正确性。远程 SGLang 路径在一个屏障barrier后启动两个工作进程屏障同时释放两个工作进程。每个通道按顺序处理自己的案例。Jev 风格的工作进程在上一请求完成后立即发送下一个打分请求。标准工作进程对生成请求做同样的事情。因此两个通道同时保持活跃但我们不会一次性发送全部 200 个请求。SGLang 接收来自两个通道的并发工作并通过连续批处理continuous batching进行调度。两类请求共享同一个 GPU、内存带宽和调度器。如何选择正确的方法打分不能取代生成因此 Jev 的方法只适用于应用程序在推理之前就已定义输出空间的情况。理想情况下兼容的工作负载应具有有限的一组有意义的标签。每个标签应映射到一个不同的下游动作。并且调用方只需要一个标签及其概率分布而不需要新的文本。结构化输出则不同它定义的是响应的语法解码器仍然逐个 token 地生成字段名和值。当这些值无法事先枚举时请使用结构化生成因为只有当候选值已知时打分才能省去解码过程。这张图对比了普通 LLM 解码、结构化输出解码和 Jev 风格的打分。一个很好的推进方式是按所需输出来选择推理路径当推理前输出内容未知时使用生成。当输出集合已知且只需做出选择时使用打分。在这种情况下第一个 next-token 向量中已经包含了排序。返回该排序可以避免调用方不需要的自回归循环。再次重申本文的项目复现的是 Jev 风格的推理机制但它没有复现 Jev 的权重、RLCD 流程或评估体系。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取