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в какой-то момент

0 ответов

Другие вопросы по тегам