Askitは、プログラミング環境内で直接GPT-4などの大規模な言語モデル(LLM)の機能を活用できるTypeScript用の言語プラグインであり、複雑なAPIは必要ありません。 Askitの広範なアプリケーションには次のものが含まれます。
Openai APIに基づいて構築されたAskitは、LLMをアプリケーションに組み込むためのユーザーフレンドリーなインターフェイスを提供します。 TypeScriptだけでなく、JavaScriptとPythonでもAskITを使用できます。
AskitをJavaScriptと統合するには、対応するJavaScriptセクションを参照してください。
Pythonが優先言語である場合、専用のAskit(Pyaskit)ページにアクセスして、 Askitを利用する方法について詳しく知ることができます。
タイプガイドの出力制御:指定されたタイプで応答を取得します。
テンプレートベースの関数定義:プロンプトテンプレートを使用して関数を定義します。
コード生成:統一されたインターフェイスから関数を生成します。詳細については、Askitのコード生成を参照してください。
例によるプログラミング(PBE):例を使用して関数を定義します。詳細については、AskITを使用した例ごとのプログラミングを参照してください。
開始する前に、システムにnode.jsとnpmがインストールされていることを確認してください。次に、次のコマンドを実行します。
npm install ts-askitこのパッケージはts-patchに依存しています。 ts-patchをインストールするには、実行します。
npx ts-patch install次のスニペットをtsconfig.jsonに追加します。
"compilerOptions" : {
"plugins" : [{ "transform" : " ts-askit/transform " }]
}この変更により、TypeScriptコンパイラはaskのタイプパラメーターをサポートし、AskITでAPI define 。
ts-patchパッケージは、AskITのタイプシステムを完全に統合するためにTypeScriptコンパイラを拡張するため、AskITの可能性を最大限に発揮するために重要です。 AskITはts-patchなしで使用できますが、この統合はより機能が豊富なエクスペリエンスを提供します。
AskITを使用する前に、OpenAI APIキーを環境変数OPENAI_API_KEYとして設定する必要があります。
export OPENAI_API_KEY= < your OpenAI API key > <your OpenAI API key>次のように見える文字列です: sk-<your key> 。 OpenaiダッシュボードでAPIキーを見つけることができます。
モデル名を環境ASKIT_MODELとして指定することもできます。
export ASKIT_MODEL= < model name > <model name>は、使用するモデルの名前です。最新のAskITはgpt-4およびgpt-3.5-turbo-16kでテストされています。 Openai APIドキュメントで利用可能なモデルのリストを見つけることができます。
いくつかの紹介例を次に示します。
import { ask } from 'ts-askit' ;
ask < string > ( 'Paraphrase "Hello World!"' ) . then ( ( result ) => {
console . log ( result ) ;
} ) ;この例では、 ask 、プログラムが大規模な言語モデル(LLM)にクエリをポーズをとることを可能にするAPI関数です。型パラメーターは、LLMからの予想される出力タイプを表します。ここで、出力タイプはstringです。プロンプトは自然言語の議論として渡され、LLMが実行するタスクを説明します。 askは非同期で、指定された出力タイプのPromiseを返します。上記のコードスニペットは、次のようなものを印刷する必要があります。
Greetings, Universe!
パラメーターを備えたプロンプトの場合、次のようにdefine APIを使用できます。
import { define } from 'ts-askit' ;
const paraphrase = define < string > ( 'Paraphrase {{text}}' ) ;
paraphrase ( { text : 'Hello World!' } ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; define 、カスタム関数を定義できるAPI関数です。そのタイプパラメーターは、LLMの出力タイプを示し、その結果、関数の返品値を示します。この関数は、LLMのタスクプロンプトとして機能する引数として文字列テンプレートを受信します。テンプレートには、ダブルカーリーブレースに囲まれたパラメーターを含めることができます。上記の例では、 textはテンプレート内のパラメーターであり、有効なJavaScript識別子にすることができます。
関数が定義されると、他の関数と同様に呼び出すことができます。この関数は、テンプレートパラメーターの値にマップする引数としてオブジェクトを受け入れます。この場合、 text文字列「Hello World!」にマップします。
Askitは、自然言語の説明からコードを生成することに熟達しています。これが例です:
import { define } from 'ts-askit' ;
const sort = define < number [ ] , { numbers : number [ ] } > (
'Sort {{numbers}} in ascending order'
) ;この例は、 define APIを使用してLLMに関数を定義するように指示するために、昇順で数値の配列を並べ替える関数を紹介します。概念は効率的ですが、この方法は、各関数呼び出しに新しいLLMタスクが必要であるため、計算上重いと思われる場合があります。
このプロセスを合理化するために、LLMを活用して、すべての並べ替えタスクに対してLLMに頼るのではなく、ソート機能のコードを生成できます。これにより、 Askitのコード生成機能のおかげで、実装に変更を必要とせずに機能を最適化します。
前述の関数のコードは、3つのステップで生成できます。
tscを使用してコードをコンパイルします。 AskITアナライザーはコードをスキャンし、 defineおよびASPI askに関する詳細を含むJSONLファイルを生成します。npx askgen < jsonl file >tscでコードを再コンパイルします。今回は、 AskITの自動再配置機能のおかげで、 defineおよびask API呼び出しは、それぞれ新しく生成された関数の参照と呼び出しに置き換えられます。 AskITを使用すると、例(PBE)でプログラミングの力を活用できます。 PBEは、ハードコード化されたロジックではなく、例を介して機能を定義できるようにすることにより、プログラミングプロセスを簡素化します。次の例は、 AskITを使用してPBEを使用して2つのバイナリ番号を追加する方法を示すことでこれを示しています。
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 ( ) ;この例では、2つのバイナリ番号(文字列として表される)を取得し、追加する関数addInBase2定義します。 define関数は、トレーニングの例とテストの例の2つのプロンプトと2つの例で呼び出されます。トレーニングの例は、いくつかのショット学習方法でプロンプトに反映されています。一方、テストの例は、生成された関数の正確性を検証するために使用されます。関数のコードを生成しない場合、テスト例は必要ありません。
その結果、強力な機能が可能になり、LLMにバイナリの追加などの複雑な操作を実行するように指示することができます。このアプローチを使用すると、複雑な機能を迅速に、より明確なロジックで迅速に開発できます。
関数addInBase2が定義されたら、バイナリ番号文字列で呼び出してベース2で追加を実行できます。従来の関数呼び出しと同様に、 Askitのask操作は、計算された結果とともに解決する約束を返します。
JavaScript開発者は、 AskITが提供するタイプガイドの出力制御の可能性を完全に活用できます。兄弟のタイプスクリプトと同様に、JavaScriptにはAPIメソッドがこれを達成するようにask 。関数ask 、タイプとプロンプトの2つのパラメーターを取ります。
以下は、その使用法を示す一連の例です。
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 ) } ) ;上記のコードスニペットでは、 ask関数はタイプとプロンプトで呼び出されます。タイプパラメーターは、目的の出力の形式と構造についてAskITに通知する目的を果たします。これは、複雑なデータ構造を扱っている場合に非常に便利になります。
AskITを使用すると、JavaScript開発者は、わかりやすいテンプレートを使用して機能を定義する機能を備えています。 define方法は、提供されたタスクテンプレートに基づいて関数を作成するのに役立つため、ここで舞台裏のヒーローです。作成されると、これらの関数は、テンプレート内のプレースホルダーに値を提供する任意のオブジェクトで呼び出すことができます。
これがどのように行われているかの例です。
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 ) } ) ;上記のコードでは、 defineメソッドを使用して、タスクテンプレート 'translate {{text}}に{{Language}}'にtranslate fを使用して関数fを確立します。関数fは、 textとlanguageの値を提供するオブジェクトで呼び出されます。
'ts-askit/types'モジュールは、 Askitの出力をガイドするために利用できるタイプの宝庫です。これらのタイプをすばやく把握するのに役立つテーブルは次のとおりです。
| タイプ | 説明 | タイプ例 | 値の例 |
|---|---|---|---|
NumberType | 数値タイプ | t.number | 123 |
StringType | 文字列タイプ | t.string | "こんにちは世界!" |
BooleanType | ブールタイプ | t.boolean | 真実 |
LiteralType | リテラル値タイプ | t.literal(123) | 123 |
ArrayType | 配列タイプ | t.array(t.number) | [1、2、3] |
UnionType | ユニオンタイプ(複数の可能な値) | t.union([t.literal('yes'), t.literal('no')]) | "はい、もしくは、いいえ" |
InterfaceType | インターフェイス/辞書タイプ | t.type({a: t.number, b: t.number}) | {a:1、b:2} |
CodeType | コードタイプ | t.code('python') | 「def hello_world():print( 'hello、world!')」 |
各タイプには、手元のタスクを理解し、出力を適切にフォーマットするためにAskitが使用する特定のプロパティがあります。
執筆時点で、コード生成機能はTypeScriptでのみ利用可能です。ただし、この強力な機能をJavaScriptの領域に拡張するための努力が本格的です。要件が暫定的にコード生成の使用を要求する場合は、さらに更新するまでTypeScriptを使用することをお勧めします。
私たちの行動規範とプル要求を送信するプロセスの詳細については、貢献を参照してください。md。
このプロジェクトは、MITライセンスの下でライセンスされています。詳細については、ライセンスファイルを参照してください。
@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 }
}