커스텀 함수#

당신이 파이썬을 다룰 수 있다면 KoML을 이용해서 굉장히 재미있는 것을 해볼 수 있어요. 예를들어, 지금 시각을 알려주는 예시를 생각해볼게요.

<< 지금 몇시야?
>> 음.. 지금 오후 8시 36분!

지금 시각은 정해져 있는 값이 아니기 때문에 <template> 에 미리 입력해서 답변을 내놓기 어려워요. 이럴 때 <func> 태그를 활용할 수 있어요.


<func>#

<func> 태그를 이용하기 위해서는 먼저 파이썬 함수를 정의해줘야해요. 지금 시각을 알려주는 함수를 간단히 작성해볼게요.

import time

def show_date(context=None):
    tick = time.localtime()
    h, m = tick.tm_hour, tick.tm_min

    if h > 12:
        h -= 12
        am_pm = '오후'
    else:
        am_pm = '오전'
    return f'{am_pm} {h}{m}분'

NOTE 모든 KoML함수의 마지막 parameter는 context 가 주어져야 해요. context는 KoML 의 전반적인 동작(앞 뒤 문맥, 단어 기억 등)에 중요한 역할을 한답니다. 자세한 내용은 컨텍스트 항목을 참조해주세요.


koml 파일은 다음과 같이 작성해주세요.

<!-- custom_function.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<koml>
  <case>
    <pattern>지금 몇시야_sf</pattern>
    <template>음.. 지금 <func name='show_date'/>!</template>
  </case>
</koml>

이후 KomlBot 을 동작시킬 때 이 함수를 사용할거라는 것을 알려주어야 해요. CustomBag을 사용해서 함수를 전달할 수 있어요.

from koml import KomlBot, CustomBag

bag = CustomBag(funcs={'show_date': show_date}) 

bot = KomlBot(bag)
bot.learn(['custom_function.xml'])
bot.converse()

NOTE <func> 태그에 name 에는 CustomBag 에 넣어준 key 값이 들어가야 해요.


다음과 같은 결과를 확인할 수 있어요.

<< 지금 몇시야?
>> 음.. 지금 오후 8시 36분!


<arg>#

<func> 도 파이썬 함수에 인자(Arguments)를 전달해줄 수 있어요. <arg>로 감싸서 필요한 인자를 <func>태그 안에 넣어주세요.
<func>과 <arg> 를 이용하면 인자가 필요한 함수 기능을 구현해볼 수 있어요.

<func> 와 <arg>를 이용한 예시로 연산 기능을 구현해볼게요.

<< 3 더하기 5는 뭐야?
>> 8 이잖아ㅋㅋ 맞지?
<< 429 더하기 99는 뭐야?
>> 528 이잖아ㅋㅋ 맞지?

먼저 더하기 함수를 python 으로 정의해주세요. KoML 함수의 인자(Arguments)와 반환형(return type)은 str이라는 점을 유의해주세요!

def plus(a: str, b: str, context=None) -> str:
    try:
        a_num = int(a)
        b_num = int(b)
        return str(a_num + b_num)
    except:
        return '???'

xml 파일에 다음 케이스를 추가해주세요..
<case>
  <!-- 숫자만 가져오기 -->
  <pattern><blank pos='SN'/> 더하기 <blank pos='SN'/> 뭐_e_sf</pattern>
  <template>
    <func name='plus'>
      <arg><blank idx='1'/></arg><arg><blank idx='2'/></arg>
    </func> 이잖아ㅋㅋ 맞지?
  </template>
</case>

마찬가지로 KomlBot 을 실행할 때 CustomBag 에 정의한 함수를 넣어서 실행해주세요.

from koml import KomlBot, CustomBag

bag = CustomBag(funcs={'plus': plus})

bot = KomlBot(bag)
bot.learn(['custom_function.xml'])
bot.converse()

다음과 같은 결과를 확인할 수 있어요.

<< 8 더하기 9 는 뭐니?
>> 17 이잖아ㅋㅋ 맞지?