Askit-это языковой плагин для TypeScript, который позволяет вам использовать возможности большой языковой модели (LLM), такой как GPT-4, непосредственно в вашей среде программирования, не требуется сложные API. Обширный диапазон приложений Askit включает в себя:
Построенный на API OpenAI, Askit предоставляет удобный интерфейс для включения LLMS в ваши приложения. Вы можете использовать Askit не только в TypeScript, но и в JavaScript и Python.
Для интеграции Askit с JavaScript, пожалуйста, обратитесь к соответствующему разделу JavaScript.
Если Python является вашим предпочтительным языком, вы можете узнать больше о том, как использовать Askit , посетив нашу специальную страницу Askit (Pyaskit).
Управление выводом с типами: Получите ответ в указанном типе.
Определение функции на основе шаблонов: Определите функции с использованием шаблона приглашения.
Генерация кода: генерируйте функции из унифицированного интерфейса. Смотрите генерацию кода с Askit для получения более подробной информации.
Программирование по примеру (PBE): определить функции с использованием примеров. См. Программирование по примеру с Askit для получения более подробной информации.
Перед началом убедитесь, что Node.js и NPM установлены в вашей системе. Затем выполните следующую команду:
npm install ts-askit Этот пакет опирается на ts-patch . Чтобы установить ts-patch , запустите:
npx ts-patch install Добавьте следующий фрагмент в свой tsconfig.json :
"compilerOptions" : {
"plugins" : [{ "transform" : " ts-askit/transform " }]
} Эта модификация позволяет компилятору TypeScript поддерживать параметры типа для ask и define API в Askit.
Пакет ts-patch имеет решающее значение для раскрытия полного потенциала Askit, поскольку он расширяет компилятор TypeScript для полной интеграции системы типа Askit. В то время как Askit может использоваться без ts-patch , эта интеграция предлагает более богатый функциональный опыт.
Перед использованием Askit вам необходимо установить свой ключ API OpenAI в качестве переменной среды OPENAI_API_KEY :
export OPENAI_API_KEY= < your OpenAI API key > <your OpenAI API key> -это строка, которая выглядит следующей: sk-<your key> . Вы можете найти свой ключ API на приборной панели Openai.
Вы также можете указать имя модели как переменную среды ASKIT_MODEL :
export ASKIT_MODEL= < model name > <model name> - это имя модели, которую вы хотите использовать. Последний Askit проверяется с gpt-4 и gpt-3.5-turbo-16k . Вы можете найти список доступных моделей в документации API OpenAI.
Вот несколько вступительных примеров:
import { ask } from 'ts-askit' ;
ask < string > ( 'Paraphrase "Hello World!"' ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; В этом примере ask - это функция API, которая позволяет вашей программе представлять запросы для большой языковой модели (LLM). Параметр типа представляет ожидаемый выходной тип из LLM. Здесь выходной тип - это string . Подсказка передается как аргумент в естественном языке, описывающий задачу для LLM. ask асинхронно, возвращая Promise указанного вывода. Приведенный выше код должен распечатать что -то вроде этого:
Greetings, Universe!
Для приглашения с параметрами вы можете использовать define API следующим образом:
import { define } from 'ts-askit' ;
const paraphrase = define < string > ( 'Paraphrase {{text}}' ) ;
paraphrase ( { text : 'Hello World!' } ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; define - это функция API, которая позволяет определить пользовательскую функцию. Его параметр типа указывает выходной тип LLM и, следовательно, возвращаемое значение функции. Функция получает струнный шаблон в качестве аргумента, служащий подсказкой задачи LLM. Шаблон может включать параметры, заключенные в двойные вьющиеся скобки. В примере выше, text является параметром в шаблоне, и это может быть любой действительный идентификатор JavaScript.
Как только функция определена, ее можно вызвать, как любая другая функция. Эта функция принимает объект как аргумент, который отображает значения параметров шаблона. В этом случае text карты на строку «Hello World!».
Askit искусен при создании кода из описаний естественного языка. Вот пример:
import { define } from 'ts-askit' ;
const sort = define < number [ ] , { numbers : number [ ] } > (
'Sort {{numbers}} in ascending order'
) ; Этот пример демонстрирует функцию, которая сортирует массив чисел в порядке возрастания, используя define API для обучения LLM определять функцию. Несмотря на эффективность в концепции, этот метод может показаться вычислительно тяжелым, поскольку каждый вызов функции требует новой задачи LLM.
Чтобы упростить этот процесс, мы можем использовать LLM для создания кода функции сортировки, а не прибегать к LLM для каждой задачи сортировки. Это оптимизирует функцию, не требуя каких -либо изменений в ее реализации, благодаря возможностям генерации кодов Askit .
Код для вышеупомянутой функции может быть сгенерирован в трех шагах:
tsc . Анализатор Askit сканирует код и генерирует файл JSONL, содержащий подробную информацию о define и ask вызовы API.npx askgen < jsonl file >tsc . На этот раз вызовы define и ask » заменяются ссылками и вызовами в недавно сгенерированную функцию, соответственно, благодаря функции автоматического замены Askit . Askit позволяет вам использовать способность программирования по примеру (PBE). PBE упрощает процесс программирования, позволяя вам определять функциональность с помощью примеров, а не с твердой кодированной логикой. Следующий пример иллюстрирует это, показывая, как добавить два двоичных номера с помощью PBE с 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 ( ) ; В этом примере мы определяем функцию addInBase2 , которая принимает два двоичных числа (представленные как строки), и добавляет их. Функция define вызывается с помощью подсказки и двух массивов примеров: обучающие примеры и тестовые примеры. Примеры обучения отражаются в приглашении в нескольких выстрелах. С другой стороны, тестовые примеры используются для проверки правильности сгенерированной функции. Тестовые примеры не требуются, если вы не генерируете код для функции.
Результатом является мощная функция, позволяющая вам указать LLM выполнять сложные операции, такие как бинарное дополнение, используя только примеры. Этот подход позволяет быстро и быстро и с менее явной логикой разрабатывает сложную функциональность.
Как только функция addInBase2 определена, вы можете вызвать ее с помощью двоичных строк номеров, чтобы выполнить дополнение в базе 2. Как и в случае с традиционными вызовами функций, операция Askit 's ask возвращает обещание, которое разрешает с вычисленным результатом.
Разработчики JavaScript могут полностью использовать потенциал управления выводом, предлагаемым Askit . Так же, как и его родственник, JavaScript включает в себя метод API ask добиться этого. Функция ask принимает два параметра: тип и подсказка.
Вот множество примеров, демонстрирующих его использование:
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 ) } ) ; В приведенном выше фрагменте кода функция ask вызывается типом и подсказкой. Параметр типа служит целью информирования Askit о формате и структуре желаемого вывода. Это становится чрезвычайно удобным, когда вы имеете дело со сложными структурами данных.
С помощью Askit разработчики JavaScript имеют возможность определять функции с использованием простых для понимания шаблонов. Метод define является героем за кулисами здесь, поскольку он помогает создавать функции на основе предоставленного шаблона задачи. После создания эти функции могут быть вызваны с любым объектом, который предоставляет значения для заполнителей в шаблоне.
Вот пример того, как это делается:
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 ) } ) ; В приведенном выше коде метод define используется для установления функции f с использованием шаблона задачи 'translate {{text}} в {{rangue}}'. Функция f затем вызывается объектом, который предоставляет значения для text и language .
Модуль 'ts-askit/types' -это сокровищница типов, которые вы можете использовать для руководства выводом Askit . Вот стол, который поможет вам быстро понять эти типы:
| Тип | Описание | Тип примера | Пример значения |
|---|---|---|---|
NumberType | Числовой тип | t.number | 123 |
StringType | Тип строки | t.string | "Привет, мир!" |
BooleanType | Логический тип | t.boolean | истинный |
LiteralType | Буквальный тип значения | t.literal(123) | 123 |
ArrayType | Тип массива | t.array(t.number) | [1, 2, 3] |
UnionType | Тип объединения (множество возможных значений) | t.union([t.literal('yes'), t.literal('no')]) | "Да или нет" |
InterfaceType | Интерфейс/тип словаря | t.type({a: t.number, b: t.number}) | {a: 1, b: 2} |
CodeType | Тип кода | t.code('python') | "def hello_world (): print ('Привет, мир!')" |
Каждый тип обладает определенными свойствами, которые Askit использует для понимания задачи под рукой и должным образом отформатировать выход.
На момент написания работы функция генерации кода доступна исключительно в TypeScript. Тем не менее, усилия в полном разгаре, чтобы расширить эту мощную функцию до царства JavaScript. Если ваши требования требуют использования генерации кода на промежуточном промежутке, мы рекомендуем использовать TypeScript до дальнейших обновлений.
Для получения подробной информации о нашем кодексе поведения и процессе отправки запросов на привлечение, пожалуйста, обратитесь к Anforming.md.
Этот проект лицензирован по лицензии MIT. Для получения дополнительной информации см. Файл лицензии.
@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 }
}