Askit ist ein Sprach-Plugin für TypeScript, mit dem Sie die Funktionen eines großen Sprachmodells (LLM) wie GPT-4 direkt in Ihrer Programmierumgebung nutzen können, keine komplexen APIs erforderlich. Die umfangreiche Anwendungsspanne von Askit umfasst:
Askit basiert auf der OpenAI-API und bietet eine benutzerfreundliche Schnittstelle für die Einbeziehung von LLMs in Ihre Anwendungen. Sie können Askit nicht nur in TypeScript, sondern auch in JavaScript und Python verwenden.
Informationen zum Integrieren von Askit in JavaScript finden Sie im entsprechenden Abschnitt JavaScript.
Wenn Python Ihre bevorzugte Sprache ist, können Sie mehr darüber erfahren, wie Sie Askit verwenden, indem Sie unsere engagierte Askit -Seite (Pyaskit) besuchen.
Typ-gesteuerte Ausgangsregelung: Erhalten Sie eine Antwort im angegebenen Typ.
Vorlagenbasierte Funktionsdefinition: Definieren Sie Funktionen mithilfe einer Eingabeaufforderung Vorlage.
Codegenerierung: Generieren Sie Funktionen von der einheitlichen Schnittstelle. Weitere Informationen finden Sie unter Codegenerierung mit Fragen.
Programmierung mit Beispiel (PBE): Funktionen anhand von Beispielen definieren. Weitere Informationen finden Sie in der Programmierung durch Beispiel mit Askit.
Stellen Sie vor dem Start sicher, dass Node.js und NPM in Ihrem System installiert sind. Führen Sie dann den folgenden Befehl aus:
npm install ts-askit Dieses Paket basiert auf ts-patch . Um ts-patch zu installieren, rennen Sie:
npx ts-patch install Fügen Sie Ihrem tsconfig.json das folgende Ausschnitt hinzu:
"compilerOptions" : {
"plugins" : [{ "transform" : " ts-askit/transform " }]
} Mit dieser Änderung ermöglicht der TypeScript -Compiler die Typparameter für die ask define in Askit.
Das ts-patch -Paket ist entscheidend, um das volle Potenzial von Askit auszulösen, da der Typscript-Compiler so erweitert wird, dass das Typ-System von Askit vollständig integriert wird. Während Askit ohne ts-patch verwendet werden kann, bietet diese Integration ein fequIenreicheres Erlebnis.
Bevor Sie Askit verwenden, müssen Sie Ihre OpenAI -API -Schlüssel als Umgebungsvariable OPENAI_API_KEY festlegen:
export OPENAI_API_KEY= < your OpenAI API key > <your OpenAI API key> ist eine Zeichenfolge, die so aussieht: sk-<your key> . Sie finden Ihre API -Schlüssel im OpenAI -Dashboard.
Sie können den Modellnamen auch als Umgebungsvariable ASKIT_MODEL angeben:
export ASKIT_MODEL= < model name > <model name> ist der Name des Modells, das Sie verwenden möchten. Der neueste Askit wird mit gpt-4 und gpt-3.5-turbo-16k getestet. Die Liste der verfügbaren Modelle finden Sie in der OpenAI -API -Dokumentation.
Hier sind einige Einführungsbeispiele:
import { ask } from 'ts-askit' ;
ask < string > ( 'Paraphrase "Hello World!"' ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; In diesem Beispiel ist ask eine API -Funktion, mit der Ihr Programm Abfragen für ein großes Sprachmodell (LLM) aufstellen kann. Der Typparameter repräsentiert den erwarteten Ausgangstyp aus dem LLM. Hier ist der Ausgangstyp string . Die Eingabeaufforderung wird als Argument in der natürlichen Sprache übergeben und beschreibt die Aufgabe, die LLM auszuführen. ask ist asynchron und gibt ein Promise des angegebenen Ausgangstyps zurück. Der Code -Snippet oben sollte so etwas drucken:
Greetings, Universe!
Für eine Eingabeaufforderung mit Parametern können Sie die API define wie folgt:
import { define } from 'ts-askit' ;
const paraphrase = define < string > ( 'Paraphrase {{text}}' ) ;
paraphrase ( { text : 'Hello World!' } ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; define ist eine API -Funktion, mit der Sie eine benutzerdefinierte Funktion definieren können. Sein Typ -Parameter gibt den Ausgangstyp des LLM und folglich den Rückgabewert der Funktion an. Die Funktion empfängt eine String -Vorlage als Argument, die als Aufgabe des LLM dient. Die Vorlage kann Parameter enthalten, die in doppelten lockigen Klammern eingeschlossen sind. Im obigen Beispiel ist text ein Parameter in der Vorlage und kann eine gültige JavaScript -Kennung sein.
Sobald die Funktion definiert ist, kann sie wie jede andere Funktion aufgerufen werden. Diese Funktion akzeptiert ein Objekt als Argument, das den Werten der Vorlagenparameter ordnet. In diesem Fall Karten der text 'Hallo Welt!'
Askit ist geschickt darin, Code aus natürlichen Sprachbeschreibungen zu generieren. Hier ist ein Beispiel:
import { define } from 'ts-askit' ;
const sort = define < number [ ] , { numbers : number [ ] } > (
'Sort {{numbers}} in ascending order'
) ; Dieses Beispiel zeigt eine Funktion, die ein Array von Zahlen in aufsteigender Reihenfolge sortiert, wobei die API define , um die LLM zur Definition der Funktion anzuweisen. Obwohl diese Methode effizient ist, kann diese Methode rechenintensiv erscheinen, da jeder Funktionsaufruf eine neue LLM -Aufgabe erfordert.
Um diesen Prozess zu optimieren, können wir das LLM nutzen, um den Code der Sortierfunktion zu generieren, anstatt für jede Sortieraufgabe auf die LLM zurückzugreifen. Dies optimiert die Funktion, ohne Änderungen in der Implementierung zu erfordern, dank der Codes -Erzeugungsfunktionen von Askit .
Der Code für die oben genannte Funktion kann in drei Schritten generiert werden:
tsc . Der Askit -Analysator scannt den Code und generiert eine JSONL -Datei mit Details zum define und ask von API.npx askgen < jsonl file >tsc neu. Diesmal werden die API-Aufrufe define und ask durch die Referenzen und Aufrufe der neu generierten Funktion ersetzt, dank der automatischen Wiederholungsfunktion von Askit . Mit Askit können Sie die Leistung der Programmierung durch Beispiel (PBE) nutzen. PBE vereinfacht den Programmierungsprozess, indem Sie die Funktionalität anstelle von Beispielen anstelle einer hart codierten Logik definieren können. Das folgende Beispiel zeigt dies, indem Sie Ihnen zeigen, wie Sie mit PBE mit Askit zwei Binärzahlen hinzufügen.
import { define , Example } from 'ts-askit' ;
const trainingExamples : Example [ ] = [
{ input : { x : '1' , y : '0' } , output : '1' } ,
{ input : { x : '1' , y : '1' } , output : '10' } ,
{ input : { x : '101' , y : '11' } , output : '1000' } ,
{ input : { x : '1001' , y : '110' } , output : '1111' } ,
{ input : { x : '1111' , y : '1' } , output : '10000' } ,
] ;
const testExamples = [
{ input : { x : '0' , y : '1' } , output : '1' } ,
{ input : { x : '10' , y : '0' } , output : '10' } ,
{ input : { x : '110' , y : '10' } , output : '1000' } ,
] ;
const addInBase2 = define < string , { x : string ; y : string } > (
'Add {{x}} and {{y}}' ,
trainingExamples ,
testExamples
) ;
async function doit ( ) {
console . log ( await addInBase2 ( { x : '101' , y : '11' } ) ) ;
}
doit ( ) ; In diesem Beispiel definieren wir eine Funktion addInBase2 , die zwei Binärzahlen (als Zeichenfolgen dargestellt) benötigt und sie hinzufügt. Die define -Funktion wird mit Aufforderung und zwei Arrays von Beispielen aufgerufen: Schulungsbeispiele und Testbeispiele. Die Trainingsbeispiele spiegeln sich in der Eingabeaufforderung auf eine Art und Weise wider. Andererseits werden die Testbeispiele verwendet, um die Korrektheit der generierten Funktion zu validieren. Testbeispiele sind nicht erforderlich, wenn Sie keinen Code für die Funktion generieren.
Das Ergebnis ist eine leistungsstarke Funktion, mit der Sie das LLM anweisen können, komplexe Operationen wie binäre Addition zu erledigen, die nur Beispiele verwenden. Dieser Ansatz ermöglicht es Ihnen, komplexe Funktionen schnell und mit weniger explizite Logik zu entwickeln.
Sobald die Funktion addInBase2 definiert ist, ask Sie es mit Binärnummernzeichenfolgen aufrufen, um die Ergänzung in Basis 2 durchzuführen.
JavaScript-Entwickler können das Potenzial der vom Askit angebotenen typgesteuerten Ausgangskontrolle vollständig ausnutzen. Genau wie bei seinem Geschwistertypscript enthält JavaScript die API -Methode ask dies zu erreichen. Die Funktion ask erfordert zwei Parameter: einen Typ und eine Eingabeaufforderung.
Hier ist eine Reihe von Beispielen, die ihre Verwendung demonstrieren:
const ai = require ( 'ts-askit' )
const t = require ( 'ts-askit/types' )
ai . ask ( t . number , 'What is the third prime number?' ) . then ( ( answer ) => { console . log ( answer ) } ) ;
ai . ask ( t . string , "What is the month number of 'January'?" ) . then ( ( answer ) => { console . log ( answer ) } ) ;
ai . ask ( t . array ( t . number ) , "What are the month numbers in the second quarter?" ) ;
const monthType = t . type ( {
name : t . string ,
number : t . number
} )
ai . ask ( monthType , "What is the month number of 'October'?" ) . then ( ( answer ) => { console . log ( answer ) } ) ;
ai . ask ( t . array ( monthType ) , "What are the months in the second quarter?" ) . then ( ( answer ) => { console . log ( answer ) } ) ; Im obigen Code -Snippet wird die ask -Funktion mit einem Typ und einer Eingabeaufforderung aufgerufen. Der Typ -Parameter dient dazu, Fragen zum Format und die Struktur der gewünschten Ausgabe zu informieren. Dies wird extrem praktisch, wenn Sie mit komplexen Datenstrukturen zu tun haben.
Mit Askit können JavaScript-Entwickler Funktionen mit leicht verständlichen Vorlagen definieren. Die define -Methode ist der Held hinter den Kulissen hier, da sie Funktionen basierend auf der bereitgestellten Task -Vorlage erstellt. Nach der Erstellung können diese Funktionen mit jedem Objekt aufgerufen werden, das Werte für die Platzhalter in der Vorlage liefert.
Hier ist ein Beispiel dafür, wie es gemacht wird:
const ai = require ( 'ts-askit' )
const t = require ( 'ts-askit/types' )
let f = ai . define ( t . string , 'Translate {{text}} into {{language}}' ) ;
f ( { text : 'Hello' , language : 'French' } ) . then ( ( answer ) => { console . log ( answer ) } ) ; Im obigen Code wird die define -Methode verwendet, um eine Funktion f unter Verwendung einer Task -Vorlage 'übersetzen {{text}} in {{Sprache}}'. Die Funktion f wird dann mit einem Objekt aufgerufen, das Werte für text und language liefert.
Das Modul 'ts-askit/types' ist ein Schatz der Typen, die Sie verwenden können, um Askits Ausgabe zu führen. Hier ist ein Tisch, der Ihnen dabei hilft, diese Typen schnell zu erfassen:
| Typ | Beschreibung | Geben Sie ein Beispiel ein | Wertbeispiel |
|---|---|---|---|
NumberType | Numerischer Typ | t.number | 123 |
StringType | String -Typ | t.string | "Hallo Welt!" |
BooleanType | Boolescher Typ | t.boolean | WAHR |
LiteralType | Wörtlicher Werttyp | t.literal(123) | 123 |
ArrayType | Array -Typ | t.array(t.number) | [1, 2, 3] |
UnionType | Gewerkschaftstyp (mehrere mögliche Werte) | t.union([t.literal('yes'), t.literal('no')]) | "ja oder nein" |
InterfaceType | Schnittstellen-/Wörterbuchtyp | t.type({a: t.number, b: t.number}) | {a: 1, b: 2} |
CodeType | Codetyp | t.code('python') | "Def hello_world (): print ('Hallo, Welt!')" |
Jeder Typ verfügt über bestimmte Eigenschaften, die verwendet werden, um die vorliegende Aufgabe zu verstehen und die Ausgabe ordnungsgemäß zu formatieren.
Zum Zeitpunkt des Schreibens ist die Codegenerierungsfunktion ausschließlich in TypeScript verfügbar. Die Anstrengungen sind jedoch in vollem Gange, um dieses leistungsstarke Feature auf den Bereich von JavaScript auszudehnen. Wenn Ihre Anforderungen die Verwendung der Codegenerierung in der Zwischenzeit erfordern, empfehlen wir die Verwendung von TypeScript bis weitere Aktualisierungen.
Weitere Informationen zu unserem Verhaltenskodex und dem Prozess zum Senden von Pull -Anfragen finden Sie unter Beitrags.md.
Dieses Projekt ist unter der MIT -Lizenz lizenziert. Weitere Informationen finden Sie in der Lizenzdatei.
@misc { okuda2023askit ,
title = { AskIt: Unified Programming Interface for Programming with Large Language Models } ,
author = { Katsumi Okuda and Saman Amarasinghe } ,
year = { 2023 } ,
eprint = { 2308.15645 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.PL }
}