AskIT adalah plugin bahasa untuk naskah yang memungkinkan Anda memanfaatkan kemampuan model bahasa besar (LLM), seperti GPT-4, langsung dalam lingkungan pemrograman Anda, tidak ada API kompleks yang diperlukan. Berbagai aplikasi AskIt yang luas meliputi:
Dibangun di atas API OpenAI, Askit menyediakan antarmuka yang ramah pengguna untuk memasukkan LLM ke dalam aplikasi Anda. Anda dapat menggunakan Askit tidak hanya di TypeScript, tetapi juga di JavaScript dan Python.
Untuk mengintegrasikan AskIT dengan JavaScript, silakan merujuk ke bagian JavaScript yang sesuai.
Jika Python adalah bahasa pilihan Anda, Anda dapat mempelajari lebih lanjut tentang cara memanfaatkan Askit dengan mengunjungi halaman AskIT (Pyaskit) khusus kami.
Kontrol Output yang Dipandu Jenis: Dapatkan respons dalam tipe yang ditentukan.
Definisi fungsi berbasis template: Tentukan fungsi menggunakan template prompt.
Pembuatan Kode: Menghasilkan Fungsi dari Antarmuka Terpadu. Lihat pembuatan kode dengan Askit untuk detail lebih lanjut.
Pemrograman dengan contoh (PBE): Tentukan fungsi menggunakan contoh. Lihat Pemrograman dengan contoh dengan Askit untuk detail lebih lanjut.
Sebelum memulai, pastikan bahwa Node.js dan NPM diinstal pada sistem Anda. Kemudian, jalankan perintah berikut:
npm install ts-askit Paket ini bergantung pada ts-patch . Untuk menginstal ts-patch , jalankan:
npx ts-patch install Tambahkan cuplikan berikut ke tsconfig.json Anda:
"compilerOptions" : {
"plugins" : [{ "transform" : " ts-askit/transform " }]
} Modifikasi ini memungkinkan kompiler TypeScript untuk mendukung parameter tipe untuk ask dan define API di askit.
Paket ts-patch sangat penting untuk melepaskan potensi penuh dari Askit, karena memperluas kompiler TypeScript untuk sepenuhnya mengintegrasikan sistem tipe Askit. Sementara AskIT dapat digunakan tanpa ts-patch , integrasi ini menawarkan pengalaman yang lebih kaya fitur.
Sebelum menggunakan askit , Anda perlu mengatur kunci API openai Anda sebagai variabel lingkungan OPENAI_API_KEY :
export OPENAI_API_KEY= < your OpenAI API key > <your OpenAI API key> adalah string yang terlihat seperti ini: sk-<your key> . Anda dapat menemukan kunci API Anda di dasbor OpenAI.
Anda juga dapat menentukan nama model sebagai variabel lingkungan ASKIT_MODEL :
export ASKIT_MODEL= < model name > <model name> adalah nama model yang ingin Anda gunakan. AskIT terbaru diuji dengan gpt-4 dan gpt-3.5-turbo-16k . Anda dapat menemukan daftar model yang tersedia dalam dokumentasi API OpenAI.
Berikut adalah beberapa contoh pengantar:
import { ask } from 'ts-askit' ;
ask < string > ( 'Paraphrase "Hello World!"' ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; Dalam contoh ini, ask adalah fungsi API yang memungkinkan program Anda mengajukan kueri ke model bahasa besar (LLM). Parameter tipe mewakili tipe output yang diharapkan dari LLM. Di sini, tipe output adalah string . Prompt disahkan sebagai argumen dalam bahasa alami, menggambarkan tugas untuk dilakukan LLM. ask asynchronous, mengembalikan Promise tipe output yang ditentukan. Cuplikan kode di atas harus mencetak sesuatu seperti ini:
Greetings, Universe!
Untuk prompt dengan parameter, Anda dapat menggunakan API define sebagai berikut:
import { define } from 'ts-askit' ;
const paraphrase = define < string > ( 'Paraphrase {{text}}' ) ;
paraphrase ( { text : 'Hello World!' } ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; define adalah fungsi API yang memungkinkan Anda untuk mendefinisikan fungsi khusus. Parameter jenisnya menunjukkan jenis output LLM, dan akibatnya, nilai pengembalian fungsi. Fungsi menerima template string sebagai argumen, berfungsi sebagai prompt tugas LLM. Templat dapat mencakup parameter yang tertutup dalam kawat gigi keriting ganda. Dalam contoh di atas, text adalah parameter dalam templat, dan dapat berupa pengidentifikasi javascript yang valid.
Setelah fungsi didefinisikan, ia dapat dipanggil seperti fungsi lainnya. Fungsi ini menerima objek sebagai argumen, yang memetakan ke nilai parameter template. Dalam hal ini, peta text ke string 'Hello World!'.
Askit mahir membuat kode dari deskripsi bahasa alami. Inilah contohnya:
import { define } from 'ts-askit' ;
const sort = define < number [ ] , { numbers : number [ ] } > (
'Sort {{numbers}} in ascending order'
) ; Contoh ini menampilkan fungsi yang mengurutkan array angka dalam urutan menaik, menggunakan API define untuk menginstruksikan LLM untuk menentukan fungsi. Meskipun efisien dalam konsep, metode ini mungkin tampak berat secara komputasi karena setiap panggilan fungsi memerlukan tugas LLM baru.
Untuk merampingkan proses ini, kita dapat memanfaatkan LLM untuk menghasilkan kode fungsi penyortiran, daripada menggunakan LLM untuk setiap tugas penyortiran. Ini mengoptimalkan fungsi tanpa memerlukan perubahan dalam implementasinya, berkat kemampuan pembuatan kode AskIT .
Kode untuk fungsi yang disebutkan di atas dapat dihasilkan dalam tiga langkah:
tsc . Askit Analyzer memindai kode dan menghasilkan file JSONL yang berisi detail tentang define and ask API Calls.npx askgen < jsonl file >tsc . Kali ini, panggilan API define and ask digantikan oleh referensi dan panggilan ke fungsi yang baru dihasilkan, masing-masing, berkat fitur penggantian otomatis Askit . AskIT memungkinkan Anda untuk memanfaatkan kekuatan pemrograman dengan contoh (PBE). PBE menyederhanakan proses pemrograman dengan memungkinkan Anda untuk mendefinisikan fungsionalitas melalui contoh daripada logika kode keras. Contoh berikut menggambarkan hal ini dengan menunjukkan kepada Anda cara menambahkan dua nomor biner menggunakan PBE dengan Askit .
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 ( ) ; Dalam contoh ini, kami mendefinisikan fungsi addInBase2 yang mengambil dua angka biner (direpresentasikan sebagai string) dan menambahkannya. Fungsi define dipanggil dengan prompt dan dua array contoh: contoh pelatihan dan contoh tes. Contoh pelatihan tercermin dalam prompt dengan cara pembelajaran beberapa tembakan. Di sisi lain, contoh tes digunakan untuk memvalidasi kebenaran fungsi yang dihasilkan. Contoh tes tidak diperlukan jika Anda tidak menghasilkan kode untuk fungsi tersebut.
Hasilnya adalah fitur yang kuat yang memungkinkan Anda untuk menginstruksikan LLM untuk melakukan operasi yang kompleks, seperti penambahan biner, tidak menggunakan contoh apa pun. Pendekatan ini memungkinkan Anda untuk mengembangkan fungsionalitas yang kompleks dengan cepat dan dengan logika yang kurang eksplisit.
Setelah fungsi addInBase2 didefinisikan, Anda dapat menyebutnya dengan string nomor biner untuk melakukan penambahan di base 2. Seperti halnya panggilan fungsi tradisional, Operasi Ask ask Mengembalikan janji yang diselesaikan dengan hasil yang dihitung.
Pengembang JavaScript dapat sepenuhnya mengeksploitasi potensi kontrol output yang dipandu tipe yang ditawarkan oleh Askit . Sama seperti naskah saudara kandungnya, JavaScript menggabungkan metode API ask untuk mencapai ini. Fungsi ask mengambil dua parameter: tipe dan prompt.
Berikut adalah berbagai contoh yang menunjukkan penggunaannya:
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 ) } ) ; Dalam cuplikan kode di atas, fungsi ask dipanggil dengan jenis dan prompt. Parameter tipe melayani tujuan menginformasikan askit tentang format dan struktur output yang diinginkan. Ini menjadi sangat berguna ketika Anda berurusan dengan struktur data yang kompleks.
Dengan AskIT , pengembang JavaScript memiliki kemampuan untuk mendefinisikan fungsi menggunakan templat yang mudah dipahami. Metode define adalah pahlawan di balik layar di sini, karena membantu membuat fungsi berdasarkan templat tugas yang disediakan. Setelah dibuat, fungsi -fungsi ini dapat dipanggil dengan objek apa pun yang memberikan nilai untuk placeholder dalam templat.
Inilah contoh bagaimana hal itu dilakukan:
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 ) } ) ; Dalam kode di atas, metode define digunakan untuk membuat fungsi f menggunakan template tugas 'translate {{text}} menjadi {{bahasa}}'. Fungsi f kemudian dipanggil dengan objek yang menyediakan nilai untuk text dan language .
Modul 'ts-askit/types' adalah tipe harta yang dapat Anda manfaatkan untuk memandu output Askit . Berikut adalah meja untuk membantu Anda dengan cepat memahami tipe ini:
| Jenis | Keterangan | Jenis contoh | Contoh nilai |
|---|---|---|---|
NumberType | Tipe numerik | t.number | 123 |
StringType | Tipe string | t.string | "Halo, dunia!" |
BooleanType | Tipe boolean | t.boolean | BENAR |
LiteralType | Tipe nilai literal | t.literal(123) | 123 |
ArrayType | Jenis array | t.array(t.number) | [1, 2, 3] |
UnionType | Tipe Union (beberapa nilai yang mungkin) | t.union([t.literal('yes'), t.literal('no')]) | "ya" atau "tidak" |
InterfaceType | Jenis Antarmuka/Kamus | t.type({a: t.number, b: t.number}) | {A: 1, B: 2} |
CodeType | Jenis Kode | t.code('python') | "def hello_world (): print ('hello, world!')" |
Setiap jenis memiliki properti spesifik yang dimanfaatkan untuk memahami tugas yang dihadapi dan memformat output dengan benar.
Pada saat penulisan, fitur pembuatan kode secara eksklusif tersedia di TypeScript. Namun, upaya berjalan lancar untuk memperluas fitur yang kuat ini ke ranah JavaScript. Jika kebutuhan Anda membutuhkan penggunaan pembuatan kode untuk sementara, kami sarankan menggunakan TypeScript sampai pembaruan lebih lanjut.
Untuk perincian tentang kode perilaku kami dan proses untuk mengirimkan permintaan tarik, silakan merujuk ke Contributing.md.
Proyek ini dilisensikan di bawah lisensi MIT. Untuk informasi lebih lanjut, lihat file lisensi.
@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 }
}