Slackãã°ãã瀟é·ã®ä»£ãããäœã
ããã«ã¡ã¯ãIVRyã§ãšã³ãžãã¢ãããŠããçºç°ã§ãã
IVRyã§ã¯ãœãããŠã§ã¢ãšã³ãžãã¢ãšããŠé»è©±ã®èªåå¿çæ©èœã®éçºãæ
åœãã€ã€ãAIæ
åœãšããŠããŒã¿ã掻çšããä»åŸã®IVRyãæ¯ããæè¡éçºãè¡ã£ãŠããŸãã
ããŠãæšå¹Žæ«ã®è³é調éãçµãŠã2022幎ã®IVRyã¯å€§å€å å®ãã1幎ãéãããŸããã
ããã«äŒŽã£ãŠãé¢é£æ¥åãããªãå¢ããåããŒã å¿ããæ¯æ¥ãéã£ãŠããŸãã
æããã®åœ±é¿ãåããŠããã®ã¯ãä»ã§ããªã瀟é·ã§ãã
ãã€ãå¿ããããªã®ã§ã瀟é·ã®ä»£ãããããäœããäœã£ãŠããããªãããªãšæããŸãããäŸãã°ãSlackã§ç€Ÿé·ã®ä»£ããã«è¿ä¿¡ãããšãâŠ
IVRyã¯Slackãçã
ä»ã®ã¡ã³ããŒãããããèšäºã«ããŠãããŠããŸãããåŒç€Ÿã¯Slackã倧å€çãã§ãã
ãªã¢ãŒãã坿¥ã®ã¡ã³ããŒããããªãã§ãå¹ççãªæ
å ±äŒéã¯å€§å€éèŠã§ãã
IVRyã§ã¯åºæ¬çã«ãã©ã€ããŒããã£ã³ãã«NGã§ããªãŒãã³ã§æŽ»çºãªã¡ãã»ãŒãžã®ããåããè¡ãããŠããŸãã
ãŸããtimesãšåŒã°ããåå ±ãã£ã³ãã«ã掻çºã§ãã詳ããã¯ãã¡ãã®èšäºããåç
§ãã ããã
æ¥å ±ã®ããã«äžæ¥äžåã§ã¯ãªããäœãèããŠããããšãæã£ãããšãããã°ããã«æçš¿ããããã«å¯ŸããŠã¿ããªã§ãªã¢ã¯ã·ã§ã³ããŠããæåããããŸããIVRyã§ã¯å
¥ç€Ÿãšåæã«å
šå¡ãèªåã®timesãæã¡ãã©ãã©ãæçš¿ããŠãããŸãã
ãããªäžãå§åçã«æçš¿æ°ãå€ãã®ã瀟é·ã§ããtimesã«æžãããããã«ãªã¢ã¯ã·ã§ã³ãé£ãã§ããŸãã
ä»åã¯ããã®timesé¢é£ã®ç€Ÿé·ã®çºè©±ãå ã«ããŠã瀟é·ã£ãœãããšãããã¢ãã«ãäœã£ãŠã¿ãããšæããŸãã
ããŒã¿ã®ååŸæ¹æ³
Slackããã®ããŒã¿ã®ååŸã«ã€ããŠã¯ãIVRyãšã³ãžãã¢ã®ãã«ããŒããã®èšäºã«ãŸãšãŸã£ãŠããŸãã
ä»åã¯å
šç€Ÿå¡ã®timesãã£ã³ãã«ããŒã¿ããã¹ãŠååŸããŸãã
ããã¯conversations.historyãå©çšããããšã§ãç¹å®ãã£ã³ãã«ã®æçš¿ãååŸããããšã§å¯èœã§ãã
conversations.listãå©çšããŠå
šãã£ã³ãã«idãååŸããããšã§ãtimesé¢é£ãã£ã³ãã«ã®idã確èªããããšãå¯èœã§ãã
def get_channel_ids(ids, next_cur=None) -> Dict:
logger.info(f"call get_channel_ids, next_cur={next_cur}, texts_size: {len(ids)}")
if next_cur is not None:
time.sleep(int(os.environ.get("INTERVAL_CHANNEL_FETCH", 10)))
result = client.conversations_list(
cursor=next_cur,
exclude_archived=True
)
else:
result = client.conversations_list(
exclude_archived=True
)
ids += result["channels"]
next_cur = result.get("response_metadata", {}).get("next_cursor")
if next_cur is None or len(next_cur) == 0:
return ids
else:
return get_channel_ids(ids, next_cur=next_cur)
def get_all_texts(channel_id, texts, next_cur=None) -> List:
logger.info(f"call get_all_texts, next_cur={next_cur}, texts_size: {len(texts)}")
if next_cur is not None:
time.sleep(10)
result = client.conversations_history(
channel=channel_id,
cursor=next_cur,
)
else:
result = client.conversations_history(
channel=channel_id,
)
texts += result["messages"]
next_cur = result.get("response_metadata", {}).get("next_cursor")
if next_cur is None:
return texts
else:
return get_all_texts(channel_id, texts, next_cur=next_cur)
ãã®ããã«ããŠçºè©±ããŒã¿ãååŸããããšã¯ãé©åãªååŠçãè¡ã£ãŠåŠç¿ããŒã¿ãšããŠäœ¿ããåœ¢ã«æŽåœ¢ããå¿ èŠããããŸãã
ä»åã®åŠç¿ããŒã¿ã¯ã(誰ãã®çºè©±, 瀟é·ã®è¿ç)ãšãããã¢ã§ããå¿
èŠããããŸãã
timesã¯å€§åã«ãžã¥ã¢ã«ãªãã£ã³ãã«ãªã®ã§ãã¡ã³ã·ã§ã³ãã¹ã¬ãããäœã£ãŠã®äŒè©±ã¯å°ãªãããã£ã³ãã«ã«ãã®ãŸãŸè¿ä¿¡ããã¹ã¿ã€ã«ãå€ãã§ãã
ä»åã¯timestampé ã«ãœãŒããã誰ãã®çºè©±ã®çŽåŸ30å以å
ã«ç€Ÿé·ã®ã³ã¡ã³ããã€ããŠããå Žåã«éããåŠç¿ããŒã¿ãšããŠæ¡çšããŸããã以äžã®ãããªåœ¢ã§ã誰ãã®çºè©±ãšããã«å¯Ÿãã瀟é·ã®åå¿ã«çµã£ãŠããŸããïŒãµãŠãã®è©±ãå€ãã®ããªãããªã¢ã«)
çºè©±äŸ
(忬§ãšãããããŒã«æ³ãŸãããããªãã ããã, 忬§ã¯æ³ãŸããã)
(ãªã«ããå ç°ã«é ŒãŸãã, ãã©ãããããïœ)
(ãããã¯ãããªæ¥ã§ãæ··ãã§ãŸãã, www)
(å°ç¬ãã絶察ãµãŒãã£ã³ã§ããããäžç·ã«ããããïŒ, ãããã©ããæãããéã¶ã§)
çµæã察象ãšãªãããŒã¿ã¯19154ãã¢éãŸããŸããã
ã¢ãã«ã®åŠç¿
èšèªã¢ãã«ãšããŠãrinna瀟ãå ¬éããŠããåŠç¿æžã¿GPT2ã¢ãã«ãå©çšãããããfinetuningããããšæããŸãã
ååŠç
ãŸããå çšæœåºããããŒã¿ã»ãããã¢ãã«å ¥åã®ããã«å°ãããããŸãã
GPT2ã®å
¥åãšããŠãtokenizerã®inputãšããéãå
¥åçºè©±ãšå¿ççºè©±ãåºå¥ããããã«sep_tokenãå·®ã蟌ã¿ãã¢ãã«ãžã®å
¥åãšããŸããã
(srcã誰ãã®çºè©±, trgã瀟é·ã®çºè©±ã§ã)
ã¡ã¢ãªãšåŠç¿é床ã®éœåã§max_length=128ãšããŸãããå®éãã«ãžã¥ã¢ã«ãªSlackã®è¿çã«çµã£ãŠããã®ã§çºè©±èªäœãçããã®ãå€ãã§ãã
max_length = 128
def preprocess_function(examples):
inputs = []
targets = []
for src, trg in zip(examples['src'], examples['trg']):
inputs.append(src + tokenizer.sep_token + trg)
model_inputs = tokenizer(inputs, max_length=max_length, truncation=True, padding='max_length')
return model_inputs
dataset = _dataset.map(preprocess_function, batched=True)
åŠç¿
ä»åã®trainingã¯google colabã®TPUãå©çšããŸããã
TPUã¯ãããé«éã§ãããçéã®éçºã¹ããŒããéåžžã«éããããããã¥ã¡ã³ãéãã®èšå®æ¹æ³ã ãšåããã«èºãããšãå€ããããããŸãããã©ãããã®æžãæ¹ãããã«äœ¿ããªããªããã ãããªãšæãã€ã€ãTPUã䜿ãããã®ãã€ã³ããæžããŠãããŸãã以äžãåèã«ããŠããŸãã
https://colab.research.google.com/notebooks/tpu.ipynb
https://huggingface.co/docs/accelerate/concept_guides/training_tpu
ãŸããTPUã®å©çšã«å¿ èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
!pip install cloud-tpu-client==0.10 torch==1.12.0 https://storage.googleapis.com/tpu-pytorch/wheels/colab/torch_xla-1.12-cp37-cp37m-linux_x86_64.whl tensorboard-plugin-profile
â»ã¢ãã«äœææã¯ããã§OKã ã£ããã§ããããã®åŸ12/10ã«ç¢ºèªãããšå€±æããŠããŸããŸããã
colabã®runtimeèªäœã®ã¢ããããŒããåå ãªããã§ããåé¿çãšããŠãã³ãã³ããã¬ããããã代æ¿ã©ã³ã¿ã€ã ããŒãžã§ã³ãå©çšããããéžæããããšã§å©çšå¯èœã«ãªããŸããã®ã§ãåèãŸã§ã
import torch_xla
import torch_xla.core.xla_model as xm
device=xm.xla_device()
print(f"device: {device}")
ããã§device: xla:1ãšåºãã°OKã§ãã
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir=path/to/output,
evaluation_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
weight_decay=0.01,
save_total_limit=3,
num_train_epochs=5,
tpu_num_cores=8,
save_steps=500
)
TrainingArgumentsã®tpu_num_coresãšper_device_train_batch_sizeãé©åã«æå®ããå¿
èŠããããŸãã
trainingã¯5epochãããã«ããŠãããŸããã
ãŸã lossã¯äžããããã§ãããé©åœã«æã¡åããŸããã
å®éš
ããŠãåŠç¿ãã§ããããå®éã«ç€Ÿé·ã«è©±ã䌺ã£ãŠã¿ãŸãããã
åè£æã®çæã«ã¯pipelineãå©çšãããšç°¡åã§ãã
https://huggingface.co/docs/transformers/main_classes/pipelines
> 奥西ã¿ãããªããšãèšã£ãŠã»ãããã ãã©ã©ãïŒ
åè£1:ãŸããããããªã«æ©ãwww
åè£2:ãããããžã§ãã
åè£3:ã»ããŸã«ããããªãŒã
åè£4:ãŸã£ã¡ãŒã®ãããã¯ããã¶ã€ã³åããããããããããªã«ããããªã
å²ãšããŸããã£ãŠãæ°ãããŸãã
åŒç€Ÿã®ç€Ÿé·ã¯èå³ãªãããšã«ã¯å€§äœãããããªããçºèšãããŠããŸãããç§ã®ãããã¯ããã¶ã€ã³åãæå³ããè€ããããŸããã
ä»ã«ãèããŠã¿ãŸãããã
> IVRyãæ¥å¹Žãã£ãšæé·ããã«ã¯ã©ããããããïŒ
ããã¯ãããè°è«ããã
ãªãã»ã©ã確ãã«IVRyã¯ã¿ããªã§è°è«ããããšã倧äºã«ããŠããŸãã
2022幎ãMission/Vision/Valueãæ±ºããããã«ãå
šå¡ã§ããªãã®æéè°è«ãéããŸããã
ããããã®æé·ã«ãè°è«ã倧äºãšããããšã§ãããæ®éã«çŽåŸããŸãããããæ¬åœã«ããããã
> ä»ã®IVRyã«è¶³ããŠããªããã®ã£ãŠãªãã ãšæãïŒ
ããã¯é·æãçæãããŸããã
??ã£ãŠãªã£ãæã«ããããã¡ãªãã«èãããã3ã€ã®è»žã§åæãããšã
ã»IVRyã®ç®çã»äŸ¡å€èгã»èæ¯ã»ç®çãã¶ã€ãã£ãŠããç®æãèŠã€ãããããåããããš
ã»äœãããããã®ç®çãæç¢ºã«ãã(ãã®ããã«ã¯ãäœãå¿
èŠã?ãå
·äœçã«ãã)
ã»ç®çãšããŠèšå®ã§ãããŽãŒã«(ãŽãŒã«å°ç¹)ãã培åºçã«æŽãåºããŠãã©ããåãããæç¢ºã«ãã ããšããŽãŒã«ãšèšå®ãããŽãŒã«ã«å¯ŸããŠãã£ãŠãããšãšããããºã¬ãŠããªããã
æåŸã®ã»ããçæã®æå€§é·ãè¶
ããŠããŸã£ãŠåãããŠããŸã£ãŠããã®ã§äžèªç¶ãªæããããŸããã3ã€ã«èŠç¹ããŸãšããŠãããšãããšããæ¬åœã«ã³ã¡ã³ããšããŠè¿ã£ãŠãããã§ãã
IVRyã§ã¯ãã¹ãè«ã«åããŠãäžæ©ãã€é²ãã§ãããããšãValueãšããŠæ²ããŠãããåžžã«ç®çãæç¢ºã«ããŠç¶æ³ãæŽçããŠããããšãæèããŠããŸããããªããããã£ãœãããšèšã£ãŠãŠé©ãã§ãã
> æ¥å¹Žã®ææ°èŸŒã¿ããé¡ãããŸã
æ¥å¹Žã¯ãäŒç€Ÿãä»å¹Žãã倧ããæé·ãããããã®ããã«ã売äžç·å©çç10%è¶
ããšãã匷ãæå¿ã120%æã£ãŠãã²ãããéé²ããã
ãªã¢ã«ç€Ÿé·ã«ãããšæ°å€ç®æšãäœããããšããããšã§ããã匷ãæå¿ã¯äŒãããŸããã
äŒç€Ÿãæé·ãããããã«ãåãé 匵ããŸãã
æåŸã«
ä»åã¯timesãšããã«ãžã¥ã¢ã«ãªãã£ã³ãã«ã ãã察象ã«ããããŒã¿ã»ããã§ãã®ã§è¿çãã«ãžã¥ã¢ã«ã§ãããä»ã®çé¢ç®ãªãã£ã³ãã«ãå«ããã°ããããããã¬ãã¥ãŒããŠããããããããŸããã
çé¢ç®ãªè©±ããããšããããªã®ã§ç€Ÿé·ã®è² è·ãäžãããããã¯ç¡ããäžæçã«çãäžãã£ãã ãã§ãããæ ¹æ¬çã«ã¯äžç·ã«IVRyãäœã£ãŠãã£ãŠããã仲éããã£ãšå¿ èŠã§ãã
ãã®èšäºãæåŸãŸã§èªãã§ããã ããçæ§ã¯ãããŒã¿åæã®çŽ é€ã»èå³ãããã®ã§ã¯ãªãã§ãããããIVRyã§ã掻èºããã ããå¯èœæ§ãéåžžã«é«ãã§ãã
IVRyã¯ãŸã èšç«ããŠçãäŒç€Ÿã§ãããä»ç€Ÿã«ã¯ãªãããããã®ããŒã¿ãæºãŸã£ãŠãã£ãŠããŸãã
ä»åŸã®ãã§ãŒãºã§ã¯ããããã®ããŒã¿ãç©æ¥µçã«æŽ»çšããããç¹ã«èªç¶èšèªåŠçã»é³å£°é¢é£ãšã³ãžãã¢ãåéããŠããŸãã
ãããªäŒç€Ÿã§ããæ°ãããã£ã¬ã³ãžãã©ãã©ã奚å±ããŠããŸãã
ãèå³ãæã£ãŠããã ããæ¹ã¯æ¯éããé£çµ¡ãã ããã
Discussion