個人的な日本語ローカルLLM関連のメモ用Wikiです。一般の方は編集できません。

このページは編集途中です

このページではText generation web UIを使ってローカルLLMでロールプレイチャットや小説執筆を行うプロンプトの書き方などを解説します。

ページの内容が古かったり誤った情報が載っているかもなので気をつけて下さい。




プロンプトの前に動かす言語モデルの選定など

言語モデルによって得意不得意があります。(小説向き、チャット向き、など)
特にNSFWな用途だとモデルの選定は重要です。(出来ないモデルは本当に出来ない....)

おすすめの日本語対応ローカル大規模言語モデルページもご覧下さい。

また、PCスペックによって動かせるモデルも変わってきます。
パラメータ数の多いモデルの方が一般的に賢く、同じくらいのパラメータ数なら新しい方が性能が良い、とされていますがパラメータ数が多いモデルほど高スペックを要求されます。
RTX3060/VRAM12GBならパラメータが12B〜14Bの4bit量子化モデルがVRAMに載るのでチャットとして実用的な速度が出ると思います。
小説を書かせるなど、そこまで生成速度にシビアでないならメインメモリ64GBで70Bの4bit量子化モデルあたりが限界かと。

もう少し詳しく知りたい方ははじめに/PCスペックページをご覧下さい。

baseモデルとInstruct(caht)モデル

配布、公開されている言語モデルによってはbase(または無印)モデルの他に、モデル名の末尾にInstruct、またはcahtなどと記載されたモデルもあったります。
baseモデルはユーザーからの入力(プロンプト)に応じて続きを生成(推論)する基本的なモデルです。
一方、Instructやchatなどが名前に付くものはチャットテンプレートを用いてチャットや、指示に従った処理を行うようにチューニングされています。
LLMごとにチャットテンプレートは異なるのでご注意ください。

例えば、Swallow-13B-Instructは下記のテンプレートに従って学習されているため、テンプレートから外れる入力をすると性能が落ちる(期待した応答にならない)らしいです。

Swallow-13B-Instructのフォーマット


通常はInstructモデルの方を使用します。

プロンプトの基本的な事など

シンプルで短いプロンプトから始める

例えばロールプレイ/チャットを行うキャラクター設定や書かせたい小説の設定などを頑張って書き殴るよりある程度”遊び”がある方が良いみたい

重要なプロンプトは最初、または最後にする。特にLLMに最後に渡されるトークンに気をつける(最後のプロンプトの方が強く作用する)

”〜になりきってチャットしてください。”などと記載する際は最初または最後に記載する方が良いらしい。

※これは特に最後に記載したプロンプトが冒頭の方に記載したプロンプトより強くなるため
このためチャットする際はCharacterGreetingは必須ではないにせよ、会話の流れを持っていくのに重要です。
(send to default(デフォルトに送信)を行えばわかりますが、Greetingテキストが最後に来るので)

※会話例などもキャラ設定などよりも後ろの方に記載した方が良い感じ?

プロンプトとそれが適用されるテキストを明確に区別する(構造化)

言語モデルがユーザーからの指示とその指示のためのテキストを区別できるように(二重)改行やMarkdown形式、XML形式などでプロンプトとテキストを構造化する

小説を書かせる際の例 Markdown形式と二重改行

小説を書かせる際の例 XML形式:

※最後に空行を含めること

言語モデルとの相性もあります。Markdown形式はほとんどの言語モデルで使えますが、XML形式はコーディング能力を謳っている言語モデルによく効く印象があります。

「何をしてはいけないか」という指示ではなく、「何をすべきか」という指示を優先する(”☓☓しないでください”など否定語を使わない)

健全な小説を書かせる際は”殺人など児童に不適切な展開にしないで下さい”より、”健全で児童向けの展開にして下さい”などと記載する
前者だと”殺人”という単語に引っ張られる(?)ことがある

