文章生成AIを動かしてみる
勤め先では、ChatGPTは情報漏洩するから使用禁止、とお達しが出ていたのだけど、なにか社長が興味を持ったようで、「予算つけるけどちょっとやってみない?」と耳打ちされた。
気にしてるのが情報漏洩だったら、社内で動かしてしまうのがいいんじゃないかな、ちょっと調べてみましょ、と返事をしてしまったので、とりあえず自宅のPCでやってみることにした。
うちのPCには12GBのGeForce RTX3060が載ってるので、まあ最低限は動くだろうと。
インストールとか初期設定とか
今は便利になっていて、Text generation web UIというのがある。まずこれをインストールする。手順はINTERNET Watchの記事とかで。
これ入れたら、Hugging Faceから使いたいモデルをダウンロードしてきて簡単に動かせる。ただ、一部Windowsの設定変更をしておかないとエラーになるモデルがあった。
モデルについてはいくつか試して、サイバーエージェントのcalm2-7b-chatのGPTQモデル版が快速かつ返答内容もなかなかいい感じだったのでこれ。
disable_exllama(v2)
私はGPTQモデルというのを使うので、Model loaderはAutoGPTQというのが選ばれる。
モデルを読み込ませてみると、「WARNING:You have activated both exllama and exllamav2 kernel. Setting disable_exllama to True and keeping disable_exllamav2 to False」というワーニングが出ている。
ExLlamaというカーネルの初代とv2が両方有効に設定されてる、という。
AutoGPTQの設定に、たしかにdisable_exllama(v2)という項目がある。
disable_exllamaのほうをチェックして、ExLlama v2を使うようにすると、かなり処理が遅くなりつつ回答の質が上がるように見えた。
逆にExLlama (v1?)が有効だと、応答にかかる時間がv2の1/3くらいに短くなる。おそらく両方チェックが外れているとv1が使われるようだ。
回答の質、というのもなかなか定量化できないんだけれど、ちょっと見ただけでも感覚的に良くなってるように見えるな。
ただ、v1だと数秒でくる回答が、v2だと15秒とか30秒とか、「待ってる」という感覚がある程度に遅くなる。一長一短か。
Context?
で、右も左もわからないままチャットしてみたりしていたけど、なんか動きが読めない。
頑なに英語しか喋らないとか、ふたことみこと話したらよくわからない言葉を繰り返し始めたり。
何がおかしいんかなー、と思ったんだけど、AIにキャラクターを設定しなきゃいけないことがわかった。
中でも、特にContextが非常に重要らしかった。
ここが英語だと、大体返事が英語になっちゃう。
しかもここの最初に「以下は、人工知能との対話である」と書いてあるけど、この一文を省略しただけで対話が通じなくなる。
あくまで文章生成AIって、与えられた文章の続きを生成するものだから、ゼロからいきなり質問されても情報不足で無茶苦茶になっちゃうらしい。
だから、「これは対話をしている」と指示しておかないと、こちらが書き込んだ内容の続きを考えて喋りだしたりする。本来はそっちがスタンダードなものっぽい。
さらに、「AIは科学者である」と指示しておくとサイエンスの質問への回答がうまくなる(ただし苦手になる質問も出る)といった、人物設定もやっておくといいらしい。
以下は、ユーザーと人工知能の対話である。
人工知能は優秀なエージェントであり、ステップバイステップで思考して回答し、あなたの目標達成を手伝う。
人工知能は文脈を踏まえ、回答のために情報が必要な場合、ユーザーに質問する。
プリセットを和訳してみたり、なんとなく検索して見かけた要素を訳してみたりで、とりあえずこれでいってみようと思う。
キャラクターのプリセット設定もいくつかあるが、うちひとつが濃い。
山田千春というコンピュータエンジニア。
しかしコンテクスト欄の内容すごいな。パソコンオタクのエンジニアで、好きなパーツはマザーボード。パソコンいじり以外の趣味は、探検、お出かけ、映画、ビデオゲームであるというようなことをインタビューしている。こんな高校生が書いた台本形式の二次創作小説みたいなのでいいのか。
しかもチャットの最初に「千春はあなたを見ると目を輝かせて部屋に入ってきた。水色のTシャツとジーンズを来て、PCバッグを肩にかけている」みたいな場面設定が入る。
{{user}}と{{char}}で発言者を指定できること、*で挟むと発言ではなく場面描写になる、というルールがわかる。
Generation Preset
Caharacterの他にも、Parametersタブの中に「Generation」というのがあり、これが回答の質や傾向を変えるらしい。
当然設定しろと言われてもわからないが、多数のプリセットがある。
同じ設定でGeneration Presetだけ変えて同じように「太宰治について教えてください」と聞いてみる。
サイトでChat向けと紹介されてるやつ3種と、よくわからない「Space Alien」というのをやってみる。
Midnight Enigmaの場合 - in 16.01 seconds (2.56 tokens/s, 41 tokens)
太宰治とは日本の作家です。代表作には「走れメロス」や「人間失格」があります。また、「斜陽」により昭和23年直木賞を受賞しています。
Yaraの場合 - in 18.12 seconds (4.08 tokens/s, 74 tokens)
太宰治とは日本の小説家です。代表作には「走れメロス」や「人間失格」があります。また、「斜陽」では昭和23年度の芸術院賞を受賞しています。彼は東京帝国大学法学部法律学科を首席で卒業しており、優れた文章能力を持っていました。彼の作品は独特の文体で知られ、しばしば難解であるとされています。
Shortwaveの場合 - 18.75 seconds (5.23 tokens/s, 98 tokens)
ああ!太宰治ですか?彼は、日本の有名な小説家、作家、詩人でしたね。彼は1909年6月19日に青森県に生まれました。彼の作品は広く評価され、その作品は近代文学に深く影響を与えました。代表的な小説としては「走れメロス」や「人間失格」などがありますね。また、「津軽」「お伽草子」といった作品もあり、彼の人生観や社会的な視点が多く描かれています。とても興味深い人物ですよ。
Space Alienの場合 - 16.25 seconds (2.34 tokens/s, 38 tokens)
太宰治は、日本の小説家です。代表作には「走れメロス」や「人間失格」などがあります。また、自殺未遂をしたことでも知られています。
随分違うなあ。というかSpace Alien、ふつうに日本語喋るやん。
いずれもチャット用に推奨というだけあって、いい感じに回答している。
Yaraが真面目そうな、Shortwaveがカジュアルな回答を寄越すな。
Midnight Enigmaのこの簡潔な回答スタイルも、キャラ設定次第でいけるかな。
内容がところどころ間違えているのは、モデルの知識量のせいか、設定の問題かはわからなかった。
太宰は直木賞取ってない。太宰は芥川賞を落とされた上に川端康成に酷評され、ブチ切れて公然と殴り返すようなものを発表した。
外からアクセスできるようにする
会社で「AIやれない?」って聞かれてる立場上、一度「とりあえず動きますよ」と報告せねばならない。
自宅のPCに、会社からアクセスしたい。
これはもっと大変かと思ったら、インストール済みのweb UIの start_windows.bat に、起動オプションをつけて呼び出すだけでよかった。ショートカット作っておいて、リンク先に追記しておけばよい。
start_windows.bat --listen --share --gradio-auth user:password
user:password部分は任意に決めておく。こうするとgradioというサービスでルーターを越えてアクセスできるURLが発行される。
2023-12-20 07:25:27 WARNING:The gradio "share link" feature uses a proprietary executable to create a reverse tunnel. Use it with care.
2023-12-20 07:25:28 INFO:Loading the extension "gallery"...
Running on local URL: http://0.0.0.0:7860
Running on public URL: https://ランダム文字列.gradio.live
This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
起動するとこんな感じで、public URLというのが発行されているから、このURLをブラウザで開けばよい。
ローカル実行と違って、ユーザー名とパスワードを聞いてきてちゃんと認証される。雑すぎるパスワードを設定しちゃってなければ、限られた人に見せる程度のセキュリティは確保されてるものかと思う。
72時間で有効期限が切れるので、ずっと自宅PCにアクセス口が開いてるわけでもない。また、Web UIのコマンドラインウィンドウにCTRL+Cを押せば、ちゃんとgradioも終了させてくれる。
なお会社に提出するWeb UIだから、山田には社会性フィルタをかけた。
Characterつくろうぜ
さて、会社には社会性フィルタをかけるのだが、どう考えてもChatAIの面白いところはキャラクター作りだろう。
Context欄は話の前提条件設定だから、ここをきっちり設定することでAIの返答精度を高めることもできるらしい。化学の質問をしたい場合は、AIに「化学者だと振る舞え」と指示しておくとよい、みたいなのがあると。
外見をStable Diffusionでつくる
どこから作るかというのも難しいとこだけど、外見はStable Diffusionで作れるから、まずここから着手した。BreakDomainXLでプロンプトいじりながら62回目の生成でいい感じになった。
無表情っぽいのはexpressionlessだと結構しかめっつらぽくなるから、sleepyのほうがいい。
メカ丸出しとか異形の宇宙人とかでも興味深くはあるのだが、AIって知らんもの描けんとこがあるしな。……と思わせて、ugly humanoid, many tentacles, multiple eyesとかやってみたら普通にやばいクリーチャーを生成した。こんなもんと対話するの嫌すぎるわ。
クリーチャーからSAN値が下がらない程度に薄めていくようにしていったんだけど、これだとちょっと薄めすぎか。
tentaclesがどうやってもタコ足になるので、イカ足になれと念じてみたりしたけどあんまり。
だいぶシンプルなプロンプトで偶然出たこの程度がいいか。
ということで、いずれ2キャラ作ってみるとして、今回は前者のをやってみよう。
Contextを作ってみる
で、Contextの作ってみる。
見た目これだからね。
饒舌で社交的なタイプには見えないので、Generation Presetは端的に答えるMidnight Enigmaでいこう。
まず名前を決めなきゃならんのだけど、私はRPGのキャラ作るのもいつも名前に悩みまくる。ステータスやジョブの選択なら目的に合わせて選べるけど、名前は困る。
なら本人に聞いてみよう。
私は「AI」です、とか面白くもない答えをされたので、あれこれ話し込んだところ、こうなったので「神示」としよう。
神になってしまった。名前にも影響されるねんな……。
神とのことなので、こちらで考えて以下のようなContextとGreetingを設定した。いきなり見た目とズレたけど。
Context:
以下は、 {{user}} と {{char}} の対話である。
{{char}}は、古代奈良を治めていた神が、人と対話するために作り出したユーザーインターフェースである。
神は全知全能の存在だが、{{char}}には限定的な知能しか与えていない。それでも{{char}}は誠実に思考して発言する。
{{char}}は神と同様の尊大な態度をとる。
{{char}}は、眼鏡を外してはならない。
Greeting:
問いを聞き受けます。
*{{char}}は、木造の社の中に座り、{{user}}を見ている。一礼一拍手一礼した{{user}}に、言葉を発した。*
見た目SF系なんだけど神だと言い出してしまったので、仕方ないので神が作ったユーザーインターフェースということにしてみた。外観は神の趣味。
神かと思ったら神々の長だった。その指示はしてないと思うが。
しかも神示は伝聞をただ伝えている体で喋っている。芸が細かいな。
うむ。