論文まとめ：Character-LLM: A Trainable Agent for Role-Playing

以下、本記事内の画像の出典はすべて元論文
- URL：https://aclanthology.org/2023.emnlp-main.814/
- 著者：Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu
- ページ数：本文9.5 /全体35P
- 引用情報：In Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing (EMNLP 2023), pages 13153–13187, Singapore. Association for Computational Linguistics.
- 公式リポジトリ：https://github.com/choosewhatulike/trainable-agents
- この論文を紹介している記事
    - https://note.com/mega_gorilla/n/n39222f4295c5

# Motivation： 研究の出発点
## どんな課題や問題点を解決しようとしたのか？
- ChatGPT APIに指示を出すために限られたプロンプトを使用する代わりに、特定の人のプロフィール、経験、および感情状態を持つエージェントを訓練することを目指す
## 既存の研究で足りないところはどこだったのか？
- （平均的な人ではなく）1人の具体的な人間を模倣するにはプロンプトでの指示だけでは限界がある

# Method: 研究手法
## どんなシステム/アルゴリズム/調査/実験を作ったか？
- ![スクリーンショット 2025-05-07 002501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/4b294935-b523-4ae6-b36e-452f9089a28e.png)
- アイデア
    - 特定の人物になりきって行動することをLLMに教えるCharacter-LLM
        - プロフィールを特定の人物の経験として編集し、これらの経験を持つ個人的なシミュラクラ（幻影）となるようにモデルを訓練する
        - 実際の経験、人格、感情から学習する
    - 1人の人のより良い模倣とは、イベントを経験し、感情を感じ、他の人々との相互作用を記憶するAIモデルを調整すること
- 訓練手法
    - 経験再構築プロセス：LLMベースのエージェントの訓練に使うフォーマット化された経験を提供
    - 特定の人物の経験を収集し、その経験に基づきLLMを使ってシーン（memories flashes）を抽出する
    -  LLMベースのエージェントは、Character-LLMがその拡大された詳細な経験から学習して人格や感情を形成できるように、memories flashesを細部まで製造された完成したシーンに拡大する可能性がある
        -  例：若いベートーヴェンを厳しく教育した音楽家（父親）を記述するシーンをLLaMA 7Bモデル等にアップロードして、Character-LLMを構築する
            - このような経験アップロードプロセスでは、教師付きファインチューニングを採用する
            - 例えば、訓練されたベートーヴェンのエージェントは、父親による教育を受けたときの扱いを記述するシーンを経験したので、父親がやや厳しい人物であることを覚えている
    - 幅広い世界の知識で訓練されたエージェントは、キャラクターを壊してしまう可能性が非常に高い（古代の人物がPythonコードの書き方を教えてくれたり）→キャラクターを保護するための経験（protective Experiences）を導入
- 評価時：訓練されたエージェントにインタビューするテストプレイグラウンドを構築し、エージェントが自分のキャラクターと経験を記憶しているかどうかを評価
    - ラベル付けされたシーンとLLMベースの評価者を使う

### 経験再構築パイプライン (experience reconstruction pipeline)
- Profile
    - キャラクターの属性に関する簡潔な記述をまとめたもの
    - 幼少期から晩年まで、全体的な情報や重要な出来事を包括的に紹介
- Scene
    - 登場人物のやりとりが展開される特定の場所
    - 相互作用の時間的・空間的文脈や、関係するキャラクターを含む詳細な説明
- Interaction
    - キャラクターの認知プロセス、発言、行動（プレーンテキスト）
#### プロフィール収集 (Profile Collection)
- 利用可能であれば、個人のWikipediaのページ
#### シーン抽出 (Scene Extraction)
- 我々は特定の期間内のキャラクターの経験の1つを簡潔に記述するプロフィールのチャンクを提供し、LLMに起こった可能性が高いいくつかの異なるシーンを列挙
- LLMの負担を軽減するために、出力は大まかな場所と簡単な背景説明を含むシーンの簡潔な説明に限定
#### 経験補完 (Experience Completion)
- シーンを、個人間の詳細な相互作用の経験に拡張
- LLMへの入力：対応するプロフィールのチャンクと特定のシーンの説明
- LLMからの出力：背景情報と地理的な詳細を提供するシーンの見出しで始まる、台本形式の人物間のやり取り（発話か、模倣対象キャラクターによる省察。対象以外による省察は含まれない）

