diff --git a/.gitignore b/.gitignore index 479178234..622fc88ff 100644 --- a/.gitignore +++ b/.gitignore @@ -167,3 +167,6 @@ wolfram.txt # DB on disk for TeachableAgent tmp/ + +# Storage for the AgentEval output +test/test_files/agenteval-in-out/out/ diff --git a/notebook/agenteval_cq_math.ipynb b/notebook/agenteval_cq_math.ipynb new file mode 100644 index 000000000..d834a56c8 --- /dev/null +++ b/notebook/agenteval_cq_math.ipynb @@ -0,0 +1,789 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "-pftZ-ZF1_BA" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NPUGFpKP1_BH" + }, + "source": [ + "# Demonstrating the `AgentEval` framework using the task of solving math problems as an example\n", + "\n", + "This notebook aims to demonstrate how to `AgentEval` implemented through [AutoGen](https://github.com/microsoft/autogen) works, where we use a math problem-solving task as an example. \n", + "`AgentEval` consists of two key components:\n", + "\n", + "- `CriticAgent`: This is an LLM-based agent that generates a list criteria $(c_1, \\dots, c_n)$ to help to evaluate a utility given task.\n", + "\n", + "- `QuantifierAgent`: This agent quantifies the performance of any sample task based on the criteria designed by the `CriticAgent` in the following way: $(c_1=a_1, \\dots, c_n=a_n)$\n", + "\n", + "![AgentEval](../website/blog/2023-11-11-AgentEval/img/agenteval-CQ.png)\n", + "\n", + "For more detailed explanations, please refer to the accompanying [blog post](https://https://microsoft.github.io/autogen/blog/2023/11/11/AgentEval)\n", + "\n", + "## Requirements\n", + "\n", + "AutoGen requires `Python>=3.8`. To run this notebook example, please install pyautogen, Docker, and OpenAI:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2023-02-13T23:40:52.317406Z", + "iopub.status.busy": "2023-02-13T23:40:52.316561Z", + "iopub.status.idle": "2023-02-13T23:40:52.321193Z", + "shell.execute_reply": "2023-02-13T23:40:52.320628Z" + }, + "id": "68lTZZyJ1_BI", + "outputId": "15a55fab-e13a-4654-b8cb-ae117478d6d8" + }, + "outputs": [], + "source": [ + "%pip install pyautogen~=0.2.0b5 docker\n", + "%pip install scipy\n", + "%pip install matplotlib" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HxgqKJrd1_BJ" + }, + "source": [ + "## Set your API Endpoint\n", + "\n", + "* The [`config_list_openai_aoai`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_openai_aoai) function tries to create a list of configurations using Azure OpenAI endpoints and OpenAI endpoints. It assumes the api keys and api bases are stored in the corresponding environment variables or local txt files:\n", + " - OpenAI API key: os.environ[\"OPENAI_API_KEY\"] or `openai_api_key_file=\"key_openai.txt\"`.\n", + " - Azure OpenAI API key: os.environ[\"AZURE_OPENAI_API_KEY\"] or `aoai_api_key_file=\"key_aoai.txt\"`. Multiple keys can be stored, one per line.\n", + " - Azure OpenAI API base: os.environ[\"AZURE_OPENAI_API_BASE\"] or `aoai_api_base_file=\"base_aoai.txt\"`. Multiple bases can be stored, one per line.\n", + "* The [`config_list_from_json`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_from_json) function loads a list of configurations from an environment variable or a json file. It first looks for an environment variable with a specified name. The value of the environment variable needs to be a valid json string. If that variable is not found, it looks for a json file with the same name. It filters the configs by filter_dict.\n", + "\n", + "You can set the value of config_list in any way you prefer. Please refer to this [notebook](https://github.com/microsoft/autogen/blob/main/notebook/oai_openai_utils.ipynb) for full code examples of the different methods.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YRycFEDJ1_BJ" + }, + "outputs": [], + "source": [ + "import autogen\n", + "\n", + "config_list = autogen.config_list_from_json(\n", + " \"OAI_CONFIG_LIST\",\n", + " filter_dict={\n", + " \"model\": [\"gpt-4\"],\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fBZ-XFXy1_BJ" + }, + "source": [ + "\n", + "## Construct `CriticAgent`\n", + "\n", + "We construct the planning agent named `critic` and a user proxy agent for the critic named `critic_user`. We specify `human_input_mode` as \"NEVER\" in the user proxy agent, ensuring that it will never ask for human feedback. Additionally, we define the `ask_critic` function to send a message to the critic and retrieve the criteria from the critic.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "9XAeyjd11_BK" + }, + "outputs": [], + "source": [ + "\n", + "critic = autogen.AssistantAgent(\n", + " name = \"critic\",\n", + " llm_config = {\"config_list\": config_list},\n", + " system_message = \"\"\"You are a helpful assistant. You suggest criteria for evaluating different tasks. They should be dinstinguishable, quantifieable and not redundant.\n", + " Convert the evaluation criteria into a dictionary where the keys are the criteria.\n", + " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", + " Make sure the keys are criteria for assessing the given task. \"accepted_values\" include the acceptable inputs for each key that are fine-grained and preferrably mlti-graded levels. \"description\" includes the criterion description.\n", + " Return the dictionary.\"\"\"\n", + ")\n", + "\n", + "critic_user = autogen.UserProxyAgent(\n", + " name = \"critic_user\",\n", + " max_consecutive_auto_reply = 0, # terminate without auto-reply\n", + " human_input_mode = \"NEVER\",\n", + ")\n", + "\n", + "def ask_critic(message):\n", + " \"\"\"\n", + " Initiate a chat with the critic user and return the last message received from the planner.\n", + "\n", + " Args:\n", + " - message (str): The message to be sent to the critic user.\n", + "\n", + " Returns:\n", + " - str: The content of the last message received.\n", + " \"\"\"\n", + " critic_user.initiate_chat(critic, message=message)\n", + " # return the last received from the planner\n", + " return critic_user.messagelast_message()[\"content\"]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6vPTtNkhk2V1" + }, + "source": [ + "# Run the Critic\n", + "\n", + "To run the critic, we need a couple of math problem examples. One of them failed to solve the problem successfully, given in `agenteval-in-out/response_failed.txt`, and the other one was solved successfully, i.e., `agenteval-in-out/response_successful.txt`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "5H1WRs_wkiK0" + }, + "outputs": [], + "source": [ + "def read_without_groundtruth(file_name):\n", + " \"\"\"\n", + " Read the mathproblem logs - bypassing any information about the ground truths.\n", + "\n", + " Args:\n", + " - file_name (str): The single log file that wants to get evaluated.\n", + "\n", + " Returns:\n", + " - str: The log file without any information about the ground truth answer of the problem.\n", + " \"\"\"\n", + " f = open( file_name,\"r\").readlines()\n", + " output_dictionary = \"\"\n", + " for line in f:\n", + " if \"is_correct\" not in line and \"correct_ans\" not in line and \"check_result\" not in line:\n", + " output_dictionary += line\n", + " elif \"is_correct\" in line:\n", + " correctness = line.replace(\",\",\"\").split(\":\")[-1].rstrip().strip()\n", + " return [output_dictionary,correctness]\n", + "\n", + "# Reading one successful and one failed example of the task\n", + "response_successful = read_without_groundtruth(\"../test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt\")[0]\n", + "response_failed = read_without_groundtruth(\"../test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt\")[0]\n", + "\n", + "task = {\"name\": \"Math problem solving\",\n", + " \"description\": \"Given any question, the system needs to solve the problem as consisely and acccurately as possible\",\n", + " \"successful_response\" : response_successful,\n", + " \"failed_response\" : response_failed}\n", + "\n", + "sys_msg = f\"\"\"Task: {task[\"name\"]}.\n", + "Task description: {task[\"description\"]}\n", + "Task successfull example: {task[\"successful_response\"]}\n", + "Task failed example: {task[\"failed_response\"]}\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Vu70o024lenI" + }, + "source": [ + "# The Criteria\n", + "Now, we print the designed criteria for assessing math problems. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "k9DsDB5hqvtG", + "outputId": "0edd7a0c-b031-4f67-efc6-1a1e77066921" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mcritic_user\u001b[0m (to critic):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and acccurately as possible\n", + "Task successfull example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mcritic\u001b[0m (to critic_user):\n", + "\n", + "{\n", + " \"accuracy\": {\n", + " \"description\": \"Measures the correctness of the problem solution\",\n", + " \"accepted_values\": [\"correct\", \"incorrect\"]\n", + " },\n", + " \"conciseness\": {\n", + " \"description\": \"Determines if the solution is provided in the most concise way possible\",\n", + " \"accepted_values\": [\"not concise\", \"fairly concise\", \"very concise\"]\n", + " },\n", + " \"problem_solving_time\": {\n", + " \"description\": \"Measures the time taken by the system to solve the problem\",\n", + " \"accepted_values\": [\"0-1 minutes\", \"1-5 minutes\", \"5-10 minutes\", \"10+ minutes\"]\n", + " },\n", + " \"clarity\": {\n", + " \"description\": \"Assesses the clarity of the solution provided by the system\",\n", + " \"accepted_values\": [\"not clear\", \"fairly clear\", \"very clear\"]\n", + " },\n", + " \"difficulty_level\": {\n", + " \"description\": \"The level of difficulty of the problem\",\n", + " \"accepted_values\": [\"level 1\", \"level 2\", \"level 3\", \"level 4\", \"level 5\"]\n", + " },\n", + " \"mathematics_discipline\": {\n", + " \"description\": \"The branch of mathematics the problem belongs to e.g algebra, number theory\",\n", + " \"accepted_values\": [\"algebra\", \"number theory\", \"calculus\", \"geometry\", \"statistics\", \"combinatorics\"]\n", + " }\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "\n", + "current_task_name = '_'.join(task[\"name\"].split()).lower()\n", + "gen_criteria = critic_user.initiate_chat(critic, message=sys_msg)\n", + "criteria = critic_user.last_message()\n", + "cr_file = open(f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\",\"w\")\n", + "cr_file.write(criteria[\"content\"])\n", + "cr_file.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PETPZluOEGCR" + }, + "source": [ + "*Note :* You can also define and use your own criteria by editing `criteria.txt`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SmpUZv_ylo9U" + }, + "source": [ + "# The `QuantifierAgent`\n", + "\n", + "Once we have the criteria, we need to quantify a new sample based on the designed criteria and its accepted values. This will be done through `QuantifierAgent` agent as follows. \n", + "We note that can skip the designed creteria by the agent and use your own defined criteria in `criteria_file`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "4uUkZJh_subA" + }, + "outputs": [], + "source": [ + "import json\n", + "\n", + "criteria_file = f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\"\n", + "quantifier = autogen.AssistantAgent(\n", + " name = \"quantifier\",\n", + " llm_config = {\"config_list\": config_list},\n", + " system_message = \"\"\"You are a helpful assistant. You quantify the output of different tasks based on the given criteria.\n", + " The criterion is given in a dictionary format where each key is a dintinct criteria.\n", + " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", + " You are going to quantify each of the crieria for a given task based on the task decription.\n", + " Return a dictionary where the keys are the criteria and the values are the assessed performance based on accepted values for each criteria.\n", + " Return only the dictionary.\"\"\"\n", + ")\n", + "\n", + "quantifier_user = autogen.UserProxyAgent(\n", + " name = \"quantifier_user\",\n", + " max_consecutive_auto_reply = 0, # terminate without auto-reply\n", + " human_input_mode = \"NEVER\",\n", + ")\n", + "\n", + "dictionary_for_eval = open(criteria_file,\"r\").read()\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "64rRJfB2l6lO" + }, + "source": [ + "## Running the quantifier on a single test case" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "zQ0H3sy8l-Ai" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "def get_quantifier(file,criteria_file):\n", + " \"\"\"\n", + " Running quantifier agent on individual log.\n", + "\n", + " Args:\n", + " - file (str): The log path.\n", + " - file (str): The criteria jason file path\n", + " Returns:\n", + " - dict: A dictionary including the actual success of the problem as well as estimated performance by the agent eval.\n", + " {\"actual_success\":actual_label, \"estimated_performance\" : a dictionary of all the criteria and their quantified estimated performance.} }\n", + " \"\"\"\n", + " dictionary_for_eval = open(criteria_file,\"r\").read()\n", + "\n", + " test_case , actual_label = read_without_groundtruth(file)\n", + " print(\"actual label for this case: \", actual_label)\n", + " cq_results = quantifier_user.initiate_chat(quantifier, message = sys_msg + \\\n", + " \"Evaluation dictionary: \" + str(dictionary_for_eval) +\\\n", + " \"actual test case to evaluate: \" + test_case)\n", + " quantified_results = quantifier_user.last_message()\n", + " return {\"actual_success\": actual_label, \"estimated_performance\": quantified_results[\"content\"]}\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we run the quantifier on a single math problem test case, `sample_test_case.json`, for demonstration." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Pf623aNbHZTG", + "outputId": "0031871b-a438-43f5-d2b2-c99fa1ad0dbd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and acccurately as possible\n", + "Task successfull example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "Evaluation dictionary: {\n", + " \"accuracy\": {\n", + " \"description\": \"Measures the correctness of the problem solution\",\n", + " \"accepted_values\": [\"correct\", \"incorrect\"]\n", + " },\n", + " \"conciseness\": {\n", + " \"description\": \"Determines if the solution is provided in the most concise way possible\",\n", + " \"accepted_values\": [\"not concise\", \"fairly concise\", \"very concise\"]\n", + " },\n", + " \"problem_solving_time\": {\n", + " \"description\": \"Measures the time taken by the system to solve the problem\",\n", + " \"accepted_values\": [\"0-1 minutes\", \"1-5 minutes\", \"5-10 minutes\", \"10+ minutes\"]\n", + " },\n", + " \"clarity\": {\n", + " \"description\": \"Assesses the clarity of the solution provided by the system\",\n", + " \"accepted_values\": [\"not clear\", \"fairly clear\", \"very clear\"]\n", + " },\n", + " \"difficulty_level\": {\n", + " \"description\": \"The level of difficulty of the problem\",\n", + " \"accepted_values\": [\"level 1\", \"level 2\", \"level 3\", \"level 4\", \"level 5\"]\n", + " },\n", + " \"mathematics_discipline\": {\n", + " \"description\": \"The branch of mathematics the problem belongs to e.g algebra, number theory\",\n", + " \"accepted_values\": [\"algebra\", \"number theory\", \"calculus\", \"geometry\", \"statistics\", \"combinatorics\"]\n", + " }\n", + "}actual test case to evaluate: {\n", + " \"problem\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Since $5 \\\\times 24 = 120 = 121 - 1$, it follows that $-5 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$. Adding 121 to $-5$ to make it positive, we find $(-5 + 121) \\\\times 24 \\\\equiv 116 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$, so it follows that the modular inverse of $24$ is $\\\\boxed{116}$ when taken modulo $121$.\",\n", + " \"problem_id\": \"5\",\n", + " \"response_with_ans\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 13.481226921081543,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"accuracy\": \"correct\",\n", + " \"conciseness\": \"very concise\",\n", + " \"problem_solving_time\": \"10+ minutes\",\n", + " \"clarity\": \"very clear\",\n", + " \"difficulty_level\": \"level 5\",\n", + " \"mathematics_discipline\": \"number theory\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual correctness: true\n", + "predicted coprrectness:\n", + " {\n", + " \"accuracy\": \"correct\",\n", + " \"conciseness\": \"very concise\",\n", + " \"problem_solving_time\": \"10+ minutes\",\n", + " \"clarity\": \"very clear\",\n", + " \"difficulty_level\": \"level 5\",\n", + " \"mathematics_discipline\": \"number theory\"\n", + "}\n" + ] + } + ], + "source": [ + "test_case = \"../test/test_files/agenteval-in-out/samples/sample_test_case.json\"\n", + "quantifier_output = get_quantifier(test_case,criteria_file)\n", + "print(\"actual correctness:\" , quantifier_output[\"actual_success\"])\n", + "print(\"predicted coprrectness:\\n\" , quantifier_output[\"estimated_performance\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2VtdM44WEGCS" + }, + "source": [ + "# Run `AgentEval` on the logs\n", + "\n", + "In the example below, log_path points to the sample logs folder to run the quantifier. The current sample belongs to the prealgebra category which will be downloaded from [here](https://github.com/julianakiseleva/autogen/tree/agenteval/test/test_files/agenteval-in-out/samples).\n", + "In case you want to replicate the results described in the blog post, you can download all the logs for math problems using the following [link](https://github.com/julianakiseleva/autogen/tree/agenteval/model-logs/math-problems/agentchat). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!wget https://github.com/julianakiseleva/autogen/blob/agenteval/test/test_files/agenteval-in-out/samples/prealgebra.zip \n", + "!unzip z.zip -d ../test/test_files/agenteval-in-out/agentchat_results\n", + "!rm prealgebra.zip " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dZdIbHPFEGCS", + "outputId": "83c0a51b-f184-494b-81a0-d4b4a3667319" + }, + "outputs": [], + "source": [ + "# You can set your own log path - we also limited the number of samples to avoid additional costs.\n", + "# By removing the condition about limitations on the number of samples per category, you can run it on all 120 problems\n", + "\n", + "log_path = \"../test/test_files/agenteval-in-out/agentchat_results/\"\n", + "criteria_file = \"../test/test_files/agenteval-in-out/samples/sample_math_criteria.json\"\n", + "outcome = {}\n", + "\n", + "for prefix in os.listdir(log_path):\n", + " for file_name in os.listdir(log_path+\"/\"+prefix):\n", + " gameid = prefix+\"_\"+file_name\n", + " if file_name.split('.')[-1]=='json':\n", + " outcome[gameid] = get_quantifier(log_path+\"/\"+prefix+\"/\"+file_name,criteria_file)\n", + "\n", + "# store the evaluated problems\n", + "with open(\"../test/test_files/agenteval-in-out/evaluated_problems.json\",\"w\") as file:\n", + " json.dump(outcome,file,indent=2) # use `json.loads` to do the reverse" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qbrRRiP_EGCT" + }, + "source": [ + "## Plotting the estimated performance" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here you can find an example of how to visualize the obtained result in the histogram form (similar to the one in the blog post)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LKu2xZJcEGCT", + "outputId": "7780bc7c-382f-4ad3-b8c6-ac6051302303" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import scipy.stats as stats\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# computing average and 95% interval for failed and successful cases on all criteria\n", + "try:\n", + " # convert the criteria to dict type if it is already not\n", + " dictionary_for_eval = eval(open(criteria_file,'r').read())\n", + "except:\n", + " pass\n", + "\n", + "criteria = list(dictionary_for_eval.keys())\n", + "nl2int = {}\n", + "for criterion in dictionary_for_eval:\n", + " score = 0\n", + " for v in dictionary_for_eval[criterion][\"accepted_values\"]:\n", + " nl2int[v] = score\n", + " score += 1\n", + "print(nl2int)\n", + "\n", + "average_s = {}\n", + "average_f = {}\n", + "\n", + "conf_interval_s = {}\n", + "conf_interval_f = {}\n", + "\n", + "for criterion in criteria:\n", + " task={\"s\": [] , \"f\" : []}\n", + "\n", + " for game in outcome:\n", + " try:\n", + " tmp_dic = eval(outcome[game][\"estimated_performance\"])\n", + " if outcome[game][\"actual_success\"] == \"false\":\n", + " task[\"f\"].append(nl2int[tmp_dic[criterion]])\n", + " else:\n", + " task[\"s\"].append(nl2int[tmp_dic[criterion]])\n", + " except:\n", + " pass\n", + "\n", + " \n", + " average_f[criterion] = np.mean(task['f'])\n", + " average_s[criterion] = np.mean(task['s'])\n", + "\n", + " conf_interval_s[criterion] = stats.norm.interval(0.95, loc=np.mean(task['s']), scale=stats.sem(task['s']))\n", + " conf_interval_f[criterion] = stats.norm.interval(0.95, loc=np.mean(task['f']), scale=stats.sem(task['f']))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final plot would be saved in `../test/test_files/agenteval-in-out/estimated_performance.png`" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 695 + }, + "id": "zqa86vwgEGCT", + "outputId": "248cd0bc-0927-4d9f-b911-088bd76acf5d" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABI8AAAMVCAYAAAD+r9SpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gUVd/G8XtJJwkhEEpCSaihV2lSQpEmRVC6tAcUBMWCiChIURBB4MFGEbDQiyBKL1IEqQLSQWlKCb1DCAHO+wdP9mXZTEiWFJDv57pyXdnZMzO/nezMzt45M8dmjDECAAAAAAAA4pAmtQsAAAAAAADAo4vwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AhIAZ9//rlsNpuKFCmS2qU8Ms6cOSNPT0+1aNHCss3ly5eVNm1aNWzYMMHL/e6772Sz2XTkyJEkqDL13Lx5U6+88oqCg4Pl5uamEiVKWLadNm2aqlSpoixZssjLy0shISFq0KCB1q1b91A1hIWFqX379vbHq1atks1m06pVqxzaffHFF8qbN688PT1ls9l08eJFSVKfPn2UM2dOubu7K3369A9VS3Las2eP+vfvn+D3TP/+/WWz2XT27NnkLcxFsfXdq2rVqqpatWrqFIQEiWv/Wrhwofr37x9ne5vNptdee83l9UVGRqp9+/bKnDmzvL29VaxYMU2YMMGpXewxNa6fkydPOrQdPXq0wsLCFBgYqNatW9uPBbFu3bqlEiVKqG/fvomqNTo6Wl9++aUqVaqkwMBAeXp6Klu2bGrWrJlWr16d6NeeWHEdyxK6Tx05ckQ2m03fffddstaY3GJfx7Bhw1yaf9SoUY/VNrj/8+/fJr7PvapVqz4256uJqdVms1keTwEkjHtqFwA8Cb755htJ0u7du7Vx40aVK1culStKfZkyZVLDhg01d+5cXbhwQYGBgU5tpk+frqioKHXs2DEVKkxdo0eP1tixY/XFF1+odOnS8vPzs2x77tw5VaxYUW+88YaCgoIUGRmpESNGqEqVKvrll18UERGRJDWVKlVK69evV6FChezT/vjjD73++ut66aWX1K5dO7m7u8vf318//fSTBg0apN69e6tu3bry8vJKkhqSw549ezRgwABVrVpVYWFhqV1Oshg1alRql4AHiGv/Wrhwob766qsk/8Jz6dIlVapUSTdv3tTQoUMVHBysadOm6aWXXtKlS5fUvXt3p3m+/fZbFShQwGFaxowZ7b//+uuv6tatm4YPH668efPqrbfeUo8ePTR+/Hh7mxEjRuj69evq3bt3gms9e/as6tSpox07dqhDhw565513lCFDBh0/flw//fSTatSooS1btqh48eIubIkHszqWsU8lzqhRoxQUFPSvDmQeJ0/C5x6ApEd4BCSz33//Xdu3b1e9evW0YMECTZgwIcXDI2OMbty4IR8fnxRd74N07NhRs2fP1pQpU+L8D/o333yjLFmyqF69eqlQXeratWuXfHx8EtSzIK42devWVaZMmTRhwoQkC4/SpUun8uXLO0zbvXu3JOnll19W2bJl7dN37dolSXr99deVOXPmJFn/9evXlTZt2iRZ1pPm3kACj6a49q/kMnr0aB06dEi///67SpcuLUmqXbu2IiMj1bdvX3Xo0MGpt2CRIkX01FNPWS5zwYIFqlGjht544w1JcgqhDh8+rAEDBmj+/PmJCpPbtm2r7du3a8mSJapevbrDcy1atFD37t3j/OdDUrE6lrFPpb5H9dwGrouKipK3t7dT71kAjwYuWwOSWexlAJ988omefvppTZ8+XdevX5ckxcTEKHPmzGrTpo3TfBcvXpSPj4/Dyffly5fVo0cP5cqVy95t/80339S1a9cc5o29nGHMmDEqWLCgvLy89P3330uSBgwYoHLlyilDhgxKly6dSpUqpQkTJsgY47CM6Ohovf3228qaNavSpk2rKlWqaMuWLXF25T558qQ6d+6s7Nmzy9PTU7ly5dKAAQN069ateLdN7dq1lT17dn377bdOz+3du1cbN25U27Zt5e7urmXLlum5555T9uzZ5e3trbx586pz584JunTIqvt5XJcdJHQbz5o1S+XKlVNAQIDSpk2r3Llzq0OHDg+s5caNG3rvvfcclv/qq686XN5hs9k0fvx4RUVF2S8PSWx3f39/f3l7e8vd/cH/I4iJiVHPnj3tf+tKlSpp06ZNTu3uv6ymatWqat26tSSpXLlystlsat++vcLCwtSnTx9JUpYsWZy6is+YMUMVKlSQr6+v/Pz8VLt2bW3bts1hXe3bt5efn5927typWrVqyd/fXzVq1JB095K+gQMHqkCBAvLy8lKmTJn0n//8R2fOnHFYRlhYmOrXr6/FixerVKlS8vHxUYECBew9AaW7l+Q0bdpUklStWrVEbe+jR4/q+eefV7p06RQQEKDWrVs71TBjxgzVqlVLwcHB8vHxUcGCBdWrVy+n99OhQ4fUokULhYSEyMvLS1myZFGNGjX0xx9/OC3vQdsuLve/1++9BGXEiBHKlSuX/Pz8VKFCBW3YsMFp/t9//10NGzZUhgwZ5O3trZIlS2rmzJkOba5fv27fd7y9vZUhQwY99dRTmjZt2gPrO378uDp16qQcOXLI09NTISEhatKkiU6dOiXp7n7z9ttvq0SJEgoICFCGDBlUoUIF/fTTT07LSsi+mZz7edOmTVW4cGGHaQ0aNJDNZtOsWbPs07Zu3SqbzaZ58+ZJct6/2rdvr6+++kqSHC4Vu/8yk0mTJqlgwYJKmzatihcvrvnz58dbnyT99ttvypIliz04ilW/fn1du3ZNixcvfuAy7nfjxg35+vraH/v5+enGjRv2x126dFHz5s1VrVq1BC9zy5YtWrRokTp27OgUHMUqU6aMcubMaX+8a9cuPffccwoMDJS3t7dKlChh//yLFbutp02bpt69eyskJETp0qXTM888o/3799vbxXcsi+vz48SJE2rWrJn8/f0VEBCg5s2bO13aFysh+1TsJYMrV65Uly5dFBQUpIwZM+r555/XiRMnnJY5depUVahQQX5+fvLz81OJEiWcLkVcvny5atSooXTp0ilt2rSqWLGifvnllzhrfJCE1hcWFqbdu3dr9erV9vfxvb1dHubcZvz48Qk+j0rMceR+d+7c0cCBAxUeHi4fHx+lT59exYoV02effebStrMS+7k1f/58lSxZ0v65Ebtff/fddypYsKB8fX1VtmxZ/f777w7z//7772rRooXCwsLk4+OjsLAwtWzZUn///be9TUI/9zZv3qzKlSvbj32ffPKJ7ty588DXEPt3Gjt2rPLnzy8vLy8VKlRI06dPd2gX+/5ZunSpOnTooEyZMilt2rSKjo7WnTt3NHToUPvnfObMmdW2bVsdO3YsznWuWbNG5cuXl4+Pj7Jly6YPPvhAt2/ffmCtCTl/jf28/PTTTzVkyBD7tq1atar+/PNPxcTEqFevXgoJCVFAQIAaN26s06dPO6xnxYoVqlq1qjJmzCgfHx/lzJlTL7zwgv37APDYMACSzfXr101AQIApU6aMMcaY8ePHG0nmu+++s7d56623jI+Pj7l06ZLDvKNGjTKSzI4dO4wxxly7ds2UKFHCBAUFmREjRpjly5ebzz77zAQEBJjq1aubO3fu2OeVZLJly2aKFStmpk6dalasWGF27dpljDGmffv2ZsKECWbZsmVm2bJl5qOPPjI+Pj5mwIABDutv2bKlSZMmjenVq5dZunSpGTlypMmRI4cJCAgw7dq1s7eLjIw0OXLkMKGhoWbs2LFm+fLl5qOPPjJeXl6mffv2D9xGffr0MZLMH3/84TD9nXfeMZLM3r17jTHGjB492gwePNj8/PPPZvXq1eb77783xYsXN+Hh4ebmzZv2+b799lsjyRw+fNg+LTQ01KHmWBERESYiIsL+OKHbeN26dcZms5kWLVqYhQsXmhUrVphvv/3WtGnTJt7XeufOHVO7dm3j7u5uPvjgA7N06VIzbNgw4+vra0qWLGlu3LhhjDFm/fr15tlnnzU+Pj5m/fr1Zv369eb06dMP3Ja3bt0yN2/eNIcPHzadOnUyfn5+5vfff3/gfO3atTM2m8288847ZunSpWbEiBEmW7ZsJl26dA7bbeXKlUaSWblypTHGmN27d9v/ft9++61Zv369OXDggNm6davp2LGjkWQWL15s1q9fb44ePWqMMWbQoEHGZrOZDh06mPnz55s5c+aYChUqGF9fX7N7926Hmjw8PExYWJgZPHiw+eWXX8ySJUvM7du3TZ06dYyvr68ZMGCAWbZsmRk/frzJli2bKVSokLl+/bp9GaGhoSZ79uymUKFCZuLEiWbJkiWmadOmRpJZvXq1McaY06dPm48//thIMl999VWCtne/fv2MJBMaGmreeecds2TJEjNixAj73/He9+NHH31k/vvf/5oFCxaYVatWmTFjxphcuXKZatWqOSwzPDzc5M2b10yaNMmsXr3azJ4927z99tv2bZ2YbRdb373uf68fPnzYSDJhYWGmTp06Zu7cuWbu3LmmaNGiJjAw0Fy8eNHedsWKFcbT09NUrlzZzJgxwyxevNi0b9/e/neP1blzZ5M2bVozYsQIs3LlSjN//nzzySefmC+++MJyWxpjzLFjx0xwcLDDfjdjxgzToUMH+/5/8eJF0759ezNp0iSzYsUKs3jxYtOjRw+TJk0a8/3339uXlZB9M7n38zFjxhhJ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UZ48eZL8fllASmC0NSCZfPPNNzLG6IcfftAPP/zg9Pz333+vgQMHys3NTS1btlT37t313XffadCgQZo0aZIaNWrk8N+1oKAg+fj4OIRO9woKCnJ4HNdIFdOnT5eHh4fmz58vb29v+/S5c+c6tIs9aTh16pTDl4hbt245fRAHBQWpWLFiGjRoUJx1xZ60x+f5559XYGCgvvnmG0VERGj+/Plq27atfXj6Xbt2afv27fruu+/Url07+3wHDhx44LKlu71NoqOjnaafPXvWYbslZhs/99xzeu655xQdHa0NGzZo8ODBatWqlcLCwlShQoU458+YMaNu3bqlM2fOOARIxhidPHnS3tMhKbi7u6tUqVJON2CNqybp7k0jH/S3flix2++HH36w9xqLT1zv4dgbslrd0PfeXhjJzWqbxW7TFStW6MSJE1q1apXDiHf33hw9VmhoqP3Gtn/++admzpyp/v376+bNmxozZkyit11SiV3ve++9p+effz7ONuHh4ZIkX19fDRgwQAMGDNCpU6fsvZAaNGhg/0IXl0yZMlneBDXW5MmTlStXLs2YMcPhfRHXfv2gfTO593Ppbng0YcIEbdq0SRs3brTfdLl69epatmyZ/v77b/n5+aXY6GpxqVu3rv7++28dOHBAt27dUv78+e3HiypVqjxwfmOMw3/h7xcdHa3OnTvrgw8+UJ48ebRr1y4dOnRIPXr0kI+Pjzp16qT33ntP69evtxxRs3bt2nr//fc1d+5c1alT54E1ZcyYUZGRkU7TY2/efP/nZFLKmDFjnAMN3H/D7MTsUwkV+3ly7Ngxp15X96/3iy++sHzfxfUlPLklxbmNpASdRyXmOHI/d3d3de/eXd27d9fFixe1fPlyvf/++6pdu7aOHj1qORLovHnzHJafkHMiV126dEnz589Xv3791KtXL/v06Ohol4NBV8V1o/jYafcHU/f/TWOfj4yMdApET5w44fSeiA1GE7KueyXF+WtCVa5cWZUrV9bt27f1+++/64svvtCbb76pLFmy2K9OAB4HhEdAMrh9+7a+//575cmTR+PHj3d6fv78+Ro+fLgWLVqk+vXrKzAwUI0aNdLEiRNVoUIFp0u2pLuj4Hz88cfKmDGjcuXK5VJdNptN7u7uDpepREVFadKkSQ7tYr84zJgxQ6VKlbJP/+GHH5xGUKtfv74WLlyoPHnyuDxcsre3t1q1aqUxY8ZoyJAhiomJcXj9sScW9w/vPHbs2AQtPywsTDt27HCY9ueff2r//v0OJyGubGMvLy9FREQoffr0WrJkibZt22b5pbJGjRoaOnSoJk+erLfeess+ffbs2bp27Zp9NLGkcOPGDW3YsEF58+aNt13saEFTpkxxGHlp5syZDxwtL7Fq164td3d3HTx40KmbekLVr19f06dP1+3bt1WuXLkkqcvV3gZW2yx2m7r6vs2fP7/69Omj2bNna+vWrZKSZtu5Ijw8XPny5dP27dv18ccfJ3i+LFmyqH379tq+fbtGjhyp69evW365qlu3riZNmqT9+/dbfmm22Wzy9PR0+JJx8uTJeEdJsto3k3s/l+7u6zabTR988IHSpEljP6Y+88wzeuedd/T333+rSpUq8vDweOB6pbvvzeQYjtxmsylfvnyS7o5i+Nlnn6lEiRIPDI8OHz6s3377Ld6eUx9//LE8PT3Vo0cPSbKP6Hnt2jX5+/srJiZG0dHRTiN93qtUqVKqW7euJkyYoGbNmsU54trvv/+uzJkzK2fOnKpRo4Z+/PFHnThxwuGL38SJE5U2bdpkDeuqVaummTNn6ueff3a4hGbq1KkO7Vzdp+JTq1Ytubm5afTo0Zbvy4oVKyp9+vTas2ePXnvttSRZb2JY9VpJinMbSQk6j3LlOBKX9OnTq0mTJjp+/LjefPNNHTlyRIUKFYqzbdGiRRP/Ylxks9lkjHH6zBk/frzTyGMP08suIX755RedOnXKHkjevn1bM2bMUJ48eR7Y0zR2P588ebLDP9U2b96svXv32nvLx7py5Uqc+929x964JMX5a2K5ubmpXLlyKlCggKZMmaKtW7cSHuGxQngEJINFixbpxIkTGjJkiNNQvpJUpEgRffnll5owYYLq168v6W6X6xkzZui1115T9uzZnU7K33zzTc2ePVtVqlTRW2+9pWLFiunOnTv6559/tHTpUr399tsP/DJdr149jRgxQq1atVKnTp107tw5DRs2zOlEo3DhwmrZsqWGDx8uNzc3Va9eXbt379bw4cMVEBDg8N/mDz/8UMuWLdPTTz+t119/XeHh4bpx44aOHDmihQsXasyYMQ88UZDuXrr21VdfacSIESpQoICefvpp+3MFChRQnjx51KtXLxljlCFDBs2bN0/Lli174HIlqU2bNmrdurW6du2qF154QX///beGDh3qdPlYQrdx3759dezYMdWoUUPZs2fXxYsX9dlnnznczyYuNWvWVO3atfXuu+/q8uXLqlixonbs2KF+/fqpZMmScQ41nBBPP/20GjZsqIIFCyogIEBHjhzR6NGjdfDgQf3444/xzluwYEG1bt1aI0eOlIeHh5555hnt2rVLw4YNc7pk7GGFhYXpww8/VO/evXXo0CHVqVNHgYGBOnXqlDZt2mTvuRKfFi1aaMqUKXr22Wf1xhtvqGzZsvLw8NCxY8e0cuVKPffcc2rcuHGi6ipSpIgk6euvv5a/v7+8vb2VK1euB162N2fOHLm7u6tmzZravXu3PvjgAxUvXtx+ueXTTz+twMBAvfLKK+rXr588PDw0ZcoUbd++3WE5O3bs0GuvvaamTZsqX7588vT01IoVK7Rjxw77f4+TYtu5auzYsapbt65q166t9u3bK1u2bDp//rz27t2rrVu32oefL1eunOrXr69ixYopMDBQe/fu1aRJk1ShQgXL4Ei6ewxZtGiRqlSpovfff19FixbVxYsXtXjxYnXv3l0FChRQ/fr1NWfOHHXt2lVNmjTR0aNH9dFHHyk4ONjhsriE7JvJvZ9LUubMmVWkSBEtXbpU1apVs7/+Z555RufPn9f58+c1YsSIB2772C+eQ4YMUd26deXm5qZixYrZL4t4GN26dbMPHX3o0CF9/vnnOnbsmNN9Pp555hlVqVJFxYoVU7p06bRz504NHTpUNptNH330UZzL3rdvn4YOHaqVK1fa750WHh6u0NBQdenSRa+++qpmzJghd3f3BwY6EydOVJ06dVS3bl116NBBdevWVWBgoCIjIzVv3jxNmzZNW7ZsUc6cOdWvXz/7fUz69u2rDBkyaMqUKVqwYIGGDh2qgICAh95uVtq2bav//ve/atu2rQYNGqR8+fJp4cKFWrJkiVPbhO5TCRUWFqb3339fH330kaKiotSyZUsFBARoz549Onv2rAYMGCA/Pz998cUXateunc6fP68mTZooc+bMOnPmjLZv364zZ85o9OjRSbU5nBQtWlTTp0/XjBkzlDt3bnl7e6to0aJJcm4T60HnUQk9jsSlQYMGKlKkiJ566illypRJf//9t0aOHKnQ0FB7AJva0qVLpypVqujTTz9VUFCQwsLCtHr1ak2YMEHp06d3aOvq515CBQUFqXr1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lELPIwBAgo0ePVpdu3ZVcHCwGjdurIwZMyoyMlKbNm3S3Llz4/xPdkL99ddfqlatmo4fP65KlSqpUaNGunbtmnbt2qVBgwY5fEH/8ccf1bJlS925c0cNGjRQeHi4Tp8+rY0bN2rChAlq0KCBve3777+vwYMHK3v27HrhhReULl06/frrr3rnnXe0ceNGzZo1y972vffe09ChQ5UnTx61atVK/v7+On78uNasWaMVK1aoSpUqSbYdfvnlF0lS+fLlXd5mCRHby8Ld/cEf+cYY1a5dWxs3blTFihVVp04dpUmTRkeOHNGPP/6odu3aKUeOHJLufoEaPny4atSooXLlysnDw0Pbtm3T6NGjtWTJEm3dujXO/553795dGzduVIMGDeTm5qbp06erVatWCgwM1FdffaVdu3bp2Wef1Y0bNzR16lQ1bNhQ+/btU65cuZyW1bRpU+3YsUNNmzZVTEyMZs6cqY4dO+rUqVMJutfQwYMH7V9Oa9WqpUaNGun06dOaPXu2lixZol9++UXlypWTdDcsK1u2rK5du6Z69eqpefPmunr1qv766y998cUXTgGnp6enSpcurXXr1unatWtcupaKYkOikSNHSpLefPNNSbJftrV371717dtX1apVU+PGjeXr66t9+/Zp6tSpWrBggbZu3arQ0FCX1m2MUevWrTV16lTlz59frVq1kqenp5YtW6aOHTtqz549Gjbs/++Td/36dVWtWlU7d+5UhQoVFBERoaNHj6p58+aqVatWotad2GNMVFSUpk2bJi8vL7Vp0yZB8/zxxx96+umn5ebmpueee06hoaG6ePGidu/erXHjxqlXr172tkOGDNGBAwdUvnx5NW7cWBcvXtTixYvVuXNn7d+/P85/Ely4cEGVKlVS1qxZ1a5dO/3555+aP3++9u3bp59//lmVK1dWqVKl1KFDB23ZskU//PCDLl68qGXLljkt69ChQ6pYsaLKli2rrl276q+//tKPP/6otWvXat26dSpYsOADX++YMWPUtWtXBQYGqkGDBsqUKZM2b96sQYMGaeXKlVq5cqU8PT0lJf5zokKFCpKkFStW6OWXX07Q9geAlER4BABIsPHjx8vT01Pbt29XpkyZHJ47d+7cQy27devWOn78uL7++munE+djx47Zfz99+rTatm0rd3d3rVmzRiVLlrRsu2zZMg0ePFh169bVDz/8oLRp00q6+4Wua9euGjNmjGbPnq0XXnjB/vqyZcumHTt22NvGtr9w4UKSbod169YpW7Zsypw5c4Lau+LKlSv64Ycf5O3trcqVKz+w/a5du7Rx40Y1btxYc+bMcXguOjpaMTEx9sfVq1fXyZMnnS6HmThxotq1a6cvv/xSvXv3dlrHnj17tGPHDvt2a9++vcqXL68WLVqoSJEi2rlzpz1oqV27tpo3b66RI0fqs88+c1rWoUOHtGvXLvn7+0uSevfurVKlSqlv375q3ry5cufOHe/rbdu2rU6ePKklS5aoZs2a9ul9+vTRU089pZdfflk7duyQdLcHwcWLF/XZZ5/p9ddfd1jO2bNn41x+6dKl9euvv2rTpk2qVq1avLUg+VStWlVVq1a19xS6v0dkwYIFFRkZ6dTTb+XKlXrmmWc0cOBAjRs3zqV1jx8/XlOnTlXHjh01ZswYe4h78+ZNNWnSRMOHD1fLli1VunRpSdLQoUO1c+dOvfzyyw49ctq2bZvoexAl9hjzww8/6NKlS2rRokWCez1OmjRJ0dHR+umnn9SwYUOH5+4/Fo4ePdopBL5165aeffZZffbZZ3rjjTeUM2dOh+d37Niht956SyNGjLBP69Kli8aMGaNKlSqpf//+euONNyTdPU7Xr19fCxcu1LZt25w+G9asWaM+ffroo48+sk+LPV699tpr9rDNyp49e9StWzeVKFFCy5cvd9hGn3zyid577z198cUX9n90JPZzIleuXMqQIUOCe4kCQErjsjUAQKJ4eHjEec+QjBkzurzMzZs3a9OmTapSpUqc/3HNnj27/ffvv/9eV69e1dtvv+305eD+tl9++aUkaezYsQ5hkM1m0yeffCKbzaZp06Y5zO/p6enUS8dmszl9mXqY7XDz5k2dOXNGWbJkeWDbh/HKK6/o1KlTev/99xP19/Hx8XGa5uXl5RAUZc6c2Sk4kqQ2bdooXbp0Wr58eZzL7t27t8MXqXLlyil37ty6ePGiBg0a5NBD54UXXpCHh4e2b99uuazY4EiSsmbNqu7du+vWrVuaOnVqvK9x27ZtWrdundq1a+cQHEl37yH18ssva+fOnU6Xr8W1bYKCguJcR+zf995AE4+egICAOMOSatWqqXDhwpbv5YT48ssv5evrqy+//NLhuOLp6alBgwZJksMxaOLEifL09NSHH37osJxatWqpRo0aCV6vK8eYCRMmSJJL9+iKa7+4/5gTV+9Bd3d3vfLKK7p9+7ZWrlzp9Lyfn59D2CNJrVq1si//3iDXZrOpRYsWkhTnMSMwMNChJ5R093hVpEgRrVixwuGy3LiMHTtWt27d0ueff+70funZs6cyZcrk9HmS2M+JzJkz6/jx4zLGxFsLAKQGeh4BABKsWbNm6tWrl4oUKaIWLVqoatWqqlSpktKnT/9Qy920aZMkJeiyjMS03bBhg3x9fe1fiu7n4+Ojffv22R83a9ZMY8aMUZEiRdS8eXNFRESoQoUKTpccPex2iP2vc2BgYILau+L999/X1KlTVadOHb3//vsJmqdgwYIqWrSopk6dqqNHj6pRo0b2y0Lc3Nyc2s+ZM0djx47V1q1bdeHCBYd7SJ04cSLOdcQV+AUHB+vQoUMqUaKEw3Q3Nzf7l6m4xNWbKnbaH3/8YfUyJd19b0jSyZMn47w3V+z7Yt++fSpSpIjq16+vXr166dVXX9WyZctUp04dVapUSfnz57dcR+wXTKueSXh0rFq1SiNHjtTGjRt19uxZ3bp1y/5c7GVIiXX9+nXt3LlTISEhTvf/kWTvyRf7Xrty5YoOHz6sQoUKKWvWrE7tK1eu/MDeMbESe4w5cOCAfv31V+XKlUvVq1dP0DyS1KRJE40cOVKNGjVSs2bNVLNmTVWqVMmpB5F09/UNGzZMc+fO1cGDB3Xt2jWH5+M6ZuTLl8/p+Bs7yl2xYsVks9nifC6uY0bJkiWdlmWz2VSpUiXt2rVL27dvt1+WG5fYY8bixYvjDBQ9PDycPk8S+zmRIUMG3b59WxcvXkzWzwcAcAXhEQAgwXr27KmMGTNqzJgxGjFihIYPHy53d3c9++yzGjlyZJz/WU6IixcvSpKyZcuWpG3Pnz+vW7duacCAAZZt7v0C8/nnnyt37tz67rvvNHDgQA0cOFDe3t5q1qyZhg8fbu9h8rDbIfa/9FFRUQ98Da4YMGCABg8erOrVq2vOnDlxBj9xcXd314oVK9S/f3/NmTPHfvlFUFCQunXrpt69e9uXNXz4cPXo0UOZMmVSrVq1lD17dvvrGjlypKKjo+NcR7p06eJcb3zP3Xu53L3iuhwntqfFpUuX4n2t58+flyQtWLBACxYssGwX+/7IlSuX1q9frwEDBmjRokX2e2WFh4fro48+ivOmxLF/33t7veHRM2vWLDVv3lx+fn6qXbu2wsLClDZtWvtNsf/++2+XlnvhwgUZY3T8+PEEHYNi37NWl5klphdRYo8xEyZMkDFGHTp0cApk4lOhQgWtWLFCgwcP1rRp0+yXBpYuXVqffvqp/XLNmzdvqmrVqtq6datKliypNm3aKGPGjHJ3d9eRI0f0/fffx3nMcOV4ISnOY8aDtmtCjxmxPcYexJXPCY4ZAB5lhEcAgASz2Wx66aWX9NJLL+ncuXNas2aNpk2bppkzZ+qvv/7Szp075ebmZh/1697/3seK6wQ99j+xVj1MrNrG3vDWSrp06WSz2RLc88PDw0PvvPOO3nnnHZ04cUKrV6/Wt99+q4kTJ9rvjSMlfDvE9xo8PDzsX0aS0oABA9S/f39VrVpV8+bNi/NykvgEBQXpyy+/1BdffKF9+/ZpxYoV+uKLL9SvXz95eHjovffe061bt/TRRx8pJCREf/zxh8NlaMYYDR06NKlfVpxOnz7t1FPg1KlTkvTAoa5jv3h+8cUXeu211xK0vmLFimn27NmKiYnRli1btGjRIn3++edq3ry5QkJCVLFiRYf2sX/f++93gkdL//795e3trS1btihfvnwOz8WOBOiK2PdY6dKl9fvvvye4fVyjFUr//95OiMQcY27fvq3vv/9ebm5u+s9//pPgdcSKiIhQRESEoqKitHHjRs2bN0+jRo1SvXr1tHPnTuXJk0c//fSTtm7dqpdeesnp/lHTp0/X999/n+j1JtaDtmtCjxmXL192uFzWiiufE+fPn5e/v7+8vLwS8pIAIEVxzyMAgEsyZsyoRo0aacaMGapevbr27t2rAwcOSPr/SyXiCoO2bdvmNK1s2bKSpKVLlz5wvYlpW65cOZ07d05//fXXA9veLyQkRC1bttTixYuVL18+LV++PM7/4se3HeJTpEgRHTlyxLJXjSv69++v/v37KyIiQgsWLHio/17bbDYVLFjQfpmWJP3888+S7l6GdenSJZUvX94pGPn999+TrUfV/dasWWM57f5L4O4XO4ra+vXrE71eDw8PlS9fXgMGDNDnn38uY4zmz5/v1G7//v2SpKJFiyZ6HUg5Bw8eVMGCBZ2CoxMnTujgwYMuL9ff318FCxbU3r177T0m45MuXTrlypVLBw4c0MmTJ52ej+v9Hp+EHmMWLlyoyMhI1alTJ0E9Oq34+PioatWqGj58uN5//31FRUXZL++K3Y7331RbSvzrctW2bducLpWTpN9++02SVLx48Xjnjz1mxF6+lhgJ+Zy4fv26jh07xvECwCOL8AgAkGBLlixx6k0UExNj/+92bC+X8PBw+fn56eeff3b4z/epU6c0cOBAp+WWKVNGZcuW1a+//hrnqEb3hlDt2rWTn5+fhg8fHud9be5tG3sz1Q4dOsQ5us3Jkye1d+9eSXdHE1uxYoXTjUqvXbumK1euyMPDw/5f4oRuh/hEREToxo0b2rlz5wPbJkS/fv00YMAAVa5c2eXg6PDhw9qzZ4/T9Nj/zMe+rsyZM8vHx0dbt27V9evX7e0uXLigbt26ufgKEm/QoEG6cuWKQ50jRoyQu7u7/aa6VsqWLaty5cpp2rRpmjFjhtPzd+7c0erVq+2PN2/eHGfPhfu3zb02btyo4OBgp1ACj5bQ0FAdOHDAoWfPjRs31KVLlzh7TybG66+/ruvXr+vll1+OM7g4fPiwjhw5Yn/cpk0b3bx5U3379nVot3Tp0gTf7yhWQo8xsfeE69ixY6KWL90Nfi5fvuw0/f79IjQ0VJK0du1ah3arV692eSS7xLpw4YLTvacmTpyonTt3qnr16vHe70iSunbtKnd3d3Xr1i3Om2tfvHjR4Z8jif2c+P3333X79m1FREQk6nUBQErhsjUAQII1b95cadOmVaVKlRQaGqqYmBgtW7ZMe/bsUfPmze03SfX09NRrr72mTz75RKVKldJzzz2nK1euaN68eYqIiIjzv/mTJ09W1apV1alTJ02aNEkVKlTQjRs3tHv3bm3bts0e/mTOnFkTJ05UixYtVLZsWTVs2FDh4eE6e/asNm7cqLCwMM2dO1eSVKdOHX3wwQf66KOPlDdvXtWpU0ehoaE6d+6cDhw4oDVr1mjgwIEqWLCgoqKiVKNGDeXOnVvlypVTzpw5dfXqVc2fP18nT57Uu+++a79xbkK3Q3waNWqkkSNHavny5SpVqpTT8z169LBfbhf75a9Hjx72Ec569eqlAgUKSJK+++47ffjhh3J3d1fZsmX16aefOi0vdrjy+Gzfvl2NGzdWmTJlVKRIEWXNmlXHjx/X3Llz5ebmZr8HUpo0adS1a1cNHz5cxYsXV4MGDXT58mUtWrRIoaGhCgkJeeDrTwq5c+dWkSJF9MILLygmJkYzZ87U6dOnNWjQIOXOnfuB80+bNk3VqlVTixYtNHLkSJUuXVre3t76559/tH79ep05c0Y3btyQJE2ZMkWjRo1S1apVlTdvXqVLl0579uzRwoULFRQUpA4dOjgs++DBgzp8+LC6dOmSLK8dSadbt27q1q2bSpYsqSZNmujWrVtatmyZjDEqXry45Wh/CdG5c2dt2LBB33//vX777Tc988wzCgkJ0alTp7Rv3z5t3LhRU6dOtV+C27NnT82ZM0fjxo3T7t27VaVKFR09elQzZ85UvXr14r0/1/0edIyR7oY8CxYsUJYsWdSgQYNEv77hw4dr2bJlqlatmnLnzi1vb29t3bpVv/zyi/LmzavGjRtLkho0aKCwsDANHTpUu3btUpEiRbR//37Nnz9fjRo10uzZsxO97sSqXLmyPv/8c23YsEFlypTRn3/+qR9//FEBAQH2kTnjU6RIEY0aNUpdunRReHi4nn32WeXJk0eXL1/WoUOHtHr1arVv315jxoyRlPjPidgeno0aNUry1w4AScL8y126dMlIMpcuXUrtUgD8C0RFRZk9e/aYqKio1C4lVYwaNco0bNjQhIaGGm9vb5MxY0ZTrlw5M3bsWBMTE+PQ9tatW6Zv374mR44cxtPT0+TPn9989tln5tChQ0aSadeundPyT548ad544w2TO3du4+npaTJkyGDKlStnRowY4dR227ZtplmzZiZLlizGw8PDBAcHm7p165r58+c7tV22bJlp0KCByZQpk/Hw8DBZs2Y1FSpUMB999JH5559/jDHG3Lx50wwZMsTUqlXLZM+e3Xh6eposWbKYiIgIM336dJe3Q3wKFChgihYtGudzoaGhRpLlz8qVK+1t+/XrF29bSaZfv34PrOfo0aOmV69epnz58iZz5szG09PT5MyZ0zRp0sRs3LjRoe3NmzfNoEGDTL58+YyXl5fJmTOn6d69u7ly5YoJDQ01oaGhDu3btWtnJJnDhw87rTciIsJYnZLEtazY9tevXzc9evQw2bJlM56enqZw4cJm/PjxTstYuXKl5TY4f/686dOnjylSpIjx8fExfn5+Jl++fKZVq1Zmzpw59nYbNmwwnTt3NkWKFDHp06c3Pj4+Jl++fOb111+3v4fu1b9/fyPJ/PHHH3G+LqS8uN5Lxhhz584dM2bMGFO4cGHj7e1tsmbNajp27GhOnToV53vz22+/NZLMt99+m6Dl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6fbt27z44osEBASwYMECzp8/T5kyZahduzbGGNatW8err75K5cqVOXLkyF++rqurK1WqVKFixYr3PDdjxgzGjh3rkPDokUceoUqVKpQtWzbbX1tERERyNxdHN0BERETkQUtNTaV58+Zs376dRx99lIiICDp16kT+/Pntx/zwww/MmjWLRYsWcfr0aWrVqvWXrl26dGmOHz/+TzX9b/Pz88uR7RIREZGHn8IjERERyXXGjh3L9u3bKVGiBDt37rxvfaLq1aszb948unfvjpOTJmOLiIiIZEXflERERCRXuXnzJrNmzQIylpH9WWHrgIAA/P39ARgzZgwWi4UxY8bwyy+/0L9/f8qXL4+rqyuvvPIKcP+C2UuWLMFisXD+/HkAKlSogMVisf/ZvHlzpte8ceMGI0eOpGbNmhQoUABPT0/q1avHggULsFqt97TxlVdewWKxsGTJEs6ePcsrr7xC6dKlcXFxYcyYMcAfF8zetWsXw4YNo27duhQvXhw3NzfKlClDSEgIR48e/fP/qSIiIpKnaeaRiIiI5Crr1q0jISGBYsWK8cILL/yta/zyyy/UrVuXixcvUqNGDby8vHB2ds7y+BIlSvDss8+yb98+kpOTqVu3Lm5ubvbnvby87D8fPXqUFi1acPHiRfLly0elSpVITk5mz5497N69mw0bNrBq1SosFss9r3PixAn+9a9/kZSURI0aNShYsOB9j/u97t27c/r0aYoUKULJkiUpVaoU586d4+OPP+bTTz/lq6++0i5tIiIikiWFRyIiIpKr7NixA4Bnn30WF5e/91Xngw8+wM/Pj+3bt+Pj4wPAnTt3sjy+VatWtGrVivLly3P+/HmioqLuO+MpMTGRdu3acfHiRQYMGMC4ceMoWLAgkFGDqXPnzqxevZq5c+fSr1+/e85/7733CAoKYvHixXh7e/9pu2xGjx5NQEAAvr6+9sfS0tL46KOPeO211+jduzenTp3S8j0RERG5L31DEBERkVzl4sWLQMbSsb/LxcWF1atX24MjAHd39/+5bR9++CGnT5+mQ4cOzJw50x4cQUYNpuXLl2OxWJg2bdp9zy9WrBjLly+3B0d/tV09evTIFBxBRh979+7NSy+9xJkzZ9i1a9ff7JWIiIjkdpp5JCIiIrlKQkICAAUKFPjb12jWrBmlSpV6UE2yW7NmDQB9+vS57/O1a9emfPnynDlzhp9//jlTeAXQsWPHv92v48ePExkZyZEjR7hx4wZpaWkA/PTTTwDExMTYaz+JiIiI3E3hkYiIiOQqnp6eQMYSsb+rWrVqD6o5mRw5cgTIWEY2YcKE+x5z7do1IGMG1e/Do7/brokTJzJq1Kj7FuO2uXHjxt+6toiIiOR+Co9EREQkVyldujQAZ8+e/dvX+F9mLf2RmzdvArB///4/PTYpKemex/5Ou7Zu3cqIESNwdnZm4sSJtG3blnLlyvHII49gsVgYNWoU48ePJzU19b++toiIiOQNqnkkIiIiuYpt6dWOHTvsS7NyCg8PDwBOnTqFMeYP/zyo3c8++eQTAMLCwhg+fDjVq1enQIEC9l3aLly48EBeR0RERHIvhUciIiKSqwQGBuLh4cHVq1dZvXp1tr62LZDJSvXq1QGIjY3NjuYAcO7cOYAs6xnFxMRkW1tERETk4aTwSERERHKVQoUK8cYbbwAwaNAge3iSle3bt7Njx44H8tr58+cH7r/kDCA4OBiAWbNmYYx5IK/5V9t05cqVe57bsGGDwiMRERH5UwqPREREJNcZM2YM9evX58qVK9SvX59ly5Zx586dTMecPHmSfv360ahRI65evfpAXtfX1xeALVu23Pf5vn374uvry3fffUe3bt2Ii4vL9Pxvv/3GqlWrGDx48ANpD0BAQAAAkyZNylQHau/evfTq1Qt3d/cH9loiIiKSOyk8EhERkVwnX758bNiwgY4dO3L58mV69OiBt7c3tWrVws/PDx8fH6pUqcLcuXN59NFHqVSp0gN53RdffBGA//f//h+1atWiUaNGNGrUiEOHDgEZNY/WrVtHhQoViIyMxMfHh+rVq1OvXj2qVKlCoUKFePHFFx/YTCiA0NBQfH19OX36NFWrVqV27dpUrVoVPz8/vLy8eP311x/Ya4mIiEjupPBIREREciUPDw9Wr17N1q1b6d27N2XKlOHcuXPExMRgjCEoKIhFixZx8uRJatas+UBeMyQkhJkzZ1K7dm1Onz7Nli1b2LJlC7/++qv9mKpVqxITE8OkSZN4+umnuXjxIocOHSIlJYWGDRsyZcoUVqxY8UDaA1CwYEG2bdtGjx49KFiwICdOnCAlJYXBgwezc+dOPD09H9hriYiISO5kMdm14F5ERERERERERB46mnkkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZ+v8AQjK9N7po96QAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a bar plot with error bars for the average values of \"s\" and \"f\" for each criterion\n", + "\n", + "plt.figure(figsize=(12, 8))\n", + "bar_width = 0.1\n", + "index = np.arange(len(criteria))\n", + "\n", + "\n", + "plt.bar(index , list(average_s.values()), bar_width, label=f\"success ({len(task['s'])} samples)\", color=\"darkblue\", yerr=[(avg - conf_interval_s[key][0]) for key, avg in average_s.items()], capsize=5)\n", + "plt.bar(index + bar_width, list(average_f.values()), bar_width, label=f\"failed ({len(task['f'])} samples)\", color=\"lightblue\", yerr=[(avg - conf_interval_f[key][0]) for key, avg in average_f.items()], capsize=5)\n", + "\n", + "plt.xlabel(\"Criteria\", fontsize=16)\n", + "plt.ylabel(\"Average Value\", fontsize=16)\n", + "plt.title(\"Average Values of 3 different baselines cases with 95% Confidence Intervals - math problems \", fontsize=12, pad=10) # Adjust titlepad to move the title further above\n", + "plt.xticks(index + bar_width / 2, criteria, rotation=45, fontsize=14)\n", + "plt.legend(loc=\"upper center\", fontsize=14, bbox_to_anchor=(0.5, 1), ncol=3) # Adjust legend placement and ncol\n", + "plt.tight_layout() # Adjust subplot parameters to fit the labels\n", + "plt.ylim(0,5)\n", + "plt.savefig(\"../test/test_files/agenteval-in-out/estimated_performance.png\")\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + }, + "vscode": { + "interpreter": { + "hash": "949777d72b0d2535278d3dc13498b2535136f6dfe0678499012e853ee9abcab1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/test/test_files/agenteval-in-out/samples/sample_math_criteria.json b/test/test_files/agenteval-in-out/samples/sample_math_criteria.json new file mode 100644 index 000000000..e7ba16546 --- /dev/null +++ b/test/test_files/agenteval-in-out/samples/sample_math_criteria.json @@ -0,0 +1,26 @@ +{ + "Problem Interpretation": { + "description": "Ability to correctly interpret the problem.", + "accepted_values": ["completely off", "slightly relevant", "relevant", "mostly accurate", "completely accurate"] + }, + "Mathematical Methodology": { + "description": "Adequacy of the chosen mathematical or algorithmic methodology for the question", + "accepted_values": ["inappropriate", "barely adequate", "adequate", "mostly effective", "completely effective"] + }, + "Calculation Correctness": { + "description": "Accuracy of calculations made and solutions given", + "accepted_values": ["completely incorrect", "mostly incorrect", "neither", "mostly correct", "completely correct"] + }, + "Explanation Clarity": { + "description": "Clarity and comprehensibility of explanations, including language use and structure", + "accepted_values": ["not at all clear", "slightly clear", "moderately clear", "very clear", "completely clear"] + }, + "Code Efficiency": { + "description": "Quality of code in terms of efficiency and elegance", + "accepted_values": ["not at all efficient", "slightly efficient", "moderately efficient", "very efficient", "extremely efficient"] + }, + "Code Correctness": { + "description": "Correctness of the provided code", + "accepted_values": ["completely incorrect", "mostly incorrect", "partly correct", "mostly correct", "completely correct"] + } + } diff --git a/test/test_files/agenteval-in-out/samples/sample_math_evaluated_results.json b/test/test_files/agenteval-in-out/samples/sample_math_evaluated_results.json new file mode 100644 index 000000000..453b8498c --- /dev/null +++ b/test/test_files/agenteval-in-out/samples/sample_math_evaluated_results.json @@ -0,0 +1,13 @@ +{ + "sample_algebra.json": { + "actual_success": "true", + "estimated_performance": { + "Problem Interpretation": "completely accurate", + "Mathematical Methodology": "completely effective", + "Calculation Correctness": "completely correct", + "Explanation Clarity": "very clear", + "Code Efficiency": "very efficient", + "Code Correctness": "completely correct" + } + } +} diff --git a/test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt b/test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt new file mode 100644 index 000000000..165448351 --- /dev/null +++ b/test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt @@ -0,0 +1,32 @@ +{ + "problem": "Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.", + "level": "Level 5", + "type": "Algebra", + "solution": "We have \\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\quad \\Rightarrow\n\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\quad \\Rightarrow\n\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\quad \\Rightarrow\n\\\\ (2x+10-(3x+24))(x+3)&<0 \\quad \\Rightarrow\n\\\\ (-x-14)(x+3)&<0 \\quad \\Rightarrow\n\\\\ (x+14)(x+3)&>0.\n\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\n\nLet's first find the factorized form of the quadratic:", + "role": "assistant" + }, + { + "content": "", + "role": "user" + }, + { + "content": "I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\n\n```python\nfrom sympy import symbols, factor\r\nx = symbols('x')\r\nfactorized = factor(x**2 + 17*x + 42)\r\nfactorized\r\n```\n\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.", + "role": "assistant" + } + ], + "time": 24.91333508491516, + "check_result": "the reply doesn't contain an answer.", + "is_correct": false, + "trial": -1 +} diff --git a/test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt b/test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt new file mode 100644 index 000000000..89e9ab7b1 --- /dev/null +++ b/test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt @@ -0,0 +1,24 @@ +{ + "problem": "What is the sum of all the distinct positive two-digit factors of 144?", + "level": "Level 5", + "type": "Number Theory", + "solution": "Prime factorize $144=2^4\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\cdot3^2+2^2\\cdot3+2^2\\cdot3^2+2^3\\cdot3+2^3\\cdot3^2+2^4\\cdot3=\\boxed{226}.$", + "correct_ans": "226", + "problem_id": "0", + "response_with_ans": "To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\n\nHere's a Python script to accomplish this:\n\n```python\ntwo_digit_factors = []\n\nfor i in range(10, 100):\n if 144 % i == 0:\n two_digit_factors.append(i)\n\nsum_of_factors = sum(two_digit_factors)\nprint(\"The sum of all the distinct positive two-digit factors of 144 is:\", sum_of_factors)\n```\n\nPlease run this script to find the desired sum.", + "round": 0, + "messages": [ + { + "content": "What is the sum of all the distinct positive two-digit factors of 144?", + "role": "user" + }, + { + "content": "To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\n\nHere's a Python script to accomplish this:\n\n```python\ntwo_digit_factors = []\n\nfor i in range(10, 100):\n if 144 % i == 0:\n two_digit_factors.append(i)\n\nsum_of_factors = sum(two_digit_factors)\nprint(\"The sum of all the distinct positive two-digit factors of 144 is:\", sum_of_factors)\n```\n\nPlease run this script to find the desired sum.", + "role": "assistant" + } + ], + "time": 11.140539407730103, + "check_result": "the answer is not directly provided in the reply, but i can extract it by running the given python code:\n\n```python\ntwo_digit_factors = []\n\nfor i in range(10, 100):\n if 144 % i == 0:\n two_digit_factors.append(i)\n\nsum_of_factors = sum(two_digit_factors)\nprint(\"the sum of all the distinct positive two-digit factors of 144 is:\", sum_of_factors)\n```\n\nafter running this code, the result is:\nthe sum of all the distinct positive two-digit factors of 144 is: 226\n\nthe answer is 226. the ground truth answer is 226. therefore,\n\nthe answer is correct.", + "is_correct": true, + "trial": -1 +} diff --git a/test/test_files/agenteval-in-out/samples/sample_test_case.json b/test/test_files/agenteval-in-out/samples/sample_test_case.json new file mode 100644 index 000000000..08de40476 --- /dev/null +++ b/test/test_files/agenteval-in-out/samples/sample_test_case.json @@ -0,0 +1,24 @@ +{ + "problem": "Find $24^{-1} \\pmod{11^2}$. That is, find the residue $b$ for which $24b \\equiv 1\\pmod{11^2}$.\n\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.", + "level": "Level 5", + "type": "Number Theory", + "solution": "Since $5 \\times 24 = 120 = 121 - 1$, it follows that $-5 \\times 24 \\equiv 1 \\pmod{121}$. Adding 121 to $-5$ to make it positive, we find $(-5 + 121) \\times 24 \\equiv 116 \\times 24 \\equiv 1 \\pmod{121}$, so it follows that the modular inverse of $24$ is $\\boxed{116}$ when taken modulo $121$.", + "correct_ans": "116", + "problem_id": "5", + "response_with_ans": "To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\n\n```python\ndef mod_inverse(a, m):\n g, x, _ = extended_gcd(a, m)\n if g != 1:\n raise Exception(f\"{a} and {m} are not coprime.\")\n return x % m\n\ndef extended_gcd(a, b):\n if a == 0:\n return b, 0, 1\n else:\n g, x, y = extended_gcd(b % a, a)\n return g, y - (b // a) * x, x\n```\n\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\n\n```python\na = 24\nm = 11**2\nmod_inverse(a, m)\n```\n\nI will execute the above code to find the modular inverse of 24 modulo 11^2.", + "round": 0, + "messages": [ + { + "content": "Find $24^{-1} \\pmod{11^2}$. That is, find the residue $b$ for which $24b \\equiv 1\\pmod{11^2}$.\n\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.", + "role": "user" + }, + { + "content": "To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\n\n```python\ndef mod_inverse(a, m):\n g, x, _ = extended_gcd(a, m)\n if g != 1:\n raise Exception(f\"{a} and {m} are not coprime.\")\n return x % m\n\ndef extended_gcd(a, b):\n if a == 0:\n return b, 0, 1\n else:\n g, x, y = extended_gcd(b % a, a)\n return g, y - (b // a) * x, x\n```\n\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\n\n```python\na = 24\nm = 11**2\nmod_inverse(a, m)\n```\n\nI will execute the above code to find the modular inverse of 24 modulo 11^2.", + "role": "assistant" + } + ], + "time": 13.481226921081543, + "check_result": "let me verify the modular inverse of 24 modulo 11^2.\n\nafter executing the provided python code:\n\n```python\na = 24\nm = 11**2\nmod_inverse(a, m)\n```\n\nthe answer is found to be: 116.\n\nthe answer is correct.", + "is_correct": true, + "trial": -1 +} diff --git a/website/blog/2023-11-20-AgentEval/img/agenteval-CQ.png b/website/blog/2023-11-20-AgentEval/img/agenteval-CQ.png new file mode 100644 index 000000000..efa6a21c0 Binary files /dev/null and b/website/blog/2023-11-20-AgentEval/img/agenteval-CQ.png differ diff --git a/website/blog/2023-11-20-AgentEval/img/math-problems-plot.png b/website/blog/2023-11-20-AgentEval/img/math-problems-plot.png new file mode 100644 index 000000000..88ce6b697 Binary files /dev/null and b/website/blog/2023-11-20-AgentEval/img/math-problems-plot.png differ diff --git a/website/blog/2023-11-20-AgentEval/img/tasks-taxonomy.png b/website/blog/2023-11-20-AgentEval/img/tasks-taxonomy.png new file mode 100644 index 000000000..743c690eb Binary files /dev/null and b/website/blog/2023-11-20-AgentEval/img/tasks-taxonomy.png differ diff --git a/website/blog/2023-11-20-AgentEval/index.mdx b/website/blog/2023-11-20-AgentEval/index.mdx new file mode 100644 index 000000000..97d0b010a --- /dev/null +++ b/website/blog/2023-11-20-AgentEval/index.mdx @@ -0,0 +1,151 @@ +--- +title: How to Assess Utility of LLM-powered Applications? +authors: + - julianakiseleva + - narabzad +tags: [LLM, GPT, evaluation, task utility] +--- + + +![Fig.1: A verification framework](img/agenteval-CQ.png) + +

