Azure OpenAI + Excelで疑似CHATGPT

Azure上でOpenAIの一部機能を利用できるようになりました。この中でChatGPTの元になっているGPT-3に相当するようなモデル(davinci)があるのでAzure OpenAI Studioのプレイグラウンドを使うとセキュアなCHATGPTのように利用できます。モデルは他にも幾つかあって、モデルを変えてみると結果も違って面白いです。

そこでExcelで一括でGPTを使った問い合わせを実行してみました。せっかくなのでOfficeスクリプト(筆者初挑戦)で試しました。初挑戦なのでまだ無駄やおかしなところもあると思いますがとりあえず動けばOKと割り切っています。

Officeスクリプトは「自動化」から新規作成します。「自動化」タブのない場合には出し方を別にWeb検索してください。

下のコードを実行する前に最初のシートに5列からなるTableが必要です。このTableの3列目をGPTへ送るような仕組みを考えます。Table構造を変更する場合にはコード中のinterface TableDataを修正してください。

通常のシートの状態をTableにするには範囲を指定し「挿入」→「テーブル」を行います。

下のコードでは以下の3項目を変更する必要があります。

  • qmt変数
    • 3列目に前もってつける文字列。GPTへのお願い文
  • API-KEY
    • AzureのOpenAI用リソースの画面で「開発」を押すと表示されるキー1もしくはキー2
  • URL
    • プレイグラウンドで「コードビュー」し表示されるURL
const qcmt = "!!! 共通で問いかける文章 !!!\r\n\r\n";

async function main(workbook: ExcelScript.Workbook)  {
  const sheet = workbook.getWorksheets()[0];
  const table = sheet.getTables()[0];
  const texts = table.getRange().getTexts();

  let returnObjects: TableData[] = [];
  if (table.getRowCount() > 1) {
    for (let i = 1; i < texts.length; i++) {
      let prompt: string = qcmt + texts[i][2]; // qcmt + col3をGPTで送信する
      texts[i][6] = await callGPT(prompt);
      sheet.getRangeByIndexes(i, 10, 1, 1).setValue(texts[i][6]);
    }
  }
}

async function callGPT(prompt: string) {
  const param = {
    method: "POST",
    body: JSON.stringify({
      prompt: prompt,
      temperature: 1,
      top_p: 0.5,
      frequency_penalty: 0,
      presence_penalty: 0,
      best_of: 1,
      max_tokens: 100,
      stop: null
    }),
    headers: {
      "Content-type": "application/json; charset=UTF-8",
      "api-key": "!!! API-KEY from AZURE !!!"
    }
  };

  const res = await fetch("!!! URL from AZURE !!!", param);

  let json: JSONData = await res.json();

  return json.choices[0].text;
}

interface JSONData {
  "id": string;
  "object": string;
  "created": number;
  "model": string;
  "choices": {
    "text": string;
    "index": number;
    "finish_reason": string;
    "logprobs": string;
  };
  "usage": {
    "completion_tokens": number;
    "prompt_tokens": number;
    "total_tokens": number;
  };
}

interface TableData {
  "col1": string;
  "col2": string;
  "col3": string;
  "col4": string;
  "col5": string;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です