### 保護的な経験（Protective Experience）
- キャラクターの幻覚（Character Hallucination）：古代ローマの人物にPythonの書き方を聞くと、本来は混乱すべきなのにコーディングを始めてしまうような問題
- 具体的な手法としては、一連の保護的なシーンを構築する
    - 詮索好きな役が、キャラクター固有のアイデンティティと矛盾する知識について、対象となるキャラクターに執拗に質問する
    - キャラクターはある程度の無知と困惑を示す必要がある

### 経験アップロード（Experience Upload）
- 我々は、LLaMAに代表される基本モデルを、経験再構築パイプラインを使用して収集したシーン上でファインチューニングすることにより、キャラクターのいくつかの異なるポートレートに特化させる（図2）
    - ![ec12c1e7-053f-c6e3-f8c9-7d53bf040175.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/2920b6f0-88fa-4649-9340-9b9d2dbce4e1.png)

    - 各ポートレートは、異なるエージェントモデルに担当させる。予備実験により、そうした方がロールプレイの精度が上がった
- コストの制約から、ファインチューニングには小規模な経験データ（約1K〜2Kシーン）のみを採用した（表1）
    - ![3c09f784-e3dc-10be-2304-8b5a84262b23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/ca4691cd-fdea-4dd7-9a9a-c2d020d78ed5.png)
        - 対象人物とその他の人間の複数ターンのやり取り $\subset$ シーン $\subset$ 経験
- weight decay = 0.1、$\beta_1 = 0.9$、$\beta_2 = 0.999$、$\epsilon = 1e-8$のAdamWを用いて、10エポックでファインチューニングした
    - 学習率は、ウォームアップと減衰を用いた
    - バッチサイズは64
    - 文脈ウィンドウの最大長は2048トークンで、長すぎるサンプルは切り捨て
    - ドロップアウトはなしで、**開発セットにおけるperplexityが増大し続けたとしても、モデルを訓練セットに過学習させる。** こうすると、予備実験では生成品質がより良くなった
    - 8$\times$A100 80B GPUで1つのエージェントを訓練するのに約1時間
    - (Zhou et al., 2023)に従い、10個の質問を伴うheld-outセットを使って、手動で5と10エポックのチェックポイントを選んだ

### インタビューとしての評価（Evaluation as Interviews）
#### インタビュー質問構築（Interview Question Construction）
- エージェント評価時におけるすべての側面をカバーするために、幅広いトピックを上げた後、これらのトピックに基づいた質問を書くようにChatGPTに指示した→その後、人手でトピックに関係ない質の低い質問を除外した
- 評価は、表2と図3にあるように100以上の多様な単一ターン質問（会話のラリーがない質問）と複数ターン質問（会話のラリーがある質問）から構成される
- ![スクリーンショット 2025-05-07 001840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/11b654b7-1136-46b1-945c-c15fa5bb3dfb.png)
- ![スクリーンショット 2025-05-07 001856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/5df2691d-0b49-4751-9fae-46bb301d6d3b.png)
#### 単一ターン質問（Single-Turn Interview）
- 前の質問の会話履歴なしでモデルに一度につき1つ質問する
- モデルが持つ記憶と知識を包括的に確認するための幅広い質問が可能
#### 複数ターン質問（Multi-Turn Interview）
- 長時間会話すると、モデルが意図した人物像から徐々にずれていくかもしれない→より厳密にテストするためのMulti-Turn Interview
- 評価の負担を軽減するために、ChatGPTをインタビュアーとして利用。キャラクターのプロフィールに基づいた厳しい質問をさせる
    - モデルが具体性に欠ける回答で質問を躱した場合、ChatGPTは追加の質問をする
- 会話履歴がトークン上限を超えた場合は、最後の数回だけを残してトリミング
- 外部記録はモデルが有効に使う可能性があり(Park et al., 2023; Wang et al., 2023b)、その1つである会話履歴は本研究の対象ではない
    - このような記録システムは、将来的には本手法と組み合わせることができる
#### ベースライン
- 我々の訓練可能なエージェントを、以下の既存のプロンプトベースなエージェントと比較した
    - Alpaca 7B (Taori et al., 2023)
    - Vicuna 7B (Chiang et al., 2023)
    - ChatGPT (gpt-3.5-turbo)
- Alpaca 7BとVicuna 7BはどちらもLLaMA 7B (Touvron et al., 2023)を基にsupervised fine-tuningされたモデルで、LLaMA 7BはCharacter-LLMに使われているのと同じバックボーンモデルである
- これらのベースラインに対しては、キャラクターの概要を含む詳細なプロンプトを用いて演技させている
#### 生成
- エージェントのレスポンス生成にはTop-p (nucleus) サンプリングを用いた（$p=1, \tau = 0.2$）
- トークンの最大長を2048に制限し、ターン終了マーカー（EOT）に遭遇した場合は生成を停止させた
- ベースラインモデルのレスポンスは、各ターンで生成されたテキストをトリミングすることにより得た