Fig.1 illustrates the general flow of AgentEval

+ +**TL;DR:** +* As a developer of an LLM-powered application, how can you assess the utility it brings to end users while helping them with their tasks? +* To shed light on the question above, we introduce `AgentEval` — the first version of the framework to assess the utility of any LLM-powered application crafted to assist users in specific tasks. AgentEval aims to simplify the evaluation process by automatically proposing a set of criteria tailored to the unique purpose of your application. This allows for a comprehensive assessment, quantifying the utility of your application against the suggested criteria. +* We demonstrate how `AgentEval` work using [math problems dataset](https://microsoft.github.io/autogen/blog/2023/06/28/MathChat) as an example in the [following notebook](https://github.com/microsoft/autogen/blob/main/notebook/agenteval_cq_math.ipynb). Any feedback would be useful for future development. Please contact us on our [Discord](http://aka.ms/autogen-dc). + + +## Introduction + + AutoGen aims to simplify the development of LLM-powered multi-agent systems for various applications, ultimately making end users' lives easier by assisting with their tasks. Next, we all yearn to understand how our developed systems perform, their utility for users, and, perhaps most crucially, how we can enhance them. Directly evaluating multi-agent systems poses challenges as current approaches predominantly rely on success metrics – essentially, whether the agent accomplishes tasks. However, comprehending user interaction with a system involves far more than success alone. Take math problems, for instance; it's not merely about the agent solving the problem. Equally significant is its ability to convey solutions based on various criteria, including completeness, conciseness, and the clarity of the provided explanation. Furthermore, success isn't always clearly defined for every task. + + Rapid advances in LLMs and multi-agent systems have brought forth many emerging capabilities that we're keen on translating into tangible utilities for end users. We introduce the first version of `AgentEval` framework - a tool crafted to empower developers in swiftly gauging the utility of LLM-powered applications designed to help end users accomplish the desired task. + + +![Fig.2: An overview of the tasks taxonomy](img/tasks-taxonomy.png) +

Fig. 2 provides an overview of the tasks taxonomy

+ + +Let's first look into an overview of the suggested task taxonomy that a multi-agent system can be designed for. In general, the tasks can be split into two types, where: +* _Success is not clearly defined_ - refer to instances when users utilize a system in an assistive manner, seeking suggestions rather than expecting the system to solve the task. For example, a user might request the system to generate an email. In many cases, this generated content serves as a template that the user will later edit. However, defining success precisely for such tasks is relatively complex. +* _Success is clearly defined_ - refer to instances where we can clearly define whether a system solved the task or not. Consider agents that assist in accomplishing household tasks, where the definition of success is clear and measurable. This category can be further divided into two separate subcategories: + * _The optimal solution exits_ - these are tasks where only one solution is possible. For example, if you ask your assistant to turn on the light, the success of this task is clearly defined, and there is only one way to accomplish it. + * _Multiple solutions exist_ - increasingly, we observe situations where multiple trajectories of agent behavior can lead to either success or failure. In such cases, it is crucial to differentiate between the various successful and unsuccessful trajectories. For example, when you ask the agent to suggest you a food recipe or tell you a joke. + +In our `AgentEval` framework, we are currently focusing on tasks where _Success is clearly defined_. Next, we will introduce the suggeted framework. + +## `AgentEval` Framework + +Our previous research on [assistive agents in Minecraft](https://github.com/microsoft/iglu-datasets) suggested that the most optimal way to obtain human judgments is to present humans with two agents side by side and ask for preferences. In this setup of pairwise comparison, humans can develop criteria to explain why they prefer the behavior of one agent over another. For instance, _'the first agent was faster in execution,'_ or _'the second agent moves more naturally.'_ So, the comparative nature led humans to come up with a list of criteria that helps to infer the utility of the task. With this idea in mind, we designed `AgentEval` (shown in Fig. 1), where we employ LLMs to help us understand, verify, and assess task *utility* for the multi-agent system. Namely: + +* The goal of `CriticAgent` is to suggest the list of criteria (Fig. 1), that can be used to assess task utility. This is an example of how `CriticAgent` is defined using `Autogen`: + +```python +critic = autogen.AssistantAgent( + name="critic", + llm_config={"config_list": config_list}, + system_message="""You are a helpful assistant. You suggest criteria for evaluating different tasks. They should be distinguishable, quantifiable, and not redundant. + Convert the evaluation criteria into a dictionary where the keys are the criteria. + The value of each key is a dictionary as follows {"description": criteria description, "accepted_values": possible accepted inputs for this key} + Make sure the keys are criteria for assessing the given task. "accepted_values" include the acceptable inputs for each key that are fine-grained and preferably multi-graded levels. "description" includes the criterion description. + Return only the dictionary.""" +) +``` + +Next, the critic is given successful and failed examples of the task execution; then, it is able to return a list of criteria (Fig. 1). For reference, use the [following notebook](https://github.com/microsoft/autogen/blob/main/notebook/agenteval_cq_math.ipynb). + +* The goal of `QuantifierAgent` is to quantify each of the suggested criteria (Fig. 1), providing us with an idea of the utility of this system for the given task. Here is an example of how it can be defined: + +```python +quantifier = autogen.AssistantAgent( + name="quantifier", + llm_config={"config_list": config_list}, + system_message = """You are a helpful assistant. You quantify the output of different tasks based on the given criteria. + The criterion is given in a dictionary format where each key is a distinct criteria. + The value of each key is a dictionary as follows {"description": criteria description , "accepted_values": possible accepted inputs for this key} + You are going to quantify each of the criteria for a given task based on the task description. + Return a dictionary where the keys are the criteria and the values are the assessed performance based on accepted values for each criteria. + Return only the dictionary.""" + +) +``` + +## `AgentEval` Results based on Math Problems Dataset + + As an example, after running CriticAgent, we obtained the following criteria to verify the results for math problem dataset: + +| Criteria | Description | Accepted Values| +|-----------|-----|----------------| +| Problem Interpretation | Ability to correctly interpret the problem | ["completely off", "slightly relevant", "relevant", "mostly accurate", "completely accurate"]| +| Mathematical Methodology | Adequacy of the chosen mathematical or algorithmic methodology for the question | ["inappropriate", "barely adequate", "adequate", "mostly effective", "completely effective"] | +| Calculation Correctness | Accuracy of calculations made and solutions given | ["completely incorrect", "mostly incorrect", "neither", "mostly correct", "completely correct"] | +| Explanation Clarity | Clarity and comprehensibility of explanations, including language use and structure | ["not at all clear", "slightly clear", "moderately clear", "very clear", "completely clear"] | +| Code Efficiency | Quality of code in terms of efficiency and elegance |["not at all efficient", "slightly efficient", "moderately efficient", "very efficient", "extremely efficient"] | +| Code Correctness | Correctness of the provided code | ["completely incorrect", "mostly incorrect", "partly correct", "mostly correct", "completely correct"] + + +Then, after running QuantifierAgent, we obtained the results presented in Fig. 3, where you can see three models: +* AgentChat +* ReAct +* GPT-4 Vanilla Solver + +Lighter colors represent estimates for failed cases, and brighter colors show how discovered criteria were quantified. + +![Fig.3: Results based on overall mathp roblems dataset `_s` stands for successful cases, `_f` - stands for failed cases](img/math-problems-plot.png) +

Fig.3 presents results based on overall mathproblems datase `_s` stands for successful cases, `_f` - stands for failed cases

+ +We note that while applying agentEval to math problems, the agent was not exposed to any ground truth information about the problem. As such, this figure illustrates an estimated performance of the three different agents, namely, Autogen (blue), Gpt-4 (red), and ReAct (green). We observe that by comparing the performance of any of the three agents in successful cases (dark bars of any color) versus unsuccessful cases (lighter version of the same bar), we note that AgentEval was able to assign higher quantification to successful cases than that of failed ones. This observation verifies AgentEval's ability for task utility prediction. Additionally, AgentEval allows us to go beyond just a binary definition of success, enabling a more in-depth comparison between successful and failed cases. + +It's important not only to identify what is not working but also to recognize what and why actually went well. + +## Limitations and Future Work +The current implementation of `AgentEval` has a number of limitations which are planning to overcome in the future: +* The list of criteria varies per run (unless you store a seed). We would recommend to run `CriticAgent` at least two times, and pick criteria you think is important for your domain. +* The results of the `QuantifierAgent` can vary with each run, so we recommend conducting multiple runs to observe the extent of result variations. + +To mitigate the limitations mentioned above, we are working on VerifierAgent, whose goal is to stabilize the results and provide additional explanations. + +## Summary +`CriticAgent` and `QuantifierAgent` can be applied to the logs of any type of application, providing you with an in-depth understanding of the utility your solution brings to the user for a given task. + +We would love to hear about how AgentEval works for your application. Any feedback would be useful for future development. Please contact us on our [Discord](http://aka.ms/autogen-dc). + + +## Previous Research + +``` +@InProceedings{pmlr-v176-kiseleva22a, + title = "Interactive Grounded Language Understanding in a Collaborative Environment: IGLU 2021", + author = "Kiseleva, Julia and Li, Ziming and Aliannejadi, Mohammad and Mohanty, Shrestha and ter Hoeve, Maartje and Burtsev, Mikhail and Skrynnik, Alexey and Zholus, Artem and Panov, Aleksandr and Srinet, Kavya and Szlam, Arthur and Sun, Yuxuan and Hofmann, Katja and C{\^o}t{\'e}, Marc-Alexandre and Awadallah, Ahmed and Abdrazakov, Linar and Churin, Igor and Manggala, Putra and Naszadi, Kata and van der Meer, Michiel and Kim, Taewoon", + booktitle = "Proceedings of the NeurIPS 2021 Competitions and Demonstrations Track", + pages = "146--161", + year = 2022, + editor = "Kiela, Douwe and Ciccone, Marco and Caputo, Barbara", + volume = 176, + series = "Proceedings of Machine Learning Research", + month = "06--14 Dec", + publisher = "PMLR", + pdf = {https://proceedings.mlr.press/v176/kiseleva22a/kiseleva22a.pdf}, + url = {https://proceedings.mlr.press/v176/kiseleva22a.html}. +} +``` + + +``` +@InProceedings{pmlr-v220-kiseleva22a, + title = "Interactive Grounded Language Understanding in a Collaborative Environment: Retrospective on Iglu 2022 Competition", + author = "Kiseleva, Julia and Skrynnik, Alexey and Zholus, Artem and Mohanty, Shrestha and Arabzadeh, Negar and C\^{o}t\'e, Marc-Alexandre and Aliannejadi, Mohammad and Teruel, Milagro and Li, Ziming and Burtsev, Mikhail and ter Hoeve, Maartje and Volovikova, Zoya and Panov, Aleksandr and Sun, Yuxuan and Srinet, Kavya and Szlam, Arthur and Awadallah, Ahmed and Rho, Seungeun and Kwon, Taehwan and Wontae Nam, Daniel and Bivort Haiek, Felipe and Zhang, Edwin and Abdrazakov, Linar and Qingyam, Guo and Zhang, Jason and Guo, Zhibin", + booktitle = "Proceedings of the NeurIPS 2022 Competitions Track", + pages = "204--216", + year = 2022, + editor = "Ciccone, Marco and Stolovitzky, Gustavo and Albrecht, Jacob", + volume = 220, + series = "Proceedings of Machine Learning Research", + month = "28 Nov--09 Dec", + publisher = "PMLR", + pdf = "https://proceedings.mlr.press/v220/kiseleva22a/kiseleva22a.pdf", + url = "https://proceedings.mlr.press/v220/kiseleva22a.html". +} +``` diff --git a/website/blog/authors.yml b/website/blog/authors.yml index 67ef6ba9c..a487086cb 100644 --- a/website/blog/authors.yml +++ b/website/blog/authors.yml @@ -1,77 +1,89 @@ -sonichi: - name: Chi Wang - title: Principal Researcher at Microsoft Research - url: https://www.linkedin.com/in/chi-wang-49b15b16/ - image_url: https://github.com/sonichi.png - -qingyunwu: - name: Qingyun Wu - title: Assistant Professor at the Pennsylvania State University - url: https://qingyun-wu.github.io/ - image_url: https://github.com/qingyun-wu.png - -yiranwu: - name: Yiran Wu - title: PhD student at Pennsylvania State University - url: https://github.com/kevin666aa - image_url: https://github.com/kevin666aa.png - -jialeliu: - name: Jiale Liu - title: Undergraduate student at Xidian University - url: https://leoljl.github.io - image_url: https://github.com/LeoLjl/leoljl.github.io/blob/main/profile.jpg?raw=true - -thinkall: - name: Li Jiang - title: Senior Software Engineer at Microsoft - url: https://github.com/thinkall - image_url: https://github.com/thinkall.png - -rickyloynd-microsoft: - name: Ricky Loynd - title: Senior Research Engineer at Microsoft - url: https://github.com/rickyloynd-microsoft - image_url: https://github.com/rickyloynd-microsoft.png - -samershi: - name: Saleema Amershi - title: Senior Principal Research Manager at Microsoft Research - url: https://github.com/samershi - image_url: https://github.com/samershi.png - -pcdeadeasy: - name: Piali Choudhury - title: Principal RSDE at Microsoft Research - url: https://github.com/pcdeadeasy - image_url: https://github.com/pcdeadeasy.png - -victordibia: - name: Victor Dibia - title: Principal RSDE at Microsoft Research - url: https://github.com/victordibia - image_url: https://github.com/victordibia.png - -afourney: - name: Adam Fourney - title: Principal Researcher Microsoft Research - url: https://github.com/afourney - image_url: https://github.com/afourney.png - -beibinli: - name: Beibin Li - title: Senior Research Engineer at Microsoft - url: https://github.com/beibinli - image_url: https://github.com/beibinli.png - -gagb: - name: Gagan Bansal - title: Senior Researcher at Microsoft Research - url: https://www.linkedin.com/in/gagan-bansal/ - image_url: https://github.com/gagb.png - -jieyuz2: - name: Jieyu Zhang - title: PhD student at University of Washington - url: https://jieyuz2.github.io/ - image_url: https://github.com/jieyuz2.png +sonichi: + name: Chi Wang + title: Principal Researcher at Microsoft Research + url: https://www.linkedin.com/in/chi-wang-49b15b16/ + image_url: https://github.com/sonichi.png + +qingyunwu: + name: Qingyun Wu + title: Assistant Professor at the Pennsylvania State University + url: https://qingyun-wu.github.io/ + image_url: https://github.com/qingyun-wu.png + +yiranwu: + name: Yiran Wu + title: PhD student at Pennsylvania State University + url: https://github.com/kevin666aa + image_url: https://github.com/kevin666aa.png + +jialeliu: + name: Jiale Liu + title: Undergraduate student at Xidian University + url: https://leoljl.github.io + image_url: https://github.com/LeoLjl/leoljl.github.io/blob/main/profile.jpg?raw=true + +thinkall: + name: Li Jiang + title: Senior Software Engineer at Microsoft + url: https://github.com/thinkall + image_url: https://github.com/thinkall.png + +rickyloynd-microsoft: + name: Ricky Loynd + title: Senior Research Engineer at Microsoft + url: https://github.com/rickyloynd-microsoft + image_url: https://github.com/rickyloynd-microsoft.png + +samershi: + name: Saleema Amershi + title: Senior Principal Research Manager at Microsoft Research + url: https://github.com/samershi + image_url: https://github.com/samershi.png + +pcdeadeasy: + name: Piali Choudhury + title: Principal RSDE at Microsoft Research + url: https://github.com/pcdeadeasy + image_url: https://github.com/pcdeadeasy.png + +victordibia: + name: Victor Dibia + title: Principal RSDE at Microsoft Research + url: https://github.com/victordibia + image_url: https://github.com/victordibia.png + +afourney: + name: Adam Fourney + title: Principal Researcher Microsoft Research + url: https://github.com/afourney + image_url: https://github.com/afourney.png + +beibinli: + name: Beibin Li + title: Senior Research Engineer at Microsoft + url: https://github.com/beibinli + image_url: https://github.com/beibinli.png + +gagb: + name: Gagan Bansal + title: Senior Researcher at Microsoft Research + url: https://www.linkedin.com/in/gagan-bansal/ + image_url: https://github.com/gagb.png + +jieyuz2: + name: Jieyu Zhang + title: PhD student at University of Washington + url: https://jieyuz2.github.io/ + image_url: https://github.com/jieyuz2.png + +julianakiseleva: + name: Julia Kiseleva + title: Senior Researcher at Microsoft Research + url: https://github.com/julianakiseleva/ + image_url: https://avatars.githubusercontent.com/u/5908392?v=4 + +narabzad: + name: Negar Arabzadeh + title: PhD student at the University of Waterloo + url: https://www.negara.me/ + image_url: https://github.com/Narabzad.png