Botml은 최신 챗봇(대화형 봇이라고도 함)을 설계하기 위한 선언적이고 강력한 마크업 언어 입니다.
누구나(개발자 및 비개발자) 이를 사용하여 봇의 행동 방법을 만들고 가르칠 수 있습니다. 적절한 형식을 사용하여 챗봇의 동작을 정의하고 즉시 대화에 참여하세요. 직접 확인해 보세요. 단 두 줄로 작성된 계산기 봇입니다.
이 프로젝트에서는 node와 npm을 사용합니다. 로컬에 설치되어 있지 않은 경우 가서 확인하십시오.
$ npm i -g botml
그러면 botml
노드 패키지와 bot
클라이언트가 모두 설치됩니다.
선택적으로 Atom을 편집기로 사용하는 경우 language-botml
패키지를 사용하여 구문 강조를 설치할 수 있습니다.
CLI를 실행하십시오.
$ bot
또는 코드에서 사용하세요.
const Botml = require ( 'botml/lib/botml' )
const bot = new Botml ( 'alice.bot' )
bot . start ( )
또는 브라우저에서 정적으로 로드할 수도 있습니다.
< script src =' https://unpkg.com/botml ' > </ script >
< script >
const bot = new Botml ( )
// either load an URI:
// bot.load('https://raw.githubusercontent.com/codename-co/botml/master/examples/hello.bot')
// or load the script directly:
bot . parse ( '> *n< yes?n' )
bot . start ( )
bot . send ( 'hey' )
</ script >
기존 기능은 기본 봇 요구 사항을 충족하는 기본 기능과 보다 풍부한 대화 기능을 지원하는 고급 기능의 두 가지 종류로 구성됩니다.
기본 기능:
고급 기능:
이 형식은 최소한을 사용하여 최대를 달성하는 것을 목표로 합니다. 정확하고 최소한의 규칙만 적용하면 매우 강력해질 수 있습니다.
일반 구문은 3가지 중요한 규칙을 따릅니다.
가장 기본적인 .bot
파일은 다음과 같습니다.
! BOTML 1
> Hello
< Hello human!
Botml에게 파일을 로드할 수 있음을 알리려면 사양 행이 필요합니다.
이는 .bot
파일의 첫 번째 줄이어야 합니다 .
! BOTML 1
1
은 현재 버전의 형식을 나타냅니다.
댓글은 .bot
파일을 더 명확하게 만드는 데 도움이 됩니다.
독립형 블록으로 사용 하거나 실행 가능한 블록 내에 삽입할 수 있습니다.
인라인으로 사용할 수 없습니다 .
# COMMENT
대화는 모든 봇의 핵심 개념입니다. 이는 인간과 봇이 어떻게 상호 작용할 수 있는지 정의합니다.
대화는 봇이 응답하도록 활성화할 수 있는 문장을 정의하는 >
줄로 시작 해야 합니다 .
봇 응답을 정의한 뒤에는 하나 이상의 <
줄이 있어야 합니다 .
동일한 블록 내에서 이 순서를 반복하면 앞뒤로 여러 번 있을 수 있습니다 .
> MESSAGE
< MESSAGE
예:
> Hi
< Hello there. Who are you?
> *
< Nice to meet you.
대화의 무작위 응답은 봇의 경직성을 덜 느끼게 합니다. 사람에게 응답할 때 봇은 응답 후보 중에서 무작위로 선택합니다. 봇은 여러 응답 후보 중 하나만 선택할 수 있습니다.
> MESSAGE
< REPLY CANDIDATE #1
< REPLY CANDIDATE #2
예:
> Hello
< Hi there
< Howdy?
목록은 유사한 개념이나 대안을 모으는 데 도움이 됩니다.
목록은 목록 이름을 정의하는 =
행으로 시작 해야 합니다 .
목록 항목이 하나 이상 있어야 하지만 더 있을 수도 있습니다. 각 목록 항목은 -
기호로 시작됩니다.
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
목록 항목은 또 다른 목록을 참조 할 수 있습니다 .
= LIST_NAME
- LIST_ITEM
- [ANOTHER_LIST]
입력 패턴의 여러 변형을 참조하기 위해 >
행에서 참조 할 수 있습니다.
응답으로 목록 항목 중 하나를 무작위로 참조하기 위해 <
행에서 참조 할 수 있습니다.
?
에서 참조 할 수 있습니다. 미리 정의된 여러 선택 사항을 참조하기 위한 줄(프롬프트)입니다.
목록 참조는 목록 이름을 대괄호 [LIST_NAME]
로 묶어 수행됩니다.
예:
= citrus
- oranges
- lemons
- grapefruits
= random_fruit
- apples
- apricots
- bananas
- [citrus]
> I like [random_fruit]
< Oh. I prefer [random_fruit].
# which is the equivalent to:
# > I like apples
# > I like apricots
# > I like bananas
# > I like oranges
# > I like lemons
# > I like grapefruits
# < Oh. I prefer apples
# < Oh. I prefer apricots
# < Oh. I prefer bananas
# < Oh. I prefer oranges
# < Oh. I prefer lemons
# < Oh. I prefer grapefruits
#
# > I like [random_fruit]
# < Oh. I prefer [random_fruit].
목록은 프롬프트에서도 사용할 수 있습니다.
프롬프트는 특정 상황에 대한 반응으로 사전 정의된 빠른 응답입니다.
대화가 끝나면 <
줄 뒤에 배치 해야 합니다 .
모든 빠른 답장에 액세스하려면 목록을 참조 해야 합니다 .
빠른 응답 수는 최소화되어야 합니다 .
= LIST_NAME
- LIST_ITEM
- LIST_ITEM
? [LIST_NAME]
예:
= pizza_types
- Peperroni
- Margherita
- Hawaiian
> I need a pizza
< What kind of pizza?
? [pizza_types]
서비스는 외부 API 엔드포인트를 활용할 수 있습니다.
서비스는 @
기호로 시작하는 자체 블록에서 선언되어야 합니다 . 이는 이름과 JSON 형식의 API 엔드포인트(http 또는 https를 통해)로 구성됩니다.
엔드포인트 내에서 $
기호를 사용하여 매개변수를 허용 할 수 있으며 대부분의 경우 허용해야 합니다 .
@ SERVICE_NAME ENDPOINT
대화 내에서 소비될 수 있습니다.
ENDPOINT에 $
기호가 있는 경우 $
기호를 대체할 값의 매개변수를 허용 해야 합니다 .
서비스 호출 결과는 선택적 OUTPUT을 사용하여 필터링할 수 있습니다. 형식이 /(.w)+/
인 선택기입니다.
@ SERVICE_NAME( PARAMETER )[ OUTPUT ]
예:
@ geo_domain http://freegeoip.net/json/$
> Where is *{domain}
@ geo_domain($domain).city
< It is running from $.
스크립트를 사용하여 코드를 평가할 수 있습니다.
코드의 언어는 사용된 파서에 사용된 언어에 따라 다릅니다. botml
파서는 Javascript로 되어 있으므로 Javascript 코드를 사용할 수 있습니다.
```로 묶인 대화 상자 내에 인라인이어야 합니다 .
명명된 변수에 액세스 할 수 있습니다.
context.variables.get('price')
$price
예:
> It will cost you #{price} USD
< `$price / 1000`k USD is a lot!
변수는 의미 있는 정보를 감지, 형식화, 저장 및 재사용하는 방법입니다.
변수는 >
라인(대화상자) 내에서 캡처될 수 있습니다 .
텍스트( $
), 숫자( #
) 또는 영숫자( *
) 여야 합니다 .
<
줄에서 사용할 수 있습니다.
> My name is *{name}
< Nice to meet you, $name
> I am #{age} years old
< Seems that you are $age
변수 형식은 ${VARIABLE_NAME}
(숫자 및 영숫자 해당 항목 포함)입니다. 그러나 사용 편의성을 위해 $VARIABLE_NAME
형식을 텍스트 및 숫자 변수에도 사용할 수 있습니다.
특수 $
변수는 항상 대화의 마지막 일치 값 또는 이전 줄의 결과(예: 서비스 소비 결과)를 참조합니다.
>
줄에서 정규식을 사용하여 탐지할 대상을 더 효과적으로 제어할 수 있습니다.
정규 표현식은 /
로 묶어야 하며 기본 표현식과 혼합될 수 없습니다 .
> /^I (?:.+s)?(w+) (?:.+s)?(it|this)/
< Cool bro.
실제로 XRegExp 라이브러리는 내부적으로 사용되어 주요 명명된 캡처, 인라인 주석 및 모드 수정자에 대한 액세스를 제공합니다.
대화 작업 흐름은 기존 대화의 상위 집합입니다.
워크플로우를 사용하여 대화의 정확한 흐름을 결정할 수 있습니다.
목록 이름을 정의하는 ~
줄로 시작 해야 합니다 .
하나의 워크플로만 <
대화 상자로 시작할 수 있습니다 . 이러한 워크플로는 사용자가 봇에 연결할 때 기본적으로 활성화되어 사용됩니다.
# grocery shopping
> I want to buy *{items}
< How many $items?
> #{count} $items
> #{count}
< There you go.
조건부 분기는 테스트 조건에 따라 봇을 대화의 다른 부분으로 안내하는 지침입니다.
조건부 분기는 ---
로 시작하고 입력된 모든 정보를 수신한 다음 모든 경우에 대해 테스트합니다. 각 사례는 ---
로 구분됩니다.
---
> first input case
< first reply
---
> second input case
< second reply
---
> last input case
< last reply
조건부 분기는 checkpoint 라고 표시된 다른 기능과 잘 작동합니다.
체크포인트는 워크플로의 ~ CHECKPOINT_NAME
마커로, 현재 대화의 이후 단계에서 쉽게 돌아갈 수 있도록 해줍니다. 흐름을 체크포인트 표시로 리디렉션하는 ~ [CHECKPOINT_NAME]
으로 참조할 수 있습니다.
~ ask_howdy
< Hello stranger.
~ checkpoint_name
< How are you?
> meh
< So you feel bad huh
~ [checkpoint_name]
# Example of workflow working:
# < Hello stranger.
# < How are you?
# > meh
# < So you feel bad huh
# < How are you?
# > ...
체크포인트 와 목록 모두 조건부 분기 작업을 정말 흥미롭게 만듭니다.
= mood
- good
- meh
- great
- ok
= exceptions
- fantastic
- better than ever
~ ask_howdy
< hello stranger.
~ listen_howdy
< how are you?
? [mood]
---
> meh
< So you feel bad huh
~ [listen_howdy]
---
> good
< Oh, it is not bad ;)
~ [rechecker]
---
> [exceptions]
< Seems you really cool guy!
---
> ok
< Hmm, just ok? Okay then...
---
> great
< Nice! Let's continue then...
~ rechecker
< Maybe it is more than good?
> excellent
< Much better!
"같지 않음" 기호를 사용하는 것도 가능합니다 !
조건부 분기 에서 :
= mood
- [bad_mood]
- [good_mood]
= bad_mood
- meh
- bad
= good_mood
- great
- ok
~ ask_howdy
< hello stranger.
~ listen_howdy
< how are you?
? [mood]
---
> ![mood]
< I asked you how you are ; please let's start over with another answer?
~ [listen_howdy]
---
> [good_mood]
< Oh, it is awesome ;)
---
> [bad_mood]
< Hmm... bye then...
조건부 분기는 값이 반환되는 한 스크립트에서도 잘 작동합니다. 스크립트가 true
값을 반환하면 해당 분기가 활성화됩니다. 모든 테스트가 false
인 경우 조건 분기는 모든 분기를 건너뛰고 현재 워크플로를 계속 진행합니다.
~ ask_for_email
> start email workflow
~ listen_email
< Your email please?
> *{email}
---
` !/^.+@.+..+/.test('$email')
< This email $email seems not legit!
~ [listen_email]
---
< Cool. We'll reach you over at $email
트리거는 봇이 다른 프로그램과 통합되는 방법입니다.
이벤트에는 표준 이벤트와 사용자 정의 이벤트의 두 가지 유형이 있습니다.
표준 이벤트는 다음과 같습니다.
'start'
'patterns:set'
'match'
'current-dialogue-start'
:DialogLabel'reply'
: 메시지'smart-replies'
: 응답'current-dialogue-end'
:DialogLabel'variable:set'
'quit'
'*'
모든 표준 및 사용자 정의 이벤트를 포착합니다.사용자 정의 이벤트는 대화 상자 내에서 실행될 수 있습니다.
맞춤 이벤트에는 이름이 있어야 합니다 .
매개변수를 가질 수 있습니다. 매개변수는 명명된 변수에 의존 할 수 있습니다 .
@ trigger( 'EVENT_NAME' [, PARAMETER] )
예:
> hello
< hi
@ trigger('said_hi')
그런 다음 필요에 따라 코드에서 'said_hi' 이벤트를 처리합니다.
bot . on ( 'said_hi' , ( ) => console . log ( 'The bot said hi' ) ) ;
TokensRegex는 명명된 엔터티 및 품사 태깅과 같은 선험적 자연어 처리를 기반으로 고급 패턴을 정의하기 위한 프레임워크입니다.
> ([ner: PERSON]+) /was|is/ /an?/ []{0,3} /painter|artist/
< An accomplished artist you say.
이 기능은 코드 통합을 통해 활성화됩니다. 예를 참조하세요.
NLP는 코드 통합을 통해 활성화될 수 있습니다. 예를 참조하세요.
examples/
디렉토리를 참조하세요.
다음을 사용하여 단위 테스트를 시작합니다.
npm test
npm run autotest # this is for continuous testing
콘솔에서 botml 스크립트를 시도하려면 CLI를 사용하십시오.
node lib/cli.js
node lib/cli.js examples/echo.bot # load script from a local file
debug=true node lib/cli.js # add logging verbosity
CLI 모드에서는 몇 가지 특수 명령이 디버깅에도 도움이 될 수 있습니다.
자유롭게 다이빙해 보세요! 이슈를 열거나 PR을 제출하세요.
Botml은 MIT 라이센스를 받았습니다.