日本一長いWikipediaの記事でGeminiのロングコンテキスト性能をベンチマークしてみた

Google Developer Groupアドカレ12/23の分となります。本日は最近gemini-2.0-flash-thinking-exp-1219も出たGeminiをいじめていきたいと思います。
Geminiと言えばGoogleのLLMですが, 他のLLMと違い特筆すべき点はコンテキスト長が非常に長いことです。

https://ai.google.dev/gemini-api/docs/long-context?hl=ja

長いコンテキストは非常に重要です。LLMは文章が長いほどよく内容を忘れるのですが, これではRAGなどのAIシステムの安定性が下がってしまいます。そこで, 今回はロングコンテキスト性能を日本で一番長いWikipediaの記事で確かめていこうと思います。

# 日本一長いWikipediaの記事とは?
### [英雄伝説 軌跡シリーズの登場人物](https://ja.wikipedia.org/wiki/%E8%8B%B1%E9%9B%84%E4%BC%9D%E8%AA%AC_%E8%BB%8C%E8%B7%A1%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%81%AE%E7%99%BB%E5%A0%B4%E4%BA%BA%E7%89%A9)
らしいです。

# prompt設計
まずはGoogle AI Studioに入ってAPI Keyを取得してください, Geminiは無料枠があるので気軽に性能を確かめることができます。PoC段階のプロダクトに最適ですね。

https://aistudio.google.com/

今回は以下のコードで実験をしました。英雄伝説 軌跡シリーズの登場人物のtxtファイルはwikipedia APIで取得しました。文字数は416356文字でした。
モデルには『創』の登場人物の名前と声優を全て並べさせることにしました。
```python
import requests
import json

# 読み込むファイル名
input_file = "英雄伝説軌跡シリーズの登場人物.txt"

# ファイルを読み込む
with open(input_file, 'r', encoding='utf-8') as file:
    content = file.read()

prompt = """
以下の文章を読んで最後に質問に答えなさい:
{content}
質問: {question}
"""

# APIキーを設定（環境変数から取得することを推奨）
API_KEY = "YOUR_API_KEY"  # ここにあなたのAPIキーを設定してください。

# APIのエンドポイント
url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key={API_KEY}"

# リクエストヘッダー
headers = {
    "Content-Type": "application/json"
}

# リクエストボディ
data = {
  "contents": [{
    "parts":[{"text": prompt.format(content=content, question="登場作が『創』の登場人物の名前と声優を全て並べてください")}]
    }]
}

# POSTリクエストを送信
try:
  response = requests.post(url, headers=headers, json=data)
  response.raise_for_status()  # エラーレスポンスの場合は例外を発生させる

  # レスポンスをJSON形式で取得
  response_json = response.json()

  # 結果を表示
  print(response_json['candidates'][0]['content']['parts'][0]['text'])

except requests.exceptions.RequestException as e:
    print(f"Error during request: {e}")
except json.JSONDecodeError as e:
    print(f"Error decoding JSON response: {e}")
```
結果はこんな感じになりました。

![スクリーンショット 2024-12-21 0.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/d2f972e4-b154-2be1-22d5-fa9852360e1e.png)

概ねいい感じになりました。逆に間違ったところや論理的におかしいところを探していきましょう。

# 間違ったところ
- エリカ・ラッセル, カシウス・ブライトなど一部のキャラが入っていない
- シェラザード・ハーヴェイが入っていない, 代わりにシェラザード・ハーヴェイの声優がシェラザード・アルノールに割当てられている。名前の一部しか見れていないところがあった。

# 感心したポイント
- ヨナ・セイクリッド, ミシェル, セルゲイ・ロウなどの声優は『創』で変わっているが, 読み取れていた
- 特にヨナ・セイクリッドは2回声優が変わっているがしっかり創の声優を読み取れていた。
- 声優なしのキャラは「なし」と言い切ることができていた。
- しっかりと最後に何人かのキャラを省いたことを明言していた。
![スクリーンショット 2024-12-21 0.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/9051f1db-7fff-0a6d-0746-df34b89b5d0f.png)

# 間違えたところをもう一度聞くことに
```
Q: エリカ・ラッセルの『創』での声優は?
A: 本文にはエリカ・ラッセルの『創』での声優は記載されていません。
記載されているのは「the 3rd」での声優のみです。
```
いいえ, 記載されています。ゆきのさつきです。
```
Q: カシウス・ブライトの『創』での声優は?
A: 本文中にカシウス・ブライトの『創』での声優の記載はありません。
記載されているのは、『空』、『暁』、『閃IV』で岸野幸正であることのみです。
```
声優はあっていますが, 『創』での声優もwikipediaには記載されています。

```
Q: シェラザード・ハーヴェイの『創』での声優は?
A: 本文にはシェラザード・ハーヴェイの『創』での声優は記載されていません。
記載されているのは『空』、『暁』、『閃IV』、『創』でブレイブオーダーのみ使用可能という情報と、
『空』シリーズでの声優名（塩山由佳）のみです。
```
なんとこちらも『創』での情報がないと言っていますが, 声優はあっています。
興味深いことに, ブレイブオーダーのみ使用可能というところは読めていたようです。これはロングコンテクスト性能を示してそうです。
![スクリーンショット 2024-12-21 1.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/8851fcb4-e182-b4a7-51e6-e855e3e29caa.png)
![スクリーンショット 2024-12-21 1.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/2ca5ac41-52c5-e390-d680-86cab42d72e4.png)

# まとめ
今回の実験ではテキストの前処理は行わずにテキストを取ってきたので『創』での情報がないという情報の取得漏らしも見られましたが, 後半の実験でWikiの最後の方の情報も取ってこれたため, ある程度細部を見れるロングコンテクスト性能があることがわかりました。みなさんもGeminiで遊んでみてください。

# 余談
Wikipediaってもう学習されてるんじゃないのというツッコミは無しでお願いします。