Gemini APIを使って感情分析ツールを作ってみた
はじめに
タイトルにあるように、今回はGemini APIを利用した感情分析ツールを作ったので、そこで得られた経験や開発に至った経緯など色々と書きました。
ソースコードは以下のリポジトリで公開してます。
後述してますが、まだ発展途上でCLIベースなので、大したものではないです。
学習用、暇つぶし用にでも使ってみてください。
何かのきっかけになれば幸いです。
どんな人に向けた記事か?
この記事は、主に以下のような方を対象としています。
- LLMを使ったアプリケーション開発に興味があるエンジニア: 大規模言語モデル (LLM) をAPI経由で利用して、簡単なアプリケーションを開発してみたいと考えているエンジニア。特に、自然言語処理のタスク (感情分析など) に挑戦したい方。
- Go言語でのAPI連携を学びたいエンジニア: Go言語で外部APIと連携する方法 (HTTPリクエストの送信、レスポンスの処理など) を習得したいと考えているエンジニア。
- 感情分析システムの基礎を理解したい人: 感情分析の基本的な仕組みや、実装方法について学びたい人。
補足:
このツールは、比較的シンプルな構成なので、API連携や自然言語処理の入門として最適かなと思います。
Geminiを選んだ理由、他のモデルとの比較など
この感情分析ツールの開発において、LLM(大規模言語モデル)としてGeminiを採用したのは、主に以下の理由からです。
- 技術的な優位性: Geminiは、Googleによって開発された最新鋭のLLMであり、テキストだけでなく、画像や音声など、様々な種類の情報を処理できるマルチモーダルな能力を持つことが特徴です。今回の感情分析ツールではテキストのみを扱いますが、将来的に画像や音声からの感情分析にも拡張することを視野に入れた場合、Geminiのマルチモーダルな設計は大きな強みとなります。
- Googleのエコシステムとの親和性: Geminiは、Googleの検索エンジンやその他のサービスとの連携がしやすいという利点があります。例えば、感情分析の結果に基づいて、関連する情報をGoogle検索で取得したり、他のGoogle Workspaceアプリと連携したりすることも、将来的に視野に入れることができます。
- クラウド環境への展開を見据えた管理のしやすさ: 将来的にこの感情分析ツールをWebアプリケーションとして開発し、Google Cloud Platform (GCP) などのクラウド環境にデプロイすることを考慮した場合、GeminiはGCPのコンソール画面でトークン使用量などを確認でき、管理がしやすいという利点があります。これは、開発規模が拡大した場合のコスト管理やパフォーマンス最適化において、重要な要素となると考えました。
LLMとしては、Gemini以外にも、OpenAIのGPTシリーズや、AnthropicのClaudeなどが広く知られています。それぞれの特徴を簡単に比較し、Geminiの立ち位置を明確にするために、以下の表にまとめました。
特徴 | Gemini | GPT | Claude |
---|---|---|---|
開発元 | OpenAI | Anthropic | |
マルチモーダル | ⚪︎ (強み) | ⚪︎ (強み) | △ (テキストと画像) |
コンテキストウィンドウ | 100万トークン以上 (モデルによって異なる | 最小4,096〜最大128,000トークン (モデルによって異なる) | 20万トークン以上 (モデルによって異なる) |
応答速度 | 高速 | モデルによって異なる | モデルによって異なる |
日本語対応 | ⚪︎ | ⚪︎ | ⚪︎ (自然な日本語生成に強み) |
その他 | Googleサービスとの連携、リアルタイム情報アクセス、GCPとの親和性 | プラグインによる拡張性、画像生成 | 長文処理、倫理的AIへの注力 |
完成したツールの概要紹介
今回開発した「Em0tion」は、Gemini APIを用いてテキストの感情を分析するコマンドラインツールです。
主な機能:
- テキスト入力: ユーザーはコマンドライン引数として、分析したいテキストをツールに渡すことができます。
- 感情分析: ツールは入力されたテキストをGemini APIに送信し、感情分析を行います。
- 感情判定: Gemini APIは、入力テキストの感情を「ポジティブ」「ネガティブ」「中立」のいずれかに分類します。
- 感情の度合いの可視化: 感情の度合いを0から10の数値で取得し、コンソール上に簡単な棒グラフのような記号列で表示します。
開発のステップ
このツールは、以下のステップで開発しました。
同様の開発を検討している方は、参考にしてみてください。
- 開発環境の構築
- Go言語のインストールと開発環境の設定
- 必要なライブラリのインストール (net/http, encoding/json,
github.com/joho/godotenv, flag, regexp) - プロジェクトの初期化 (go mod init)
- Gemini API連携部分の実装
- Gemini APIのエンドポイント、リクエスト/レスポンスの形式を調査
- APIキーの取得方法と管理方法の検討 (.env ファイルを使用)
- Goのnet/httpパッケージを使ってAPIリクエストを送信する関数(api.AnalyzeSentiment)
の実装 - APIレスポンスをencoding/jsonパッケージで解析し、感情分析結果を抽出する処理の実装
- エラーハンドリングの実装
コード例: api/gemini.goは以下のようになります。
// api/gemini.go (一部抜粋)
func AnalyzeSentiment(inputText string, apiKey string) (sentiment.Result, error) {
// ... (APIリクエスト送信、レスポンス処理)
return result, nil
}
- 感情分析結果の解析と表示
- APIレスポンスから感情の種類と度合いを抽出するロジックの実装
- Goのregexpパッケージを使って、レスポンス内の文字列を解析し、必要な情報を抽出
- 感情の種類を文字列、度合いを数値として取得
- 感情の種類と度合いをコンソールに表示する処理の実装
コード例: main.goは以下のようになります。
// main.go (一部抜粋)
func analyzeAndDisplaySentiment(inputText string, apiKey string) {
// ... (API呼び出し、結果表示)
// 感情の種類を抽出
sentimentRegex := regexp.MustCompile(`\*\s*\*\*感情:\*\*\s*([^\n]*)`)
// ...
}
- コマンドライン引数の処理
- flagパッケージを使って、コマンドライン引数から分析するテキストを取得する機能を実装
- -textオプションでテキストを指定できるようにする
- ヘルプメッセージの表示 (-h または --help オプション)
コード例: main.goは以下のようになります。
// main.go (一部抜粋)
func main() {
textPtr := flag.String("text", "", "分析するテキスト")
flag.Parse()
// ...
}
- 感情度合いの可視化
- 感情の度合いをコンソール上で簡単な棒グラフのように表示する機能を実装
- 感情の種類に応じて記号 (+, -, =) を使い分ける
コード例: main.go (上記 analyzeAndDisplaySentiment 関数内)は以下のようになります。
// main.go (一部抜粋)
func analyzeAndDisplaySentiment(inputText string, apiKey string) {
// ...
if result.Score != 0 {
bar := strings.Repeat("+", result.Score) // 例: ポジティブな場合
fmt.Printf(" [%s] (%d)\n", bar, result.Score)
}
// ...
}
- テストの実装
- testingパッケージを使って、主要な機能(API連携、レスポンス解析)に対するテストを実装
- ポジティブ、ネガティブ、中立なテキストに対するテストケースを作成
コード例: api/gemini_test.goは以下のようになります。
// api/gemini_test.go (一部抜粋)
func TestAnalyzeSentimentPositive(t *testing.T) {
// ... (ポジティブなテキストに対するテスト)
}
- ドキュメントの整備
- README.mdファイルを作成し、ツールの概要、インストール方法、実行方法、オプションなどを記述
- コード内のコメントを充実させる
- LICENSEファイルを作成し、ライセンス情報を記述
工夫した点、苦労した点
このツールの開発において、特に工夫した点と苦労した点は以下のとおりです。
工夫した点
- プロンプト設計
Gemini APIに送信するプロンプトを、期待する形式で感情分析結果が返ってくるように調整することに注力しました。特に、感情の種類や度合いを明確に指定することで、レスポンスの構造を制御し、後の解析処理を容易にすることを目指しました。
例えば、「このテキストの感情を分析してください。結果をポジティブ、ネガティブ、中立と0から10で度合いを出力してください。」といった感じです。
プロンプト設計に関しては、以下のリンクを参考にすることが多いです。
苦労した点
- APIレスポンスからの感情情報の抽出
Gemini APIのレスポンスは自然言語で記述されており、感情の種類や度合いが特定のフォーマットで返ってくるとは限りません。そのため、レスポンスの文字列から感情の種類や度合いを正確に抽出する処理を実装する必要がありました。Goのregexpパッケージを利用して、正規表現によるパターンマッチングを行い、必要な情報を抽出しましたが、様々なレスポンスパターンに対応できるように正規表現を調整するのに苦労しました。
今後の展望
このツールは、まだ発展途上にあり、今後様々な機能拡張や改善を検討しています。
主な拡張アイデア
- インタラクティブモードの実装
現在、ツールはコマンドライン引数でテキストを入力する必要がありますが、インタラクティブモードを実装することで、ユーザーがツールと対話しながら、複数のテキストを連続して分析できるようになります。これにより、より手軽に、様々なテキストの感情分析を試すことができるようになります。 - 詳細な感情カテゴリの分析
現時点では、感情を「ポジティブ」「ネガティブ」「中立」の3種類に分類していますが、より詳細な感情カテゴリ (喜び、悲しみ、怒り、恐れなど) を分析できるようにすることで、より深い分析が可能になります。 - Webアプリケーション化
最終的には、このツールをWebアプリケーションとして公開し、より多くのユーザーが簡単に利用できるようにしたいと考えています。Web UIを開発し、感情分析の結果をグラフやチャートで可視化することで、ユーザー体験を向上させたいです。
改善点と課題
- 感情分析の精度向上
Gemini APIの性能に依存する部分もありますが、プロンプトの改善や、より高度な分析ロジックの実装によって、感情分析の精度をさらに向上させたいと考えています。 - 多言語対応
現状、日本語のテキストにしか対応していないため、多言語対応を検討しています。 - パフォーマンスの最適化
特にWebアプリケーション化した場合、大量のアクセスに耐えられるように、パフォーマンスの最適化が必要と感じました。
まとめ
本稿では、Gemini APIを用いてテキストから感情を読み取るコマンドラインツール「Em0tion」の開発過程について、技術的な側面を中心に解説しました。
「Em0tion」は、まだ発展途上のツールですが、今後も機能拡張や改善を続け、より多くの人に役立つツールへと成長させていきたいと思います。
Discussion