这是我第一次使用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来利用最新的和最好的模型。