VIMを効率的に設計および実行し、デバッグし、大規模な言語モデル(LLMS)プロンプトを保存するためのツールとして使用します。
prompter.vimは、VIMエディターを効率的な迅速なエンジニアリング環境に変換し、LLM専有プロバイダーのWebプレイグラウンドを効果的に置き換えます:Azure Openai Service PlaygroundやOpenai Playground。
バージョン0.2から、プラグインはLITELLMをLLMプロバイダーの抽象化レイヤーとして使用しています。
Litellmは、Bedrock、Azure、Openai、Cohere、Anthropic、Ollama、Sagemaker、Huggingface、Replicate(100+ llms)のOpenai形式を使用して、すべてのLLM APIを呼び出します。したがって、さまざまなLLMプロバイダーの膨大なリストでprompter.vimを使用できます!
<F9> (キーショートカット:PrompterSetup )<F12> (キーショートカット:PrompterGenerate )を押して、LLMの完了を取得するmyexperiment.promptなど)に保存します![]() |
|---|
| prompter.vim in Action:電話の会話をシミュレートするプロンプトを編集/対話します(以下のテクニックを「テキストプロンプトの一部としての対話」と説明します)) |
prompter.vimは主にコード完了ツールとして設計されていませんが、その目的のためにも使用できます。
代わりに、このプラグインは、自然言語のプロンプトをテストしてデバッグしたいプロンプトエンジニアを対象としたWebテキスト完了プレイグラウンドの汎用交換を目指しています。
このアイデアは、LLMのプロンプトを書いて、プロンプトエンジニアリング技術を実験している間、2023年春に登場しました。私は簡単な「テキスト完了」アプローチを使用していました。ここでは、テキストプロンプトコーパスを入力し、大規模な言語モデル(LLM)から完了をリクエストしていました。
私の最初のアプローチは、LLMプロバイダーが提供するWeb遊び場を利用することでした。しかし、特にAzure Openai Web Playgroundsと交流している間、私は多くの問題に遭遇しました。
私がまだ理解していない理由で、Azure Web PlaygroundのWebインタラクションは、特定のポイントの後にかなり遅くなります。完了ボックス内のバグが疑わしいです。さらに、「チャット完了」モードのAzure Webインターフェイスは好きではありません。完全な混乱!代わりに、オリジナルのOpenaiの遊び場はよりよく実装されており、前述の問題に遭遇しませんでした。
それにもかかわらず、両方のWebプレイグラウンドが言及しているため、ブラウザごとに1つのプロンプトのみが許可されています。したがって、複数のアクティブプロンプトを扱う場合(ネスト/チェーンテンプレートプロンプトで構成される複合アプリケーションの開発)、個別のタブで複数の遊び場を開いている必要があります。特定の(中間の)注目すべき結果を達成した場合、すべてのテキストボックスをコピーしてバージョンされたファイルに保存する必要があります。
Web Playgroundsでこれらすべてを引き受けることは、面倒でエラーが発生しやすいプロセスです。最後の考えは、VIMエディター内で直接完了を実行できる場合はどうなりますか?
textまたはchat完了?Openaiまたは同様の現在のLLMに予見される2つの一般的な「完了モード」があります。
textの完了
textとして設定された完了モードは、LLMが完了することを意味します。このようなモデル設定の例はtext-da-vinci-003 OpenAIモデルです。テキスト完了モードを使用するには、モデルは特定のAPIを介してそのモードをサポートする必要があります。
┌────────────────────────┐
┌─ │ │ ─┐
context │ │ bla bla bla │ │
window │ │ bla bla │ │
= │ │ bla bla bla bla │ │ prompt
prompt │ │ bla │ │
+ │ │ bla bla │ │
completion │ │ │ ─┘
│ └────────────────────────┘
│ |
│ LLM generation
│ |
│ v
│ ┌────────────────────────┐
│ │ │ ─┐
│ │ bla bla │ │
│ │ bla bla bla │ │ text completion
│ │ bla │ │
└─ │ │ ─┘
└────────────────────────┘
chatの完了
chatとして設定された完了モードは、LLMがチャット「役割」のために微調整されていることを意味します(ユーザーは、アシスタントと言う、...)。詳細は、これを読んでください。コンテキストウィンドウのプロンプトは、実際には製造されています
gpt3.5-turbo Openaiモデルです。チャット完了モードを使用するには、モデルはそのモード、トラフ特定のAPIをサポートする必要があります。 ┌────────────────────────┐
┌─ │ bla bla bla bla │ ─┐
│ │ bla bla bla │ │
│ │ bla bla │ │ system
│ │ bla bla bla bla │ │ prompt
context │ │ bla │ │
window │ │ bla bla │ ─┘
= │ └────────────────────────┘
system prompt │ ┌────────────────────────┐
+ │ │ user: blablabla │ ─┐
chat │ ├────────────────────────┤ │
+ │ │ assistant: bla bla bla │ │
completion │ ├────────────────────────┤ │ chat
│ │ user: bla bla bla │ │ prompt
│ ├────────────────────────┤ │
│ │ assistant: blabla bla │ │
│ ├────────────────────────┤ │
│ │ user: blabla bla │ ─┘
│ └────────────────────────┘
│ |
│ LLM generation
│ |
│ v
│ ┌────────────────────────┐
│ │ │ ─┐
└─ │ assistant: bla bla bla │ │ chat completion
│ │ ─┘
└────────────────────────┘
prompter.vimプラグインは、チャットの役割の合併症を避けて、テキスト完了高速プロトタイピングの遊び場として機能するように考えられています。
したがって、チャットモード(Openai GPT3.5-Turboなど)でのみ機能するモデルが舞台裏(Litellm text_completion()メソッドを介して)を使用している場合、エディターテキストコンテンツ(プロンプト)が「システム」ロールプロンプトとして挿入されます。参照:ディスカッション。
上記のように、チャットベースのモデルをテキストベースのモデルとして使用することは最適な使用法ではありませんが、単一のテキスト完了の遊び場を持つことのシンプルさとチャットロールの管理の複雑さとの妥協です。
このプラグインはPython3で作成されています。 VIMのインストールサポートPython3を確認してください。
vim --version | grep " +python3 " | awk ' {print $3} '私の場合、私は+python3を取得しました。それが主な前提条件です。
また、VIMがコンパイルされたPythonバージョンであることも確認してください。コマンドを使用して正確なPythonバージョンを抽出します。
vim --version | grep -o -P ' (?<=/python)[0-9]+.[0-9]+ '私の場合、私は3.8を得ました。
VIMは、Pythonバージョン(および関連するパッケージ)のみを使用できることに注意してください。たとえば、System Python Currentバージョン(
python3 --version==Python 3.11.6)がVim Pythonバージョンとは異なる場合、Python 3.8は、VimにPython 3.8パッケージのみが表示されることを忘れないでください。Python 3.11.6パッケージを使用するには、VIMを再コンパイルする必要があります。
Pythonパッケージlitellmをインストールします。対応するPythonバージョンのpipを使用してlitellmをインストールする必要があります。たとえば、 pip3.8 。
pip3.8 install -U litellm 希望するプラグインマネージャーを使用してプラグインをインストールします。たとえば、vim-plugプラグインマネージャーを使用して、 .vimrcファイルに挿入します。
Plug ' solyarisoftware/prompter.vim ' # PROVIDER DEPENDENT SETTINGS USING LiteLLM CONFIGURATION
# https://docs.litellm.ai/docs/providers
# https://docs.litellm.ai/docs/providers/azure
# LLM PROVIDER MANDATORY SETTINGS
export AZURE_API_VERSION=2023-09-01-preview
export AZURE_API_BASE= " https://XXXXXXXXXXXXXXX.openai.azure.com/ "
export AZURE_API_KEY= " YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY "
export MODEL= " azure/your_deployment-name "
# LLM PARAMETERS OPTIONAL SETTINGS
# translated OpenAI model parameters
# https://docs.litellm.ai/docs/completion/input#translated-openai-params
export TEMPERATURE=0.3
export MAX_TOKENS=3000
export OPENAI_STOP= " "良いアイデアは、上記のすべての変数を非表示のファイル( vi ~/.prompter_azure.vimに編集して保持し、 source ~/.prompter_azure.vimで実行することです。
VIMコマンドモード( :または関連キーでコマンドを実行できます。
| 指示 | 鍵 | アクション |
|---|---|---|
:PrompterSetup | <F9> | モデルのセットアップと初期構成 |
:PrompterGenerate | <F12> | LLMテキストの完了を実行します |
:PrompterInfo | <F10> | 現在の構成を報告します |
:PrompterSetupVIMに入ると、プロンプターの遊び場環境をアクティブにして、まずコマンドモードで実行します。
:PrompterSetup環境設定に続いて、成功した場合、コマンドプリントはモデル構成をラインにラインします。
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.7 max_tokens: 100
ステータスラインレポートの値の説明:
temperature preset value ───────────────────────────┐
│
max_tokens preset value ──────────┐ │
│ │
┌─────┐ ┌────────────┐ ┌────┐ ┌─┴─┐ ┌─┴─┐
Model:│azure│/│gpt-35-turbo│ completion mode:│chat│ temperature:│0.7│ max_tokens:│100│
└──┬──┘ └─────┬──────┘ └──┬─┘ └───┘ └───┘
│ │ │
│ │ └─ chat or text, depending on the model
│ │
│ └── name of the Azure deployment
│
└───────────── name of the LLM provider
:PrompterGenerateVIM Windowsでプロンプトを編集し、LLM完了を実行するために
:PrompterGenerateステータスラインはいくつかの統計を報告します:
Latency: 1480ms (1.5s) Tokens: 228 (prompt: 167 completion: 61) Throughput: 154 Words: 28 Chars: 176, Lines: 7
ステータスラインレポートの値の説明:
┌─ latency in milliseconds and seconds
│
│ ┌───────────────────────────────── total nr. of tokens
│ │
│ │ ┌──────────────────── nr. of tokens in prompt
│ │ │
│ │ │ ┌──── nr. of tokens in completion
│ │ │ │
┌─┴───────────┐ ┌─┴─┐ ┌─┴─┐ ┌─┴┐ ┌───┐ ┌──┐ ┌───┐ ┌─┐
Latency:│1480ms (1.5s)│Tokens:│228│(prompt:│167│completion:│61│) Throughput:│154│Words:│28│Chars:│176│ Lines:│7│
└─────────────┘ └───┘ └───┘ └──┘ └─┬─┘ └─┬┘ └─┬─┘ └┬┘
│ │ │ │
│ │ │ │
Latency / Tokens ───────────────────────┘ │ │ │
│ │ │
nr. of words ───────────┘ │ │
│ │
nr. of characters ─────────────────────┘ │
│
nr. of lines ────────────────────────────────┘
統計はこれらのメトリックを報告します:
| メトリック | 説明 | 例 |
|---|---|---|
| 遅延 | ミリ秒単位のボットと2番目の近似 | 1480ms (1.5s) |
| トークン | 総トークン量、迅速なサブテル、および完成亜光 | 228 |
| スループット | 完了トークン /レイテンシ比(秒単位)。スループットの概念についての議論をご覧ください | 154 |
| 言葉 | 完了時に生成された単語の数 | 28 |
| chars | 完了時の文字の数 | 176 |
| 線 | 完了時に生成された線の数 | 7 |
デフォルトでは、コマンドは関数キー
F12に割り当てられます。そのような方法で、単一のキーストロークF12を押すだけで完了を実行できます。
:PrompterInfo現在のプラグインバージョン、プラグインコマンドのリスト、現在のモデル設定を報告します。
:PrompterInfoコマンドプリントこれらの情報:
Version:
prompter.vim, by [email protected], version 0.2 (November 28, 2023)
Model:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.5 max_tokens: 1500
Commands:
PrompterGenerate <F12>
PrompterInfo <F10>
PrompterSetup <F9>
完了の背景と前景の色を取得して設定します:
echo g: prompter_completion_ctermbg
echo g: prompter_completion_ctermfg
let g: prompter_completion_ctermbg = 3
let g: prompter_completion_ctermfg = 0デフォルトのハイライト色が気に入らない場合は、Cermbg/Xterm 256色のサブセットを使用して
ctermbgとctermfg値を置き換えることができます。利用可能なすべての色を表示するには、コマンドを使用できます:HighlightColorsプラグインの一部:ハイライト。
温度値を変更します
let g: temperature = 0.2最大トークン値を変更します
let g: max_tokens = 2000
停止シーケンスを変更するには
let g: stop = [ ' x: ' , ' y: ' , ' z: ' ]コマンドは、このデフォルト設定で機能キーに関連付けられています。
let g: prompter_setup_keystroke = ' <F9> '
let g: prompter_info_keystroke = ' <F10> '
let g: prompter_generate_keystroke = ' <F12> '
let g: prompter_regenerate_keystroke = ' <F8> ' VIMで、優先順位のキーマッピングにコマンドを割り当てることができたとしても、例: map <F2> :PrompterGenerate<CR> :PrompterSetup 、特定のキーのマッピングを確認できます。たとえば、 F2 : map <F12>を使用できます。
(VIM-Included)スペルチェッカーを使用します
LLMプロンプトを書くときは、タイプミスを避けることが非常に重要です!あなたが動詞だけを間違えると、私は何度もそのLLMの完了を最悪の状態に経験しました。
複数の言語でプロンプトを書いている場合、物事は最悪になります。個人的には、私の記事以外の英語のプロンプトエンジニアリングのトレードオフで説明されている何らかの理由で、通常、私は英語で会話のプロンプトを書きますが、チャットプロンプトのターゲット言語は私の母国語:イタリア語です。すべてのプロンプトには、英語とイタリア語の両方にテキストが含まれています。この場合、この小さなvimscript関数を実行します。
function ! Spell ()
set spelllang = en_us,it
setlocal spell
echom " Spell check set for Italian and English languages "
endfunction
com ! SPELL call Spell ()以前の完了統計をすべて読んでください
messagesVIMは最後の完了統計情報を表示します。たとえば、3つの完了を実行するだけの場合:
Latency: 961ms (1.0s) Tokens: 616 (prompt: 577 completion: 39) Throughput: 641 Words: 21 Chars: 134
Latency: 368ms (0.4s) Tokens: 648 (prompt: 642 completion: 6) Throughput: 1761 Words: 2 Chars: 15
Latency: 4227ms (4.2s) Tokens: 775 (prompt: 660 completion: 115) Throughput: 183 Words: 60 Chars: 377, Lines: 5
ラインのソフトラップを有効にします
私は通常、フルスクリーンのVIM設定で作業しています。それは私が私の注意を最大化するのに役立ちます。それにもかかわらず、非常に長いラインを持っていること( PrompterGenerateの後)は読むのに役立ちません。
残念ながら、VIMでは、固定列の幅ソフトラップを構成するのは簡単ではありません。議論を参照してください。次のコマンドでセットソフトワープを設定できます。
set wrap linebreak nolist ダイアログプロンプトのプロトタイプに使用している手法は、ダイアログターンブロックを挿入することです。次の例のように、ダイアログブロックが「停止シーケンス」( a: :)で終了し、LLMをトリガーしてアシスタントロールを完了することです。
TASK
You (a:) are a customer care assistant and you are assisting a user (u:).
...
...
DIALOG
a: Hello! How can I assist you today?
u: I want to open a report.
a: Fantastic! First, could you provide me with a detailed description of the issue you're experiencing?
u: The computer monitor won't turn on.
a: Thank you for the description. What is the name or model of the product or system you're having trouble with?
u: I can't read the brand. It's the company's PC monitor.
a: Thank you for the information. What is your preferred method of contact?
u: via email at [email protected]
a: Thank you. Please confirm the provided email address: [email protected]
u: that's correct!
a:
上記の場合、LLMを設定するには、ユーザー入力を待機するSTOPを設定するには、停止シーケンスをu: with:with:
let g: stop = [ ' u: ' ]上記のように停止シーケンスを設定しない場合は、LLMが会話全体を完了しようとします。これは一般に、 u:に続いて文を書きたいので、必要ではありません。それにもかかわらず、LLMが会話の流れをどのように想像するかを確認するためにg:stop
便利な他のVIMコマンド:
u:キーF6を押すだけです: map <F6> :normal ou: <CR> a:で始まる新しい行を追加し、キーF7を押すだけです: map <F7> :normal oa: <CR> バージョン0.1
最初のリリース。 Openai/Azure Openaiモデルのみが、Openaiバージョン0.28 Pythonモジュールを介してサポートされています。
バージョン0.2
LLMSの完了は、LITELLM、LLMS抽象化レイヤーPythonパッケージを介して行われ、多数の異なるLLMプロバイダーを使用できます。
すべてのLLM入力パラメーターをサポートします
これまでのところ、prompter.vimはtemperature 、 max_tokensのみをサポートし、引数stop 。
Litellmは、すべてのプロバイダーにわたってOpenAIチャットの完了パラメーションを受け入れて翻訳します。
サポートテンプレートプロンプト
実行時に動的に構築できるさまざまな部品で構成される「テンプレートプロンプト」を設計しています。たとえば、プレースホルダー変数を含む「テンプレートプロンプト」をプロトタイプしたいと考えてください。
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
上記の例では、Webプレイグラウンドを使用する場合、コピーペーストの仲介者として機能します。 4つのWebタブを開き、それぞれでテキストの完成を実行し、最後に{some_data} 、 {dialog_history}などの変数を置き換えるように、完全に完了を手動で貼り付ける必要があります。さらに、 {some_yaml}などのファイルを変数にロードする必要がある場合があります。
アイデアは、テンプレートのプロンプトをサポートすることで、他のバッファー/ウィンドウのコンテンツを含む、変数プレースホルダーを(キーストローク)に置き換えることができます。
非同期LLM完了
現在、LLM完了コマンドPrompterGenerate同期コマンドです。LLMAPIが完了テキストを返すまで、エディターはブロックされます。完了するのに多くの秒を必要とする非常に複雑で長いプロンプトに対して退屈かもしれません(例:>> 10)。この場合、コマンドが非同期である可能性があり、開発者が完了時にVIMエディターを使用できるようにすることができます。
ストリーミングサポート
これまでのところ、ストリーミングの完了は考慮されていません。
David Shapiroは、LLMと生成AIに関する彼の巨大な普及作業について。私は熱意を持って続きました。
Vivian de Smedt Vimの専門家は、このプラグインを開発する際に遭遇する問題を解決する彼の助けを求めています。
テキスト完了形式として、いくつかの提案された機能を統合したLitellm Creators!
このプロジェクトは、進行中の進行中の概念のALFAバージョンです!
私はvimscriptの専門家ではないので、貢献や提案は歓迎されます。提案と問題については、githubの問題については、バグ、提案などについてはこちらをお問い合わせください。メール([email protected])でお問い合わせください。
プロジェクトが気に入ったら、このリポジトリを驚かせてサポートを示してください!
Copyright (c) 2023 Giorgio Robino
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
トップ