AskIt berfungsi sebagai perpustakaan khusus atau bahasa khusus domain yang dirancang untuk menyederhanakan pemanfaatan Model Bahasa Besar (LLM) seperti GPT-4, Gemini, Claude, COHERE, dan LLama2. Ini menyederhanakan kompleksitas rekayasa cepat dan menghilangkan kebutuhan untuk mengurai tanggapan dari LLM, membuat tugas pemrograman lebih lancar.
Dengan menggunakan AskIt , Anda dapat menerapkan LLM untuk banyak tugas, seperti:
pyaskit dapat menggunakan GPT, Gemini, Claude, COHERE, atau LLama2 sebagai backend. pyaskit beroperasi melalui OpenAI API, Gemini API, Claude API, dan COHERE API atau LLama2 API. Selain Python, AskIt juga telah diimplementasikan di TypeScript. Anda dapat mengakses versi TypeScript, ts-askit.
from pyaskit import ask
# Automatically parses the response to an integer
sum = ask ( int , "add 1 + 1" )
# `sum` is an integer with a value of 2
from typing import TypedDict , List
from pyaskit import ask
# Define a typed dictionary for programming languages
class PL ( TypedDict ):
name : str
year_created : int
# Automatically extracts structured information into a list of dictionaries
langs = ask ( List [ PL ], "List the two oldest programming languages." )
# `langs` holds information on the oldest programming languages in a structured format like
# [{'name': 'Fortran', 'year_created': 1957},
# {'name': 'Lisp', 'year_created': 1958}]
from pyaskit import function
@ function ( codable = False )
def translate ( s : str , lang : str ) -> str :
"""Translate {{s}} into {{lang}} language."""
s = translate ( "こんにちは世界。" , "English" )
# `s` would be "Hello, world."
from pyaskit import function
@ function ( codable = True )
def get_html ( url : str ) -> str :
"""Get the webpage from {{url}}."""
# When `codable` is set to True, the body of the function is automatically coded by an LLM.
html = get_html ( "https://github.com/katsumiok/pyaskit/blob/main/README.md" )
# `html` contains the HTML version of this README.md
Untuk menginstal AskIt , jalankan perintah ini di terminal Anda:
pip install pyaskit
atau
pip install git+https://github.com/katsumiok/pyaskit.git
Sebelum menggunakan AskIt , Anda perlu menyetel kunci API Anda sebagai variabel lingkungan yang sesuai:
OPENAI_API_KEY
GOOGLE_API_KEY
ANTHROPIC_API_KEY
CO_API_KEY
GROQ_API_KEY
Misalnya, untuk menggunakan OpenAI API, Anda perlu menyetel kunci OpenAI API 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 OpenAI Anda di dasbor OpenAI.
Anda perlu 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
, gpt-3.5-turbo-16k
, gemini-pro
, claude-2.1
, dan cohere-2.0
. Anda dapat menemukan daftar model yang tersedia di dokumentasi OpenAI API, dokumentasi Gemini API, dokumentasi Claude API, dan dokumentasi COHERE API. Anda juga dapat menemukan model yang tersedia di file models.py
.
Sebelum menggunakan AskIt dengan Llama 2, Anda perlu menginstalnya. Untuk menginstal Llama 2, jalankan perintah ini di terminal Anda:
pip install git+https://github.com/facebookresearch/llama.git
Anda juga perlu mengunduh model tokenizer dan checkpoint model yang ingin Anda gunakan. Silakan merujuk ke dokumentasi Llama 2 untuk detail lebih lanjut.
Kami memberikan contoh penggunaan AskIt dengan Llama 2 di direktori contoh. Untuk menjalankan contoh, jalankan perintah ini di terminal Anda:
torchrun --nproc_per_node 1 examples/use_llama2.py
--ckpt_dir llama-2-7b-chat/
--tokenizer_path tokenizer.model
--max_seq_len 512 --max_batch_size 6
Berikut adalah beberapa contoh dasar untuk membantu Anda membiasakan diri dengan AskIt :
import pyaskit as ai
s = ai . ask ( str , 'Paraphrase "Hello World!"' )
print ( s )
Untuk memanfaatkan AskIt , mulailah dengan mengimpor modul pyaskit
. ask
API, yang mengambil dua argumen - tipe output dan prompt - menghasilkan output LLM dalam format yang ditentukan. Dalam hal ini, tipe keluarannya adalah str
dan promptnya adalah Paraphrase "Hello World!"
. Penjelasan lengkap tentang tipe-tipe di AskIt disediakan di bagian Tipe. Mengeksekusi kode ini akan menghasilkan parafrase dari prompt, seperti:
Greetings, Planet!
function
dekorator Dekorator function
memungkinkan pendefinisian fungsi dengan templat prompt. Parameter dari fungsi yang ditentukan dapat digunakan sebagai parameter templat prompt. Misalnya,
from pyaskit import function
@ function ( codable = False )
def paraphrase ( text : str ) -> str :
"""Paraphrase {{text}}"""
s = paraphrase ( 'Hello World!' )
print ( s )
Dimana {{text}}
mewakili parameter templat dan sesuai dengan parameter fungsi.
define
API define
API memungkinkan parameterisasi cepat menggunakan sintaks templat:
import pyaskit as ai
paraphrase = ai . define ( str , 'Paraphrase {{text}}' )
s = paraphrase ( text = 'Hello World!' )
# s = paraphrase('Hello World!') # This is also valid
print ( s )
Dalam contoh ini, API define
membuat fungsi templat yang menginstruksikan LLM untuk memparafrasekan teks tertentu. Memanggil fungsi paraphrase
dengan 'Hello World!' akan mengembalikan versi parafrase dari teks ini. Menjalankan kode ini mungkin menghasilkan sesuatu seperti "Salam, Planet!".
define
API memungkinkan pembuatan fungsi kustom secara mudah guna memanfaatkan kemampuan model bahasa besar untuk beragam tugas. Contoh lebih lanjut dapat ditemukan di direktori contoh.
Tugas-tugas tertentu, seperti yang memerlukan data real-time, sumber daya eksternal seperti akses jaringan, akses file, atau akses database, tidak cocok untuk eksekusi LLM. Namun, AskIt dapat menangani tugas-tugas ini dengan mengubah prompt menjadi program Python di latar belakang.
Contoh berikut menunjukkan penggunaan AskIt untuk menangani tugas yang memerlukan akses jaringan:
import pyaskit as ai
get_html = ai . define ( str , 'Get the webpage from {{url}}' ). compile ()
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
Dalam skenario ini, Anda hanya perlu memanggil compile()
pada fungsi yang dikembalikan oleh API define
. Fungsi compile
mengubah prompt menjadi program Python dan mengembalikan fungsi yang mengeksekusi kode ini, berperilaku seperti fungsi Python biasa.
Meskipun contoh di atas tidak menentukan jenis parameter url
, AskIt menyediakan API defun
untuk melakukannya. Kode berikut menunjukkan cara mendefinisikan fungsi yang tipe parameter url
ditentukan sebagai str
:
import pyaskit as ai
get_html = ai . defun ( str , { "url" : str }, 'Get the webpage from {{url}}' ). compile ()
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
Argumen kedua dari defun
API adalah kamus yang memetakan nama parameter ke tipenya.
Kita dapat melakukan hal yang sama dengan kode berikut:
from pyaskit import function
@ function ( codable = True )
def get_html ( url : str ) -> str :
"""Get the webpage from {{url}}"""
html = get_html ( url = 'https://csail.mit.edu' )
print ( html )
Model Pembelajaran Bahasa (LLM) menawarkan keunggulan pembelajaran beberapa kali, kemampuan yang digunakan AskIt dalam tugas pemrograman. AskIt memungkinkan Anda menyelesaikan tugas menggunakan teknik Pemrograman dengan Contoh (PBE), di mana Anda memberikan contoh masukan dan keluaran yang diinginkan.
Mari kita pertimbangkan untuk membuat fungsi untuk menjumlahkan dua bilangan biner (direpresentasikan sebagai string). Fungsi ini menerima dua bilangan biner dan mengembalikan jumlahnya, juga dalam bentuk biner. Kode berikut mendemonstrasikan pendefinisian fungsi tersebut menggunakan contoh ilustratif.
from pyaskit import define
training_examples = [
{ "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" },
]
add_binary_numbers = define ( str , "Add {{x}} and {{y}}" , training_examples = training_examples )
sum_binary = add_binary_numbers ( x = "101" , y = "11" )
print ( sum_binary ) # Output: "1000"
Dalam contoh ini, API define
mengambil tiga argumen: tipe keluaran, perintah, dan contoh pelatihan. Setiap entri dalam daftar contoh pelatihan adalah kamus yang berisi kamus 'masukan' (dengan nama dan nilai variabel) dan 'keluaran' yang mewakili keluaran fungsi yang diharapkan berdasarkan masukan tersebut. define
API kemudian mengembalikan fungsi yang menerima variabel masukan sebagai argumen kata kunci dan mengeluarkan keluaran LLM dalam tipe yang ditentukan.
Fungsi add_binary_numbers
, yang menambahkan dua bilangan biner, berperilaku seperti fungsi Python biasa.
Anda dapat menggunakan fungsi compile
untuk menguji fungsi yang dihasilkan menggunakan daftar contoh pengujian opsional.
Kode berikut menunjukkan cara menguji fungsi yang ditentukan di atas dengan contoh pengujian baru:
test_examples = [
{ "input" : { "x" : "0" , "y" : "1" }, "output" : "1" },
{ "input" : { "x" : "10" , "y" : "0" }, "output" : "10" },
{ "input" : { "x" : "110" , "y" : "10" }, "output" : "1000" },
]
f = add_binary_numbers . compile ( test_examples = test_examples )
sum_binary = f ( x = "101" , y = "11" )
print ( sum_binary ) # Output: "1000"
Di sini, f
adalah fungsi yang dihasilkan yang beroperasi mirip dengan add_binary_numbers
. Dengan membandingkan keluaran fungsi yang dihasilkan dengan keluaran yang diharapkan untuk setiap contoh pengujian, AskIt memastikan fungsi yang dihasilkan berperilaku seperti yang diharapkan. Jika ada perbedaan yang muncul, AskIt akan mencoba menerjemahkannya kembali. Setelah beberapa kali upaya penerjemahan gagal, AskIt memunculkan pengecualian.
AskIt menawarkan API untuk menentukan tipe output untuk Model Pembelajaran Bahasa (LLM). Dengan menyediakan tipe ini sebagai argumen pertama ke API ask
dan define
, Anda dapat mengelola format keluaran LLM. Anda juga dapat menggunakan petunjuk tipe yang disediakan Python.
Tabel berikut menjelaskan berbagai tipe yang didukung oleh AskIt :
Jenis | Keterangan | Ketik Contoh | Contoh Nilai |
---|---|---|---|
int | Bilangan bulat | t.int | 123 |
float | Nomor Titik Mengambang | t.float | 1.23 |
bool | Boolean | t.bool | BENAR |
str | Rangkaian | t.str | "Halo Dunia!" |
literal | Harfiah | t.literal(123) | 123 |
list | Daftar | t.list(t.int) | [1, 2, 3] |
dict | Kamus | t.dict({ 'a': t.int, 'b': t.str }) | {'a': 1, 'b': "abc"} |
record | Kamus | t.record(t.str, t.int) | {'a': 1, 'b': 2} |
tuple | Tupel | t.tuple(t.int, t.str) | (1, "abc") |
union | Persatuan (Beberapa Nilai yang Mungkin) | t.union(t.literal('yes'), t.literal('no')) | "ya" atau "tidak" |
t.literal('yes') | t.literal('no') | "ya" atau "tidak" | ||
t.literal('yes', 'no') | "ya" atau "tidak" | ||
None | Tidak ada | None | Tidak ada |
Perhatikan bahwa setiap deklarasi jenis membantu AskIt dalam menguraikan dan memahami keluaran yang diinginkan, memastikan LLM Anda mengembalikan data dalam format tepat yang Anda perlukan.
Templat prompt adalah string yang terdiri dari placeholder untuk parameter fungsi yang ditentukan. Placeholder dilambangkan dengan kurung kurawal ganda {{
dan }}
dan hanya dapat berisi nama variabel. Nama variabel ini kemudian digunakan sebagai parameter dalam fungsi yang ditentukan.
Parameter fungsi dapat didefinisikan dengan dua cara: baik dengan argumen kata kunci atau dengan argumen posisi. Untuk argumen kata kunci, nama variabel dalam placeholder berfungsi sebagai nama argumen kata kunci. Untuk argumen posisi, urutan kemunculan placeholder menentukan urutan argumen posisi.
Perhatikan contoh berikut yang menunjukkan cara mendefinisikan suatu fungsi, add
, yang menerima dua argumen x
dan y
dan mengembalikan jumlahnya:
from pyaskit import define
import pyaskit . types as t
add = define ( t . int , '{{x}} + {{y}}' )
print ( add ( x = 1 , y = 2 )) # keyword arguments
print ( add ( 1 , 2 )) # positional arguments
Dalam hal ini, fungsi add
dapat dipanggil menggunakan argumen kata kunci atau posisi, dengan jumlah x
dan y
dikembalikan sebagai output.
Khususnya, jika nama variabel yang sama digunakan beberapa kali dalam template prompt, penggunaan selanjutnya akan dipetakan ke kemunculan awal. Amati perilaku ini dalam contoh berikut:
from pyaskit import define
import pyaskit . types as t
add = define ( t . int , '{{x}} + {{y}} + {{x}} + {{z}}' )
print ( add ( x = 1 , y = 2 , z = 3 ))
print ( add ( 1 , 2 , 3 ))
Di sini, {{x}}
muncul dua kali di template prompt. Kemunculan kedua dari {{x}}
dipetakan kembali ke kemunculan pertama. Oleh karena itu, meskipun {{z}}
adalah placeholder keempat dalam templat, ia selaras dengan argumen ketiga dari fungsi tersebut.
Lihat CONTRIBUTING.md untuk rincian tentang kode etik kami, dan proses pengajuan permintaan penarikan kepada kami.
Proyek ini dilisensikan di bawah Lisensi MIT - lihat file LICENSE.md untuk detailnya
Jika Anda menggunakan perangkat lunak kami dalam penelitian Anda, harap mengutip makalah kami:
@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 }
}