Spaces:
Runtime error
Runtime error
Wonderplex
commited on
Commit
·
4128c07
1
Parent(s):
4f8bd37
added format promp and changed sotopia information accordion (#35)
Browse files
app.py
CHANGED
|
@@ -12,7 +12,7 @@ from transformers import (
|
|
| 12 |
BitsAndBytesConfig,
|
| 13 |
)
|
| 14 |
|
| 15 |
-
from utils import Agent, format_sotopia_prompt, get_starter_prompt
|
| 16 |
from functools import cache
|
| 17 |
|
| 18 |
DEPLOYED = os.getenv("DEPLOYED", "true").lower() == "true"
|
|
@@ -84,7 +84,7 @@ def introduction():
|
|
| 84 |
|
| 85 |
|
| 86 |
def param_accordion(according_visible=True):
|
| 87 |
-
with gr.Accordion("Parameters", open=
|
| 88 |
model_name = gr.Dropdown(
|
| 89 |
choices=["cmu-lti/sotopia-pi-mistral-7b-BC_SR", "mistralai/Mistral-7B-Instruct-v0.1", "GPT3.5"], # Example model choices
|
| 90 |
value="cmu-lti/sotopia-pi-mistral-7b-BC_SR", # Default value
|
|
@@ -116,45 +116,31 @@ def param_accordion(according_visible=True):
|
|
| 116 |
return temperature, session_id, max_tokens, model_name
|
| 117 |
|
| 118 |
|
| 119 |
-
def sotopia_info_accordion(
|
| 120 |
-
|
| 121 |
-
):
|
| 122 |
-
with gr.Accordion(
|
| 123 |
-
"Sotopia Information", open=False, visible=according_visible
|
| 124 |
-
):
|
| 125 |
with gr.Row():
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
lines=4,
|
| 149 |
-
value=scenario,
|
| 150 |
-
interactive=False,
|
| 151 |
-
placeholder="Scenario",
|
| 152 |
-
show_label=False,
|
| 153 |
-
max_lines=4,
|
| 154 |
-
visible=False,
|
| 155 |
-
)
|
| 156 |
-
return user_name, bot_name, scenario
|
| 157 |
-
|
| 158 |
|
| 159 |
def instructions_accordion(instructions, according_visible=False):
|
| 160 |
with gr.Accordion("Instructions", open=False, visible=according_visible):
|
|
@@ -206,7 +192,7 @@ def chat_tab():
|
|
| 206 |
text_output = tokenizer.decode(
|
| 207 |
output_tokens[0], skip_special_tokens=True
|
| 208 |
)
|
| 209 |
-
return text_output
|
| 210 |
|
| 211 |
with gr.Column():
|
| 212 |
with gr.Row():
|
|
|
|
| 12 |
BitsAndBytesConfig,
|
| 13 |
)
|
| 14 |
|
| 15 |
+
from utils import Agent, format_sotopia_prompt, get_starter_prompt, format_bot_message
|
| 16 |
from functools import cache
|
| 17 |
|
| 18 |
DEPLOYED = os.getenv("DEPLOYED", "true").lower() == "true"
|
|
|
|
| 84 |
|
| 85 |
|
| 86 |
def param_accordion(according_visible=True):
|
| 87 |
+
with gr.Accordion("Parameters", open=True, visible=according_visible):
|
| 88 |
model_name = gr.Dropdown(
|
| 89 |
choices=["cmu-lti/sotopia-pi-mistral-7b-BC_SR", "mistralai/Mistral-7B-Instruct-v0.1", "GPT3.5"], # Example model choices
|
| 90 |
value="cmu-lti/sotopia-pi-mistral-7b-BC_SR", # Default value
|
|
|
|
| 116 |
return temperature, session_id, max_tokens, model_name
|
| 117 |
|
| 118 |
|
| 119 |
+
def sotopia_info_accordion(human_agent, machine_agent, scenario, accordion_visible=True):
|
| 120 |
+
with gr.Accordion("Sotopia Information", open=accordion_visible):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
with gr.Row():
|
| 122 |
+
user_name = gr.Textbox(
|
| 123 |
+
lines=1,
|
| 124 |
+
label="Human Agent Name",
|
| 125 |
+
value=human_agent.name,
|
| 126 |
+
interactive=True,
|
| 127 |
+
placeholder="Enter human agent name",
|
| 128 |
+
)
|
| 129 |
+
bot_name = gr.Textbox(
|
| 130 |
+
lines=1,
|
| 131 |
+
label="Machine Agent Name",
|
| 132 |
+
value=machine_agent.name,
|
| 133 |
+
interactive=True,
|
| 134 |
+
placeholder="Enter machine agent name",
|
| 135 |
+
)
|
| 136 |
+
scenario_textbox = gr.Textbox(
|
| 137 |
+
lines=4,
|
| 138 |
+
label="Scenario Description",
|
| 139 |
+
value=scenario,
|
| 140 |
+
interactive=True,
|
| 141 |
+
placeholder="Enter scenario description",
|
| 142 |
+
)
|
| 143 |
+
return user_name, bot_name, scenario_textbox
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
|
| 145 |
def instructions_accordion(instructions, according_visible=False):
|
| 146 |
with gr.Accordion("Instructions", open=False, visible=according_visible):
|
|
|
|
| 192 |
text_output = tokenizer.decode(
|
| 193 |
output_tokens[0], skip_special_tokens=True
|
| 194 |
)
|
| 195 |
+
return format_bot_message(text_output)
|
| 196 |
|
| 197 |
with gr.Column():
|
| 198 |
with gr.Row():
|
utils.py
CHANGED
|
@@ -1,4 +1,16 @@
|
|
| 1 |
from typing import List, Tuple
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
class Agent:
|
| 4 |
def __init__(self, name, background, goal, secrets, personality):
|
|
@@ -36,6 +48,20 @@ def truncate_dialogue_history_to_length(dia_his, surpass_num, tokenizer):
|
|
| 36 |
return trunc_dia
|
| 37 |
|
| 38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
def dialogue_history_creation(history, user_name, bot_name):
|
| 40 |
dialogue_history = ""
|
| 41 |
for idx, turn in enumerate(history):
|
|
@@ -43,6 +69,8 @@ def dialogue_history_creation(history, user_name, bot_name):
|
|
| 43 |
# TODOTODO (haofeiyu): we first assume that human talks first
|
| 44 |
user_turn_idx = idx * 2
|
| 45 |
bot_turn_idx = idx * 2 + 1
|
|
|
|
|
|
|
| 46 |
dialogue_history = f"{dialogue_history}\n\nTurn #{user_turn_idx}: {user_name}: {user_message}\n\nTurn #{bot_turn_idx}: {bot_name}: {bot_message}"
|
| 47 |
last_turn_idx = len(history) * 2
|
| 48 |
return dialogue_history, last_turn_idx
|
|
@@ -75,4 +103,4 @@ def format_sotopia_prompt(
|
|
| 75 |
)
|
| 76 |
prompt = f"{prompt}\n{dialogue_history}"
|
| 77 |
prompt = f"{prompt}\n\nTurn #{last_turn_idx+1}: {user_name}: {message}\n.\nYou are at Turn #{last_turn_idx+2}."
|
| 78 |
-
return prompt
|
|
|
|
| 1 |
from typing import List, Tuple
|
| 2 |
+
import ast
|
| 3 |
+
|
| 4 |
+
FORMAT_TEMPLATE = """ Your available action types are
|
| 5 |
+
"none action speak non-verbal communication leave".
|
| 6 |
+
Note: You can "leave" this conversation if 1. you have achieved your social goals, 2. this conversation makes you uncomfortable, 3. you find it uninteresting/you lose your patience, 4. or for other reasons you want to leave.
|
| 7 |
+
|
| 8 |
+
Please only generate a JSON string including the action type and the argument.
|
| 9 |
+
Your action should follow the given format:
|
| 10 |
+
\nAs an example, for the schema {\"properties\": {\"foo\": {\"title\": \"Foo\", \"description\": \"a list of strings\", \"type\": \"array\", \"items\": {\"type\": \"string\"}}}, \"required\": [\"foo\"]}
|
| 11 |
+
the object {\"foo\": [\"bar\", \"baz\"]} is a well-formatted instance of the schema. The object {\"properties\": {\"foo\": [\"bar\", \"baz\"]}} is not well-formatted.
|
| 12 |
+
\nHere is the output schema:\n```\n{\"description\": \"An interface for messages.\\nThere is only one required method: to_natural_language\", \"properties\": {\"action_type\": {\"title\": \"Action Type\", \"description\": \"whether to speak at this turn or choose to not do anything\", \"enum\": [\"none\", \"speak\", \"non-verbal communication\", \"action\", \"leave\"], \"type\": \"string\"}, \"argument\": {\"title\": \"Argument\", \"description\": \"the utterance if choose to speak, the expression or gesture if choose non-verbal communication, or the physical action if choose action\", \"type\": \"string\"}}, \"required\": [\"action_type\", \"argument\"]}\n```\u001b[0m
|
| 13 |
+
"""
|
| 14 |
|
| 15 |
class Agent:
|
| 16 |
def __init__(self, name, background, goal, secrets, personality):
|
|
|
|
| 48 |
return trunc_dia
|
| 49 |
|
| 50 |
|
| 51 |
+
def format_bot_message(bot_message) -> str:
|
| 52 |
+
json_response = ast.literal_eval(bot_message)
|
| 53 |
+
match json_response["action_type"]:
|
| 54 |
+
case "none":
|
| 55 |
+
return 'did nothing'
|
| 56 |
+
case "speak":
|
| 57 |
+
return json_response["argument"]
|
| 58 |
+
case "non-verbal communication":
|
| 59 |
+
return f'[{json_response["action_type"]}] {json_response["argument"]}'
|
| 60 |
+
case "action":
|
| 61 |
+
return f'[{json_response["action_type"]}] {json_response["argument"]}'
|
| 62 |
+
case "leave":
|
| 63 |
+
return 'left the conversation'
|
| 64 |
+
|
| 65 |
def dialogue_history_creation(history, user_name, bot_name):
|
| 66 |
dialogue_history = ""
|
| 67 |
for idx, turn in enumerate(history):
|
|
|
|
| 69 |
# TODOTODO (haofeiyu): we first assume that human talks first
|
| 70 |
user_turn_idx = idx * 2
|
| 71 |
bot_turn_idx = idx * 2 + 1
|
| 72 |
+
if not bot_message.startswith("["): # if action type == speak, need to add 'said: ' to be consistent with the dialog prompt
|
| 73 |
+
bot_message = "said :" + bot_message
|
| 74 |
dialogue_history = f"{dialogue_history}\n\nTurn #{user_turn_idx}: {user_name}: {user_message}\n\nTurn #{bot_turn_idx}: {bot_name}: {bot_message}"
|
| 75 |
last_turn_idx = len(history) * 2
|
| 76 |
return dialogue_history, last_turn_idx
|
|
|
|
| 103 |
)
|
| 104 |
prompt = f"{prompt}\n{dialogue_history}"
|
| 105 |
prompt = f"{prompt}\n\nTurn #{last_turn_idx+1}: {user_name}: {message}\n.\nYou are at Turn #{last_turn_idx+2}."
|
| 106 |
+
return prompt + FORMAT_TEMPLATE if use_format_guide else prompt
|