Wonop의 상하문 감지 채팅 로봇 사용하기
안녕하세요 전통세계.
rocklang
를 익히기 위해 우리는 전통적인 Hello world
예시를 만들었다.새 에이전트를 만들지 않은 경우 GUI의 Agents
로 이동하여 새 에이전트를 만듭니다.만든 후에 코드 편집기를 볼 수 있습니다.다음 코드 세그먼트를 입력합니다.fn main(phrase: String): Int32
{
// Making the agent say a phrase
say("You said: "+ phrase)
// Printing output to the console
printLn("Debugging: "+ phrase);
return 0i32;
}
main
함수는 프로그램을 실행할 때 호출되는 함수입니다.이 간단한 스크립트는 Rocklang을 사용하여 출력을 만드는 두 가지 방법을 보여 줍니다.첫 번째 함수 say
는 프록시 응답 단어에 사용됩니다.두 번째 함수 printLn
는 화면 밑에 있는 컨트롤러에 문장을 인쇄합니다.환영하는 환경을 만들다
앞의 스크립트가 답장
You said: ...
되어 다른 의도를 구분하지 않았습니다.우리가 해야 할 첫 번째 일은 사용자의 의도를 이해하려는 것이다.이를 위해 Rocklang의 상하문, 모델과 노선 개념을 활용할 것입니다.우리는 간단한 로봇으로 시작해서'hello world'라는 단어에 호응하고 어떤 다른 단어에도'무슨 말을 하는지 모르겠다'고 말할 것이다.
context Lobby {
// Defining the pattern we want to match against
pattern Hello: "hello" "world";
// Creating a route for the pattern, meaning
// that a match on "Hello" will invoke the function
// "hello".
route Hello: hello;
}
fn hello(ctx: MatchContext): Bool
{
// Answers to the matched route
say("Well, hello there!");
// Informs the routing system that the route
// indeed was successful by returning true.
return true;
}
fn main(phrase: String): Int32
{
// Getting the current user context. If no context
// is found, then we default to "Lobby".
let ctx: UserContext = getUserContext("Lobby");
// Attempting to route the input phrase within the user
// context
if(!routePhrase(ctx, phrase))
{
say("I do not understand what you are saying.");
}
return 0i32;
}
위의 예에서 많은 일이 발생했다.만약main 함수부터 시작한다면: 여기서 우리는 먼저 사용자의 상하문을 얻을 수 있습니다.사용자 컨텍스트가 없는 경우 기본적으로 "홀"입니다.이것은 '로비' 가 사용자가 요청한 첫 번째 상하문과 일치하도록 시도하는 것을 의미한다.다음에, 우리는 시스템이 상하문에서 짧은 단어를 공유할 것을 요구한다.우리의 예에서 상하문에는 하나의 모델, 즉 "hello" "world"
만 포함되어 있다. 이것은'helloworld'에 일치하는 항목만 찾을 수 있고 다른 모든 모델은 루트에서 실패할 수 있다는 것을 의미한다.만약 루트가 실패한다면, 에이전트는 조회가 이해되지 않았다고 통지할 것입니다.컨텍스트 정보 추출
만약 정규 표현식에 익숙하다면, 상하문 모델이 이 개념에서 영감을 얻었다는 것을 알게 될 것이다.우리는 이전 에이전트에 대해 이 점을 설명하기 위해 작은 조정을 했다.
context Lobby {
// Defining the pattern we want to match against
pattern Hello: Exclamation ("world"|"earth"|"planet");
// ...
}
이 비교적 작은 프로그램 변화는 큰 영향을 미쳤다. 대리인은 이제 '안녕 세계', '헤이 별', '지구 파이팅' 이라는 짧은 말에 대답할 것이다.우리는 이렇게 광범위한 가능성을 포괄하기 위해 거의 무엇을 할 필요가 없다는 것을 주의하십시오.우리가
Lobby
를 만들 때, 우리는 보통 인사말 뒤에 이름을 따르거나 아무것도 따라가지 않기를 바란다.우리는 사용자의 이름이 정확한지 확인하기 위해 짧은 말에서 이름을 추출하려고 합니다.이를 위해 모드를 다음과 같이 업데이트합니다.context Lobby {
// Defining the pattern we want to match against
pattern Hello: Exclamation name=AnyWord?;
// ...
}
그리고 Hello 요청을 처리하기 위해 논리를 만듭니다.fn hello(ctx: MatchContext): Bool
{
let howCanIHelp : String = "How can I help you?";
// Checking whether the user used a name
if(ctx.has("name"))
{
// Extracting the name from the context
let name: String = toString(ctx.get("name"));
if(name == "lucy")
{
// The bot acts happy that you recognised its name
say("Hi! Good to see you!");
}
else
{
// Informing the user that he/she got the name wrong
say("My name is not " + name + ". My name is Lucy");
howCanIHelp = "Anyway, how can I help you?";
}
}
else
{
// In case that the user did not use a name, we give neutral response
say("Hello there!");
}
// Finally, we ask how we can help
say(howCanIHelp);
return true;
}
논리는 상대적으로 간단하다. 사용자가 이름을 사용하거나 사용하지 않는다.만약 하나의 명칭을 사용한다면, 우리는 그것이 정확한 명칭인지 검사할 것이다.만약 없다면, 우리는 사용자의 명칭 오류를 통지할 것입니다. 그렇지 않으면 우리는 답례할 것입니다.고급 모드
더 높은 장면과 일치하려고 시도할 때 사용하는 패턴이 더 길고 복잡해집니다.간단하고 테스트 가능성을 유지하기 위해 모드를 하위 모드로 분해할 수 있다.예약을 위한 가상 조수를 구축하고 있기 때문에 사용자가 이 요청을 작성할 수 있는 여러 가지 방식을 일치시킬 수 있어야 합니다.우리는 문장을 몇 부분으로 나누어 이 점을 실현한다.우리는 먼저 문장의 안내 부분을 정의한 다음에 주동동사 부분을 정의하고 마지막으로 문장에 대한 수정을 한다.
context Lobby {
// ...
// Introductory part of the sentence
pattern IWouldLike: "i" "would" Adverb* ("like" "you"?|"want" "you") "to";
pattern CouldYou: "could" "you";
pattern INeed: "i" ("need"|"want") "you"? "to";
// The active verb
pattern Booking: (IWouldLike|CouldYou|INeed) ("book"|"reserve"|"get"|"find")?;
// Phrase modification
pattern ForWhoOrWhat: "for" forWhoOrWhat=(Determiner (Pronoun|Noun));
// The full phrase and the route
pattern ObjectBooking: Booking determiner=Determiner what=(Noun+) ForWhoOrWhat?;
route ObjectBooking: objectBooking;
}
우리가 어떻게 문제를 극복할 수 있는 작은 부분으로 분해하는지 주의하십시오.이런 모델은 다양한 단어와 일치할 것이다. 요구 ("호텔을 예약하고 싶다") 부터 원하는 질문 ("호텔을 예약하고 싶다") 까지 예의 바른 요청 ("자동차를 예약하고 싶다") 까지.컨텍스트 탐색
다음은 이 모드를 사용해서 요청한 것을 처리하기 위해 논리를 설계합니다.
fn objectBooking(ctx: MatchContext): Bool
{
// Defining the variables we will need
let what: String = toString(ctx.get("what"));
let determiner: String = toString(ctx.get("determiner"));
let newContext: String = what.capitalize() + "Booking";
let who: String;
// Checking if the context exists
if(hasContext(newContext))
{
// If the request had a modification, we give a response
// to reflect that we understood the request
if(ctx.has("forWhoOrWhat"))
{
who = toString(ctx.get("forWhoOrWhat"));
say("So you want to book " + determiner + " " + what + " for " + who);
}
else
{
// Otherwise, it's a straight forward request
say("So you want to book " + determiner + " " + what);
}
// Regardless, we inform the user that we can do this
say("Sure, I can do that!");
// And then we change context
pushContext(newContext);
}
else
{
// We do not have a context to handle this case and we inform the user about this
say("Unfortunately, I don't know how to get you " + determiner + " " + what);
}
return true;
}
위의 대부분 논리는 우리가 인사 부분에서 한 논리와 비슷하다.그러나 우리는 두 개의 새로운 함수hasContext
와 pushContext
를 확실히 사용했다.함수hasContext
는 개발자가 특정한 이름을 가진 상하문을 만들었는지 확인하고 그 이름을 반영하기 위해 브리 값을 되돌려줍니다.함수 pushContext
는 새로운 모드를 사용하여 사용자를 새로운 환경으로 밀어넣습니다.만약 이러한 상황이 발생한다면 Lobby
의 모델을 한쪽에 놓아서 새로운 상하문에서 이러한 모델을 사용할 수 있도록 한다.이 강좌의 마지막 단계는 자동차와 호텔을 위해 가상 환경을 만드는 것이다.이를 위해 기본 모드가 모든 구문과 일치하고 라우팅 함수를 호출하는 라우팅이 있는 간단한 컨텍스트를 추가했습니다.
context CarBooking
{
pattern WhatCar: AnyWord*;
route WhatCar: whatCar;
}
fn whatCar(ctx: MatchContext): Bool
{
// User feedback
say("Car booked!");
// Popping the context to return back to the Lobby
popContext();
// Informing the routing system that we were successful
return true;
}
route 함수에서, 우리는 popContext
상하문으로 되돌아오기 Lobby
를 호출합니다.마지막으로, 우리는 현재 호텔에 유사한 상하문을 추가함으로써 이 점을 확장할 수 있다.context HotelBooking
{
pattern WhatHotel: AnyWord*;
route WhatHotel: whatHotel;
}
fn whatHotel(ctx: MatchContext): Bool
{
say("Hotel booked!");
popContext();
return true;
}
약 140줄 코드 (주석 포함) 에서, 우리는 상하문 감지 에이전트를 만들었는데, 이것은 당신이 무엇을 하고 싶은지 이해하고 상하문으로 내비게이션할 수 있습니다.물론 기능을 완전히 발휘하기 위해서는 더 많은 일이 필요하다는 점을 다음 강좌에서 소개하겠습니다.나는 내가 개발한 이 언어에 대한 피드백을 듣고 싶다.마지막으로 저희 커뮤니티에 가입하실 수 있습니다.
https://wonop.com/
Dev.to:@wonop
불협화음: https://discord.gg/YtkWN9fb
트위터:
Reference
이 문제에 관하여(Wonop의 상하문 감지 채팅 로봇 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/troelsfr/context-aware-chatbots-using-wonop-28n4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)