You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用llama-cpp-python输出候选令牌及概率以手动选择令牌?

在llama-cpp-python中手动选择令牌的方法

要实现手动选令牌而非自动生成,核心是获取模型输出的候选令牌及其概率,再按自定义逻辑挑选后继续生成,具体操作如下:

  • 初始化模型
    正常加载LLM模型,按需设置上下文窗口等参数:

    from llama_cpp import Llama
    
    llm = Llama(
        model_path="./your-model.gguf",
        n_ctx=2048,
        verbose=False
    )
    
  • 获取候选令牌与概率
    先将输入文本转成令牌,通过底层接口获取模型预测的logits,再转换为概率值:

    prompt = "今天天气不错,适合"
    # 把输入文本编码为令牌ID列表
    input_tokens = llm.tokenize(prompt.encode("utf-8"))
    # 让模型评估输入令牌,生成预测logits
    llm.eval(input_tokens)
    
    # 转换logits为概率
    import numpy as np
    from scipy.special import softmax
    
    # 获取最后一个位置的预测logits
    last_logits = llm._model._get_logits()[-1]
    # 用softmax把logits转成0-1区间的概率
    probabilities = softmax(last_logits)
    
  • 筛选并手动选择令牌
    按概率排序候选令牌,根据自定义规则挑选目标令牌:

    # 整理所有令牌ID和对应概率
    token_probs = list(enumerate(probabilities))
    # 按概率降序取前10个候选
    top_tokens = sorted(token_probs, key=lambda x: x[1], reverse=True)[:10]
    
    # 打印候选详情
    print("候选令牌列表(概率降序):")
    for token_id, prob in top_tokens:
        token_str = llm.detokenize([token_id]).decode("utf-8")
        print(f"令牌: '{token_str}' | 概率: {prob:.4f}")
    
    # 手动指定选中的令牌ID(示例选概率第二的)
    selected_token_id = top_tokens[1][0]
    
  • 持续生成循环
    将选中的令牌加入上下文,重复上述步骤即可继续手动选择:

    # 更新输入令牌列表
    input_tokens.append(selected_token_id)
    # 评估新加入的令牌,为下一轮选令牌做准备
    llm.eval([selected_token_id])
    

可以把上述逻辑封装成循环,直到选中终止令牌或达到预设的最大长度为止。

内容的提问来源于stack exchange,提问作者caveman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:12:14