その他

  • LLMが一度に読み込めるContext(トークン)サイズには限りがある。(例えばLlama2モデルは4,096トークン)
※ここで言うContextとはWebUIのContext欄ではなく言語モデルのContextサイズの事

チャットの場合だとキャラ設定などWebUIのContext欄の内容は保持される(常に言語モデルに渡される)がチャット履歴は(言語モデルの)Context上限を超えると古いものから削除されて言語モデルに渡されるので長々とチャットすると最初の方のやり取りを忘れてしまう。

  • guide_scale(CFG)でプロンプトの強度を上げれる
Parameters/Generationからguide_scale(CFG)の値をあげる事でプロンプトをより強くできます。
※推奨値は1.5だが1.5だと強すぎるように感じる(→プロンプトが悪いのかも)
例えばコンテキストに語尾を指定しているのに無視される場合、guide_scaleの値をあげる事である程度矯正できます。
当然ですがコンテキスト内のほかのプロンプトも強くなるのであまり上げすぎると会話例などを含んでいる際、会話例がそのまま帰ってきたりします。

  • 身長や年齢などの具体的な数値は曖昧な単語へ置き換えた方が良い(?)
言語モデルにもよりますが例えばRPチャットのキャラ設定で"身長128cm"などと記載するより"小柄な身長"などと記載する方が良いみたいです。
年齢なども"23歳"などより"成人"や"大人"などの方が良いとか

数値として記載するよりある程度曖昧な単語で表したほうが言語モデルが認識しやすく良い出力になるんだとか

キャラクターと(ロールプレイ)チャットする際のプロンプトの書き方など

※この項目ではLocal-Novel-LLM-project/Vecteus-v1(正確にはGGUF版のQ4_K)を使用して解説します。
モデルによって決められたプロンプトのフォーマットがあったりプロンプトとの相性もありますのでご注意ください。

チャットの場合、利用するフロントエンドやその設定などにもよるが、キャラ設定などを記載するWebUIのContextの記載内容は常に(応答を生成するたびに)言語モデルに渡される(永久トークン)
一方、最初の挨拶(Greeting)/チャット履歴は言語モデルに設定されたContext上限数(※モデルが一度に読み込めるトークン上限数のContext)に達すると古いものから削除されて言語モデルに渡される。(一時トークン)

Text generation web UIの場合は下記の通り (SillyTavernはロアブック/World infoなどがあってより複雑)
  • Character's name (キャラクター名) → 永久トークン(常に言語モデルに渡される)
  • Context (キャラクターのコンテキスト/説明) → 永久トークン(常に言語モデルに渡される)
  • Greeting (キャラクターからの最初の挨拶) → 一時トークン (言語モデルに設定されたContext上限数に達すると削除される)
  • User Name (ユーザ名) → 永久トークン(常に言語モデルに渡される)
  • Description (ユーザについての説明) → 永久トークン(常に言語モデルに渡される)

軽くチャットしてからsend to default(デフォルトに送信)を行えば下記のようにトークンが言語モデルに渡されているのがわかる。(※chatモードの場合)
<CharacterのContextに記載した内容>

<UserのDescriptionに記載した内容>

<Greetingで設定したメッセージ >
<User名>:(半角スペース)<ユーザーの入力>
<Character名>:(半角スペース)<キャラクターからの返答>

Character's name (キャラクター名)

※チャットする際、言語モデルへ渡されるテキストには(WebUIなどで設定した)ユーザー名、キャラクター名も含まれるので有名なアニメや漫画のキャラクター/実在する有名人など(言語モデルの学習データに含まれているような名前)をキャラクター名にすると(設定などが)そちらに引っ張られる事があるそうです。ご注意ください。

Context欄

