AskIt作為專用函式庫或特定領域語言,旨在簡化大型語言模型 (LLM)(例如 GPT-4、Gemini、Claude、COHERE 和 LLama2)的使用。它簡化了即時工程的複雜性,並消除了解析法學碩士回應的要求,使程式設計任務更加順利。
使用AskIt ,您可以為多種任務部署 LLM,例如:
pyaskit可以使用 GPT、Gemini、Claude、COHERE 或 LLama2 作為後端。 pyaskit透過 OpenAI API、Gemini API、Claude API 和 COHERE API 或 LLama2 API 運作。除了 Python 之外, AskIt也已經用 TypeScript 實作了。您可以存取 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
若要安裝AskIt ,請在終端機中執行以下命令:
pip install pyaskit
或者
pip install git+https://github.com/katsumiok/pyaskit.git
在使用AskIt之前,您需要將 API 金鑰設定為適當的環境變數:
OPENAI_API_KEY
GOOGLE_API_KEY
ANTHROPIC_API_KEY
CO_API_KEY
GROQ_API_KEY
例如,要使用 OpenAI API,您需要將 OpenAI API 金鑰設定為環境變數OPENAI_API_KEY
:
export OPENAI_API_KEY= < your OpenAI API key >
<your OpenAI API key>
是一個如下所示的字串: sk-<your key>
。您可以在 OpenAI 儀表板中找到您的 OpenAI API 金鑰。
您需要將模型名稱指定為環境變數ASKIT_MODEL
:
export ASKIT_MODEL= < model name >
<model name>
是您要使用的模型的名稱。最新的 AskIt 使用gpt-4
、 gpt-3.5-turbo-16k
、 gemini-pro
、 claude-2.1
和cohere-2.0
進行了測試。您可以在 OpenAI API 文件、Gemini API 文件、Claude API 文件和 COHERE API 文件中找到可用模型的清單。您也可以在models.py
檔案中找到可用的模型。
在將AskIt與 Llama 2 一起使用之前,您需要安裝它。若要安裝 Llama 2,請在終端機中執行以下命令:
pip install git+https://github.com/facebookresearch/llama.git
您還需要下載分詞器模型以及要使用的模型的檢查點。請參閱 Llama 2 文件以了解更多詳細資訊。
我們在範例目錄中提供了將AskIt與 Llama 2 一起使用的範例。若要執行此範例,請在終端機中執行以下命令:
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
以下是一些基本範例,可協助您熟悉AskIt :
import pyaskit as ai
s = ai . ask ( str , 'Paraphrase "Hello World!"' )
print ( s )
若要使用AskIt ,請先匯入pyaskit
模組。 ask
API 採用兩個參數 - 輸出類型和提示 - 以指定格式產生 LLM 的輸出。在本例中,輸出類型為str
,提示字元為Paraphrase "Hello World!"
。類型部分提供了AskIt中類型的全面解釋。執行此程式碼將產生提示的解釋,例如:
Greetings, Planet!
function
裝飾器function
裝飾器允許使用提示模板定義函數。已定義函數的參數可用作提示範本的參數。例如,
from pyaskit import function
@ function ( codable = False )
def paraphrase ( text : str ) -> str :
"""Paraphrase {{text}}"""
s = paraphrase ( 'Hello World!' )
print ( s )
其中{{text}}
代表模板參數,對應函數參數。
define
API define
API 允許使用模板語法進行提示參數化:
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 )
在本例中, define
API 建立一個模板化函數,指示 LLM 解釋指定的文字。使用「Hello World!」呼叫paraphrase
功能將傳回該文本的釋義版本。執行此程式碼可能會輸出類似「Greetings, Planet!」的內容。
define
API 允許直接建立自訂函數,以利用大型語言模型的功能來執行不同的任務。更多範例可以在範例目錄中找到。
某些任務,例如需要即時資料、網路存取、檔案存取或資料庫存取等外部資源的任務,不適合 LLM 執行。然而, AskIt可以透過在後台將提示轉換為 Python 程式來處理這些任務。
接下來的範例示範如何使用AskIt來處理需要網路存取的任務:
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 )
在這種情況下,您只需要對define
API傳回的函數呼叫compile()
。 compile
函數將提示符轉換為 Python 程式並傳回執行此程式碼的函數,其行為就像常規 Python 函數一樣。
雖然上面的範例沒有指定參數url
的類型,但 AskIt提供了defun
API 來執行此操作。以下程式碼示範如何定義一個函數,其中參數url
的類型指定為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 )
defun
API 的第二個參數是一個字典,它將參數名稱對應到其類型。
我們可以用下面的程式碼做同樣的事情:
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 )
語言學習模型 (LLM) 提供了少量學習的優勢,這是AskIt在程式設計任務中使用的功能。 AskIt可讓您使用範例程式設計 (PBE) 技術來解決任務,您可以在其中提供所需輸入和輸出的範例。
讓我們考慮創建一個函數來添加兩個二進制數(表示為字串)。該函數接受兩個二進制數並傳回它們的和,也是二進位形式。以下程式碼使用說明性範例演示了定義此類函數。
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"
在此範例中, define
API 採用三個參數:輸出類型、提示和訓練範例。訓練範例清單中的每個條目都是字典,其中包含一個「輸入」字典(帶有變數名稱和值)和一個表示給定輸入的預期函數輸出的「輸出」。然後, define
API 傳回一個函數,該函數接受輸入變數作為關鍵字參數,並以指定類型輸出 LLM 的輸出。
add_binary_numbers
函數將兩個二進位數相加,其行為與任何常規 Python 函數類似。
您可以使用compile
函數使用可選的測試範例清單來測試產生的函數。
以下程式碼示範如何使用新的測試範例來測試上面定義的函數:
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"
這裡, f
是產生的函數,其運算類似add_binary_numbers
。透過將產生函數的輸出與每個測試範例的預期輸出進行比較, AskIt可確保產生函數的行為符合預期。如果出現任何差異, AskIt會重新嘗試翻譯。多次翻譯嘗試失敗後, AskIt會引發異常。
AskIt提供 API 來指定語言學習模型 (LLM) 的輸出類型。透過將這些類型作為ask
和define
API 的第一個參數提供,您可以管理 LLM 的輸出格式。您也可以使用 Python 提供的類型提示。
下表描述了AskIt支援的各種類型:
類型 | 描述 | 類型 範例 | 值範例 |
---|---|---|---|
int | 整數 | t.int | 123 |
float | 浮點數 | t.float | 1.23 |
bool | 布林值 | t.bool | 真的 |
str | 細繩 | t.str | “你好世界!” |
literal | 文字 | t.literal(123) | 123 |
list | 清單 | t.list(t.int) | [1,2,3] |
dict | 字典 | t.dict({ 'a': t.int, 'b': t.str }) | {'a': 1, 'b': "abc"} |
record | 字典 | t.record(t.str, t.int) | {'a':1,'b':2} |
tuple | 元組 | t.tuple(t.int, t.str) | (1、「abc」) |
union | 聯合(多個可能的值) | t.union(t.literal('yes'), t.literal('no')) | “是或不是” |
t.literal('yes') | t.literal('no') | “是或不是” | ||
t.literal('yes', 'no') | “是或不是” | ||
None | 沒有任何 | None | 沒有任何 |
請注意,每個類型聲明都有助於AskIt解析和理解所需的輸出,確保您的 LLM 以您所需的精確格式傳回資料。
提示模板是由所定義函數的參數的佔位符組成的字串。佔位符由雙大括號{{
和}}
表示,並且只能包含變數名稱。然後,該變數名稱將用作定義的函數中的參數。
函數參數可以透過兩種方式定義:透過關鍵字參數或透過位置參數。對於關鍵字參數,佔位符內的變數名稱用作關鍵字參數的名稱。對於位置參數,佔位符出現的順序定義了位置參數的順序。
考慮以下範例,此範例示範如何定義函數add
,該函數接受兩個參數x
和y
並傳回它們的總和:
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
在這種情況下,可以使用關鍵字或位置參數呼叫add
函數,並將x
和y
的總和作為輸出傳回。
值得注意的是,如果在提示範本中多次使用相同的變數名稱,則後續使用將對應到首次出現。在以下範例中觀察此行為:
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 ))
這裡, {{x}}
在提示範本中出現了兩次。第二次出現的{{x}}
映射回第一次出現。因此,即使{{z}}
是模板中的第四個佔位符,它也與函數的第三個參數對齊。
有關我們的行為準則以及向我們提交拉取請求的流程的詳細信息,請參閱 CONTRIBUTING.md。
該項目已獲得 MIT 許可證 - 有關詳細信息,請參閱 LICENSE.md 文件
如果您在研究中使用我們的軟體,請引用我們的論文:
@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 }
}