AskIt은 GPT-4, Gemini, Claude, COHERE 및 LLama2와 같은 LLM(대형 언어 모델)의 활용을 간소화하도록 설계된 전용 라이브러리 또는 도메인별 언어 역할을 합니다. 이는 프롬프트 엔지니어링의 복잡성을 단순화하고 LLM의 응답을 구문 분석하기 위한 요구 사항을 근절하여 프로그래밍 작업을 보다 원활하게 만듭니다.
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
파일에서도 사용 가능한 모델을 찾을 수 있습니다.
Llama 2와 함께 AskIt을 사용하기 전에 먼저 설치해야 합니다. Llama 2를 설치하려면 터미널에서 다음 명령을 실행하세요.
pip install git+https://github.com/facebookresearch/llama.git
또한 사용하려는 모델의 토크나이저 모델과 체크포인트도 다운로드해야 합니다. 자세한 내용은 라마 2 문서를 참고하세요.
예제 디렉터리에서는 Llama 2와 함께 AskIt을 사용하는 예를 제공합니다. 예제를 실행하려면 터미널에서 다음 명령을 실행하세요.
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은 LLM(언어 학습 모델)의 출력 유형을 지정하는 API를 제공합니다. 이러한 유형을 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 | Union(여러 가능한 값) | t.union(t.literal('yes'), t.literal('no')) | "예" 또는 "아니요" |
t.literal('yes') | t.literal('no') | "예" 또는 "아니요" | ||
t.literal('yes', 'no') | "예" 또는 "아니요" | ||
None | 없음 | None | 없음 |
각 유형 선언은 AskIt이 원하는 출력을 구문 분석하고 이해하는 데 도움이 되어 LLM이 필요한 정확한 형식으로 데이터를 반환하도록 보장합니다.
프롬프트 템플릿은 정의되는 함수의 매개변수에 대한 자리 표시자로 구성된 문자열입니다. 자리 표시자는 이중 중괄호 {{
및 }}
로 표시되며 변수 이름만 포함할 수 있습니다. 이 변수 이름은 정의된 함수에서 매개변수로 사용됩니다.
함수 매개변수는 키워드 인수 또는 위치 인수라는 두 가지 방법으로 정의할 수 있습니다. 키워드 인수의 경우 자리 표시자 내의 변수 이름이 키워드 인수의 이름 역할을 합니다. 위치 인수의 경우 자리 표시자가 나타나는 순서에 따라 위치 인수의 순서가 정의됩니다.
두 인수 x
및 y
를 받아들이고 해당 합계를 반환하는 함수 add
정의하는 방법을 보여주는 다음 예제를 고려하세요.
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 }
}