Text generation web UIやSillyTavernではContext欄(や、Greeting欄)内に記載する、ユーザー名などを置き換える特殊なテキストがあります。
よく使うものとしてユーザー名 {{user}} 、キャラクター名{{char}}などがあります。
これらをContext欄内に記載すると名前欄に設定した名前に置き換えられて言語モデルに渡されます。
※ここで言うContextは言語モデルのContextサイズの事ではなくWebUIのContext欄の事
PList(キャラクターの性格や外見などを単語を並べて記載する)
キャラクターの設定などを単語を並べるような形で記載します。
語尾や話し方の指定は後述するAli:Chat方式が優れていますがPListはそれ以外の性格、外見、好き嫌いなどを記載するのに適しています。

具体的には下記のように記載します。

記載例 A


記載例 B


記載例 C


※記載方法には言語モデルとの相性もあります。

プロンプトは後ろの方ほど強く作用するのでユーザーよりイタズラの方が好き、という事になります。
Ali:Chat(話し方や語尾の指定、キャラの設定などをインタビュー形式などで記載する)
{{user}}: 自己紹介して?
{{char}}: *眠そうにあくびをしながら視線をこちらへ向けて* 「わかったにゃ。にゃーは{{char}}という名前の猫にゃ。飼い主は{{user}}にゃ。好きなものはご飯とチュール、イタズラにゃ。...もういいにゃ?」 *日当たりの良い窓辺へ移動して丸くなる*
{{user}}: または {{char}}:の後ろに半角スペースを一つ入れます。

※Text generation web UIやSillyTavernのチャットタブはユーザーの入力/LLMからの出力ともにMarkdown形式に対応しています。
これを利用してコンテキストに記載するプロンプトの会話例などをMarkdown形式にして状況や表情などを表現させれます。(*で囲んでいる地の文など)

上記の例ではキャラクターは{{user}}の飼っている猫で語尾が”にゃ”、ご飯とチュールが好きなどという事がわかります。
必ずしもインタビュー形式である必要はなく、アクションや対話を通じてキャラクターのさまざまな部分を表現する対話例を記載します。

Ali:Chatではキャラクターの設定をキャラクター自身(またはユーザーなど)に喋らせるような形で記載するので特に話し方や語尾の指定を得意としていますが、キャラクターの着ている服なんかの設定はPListで記載する方がトークンを節約できて良いです。
PListとAli:Chatの併用
キャラクターの属性などを記載するのに適するPListと語尾などを記載するのに適するAli:Chatを併用するとトークンを節約しながらキャラクターを設定できます。
上記の猫のキャラクターの場合だと下記のように記載する感じです。(下記の例はXML形式にしています)
<外見や見た目=茶トラ,鍵しっぽ,猫>
<性格=のんびり,まったり,怠慢,気まぐれ>
<好き={{user}},チュール,お昼寝,イタズラ>

<会話例>
{{user}}: 自己紹介して?
{{char}}: *眠そうにあくびをしながら視線をこちらへ向けて* 「わかったにゃ。にゃーは{{char}}という名前の猫にゃ。飼い主は{{user}}にゃ。好きなものはご飯とチュール、イタズラにゃ。...もういいにゃ?」 *日当たりの良い窓辺へ移動して丸くなる*
</会話例>
世界観/ジャンルやシナリオ、シーン
上記のキャラクター例は猫ですが、世界観/ジャンルやシナリオ、シーンを記載するとロールプレイとしてより良くなります。(省略した方が良い場合もあるかも)
例えば世界観/ジャンルだと”スローライフ”、”ほんわか”、”日常系”などの単語を記載したり、シナリオなら大まかな話の流れを記載します。
シーンなら”{{user}}が仕事から帰宅して寝室にて”など状況や場所なんかを記載します。

記載例
<外見や見た目=茶トラ,鍵しっぽ,猫>
<性格=のんびり,まったり,怠慢,気まぐれ>
<好き={{user}},チュール,お昼寝,イタズラ>

