OpenAI API 返回单词的一部分作为最可能的标记

这是我第一次使用OpenAI API(实际上也是我第一次接触语言模型)。我希望在给定一个缺少最后一个单词的不完整句子时,获得可以用来完成该句子的最佳单词及其概率。例如,对于句子“我最不喜欢的食物是…”,我想知道哪些单词可以用来完成这个句子,以及它们的概率是多少。

问题在于,对于某些句子,模型返回的不是完整的单词,而是我认为的单词的一部分。例如,对于上面的句子,前三个结果是“bro”、“an”和“spi”(我猜测它们分别是“broccoli”、“anxovies”和“spinach”)。对于其他一些句子(例如,“昨天我去了…”),它似乎给出了很好的回应(“park”和“supermarket”)。

我使用的是这里定义的get_completion()函数。

from openai import OpenAIfrom math import expimport numpy as npfrom IPython.display import display, HTMLimport osclient = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<your OpenAI API key if not set as env var>")) # Adding my API keydef get_completion(    messages: list[dict[str, str]],    model: str = "gpt-4",    max_tokens=500,    temperature=0,    stop=None,    seed=123,    tools=None,    logprobs=None,  # whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message..    top_logprobs=None,) -> str:    params = {        "model": model,        "messages": messages,        "max_tokens": max_tokens,        "temperature": temperature,        "stop": stop,        "seed": seed,        "logprobs": logprobs,        "top_logprobs": top_logprobs,    }    if tools:        params["tools"] = tools    completion = client.chat.completions.create(**params)    return completion

定义函数后,我使用以下代码:

# Define sentence listsentence_list = [    "Yesterday I went to the",    "My least favorite food is"]results = [] # Empty list to store resultsfor sentence in sentence_list:    PROMPT = f"Predict the next word to end this sentence: {sentence}"    API_RESPONSE = get_completion(        [{"role": "user", "content": PROMPT.format(sentence=sentence)}],        model="gpt-4",        logprobs=True,        top_logprobs=3,        )    for token in API_RESPONSE.choices[0].logprobs.content[0].top_logprobs:# Store original sentence, word, logprobs and linear probability        tokenResults = [sentence,token.token,token.logprob,float(np.round(np.exp(token.logprob)*100,2))]         results.append(tokenResults)

有没有办法强制它给我完整的单词及其概率?我对语言模型几乎一无所知,所以我不知道这些结果是否是预期的,或者我做错了什么。我尝试过更改提示,但结果总是相同的。

感谢任何帮助。另外,我希望问题格式没问题,这是我第一次发帖。


回答:

直接回答你的问题:这些结果是预期的,你做得一切都正确。不幸的是,可能没有简单的方法来完全实现你所要求的。

大型语言模型(LLMs)并不总是生成完整的单词作为它们的响应。相反,它们以标记(tokens)的形式生成响应,这些标记可能对应也可能不对应完整的单词。换句话说,标记是语言生成的基本单位。你可以在Hugging Face NLP课程中了解更多相关信息。

对于OpenAI的GPT-3.5模型,以下是模型词汇表中的一些相关标记:

15222  bro  60803  ccoli  42682  spin  613    ach  9712   super  19859  market  29836  park  

例如,为了生成单词“broccoli”,模型需要生成至少两个标记:[15222, 60803]。这是因为完整的单词“broccoli”在词汇表中并不存在为单个标记。(你可以在OpenAI的标记化页面上探索这一点)。

Completion API支持logprobs,但仅适用于每个预测的标记位置。它不提供未来标记位置的概率,这是你试图实现的目标。

注意: OpenAI的Completions API现在是旧版的。

大多数开发者应该使用Chat Completions API来利用最新的和最好的模型。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注