見出し画像

ChatGPTに「ChatGPTに質問出来るslack botのtypescriptのコードを書いて下さい」とリクエストしてみた件

はじめに

最近話題のAIチャットボットであるChatGPT。

人工知能が質問に答えてくれるここ一週間で話題沸騰のサービスだ。

実際に使ってみると分かるが、なんと言っても人間が雑にリクエストした内容の文脈を読み取り、人間との対話のようなやりとりが出来る事にChat と名前がついているのだと理解できる凄みを感じる。

今日たまたまtwitterを眺めていて、VSCode上でChatGPTにリクエストを送り、自身のコードの文脈を読み取った上でコードを書いてくれる。みたいなサービスを知った。

その流れで何となく、githubでchatgptと検索をし、macのクライアントが出来てたり、Chrome拡張が出来てたり、DiscordのBotが出来てたりするのを見ていて、そのうちSlackのBotも出来上がるんだろうなと思っていた。

ふと、思い直し、ChatGPTにリクエストしたら書いてくれるのでは?と思いリクエストしてみた。

リクエスト出力結果

結果、10秒ほどで、以下のコードを書き上げてくれた。。
しかも、ご丁寧に適切なコメントも添えて。

import { WebClient } from "@slack/web-api";
import { RTMClient } from "@slack/rtm-api";
import { Request, Response } from "express";
import { createEventAdapter } from "@slack/events-api";

// Slack Appのトークンを設定
const slackWebClient = new WebClient(process.env.SLACK_TOKEN);
const slackRtmClient = new RTMClient(process.env.SLACK_TOKEN);
const slackEvents = createEventAdapter(process.env.SLACK_SIGNING_SECRET);

// Slack Botの名前を設定
const botName = "ChatGPT";

// Botが参加しているチャンネル一覧を取得
const channels = await slackWebClient.conversations.list();
const botChannels = channels.channels.filter(
  (channel) => channel.is_member
);

// Slack Botがメッセージを受信したときの処理
slackEvents.on("message", async (event) => {
  if (event.text.includes(botName)) {
    // Botに話しかけられた場合、ChatGPTに質問を送信
    const question = event.text.replace(botName, "");
    const response = await sendQuestionToChatGPT(question);
    slackRtmClient.sendMessage(response, event.channel);
  }
});

// ChatGPTへの質問を送信する処理
async function sendQuestionToChatGPT(question: string) {
  // ChatGPT APIを呼び出して質問に対する回答を取得
  const response = await fetch("<https://api.openai.com/v1/completions>", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.CHATGPT_SECRET}`,
    },
    body: JSON.stringify({
      prompt: question,
      model: "text-davinci-002",
      max_tokens: 128,
      temperature: 0.5,
    }),
  });
  const data = await response.json();
  return data.choices[0].text;
}

// Slack Event APIのエンドポイントを設定
app.use("/events", slackEvents.requestListener());

ちなみにGoも出力してみた

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/nlopes/slack"
    "github.com/openai/gpt-3/docs"
    "github.com/openai/gpt-3/src/api"
)

func main() {
    // GPT-3 APIクライアントを初期化する
    c := api.NewClient(os.Getenv("OPENAI_SECRET_KEY"))

    // Slack APIクライアントを初期化する
    s := slack.New(os.Getenv("SLACK_BOT_TOKEN"))

    // Slack RTM APIを開始する
    rtm := s.NewRTM()
    go rtm.ManageConnection()

    // Slack RTM APIからイベントを受け取る
    for msg := range rtm.IncomingEvents {
        // メッセージイベントを処理する
        switch ev := msg.Data.(type) {
        case *slack.MessageEvent:
            // メッセージにbotが含まれている場合は処理をスキップする
            if ev.BotID != "" {
                continue
            }

            // GPT-3に質問する文字列を作成する
            text := fmt.Sprintf("%s\\n%s", ev.Text, docs.GPT3Prompt)

            // GPT-3に質問をする
            res, err := c.Completions(
                &api.CompletionsRequest{
                    Prompt: text,
                    Model:  "text-davinci-002",
                    MaxTokens: 1024,
                },
            )
            if err != nil {
                log.Fatal(err)
            }

            // GPT-3の答えをSlackに投稿する
            if _, _, err := s.PostMessage(ev.Channel, slack.MsgOptionText(res.Choices[0].Text, false)); err != nil {
                log.Fatal(err)
            }
        }
    }
}

終わりに

ちょっと、破壊力が半端なすぎませんかね。。

エンジニア業から離れてるのもあり面倒なのでこっから先は試してもいないですが、 パット見た感じ微調整でいけそうなレベル。

ChatGPTとプログラミングは非常に相性が良い事がよく分かる一例だなと、出力させてみて改めて実感した。

まさしく、シンギュラリティの足音が聴こえてきています。

この記事が気に入ったらサポートをしてみませんか?