Verwenden Sie VIM als Werkzeug zum effizienten Design und Ausführen, debuggen und speichern Sie Ihre LLMS -Aufforderungen (Language Models).
PromPter.VIM verwandelt den VIM -Editor in eine effiziente Umgebung mit promptem Engineering und ersetzt effektiv LLM Proprietary Provider -Web -Spielplätze wie: Azure OpenAI Service Playground oder OpenAI -Spielplatz.
Aus Version 0.2 verwendet das Plugin LitellM als LLM -Anbieterabtraktionsschicht.
Litellm ruft alle LLM -APIs mit dem OpenAI -Format an: Grundgestein, Azure, Openai, Cohere, Anthropic, Ollama, Sagemaker, Huggingface, Replicate (100+ LLMs). Sie können sOprPter.vim mit einer riesigen Liste verschiedener LLM -Anbieter verwenden!
<F9> (Schlüsselverknüpfung für :PrompterSetup )<F12> (Schlüsselverknüpfung für :PrompterGenerate ), um die LLM -Fertigstellung zu erhaltenmyexperiment.prompt ) ![]() |
|---|
| PromPter.vim in Aktion: Bearbeiten/Interaktion mit einer Eingabeaufforderung, die eine Telefonkonversation simuliert (mit einer Technik, die unten als "Dialoge als Teil der Textaufforderung" bezeichnet wird)) |
PromPter.vim ist nicht in erster Linie als Code -Completion -Tool konzipiert, obwohl Sie es auch für diesen Zweck verwenden können.
Stattdessen zielt dieses Plugin darauf ab, ein allgemeiner Ersatz für Webtext-Spielplätze zu sein, die für schnelle Ingenieure bestimmt sind, die natürliche Sprachaufforderungen testen und debuggen.
Die Idee trat im Frühjahr 2023 auf, als ich LLM -Aufforderungen schrieb und mit schnellen technischen Techniken experimentierte. Ich habe einen einfachen Ansatz "Texte Completion" verwendet, bei dem Sie Ihren Text -Eingabeaufforderung -Korpus eingeben und eine Fertigstellung von einem großen Sprachmodell (LLM) anfordern.
Mein erster Ansatz war es, die von LLM -Anbietern angebotenen Webspielplätze zu nutzen. Ich habe jedoch zahlreiche Probleme gestoßen, insbesondere als ich mit Azure OpenAI -Webspielplätzen interagierte.
Aus Gründen, die ich noch nicht verstehe, verlangsamt sich die Web -Interaktion auf dem Azure -Webspielplatz nach einem bestimmten Punkt erheblich. Ich vermute einen Fehler in den Fertigstellungsboxen. Darüber hinaus mag ich die Azure -Weboberfläche für den Modus "CHAT Completion" nicht. Ein totales Durcheinander! Stattdessen ist der ursprüngliche OpenAI -Spielplatz besser implementiert, und ich habe die oben genannten Probleme nicht begegnet.
Dennoch erlauben beide, die beide Web -Spielplätze erwähnt haben, nur eine Eingabeaufforderung pro Browser -Registerkarte. Daher müssen Sie beim Umgang mit mehreren aktiven Eingabeaufforderungen (Entwicklung einer zusammengesetzten Anwendung, die aus verschachtelten/geketteten Vorlagenanforderungen erfasst), mehrere Spielplätze in unterschiedlichen Registerkarten geöffnet halten. Wenn Sie bestimmte (mittlere) bemerkenswerte Ergebnisse erzielen, müssen Sie alle Textfelder kopieren und in Versionsdateien speichern.
All dies mit Web-Spielplätzen durchzuführen ist ein umständlicher und fehleranfälliger Prozess. Der letzte Gedanke war: Was wäre, wenn ich meine Fertigstellung direkt in meinem VIM -Redakteur ausführen könnte?
text oder chat -Abschluss?In OpenAI oder ähnlichen aktuellen LLMs sind zwei gemeinsame "Fertigstellungsmodi" vorgesehen:
text
Der Abschlussmodus, der als text festgelegt ist, bedeutet, dass LLM abgeschlossen ist. Der angegebene Kontextfenster forderte Text mit einem Fertigstellungstext (Text in -> Text aus). Ein Beispiel für eine solche Modelleinstellung ist das text-da-vinci-003 OpenAI-Modell. Um einen Textabschlussmodus zu verwenden, muss das Modell diesen Modus über eine bestimmte API unterstützen.
┌────────────────────────┐
┌─ │ │ ─┐
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 -Abschluss
Der Fertigstellungsmodus, der als chat eingestellt ist, bedeutet, dass LLM S für Chat "Rollen" fein abgestimmt ist (Benutzer sagen, Assistent sagen, ...). Vordere Details, bitte lesen Sie dies. Die Eingabeaufforderung des Kontextfensters erfolgt tatsächlich von
gpt3.5-turbo OpenAI-Modell. Um einen Chat -Vervollständigungsmodus zu verwenden, muss das Modell diesen Modus, Trogspezifische 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
│ │ ─┘
└────────────────────────┘
Das Plugin von PromPter.VIM wird als Text -Complete Fast Prototyping -Spielplatz konzipiert, wodurch die Komplikationen der Chat -Rollen vermieden werden.
Wenn also ein Modell, das nur im Chat- Modus arbeitet (z. B. OpenAI GPT3.5-Turbo ), verwendet wird, wird hinter den Szenen (über eine Litellm text_completion() -Methode) der Editortextinhalt (die Eingabeaufforderung) als "System" -Rolle eingefügt. Siehe auch: Diskussion.
Ich bin mir bewusst, dass die Verwendung eines chat-basierten Modells als textbasiertes Modell, wie oben beschrieben, nicht die optimale Verwendung ist, aber ein Kompromiss zwischen der Einfachheit eines einzelnen Textverschlussesplatzes und der Komplexität der Verwaltung von Chat-Rollen.
Dieses Plugin wird in Python3 hergestellt. Überprüfen Sie, ob Ihre VIM -Installation Python3 unterstützt:
vim --version | grep " +python3 " | awk ' {print $3} ' In meinem Fall habe ich +python3 . Das ist die Hauptvoraussetzung.
Überprüfen Sie auch, welche Python -Version, die vim zusammengestellt wird. Extrahieren Sie die genaue Python -Version mit dem Befehl:
vim --version | grep -o -P ' (?<=/python)[0-9]+.[0-9]+ ' In meinem Fall bekam ich 3.8 .
Beachten Sie, dass VIM nur die Python -Version (und die zugehörigen Pakete) verwenden kann, die zusammengestellt werden. Mit Beispiel, wenn Ihr System Python Current Version (
python3 --version==Python 3.11.6) von der Vim Python -Version unterscheidet, beispielsweisePython 3.8, denken Sie daran, Vim wird nurPython 3.8-Pakete sehen. UmPython 3.11.6-Pakete zu verwenden, müssen Sie VIM neu kompilieren.
Installieren Sie das Python -Paket litellm . Sie müssen litellm mit pip der entsprechenden Python -Version, z. B. pip3.8 , installieren.
pip3.8 install -U litellm Installieren Sie das Plugin mit Ihrem bevorzugten Plugin-Manager, z. B. mit dem VIM-Plug-Plug-In-Manager, in Ihre .vimrc Datei einfügen:
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= " " Eine gute Idee ist es, alle Variablen oben in einer versteckten Datei, z. B. vi ~/.prompter_azure.vim source ~/.prompter_azure.vim
Sie können Befehle im Befehlsmodus des VIM ausführen ( : oder im zugehörigen Schlüssel:
| Befehl | Schlüssel | Aktion |
|---|---|---|
:PrompterSetup | <F9> | Modellaufbau und erste Konfigurationen |
:PrompterGenerate | <F12> | Führen Sie den LLM -Textabschluss aus |
:PrompterInfo | <F10> | Aktuelle Konfiguration melden |
:PrompterSetupWenn Sie VIM eingeben, um die Umgebung von PromPter Playground zu aktivieren, wird zunächst im Befehlsmodus ausgeführt:
:PrompterSetupNach den Umgebungseinstellungen druckt der Befehl in der Statuszeile die Modellkonfigurationen, falls erfolgreich:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.7 max_tokens: 100
Erläuterung der Werte im Statuszeilenbericht:
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
:PrompterGenerateBearbeiten Sie Ihre Eingabeaufforderung in einem VIM -Fenster und führen Sie die LLM -Fertigstellung aus
:PrompterGenerateDie Statuszeile meldet einige Statistiken:
Latency: 1480ms (1.5s) Tokens: 228 (prompt: 167 completion: 61) Throughput: 154 Words: 28 Chars: 176, Lines: 7
Erläuterung der Werte im Statuszeilenbericht:
┌─ 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 ────────────────────────────────┘
Die Statistik meldet diese Metriken:
| Metrisch | Beschreibung | Beispiel |
|---|---|---|
| Latenz | Bot in Millisekunden und zweite Näherung | 1480ms (1.5s) |
| Token | Gesamt -Token -Betrag, sofortige subtotale und vollständige subtotale Fertigstellung | 228 |
| Durchsatz | Abschluss -Token / Latenzverhältnis (in Sekunden). Siehe Diskussion über das Konzept des Durchsatzes hier | 154 |
| Worte | Anzahl der in der Fertigstellung generierten Wörter | 28 |
| Chars | Anzahl der Zeichen in der Fertigstellung | 176 |
| Linien | Anzahl der in der Fertigstellung generierten Zeilen | 7 |
Standardmäßig wird der Befehl der Funktionstaste
F12zugeordnet. Auf diese Weise können Sie die Fertigstellung ausführen, wenn Sie nur den Einzel -TastenanschlagF12drücken.
:PrompterInfoMeldet die aktuelle Plugin -Version, die Liste der Plugin -Befehle, die aktuellen Modelleinstellungen.
:PrompterInfoDer Befehl druckt diese Informationen aus:
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>
Get und Set Fertigstellung Hintergrund- und Vordergrundfarben:
echo g: prompter_completion_ctermbg
echo g: prompter_completion_ctermfg
let g: prompter_completion_ctermbg = 3
let g: prompter_completion_ctermfg = 0Wenn Sie die Standard -Highlight -Farben nicht mögen, können Sie
ctermbgundctermfg-Werte anhand einer Teilmenge von CMTM/Xterm 256 -Farben ersetzen. Um alle verfügbaren Farben anzuzeigen, können Sie den Befehl verwenden:HighlightColorsTeil meines Plugins: Highlight.
Um den Temperaturwert zu ändern
let g: temperature = 0.2Um den MAX -Token -Wert zu ändern
let g: max_tokens = 2000
So ändern Sie die Stoppsequenz (en)
let g: stop = [ ' x: ' , ' y: ' , ' z: ' ]Befehle sind mit Funktionstasten mit dieser Standardeinstellung zugeordnet:
let g: prompter_setup_keystroke = ' <F9> '
let g: prompter_info_keystroke = ' <F10> '
let g: prompter_generate_keystroke = ' <F12> '
let g: prompter_regenerate_keystroke = ' <F8> ' Selbst wenn Sie in VIM einen Befehl Ihrer Präferenz zuordnen können, unter Beispiel: map <F2> :PrompterGenerate<CR> und Sie können sehen, welche Zuordnung für einen bestimmten Schlüssel, z. B. F2 , den Befehl VIM verwenden können :PrompterSetup map <F12> .
Verwenden Sie (VIM-included) Zaubersprüche
Wenn Sie eine LLM -Eingabeaufforderung schreiben, ist es sehr wichtig, Tippfehler zu vermeiden! Ich habe diese LLM -Fertigstellung oft am schlimmsten erlebt, wenn Sie nur ein Verb verwechseln.
Die Dinge laufen noch schlimmste, wenn Sie Eingabeaufforderungen in mehr als einer Sprache schreiben. Persönlich schreibe ich normalerweise Gesprächsaufforderungen in Englisch, aus einigen Gründen, die in meinem Artikel nicht englischsprachen beschrieben wurden, forderte technische Kompromisse, aber die Zielsprache der Chat-Eingabeaufforderung ist meine Muttersprache: Italienisch. Insgesamt enthält die Eingabeaufforderung Text sowohl in englischer als auch in italienisch. In diesem Fall führe ich diese kleine VIMRSCIPT -Funktion aus:
function ! Spell ()
set spelllang = en_us,it
setlocal spell
echom " Spell check set for Italian and English languages "
endfunction
com ! SPELL call Spell ()Lesen Sie alle Ihre vorherigen Fertigstellungsstatistiken
messagesVIM wird die Last -Abschluss -Statistikinformationen zeigen. Mit Beispiel, wenn Sie gerade 3 Fertigstellungen ausführen:
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
Leitungsleitungen weiche Wrap aktivieren
Normalerweise arbeite ich mit einer VIM-Einstellung mit Vollbild. Das hilft mir, meine Aufmerksamkeit zu maximieren. Trotzdem hilft die Lektüre PrompterGenerate .
Leider ist in VIM nicht einfach eine soziale Spaltenbreite zu konfigurieren. Siehe Diskussion. Sie können Soft Warp mit dem folgenden Befehl einstellen:
set wrap linebreak nolist Eine Technik, die ich zum Prototyp -Dialogantrag verwendet habe, besteht darin, einen Dialogfeld wie im folgenden Beispiel einzulegen, bei dem der Dialogblock mit der "Stop -Sequenz" endet (z a: LLM auslösen, um die Assistentenrolle zu vervollständigen:
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:
Um den LLM -Start auf den Benutzereingang festzulegen, können Sie die Stoppsequenz als u: mit Befehl einstellen:
let g: stop = [ ' u: ' ] Bitte beachten Sie, wenn Sie die oben beschriebene Stoppsequenz nicht festlegen, versucht der LLM, die gesamte Konversation zu vervollständigen. Dies ist im Allgemeinen nicht gesucht, weil Sie den Satz schreiben möchten, u: . Trotzdem ist es irgendwann nützlich, den g:stop nur um zu sehen, wie sich das Gespräch vorstellen kann.
Andere VIM -Befehle, die nützlich sein könnten:
u: und nur auf den Taste F6 gedrückt wird: map <F6> :normal ou: <CR> a: beginnt, und drücken Sie nur den Taste F7 : map <F7> :normal oa: <CR> Version 0.1
Erste Veröffentlichung. Nur OpenAI/Azure OpenAI -Modelle werden über OpenAI -Version 0.28 Python -Modul unterstützt.
Version 0.2
LLMs -Abschlüsse erfolgen über Litellm, LLMs -Abstraktionsschicht -Python -Paket, sodass eine Vielzahl verschiedener LLM -Anbieter verwendet werden können.
Unterstützen Sie alle LLM -Eingabeparameter
Bisher unterstützt PromPter.vim nur temperature , max_tokens , stop Argumente.
Litellm akzeptiert und übersetzt die OpenAI -Chat -Abschlussparameter für alle Anbieter.
Support Template -Eingabeaufforderungen
Sie entwerfen "Vorlagenaufforderungen", die aus verschiedenen Teilen bestehen, die zur Laufzeit dynamisch konstruiert werden können. Betrachten Sie beispielsweise, dass Sie eine "Vorlage Eingabeaufforderung" mit Platzhaltervariablen prototypisieren möchten, beispielsweise auf bestimmte Variablen, die von anderen Eingabeaufforderungen oder Dateien gefüllt sind, wie dies:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
Im obigen Beispiel fungieren Sie bei der Verwendung von Webspielplätzen als Vermittler von Kopierkopien. Sie müssen vier Web -Registerkarten öffnen, in den jeweiligen Textverschlüssen Text ausführen und schließlich die Vervollständigungen manuell einfügen, Variablen wie {some_data} , {dialog_history} ersetzen. Zusätzlich müssen Sie möglicherweise eine Datei in eine Variable wie {some_yaml} laden.
Die Idee ist, Vorlagenanforderungen zu bearbeiten, damit die variablen Platzhalter durch den Inhalt anderer Puffer/Fenster ersetzt werden können.
Asynchrone LLM -Abschluss
Derzeit ist der Befehl LLM Completion PrompterGenerate ein synchroner Befehl: Der Editor wird blockiert, bis die LLM -API einen Fertigstellungstext zurückgibt. Es könnte mühsam für sehr komplexe und lange Eingabeaufforderungen sein, die viele Sekunden dauern (z. B. >> 10). In diesen Fällen könnte es besser sein, wenn der Befehl asynchiert sein könnte, sodass der Entwickler den VIM-Editor mit dem Fertigstellung verwenden kann.
Streaming -Unterstützung
Bisher wird die Fertigstellung von Streaming nicht berücksichtigt.
David Shapiro für seine enorme Verbreitung an LLMs und generativen KI. Ich habe mit Begeisterung, insbesondere seiner LLM -prompt Engineering Live Coding YouTube -Videos, gefolgt!
Vivian de Smedt VIM -Experte für seine Hilfe bei der Lösung eines Problems bei der Entwicklung dieses Plugins.
Litellm -Schöpfer, die einige vorgeschlagene Funktionen als Textabschlussformat integriert haben!
Dieses Projekt ist in progressiver Proof-of-Concept-Alfa-Version!
Ich bin kein VIMSCIPT -Experte, daher ist ein Beitrag oder Vorschlag willkommen. Für jeden Vorschlag und jede Ausgabe senden Sie bitte hier zu Github -Problemen für Fehler, Vorschläge usw. Sie können mich auch per E -Mail kontaktieren ([email protected]).
Wenn Ihnen das Projekt gefällt, können Sie dieses Repository bitte angeben, um Ihre Unterstützung zu zeigen!
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.
Spitze