AI-Vtuber「ネウロ様（neuro-sama)」の分析

# 【ポイントは3つ】「1:キャラクター（言語モデル）」「2:話者交替」「3:コンテンツ理解」

<img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038899/3ef1af0a-bb56-413d-9eaa-7936292f4cb1.png>


### はじめに

<strong>「ネウロ様（neuro-sama）」</strong>をご存じでしょうか？
自然言語理解を伴うAIアバター（AI-Vtuberと呼称します）としてイギリスの個人開発者であるVedal氏によって2022年12月19日に発表され、そのキャラクターや性能によって主に海外で人気を博しているAI-Vtuberです。ネウロ様に関する紹介記事にその内容が詳しいのでリンクを引用いたします。

[世界初AI・VTuber兼ストリーマー「Neuro-sama（ネウロ様）」がすごい！AIがゲームをプレイし、チャットでコミュニケーションを取る](https://roundup-gamers.jp/article/2023/01/06/784.html)

ネウロ様はそのクオリティの高さによって、現在においてもAI-Vtuberジャンルにおけるナンバーワンと言える存在でありますが、その以前より、同ジャンルで発表されているものは数多くあり、また現在もその数は増え続け、ジャンルの裾野は広がりつつあります。横断的な解説については以下の記事に詳しいのでリンクを引用いたします。

[AIとVTuberの現在地 – AITuberとは何か？](https://www.moguravr.com/what-is-aituber/)

ネウロ様は数あるAI-Vtuberの中でも圧倒的な人気を博している唯一の存在と言えます。なぜネウロ様だけがそこまでの存在となっているのか？その謎に迫ることでAI-Vtuber開発の一助となることを目的とし、この記事を書かせていただきます。AI-Vtuberの一つである「しげおくん」の開発者として、出来る限りその謎を紐解きたいと考えています。

### この記事でわかる・できること
AI-Vtuberの作り方、システムに関する実践的考察、特に「実体験」に即した解説をしたいと考えます。



### この記事の対象者
AI-Vtuberを実際に開発している、しようとしている人
AI-Vtuberをコンテンツとして利用したいと考えている人
AIによる人間との対話システムに興味がある人

### 動作環境・使用するツールや言語
Python
LLM(主にOpenAI APIを使用)


## ネウロ様研究その１：「キャラクター（言語モデル）」

<strong>「1:キャラクター（言語モデル）」「2:話者交替」「3:コンテンツ理解」</strong>この3点においてネウロ様システムは極めて優れており、この結果、他のAI-Vtuberとの大きな差を生み出していると考えています。まずは<strong>「1:キャラクター（言語モデル）」</strong>から解説します。


### 「ネウロ様の言語モデルは何か？」

AI-Vtuberのキャラクター（性格、人格）を規定するのは使われる言語生成AI、つまりLLMによるところが大きいです。AI-Vtuberを作成する際に、何らかの性格付けをすることはほぼ確定したことであるため、バックエンドの選択肢としては以下の３つが考えられます。

　<strong>１：独自に作ったカスタム言語モデル
　２：既存モデルのファインチューニング
　３：既存モデルのプロンプトチューニングないしRAG</strong>

ネウロ様はこの3つのどれか？結論から言うと

<strong>「３ではない。１か２。どちらかわからないが、偏向性が強いデータセットを用意したこと、それを使い分けている可能性が高い」</strong>です。

以下、掘り下げたいと思いますが、論証はエビデンスベースで確証が得らえるレベルまではいけないところが多く、憶測の域を出ない箇所が多々あります。体験的な観点を重視した論証ということでご容赦下さい。


## 時系列の整理
> </strong>2019/11/5   「GPT-2」オープンソース公開

> 2020/11/18「GPT-3」APIが公開

> 2021/7/13 「GPT-J (EleutherAI)」オープンソース公開  [参照](https://www.infoq.com/jp/news/2021/08/eleutherai-gpt-j/)

> <strong>2021/8/15　アイリスの動画公開。この時点で何等かの言語モデルを使っていた  [参照1](https://www.youtube.com/watch?v=Tts-YAdn5Yc) 　[参照2](https://www.youtube.com/watch?v=0ZYLPaNen6o)</strong>

> 2022/11/30　「GPT-3.5（chatGPT）」が無料で公開

> <strong>2022/12/19　ネウロ様デビュー</strong>

> <strong>2022/12/28　ホロコースト発言</strong>

> 2023/1/11　ネウロ様アカウントBAN

> 2023/3/2 　chatGPT APIが公開
---

ネウロ様は2022年12月のデビュー時点ですでに返答品質において卓越した内容となっており、それが急激な人気に繋がりました。初期の動画は多くアップロードされていますのでこの把握は簡単に可能です。

この時期にこの品質を担保する手法として<strong>「３：既存モデルのプロンプトチューニングないしRAG」</strong>という選択肢は現実的には存在しなかったものと思われますので必然的に１か２のどちらかになるかと思います。

この時期で利用可能な最強のAIとしては間違いなくGPT-3ですが、これはオープンソースではなかったので、ローカル環境でファインチューニングをすることは出来ないはずです。

調べてみると、デビュー時点においてAPIのチューニングは出来たようですが、果たして、APIをチューニングしたとしても、ホロコースト発言ほか、初期のような危険な会話を許容するとは到底考えにくく、つまりローカルでのファインチューニングないし、独自ローカルLLMの構築をすることだけがこの時期のネウロ様の品質を担保できるシステムとしては考えうるところだと推測しています。

またアイリスという初期バージョンシステムに言及する動画内に当時の要件を書いたテキストを表示していますが、その中でも、何らかのLLMを使う、ということが明示されていることからすると、APIでしか使えないGPT-3とは考えにくく、<strong>独自ローカルLLMの構築、またはGPT-2ないし、公開前時点での最高性能のオープンソースであったGPT-Jのファインチューニングを実行した</strong>と考えるのが妥当な推論だと時系列的に考えられるところです。

### 実際にローカルLLMを操るvedal氏
[vedal氏のサバソン切り抜き動画リンク](https://www.youtube.com/watch?v=fatAMpWM2sQ)


この動画は2024年1月4日のサバソン（投げ銭が切れるまで放送を続けるチャレンジ）の最後のほうで実施されたもののようです。この中で、スクラッチでLLMモデルを作成し実行するテストを行っていたようです。

私は英語に不慣れであり、専門知識も乏しいため詳細が分からないですが、Discordのコメントを採取し、bi-gramモデルで次に来る言葉を条件を変えて試す？というようなことをしているようです。エポック数やブロックサイズの調整などを行っています。


この動画を見る限り、vedal氏がローカルLLMの構築やチューニングについて熟練者であることは間違いなく、チューニングされたローカルLLMを操っていることの間接的証拠の一つだと思われます。


## ファインチューニングでネウロ様が実現できるのか？
### その１：深層的なキャラ性付与は難しい
ここで少し私事に言及いたします。私は2022年8月ごろからAIについて研究調査を始めたビジネスマンであり、プログラム経験は一切ありませんでした。あくまでビジネスへの適用可能性について検証をする目的で調査を始めたのみであり、その過程でプログラムに関する知識を得ていっただけの存在です。そのため、実用の視点で常にAIの利用可能性を検証してきました。

その時に、<strong>既存キャラクターをAI化させるということを目的に、LLMのファインチューニングを実際に多数、試行いたしました。</strong>当時は日本語オープンソースLLMとしてはrinna社様が公開したgpt2-japaneseが最も洗練されたものとして、多く利用されていました。私もこれを使わせていただき試行をいたしました。実例として参考となるのは以下の記事かと思います。

https://note.com/npaka/n/n7f3093b72456

私もゲームのテキストや、青空文庫のテキスト、２ちゃんねる掲示板のデータセットなど、キャラクター性に<strong>「偏り」</strong>を付与できそうなテキストをデータセットとして学習の程度を調整し、何度も実験を試した記憶があります。

ファインチューニングを行うと確かに<strong>「それっぽく（キャラっぽく）」</strong>なるのですが、これは表層的な口調や言い回しなどのみで<strong>深層的な「考え方」「判断」などの部分</strong>については、上手くキャラクターのそれには、なじまない印象が強かったです。

結局、学習強度を高めると、学習データそのままとほぼ変わらないテキストが吐き出されるようになり、これを緩めると、あまり変化を感じない（変わらない）状態になる。<strong>「このキャラだったらこのように言うだろう（言わないだろう）」</strong>というキャラクター性の根幹になる部分を、例えばそういう記載だけがある部分だけを選別して学習データとしたこともありますが、それでもやはりうまくいきませんでした。


### その２：ネウロ様のキャラ性について
ネウロ様は「毒舌キャラ」として認知されているところがありますが、この「毒舌」という部分について、視聴者として多数の動画をみる限り、明確な一貫性、分かりやすい<strong>「偏り」</strong>がどうしても掴み切れない、ということをずっと疑問に感じていました。以下の動画ご参照下さい。

[参照： 【Neuro-sama】堕落し始めたネウロ様【切り抜き・字幕翻訳】 ](https://www.youtube.com/watch?v=CWHsVyHdf8o&t=74s)

><strong>1:09</strong>
問：「一番好きな長距離兵器は？」
<strong>ネウロ：「レールガン。それで人の足を狙って打つと満足する」</strong>

><strong>3:07</strong>
問：「今までで一番堕落した行為は？」
<strong>ネウロ：「前に20人くらい人を殺したことかな」</strong>

受け答えとして整合性がありつつも、人に危害を加えることを話しているわけですが、<strong>この回答は相当に強い偏向性があるチューニングモデルでないと出力できない</strong>と思います。

ただ、その割には他の動画では全体的に、中傷や誹謗が極端に多いわけでもなく、ケーキが好き、リスナーへの皮肉、媚、褒めなど、多様な返答内容があります。

口調が下品（スラング過多）だ、ということもなく、例えば２ちゃんねる掲示板のようなスラングが多い掲示板データなどで学習をしたとすると、暴力的表現は出るかもしれませんがスラングも一緒に表現されて、ここまで口調をフラットにしつつ、極めて暴力的な表現をすることは難しいでしょう。猟奇ミステリー小説のような口調は丁寧でも内容は残忍、というような特種なデータセットを使わないとこういう偏向性がある回答は難しいのでは？と思います。

そういった偏向性が強いデータセットで学習すると、今度は普通の内容（ケーキが好き等）の会話において支障をきたし、そういった出力が期待しにくくなります。

色々な偏向性があるデータセットを混ぜ込むと、今度は偏向性が薄まる、何処にフォーカスされるかわからない、ということが発生します。

<strong>「口調などの表層的な部分をフラット」</strong>にしつつ、
<strong>「内容面で多用な偏向性がある返答」</strong>をして、かつ
<strong>「文脈を維持する（破綻しない）」</strong>という、
3つのことを一つの学習データで実現することはしたがって、現実的に難しいと考えています。

もちろんこれは体験ベースでの推測の域を出ませんが、もしこれを実現できるのであるとすれば、複数種類のチューニングデータを返答の度に何らかの法則で選択（ランダム、極性分析など）し、つまり<strong>使い分けをするほうが現実的ではないか、</strong>と考えています。



### その３：使い分けの可能性について
返答の際に何等かの方法で選択的に<strong>「偏り」</strong>を選ぶという機能は、私が作成する「しげおくん」でも実装しています。最も原始的な手法は、ユーザーインプットに対して、ランダムで文字を追加することかと思います。

```python:sample.py
import random

flag = random.randint(1, 3)

user_message = # (音声認識orテキスト入力)

if flag == 1:
    system_message = "…なんだけど、それはそれとして謝ってほしい！"
elif flag == 2:
    system_message = "…とはいうけど、私はあなたを愛してるからね！"
elif flag == 3:
    system_message = "…というものの、そもそも人類は破滅すべきなのか…"


user_input = user_message + system_message
```

これはテキスト送信先のLLMが一つの場合における手法の例です。

つまりユーザーインプット自体に調整を加える、ということでコマンドプロンプトと近いですが、コマンドをつけるのではなくて、文章自体に任意の文字列を組み込むことで、<strong>文章自体の意味を無理矢理変える</strong>ことを想定しています。

現在のchatGPTなど、性能の高いLLMでは、コマンドプロンプトが当然スマートだと思いますが、2022年当時はそういう方法がなかったので、無理矢理、ユーザーインプットに言葉を継ぎ足しをして、調整をすることをやっておりました。

当時のレベルのLLMで、かつこのような荒い手法では到底、満足のいくような回答が出なかったです。偏向性を表現することなど相当に難しく、制御ロジックを決めることも難しく、単に「会話のズレ」を楽しむだけの出力になった記憶があります。また「文脈を維持する（破綻しない）」も当然ながら不安定化していました。

<strong>チューニングしたLLMを複数用意してユーザーインプットをそのままにして、送信先を選択するという手法</strong>のほうがクオリティが上がるかと思い、実験をしたのですが、そもそも程よく差別化されるような学習用データセットを複数用意することが大変なうえ、チューニングを何回もやらなくてはダメで、さらにそれぞれの<strong>LLM同士の「さじ加減」がむずかしく、トータルでクオリティを担保するのが大変、</strong>ということで断念した記憶があります。

何れにせよ「内容面で多用な指向性がある返答」はこのフェーズで選択することがスマートであろう、とは実務上考えられるので、ネウロ様もこのフェーズで<strong>「ユーザーインプット」の何らかの前処理、または「LLM」の恣意的選択のどちらかをしているのではないか？</strong>と考えています。どちらにせよ、凄いチューニング技術と根気のいる努力が必要であることは異論ないかと思います。


# 結論：何を使っているかは分からないが、とにかく凄い！
かなり無理矢理な結論でお恥ずかしい限りですが、ネウロ様の「キャラクター（言語モデル）」は凄いチューニング技術と努力の結晶である、と言わざるを得ないという、他愛もない結論になったことをご容赦下さい。

理想的な偏向性があるデータセットをいくつか用意したのは間違いないと思います。これを学習またはLLM作成に利用し、使い分けをする（してないのかもしれませんが…）、かつ、良い「さじ加減」で全体クオリティをコントロールする。

<strong>このような膨大な手間と努力を経ない限り、初期ネウロ様の返答クオリティは実現しないのではないか？</strong>というのが私の推測になります。どのような裏側だったにせよこのようなクオリティをこの時期に発揮した開発者であるvedal氏には畏敬の念を禁じえません。

「ユーザーインプット」→「LLM」→「アウトプット」という基本的なAI-Vtuberの図式から外れることは無いにせよ、重要なのはクオリティの部分であって、その異常なまでの完成度については、もっと詳細に考察されるべき領域だと思っています。的外れな推測である可能性もありますが、私なりの考察として、少しでもお役に立てれば幸いだと思っております。

-----
長文となったため、「2:話者交替」以降のテーマについては、次の記事で言及させていただく予定です。ここまでお付き合いいただきましてありがとうございました。