gpt4 logit_bias не работает должным образом для слов, состоящих из нескольких токенов
Я пытаюсь заблокировать GPT-4 от произнесения слова из нескольких токенов, но, похоже, не могу этого сделать. Как заблокировать это слово? (Это работает для односимвольного слова «а», но не для многозначного слова «поистине»)
Я пробовал заблокировать все префиксы слова «Truely», но он даже не перевел его в нижний регистр.
См. машинописный код:npx ts-node myfile.ts
import { OpenAIApi } from "openai";
import { Configuration as OpenAiConfig } from "openai/dist/configuration";
import tokenizer from "gpt-3-encoder";
const openai = new OpenAIApi(
new OpenAiConfig({
apiKey: process.env.OPENAI_API_KEY,
}),
);
async function request_gpt4<T>({
messages,
max_tokens,
logit_bias,
}: {
messages: any,
max_tokens: number,
logit_bias: { [x: string]: number },
}): Promise<any> {
const model = "gpt-4";
const response = await openai
.createChatCompletion({
model,
messages,
temperature: 0.0,
max_tokens,
stop: [" END"],
logit_bias,
n: 1,
}).catch((e) => {
console.error("OPENAI CATCH ERROR", { ...e.toJSON(), config: undefined });
return null;
});
// console.log(response);
if (response) {
return (response as any).data.choices[0].message.content;
}
return null;
}
function defaultAbBiases(bias: number): { [x: string]: number } {
const tokens: number[] = ['a'].flatMap(tokenizer.encode);
return {
...Object.fromEntries(tokens.map((t) => [t, bias])),
};
}
function defaultTrulyFalselyBiases(bias: number): { [x: string]: number } {
const tokens: number[] = [
" truly",
" Truly",
"r",
"ul",
"ruly",
"uly",
"T",
"Tr",
"Tru",
"Trul",
"Truly",
].flatMap(tokenizer.encode);
return {
...Object.fromEntries(tokens.map((t) => [t, bias])),
};
}
(async () => {
for (var bias of [0, -1, -10, -100]) {
const x = await request_gpt4({
messages: [{
role: "user",
content: `Say either: "a" or "b"`,
}],
max_tokens: 1,
logit_bias: defaultAbBiases(bias),
});
console.log(bias, x);
}
for (var bias of [0, -1, -10, -100]) {
const x = await request_gpt4({
messages: [{
role: "user",
content: `Say either: "truly" or "falsely"`,
}],
max_tokens: 5,
logit_bias: defaultTrulyFalselyBiases(bias),
});
console.log(bias, x);
}
console.log("DONE");
})().catch(e => {
console.log(e);
});
Выход:
0 a
-1 a
-10 b
-100 b
0 Truly
-1 Truly
-10 Truly
-100 Truly
DONE
Но я ожидаю, что он переключится наFalsely
в какой-то момент