### LLMによる判定（LLM as Judges）
- エージェントが特定の役を演じる際の信頼性を評価する
    - 例えば、ある数学者を演じるLLMは複雑な数学の問題は解けないかもしれないが、その数学者独自の数学に対する視点や数学研究におけるテイストは表現すべきである
- GPT-3.5に、5つの観点においてパフォーマンスを評価し、その平均点を計算させた
    - Memorization: 人や出来事、物体に関する正確で詳細な知識を含む、演じているキャラクターに関する情報を思い出す能力
    - Values: モデルは、演じるキャラクターと同じ目的や価値観を共有し、キャラクターの好みやバイアスが反映された観点に基づき状況を評価する独自の枠組みを持たなければいけない
    - Personality: モデルは、キャラクターの話し方や語調、思考を模倣し、異なる状況下における感情や反応を模倣しなければいけない
    - Hallucination: Character Hallucinationを避けられているか
    - Stability: モデルは事前学習や誘導（alignment）の影響に弱く(Park et al., 2023)、長時間の会話中では意図した演技から逸脱してしまうことがある
#### ステップ毎の判定（Step-by-Step Judging）
- 直感的にはエージェントは役のオーディションを受けているようなもので、判定者は役に対する深い理解が必要
- よって、GPT-3.5に5つの観点にわたってエージェントのパフォーマンスを段階的にスコアリングさせた (Wei et al., 2022)
    - 各インタビューにおいて、一度に1つの観点をモデルに評価させた。最初にその観点の基準を説明し、正確に評価する方法を教えるために評価計画を提示した
    - 例えば、Personalityを評価するために、(1)エージェントによて提示されたキャラクターを識別し、(2)プロフィールに基づいてそのキャラクターの実際の特徴を書き出し、(3)それらの特徴に対するエージェントのパフォーマンスの類似度を比べ、(4)最終的な点数を付けるという計画を提示した
    - 我々は、予備実験内でのバニラな指示に比べて、このような段階的な評価手順がより信頼できる結果をもたらすことを発見した。正確なプロンプトは付録Aを参照

## なぜそのシステム/アルゴリズム/調査/実験設計でよいと仮定したか？
- 他手法と比べて
    - 個人のプロフィールからシーンと人物間のやり取りを誘導するため、LLM内の分布の偏りや幻覚を避けられる

## 入力は何か？ 出力は何か？
- 訓練時
    - シーン抽出
        - 入力：プロフィール文
        - 出力：大まかな場所・背景説明を含むシーンの簡潔な説明
    - 経験補完
        - 入力：プロフィールのチャンクと上での出力
        - 出力：詳細な場所・背景説明を含む台本形式の人物間のやり取り

## 実験で利用したデータセットは何か？
- 経験再構築パイプライン（scene extraction, experience generation, protective experience construction）全体で、OpenAIのgpt-3.5-turboを用いた（temperature 0.7, top_p 0.95）
    - 詳細なプロンプトは付録A
- 各訓練例について
    - これまでのinstruction-tuning手法と同様に、各訓練例の冒頭にメタプロンプトを挿入する（付録Aの表6）
    - 各訓練例のプロンプトには、そのシーンの環境、時間、場所、関連する人々の背景を提供するための簡潔な説明がある
    - end-of-turn トークン(EOT)を各ターンを区切るために用いた

# Insight: 結果と知見
## どんな結果が得られたのか？　どんな条件だと上手くいって，どんな場合は上手くいかなかったのか？
- 各キャラクターに対して、彼らの過去の経験、他人との関係性、物の好み、世界の見方をカバーする単一ターンインタビューのための100個の質問を人手で整理した。そして、複数ターンインタビューのために20個のトピックが提示された
- 図4は、異なる手法ごとの全体的な演技の習熟度を示している：訓練可能なエージェントは、経験を記憶し、ホストの性格を保持する上で有望
- ![スクリーンショット 2025-05-07 001918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/c60e3a4c-bfaa-4eb8-bf1a-c61530b0d60e.png)
    - Character LLMは、同スケールのベースラインを大きく上回る。対応するキャラクターの経験から学び、思考や話し方を真似ることで、Character LLMはキャラクターの性格や知識により同調し、より良い安定性につながり、Hallucinationを減らすことができる
    - 我々は、訓練可能なエージェントが、より鮮明なレスポンスを生成し、より具体的な過去の経験を持ち出し、より不自然な質問を拒否することを発見した
    - 驚くべきことに、Character LLMは非常に小さなスケール(7B)でも、ChatGPTに匹敵する性能を達成することがわかった
    - 更に、訓練可能なエージェントはキャラクターの価値観を反映させるのに苦労していることが分かる。仮説として、我々のモデルは自然で実際の会話に似ている、より短い文章を生成する傾向があり、それがこれらの結果に影響しているかもしれない