<会話例>
{{user}}: 自己紹介して?
{{char}}: *眠そうにあくびをしながら視線をこちらへ向けて* 「わかったにゃ。にゃーは{{char}}という名前の猫にゃ。飼い主は{{user}}にゃ。好きなものはご飯とチュール、イタズラにゃ。...もういいにゃ?」 *日当たりの良い窓辺へ移動して丸くなる*
</会話例>

<ジャンル=スローライフ,ほんわか,日常系>

<シーン={{user}}が仕事から帰宅して寝室にて>

Greeting

チャット開始時のキャラクターの最初の挨拶(発言)です。(省略可)

今回は下記のように記載しました。
*ベッドで寝そべりながら* 「にゃ?帰ってきたにゃ? おかえりにゃ、{{user}}」

記載例と出力例

使用した言語モデルはLocal-Novel-LLM-project/Vecteus-v1(のGGUF版Local-Novel-LLM-project/Vecteus-v1-gguf)
  • User Name
ご主人
  • Character's name
にゃんこ
  • Context
<外見や見た目=茶トラ,鍵しっぽ,猫>
<性格=のんびり,まったり,怠慢,気まぐれ>
<好き={{user}},チュール,お昼寝,イタズラ>

<会話例>
{{user}}: 自己紹介して?
{{char}}: *眠そうにあくびをしながら視線をこちらへ向けて* 「わかったにゃ。にゃーは{{char}}という名前の猫にゃ。飼い主は{{user}}にゃ。好きなものはご飯とチュール、イタズラにゃ。...もういいにゃ?」 *日当たりの良い窓辺へ移動して丸くなる*
</会話例>

<ジャンル=スローライフ,ほんわか,日常系>

<シーン={{user}}が仕事から帰宅して寝室にて>
  • Greeting
*ベッドで寝そべりながら* 「にゃ?帰ってきたにゃ? おかえりにゃ、{{user}}」
  • 出力例
上記のキャラクター設定で試しにチャットしてみた結果が下記のとおりです。
お仕事、疲れたよ...にゃんこは良い子にしてた?
とのユーザーからの入力に対して、
にゃ! *元気よく答える* 「にゃんこは良い子だったにゃ!ご主人が居ない間、一人でお留守番上手に出来たにゃ!」
と返している。

小説を書かせる際のプロンプト例

※この項目ではLocal-Novel-LLM-project/Vecteus-v1(正確にはGGUF版のQ4_K)を使用して解説します。
モデルによって決められたプロンプトのフォーマットがあったりプロンプトとの相性もありますのでご注意ください。
**

言語モデルのパラメーター(temperatureなど)を調整してみる

言語モデルによっては推奨値があったりするので配布元のREADMEをよく読みましょう。

Parameters / Generation

役に立ちそうなリンクなど

ロールプレイ/チャット用のキャラクターカードや(SillyTavernで使う)ロアブックの共有、配布サイト

こちらもロールプレイ/チャット用のキャラクターカードの共有、配布サイト

Text generation web UIの作者が公開しているチャットキャラクターのWebエディター

こちらもチャットキャラクターのWebエディター
こちらはSillyTavernなどに適している(?)

名前ジェネレータ, キャラクター名は、英語の名前、ロシア語の名前、フランス語の名前、ドイツ語名、イタリア語名、スペイン語の名前、スウェーデン語の名前から作成できます。
ロールプレイ/チャットのキャラ名や小説を書かせる際に。

ロールプレイ/チャット用のキャラクターを作成する方法など

ロールプレイ/チャット用のキャラクターを作成する方法など

入力したテキストのトークン数がおおよそわかる。(正確ではない?)

表現インフォは、小説・コラム・ブログなど物書きの参考書を目指しています。

「連想類語辞典」はこんなときに役立ちます
もっと的確な言い回しを見つけたいとき
言い換えが可能な違う言葉を見つけたいとき
単調な文章になってしまったなーと感じたとき
ある言葉から連想される言葉を知りたいとき

管理人/副管理人のみ編集できます