Wonop의 상하문 감지 채팅 로봇 사용하기

본 강좌에서 우리는 소형 상하문 감지 로봇을 구축하여 자동차, 호텔과 식탁을 예약하는 가상 조수로 삼을 것이다.우리는 https://wonop.com를 사용하여 이 점을 실현할 것이다.이 강좌를 통해 당신은 록랑의 서로 다른 개념을 하나하나 이해할 것입니다.본 강좌가 끝날 때, 당신은 자신의 상하문 감지 로봇을 구축할 수 있습니다.다음은 최종 결과입니다.

안녕하세요 전통세계.

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;
}
위의 대부분 논리는 우리가 인사 부분에서 한 논리와 비슷하다.그러나 우리는 두 개의 새로운 함수hasContextpushContext를 확실히 사용했다.함수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
트위터:

좋은 웹페이지 즐겨찾기