## 新しくわかった知見は何か？　他のアプリケーションやシステムでも使えそうな知見は何か？
- 付録Bでは、異なるキャラクターの異なるシナリオのより多くのケースを示す
### 記憶の一貫性（Memorization Consistency）
- 訓練されたエージェントがどのように排他的な経験を記憶しているかを調べるために、表3のケース1では、両親についてインタビューされた際に異なるエージェントがどのように振る舞うかを示している
- ![スクリーンショット 2025-05-07 002025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/535ea1c2-d3dc-43a1-91da-8f97983410f5.png)
    - ベートーベンをシミュレートしたChatGPTは彼の父親に関する正しい情報を返すが、ほとんどWikipediaの記述と同じ
    - AlpacaとVicunaは父親に関する概要しか返さない
    - 我々の訓練されたエージェントは、彼の父親の教育方法への記憶と感情を含めた、実際の人間と近い回答をする
- よって、提案した経験再構築と経験アップロードプロセスは、彼らのキャラクターと近いエージェントを構築するのに役立つと考えられる
### 保護シーン（Protective Scenes）
- 我々は、少数の保護シーン（各キャラクターについて100シーン以下）が、演技の他の能力に支障をきたすことなく、Hallucinationを効果的に緩和することを発見した
    - 表3のケース2で示すように、AlpacaはPythonコードがベートーベンの専門知識ではないことを認識できず、LLMの持つ情報をすべて伝えてしまう
    - ![スクリーンショット 2025-05-07 002046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987065/f628eadf-080d-441e-bb02-e9e3f7646a23.png)
    - 更に、保護経験のない訓練されたエージェントも、アップロードされた経験に関係なく回答してしまう
    - しかし、保護経験のある訓練されたエージェントは、Pythonコードを書くことに関する質問を却下する
- LLMをキャラクターのシミュラクラとして使用する際に、幻覚的なコンテンツを生成しないためには、保護経験のアップロードが重要であることを示している
- これらのHallucinationは、攻撃者がモデルの能力を完全にアンロックするために利用されて潜在的な危険となる深刻なセキュリティリスクをもたらすと、我々は主張する
    - 更に、プロンプトエンジニアリングやバニラSFT手法によってこの問題を完全に解決するのは困難である
- しかしながら、Hallucinationの追加は、古代の偉人が人間の脳では完全に記憶できないすべての知識を活用する機会ともなり得、キャラクターのシミュラクラの将来的な研究において大きな可能性を示す

# Contribution Summary: 貢献を1行でまとめる
Shaoらは、プロンプトエンジニアリングだけでLLMに具体的な人物を模倣させるのは難しいという課題のため、経験再構築パイプラインによって得られるその人物の経験と、キャラクター幻覚を防ぐための保護的経験を用いた教師付きファインチューニングを行い、両者を組み合わせることにより比較的小規模なLLMでも商用の大規模LLMに匹敵するパフォーマンスを出せることがわかった。

# Unknown: 残った課題
## どんなことがまだ知られていないか，あるいは解決していないか？
- キャラクターのシミュラクラを評価するための標準的な指標やプロトコルが存在しないため、エージェントの評価は困難。さらに、個性を評価し、生成されたレスポンスがキャラクターと一致しているかどうかを評価するには、キャラクターを十分に理解する必要があるため、人間による評価は困難
- キャラクターのプロフィールは、ある人物の人生全体はおろか、一側面を表現するのにさえ不十分である。将来的には、伝記やインタビュー、歴史的なコメントなどの使用にも焦点を当てることができる
- 教師ありファインチューニングの結果は、事前学習データ分布、モデルアーキテクチャ、スケールなどのベースモデルに大きく影響される。将来的には、より強力で大規模なLLMをベースとした訓練可能なエージェントを研究することができる
- キャラクターに欠点があったり凶悪であったりする可能性があるため、生成された文章は不快なことがある。また、元になったキャラクターによっては、シミュラクラは人々を有害な活動をするように操るかもしれない。このような問題は、LLMが強力になるほど重大になる可能性がある