From 789a427953abd953a03ed03ba5d5d042343fa3e0 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 12:12:24 +0800 Subject: [PATCH 01/19] fix: refactor transformers lm --- services/transformers_lm/server.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index 9988d63f70..bb4fdc47ef 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -30,9 +30,12 @@ logging.getLogger("werkzeug").setLevel("WARNING") -def generate_responses(instruction, context, model, tokenizer, continue_last_uttr=False): +def generate_responses(context, model, tokenizer, continue_last_uttr=False): outputs = [] - dialog_context = instruction + "\n" + "\n".join(context) + "\n" + "AI:" + if continue_last_uttr: + dialog_context = "\n".join(context) + else: + dialog_context = "\n".join(context) + "\n" + "AI:" logger.info(f"context inside generate_responses seen as: {[dialog_context]}") bot_input_ids = tokenizer([dialog_context], return_tensors="pt").input_ids with torch.no_grad(): @@ -64,11 +67,9 @@ def generate_responses(instruction, context, model, tokenizer, continue_last_utt model.to("cuda") logger.info("transformers_lm is set to run on cuda") example_response = generate_responses( - "", ["Question: What is the goal of SpaceX? Answer: To revolutionize space transportation. "], model, - tokenizer, - continue_last_uttr=False, + tokenizer ) logger.info(f"example response: {example_response}") logger.info("transformers_lm is ready") @@ -86,7 +87,7 @@ def respond(): responses = [] confidences = [] for context in contexts: - outputs = generate_responses("", context, model, tokenizer) + outputs = generate_responses(context, model, tokenizer) logger.info(f"outputs: {outputs}") for response in outputs: if len(response) >= 3: From 4c88b6eaae83b2d711e00261e1c0417d05a6f96d Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 17:34:52 +0800 Subject: [PATCH 02/19] fix: format lm --- services/transformers_lm/server.py | 23 ++++++++--- services/transformers_lm/test.py | 8 ++-- .../dff_generative_skill/scenario/response.py | 38 ++++++++++++++----- .../scenario/main.py | 4 -- .../scenario/response.py | 19 +++++----- 5 files changed, 60 insertions(+), 32 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index bb4fdc47ef..dac1742f94 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -21,6 +21,8 @@ logging.info(f"PRETRAINED_MODEL_NAME_OR_PATH = {PRETRAINED_MODEL_NAME_OR_PATH}") DEFAULT_CONFIDENCE = 0.9 ZERO_CONFIDENCE = 0.0 +NAMING = ["AI", "Human"] + with open(CONFIG_NAME, "r") as f: generation_params = json.load(f) max_length = generation_params.get("max_length", 50) @@ -30,13 +32,19 @@ logging.getLogger("werkzeug").setLevel("WARNING") -def generate_responses(context, model, tokenizer, continue_last_uttr=False): +def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=False): outputs = [] + dialog_context = "" + if prompt: + dialog_context += prompt + "\n" + s = len(context) % 2 + context = [f'{NAMING[(s + uttr_id) % 2]}: {uttr}' for uttr_id, uttr in enumerate(context)] if continue_last_uttr: dialog_context = "\n".join(context) else: - dialog_context = "\n".join(context) + "\n" + "AI:" - logger.info(f"context inside generate_responses seen as: {[dialog_context]}") + dialog_context = "\n".join(context) + f"\n{NAMING[0]}:" + + logger.info(f"context inside generate_responses seen as: {dialog_context}") bot_input_ids = tokenizer([dialog_context], return_tensors="pt").input_ids with torch.no_grad(): if torch.cuda.is_available(): @@ -69,7 +77,8 @@ def generate_responses(context, model, tokenizer, continue_last_uttr=False): example_response = generate_responses( ["Question: What is the goal of SpaceX? Answer: To revolutionize space transportation. "], model, - tokenizer + tokenizer, + "You are a SpaceX Assistant." ) logger.info(f"example response: {example_response}") logger.info("transformers_lm is ready") @@ -83,11 +92,13 @@ def generate_responses(context, model, tokenizer, continue_last_uttr=False): def respond(): st_time = time.time() contexts = request.json.get("dialog_contexts", []) + prompts = request.json.get("prompts", []) + try: responses = [] confidences = [] - for context in contexts: - outputs = generate_responses(context, model, tokenizer) + for context, prompt in zip(contexts, prompts): + outputs = generate_responses(context, model, tokenizer, prompt) logger.info(f"outputs: {outputs}") for response in outputs: if len(response) >= 3: diff --git a/services/transformers_lm/test.py b/services/transformers_lm/test.py index 2bf9c19005..2c8a5a414b 100644 --- a/services/transformers_lm/test.py +++ b/services/transformers_lm/test.py @@ -9,11 +9,13 @@ def test_respond(): url = "http://0.0.0.0:8130/respond" contexts = [ [ - "Respond like a friendly chatbot", - "Human: Hi! I am Marcus. How are you today?", + "Hi! I am Marcus. How are you today?", ] ] - result = requests.post(url, json={"dialog_contexts": contexts}).json() + prompts = [ + "Respond like a friendly chatbot", + ] + result = requests.post(url, json={"dialog_contexts": contexts, "prompts": prompts}).json() print(result) assert [all(len(sample[0]) > 0 for sample in result)], f"Got\n{result}\n, something is wrong" print("Success") diff --git a/skills/dff_generative_skill/scenario/response.py b/skills/dff_generative_skill/scenario/response.py index ec218d55e8..53cdfcd15b 100644 --- a/skills/dff_generative_skill/scenario/response.py +++ b/skills/dff_generative_skill/scenario/response.py @@ -1,4 +1,5 @@ import logging +import re import requests import sentry_sdk from os import getenv @@ -17,7 +18,13 @@ assert DIALOGPT_SERVICE_URL -def compose_data_for_dialogpt(ctx, actor): +FIX_PUNCTUATION = re.compile(r"\s(?=[\.,:;])") +GENERATIVE_TIMEOUT = 4 +DEFAULT_CONFIDENCE = 0.9 +LOW_CONFIDENCE = 0.5 + + +def compose_data_for_model(ctx, actor): data = [] # for uttr in dialog["utterances"][-3:]: # curr_uttr = {"speaker": uttr["user"]["user_type"], "text": uttr["text"]} @@ -38,7 +45,13 @@ def compose_data_for_dialogpt(ctx, actor): def generative_response(ctx: Context, actor: Actor, *args, **kwargs) -> Any: - curr_responses, curr_confidences, curr_human_attrs, curr_bot_attrs, curr_attrs = [], [], [], [], [] + curr_responses, curr_confidences, curr_human_attrs, curr_bot_attrs, curr_attrs = ( + [], + [], + [], + [], + [], + ) def gathering_responses(reply, confidence, human_attr, bot_attr, attr): nonlocal curr_responses, curr_confidences, curr_human_attrs, curr_bot_attrs, curr_attrs @@ -48,19 +61,26 @@ def gathering_responses(reply, confidence, human_attr, bot_attr, attr): curr_human_attrs += [human_attr] curr_bot_attrs += [bot_attr] curr_attrs += [attr] - logger.info(f"dff-generative-skill: {reply}") - request_data = compose_data_for_dialogpt(ctx, actor) + request_data = compose_data_for_model(ctx, actor) + logger.info(f"request_data: {request_data}") if len(request_data) > 0: - response = requests.post(DIALOGPT_SERVICE_URL, json={"dialog_contexts": [request_data]}, timeout=3.8) + response = requests.post( + DIALOGPT_SERVICE_URL, + json={"dialog_contexts": [request_data]}, + timeout=3.8, + ) hypotheses = response.json()["generated_responses"][0] else: hypotheses = [] - + logger.info(f"hyps: {hypotheses}") for hyp in hypotheses: - if hyp[-1] not in [".", "?", "!"]: - hyp += "." - gathering_responses(hyp, 0.99, {}, {}, {"can_continue": CAN_NOT_CONTINUE}) + confidence = DEFAULT_CONFIDENCE + hyp_text = " ".join(hyp.split()) + if len(hyp_text) and hyp_text[-1] not in [".", "?", "!"]: + hyp_text += "." + confidence = LOW_CONFIDENCE + gathering_responses(hyp_text, confidence, {}, {}, {"can_continue": CAN_NOT_CONTINUE}) if len(curr_responses) == 0: return "" diff --git a/skills/dff_template_prompted_skill/scenario/main.py b/skills/dff_template_prompted_skill/scenario/main.py index a336a38fda..1c3f80365d 100644 --- a/skills/dff_template_prompted_skill/scenario/main.py +++ b/skills/dff_template_prompted_skill/scenario/main.py @@ -15,10 +15,6 @@ "generation": { "start_node": { RESPONSE: "", - TRANSITIONS: {"greeting": cnd.true()}, - }, - "greeting": { - RESPONSE: loc_rsp.generative_response, TRANSITIONS: {"generative_response_node": cnd.true()}, }, "generative_response_node": { diff --git a/skills/dff_template_prompted_skill/scenario/response.py b/skills/dff_template_prompted_skill/scenario/response.py index bf1d7d5199..589fb063d6 100644 --- a/skills/dff_template_prompted_skill/scenario/response.py +++ b/skills/dff_template_prompted_skill/scenario/response.py @@ -28,7 +28,6 @@ GENERATIVE_TIMEOUT = 4 DEFAULT_CONFIDENCE = 0.9 LOW_CONFIDENCE = 0.5 -NAMING = {"human": "Human", "bot": "AI"} def compose_data_for_model(ctx, actor): @@ -70,21 +69,21 @@ def gathering_responses(reply, confidence, human_attr, bot_attr, attr): json={"dialog_contexts": [request_data]}, timeout=GENERATIVE_TIMEOUT, ) - hypotheses = response.json() + hypotheses = response.json()[0] else: hypotheses = [] logger.info(f"hyps: {hypotheses}") - if hypotheses: - for hyp in hypotheses: - confidence = DEFAULT_CONFIDENCE - hyp_text = " ".join(hyp[0].split()) - if len(hyp_text) and hyp_text[-1] not in [".", "?", "!"]: - hyp_text += "." - confidence = LOW_CONFIDENCE - gathering_responses(hyp_text, confidence, {}, {}, {"can_continue": CAN_NOT_CONTINUE}) + for hyp in hypotheses: + confidence = DEFAULT_CONFIDENCE + hyp_text = " ".join(hyp.split()) + if len(hyp_text) and hyp_text[-1] not in [".", "?", "!"]: + hyp_text += "." + confidence = LOW_CONFIDENCE + gathering_responses(hyp_text, confidence, {}, {}, {"can_continue": CAN_NOT_CONTINUE}) if len(curr_responses) == 0: return "" + return int_rsp.multi_response( replies=curr_responses, confidences=curr_confidences, From 1401873d2eba09a07521886ebd42218f2bf108cb Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 19:13:46 +0800 Subject: [PATCH 03/19] fix: starting utterance --- services/transformers_lm/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index dac1742f94..a35b921849 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -75,7 +75,7 @@ def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=Fal model.to("cuda") logger.info("transformers_lm is set to run on cuda") example_response = generate_responses( - ["Question: What is the goal of SpaceX? Answer: To revolutionize space transportation. "], + ["What is the goal of SpaceX?"], model, tokenizer, "You are a SpaceX Assistant." From 3aa28d107326e2935288f3e84d7197610f188615 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 19:17:49 +0800 Subject: [PATCH 04/19] fix: different tests --- services/transformers_lm/test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/transformers_lm/test.py b/services/transformers_lm/test.py index 2c8a5a414b..fe95d07b01 100644 --- a/services/transformers_lm/test.py +++ b/services/transformers_lm/test.py @@ -10,10 +10,17 @@ def test_respond(): contexts = [ [ "Hi! I am Marcus. How are you today?", + "Hi Marcus! I am fine. How are you?", + "I am great. What are your plans for today?" + ], + [ + "Hi Marcus! I am fine. How are you?", + "I am great. What are your plans for today?" ] ] prompts = [ "Respond like a friendly chatbot", + "Respond like a friendly chatbot", ] result = requests.post(url, json={"dialog_contexts": contexts, "prompts": prompts}).json() print(result) From 77dbdc9de645ccc94952de95a0b503195f5df3dc Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 14:22:45 +0300 Subject: [PATCH 05/19] fix: codestyle --- services/transformers_lm/server.py | 7 ++----- services/transformers_lm/test.py | 11 ++++------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index a35b921849..bf265c951d 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -38,7 +38,7 @@ def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=Fal if prompt: dialog_context += prompt + "\n" s = len(context) % 2 - context = [f'{NAMING[(s + uttr_id) % 2]}: {uttr}' for uttr_id, uttr in enumerate(context)] + context = [f"{NAMING[(s + uttr_id) % 2]}: {uttr}" for uttr_id, uttr in enumerate(context)] if continue_last_uttr: dialog_context = "\n".join(context) else: @@ -75,10 +75,7 @@ def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=Fal model.to("cuda") logger.info("transformers_lm is set to run on cuda") example_response = generate_responses( - ["What is the goal of SpaceX?"], - model, - tokenizer, - "You are a SpaceX Assistant." + ["What is the goal of SpaceX?"], model, tokenizer, "You are a SpaceX Assistant." ) logger.info(f"example response: {example_response}") logger.info("transformers_lm is ready") diff --git a/services/transformers_lm/test.py b/services/transformers_lm/test.py index fe95d07b01..723198661d 100644 --- a/services/transformers_lm/test.py +++ b/services/transformers_lm/test.py @@ -11,16 +11,13 @@ def test_respond(): [ "Hi! I am Marcus. How are you today?", "Hi Marcus! I am fine. How are you?", - "I am great. What are your plans for today?" + "I am great. What are your plans for today?", ], - [ - "Hi Marcus! I am fine. How are you?", - "I am great. What are your plans for today?" - ] + ["Hi Marcus! I am fine. How are you?", "I am great. What are your plans for today?"], ] prompts = [ - "Respond like a friendly chatbot", - "Respond like a friendly chatbot", + "Respond like a friendly chatbot", + "Respond like a friendly chatbot", ] result = requests.post(url, json={"dialog_contexts": contexts, "prompts": prompts}).json() print(result) From de20d37a763a8f42db635f69238290dcf57480dd Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 19:25:39 +0800 Subject: [PATCH 06/19] fix: correct sending data to transformers lm --- services/transformers_lm/test.py | 4 ++-- .../scenario/response.py | 13 +++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/services/transformers_lm/test.py b/services/transformers_lm/test.py index 723198661d..96a16d7fb2 100644 --- a/services/transformers_lm/test.py +++ b/services/transformers_lm/test.py @@ -16,8 +16,8 @@ def test_respond(): ["Hi Marcus! I am fine. How are you?", "I am great. What are your plans for today?"], ] prompts = [ - "Respond like a friendly chatbot", - "Respond like a friendly chatbot", + "Respond like a friendly chatbot.", + "Respond like a friendly chatbot.", ] result = requests.post(url, json={"dialog_contexts": contexts, "prompts": prompts}).json() print(result) diff --git a/skills/dff_template_prompted_skill/scenario/response.py b/skills/dff_template_prompted_skill/scenario/response.py index 589fb063d6..bdcf5e1f81 100644 --- a/skills/dff_template_prompted_skill/scenario/response.py +++ b/skills/dff_template_prompted_skill/scenario/response.py @@ -31,13 +31,10 @@ def compose_data_for_model(ctx, actor): - global PROMPT # consider N_UTTERANCES_CONTEXT last utterances context = int_ctx.get_utterances(ctx, actor)[-N_UTTERANCES_CONTEXT:] - context = [f'{NAMING[uttr.get("user", {}).get("user_type")]}: {uttr.get("text", "")}' for uttr in context] - context = [PROMPT] + context + context = [uttr.get("text", "") for uttr in context] - logger.info(f"prompt: {context}") if context: context = [re.sub(FIX_PUNCTUATION, "", x) for x in context] return context @@ -61,12 +58,12 @@ def gathering_responses(reply, confidence, human_attr, bot_attr, attr): curr_bot_attrs += [bot_attr] curr_attrs += [attr] - request_data = compose_data_for_model(ctx, actor) - logger.info(f"request_data: {request_data}") - if len(request_data) > 0: + dialog_contexts = compose_data_for_model(ctx, actor) + logger.info(f"dialog_contexts: {dialog_contexts}") + if len(dialog_contexts) > 0: response = requests.post( GENERATIVE_SERVICE_URL, - json={"dialog_contexts": [request_data]}, + json={"dialog_contexts": [dialog_contexts], "prompts": [PROMPT]}, timeout=GENERATIVE_TIMEOUT, ) hypotheses = response.json()[0] From cf94be44829fc9d4e8bc3783e68b8858b9f4ca59 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Wed, 8 Feb 2023 22:25:34 +0800 Subject: [PATCH 07/19] fix: take prompt into account --- services/transformers_lm/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index bf265c951d..5c4cfe4972 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -40,9 +40,9 @@ def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=Fal s = len(context) % 2 context = [f"{NAMING[(s + uttr_id) % 2]}: {uttr}" for uttr_id, uttr in enumerate(context)] if continue_last_uttr: - dialog_context = "\n".join(context) + dialog_context += "\n".join(context) else: - dialog_context = "\n".join(context) + f"\n{NAMING[0]}:" + dialog_context += "\n".join(context) + f"\n{NAMING[0]}:" logger.info(f"context inside generate_responses seen as: {dialog_context}") bot_input_ids = tokenizer([dialog_context], return_tensors="pt").input_ids From 3a1a983d866e6607d8eb1e9288a87ff9eb3ce014 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 10:01:54 +0800 Subject: [PATCH 08/19] fix: empty prompts --- services/transformers_lm/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index 5c4cfe4972..aa87e5f223 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -90,6 +90,8 @@ def respond(): st_time = time.time() contexts = request.json.get("dialog_contexts", []) prompts = request.json.get("prompts", []) + if len(contexts) > 0 and len(prompts) == 0: + prompts = [""] * len(contexts) try: responses = [] From 90f4a017445eea209535b8cc827e33e300efd702 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 10:08:55 +0800 Subject: [PATCH 09/19] fix: transformers version --- services/infilling/requirements.txt | 2 +- services/masked_lm/requirements.txt | 2 +- services/question_generator/requirements.txt | 2 +- services/sentence_ranker/requirements.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/infilling/requirements.txt b/services/infilling/requirements.txt index 280b89a829..24bb60a3fc 100644 --- a/services/infilling/requirements.txt +++ b/services/infilling/requirements.txt @@ -1,4 +1,4 @@ -transformers==4.0.1 +transformers==4.6.0 sentencepiece==0.1.94 flask==1.1.1 itsdangerous==2.0.1 diff --git a/services/masked_lm/requirements.txt b/services/masked_lm/requirements.txt index 280b89a829..24bb60a3fc 100644 --- a/services/masked_lm/requirements.txt +++ b/services/masked_lm/requirements.txt @@ -1,4 +1,4 @@ -transformers==4.0.1 +transformers==4.6.0 sentencepiece==0.1.94 flask==1.1.1 itsdangerous==2.0.1 diff --git a/services/question_generator/requirements.txt b/services/question_generator/requirements.txt index cce7c0a6af..c99dc4118e 100644 --- a/services/question_generator/requirements.txt +++ b/services/question_generator/requirements.txt @@ -1,4 +1,4 @@ -transformers==4.0.1 +transformers==4.6.0 sentencepiece==0.1.94 flask==1.1.1 itsdangerous==2.0.1 diff --git a/services/sentence_ranker/requirements.txt b/services/sentence_ranker/requirements.txt index 3f8f604296..fd610bf519 100644 --- a/services/sentence_ranker/requirements.txt +++ b/services/sentence_ranker/requirements.txt @@ -1,4 +1,4 @@ -transformers==4.0.1 +transformers==4.6.0 sentencepiece==0.1.94 flask==1.1.1 gunicorn==19.9.0 From e877719b52dcb61568044572f19a7bb86e87aec6 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 10:41:02 +0800 Subject: [PATCH 10/19] fix: no confidences --- services/transformers_lm/server.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index aa87e5f223..5103245b1c 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -19,8 +19,6 @@ CONFIG_NAME = os.environ.get("CONFIG_NAME") HALF_PRECISION = bool(os.environ.get("HALF_PRECISION", 0)) logging.info(f"PRETRAINED_MODEL_NAME_OR_PATH = {PRETRAINED_MODEL_NAME_OR_PATH}") -DEFAULT_CONFIDENCE = 0.9 -ZERO_CONFIDENCE = 0.0 NAMING = ["AI", "Human"] with open(CONFIG_NAME, "r") as f: @@ -95,7 +93,6 @@ def respond(): try: responses = [] - confidences = [] for context, prompt in zip(contexts, prompts): outputs = generate_responses(context, model, tokenizer, prompt) logger.info(f"outputs: {outputs}") @@ -103,17 +100,14 @@ def respond(): if len(response) >= 3: # drop too short responses responses += [response] - confidences += [DEFAULT_CONFIDENCE] else: responses += [""] - confidences += [ZERO_CONFIDENCE] except Exception as exc: logger.exception(exc) sentry_sdk.capture_exception(exc) responses = [[""]] * len(contexts) - confidences = [[ZERO_CONFIDENCE]] * len(contexts) total_time = time.time() - st_time logger.info(f"transformers_lm exec time: {total_time:.3f}s") - return jsonify(list(zip(responses, confidences))) + return jsonify(responses) From cf2c2dcfe7282a66f8b4a33549a69834e1aaae3f Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 10:54:34 +0800 Subject: [PATCH 11/19] fix: transformers lm works with batches --- services/transformers_lm/server.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index 5103245b1c..bd2d6a025c 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -57,8 +57,8 @@ def generate_responses(context, model, tokenizer, prompt, continue_last_uttr=Fal chat_history_ids = chat_history_ids.cpu() for result in chat_history_ids: output = tokenizer.decode(result, skip_special_tokens=True) - logger.info(f"full output: {[output]}") result_cut = output.replace(dialog_context + " ", "").split("\n")[0] + logger.info(f"hypothesis: {result_cut}") outputs.append(result_cut) return outputs @@ -94,14 +94,15 @@ def respond(): try: responses = [] for context, prompt in zip(contexts, prompts): + curr_responses = [] outputs = generate_responses(context, model, tokenizer, prompt) logger.info(f"outputs: {outputs}") for response in outputs: if len(response) >= 3: - # drop too short responses - responses += [response] + curr_responses += [response] else: - responses += [""] + curr_responses += [""] + responses += [curr_responses] except Exception as exc: logger.exception(exc) From 3002910bac315422399a55832dae2f0e4b15327c Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 11:03:49 +0800 Subject: [PATCH 12/19] fix: transformers lm params and logs --- services/transformers_lm/gpt_j_6b.json | 2 +- services/transformers_lm/server.py | 4 ++-- skills/dff_template_prompted_skill/scenario/response.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/transformers_lm/gpt_j_6b.json b/services/transformers_lm/gpt_j_6b.json index 7e39d68df3..1edf84f186 100644 --- a/services/transformers_lm/gpt_j_6b.json +++ b/services/transformers_lm/gpt_j_6b.json @@ -4,5 +4,5 @@ "top_p": 0.9, "temperature": 0.9, "do_sample": true, - "num_return_sequences": 1 + "num_return_sequences": 2 } \ No newline at end of file diff --git a/services/transformers_lm/server.py b/services/transformers_lm/server.py index bd2d6a025c..747e5855f6 100644 --- a/services/transformers_lm/server.py +++ b/services/transformers_lm/server.py @@ -96,9 +96,8 @@ def respond(): for context, prompt in zip(contexts, prompts): curr_responses = [] outputs = generate_responses(context, model, tokenizer, prompt) - logger.info(f"outputs: {outputs}") for response in outputs: - if len(response) >= 3: + if len(response) >= 2: curr_responses += [response] else: curr_responses += [""] @@ -109,6 +108,7 @@ def respond(): sentry_sdk.capture_exception(exc) responses = [[""]] * len(contexts) + logger.info(f"transformers_lm output: {responses}") total_time = time.time() - st_time logger.info(f"transformers_lm exec time: {total_time:.3f}s") return jsonify(responses) diff --git a/skills/dff_template_prompted_skill/scenario/response.py b/skills/dff_template_prompted_skill/scenario/response.py index bdcf5e1f81..968ba559ee 100644 --- a/skills/dff_template_prompted_skill/scenario/response.py +++ b/skills/dff_template_prompted_skill/scenario/response.py @@ -69,7 +69,7 @@ def gathering_responses(reply, confidence, human_attr, bot_attr, attr): hypotheses = response.json()[0] else: hypotheses = [] - logger.info(f"hyps: {hypotheses}") + logger.info(f"generated hypotheses: {hypotheses}") for hyp in hypotheses: confidence = DEFAULT_CONFIDENCE hyp_text = " ".join(hyp.split()) From b3f1128a0c799b2b9d3f1f22dfb82de7f670c8ae Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 11:09:48 +0800 Subject: [PATCH 13/19] fix: more hyps --- services/transformers_lm/gpt_j_6b.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/transformers_lm/gpt_j_6b.json b/services/transformers_lm/gpt_j_6b.json index 1edf84f186..c3154c3748 100644 --- a/services/transformers_lm/gpt_j_6b.json +++ b/services/transformers_lm/gpt_j_6b.json @@ -4,5 +4,5 @@ "top_p": 0.9, "temperature": 0.9, "do_sample": true, - "num_return_sequences": 2 + "num_return_sequences": 3 } \ No newline at end of file From 1a22f877d6b591d19f76220e5431dbb4e03f3c88 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 11:29:29 +0800 Subject: [PATCH 14/19] fix: readme --- .../dream_persona_prompted/README.md | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/assistant_dists/dream_persona_prompted/README.md b/assistant_dists/dream_persona_prompted/README.md index 9d9ea391a8..312954ebf1 100644 --- a/assistant_dists/dream_persona_prompted/README.md +++ b/assistant_dists/dream_persona_prompted/README.md @@ -1,20 +1,22 @@ # Dream Prompted Distribution -**_One may consider this distribution as a TEMPLATE for a prompt-based distribution which may contain any number of prompt-based skills each of which is conditioned on a single prompt during the whole conversation_** +**_One may consider this distribution as a TEMPLATE for a prompt-based distribution which may contain any number of +prompt-based skills each of which is conditioned on a single prompt during the whole conversation_** -Each Prompt-based Skill utilizes the **same prompt during the whole dialog**! +**Note!** Each Prompt-based Skill utilizes the **same prompt during the whole dialog**! -# What is Dream Prompted distribution +# What is Dream Prompted Distribution -Dream Prompted distribution is an example of the prompt-based dialogue system which contains one prompt-based skill, in particular, prompt is a persona description. +Dream Prompted distribution is an example of the prompt-based dialogue system which contains one prompt-based skill, +in particular, prompt is a persona description. Dream Prompted distribution contains the following skills: * Dummy Skill (`dummy_skill`) is a fallback skill (also it is a part of agent container, so no separate container required) * DFF Dream Persona Prompted Skill (`dff_dream_persona_prompted_skill`) is a skill created via DFF (Dialog Flow Framework) -which generates a response to the current dialogue context taking into account the given prompt -(the **prompt is the same for all the dialogue steps**). +which generates a response to the current dialogue context taking into account the given prompt, i.g., bot's persona description. ### DFF Dream Persona Prompted Skill + The **DFF Dream Persona Prompted Skill** is a light-weight container sending requests to the generative service which utilizes a neural network for prompt-based generation. DFF Dream Persona Prompted Skill accepts two main environmental variables: @@ -23,26 +25,44 @@ DFF Dream Persona Prompted Skill accepts two main environmental variables: The service must utilize the same input-output format as Transformers-LM (`transformers_lm`). * `N_UTTERANCES_CONTEXT` contains lengths of the considered context in terms of number of dialogue utterances. +**Note!** DFF Dream Persona Prompted Skill utilizes a special universal template `skills/dff_template_prompted_skill` +which do not require creation of the new skill's directory. For your convenience, creating a new skill, +you should utilize the same template folder but specify another prompt file, service port, and specify another container name. + ### Prompt Selector -The distribution may contain several Prompt-based skills. Therefore, the **Prompt Selector** component is presented. + +The distribution may contain **several Prompt-based skills.** Therefore, the **Prompt Selector** component is presented. The Prompt Selector is also a light-weight container utilizing **Sentence Ranker** component (its URL is given in `.env` file as `SENTENCE_RANKER_SERVICE_URL`) to select `N_SENTENCES_TO_RETURN` the most relevant prompts (precisely, it returns ordered list of prompt names) among the given ones. The `,`-joint list of the prompt names to be considered is given as an environmental variable `PROMPTS_TO_CONSIDER`. Each considered prompt should be located as `dream/common/prompts/.json`. +**Note!** In the Dream Persona Prompted Distribution we give a list of prompts to the Prompt Selector: `dream_persona,pizza` +separated with semicolon just for the demonstration of the `PROMPTS_TO_CONSIDER`'s input format. Actually, +Dream Persona Prompted Distribution contains only one prompted skill which utilizes Dream Persona prompt. + ### Skill Selector -**Important!** If Prompt Selector annotations are detected in the user utterance, +You should not do any changes in the Skill Selector, it would call all the skills with the most relevant prompts +automatically according to the Prompt Selector. If Prompt Selector annotations are detected in the user utterance, the Skill Selector turns on skills with names `dff__prompted_skill` for each prompt_name from -`N_SENTENCES_TO_RETURN` the most relevant prompts detected by Prompt Selector. -Therefore, a prompt name can contain `'_'` but not `'-'`. +`N_SENTENCES_TO_RETURN` the most relevant prompts detected by Prompt Selector. +Therefore, a prompt name can contain `'_'` but not `'-'`. + +**Note!** Pay attention that you may specify to the Prompt Selector prompt names +even if the corresponding skills are not presented in the distribution, so if you, for example, specify 5 prompt names +while your distribution contains only 2 prompted skill, and you assign the number of returned most relevant prompts +(`N_SENTENCES_TO_RETURN`) to 3, you may face a situation when the Prompt Selector will choose all prompts for which +you do not have skills, so the response on that step will be provided by other skills presented in the distribution +(in particular, by Dummy Skill for the current version of Dream Prompted distribution). # How to Create a New Prompted Distribution If one wants to create a new prompted distribution (distribution containing prompt-based skill(s)), one should: + 1. Copy the `dream/assistant_dists/dream_persona_prompted` directory to `dream/assistant_dists/dream_custom_prompted` -(this name is an example!). +(the name is an example!). 2. **For each prompt-based skill, one needs to**: 1. create a `dream/common/prompts/.json` files containing a prompt. **Important!** `` should only contain letters, numbers and underscores (`_`) but no dashes (`-`)! @@ -97,7 +117,7 @@ If one wants to create a new prompted distribution (distribution containing prom 6. If one does not want to keep DFF Dream Persona Prompted Skill in their distribution, one should remove all mentions of DFF Dream Persona Prompted Skill container from `yml`-configs and `pipeline_conf.json` files. -**Important!** Please, take into account that naming skill utilizing according to the instruction above +**Note!** Please, take into account that naming skill utilizing according to the instruction above is very important to provide Skill Selector automatically turn on the prompt-based skills which are returned as `N_SENTENCES_TO_RETURN` the most relevant prompts. From 729c481b26dae1aa21c7598b03f448cc230ea92a Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 11:49:34 +0800 Subject: [PATCH 15/19] fix: dialogpt ru output format compatible --- services/dialogpt_RU/server.py | 2 +- services/dialogpt_RU/test.py | 2 +- skills/dff_generative_skill/scenario/response.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/dialogpt_RU/server.py b/services/dialogpt_RU/server.py index 7e79141f28..c00549acb8 100644 --- a/services/dialogpt_RU/server.py +++ b/services/dialogpt_RU/server.py @@ -199,4 +199,4 @@ def respond(): total_time = time.time() - st_time logger.info(f"dialogpt exec time: {total_time:.3f}s") - return jsonify({"generated_responses": batch_generated_responses}) + return jsonify(batch_generated_responses) diff --git a/services/dialogpt_RU/test.py b/services/dialogpt_RU/test.py index 405f5bbeb3..8251f56fcc 100644 --- a/services/dialogpt_RU/test.py +++ b/services/dialogpt_RU/test.py @@ -13,7 +13,7 @@ def test_respond(): ] request_data = {"dialog_contexts": dialog_contexts, "num_return_sequences": 5} - result = requests.post(url, json=request_data).json()["generated_responses"][0] + result = requests.post(url, json=request_data).json()[0] assert len(result) == 5 and len(result[0]) > 0, f"Got\n{result}" print("Success!") diff --git a/skills/dff_generative_skill/scenario/response.py b/skills/dff_generative_skill/scenario/response.py index 53cdfcd15b..50e54b25ab 100644 --- a/skills/dff_generative_skill/scenario/response.py +++ b/skills/dff_generative_skill/scenario/response.py @@ -70,7 +70,7 @@ def gathering_responses(reply, confidence, human_attr, bot_attr, attr): json={"dialog_contexts": [request_data]}, timeout=3.8, ) - hypotheses = response.json()["generated_responses"][0] + hypotheses = response.json()[0] else: hypotheses = [] logger.info(f"hyps: {hypotheses}") From 06863299fe19bc77259453742950a474051ae93b Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 12:11:16 +0800 Subject: [PATCH 16/19] fix: wait longer --- assistant_dists/dream_russian/docker-compose.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assistant_dists/dream_russian/docker-compose.override.yml b/assistant_dists/dream_russian/docker-compose.override.yml index 36d01bf17f..ac6afbea67 100644 --- a/assistant_dists/dream_russian/docker-compose.override.yml +++ b/assistant_dists/dream_russian/docker-compose.override.yml @@ -8,7 +8,7 @@ services: spelling-preprocessing:8074, entity-linking:8075, wiki-parser:8077, dff-generative-skill:8092, dff-friendship-skill:8086, entity-detection:8103, dialogpt:8091, dff-template-skill:8120, spacy-annotator:8125, dialogrpt:8122, toxic-classification:8126" - WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-480} + WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-600} HIGH_PRIORITY_INTENTS: 1 RESTRICTION_FOR_SENSITIVE_CASE: 1 ALWAYS_TURN_ON_ALL_SKILLS: 0 From db1e9ab819a91428ad7624c328890b19c528e9f7 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 12:13:40 +0800 Subject: [PATCH 17/19] fix: no extra var in test --- services/transformers_lm/test.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/transformers_lm/test.py b/services/transformers_lm/test.py index 96a16d7fb2..14f6ba80dd 100644 --- a/services/transformers_lm/test.py +++ b/services/transformers_lm/test.py @@ -1,10 +1,6 @@ -import os import requests -N_HYPOTHESES_TO_GENERATE = int(os.environ.get("N_HYPOTHESES_TO_GENERATE", 1)) - - def test_respond(): url = "http://0.0.0.0:8130/respond" contexts = [ From 265ca2a8e72b6fc005e4c0fed91e91ebf485cb31 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 12:23:45 +0800 Subject: [PATCH 18/19] fix: correct is_container_running checks --- common/containers.py | 5 ++--- skills/dff_generative_skill/server.py | 5 ++++- skills/dff_template_prompted_skill/server.py | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/common/containers.py b/common/containers.py index 87306178ad..c1f023bea1 100644 --- a/common/containers.py +++ b/common/containers.py @@ -1,10 +1,9 @@ import requests -def is_container_running(model_url, timeout=4): +def is_container_running(model_url, json_data, timeout=4): try: - requested_data = [{"speaker": "human", "text": "hi"}] - response = requests.post(model_url, json={"dialog_contexts": [requested_data]}, timeout=timeout) + response = requests.post(model_url, json=json_data, timeout=timeout) if response.status_code == 200: return True except Exception as exc: diff --git a/skills/dff_generative_skill/server.py b/skills/dff_generative_skill/server.py index ab716a41d8..b07cb8171c 100644 --- a/skills/dff_generative_skill/server.py +++ b/skills/dff_generative_skill/server.py @@ -61,7 +61,10 @@ def handler(requested_data, random_seed=None): while True: - result = containers.is_container_running(DIALOGPT_SERVICE_URL) + result = containers.is_container_running( + DIALOGPT_SERVICE_URL, + {"dialog_contexts": [[{"speaker": "human", "text": "hi"}]]} + ) if result: break else: diff --git a/skills/dff_template_prompted_skill/server.py b/skills/dff_template_prompted_skill/server.py index 8b01cb7c8b..4890786a40 100644 --- a/skills/dff_template_prompted_skill/server.py +++ b/skills/dff_template_prompted_skill/server.py @@ -61,7 +61,10 @@ def handler(requested_data, random_seed=None): while True: - result = containers.is_container_running(GENERATIVE_SERVICE_URL) + result = containers.is_container_running( + GENERATIVE_SERVICE_URL, + {"dialog_contexts": [["hi!"]], "prompts": ["Respond like a friendly chatbot."]} + ) if result: break else: From add0a6780b7435579572684b21126794ac768f55 Mon Sep 17 00:00:00 2001 From: dilyararimovna Date: Thu, 9 Feb 2023 07:42:48 +0300 Subject: [PATCH 19/19] fix: black --- skills/dff_generative_skill/server.py | 3 +-- skills/dff_template_prompted_skill/server.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/skills/dff_generative_skill/server.py b/skills/dff_generative_skill/server.py index b07cb8171c..97d739ee62 100644 --- a/skills/dff_generative_skill/server.py +++ b/skills/dff_generative_skill/server.py @@ -62,8 +62,7 @@ def handler(requested_data, random_seed=None): while True: result = containers.is_container_running( - DIALOGPT_SERVICE_URL, - {"dialog_contexts": [[{"speaker": "human", "text": "hi"}]]} + DIALOGPT_SERVICE_URL, {"dialog_contexts": [[{"speaker": "human", "text": "hi"}]]} ) if result: break diff --git a/skills/dff_template_prompted_skill/server.py b/skills/dff_template_prompted_skill/server.py index 4890786a40..f8747e4b70 100644 --- a/skills/dff_template_prompted_skill/server.py +++ b/skills/dff_template_prompted_skill/server.py @@ -62,8 +62,7 @@ def handler(requested_data, random_seed=None): while True: result = containers.is_container_running( - GENERATIVE_SERVICE_URL, - {"dialog_contexts": [["hi!"]], "prompts": ["Respond like a friendly chatbot."]} + GENERATIVE_SERVICE_URL, {"dialog_contexts": [["hi!"]], "prompts": ["Respond like a friendly chatbot."]} ) if result: break