AskIT는 TypeScript 용 언어 플러그인으로, GPT-4와 같은 LLM (Lange Language Model)의 기능을 프로그래밍 환경 내에서 직접 활용할 수 있으며 복잡한 API가 필요하지 않습니다. Askit의 광범위한 응용 프로그램에는 다음이 포함됩니다.
OpenAI API에 구축 된 AskIT는 LLM을 응용 프로그램에 통합하기위한 사용자 친화적 인 인터페이스를 제공합니다. TypeScript뿐만 아니라 JavaScript 및 Python에서 AskIT를 사용할 수 있습니다.
AskIT를 JavaScript와 통합하려면 해당 JavaScript 섹션을 참조하십시오.
Python이 선호하는 언어 인 경우 전용 Askit (Pyaskit) 페이지를 방문하여 Askit을 활용하는 방법에 대해 자세히 알아볼 수 있습니다.
유형 유도 출력 제어 : 지정된 유형에서 응답을 얻습니다.
템플릿 기반 기능 정의 : 프롬프트 템플릿을 사용하여 함수를 정의합니다.
코드 생성 : 통합 인터페이스에서 기능을 생성합니다. 자세한 내용은 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 에 대한 유형 매개 변수를 지원하고 ASKIT에서 API를 define .
ts-patch 패키지는 AskIT 유형 시스템을 완전히 통합하기 위해 TypeScript 컴파일러를 확장하기 때문에 ASKIT의 잠재력을 최대한 발휘하는 데 중요합니다. Askit은 ts-patch 없이 사용할 수 있지만이 통합은보다 기능이 풍부한 경험을 제공합니다.
AskIT를 사용하기 전에 OpenAI API 키를 환경 변수 OPENAI_API_KEY 로 설정해야합니다.
export OPENAI_API_KEY= < your OpenAI API key > <your OpenAI API key> 다음과 같이 보이는 문자열입니다. sk-<your key> . OpenAi 대시 보드에서 API 키를 찾을 수 있습니다.
모델 이름을 환경 변수로 지정할 수도 있습니다. ASKIT_MODEL :
export ASKIT_MODEL= < model name > <model name> 은 사용하려는 모델의 이름입니다. 최신 ASKIT는 gpt-4 및 gpt-3.5-turbo-16k 로 테스트됩니다. OpenAI API 문서에서 사용 가능한 모델 목록을 찾을 수 있습니다.
몇 가지 소개 예는 다음과 같습니다.
import { ask } from 'ts-askit' ;
ask < string > ( 'Paraphrase "Hello World!"' ) . then ( ( result ) => {
console . log ( result ) ;
} ) ; 이 예에서 ask 는 프로그램이 LLM (Lange Language Model)에 쿼리를 할 수있는 API 기능입니다. 유형 매개 변수는 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 분석기는 코드를 스캔하고 define 및 API ask 에 대한 세부 정보가 포함 된 JSONL 파일을 생성합니다.npx askgen < jsonl file >tsc 로 코드를 다시 컴파일하십시오. 이번에는 AskIT 의 자동 교체 기능 덕분에 define 및 ask API 통화는 각각 새로 생성 된 기능에 대한 참조 및 호출로 대체됩니다. Askit을 사용하면 예제 (PBE)로 프로그래밍의 힘을 활용할 수 있습니다. PBE는 하드 코딩 된 로직이 아닌 예제를 통해 기능을 정의 할 수있게하여 프로그래밍 프로세스를 단순화합니다. 다음 예제는 AskIT를 사용하여 PBE를 사용하여 2 개의 이진 번호를 추가하는 방법을 보여줌으로써이를 보여줍니다.
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에 예제 만 사용하여 이진 첨가와 같은 복잡한 작업을 수행하도록 LLM에 지시 할 수있는 강력한 기능입니다. 이 접근 방식을 사용하면 복잡한 기능을 빠르고 덜 명시적인 논리로 개발할 수 있습니다.
addInBase2 함수가 정의되면 이진 번호 문자열로 호출하여 기본 2에서 추가를 수행 할 수 있습니다. 기존 기능 호출과 마찬가지로 AskIT 의 ask Operation은 계산 된 결과로 해결되는 약속을 반환합니다.
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 설정하여 '{{text}}'로 {{ancegry}} '로 기능을 설정합니다. 그런 다음 함수 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 | Union 유형 (다중 가능한 값) | 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 ( 'hello, world!')" |
각 유형에는 AskIT가 현재 작업을 이해하고 출력을 올바르게 포맷하는 데 사용하는 특정 속성이 있습니다.
쓰기시기 현재 코드 생성 기능은 TypeScript에서만 사용할 수 있습니다. 그러나이 강력한 기능을 JavaScript 영역으로 확장하려는 노력이 본격화되고 있습니다. 요구 사항이 중간에 코드 생성 사용을 요구하는 경우 추가 업데이트가 될 때까지 TypeScript를 사용하는 것이 좋습니다.
당사의 행동 강령 및 풀 요청 제출 프로세스에 대한 자세한 내용은 Contributing.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 }
}