Verwalten Sie die parametrisierten Eingabeaufforderungen (Text), die in generativen KI (auch bekannt als Chatgpt, OpenAI, ET.Al. ) verwendet werden, unter Verwendung von Speicheradaptern wie Dateisystemen, SQLiteadapter und ActiveCordAdapter.
Bruchänderung in Version 0.3.0 - Der Wert des Parameter -Hash für ein Schlüsselwort ist jetzt ein Array anstelle eines einzelnen Werts. Der letzte Wert im Array ist immer der neueste Wert, der für das angegebene Schlüsselwort verwendet wird. Dies wurde durchgeführt, um die Verwendung einer Readline :: History -Objektbearbeitung im AIA CLI -Tool zu unterstützen
Installieren Sie das Edelstein und fügen Sie die GemFile der Anwendung durch Ausführung hinzu:
bundle add prompt_manager
Wenn Bundler nicht zum Verwalten von Abhängigkeiten verwendet wird, installieren Sie das Gem durch Ausführung:
gem install prompt_manager
Siehe Beispiele/Simple.rb
Siehe auch Beispiele/use_search_proc.rb
Das prompt_manager -Edelstein bietet Funktionen zum Verwalten von Eingabeaufforderungen mit Schlüsselwörtern und Anweisungen für die Verwendung mit generativen KI -Prozessen.
Gen-Ai befasst sich mit der Konvertierung (einige sagen die Ausführung) eines menschlichen natürlichen Sprachtextes (der "Eingabeaufforderung") in etwas anderes unter Verwendung von sogenannten Großsprachenmodellen (LLM) wie den von OpenAI erhältlich. Eine parametrisierte Eingabeaufforderung ist eine, in der es eingebettete Schlüsselwörter (Parameter) gibt, die Halter für andere Text sind, die in die Eingabeaufforderung eingefügt werden sollen.
Der Eingabeaufforderung_Manager verwendet einen regulären Ausdruck, um diese Schlüsselwörter innerhalb der Eingabeaufforderung zu identifizieren. Es verwendet die Schlüsselwörter als Schlüssel in einem parameters -Hash, der mit dem Eingabeaufforderungstext in einer serialisierten Form gespeichert ist - beispielsweise als JSON.
Standardmäßig wird jeder in quadratischen Klammern eingeschlossene Text [UPPERCASE_TEXT] als Schlüsselwort behandelt. [Keywords können auch Leerzeichen haben] sowie den Unterstrich -Charakter.
Sie können das Schlüsselwortmuster anpassen, indem Sie einen anderen regulären Ausdruck festlegen:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/ Das Regex muss das Erfassen von Klammern () enthalten, um das Schlüsselwort zu extrahieren. Der Standard -Regex ist /([[AZ _|]+])/ .
Eine Richtlinie ist eine Zeile im promptierten Text, die mit den beiden Zeichen beginnt // ' - Slash Slash - genau wie in den alten Tagen von IBM JCL - Job Control Language. Eine Eingabeaufforderung kann null oder mehr Richtlinien haben. Anweisungen können Parameter haben und Schlüsselwörter verwenden.
Die prompt_manager sammelt nur Richtlinien. Es extrahiert Schlüsselwörter aus Richtlinienzeilen und liefert die Ersetzung dieser Schlüsselwörter mit einem anderen Text, genau wie für die Eingabeaufforderung.
Hier ist eine Beispiel -Eingabeaufforderung Textdatei mit Kommentaren, Anweisungen und Schlüsselwörtern:
# prompts/sing_a_song.txt
# Desc: Has the computer sing a song
//TextToSpeech [LANGUAGE] [VOICE NAME]
Say the lyrics to the song [SONG NAME]. Please provide only the lyrics without commentary.
__END__
Computers will never replace Frank Sinatra
Das Erhalten von Richtlinien von einer Eingabeaufforderung ist genauso einfach wie die Kewyords:
prompt = PromptManager :: Prompt . new ( ... )
prompt . keywords #=> an Array
prompt . directives #=> an Array of entries like: ['directive', 'parameters']
# to_s builds the prompt by substituting
# values for keywords amd removing comments.
# The resulting text contains directives and
# prompt text ready for the LLM process.
puts prompt . to_s Die Einträge im Array, die von der prompt.directives zurückgegeben wurden. Jeder Eintrag hat zwei Elemente:
Da Richtungen erfasst werden, nachdem die Schlüsselwörter in der Eingabeaufforderung für ihre Werte ersetzt wurden, ist es möglich, als Teil einer Eingabeaufforderung dynamisch generierte Richtlinien zu haben. Zum Beispiel:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... wo [Befehl] durch einen Richtungsnamen ersetzt wird. [Etwas] könnte durch "// Richtlinienoptionen" ersetzt werden.
Das prompt_manager -Juwel sammelt nur Richtlinien. Die Ausführung dieser Direktiven bleibt einem Down -Stream -Prozess überlassen. Hier sind einige Ideen, wie Anweisungen im schnellen nachgeschalteten Prozess verwendet werden können:
mods festzulegen.Es ist alles, wie Ihre Bewerbung Richtlinien unterstützen möchte oder nicht.
Das prompt_manager -Gem ignoriert Kommentare. Eine Zeile, die mit dem Charakter "#" - Pound (auch bekannt als Hash) beginnt - ist ein Zeilenkommentar. Alle Zeilen, die einer Zeile folgen, die am Ende einer Datei endet, werden als Kommentare betrachtet. Grundsätzlich das " Ende " das Ende der Datei. Nichts ist der Prozess nach dieser Linie.
Das Edelstein ignoriert auch leere Zeilen.
Ein Speicheradapter ist eine Klasseninstanz, die die PromptManager::Prompt -Klasse an eine Lagereinrichtung mit den tatsächlichen Eingabeaufforderungen verbindet. Derzeit sind 3 Speicheradapter für die Implementierung geplant.
Der PromptManager::Prompt zur Unterstützung einer kleinen Reihe von Methoden. Ein Speicheradapter kann "zusätzliche" Klassen- oder Instanzmethoden bereitstellen, die über die Eingabeaufforderungsklasse verwendet werden können. Weitere Informationen zum Erstellen eines neuen Speicheradapters finden Sie im test/prompt_manager/prompt_test.rb .
Dies ist der erste entwickelte Speicheradapter. Es speichert Eingabeaufforderungen als Textdateien innerhalb des Dateisystems in einem benannten prompts_dir (Verzeichnis) wie ~/.prompts oder wo es für Sie am sinnvollsten ist. Ein weiteres Beispiel wäre, Ihr Verzeichnis in einem freigegebenen Dateisystem zu haben, damit andere dieselben Eingabeaufforderungen verwenden können.
Die prompt ID ist der Grundname der Textdatei. Beispielsweise ist todo.txt die Datei für die Eingabeaufforderung -ID todo (siehe Beispieleverzeichnis).
Die Parameter für die todo -Eingabeaufforderung -ID werden in einer JSON -Datei namens todo.json (auch im Beispielverzeichnis) im selben Verzeichnis wie todo.txt gespeichert.
Verwenden Sie einen config , um die Konfiguration für die Klasse festzulegen.
PromptManager :: Storage :: FileSystemAdapter . config do | o |
o . prompts_dir = "path/to/prompts_directory"
o . search_proc = nil # default
o . prompt_extension = '.txt' # default
o . params_extension = '.json' # default
end Der config gibt self zurück, was bedeutet, dass Sie dies tun können, um den Speicheradapter mit der Eingabeaufforderungklasse einzurichten:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new Dies ist entweder eine String oder ein Pathname -Objekt. Alle Dateipfade werden in der Klasse als Pathname -Objekte verwaltet. Wenn Sie eine String angeben, wird sie konvertiert. Relative Pfade werden in absolute Pfade umgewandelt.
Ein ArgumentError wird angehoben, wenn es nicht vorhanden ist, dass prompts_dir nicht existiert oder wenn es sich nicht um ein Verzeichnis handelt.
Die Standardeinstellung für search_proc ist NIL, was bedeutet, dass die Suche durch eine Standard search vorgeformt wird, bei der im Grunde alle Eingabeaufforderungsdateien gelesen werden, um zu sehen, welche den Suchbegriff enthalten. Für jede gefundene Eingabeaufforderung, die den Suchbegriff enthält, wird ein Array von Eingabeaufforderungen für jede festgelegte Datei zurückgegeben. Es steigt vor der Anwendung, um auszuwählen, welche Eingabeaufforderungs -ID verwendet werden soll.
Es gibt schnellere Möglichkeiten, Dateien zu durchsuchen und auszuwählen. Zum Beispiel gibt es spezielle Such- und Auswahl -Versorgungsunternehmen, die für die Befehlszeile verfügbar sind. Das examples -Verzeichnis enthält ein bash -Skript mit dem Namen rgfzf , das rg (auch bekannt als ripgrep ) zum Suchen und fzf verwendet, um die Auswahl durchzuführen.
Siehe Beispiele/use_search_proc.rb
Diese beiden Konfigurationsoptionen sind String -Objekte, die mit einem Zeitraum beginnen müssen ". Es wird ein ArgumentError erhoben.
Derzeit unterstützt der FileSystemAdapter nur einen JSON -Serializer für seinen Parameter Hash. Die Verwendung anderer Werte für diese Erweiterungen verursacht Probleme.
Sie existieren so, dass es eine Plattform gibt, auf der andere Speicheradapter erstellt werden können oder Serialisierer hinzugefügt werden können. Dies ist derzeit nicht auf der Roadmap.
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
Beachten Sie die Befehlszeilen oben. Dies ist eine Konvention, die ich benutze. Es ist nicht Teil der Software. Ich finde es hilfreich, die Eingabeaufforderung zu dokumentieren.
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}Der letzte Wert im Keyword -Array ist der neueste Wert, der für dieses Schlüsselwort verwendet wird. Dies ist eine Funktionalität, die seit V0.3.0 festgelegt wurde. Sein Zweck ist es, einen Werteverlauf bereitzustellen, aus dem ein Benutzer auswählen kann, um einen vorherigen Wert zu wiederholen oder den vorherigen Wert TA auszuwählen und ihn in etwas Neues zu bearbeiten.
Das FileSystemAdapter fügt zwei neue Methoden für die Verwendung der Prompt hinzu:
Pathname -Objekt in die Eingabeaufforderung -Datei zurück Verwenden Sie das Formular für path(prompt_id) gegen die Prompt . Verwenden Sie prompt.path Wenn Sie eine Instanz einer Prompt haben
Der ActiveRecordAdapter geht davon aus, dass es eine Datenbank gibt, die bereits vom Anwendungsprogramm konfiguriert ist, das prompt_manager erfordert, das ein Modell enthält, das einen formischen Inhalt enthält. Dieses Modell muss mindestens drei Spalten haben, die Inhalte enthalten für:
Das Modell und die Spalten für diese drei Elemente können einen beliebigen Namen haben. Diese Namen werden dem ActiveRecordAdapter in seinem Konfigurationsblock zur Verfügung gestellt.
Verwenden Sie einen config , um die Konfiguration für die Klasse festzulegen.
Die PromptManager::Prompt class erwartet eine Instanz einer Speicheradapterklasse. Durch Konventionspray -Adapter -Klassenkonfigurationsmethoden wird self zurückgegeben, sodass ein einfaches new nach der Konfiguration die Instanz festlegt.
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: ActiveRecordAdapter . config do | config |
config . model = DbPromptModel # any ActiveRecord::Base model
config . id_column = :prompt_name
config . text_column = :prompt_text
config . parameters_column = :prompt_params
end . new # adapters an instances of the adapter class Der model ist der tatsächliche Klassenname des ActiveRecord::Base oder ApplicationRecord (wenn Sie eine Rails -Anwendung verwenden), die den Inhalt enthält, der für Eingabeaufforderungen verwendet wird.
Der id_column enthält den Namen der Spalte, der den Inhalt "Eingabeaufforderung" enthält. Es kann entweder eine String oder Symbol sein.
Der text_column enthält den Namen der Spalte, der den tatsächlichen rohen Text der Eingabeaufforderung enthält. Dieser Rohtext kann die Schlüsselwörter enthalten, die durch Werte aus dem Parameter Hash ersetzt werden. Der Spaltenname -Wert kann entweder eine String oder ein Symbol sein.
Der parameters_column enthält den Namen der Spalte, der die Parameter enthält, die zum Ersetzen von Schlüsselwörtern im Eingabetext verwendet werden. Diese Spalte im Datenbankmodell wird voraussichtlich serialisiert. Der ActiveRecordAdapter verfügt derzeit über einen Kloudge -Stück Code, der davon ausgeht, dass die Serialisierung mit JSON erfolgt. Der Wert der Parameter_Column kann entweder eine String oder ein Symbol sein.
TODO: Beheben Sie den Kludge, damit jede Serialisierung verwendet werden kann.
Es gibt viele Möglichkeiten, um dieses Plugin -Konzept des Speicheradapters beizulegen. Hier gibt es einige für die Prüfung:
Auf der Suche nach Feedback und Mitwirkenden, um die Fähigkeit von forderding_manager zu verbessern.
Fehlerberichte und Pull -Anfragen sind auf Github unter https://github.com/madbomber/prompt_manager willkommen.
Das Edelstein ist unter den Bedingungen der MIT -Lizenz als Open Source erhältlich.