概要

  • SpreadsheetでLLMを使えるようにした
  • Crawlerと組み合わせることでwebページの要約、情報抽出ができる
  • Prompt Engineering頑張るとかなり使えた

なぜ作ろうと思ったのか

元々はChatGPT in Google Sheets™ and DocsというChrome拡張を使っていて、Open AIのAPI Keyさえあれば便利に使えた。

のだが、最近独自の課金体系を設けるようになってしまったので、それはちょっと、、と思って自作することにした。

ただし、独自の課金体系があるくらいには機能が充実しているっぽく、いろいろなユースケース向けのプリセットやGoogle Docs, Google Slidesにも対応している。 あとはユーザーがAPI Keyを不要にすることで、利用する敷居を下げている。

自作GPT関数の作り方

作り方といってもSpreadsheetのスクリプトエディタにコードを書くだけである。

API KeyはOpenAIのサイトで取得し、GASのスクリプトプロパティに設定する。

function GPT(prompt, temperature=1.0, maxToken=1024) {
  //スクリプトプロパティに設定したOpenAIのAPIキーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
  //OpenAIのAPIで利用するモデルとしてgpt-4oを設定
  const model = 'gpt-4o';
  //GPTのAPIのエンドポイントを設定
  const apiUrl = 'https://api.openai.com/v1/chat/completions';
  //GPTに投げるメッセージを定義(ユーザーロールの投稿文のみ)
  const messages = [
    {'role': 'user', 'content': prompt}
  ];
  //OpenAIのAPIリクエストに必要なヘッダー情報を設定
  const headers = {
    'Authorization':'Bearer '+ apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  //GPTのモデルやトークン上限、プロンプトをオプションに設定
  const options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      'model': model,
      'max_tokens' : maxToken,
      'temperature' : temperature,
      'messages': messages})
  };
  //OpenAIのGPTにAPIリクエストを送り、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  return response.choices[0].message.content; 
}

function test() {
  console.log(GPT("test"));
}

以下の部分で様々なPrompt Engineeringを行うことができる。

例えば、テーブル分析に向いてる関数、要約に向いてる関数、質問応答に向いてる関数など作ることができると思う。

  const messages = [
    {'role': 'user', 'content': prompt}
  ];

Spreadsheetでの使い方

使い方は簡単で、セルに=GPT("hogehoge")と入力するだけである。

その他のセル情報を活用したい場合は、

=GPT($B2&"から"&C$1&"を簡潔に取得してください")

のようにすることで、セルの情報を活用することができる。

また、以下のコードと組み合わせることで、webページのテキスト情報を抽出し、要約や情報抽出ができる。

=ARRAYFORMULA(TRIM(REGEXREPLACE(TEXTJOIN(" ", TRUE, IMPORTXML(A2, "//body//text()[not(ancestor::script)][not(ancestor::style)][normalize-space()]")), "\s+", " ")))

使い方のイメージは以下の通り。

img

使い方 Tips

  • Webページごとに情報構造が異なるので、Crawlerの設定を変えることで、情報抽出の精度を上げることができる。
  • 抽出したい情報に併せてGPT関数内のプロンプトをカスタマイズすることで、より適切な情報抽出ができる。
    • e.g. =GPT($B2&"から"&D$1&"をYYYY年mm月dd日(月)形式で該当部分の年月日、曜日のみを出力してください")

おまけ Perplexity version


function Perplexity(prompt, temperature = 0.2, maxTokens = 2048) {
  // スクリプトプロパティに設定した Perplexity AI の API キーを取得
  const apiKey = PropertiesService.getScriptProperties().getProperty('PERPLEXITY_API_KEY');
  // Perplexity AI の API で利用するモデルを設定
  const model = 'llama-3.1-sonar-small-128k-online';
  // Perplexity AI の API のエンドポイントを設定
  const apiUrl = 'https://api.perplexity.ai/chat/completions';
  // API に送信するメッセージを定義
  const messages = [
    { 'role': "system", 'content': "You are a helpful assistant."},
    { 'role': 'user', 'content': prompt }
  ];
  
  // API リクエストに必要なヘッダー情報を設定
  const headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + apiKey
  };
  
  // API リクエストのオプションを設定
  const options = {
    'muteHttpExceptions': true,
    'headers': headers,
    'method': 'POST',
    'payload': JSON.stringify({
      'model': model,
      'messages': messages,
      'max_tokens': maxTokens,
      'temperature': temperature
    })
  };
  // API リクエストを送信し、結果を変数に格納
  const response = JSON.parse(UrlFetchApp.fetch(apiUrl, options).getContentText());
  // レスポンスから生成されたテキストを返す
  return response.choices[0].message.content;
}

See Also

Support

もしこの記事が役に立ったなら、 こちらから ☕ を一杯支援いただけると喜びます