mirror of https://github.com/microsoft/autogen.git
Add code for profiling a testbed conversation
This commit is contained in:
parent
06b4e6c67e
commit
8f82c115e9
|
@ -0,0 +1,125 @@
|
|||
import argparse
|
||||
import json
|
||||
import os
|
||||
|
||||
import autogen
|
||||
from autogen import config_list_from_json
|
||||
|
||||
RESULT_DIR = "sample_data/results"
|
||||
|
||||
CONFIG_LIST = config_list_from_json(
|
||||
"OAI_CONFIG_LIST",
|
||||
filter_dict={"model": ["gpt-4"]},
|
||||
)
|
||||
|
||||
EXAMPLE_CODES = [
|
||||
("TASK-REQUEST", "The messages specifies a task that needs to be completed"),
|
||||
("SUGGESTING-CODING", "The message is suggesting code"),
|
||||
("CODE-EXECUTION", "The message contains results after executing a code"),
|
||||
("EXECUTION-ERROR", "The message is show any errors that happended during code execution"),
|
||||
("TASK-COMPLETION", "The message indicates that a task was completed"),
|
||||
]
|
||||
|
||||
|
||||
def annotate_message(message: str, codes=None):
|
||||
prompt = f"""You are an expert at qualitative analysis of text documents.
|
||||
|
||||
|
||||
Given a message exchanged between two agents, perform
|
||||
qualitative coding with the following steps: Read the message
|
||||
to understand the context. Apply descriptive coding to categorize each
|
||||
message’s content. Implement interpretive coding to identify underlying
|
||||
themes and intentions.
|
||||
|
||||
Only respond with 10 command separated codes.
|
||||
Use the following codes but feel free to suggest new codes if you really need to:
|
||||
{EXAMPLE_CODES}
|
||||
|
||||
Message:
|
||||
{message}
|
||||
"""
|
||||
|
||||
if codes is not None:
|
||||
prompt = f"""Which of the following codes apply to the message:
|
||||
codes: {codes}
|
||||
message: {message}
|
||||
|
||||
Only respond with the codes that apply. Codes should be separated by commas.
|
||||
"""
|
||||
# print(prompt)
|
||||
|
||||
response = autogen.Completion.create(config_list=CONFIG_LIST, prompt=prompt)
|
||||
return response["choices"][0]["message"]["content"]
|
||||
|
||||
|
||||
def narrow_codes(initial_annotation_results: str):
|
||||
"""
|
||||
Given the initial annotations, narrow down the codes to a discrete set.
|
||||
"""
|
||||
prompt = f"""You are an expert at qualitative coding.
|
||||
|
||||
Reflect on the initial annotations and then
|
||||
respond with a list of (at max 5) comma separate list of codes.
|
||||
|
||||
{initial_annotation_results}
|
||||
"""
|
||||
response = autogen.Completion.create(config_list=CONFIG_LIST, prompt=prompt)
|
||||
return response["choices"][0]["message"]["content"]
|
||||
|
||||
|
||||
def profile_conversation(assistant_msgs, viz_path=None):
|
||||
"""
|
||||
Given a list of assistant messages, profile the conversation.
|
||||
"""
|
||||
|
||||
# Loop over the messages and annotate each of them
|
||||
initial_annotation_results = ""
|
||||
|
||||
for agent, msgs in assistant_msgs.items():
|
||||
for msg in msgs:
|
||||
role, content = msg["role"], msg["content"]
|
||||
annotation = annotate_message(content)
|
||||
|
||||
initial_annotation_results += f"{role}: {annotation}\n"
|
||||
|
||||
print("Initial Coding:")
|
||||
print(initial_annotation_results)
|
||||
|
||||
# decide on a discrete set of codes using the initial annotations
|
||||
final_codes = narrow_codes(initial_annotation_results)
|
||||
print("Final codes:")
|
||||
print(final_codes)
|
||||
|
||||
print("\nFinal Coding:")
|
||||
for msg in msgs:
|
||||
role, content = msg["role"], msg["content"]
|
||||
annotation = annotate_message(content, codes=final_codes)
|
||||
# print(f"{role}: {annotation}\n----\n{content}\n----\n\n")
|
||||
print(f"{role}: {annotation}")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Profile a conversation between AutoGen agents.")
|
||||
parser.add_argument("jsonl_path", type=str, help="Path to a scenarios JSON-L file.")
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.jsonl_path, "r") as f:
|
||||
for line in f:
|
||||
scenario = json.loads(line)
|
||||
# Do something with the data
|
||||
|
||||
scenario_template = scenario["template"][:-3]
|
||||
scenario_id = scenario["id"]
|
||||
|
||||
assistant_msgs_path = os.path.join(
|
||||
RESULT_DIR, scenario_template, scenario_id, "0", "assistant_messages.json"
|
||||
)
|
||||
with open(assistant_msgs_path, "r") as f:
|
||||
text = f.read()
|
||||
assistant_msgs = json.loads(text)
|
||||
profile_conversation(assistant_msgs, viz_path="profile.png")
|
||||
break
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue