3
2

More than 1 year has passed since last update.

Golang+LambdaでGhatGPTを活用したTwitterBotを作ってみた

Last updated at Posted at 2023-04-26

Summary

  • ChatGPTが生成したテキストを1日3回つぶやくTwitterBotを作成しました
  • 言語はGoで、OpenAI APITwitterAPI用のライブラリを用いて実装しました
  • Lambda+EventBridgeを用いて定期実行しています

Architecture & Deliverables

  • 上記を図示すると以下のようになります

architecture

Implementation Details

  • 実装の詳細を解説します

Call OpenAI API and creat a qute

  • まずはOpenAI APIをコールしてテキストを生成する部分を解説します

Library

Implemenataiton

  • 実装は以下のようになります
    • ほぼライブラリのREADME通りです
    • プロンプトはなんちゃってなので、ご了承ください🙇
import (
	"context"
	"fmt"
	"os"

	openai "github.com/sashabaranov/go-openai"
)

func generateQuote() (quote string, err error) {
    // OpenAI API Keyを用いてClientを生成します
	client := openai.NewClient(os.Getenv("OPEN_AI_API_KEY"))

    // Clientに対してChatCompletionの生成を命じます
	resp, err := client.CreateChatCompletion(
		context.Background(),
		openai.ChatCompletionRequest{
			Model: openai.GPT3Dot5Turbo,
			Messages: []openai.ChatCompletionMessage{
				{
					Role: openai.ChatMessageRoleUser,
					Content: `あなたは架空の歴史上の偉人の名言をつぶやくTwitterBOTと仮定してください。
					その偉人は、困難に直面したり、障害に立ち向かう人々を勇気づけるための名言をたくさん残しています。
					あなたはTwitterBOTとして、その名言を以下の形式で1つだけつぶやいてください。
					なお、文字数は140字以下として下さい。
					'''
					「${名言}」 
					ChatGPT (${職業})
					'''
					
					${名言}はあなたの名言です。「ですます」調を使ってはいけません。
					
					${職業}はあなたの職業です。なお、「架空」「歴史上」「偉人」「成功者」「先人」という言葉は使ってはいけません。
					具体的な職業名を使ってください。
					`,
				},
			},
		},
	)

	if err != nil {
		return "", err
	}

    // 生成されたテキストを取得します
	quote = resp.Choices[0].Message.Content

	fmt.Printf("generateQuote result: %v\n", quote)
	return quote, nil
}

Post a quote on Twitter

  • 続いて、生成したテキストを用いてTweetを作成する部分です

Library

Implementation

  • 実装は以下のようになります
    • こちらもほぼライブラリのREADME通りです
    • 認証はOAuth1.0を用いています
import (
	"context"
	"fmt"
	"os"

	"github.com/michimani/gotwi"
	"github.com/michimani/gotwi/tweet/managetweet"
	"github.com/michimani/gotwi/tweet/managetweet/types"
)

func tweetQuote(quote string) (err error) {
    // OAuth1.0を用いて認証情報を作成します
	in := &gotwi.NewClientInput{
		AuthenticationMethod: gotwi.AuthenMethodOAuth1UserContext,
		OAuthToken:           os.Getenv("GOTWI_ACCESS_TOKEN"),
		OAuthTokenSecret:     os.Getenv("GOTWI_ACCESS_TOKEN_SECRET"),
	}

    // 認証情報を用いてクライアントを作成します
	c, err := gotwi.NewClient(in)
	if err != nil {
		return err
	}

    // ChatGPTが作成したテキストを用いてTwtterのつぶやき用のテキストを生成します
	p := &types.CreateInput{
		Text: gotwi.String(quote),
	}

    // 生成したテキストを用いてTweetを作成します
	res, err := managetweet.Create(context.Background(), c, p)
	if err != nil {
		return err
	}

	fmt.Printf("tweetQuote result: [%s] %s\n", gotwi.StringValue(res.Data.ID), gotwi.StringValue(res.Data.Text))

	return nil
}

Miscellaneous

Codebase

  • 実際のコードベースは以下ですのでご参照ください

Infrastructure

  • LambdaにデプロイしてEventBridgeで定期実行する部分の解説は省略しますが、非常に簡単です
    • 以下の公式ドキュメント通りに実装するだけです
    • 上記のコードベースがそのままLambdaにアップロードできる形式になっているので、気になる方はお試しください

Conclusion

  • ChatGPT界隈ではPythonライブラリばかりが登場している気がしますが、Goでも素晴らしいライブラリのおかげで気軽にOpenAI APIを扱えました

  • ChatGPTを用いた何らかの処理を行うバッチ的なツールを作って、定期実行させる」というアイデアは、
    ChatGPTを業務活用するトライアルとしては悪くないと思いました

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2