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

如何使用GPT-3实现类似BERT的掩码词填充任务?

用GPT-3实现类似BERT的掩码词填充效果

你目前通过BERT的fill-mask pipeline可以获取掩码位置的候选替换词及对应概率,想要用GPT-3实现相同效果,解决Playground生成完整句子、无概率输出的问题,可通过OpenAI API实现,具体方案如下:

实现思路

GPT是自回归模型,和BERT的掩码语言模型(MLM)机制不同,但可以通过以下方式模拟掩码填充:

  • 构造约束性提示词,引导模型仅生成掩码位置的单个替换词
  • 使用API的logprobs参数获取候选词的对数概率,转换为百分比后得到类似BERT的概率结果

具体代码实现

import openai
import math

# 配置你的OpenAI API密钥
openai.api_key = "YOUR_API_KEY"

def gpt_fill_mask(prompt, top_k=10):
    # 构造提示,明确要求仅输出单个替换词
    formatted_prompt = f"为以下句子中的[MASK]位置提供最可能的{top_k}个单个替换词,每个词单独一行,不要生成完整句子:\n{prompt}"
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-instruct",  # 或选用text-davinci-003,更适配文本补全场景
        prompt=formatted_prompt,
        max_tokens=50,  # 限制输出长度,避免生成多余内容
        temperature=0,  # 降低随机性,聚焦最具确定性的候选词
        logprobs=top_k,  # 返回top_k个候选词的对数概率
        echo=False
    )
    
    # 解析结果,提取候选词与对应概率
    results = []
    top_logprobs = response.choices[0].logprobs.top_logprobs[0]
    for token, logprob in top_logprobs.items():
        # 将对数概率转换为百分比形式
        probability = round(math.exp(logprob) * 100, 2)
        # 清理token中的多余空格或标点
        clean_token = token.strip().strip('.')
        results.append({"token_str": clean_token, "score": probability})
    
    return results

# 测试示例
prompt = "The sun is [MASK]."
mask_results = gpt_fill_mask(prompt, top_k=10)
for res in mask_results:
    print(f"{res['token_str']} ({res['score']}%)")

关键参数说明

  • logprobs: 设置为需要返回的候选词数量(如10),API会输出每个位置最可能的top_k个token及其对数概率
  • temperature=0: 强制模型输出最确定的结果,避免随机生成无关内容
  • max_tokens: 限制输出长度,确保模型仅生成候选词而非完整句子
  • 模型选择:gpt-3.5-turbo-instruct或text-davinci-003更适合文本补全场景,比对话模型更易控制单token输出

注意事项

  • GPT的自回归特性与BERT的MLM机制存在差异,生成的候选词分布可能略有不同,但能满足获取高概率替换词的需求
  • 若需要更严格的单token输出,可在提示词中进一步明确要求(例如“只输出单个英文单词,不要添加任何额外内容”)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:39:46