AskIt служит специальной библиотекой или специализированным языком, предназначенным для оптимизации использования больших языковых моделей (LLM), таких как GPT-4, Gemini, Claude, COHERE и LLama2. Это упрощает сложность оперативного проектирования и устраняет необходимость анализа ответов от LLM, делая задачи программирования более плавными.
Используя AskIt , вы можете развернуть LLM для множества задач, таких как:
pyaskit может использовать GPT, Gemini, Claude, COHERE или LLama2 в качестве бэкэнда. pyaskit работает через API OpenAI, API Gemini, API Claude и API COHERE или API LLama2. Помимо 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>
. Вы можете найти свой ключ API OpenAI на панели управления OpenAI.
Вам необходимо указать имя модели в качестве переменной среды 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
. API-интерфейс ask
, который принимает два аргумента — тип вывода и приглашение, — формирует выходные данные 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
позволяет выполнять параметризацию подсказок с использованием синтаксиса шаблона:
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 )
В этом случае API define
создает шаблонную функцию, которая инструктирует LLM перефразировать указанный текст. Вызов функции paraphrase
с помощью «Hello World!» вернет перефразированную версию этого текста. Запуск этого кода может вывести что-то вроде «Привет, Планета!».
API define
позволяет напрямую создавать собственные функции, чтобы использовать возможности больших языковых моделей для решения различных задач. Дополнительные примеры можно найти в каталоге примеров.
Определенные задачи, например те, которые требуют данных в реальном времени, внешних ресурсов, таких как доступ к сети, доступ к файлам или доступ к базе данных, не подходят для выполнения 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 )
В этом сценарии вам нужно вызвать compile()
только для функции, возвращаемой API define
. Функция 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"
В этом примере API define
принимает три аргумента: тип вывода, приглашение и примеры обучения. Каждая запись в списке обучающих примеров представляет собой словарь, содержащий «входной» словарь (с именами и значениями переменных) и «выходной», представляющий ожидаемый результат функции с учетом входных данных. Затем API define
возвращает функцию, которая принимает входные переменные в качестве аргументов ключевого слова и выводит выходные данные 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). Предоставляя эти типы в качестве первого аргумента API-интерфейсам ask
и define
, вы можете управлять форматом вывода 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) | {'а': 1, 'б': 2} |
tuple | Кортеж | t.tuple(t.int, t.str) | (1, «абв») |
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 }
}