From 9739bde286f3ec9904178bcd92c7f611b3068c86 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Wed, 16 Oct 2024 11:08:36 -0700 Subject: [PATCH 01/11] Add evals to simple python agent --- .../agents/simple_Python_agent_workflow.ipynb | 1006 ++++++++++++++++- .../Phoenix/images/phoenix-agent-eval.png | Bin 0 -> 433378 bytes 2 files changed, 954 insertions(+), 52 deletions(-) create mode 100644 third_party/Phoenix/images/phoenix-agent-eval.png diff --git a/mistral/agents/simple_Python_agent_workflow.ipynb b/mistral/agents/simple_Python_agent_workflow.ipynb index 84f2de2b..192c18ca 100644 --- a/mistral/agents/simple_Python_agent_workflow.ipynb +++ b/mistral/agents/simple_Python_agent_workflow.ipynb @@ -2,9 +2,7 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "id": "D_GgusGnIUaM" - }, + "metadata": {}, "source": [ "# Simple Python agent workflow\n", "\n", @@ -54,7 +52,7 @@ "id": "EuHgymvZQRfj" }, "source": [ - "## Install dependencies\n", + "## Install dependencies & setup keys\n", "\n", "First we will install the python SDK and set our API key!" ] @@ -69,39 +67,14 @@ "id": "JfXG-CmrQTSW", "outputId": "4eccd614-727e-4455-a0d7-5033e6f2f2ca" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: mistralai==1.0.0 in /usr/local/lib/python3.10/dist-packages (1.0.0)\n", - "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.27.0)\n", - "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (1.0.6)\n", - "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.8.2)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.9.0.post0)\n", - "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.9.0)\n", - "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7.1)\n", - "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.7.4)\n", - "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", - "Requirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7)\n", - "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", - "Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n", - "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.2.2)\n" - ] - } - ], + "outputs": [], "source": [ "!pip install mistralai==1.0.0" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "id": "UTcv5cgYQWZd" }, @@ -148,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "id": "T2QjE0EzPN2x" }, @@ -170,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 18, "metadata": { "id": "Sy087IOjours" }, @@ -263,7 +236,6 @@ " retry = False\n", " try:\n", " exec(python_function)\n", - " print(\"Code executed successfully.\")\n", " try:\n", " exec(test_function)\n", " print(\"Code passed test case.\")\n", @@ -302,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 93, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -321,10 +293,17 @@ "User query: How can I remove duplicates from a list\n", "### Extracting Python code\n", "### Extracting test case\n", - "Code executed successfully.\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "Test failed\n", + "Setting retry to True\n", + "TRY # 1\n", + "### Run Python agent\n", + "User query: How can I remove duplicates from a list\n", + "### Extracting Python code\n", + "### Extracting test case\n", "Code passed test case.\n", - "Validated Python function: ```def remove_duplicates(lst):\n", - " return list(set(lst))```\n", + "Validated Python function: ```def remove_duplicates(input_list):\n", + " return list(set(input_list))```\n", "### EXIT WORKFLOW\n" ] } @@ -335,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -354,7 +333,6 @@ "User query: How can I sort a list of words and add the word love to each of word \n", "### Extracting Python code\n", "### Extracting test case\n", - "Code executed successfully.\n", "Code passed test case.\n", "Validated Python function: ```def sort_and_add_love(words):\n", " words.sort()\n", @@ -369,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -384,9 +362,10 @@ "text": [ "### ENTER WORKFLOW\n", "TRY # 0\n", + "### Run Python agent\n", + "User query: How can calculate fibinacci \n", "### Extracting Python code\n", "### Extracting test case\n", - "Code executed successfully.\n", "Code passed test case.\n", "Validated Python function: ```def fibonacci(n):\n", " if n <= 0:\n", @@ -395,11 +374,11 @@ " return [0]\n", " elif n == 2:\n", " return [0, 1]\n", - "\n", - " fib_sequence = [0, 1]\n", - " while len(fib_sequence) < n:\n", - " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", - " return fib_sequence```\n", + " else:\n", + " fib_sequence = [0, 1]\n", + " while len(fib_sequence) < n:\n", + " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", + " return fib_sequence```\n", "### EXIT WORKFLOW\n" ] } @@ -408,14 +387,928 @@ "run_workflow(\"How can calculate fibinacci \")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# (Optional) Trace and Evaluate your Agent\n", + "\n", + "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", + "\n", + "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", + "\n", + "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q openinference-instrumentation-mistralai arize-phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Overriding of current TracerProvider is not allowed\n", + "Attempting to instrument while already instrumented\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔭 OpenTelemetry Tracing Details 🔭\n", + "| Phoenix Project: mistral_agent_tracing\n", + "| Span Processor: SimpleSpanProcessor\n", + "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", + "| Transport: HTTP\n", + "| Transport Headers: {'api_key': '****'}\n", + "| \n", + "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", + "| \n", + "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", + "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", + "\n" + ] + } + ], + "source": [ + "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", + "from phoenix.otel import register\n", + "import os\n", + "\n", + "# Add Phoenix API Key for tracing\n", + "PHOENIX_API_KEY = \"Your Phoenix API Key Goes Here\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "\n", + "# configure the Phoenix tracer\n", + "tracer_provider = register() \n", + "\n", + "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", + "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run your agent again" + ] + }, { "cell_type": "code", "execution_count": null, - "metadata": { - "id": "HEr6pIyEKkwX" - }, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can I remove duplicates from a list\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can calculate fibinacci \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### View your traces\n", + "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Evaluate your agent\n", + "\n", + "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", + "\n", + "1. Export traces from Phoenix\n", + "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", + "3. Import the labeled traces into Phoenix." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Export traces from Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import phoenix as px\n", + "\n", + "spans = px.Client().get_spans_dataframe(project_name=\"mistral_agent_tracing\")\n", + "\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate traces\n", + "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", + "\n", + "The template requires two columns to be added to the dataframe:\n", + "- output: The code generated by the agent\n", + "- input: The original user query" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Extracting Python code\n", + "### Extracting test case\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "### Extracting Python code\n", + "### Extracting test case\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinput
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...85155application/json{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...85155application/json{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...77147application/json{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...82159application/json{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...162228application/json{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
\n", + "

5 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", + "da0d7cde2e4cf311 MistralClient.agents LLM None \n", + "33f7a33fad606580 MistralClient.agents LLM None \n", + "d88a511a82477003 MistralClient.agents LLM None \n", + "671411e820abfd2d MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", + "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", + "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", + "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", + "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", + "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", + "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", + "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", + "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", + "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", + "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", + "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", + "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", + "\n", + " ... attributes.llm.token_count.completion \\\n", + "context.span_id ... \n", + "9dcc050d2cbe1fb3 ... 85 \n", + "da0d7cde2e4cf311 ... 85 \n", + "33f7a33fad606580 ... 77 \n", + "d88a511a82477003 ... 82 \n", + "671411e820abfd2d ... 162 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 155 application/json \n", + "da0d7cde2e4cf311 155 application/json \n", + "33f7a33fad606580 147 application/json \n", + "d88a511a82477003 159 application/json \n", + "671411e820abfd2d 228 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", + "da0d7cde2e4cf311 {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", + "33f7a33fad606580 {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", + "d88a511a82477003 {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", + "671411e820abfd2d {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", + "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", + "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", + "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", + "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", + "\n", + " code \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " query \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " output \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " input \n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + "[5 rows x 26 columns]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spans['output'] = spans['attributes.llm.output_messages'].apply(lambda x: extract_code(x[0]['message.content']))\n", + "spans['input'] = spans['attributes.input.value']\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the `CODE_READABILITY_PROMPT_TEMPLATE` to evaluate the code. The method below takes in a row of the dataframe and returns a label and explanation.\n", + "\n", + "Note that we're also asking the LLM to return an explanation for the label. This will be visible in the UI, and is extremely helpful for debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", + "\n", + "def evaluate_code(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['output'], input=row['input'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "MistralAIInstrumentor().uninstrument()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run our `evaluate_code` method on each row of the dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "results = spans.apply(evaluate_code, axis=1)\n", + "spans['label'] = results.apply(lambda x: x[0] if x else None)\n", + "spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", + "spans['score'] = spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We should now have three more columns in our dataframe: `label`, `explanation`, and `score`." + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinputlabelexplanationscore
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the given code,...1
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, we ne...1
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************1. **Initial Observation**: The given code sni...0
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, let's...1
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************### EXPLANATION:\\n\\n1. **Structure and Formatt...0
\n", + "

5 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", + "da0d7cde2e4cf311 MistralClient.agents LLM None \n", + "33f7a33fad606580 MistralClient.agents LLM None \n", + "d88a511a82477003 MistralClient.agents LLM None \n", + "671411e820abfd2d MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", + "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", + "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", + "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", + "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", + "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", + "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", + "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", + "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", + "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", + "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", + "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", + "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", + "\n", + " ... attributes.output.value \\\n", + "context.span_id ... \n", + "9dcc050d2cbe1fb3 ... {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", + "da0d7cde2e4cf311 ... {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", + "33f7a33fad606580 ... {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", + "d88a511a82477003 ... {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", + "671411e820abfd2d ... {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", + "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", + "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", + "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", + "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", + "\n", + " code \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " query \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " output \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " input \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " label \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 readable \n", + "da0d7cde2e4cf311 readable \n", + "33f7a33fad606580 unreadable\\n\\n************ \n", + "d88a511a82477003 readable \n", + "671411e820abfd2d unreadable\\n\\n************ \n", + "\n", + " explanation score \n", + "context.span_id \n", + "9dcc050d2cbe1fb3 To evaluate the readability of the given code,... 1 \n", + "da0d7cde2e4cf311 To evaluate the readability of the code, we ne... 1 \n", + "33f7a33fad606580 1. **Initial Observation**: The given code sni... 0 \n", + "d88a511a82477003 To evaluate the readability of the code, let's... 1 \n", + "671411e820abfd2d ### EXPLANATION:\\n\\n1. **Structure and Formatt... 0 \n", + "\n", + "[5 rows x 29 columns]" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Import labeled traces into Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from phoenix.trace import SpanEvaluations\n", + "\n", + "px.Client().log_evaluations(SpanEvaluations(eval_name=\"Code Quality\", dataframe=spans))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now view your evaluations in the Phoenix UI:\n", + "\n", + "![image info](../../third_party/Phoenix/images/phoenix-agent-eval.png)" + ] } ], "metadata": { @@ -427,7 +1320,16 @@ "name": "python3" }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" } }, "nbformat": 4, diff --git a/third_party/Phoenix/images/phoenix-agent-eval.png b/third_party/Phoenix/images/phoenix-agent-eval.png new file mode 100644 index 0000000000000000000000000000000000000000..1f577af5b4bb52c5ac3f0050cc63566c09f66369 GIT binary patch literal 433378 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

)a9+rgJ-36s+smG=%k}@h2W(N?W%Tm9rL!zjA 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 HBftLxh5^DR literal 0 HcmV?d00001 From adbd88e9d55c49c2f524cfa01060a302778d56cd Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Wed, 16 Oct 2024 11:10:22 -0700 Subject: [PATCH 02/11] Project name fix --- mistral/agents/simple_Python_agent_workflow.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mistral/agents/simple_Python_agent_workflow.ipynb b/mistral/agents/simple_Python_agent_workflow.ipynb index 192c18ca..4ee816fd 100644 --- a/mistral/agents/simple_Python_agent_workflow.ipynb +++ b/mistral/agents/simple_Python_agent_workflow.ipynb @@ -535,7 +535,7 @@ "source": [ "import phoenix as px\n", "\n", - "spans = px.Client().get_spans_dataframe(project_name=\"mistral_agent_tracing\")\n", + "spans = px.Client().get_spans_dataframe()\n", "\n", "spans.head()" ] From 2e0003090ebbecd85835880862272bd927bd0249 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Wed, 16 Oct 2024 12:44:24 -0700 Subject: [PATCH 03/11] Add agent evaluation to analytical agent workflow --- .../agents/analytical_agent_workflow.ipynb | 2125 ++++++++++++++--- .../phoenix-agent-summarization-eval.png | Bin 0 -> 420154 bytes 2 files changed, 1770 insertions(+), 355 deletions(-) create mode 100644 third_party/Phoenix/images/phoenix-agent-summarization-eval.png diff --git a/mistral/agents/analytical_agent_workflow.ipynb b/mistral/agents/analytical_agent_workflow.ipynb index 11c4398e..6cce05d0 100644 --- a/mistral/agents/analytical_agent_workflow.ipynb +++ b/mistral/agents/analytical_agent_workflow.ipynb @@ -47,24 +47,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: mistralai==1.0.0 in /usr/local/lib/python3.10/dist-packages (1.0.0)\n", - "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.27.0)\n", - "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (1.0.6)\n", - "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.8.2)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.9.0.post0)\n", - "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.9.0)\n", - "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7.1)\n", - "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.7.4)\n", - "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", - "Requirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7)\n", - "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", - "Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n", - "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.2.2)\n" + "Requirement already satisfied: mistralai==1.0.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (1.0.0)\n", + "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.27.2)\n", + "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (1.0.6)\n", + "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.8.2)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.9.0)\n", + "Requirement already satisfied: anyio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (4.6.0)\n", + "Requirement already satisfied: certifi in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", + "Requirement already satisfied: idna in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.10)\n", + "Requirement already satisfied: sniffio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.20.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", + "Requirement already satisfied: typing-extensions>=4.6.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", + "Requirement already satisfied: six>=1.5 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n" ] } ], @@ -74,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 3, "metadata": { "id": "YyLxYRmKjKQf" }, @@ -134,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "metadata": { "id": "FEl6UMM7kJOU" }, @@ -156,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 5, "metadata": { "id": "FQ2E6s_I5WXe" }, @@ -193,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 6, "metadata": { "id": "W3VN-YxmFF1M" }, @@ -216,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -252,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -269,65 +268,65 @@ "\n", "## Step 1:\n", "\n", - "### Description:\n", + "### Analysis Plan:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Import the necessary libraries (pandas).\n", - "2. Use the `read_csv` function to load the dataset from the given URL.\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", - "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", "\n", "## Step 2:\n", "\n", - "### Description:\n", - "Inspect the dataset to understand its structure and contents.\n", + "### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `head` function to display the first few rows of the dataset.\n", - "2. Use the `info` function to get a summary of the dataset.\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "\n", - "# Get a summary of the dataset\n", - "print(data.info())\n", + "print(data.isnull().sum())\n", "```\n", "\n", "## Step 3:\n", "\n", - "### Description:\n", + "### Analysis Plan:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `describe` function to get statistical summaries of the dataset.\n", - "2. Calculate the mean, median, and mode for numerical columns.\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - "```\n", - "\n", - "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n" + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "```\n" ] } ], @@ -346,7 +345,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 9, "metadata": { "id": "cHaJLA_Yx4sN" }, @@ -521,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -537,34 +536,32 @@ "### ENTER WORKFLOW\n", "STEP # 1\n", "TRY # 0\n", - "### Description:\n", + "### Analysis Plan:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Import the necessary libraries (pandas).\n", - "2. Use the `read_csv` function to load the dataset from the given URL.\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", - "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", "### Run Python agent\n", - "User query: ### Description:\n", + "User query: ### Analysis Plan:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Import the necessary libraries (pandas).\n", - "2. Use the `read_csv` function to load the dataset from the given URL.\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", - "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", @@ -580,42 +577,36 @@ "Code executed successfully.\n", "STEP # 2\n", "TRY # 0\n", - "### Description:\n", - "Inspect the dataset to understand its structure and contents.\n", + "### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `head` function to display the first few rows of the dataset.\n", - "2. Use the `info` function to get a summary of the dataset.\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "\n", - "# Get a summary of the dataset\n", - "print(data.info())\n", + "print(data.isnull().sum())\n", "```\n", "### Run Python agent\n", - "User query: ### Description:\n", - "Inspect the dataset to understand its structure and contents.\n", + "User query: ### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `head` function to display the first few rows of the dataset.\n", - "2. Use the `info` function to get a summary of the dataset.\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "\n", - "# Get a summary of the dataset\n", - "print(data.info())\n", + "print(data.isnull().sum())\n", "```\n", "### Extracting Python code\n", "print(data.head())\n", - "print(data.info())\n", + "print(data.isnull().sum())\n", "### Python function to run: print(data.head())\n", - "print(data.info())\n", + "print(data.isnull().sum())\n", " State \\\n", "0 Alabama \n", "1 Alaska \n", @@ -671,237 +662,108 @@ "2 110.35 \n", "3 142.39 \n", "4 165.63 \n", - "\n", - "RangeIndex: 51 entries, 0 to 50\n", - "Data columns (total 8 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 State 51 non-null object \n", - " 1 Number of drivers involved in fatal collisions per billion miles 51 non-null float64\n", - " 2 Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 51 non-null int64 \n", - " 3 Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 51 non-null int64 \n", - " 4 Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 51 non-null int64 \n", - " 5 Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 51 non-null int64 \n", - " 6 Car Insurance Premiums ($) 51 non-null float64\n", - " 7 Losses incurred by insurance companies for collisions per insured driver ($) 51 non-null float64\n", - "dtypes: float64(3), int64(4), object(1)\n", - "memory usage: 3.3+ KB\n", - "None\n", + "State 0\n", + "Number of drivers involved in fatal collisions per billion miles 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", + "Car Insurance Premiums ($) 0\n", + "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", + "dtype: int64\n", "Code executed successfully.\n", "STEP # 3\n", "TRY # 0\n", - "### Description:\n", - "Perform basic statistical analysis on the dataset.\n", - "\n", - "### Detailed Instructions:\n", - "1. Use the `describe` function to get statistical summaries of the dataset.\n", - "2. Calculate the mean, median, and mode for numerical columns.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Get statistical summaries of the dataset\n", - "print(data.describe())\n", - "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - "```\n", - "\n", - "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Perform basic statistical analysis on the dataset.\n", - "\n", - "### Detailed Instructions:\n", - "1. Use the `describe` function to get statistical summaries of the dataset.\n", - "2. Calculate the mean, median, and mode for numerical columns.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Get statistical summaries of the dataset\n", - "print(data.describe())\n", - "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - "```\n", - "\n", - "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", - "### Extracting Python code\n", - "# Get statistical summaries of the dataset\n", - "print(data.describe())\n", - "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - "### Python function to run: # Get statistical summaries of the dataset\n", - "print(data.describe())\n", - "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "count 51.000000 \n", - "mean 15.790196 \n", - "std 4.122002 \n", - "min 5.900000 \n", - "25% 12.750000 \n", - "50% 15.600000 \n", - "75% 18.500000 \n", - "max 23.900000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "count 51.000000 \n", - "mean 31.725490 \n", - "std 9.633438 \n", - "min 13.000000 \n", - "25% 23.000000 \n", - "50% 34.000000 \n", - "75% 38.000000 \n", - "max 54.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "count 51.000000 \n", - "mean 30.686275 \n", - "std 5.132213 \n", - "min 16.000000 \n", - "25% 28.000000 \n", - "50% 30.000000 \n", - "75% 33.000000 \n", - "max 44.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "count 51.000000 \n", - "mean 85.921569 \n", - "std 15.158949 \n", - "min 10.000000 \n", - "25% 83.000000 \n", - "50% 88.000000 \n", - "75% 95.000000 \n", - "max 100.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "count 51.00000 \n", - "mean 88.72549 \n", - "std 6.96011 \n", - "min 76.00000 \n", - "25% 83.50000 \n", - "50% 88.00000 \n", - "75% 95.00000 \n", - "max 100.00000 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "count 51.000000 \n", - "mean 886.957647 \n", - "std 178.296285 \n", - "min 641.960000 \n", - "25% 768.430000 \n", - "50% 858.970000 \n", - "75% 1007.945000 \n", - "max 1301.520000 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "count 51.000000 \n", - "mean 134.493137 \n", - "std 24.835922 \n", - "min 82.750000 \n", - "25% 114.645000 \n", - "50% 136.050000 \n", - "75% 151.870000 \n", - "max 194.780000 \n", - "Code failed.\n", - "Setting retry to True\n", - "TRY # 1\n", - "### Description:\n", + "### Analysis Plan:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `describe` function to get statistical summaries of the dataset.\n", - "2. Calculate the mean, median, and mode for numerical columns.\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", "```\n", - "\n", - "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", "### Run Python agent\n", - "User query: ### Description:\n", + "User query: ### Analysis Plan:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Use the `describe` function to get statistical summaries of the dataset.\n", - "2. Calculate the mean, median, and mode for numerical columns.\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", - "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", "```\n", - "\n", - "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", "### Extracting Python code\n", - "# Get statistical summaries of the dataset\n", - "print(data.describe())\n", - "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", - "### Python function to run: # Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "# Calculate mean, median, and mode for numerical columns\n", - "mean = data.mean()\n", - "median = data.median()\n", - "mode = data.mode().iloc[0]\n", - "\n", - "print(\"Mean:\\n\", mean)\n", - "print(\"Median:\\n\", median)\n", - "print(\"Mode:\\n\", mode)\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "### Python function to run: print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", " Number of drivers involved in fatal collisions per billion miles \\\n", "count 51.000000 \n", "mean 15.790196 \n", @@ -971,8 +833,14 @@ "50% 136.050000 \n", "75% 151.870000 \n", "max 194.780000 \n", - "Code failed.\n", - "Setting retry to True\n", + "Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", + "Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", + "Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", + "Code executed successfully.\n", "### Exit WORKFLOW\n" ] } @@ -1023,7 +891,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 11, "metadata": { "id": "v6z9ZX7Ck1l6" }, @@ -1043,7 +911,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1056,10 +924,231 @@ "name": "stdout", "output_type": "stream", "text": [ - "### Analysis Report\n", + "## Analysis Report\n", + "\n", + "### Dataset Description\n", + "The dataset consists of 51 data points representing different states in the U.S. and includes the following eight columns:\n", + "1. **State**: The name of the state.\n", + "2. **Number of drivers involved in fatal collisions per billion miles**: The rate of drivers involved in fatal collisions per billion miles driven.\n", + "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of drivers speeding during fatal collisions.\n", + "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of drivers who were alcohol-impaired during fatal collisions.\n", + "5. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of drivers who were not distracted during fatal collisions.\n", + "6. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of drivers who had not been involved in previous accidents.\n", + "7. **Car Insurance Premiums ($)**: The average car insurance premiums in dollars.\n", + "8. **Losses incurred by insurance companies for collisions per insured driver ($)**: The losses incurred by insurance companies for collisions per insured driver.\n", + "\n", + "### Data Inspection\n", + "- **Missing Values**: There are no missing values in the dataset.\n", + "- **First Few Rows**:\n", + " ```plaintext\n", + " State | Number of drivers involved in fatal collisions per billion miles | Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding | Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired | Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted | Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents | Car Insurance Premiums ($) | Losses incurred by insurance companies for collisions per insured driver ($)\n", + " ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------- | -------------------------------------------------------------------------------------------------\n", + " Alabama | 18.8 | 39 | 30 | 96 | 80 | 784.55 | 145.08\n", + " Alaska | 18.1 | 41 | 25 | 90 | 94 | 1053.48 | 133.93\n", + " Arizona | 18.6 | 35 | 28 | 84 | 96 | 899.47 | 110.35\n", + " Arkansas | 22.4 | 18 | 26 | 94 | 95 | 827.34 | 142.39\n", + " California | 12.0 | 35 | 28 | 91 | 89 | 878.41 | 165.63\n", + " ```\n", + "\n", + "### Basic Statistical Analysis\n", + "- **Summary Statistics**:\n", + " ```plaintext\n", + " Number of drivers involved in fatal collisions per billion miles\n", + " count 51.000000\n", + " mean 15.790196\n", + " std 4.122002\n", + " min 5.900000\n", + " 25% 12.750000\n", + " 50% 15.600000\n", + " 75% 18.500000\n", + " max 23.900000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", + " count 51.000000\n", + " mean 31.725490\n", + " std 9.633438\n", + " min 13.000000\n", + " 25% 23.000000\n", + " 50% 34.000000\n", + " 75% 38.000000\n", + " max 54.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", + " count 51.000000\n", + " mean 30.686275\n", + " std 5.132213\n", + " min 16.000000\n", + " 25% 28.000000\n", + " 50% 30.000000\n", + " 75% 33.000000\n", + " max 44.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", + " count 51.000000\n", + " mean 85.921569\n", + " std 15.158949\n", + " min 10.000000\n", + " 25% 83.000000\n", + " 50% 88.000000\n", + " 75% 95.000000\n", + " max 100.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", + " count 51.00000\n", + " mean 88.72549\n", + " std 6.96011\n", + " min 76.00000\n", + " 25% 83.50000\n", + " 50% 88.00000\n", + " 75% 95.00000\n", + " max 100.00000\n", + "\n", + " Car Insurance Premiums ($)\n", + " count 51.000000\n", + " mean 886.957647\n", + " std 178.296285\n", + " min 641.960000\n", + " 25% 768.430000\n", + " 50% 858.970000\n", + " 75% 1007.945000\n", + " max 1301.520000\n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($)\n", + " count 51.000000\n", + " mean 134.493137\n", + " std 24.835922\n", + " min 82.750000\n", + " 25% 114.645000\n", + " 50% 136.050000\n", + " 75% 151.870000\n", + " max 194.780000\n", + " ```\n", + "\n", + "- **Mean, Median, and Standard Deviation**:\n", + " ```plaintext\n", + " Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", + " Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", + " Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", + " ```\n", + "\n", + "### Conclusion\n", + "The dataset provides insights into various factors that contribute to fatal collisions across different states. The analysis reveals the average rates of drivers involved in fatal collisions, the prevalence of speeding and alcohol-impaired driving, the extent of distracted driving, and the impact of previous accidents. Additionally, the dataset includes information on car insurance premiums and the financial losses incurred by insurance companies due to collisions.\n", + "\n", + "On average, the number of drivers involved in fatal collisions per billion miles is around 15.79, with a median of 15.6. Speeding and alcohol-impairment are significant factors in fatal collisions, with average percentages of 31.73% and 30.69%, respectively. Most drivers involved in fatal collisions were not distracted (85.92%) and had not been involved in previous accidents (88.73%).\n", + "\n", + "Car insurance premiums vary significantly across states, with an average of $886.96 and a median of $858.97. The financial losses incurred by insurance companies for collisions per insured driver average around $134.49, with a median of $136.05.\n", + "\n", + "This analysis provides a comprehensive overview of the dataset and highlights key statistics that can inform further investigations into road safety and insurance policies.\n" + ] + } + ], + "source": [ + "print(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# (Optional) Trace and Evaluate your Agent\n", + "\n", + "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", + "\n", + "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", + "\n", + "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q openinference-instrumentation-mistralai arize-phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔭 OpenTelemetry Tracing Details 🔭\n", + "| Phoenix Project: mistral_agent_2\n", + "| Span Processor: SimpleSpanProcessor\n", + "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", + "| Transport: HTTP\n", + "| Transport Headers: {'api_key': '****'}\n", + "| \n", + "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", + "| \n", + "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", + "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", + "\n" + ] + } + ], + "source": [ + "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", + "from phoenix.otel import register\n", + "import os\n", + "\n", + "# Add Phoenix API Key for tracing\n", + "PHOENIX_API_KEY = \"48624b3c339c53f04c6:a6d9fef\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "\n", + "# configure the Phoenix tracer\n", + "tracer_provider = register() \n", + "\n", + "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", + "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run your agent" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Run Planning agent\n", + "User query: \n", + "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", "\n", - "#### Dataset Description\n", - "The dataset consists of 51 datapoints representing the 50 states and the District of Columbia. It contains the following eight columns:\n", + "The dataset consists of 51 datapoints and has eight columns:\n", "- State\n", "- Number of drivers involved in fatal collisions per billion miles\n", "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", @@ -1068,79 +1157,1396 @@ "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", "- Car Insurance Premiums ($)\n", "- Losses incurred by insurance companies for collisions per insured driver ($)\n", + "\n" + ] + } + ], + "source": [ + "planning_result = run_analysis_planning_agent(query)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "STEP # 1\n", + "TRY # 0\n", + "### Description:\n", + "Load the dataset from the provided URL into a Pandas DataFrame.\n", "\n", - "#### Data Loading and Inspection\n", - "The dataset was successfully loaded from the provided URL using the `pandas` library. Initial inspection of the dataset using the `head` function revealed the first few rows, which confirmed the structure of the dataset. The `info` function provided a summary of the dataset, indicating that there are no missing values and confirming the data types of each column.\n", + "### Instructions:\n", + "1. Use the Pandas library to read the CSV file from the URL.\n", + "2. Store the data in a DataFrame named `df`.\n", "\n", - "#### Statistical Analysis\n", - "1. **Descriptive Statistics**:\n", - " - The `describe` function provided a statistical summary of the dataset, including count, mean, standard deviation, min, 25th percentile, 50th percentile (median), 75th percentile, and max for each numerical column.\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", "\n", - "2. **Mean, Median, and Mode**:\n", - " - **Mean**: The average values for each numerical column were calculated.\n", - " - **Median**: The median values for each numerical column were calculated.\n", - " - **Mode**: The mode values for each numerical column were calculated.\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Load the dataset from the provided URL into a Pandas DataFrame.\n", "\n", - "#### Key Findings\n", - "1. **Number of Drivers Involved in Fatal Collisions per Billion Miles**:\n", - " - Mean: 15.79\n", - " - Median: 15.60\n", - " - Mode: Not reported due to code execution issues.\n", + "### Instructions:\n", + "1. Use the Pandas library to read the CSV file from the URL.\n", + "2. Store the data in a DataFrame named `df`.\n", "\n", - "2. **Percentage of Drivers Involved in Fatal Collisions Who Were Speeding**:\n", - " - Mean: 31.73%\n", - " - Median: 34.00%\n", - " - Mode: Not reported due to code execution issues.\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", "\n", - "3. **Percentage of Drivers Involved in Fatal Collisions Who Were Alcohol-Impaired**:\n", - " - Mean: 30.69%\n", - " - Median: 30.00%\n", - " - Mode: Not reported due to code execution issues.\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "```\n", + "### Extracting Python code\n", + "import pandas as pd\n", "\n", - "4. **Percentage of Drivers Involved in Fatal Collisions Who Were Not Distracted**:\n", - " - Mean: 85.92%\n", - " - Median: 88.00%\n", - " - Mode: Not reported due to code execution issues.\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "### Python function to run: import pandas as pd\n", "\n", - "5. **Percentage of Drivers Involved in Fatal Collisions Who Had Not Been Involved in Any Previous Accidents**:\n", - " - Mean: 88.73%\n", - " - Median: 88.00%\n", - " - Mode: Not reported due to code execution issues.\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "Code executed successfully.\n", + "STEP # 2\n", + "TRY # 0\n", + "### Description:\n", + "Inspect the data to understand its structure and check for any missing values.\n", "\n", - "6. **Car Insurance Premiums ($)**:\n", - " - Mean: $886.96\n", - " - Median: $858.97\n", - " - Mode: Not reported due to code execution issues.\n", + "### Instructions:\n", + "1. Display the first few rows of the DataFrame.\n", + "2. Check for any missing values in the DataFrame.\n", "\n", - "7. **Losses Incurred by Insurance Companies for Collisions per Insured Driver ($)**:\n", - " - Mean: $134.49\n", - " - Median: $136.05\n", - " - Mode: Not reported due to code execution issues.\n", + "### Suggested Python Code:\n", + "```python\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", "\n", - "#### Conclusion\n", - "The dataset provides valuable insights into driving behaviors and their impacts on insurance premiums and losses. The statistical analysis reveals the average and median values for various metrics related to fatal collisions, speeding, alcohol impairment, distraction, previous accidents, insurance premiums, and losses. These insights can be used to inform policies aimed at reducing fatal collisions and improving road safety.\n", - "\n", - "#### Recommendations\n", - "Further analysis could include:\n", - "- Correlation analysis between different variables to understand their relationships.\n", - "- Visualizations such as histograms, box plots, and scatter plots to better understand the distribution and patterns in the data.\n", - "- Time series analysis if the dataset includes temporal data to track changes over time.\n", - "- Comparative analysis between states to identify best and worst performers in terms of road safety and insurance costs.\n" - ] - } - ], - "source": [ - "print(result)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dyNNbLLtOhh0" - }, - "outputs": [], - "source": [] + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Inspect the data to understand its structure and check for any missing values.\n", + "\n", + "### Instructions:\n", + "1. Display the first few rows of the DataFrame.\n", + "2. Check for any missing values in the DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "```\n", + "### Extracting Python code\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "### Python function to run: # Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + " State \\\n", + "0 Alabama \n", + "1 Alaska \n", + "2 Arizona \n", + "3 Arkansas \n", + "4 California \n", + "\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "0 18.8 \n", + "1 18.1 \n", + "2 18.6 \n", + "3 22.4 \n", + "4 12.0 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "0 39 \n", + "1 41 \n", + "2 35 \n", + "3 18 \n", + "4 35 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "0 30 \n", + "1 25 \n", + "2 28 \n", + "3 26 \n", + "4 28 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "0 96 \n", + "1 90 \n", + "2 84 \n", + "3 94 \n", + "4 91 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "0 80 \n", + "1 94 \n", + "2 96 \n", + "3 95 \n", + "4 89 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "0 784.55 \n", + "1 1053.48 \n", + "2 899.47 \n", + "3 827.34 \n", + "4 878.41 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "0 145.08 \n", + "1 133.93 \n", + "2 110.35 \n", + "3 142.39 \n", + "4 165.63 \n", + "State 0\n", + "Number of drivers involved in fatal collisions per billion miles 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", + "Car Insurance Premiums ($) 0\n", + "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", + "dtype: int64\n", + "Code executed successfully.\n", + "STEP # 3\n", + "TRY # 0\n", + "### Description:\n", + "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", + "\n", + "### Instructions:\n", + "1. Calculate the descriptive statistics for the numerical columns.\n", + "2. Display the statistics.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Calculate descriptive statistics\n", + "descriptive_stats = df.describe()\n", + "\n", + "# Display the statistics\n", + "print(descriptive_stats)\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", + "\n", + "### Instructions:\n", + "1. Calculate the descriptive statistics for the numerical columns.\n", + "2. Display the statistics.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Calculate descriptive statistics\n", + "descriptive_stats = df.describe()\n", + "\n", + "# Display the statistics\n", + "print(descriptive_stats)\n", + "```\n", + "### Extracting Python code\n", + "descriptive_stats = df.describe()\n", + "print(descriptive_stats)\n", + "### Python function to run: descriptive_stats = df.describe()\n", + "print(descriptive_stats)\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "count 51.000000 \n", + "mean 15.790196 \n", + "std 4.122002 \n", + "min 5.900000 \n", + "25% 12.750000 \n", + "50% 15.600000 \n", + "75% 18.500000 \n", + "max 23.900000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "count 51.000000 \n", + "mean 31.725490 \n", + "std 9.633438 \n", + "min 13.000000 \n", + "25% 23.000000 \n", + "50% 34.000000 \n", + "75% 38.000000 \n", + "max 54.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "count 51.000000 \n", + "mean 30.686275 \n", + "std 5.132213 \n", + "min 16.000000 \n", + "25% 28.000000 \n", + "50% 30.000000 \n", + "75% 33.000000 \n", + "max 44.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "count 51.000000 \n", + "mean 85.921569 \n", + "std 15.158949 \n", + "min 10.000000 \n", + "25% 83.000000 \n", + "50% 88.000000 \n", + "75% 95.000000 \n", + "max 100.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "count 51.00000 \n", + "mean 88.72549 \n", + "std 6.96011 \n", + "min 76.00000 \n", + "25% 83.50000 \n", + "50% 88.00000 \n", + "75% 95.00000 \n", + "max 100.00000 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "count 51.000000 \n", + "mean 886.957647 \n", + "std 178.296285 \n", + "min 641.960000 \n", + "25% 768.430000 \n", + "50% 858.970000 \n", + "75% 1007.945000 \n", + "max 1301.520000 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "count 51.000000 \n", + "mean 134.493137 \n", + "std 24.835922 \n", + "min 82.750000 \n", + "25% 114.645000 \n", + "50% 136.050000 \n", + "75% 151.870000 \n", + "max 194.780000 \n", + "Code executed successfully.\n", + "### Exit WORKFLOW\n" + ] + } + ], + "source": [ + "# Create an instance of the Tee class\n", + "tee_stream = Tee()\n", + "\n", + "# Redirect stdout to the Tee instance\n", + "sys.stdout = tee_stream\n", + "\n", + "\n", + "Python_agent = PythonAgentWorkflow()\n", + "Python_agent.workflow(planning_result)\n", + "\n", + "# Restore the original stdout\n", + "sys.stdout = tee_stream.original_stdout\n", + "\n", + "# Get the captured output\n", + "captured_output = tee_stream.getvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "response = client.agents.complete(\n", + " agent_id= summarization_agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query + captured_output\n", + " },\n", + " ]\n", + ")\n", + "result = response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Analysis Report\n", + "\n", + "#### Dataset Description\n", + "The dataset contains information about driving behaviors and insurance metrics across 51 U.S. states. The dataset includes the following columns:\n", + "\n", + "- **State**: The name of the state.\n", + "- **Number of drivers involved in fatal collisions per billion miles**: The rate of fatal collisions per billion miles driven.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of fatal collisions involving speeding.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of fatal collisions involving alcohol impairment.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of fatal collisions not involving distractions.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of fatal collisions involving drivers with no previous accidents.\n", + "- **Car Insurance Premiums ($)**: The average car insurance premium in the state.\n", + "- **Losses incurred by insurance companies for collisions per insured driver ($)**: The average losses incurred by insurance companies due to collisions per insured driver.\n", + "\n", + "#### Data Inspection\n", + "The dataset was loaded successfully and inspected for missing values. There are no missing values in the dataset.\n", + "\n", + "#### Descriptive Statistics\n", + "Descriptive statistics were calculated for the numerical columns to understand the distribution of the data. The key findings are as follows:\n", + "\n", + "1. **Number of drivers involved in fatal collisions per billion miles**:\n", + " - Mean: 15.79\n", + " - Standard Deviation: 4.12\n", + " - Min: 5.90\n", + " - Max: 23.90\n", + "\n", + "2. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**:\n", + " - Mean: 31.73%\n", + " - Standard Deviation: 9.63%\n", + " - Min: 13.00%\n", + " - Max: 54.00%\n", + "\n", + "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**:\n", + " - Mean: 30.69%\n", + " - Standard Deviation: 5.13%\n", + " - Min: 16.00%\n", + " - Max: 44.00%\n", + "\n", + "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**:\n", + " - Mean: 85.92%\n", + " - Standard Deviation: 15.16%\n", + " - Min: 10.00%\n", + " - Max: 100.00%\n", + "\n", + "5. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**:\n", + " - Mean: 88.73%\n", + " - Standard Deviation: 6.96%\n", + " - Min: 76.00%\n", + " - Max: 100.00%\n", + "\n", + "6. **Car Insurance Premiums ($)**:\n", + " - Mean: $886.96\n", + " - Standard Deviation: $178.30\n", + " - Min: $641.96\n", + " - Max: $1301.52\n", + "\n", + "7. **Losses incurred by insurance companies for collisions per insured driver ($)**:\n", + " - Mean: $134.49\n", + " - Standard Deviation: $24.84\n", + " - Min: $82.75\n", + " - Max: $194.78\n", + "\n", + "#### Conclusion\n", + "The dataset provides a comprehensive view of driving behaviors and insurance metrics across different states. The descriptive statistics indicate variations in the rates of fatal collisions, the involvement of speeding and alcohol impairment in these collisions, and the impact on insurance premiums and losses. This information can be useful for policymakers, insurance companies, and safety advocates to identify areas for improvement and to implement targeted interventions.\n" + ] + } + ], + "source": [ + "print(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### View your traces\n", + "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Evaluate your agent\n", + "\n", + "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", + "\n", + "1. Export traces from Phoenix\n", + "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", + "3. Import the labeled traces into Phoenix." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Export traces from Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.output_messagesattributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messages
context.span_id
e47365057e2c8bccMistralClient.agentsLLMNone2024-10-16 18:56:34.274511+00:002024-10-16 18:56:46.406556+00:00OK[]e47365057e2c8bcc22678831aa324e4b171394f156af9a03...[{'message.content': '## Total number of steps...293{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json367660application/json{\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag...[{'message.content': '\n", + "Load this data: https:/...
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...[{'message.content': '```python\n", + "import pandas ...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Load th...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...[{'message.content': '```python\n", + "# Display the ...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Inspect...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...[{'message.content': '```python\n", + "descriptive_st...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Perform...
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...[{'message.content': '### Analysis Report\n", + "\n", + "###...3104{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", + "Load this data: https:/...
\n", + "

5 rows × 22 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "e47365057e2c8bcc MistralClient.agents LLM None \n", + "81682642a644b5e5 MistralClient.agents LLM None \n", + "d8635ee34648298b MistralClient.agents LLM None \n", + "a2247b0c2142629e MistralClient.agents LLM None \n", + "2aef7e010a055107 MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "e47365057e2c8bcc 2024-10-16 18:56:34.274511+00:00 \n", + "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", + "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", + "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", + "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "e47365057e2c8bcc 2024-10-16 18:56:46.406556+00:00 OK \n", + "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", + "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", + "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", + "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "e47365057e2c8bcc [] e47365057e2c8bcc 22678831aa324e4b171394f156af9a03 \n", + "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", + "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", + "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", + "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", + "\n", + " ... attributes.llm.output_messages \\\n", + "context.span_id ... \n", + "e47365057e2c8bcc ... [{'message.content': '## Total number of steps... \n", + "81682642a644b5e5 ... [{'message.content': '```python\n", + "import pandas ... \n", + "d8635ee34648298b ... [{'message.content': '```python\n", + "# Display the ... \n", + "a2247b0c2142629e ... [{'message.content': '```python\n", + "descriptive_st... \n", + "2aef7e010a055107 ... [{'message.content': '### Analysis Report\n", + "\n", + "###... \n", + "\n", + " attributes.llm.token_count.prompt \\\n", + "context.span_id \n", + "e47365057e2c8bcc 293 \n", + "81682642a644b5e5 168 \n", + "d8635ee34648298b 142 \n", + "a2247b0c2142629e 142 \n", + "2aef7e010a055107 3104 \n", + "\n", + " attributes.input.value \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", + "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "2aef7e010a055107 {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", + "\n", + " attributes.input.mime_type \\\n", + "context.span_id \n", + "e47365057e2c8bcc application/json \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "2aef7e010a055107 application/json \n", + "\n", + " attributes.llm.token_count.completion \\\n", + "context.span_id \n", + "e47365057e2c8bcc 367 \n", + "81682642a644b5e5 61 \n", + "d8635ee34648298b 40 \n", + "a2247b0c2142629e 26 \n", + "2aef7e010a055107 944 \n", + "\n", + " attributes.llm.token_count.total \\\n", + "context.span_id \n", + "e47365057e2c8bcc 660 \n", + "81682642a644b5e5 229 \n", + "d8635ee34648298b 182 \n", + "a2247b0c2142629e 168 \n", + "2aef7e010a055107 4048 \n", + "\n", + " attributes.output.mime_type \\\n", + "context.span_id \n", + "e47365057e2c8bcc application/json \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "2aef7e010a055107 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje... \n", + "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", + "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", + "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", + "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag... \n", + "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", + "\n", + " attributes.llm.input_messages \n", + "context.span_id \n", + "e47365057e2c8bcc [{'message.content': '\n", + "Load this data: https:/... \n", + "81682642a644b5e5 [{'message.content': '### Description:\n", + "Load th... \n", + "d8635ee34648298b [{'message.content': '### Description:\n", + "Inspect... \n", + "a2247b0c2142629e [{'message.content': '### Description:\n", + "Perform... \n", + "2aef7e010a055107 [{'message.content': '\n", + "Load this data: https:/... \n", + "\n", + "[5 rows x 22 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import phoenix as px\n", + "\n", + "spans = px.Client().get_spans_dataframe()\n", + "\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When it comes to evaluating agents, a good general approach is to break down the steps your agent must complete, and evaluate each step individually.\n", + "\n", + "In this case, we can evaluate:\n", + "1. The code generated by the Python agent\n", + "2. The analysis report written by the summarization agent\n", + "\n", + "We'll evaluate each of these steps individually." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate Code Generation\n", + "\n", + "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", + "\n", + "The template requires two columns to be added to the dataframe:\n", + "- output: The code generated by the agent\n", + "- input: The original user query\n", + "\n", + "We already have the input, so just need to extract solely the generated code from the `attributes.llm.output_messages` column:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Extracting Python code\n", + "### Extracting Python code\n", + "### Extracting Python code\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/z6/6g1hmm4x2dl0z84s6bwkgdzr0000gn/T/ipykernel_32957/2273792046.py:2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_code
context.span_id
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Load th...(import pandas as pd\\n\\nurl = 'https://raw.git...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Inspect...(# Display the first few rows of the DataFrame...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Perform...(descriptive_stats = df.describe()\\nprint(desc...
\n", + "

3 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "81682642a644b5e5 MistralClient.agents LLM None \n", + "d8635ee34648298b MistralClient.agents LLM None \n", + "a2247b0c2142629e MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", + "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", + "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", + "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", + "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", + "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", + "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", + "\n", + " ... attributes.llm.token_count.prompt \\\n", + "context.span_id ... \n", + "81682642a644b5e5 ... 168 \n", + "d8635ee34648298b ... 142 \n", + "a2247b0c2142629e ... 142 \n", + "\n", + " attributes.input.value \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "\n", + " attributes.input.mime_type \\\n", + "context.span_id \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "\n", + " attributes.llm.token_count.completion \\\n", + "context.span_id \n", + "81682642a644b5e5 61 \n", + "d8635ee34648298b 40 \n", + "a2247b0c2142629e 26 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "81682642a644b5e5 229 application/json \n", + "d8635ee34648298b 182 application/json \n", + "a2247b0c2142629e 168 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", + "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", + "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "81682642a644b5e5 [{'message.content': '### Description:\n", + "Load th... \n", + "d8635ee34648298b [{'message.content': '### Description:\n", + "Inspect... \n", + "a2247b0c2142629e [{'message.content': '### Description:\n", + "Perform... \n", + "\n", + " generated_code \n", + "context.span_id \n", + "81682642a644b5e5 (import pandas as pd\\n\\nurl = 'https://raw.git... \n", + "d8635ee34648298b (# Display the first few rows of the DataFrame... \n", + "a2247b0c2142629e (descriptive_stats = df.describe()\\nprint(desc... \n", + "\n", + "[3 rows x 23 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "code_gen_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(python_agent_id)]\n", + "code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n", + "code_gen_spans.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", + "\n", + "def evaluate_code(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['generated_code'], input=row['attributes.input.value'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "MistralAIInstrumentor().uninstrument()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run our `evaluate_code` method on each row of the dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results = code_gen_spans.apply(evaluate_code, axis=1)\n", + "code_gen_spans['label'] = results.apply(lambda x: x[0] if x else None)\n", + "code_gen_spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", + "code_gen_spans['score'] = code_gen_spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate Summarization\n", + "\n", + "We'll use a simple prompt to evaluate the summarization agent, this time using a different prebuilt evaluation template." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_codelabelexplanationscore
context.span_id
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", + "Load this data: https:/...(None, True)NoneNone0
\n", + "

1 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "2aef7e010a055107 MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", + "\n", + " ... attributes.llm.token_count.completion \\\n", + "context.span_id ... \n", + "2aef7e010a055107 ... 944 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "2aef7e010a055107 4048 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "2aef7e010a055107 [{'message.content': '\n", + "Load this data: https:/... \n", + "\n", + " generated_code label explanation score \n", + "context.span_id \n", + "2aef7e010a055107 (None, True) None None 0 \n", + "\n", + "[1 rows x 26 columns]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filter the spans to only include those from our summarization agent\n", + "summarization_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(summarization_agent_id)]\n", + "summarization_spans.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "import phoenix.evals.default_templates as templates\n", + "\n", + "def evaluate_summarization(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": templates.SUMMARIZATION_PROMPT_TEMPLATE.explanation_template.format(output=row['attributes.output.value'], input=row['attributes.input.value'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summarization_spans['label'], summarization_spans['explanation'] = zip(*summarization_spans.apply(evaluate_summarization, axis=1))\n", + "summarization_spans['score'] = summarization_spans['label'].apply(lambda x: 1 if x == \"good\" else 0)\n", + "summarization_spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Import labeled traces into Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:34: UserWarning: The Phoenix server has an unknown version and may have compatibility issues.\n", + " warnings.warn(\n", + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from phoenix.trace import SpanEvaluations\n", + "\n", + "px.Client().log_evaluations(\n", + " SpanEvaluations(eval_name=\"Code Quality\", dataframe=code_gen_spans),\n", + " SpanEvaluations(eval_name=\"Summarization\", dataframe=summarization_spans)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now view your evaluations in the Phoenix UI:\n", + "\n", + "![image info](../../third_party/Phoenix/images/phoenix-agent-summarization-eval.png)" + ] } ], "metadata": { @@ -1152,7 +2558,16 @@ "name": "python3" }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" } }, "nbformat": 4, diff --git a/third_party/Phoenix/images/phoenix-agent-summarization-eval.png b/third_party/Phoenix/images/phoenix-agent-summarization-eval.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3314cdbde6c42f440564287af2dbce24525bd4 GIT binary patch literal 420154 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 Wzfdv28!5d)5(@%?O6lJJU6zr| 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 z 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

;qiM58sZCU5KTD{5_T2; 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%0Aua_<5Qqt=O{&qgPnOM8z> z#h+J+zr)8-r;MTwtVGY$qU#Mbj!D?%=HWN|3{nsJRKo|~GqS!Y1u$b0eruwE4VGT2 zz^w)2C<_JkVTxtJ1kBovee)%fP%5#9E@o}+WIRn%Td)y_Z`hMtF2*l&uu>X`ML6=} zAA0;WFvMmn~!+@X9tP^}>|H>tYWGjfIBbg}4Pt8l@oY}2^4Mor?q1Z_8! z-72KT%(Kk|ET8XtzshJVU*e?{B=y4c!ivurh@?6)$8JcS>zX@7#2lcgo277#a*B9j zuwUp86EVA;Qv)qqsTNW9uWp@r`?LFgFZ;Z7K$Y@uoxp#-V0qAcP{|5^-gngl`jxKQ zBK1e!Y2m1ctnOyM$znkvZ-`~d$)BGIeNLBZ#0R7m5k!f4r*HaGMXp`!FLpes#oXzG zano0dw{KpWJ$3C`exJ`zY0_*0s31N!T-sLf9;2d}a*PhQq0&3*a`Xi)xj=3dOOVZR zyxCxx-E5oEud#A4joK$MDuzV~P?A3MyyMts4r{CCN{X~tlu`sE{WZ*jlfp@wWdB!Y zTB)c!4!bsUhjXvdvw~8M`cks$sSB&&M?YaOsRG+G;?pa6KH%tSH4e&SIg+Z6Us8CR z_oF?6L8LWw@7s^^ePKJSW{z^GP6(R);X41xuJ4c)IGJ7$VBvIa^c3PcFVO~EKh-?o z434_EY4@XIfAMVbAVswN=>1>&Mx{kpbq&}#Y%u0J%6xcEA-pwOBLymSwMtDJzUSxU z_%M{8NjcQGw>J*8gQ4)t6t&ASSv4v7VM-d2DV{ED|7#ZSj+;hkH?$j1r-u}Zj^v<$ z2r+hzt)ryL%^-qjJyS5?GA?p_pV1ocTIc?xTtqm>z0_W!qbmBVH7VUHz1;BkeO*6- zcZO^J^?%hL?N`?k^xhY~?UnJ*yY|;WNndeR)B6UDYCHk{B``zyr#fCdddfzoFJ?+P zxE?ioB{-gKg*2MX@pPaLN$T;=Q;bdhxgMm}{F+i}R!q8alnl5bBQVY|Y8p7+QDhp% z8Db%6JkdxlB%h@T?jbsF;h?i5HQPwi|Bi{V3jwddx}sRh__ojbvV{8*f$Gh`c`@=} zs|PmEDbvUX<+l71NNW8=W)AqUouEOx6qYN~7)jsxrXNJga}y{)R|uqA@4kT&G6g); zd9pb&lGc9ZiAgbV#~&d6whPV5N$STb4B7*w8!1`Qokx#|Oy|`ip|l%wK7Ol1iiyRR z;}4WWHzvc@Xko}~StL2iU5c^I%P3eB$-(lJ)m+0O5y~TAU`Ho*x?WovCQYt=-ziDj zeXZ_Cp@L%*!^8Ru42v8&f~kD{Ts^sv_M_g>&)Z3*a%j8-s^hJJ_FK3tAS5qP@d{V5 zI6oV98-Q(Lg}5U+W+ePV5xY2tBi@yD!y?;m8`y4dhGzqz}Bhx2Arzg5#8hAw2r(doYK!hxTj`*)v3qxuw3@&(@ zl<3xDRlX-SN{A0GLj_#Z%jEd(V8`geTr4t8n~j_Ki*%9jf_G`;4lfa(+HVlh(2M+~ z52AOmK~O*|W!JwQHpr>-td7{x+#V(pN$nr9jYjcAJ5ND!rv2GlFLm^kxr!GrkhiNR zi*J{bvzp5mEsn39S)|zXrLuzvI)_dIw()w33buh8vR;cc9zRUD0W-W)%(COy)aA}R zG=1QOQb21?Kx&{s_DjQ)pB{-5u9Oc~pkK0+bXq0Z&#=v~IGCrPDmc{%boobza+}Wd z1=&2rL~urzZ=pQJ;o>&6_B$|1{MxsNMv25O?`!%0POnKB7-iLX@2 z%x>*|V{158Cogr4_4w0;4*X9d?FL^`N)>?s$286GqB5?-_I*#FO{_53=`x(wA)5rd zbdHxMZxnN@%C8#}>#Oj6S3h2NX?=6VSb(Sz7!oBvg86Jn>+d?^ zBkXEzk-nS%7tQ7~Wg;gCKM}ZEBuR|wM4t%fQ`F&06IVzVna-AbF^@km8Ky6UlViIX z-c%WJ_=+){51fCLtg*soI{L_s@DdT7-MpfE>hGey|NKoR3b-3;!^X$#G`(=k5~@sR z+MhT;dSgY`V74?-hCSPPRM+J`a6ycd=rKNpQj0C_(PiYP8}j^7TjaT1+hhmvS~Jv2 z*^{-}pZ-oU{_9fuLlm7qbQf^Ma?r+p)KhmQKss|dWH^?e56|v@iDL0NWgAS(Z}iow zBXPQSGTJ=*+G~f1(x_U5F689-U90!2{#lg^!~H(+H2aV|?|F~!eQtl1Wc|mtXp@P2 zw)S_Yq3v{lKwH;PT0Uo7^OJLCa+VBQc~{v`#Mo^H!gl9|K^}d2#5qJI+Z~W(8L4r(M46UzjUsqC(}<+~!lbzWBe?+}`*T*j=2U^zt_xbsmIt>d(cl{$u#pe?!oJzLtsm)1k$^ zASC{N>vixzxZ0K3|FxF>>j*MT`K#!*XN5_N;ymj!rw(F^m#USna}x;sT#zhi5eTTT z+)FQpxwLAPpL{zk7I zM)txXB)2mEQ*i%Eb^ov2m%~g*BDDjwHZ{Hw7x5V+T4m1R*;eQ*qCZ7jov=35?{|vG zNmM5@!F=`C27*t1ESMw35xPJpL?gTalU~|f%iBw2RG-^&c@;b_MCuX1mly$VE$Xi#2~VB z_*7(}bYI*52*n*C>(1PvQ@8lK>_*6CXvC#%_Hn+327Wglx;Fj`ph)H}eR&r5%$fKn Zb7-(fMXwSo_W}4%ML`{xFK6oa{{aGH%wYfk literal 0 HcmV?d00001 From 1b3f6e3d431d27c4bbe787a242cb57e29ed092aa Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Wed, 23 Oct 2024 08:30:08 -0700 Subject: [PATCH 04/11] Moving modified agents notebooks to the phoenix folder --- .../agents/analytical_agent_workflow.ipynb | 2101 +++----------- .../agents/simple_Python_agent_workflow.ipynb | 1006 +------ .../Phoenix/analytical_agent_workflow.ipynb | 2575 +++++++++++++++++ .../simple_Python_agent_workflow.ipynb | 1337 +++++++++ 4 files changed, 4307 insertions(+), 2712 deletions(-) create mode 100644 third_party/Phoenix/analytical_agent_workflow.ipynb create mode 100644 third_party/Phoenix/simple_Python_agent_workflow.ipynb diff --git a/mistral/agents/analytical_agent_workflow.ipynb b/mistral/agents/analytical_agent_workflow.ipynb index 6cce05d0..11c4398e 100644 --- a/mistral/agents/analytical_agent_workflow.ipynb +++ b/mistral/agents/analytical_agent_workflow.ipynb @@ -47,23 +47,24 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: mistralai==1.0.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (1.0.0)\n", - "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.27.2)\n", - "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (1.0.6)\n", - "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.8.2)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.9.0.post0)\n", - "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.9.0)\n", - "Requirement already satisfied: anyio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (4.6.0)\n", - "Requirement already satisfied: certifi in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.8.30)\n", - "Requirement already satisfied: httpcore==1.* in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", - "Requirement already satisfied: idna in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.10)\n", - "Requirement already satisfied: sniffio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", - "Requirement already satisfied: typing-extensions>=4.6.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", - "Requirement already satisfied: six>=1.5 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n" + "Requirement already satisfied: mistralai==1.0.0 in /usr/local/lib/python3.10/dist-packages (1.0.0)\n", + "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.27.0)\n", + "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (1.0.6)\n", + "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.8.2)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.9.0)\n", + "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7.1)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.7.4)\n", + "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", + "Requirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7)\n", + "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.20.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", + "Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n", + "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.2.2)\n" ] } ], @@ -73,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 26, "metadata": { "id": "YyLxYRmKjKQf" }, @@ -133,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 21, "metadata": { "id": "FEl6UMM7kJOU" }, @@ -155,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 39, "metadata": { "id": "FQ2E6s_I5WXe" }, @@ -192,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 40, "metadata": { "id": "W3VN-YxmFF1M" }, @@ -215,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -251,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -268,65 +269,65 @@ "\n", "## Step 1:\n", "\n", - "### Analysis Plan:\n", + "### Description:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", + "1. Import the necessary libraries (pandas).\n", + "2. Use the `read_csv` function to load the dataset from the given URL.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", + "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", "\n", "## Step 2:\n", "\n", - "### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", + "### Description:\n", + "Inspect the dataset to understand its structure and contents.\n", "\n", "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", + "1. Use the `head` function to display the first few rows of the dataset.\n", + "2. Use the `info` function to get a summary of the dataset.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "print(data.isnull().sum())\n", + "\n", + "# Get a summary of the dataset\n", + "print(data.info())\n", "```\n", "\n", "## Step 3:\n", "\n", - "### Analysis Plan:\n", + "### Description:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "1. Use the `describe` function to get statistical summaries of the dataset.\n", + "2. Calculate the mean, median, and mode for numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "```\n" + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + "```\n", + "\n", + "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n" ] } ], @@ -345,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 43, "metadata": { "id": "cHaJLA_Yx4sN" }, @@ -520,7 +521,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -536,32 +537,34 @@ "### ENTER WORKFLOW\n", "STEP # 1\n", "TRY # 0\n", - "### Analysis Plan:\n", + "### Description:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", + "1. Import the necessary libraries (pandas).\n", + "2. Use the `read_csv` function to load the dataset from the given URL.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", + "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", "### Run Python agent\n", - "User query: ### Analysis Plan:\n", + "User query: ### Description:\n", "Load the dataset from the provided URL.\n", "\n", "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", + "1. Import the necessary libraries (pandas).\n", + "2. Use the `read_csv` function to load the dataset from the given URL.\n", "\n", "### Suggested Python Code:\n", "```python\n", "import pandas as pd\n", "\n", + "# Load the dataset\n", "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", "data = pd.read_csv(url)\n", "```\n", @@ -577,36 +580,42 @@ "Code executed successfully.\n", "STEP # 2\n", "TRY # 0\n", - "### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", + "### Description:\n", + "Inspect the dataset to understand its structure and contents.\n", "\n", "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", + "1. Use the `head` function to display the first few rows of the dataset.\n", + "2. Use the `info` function to get a summary of the dataset.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "print(data.isnull().sum())\n", + "\n", + "# Get a summary of the dataset\n", + "print(data.info())\n", "```\n", "### Run Python agent\n", - "User query: ### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", + "User query: ### Description:\n", + "Inspect the dataset to understand its structure and contents.\n", "\n", "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", + "1. Use the `head` function to display the first few rows of the dataset.\n", + "2. Use the `info` function to get a summary of the dataset.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Inspect the first few rows of the dataset\n", "print(data.head())\n", - "print(data.isnull().sum())\n", + "\n", + "# Get a summary of the dataset\n", + "print(data.info())\n", "```\n", "### Extracting Python code\n", "print(data.head())\n", - "print(data.isnull().sum())\n", + "print(data.info())\n", "### Python function to run: print(data.head())\n", - "print(data.isnull().sum())\n", + "print(data.info())\n", " State \\\n", "0 Alabama \n", "1 Alaska \n", @@ -662,108 +671,95 @@ "2 110.35 \n", "3 142.39 \n", "4 165.63 \n", - "State 0\n", - "Number of drivers involved in fatal collisions per billion miles 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", - "Car Insurance Premiums ($) 0\n", - "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", - "dtype: int64\n", + "\n", + "RangeIndex: 51 entries, 0 to 50\n", + "Data columns (total 8 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 State 51 non-null object \n", + " 1 Number of drivers involved in fatal collisions per billion miles 51 non-null float64\n", + " 2 Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 51 non-null int64 \n", + " 3 Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 51 non-null int64 \n", + " 4 Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 51 non-null int64 \n", + " 5 Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 51 non-null int64 \n", + " 6 Car Insurance Premiums ($) 51 non-null float64\n", + " 7 Losses incurred by insurance companies for collisions per insured driver ($) 51 non-null float64\n", + "dtypes: float64(3), int64(4), object(1)\n", + "memory usage: 3.3+ KB\n", + "None\n", "Code executed successfully.\n", "STEP # 3\n", "TRY # 0\n", - "### Analysis Plan:\n", + "### Description:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "1. Use the `describe` function to get statistical summaries of the dataset.\n", + "2. Calculate the mean, median, and mode for numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", "```\n", + "\n", + "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", "### Run Python agent\n", - "User query: ### Analysis Plan:\n", + "User query: ### Description:\n", "Perform basic statistical analysis on the dataset.\n", "\n", "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "1. Use the `describe` function to get statistical summaries of the dataset.\n", + "2. Calculate the mean, median, and mode for numerical columns.\n", "\n", "### Suggested Python Code:\n", "```python\n", + "# Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", "```\n", + "\n", + "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", "### Extracting Python code\n", + "# Get statistical summaries of the dataset\n", + "print(data.describe())\n", + "\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + "### Python function to run: # Get statistical summaries of the dataset\n", "print(data.describe())\n", "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "### Python function to run: print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", " Number of drivers involved in fatal collisions per billion miles \\\n", "count 51.000000 \n", "mean 15.790196 \n", @@ -833,14 +829,150 @@ "50% 136.050000 \n", "75% 151.870000 \n", "max 194.780000 \n", - "Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", - "Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", - "Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", - "Code executed successfully.\n", + "Code failed.\n", + "Setting retry to True\n", + "TRY # 1\n", + "### Description:\n", + "Perform basic statistical analysis on the dataset.\n", + "\n", + "### Detailed Instructions:\n", + "1. Use the `describe` function to get statistical summaries of the dataset.\n", + "2. Calculate the mean, median, and mode for numerical columns.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Get statistical summaries of the dataset\n", + "print(data.describe())\n", + "\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + "```\n", + "\n", + "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Perform basic statistical analysis on the dataset.\n", + "\n", + "### Detailed Instructions:\n", + "1. Use the `describe` function to get statistical summaries of the dataset.\n", + "2. Calculate the mean, median, and mode for numerical columns.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Get statistical summaries of the dataset\n", + "print(data.describe())\n", + "\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + "```\n", + "\n", + "These steps will help you load, inspect, and perform basic statistical analysis on the dataset.\n", + "### Extracting Python code\n", + "# Get statistical summaries of the dataset\n", + "print(data.describe())\n", + "\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + "### Python function to run: # Get statistical summaries of the dataset\n", + "print(data.describe())\n", + "\n", + "# Calculate mean, median, and mode for numerical columns\n", + "mean = data.mean()\n", + "median = data.median()\n", + "mode = data.mode().iloc[0]\n", + "\n", + "print(\"Mean:\\n\", mean)\n", + "print(\"Median:\\n\", median)\n", + "print(\"Mode:\\n\", mode)\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "count 51.000000 \n", + "mean 15.790196 \n", + "std 4.122002 \n", + "min 5.900000 \n", + "25% 12.750000 \n", + "50% 15.600000 \n", + "75% 18.500000 \n", + "max 23.900000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "count 51.000000 \n", + "mean 31.725490 \n", + "std 9.633438 \n", + "min 13.000000 \n", + "25% 23.000000 \n", + "50% 34.000000 \n", + "75% 38.000000 \n", + "max 54.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "count 51.000000 \n", + "mean 30.686275 \n", + "std 5.132213 \n", + "min 16.000000 \n", + "25% 28.000000 \n", + "50% 30.000000 \n", + "75% 33.000000 \n", + "max 44.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "count 51.000000 \n", + "mean 85.921569 \n", + "std 15.158949 \n", + "min 10.000000 \n", + "25% 83.000000 \n", + "50% 88.000000 \n", + "75% 95.000000 \n", + "max 100.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "count 51.00000 \n", + "mean 88.72549 \n", + "std 6.96011 \n", + "min 76.00000 \n", + "25% 83.50000 \n", + "50% 88.00000 \n", + "75% 95.00000 \n", + "max 100.00000 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "count 51.000000 \n", + "mean 886.957647 \n", + "std 178.296285 \n", + "min 641.960000 \n", + "25% 768.430000 \n", + "50% 858.970000 \n", + "75% 1007.945000 \n", + "max 1301.520000 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "count 51.000000 \n", + "mean 134.493137 \n", + "std 24.835922 \n", + "min 82.750000 \n", + "25% 114.645000 \n", + "50% 136.050000 \n", + "75% 151.870000 \n", + "max 194.780000 \n", + "Code failed.\n", + "Setting retry to True\n", "### Exit WORKFLOW\n" ] } @@ -891,7 +1023,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 45, "metadata": { "id": "v6z9ZX7Ck1l6" }, @@ -911,7 +1043,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -924,231 +1056,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "## Analysis Report\n", - "\n", - "### Dataset Description\n", - "The dataset consists of 51 data points representing different states in the U.S. and includes the following eight columns:\n", - "1. **State**: The name of the state.\n", - "2. **Number of drivers involved in fatal collisions per billion miles**: The rate of drivers involved in fatal collisions per billion miles driven.\n", - "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of drivers speeding during fatal collisions.\n", - "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of drivers who were alcohol-impaired during fatal collisions.\n", - "5. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of drivers who were not distracted during fatal collisions.\n", - "6. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of drivers who had not been involved in previous accidents.\n", - "7. **Car Insurance Premiums ($)**: The average car insurance premiums in dollars.\n", - "8. **Losses incurred by insurance companies for collisions per insured driver ($)**: The losses incurred by insurance companies for collisions per insured driver.\n", - "\n", - "### Data Inspection\n", - "- **Missing Values**: There are no missing values in the dataset.\n", - "- **First Few Rows**:\n", - " ```plaintext\n", - " State | Number of drivers involved in fatal collisions per billion miles | Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding | Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired | Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted | Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents | Car Insurance Premiums ($) | Losses incurred by insurance companies for collisions per insured driver ($)\n", - " ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------- | -------------------------------------------------------------------------------------------------\n", - " Alabama | 18.8 | 39 | 30 | 96 | 80 | 784.55 | 145.08\n", - " Alaska | 18.1 | 41 | 25 | 90 | 94 | 1053.48 | 133.93\n", - " Arizona | 18.6 | 35 | 28 | 84 | 96 | 899.47 | 110.35\n", - " Arkansas | 22.4 | 18 | 26 | 94 | 95 | 827.34 | 142.39\n", - " California | 12.0 | 35 | 28 | 91 | 89 | 878.41 | 165.63\n", - " ```\n", - "\n", - "### Basic Statistical Analysis\n", - "- **Summary Statistics**:\n", - " ```plaintext\n", - " Number of drivers involved in fatal collisions per billion miles\n", - " count 51.000000\n", - " mean 15.790196\n", - " std 4.122002\n", - " min 5.900000\n", - " 25% 12.750000\n", - " 50% 15.600000\n", - " 75% 18.500000\n", - " max 23.900000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", - " count 51.000000\n", - " mean 31.725490\n", - " std 9.633438\n", - " min 13.000000\n", - " 25% 23.000000\n", - " 50% 34.000000\n", - " 75% 38.000000\n", - " max 54.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", - " count 51.000000\n", - " mean 30.686275\n", - " std 5.132213\n", - " min 16.000000\n", - " 25% 28.000000\n", - " 50% 30.000000\n", - " 75% 33.000000\n", - " max 44.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", - " count 51.000000\n", - " mean 85.921569\n", - " std 15.158949\n", - " min 10.000000\n", - " 25% 83.000000\n", - " 50% 88.000000\n", - " 75% 95.000000\n", - " max 100.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", - " count 51.00000\n", - " mean 88.72549\n", - " std 6.96011\n", - " min 76.00000\n", - " 25% 83.50000\n", - " 50% 88.00000\n", - " 75% 95.00000\n", - " max 100.00000\n", - "\n", - " Car Insurance Premiums ($)\n", - " count 51.000000\n", - " mean 886.957647\n", - " std 178.296285\n", - " min 641.960000\n", - " 25% 768.430000\n", - " 50% 858.970000\n", - " 75% 1007.945000\n", - " max 1301.520000\n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($)\n", - " count 51.000000\n", - " mean 134.493137\n", - " std 24.835922\n", - " min 82.750000\n", - " 25% 114.645000\n", - " 50% 136.050000\n", - " 75% 151.870000\n", - " max 194.780000\n", - " ```\n", - "\n", - "- **Mean, Median, and Standard Deviation**:\n", - " ```plaintext\n", - " Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", - " Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", - " Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", - " ```\n", - "\n", - "### Conclusion\n", - "The dataset provides insights into various factors that contribute to fatal collisions across different states. The analysis reveals the average rates of drivers involved in fatal collisions, the prevalence of speeding and alcohol-impaired driving, the extent of distracted driving, and the impact of previous accidents. Additionally, the dataset includes information on car insurance premiums and the financial losses incurred by insurance companies due to collisions.\n", - "\n", - "On average, the number of drivers involved in fatal collisions per billion miles is around 15.79, with a median of 15.6. Speeding and alcohol-impairment are significant factors in fatal collisions, with average percentages of 31.73% and 30.69%, respectively. Most drivers involved in fatal collisions were not distracted (85.92%) and had not been involved in previous accidents (88.73%).\n", - "\n", - "Car insurance premiums vary significantly across states, with an average of $886.96 and a median of $858.97. The financial losses incurred by insurance companies for collisions per insured driver average around $134.49, with a median of $136.05.\n", - "\n", - "This analysis provides a comprehensive overview of the dataset and highlights key statistics that can inform further investigations into road safety and insurance policies.\n" - ] - } - ], - "source": [ - "print(result)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# (Optional) Trace and Evaluate your Agent\n", - "\n", - "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", - "\n", - "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", - "\n", - "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install -q openinference-instrumentation-mistralai arize-phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🔭 OpenTelemetry Tracing Details 🔭\n", - "| Phoenix Project: mistral_agent_2\n", - "| Span Processor: SimpleSpanProcessor\n", - "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", - "| Transport: HTTP\n", - "| Transport Headers: {'api_key': '****'}\n", - "| \n", - "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", - "| \n", - "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", - "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", - "\n" - ] - } - ], - "source": [ - "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", - "from phoenix.otel import register\n", - "import os\n", - "\n", - "# Add Phoenix API Key for tracing\n", - "PHOENIX_API_KEY = \"48624b3c339c53f04c6:a6d9fef\"\n", - "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", - "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", - "\n", - "# configure the Phoenix tracer\n", - "tracer_provider = register() \n", - "\n", - "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", - "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run your agent" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Run Planning agent\n", - "User query: \n", - "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", + "### Analysis Report\n", "\n", - "The dataset consists of 51 datapoints and has eight columns:\n", + "#### Dataset Description\n", + "The dataset consists of 51 datapoints representing the 50 states and the District of Columbia. It contains the following eight columns:\n", "- State\n", "- Number of drivers involved in fatal collisions per billion miles\n", "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", @@ -1157,395 +1068,64 @@ "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", "- Car Insurance Premiums ($)\n", "- Losses incurred by insurance companies for collisions per insured driver ($)\n", - "\n" - ] - } - ], - "source": [ - "planning_result = run_analysis_planning_agent(query)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "STEP # 1\n", - "TRY # 0\n", - "### Description:\n", - "Load the dataset from the provided URL into a Pandas DataFrame.\n", - "\n", - "### Instructions:\n", - "1. Use the Pandas library to read the CSV file from the URL.\n", - "2. Store the data in a DataFrame named `df`.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Load the dataset from the provided URL into a Pandas DataFrame.\n", "\n", - "### Instructions:\n", - "1. Use the Pandas library to read the CSV file from the URL.\n", - "2. Store the data in a DataFrame named `df`.\n", + "#### Data Loading and Inspection\n", + "The dataset was successfully loaded from the provided URL using the `pandas` library. Initial inspection of the dataset using the `head` function revealed the first few rows, which confirmed the structure of the dataset. The `info` function provided a summary of the dataset, indicating that there are no missing values and confirming the data types of each column.\n", "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "```\n", - "### Extracting Python code\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "### Python function to run: import pandas as pd\n", + "#### Statistical Analysis\n", + "1. **Descriptive Statistics**:\n", + " - The `describe` function provided a statistical summary of the dataset, including count, mean, standard deviation, min, 25th percentile, 50th percentile (median), 75th percentile, and max for each numerical column.\n", "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "Code executed successfully.\n", - "STEP # 2\n", - "TRY # 0\n", - "### Description:\n", - "Inspect the data to understand its structure and check for any missing values.\n", + "2. **Mean, Median, and Mode**:\n", + " - **Mean**: The average values for each numerical column were calculated.\n", + " - **Median**: The median values for each numerical column were calculated.\n", + " - **Mode**: The mode values for each numerical column were calculated.\n", "\n", - "### Instructions:\n", - "1. Display the first few rows of the DataFrame.\n", - "2. Check for any missing values in the DataFrame.\n", + "#### Key Findings\n", + "1. **Number of Drivers Involved in Fatal Collisions per Billion Miles**:\n", + " - Mean: 15.79\n", + " - Median: 15.60\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", + "2. **Percentage of Drivers Involved in Fatal Collisions Who Were Speeding**:\n", + " - Mean: 31.73%\n", + " - Median: 34.00%\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Inspect the data to understand its structure and check for any missing values.\n", + "3. **Percentage of Drivers Involved in Fatal Collisions Who Were Alcohol-Impaired**:\n", + " - Mean: 30.69%\n", + " - Median: 30.00%\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "### Instructions:\n", - "1. Display the first few rows of the DataFrame.\n", - "2. Check for any missing values in the DataFrame.\n", + "4. **Percentage of Drivers Involved in Fatal Collisions Who Were Not Distracted**:\n", + " - Mean: 85.92%\n", + " - Median: 88.00%\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", + "5. **Percentage of Drivers Involved in Fatal Collisions Who Had Not Been Involved in Any Previous Accidents**:\n", + " - Mean: 88.73%\n", + " - Median: 88.00%\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "```\n", - "### Extracting Python code\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", + "6. **Car Insurance Premiums ($)**:\n", + " - Mean: $886.96\n", + " - Median: $858.97\n", + " - Mode: Not reported due to code execution issues.\n", "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "### Python function to run: # Display the first few rows of the DataFrame\n", - "print(df.head())\n", - "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - " State \\\n", - "0 Alabama \n", - "1 Alaska \n", - "2 Arizona \n", - "3 Arkansas \n", - "4 California \n", - "\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "0 18.8 \n", - "1 18.1 \n", - "2 18.6 \n", - "3 22.4 \n", - "4 12.0 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "0 39 \n", - "1 41 \n", - "2 35 \n", - "3 18 \n", - "4 35 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "0 30 \n", - "1 25 \n", - "2 28 \n", - "3 26 \n", - "4 28 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "0 96 \n", - "1 90 \n", - "2 84 \n", - "3 94 \n", - "4 91 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "0 80 \n", - "1 94 \n", - "2 96 \n", - "3 95 \n", - "4 89 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "0 784.55 \n", - "1 1053.48 \n", - "2 899.47 \n", - "3 827.34 \n", - "4 878.41 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "0 145.08 \n", - "1 133.93 \n", - "2 110.35 \n", - "3 142.39 \n", - "4 165.63 \n", - "State 0\n", - "Number of drivers involved in fatal collisions per billion miles 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", - "Car Insurance Premiums ($) 0\n", - "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", - "dtype: int64\n", - "Code executed successfully.\n", - "STEP # 3\n", - "TRY # 0\n", - "### Description:\n", - "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", - "\n", - "### Instructions:\n", - "1. Calculate the descriptive statistics for the numerical columns.\n", - "2. Display the statistics.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Calculate descriptive statistics\n", - "descriptive_stats = df.describe()\n", - "\n", - "# Display the statistics\n", - "print(descriptive_stats)\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", - "\n", - "### Instructions:\n", - "1. Calculate the descriptive statistics for the numerical columns.\n", - "2. Display the statistics.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Calculate descriptive statistics\n", - "descriptive_stats = df.describe()\n", - "\n", - "# Display the statistics\n", - "print(descriptive_stats)\n", - "```\n", - "### Extracting Python code\n", - "descriptive_stats = df.describe()\n", - "print(descriptive_stats)\n", - "### Python function to run: descriptive_stats = df.describe()\n", - "print(descriptive_stats)\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "count 51.000000 \n", - "mean 15.790196 \n", - "std 4.122002 \n", - "min 5.900000 \n", - "25% 12.750000 \n", - "50% 15.600000 \n", - "75% 18.500000 \n", - "max 23.900000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "count 51.000000 \n", - "mean 31.725490 \n", - "std 9.633438 \n", - "min 13.000000 \n", - "25% 23.000000 \n", - "50% 34.000000 \n", - "75% 38.000000 \n", - "max 54.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "count 51.000000 \n", - "mean 30.686275 \n", - "std 5.132213 \n", - "min 16.000000 \n", - "25% 28.000000 \n", - "50% 30.000000 \n", - "75% 33.000000 \n", - "max 44.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "count 51.000000 \n", - "mean 85.921569 \n", - "std 15.158949 \n", - "min 10.000000 \n", - "25% 83.000000 \n", - "50% 88.000000 \n", - "75% 95.000000 \n", - "max 100.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "count 51.00000 \n", - "mean 88.72549 \n", - "std 6.96011 \n", - "min 76.00000 \n", - "25% 83.50000 \n", - "50% 88.00000 \n", - "75% 95.00000 \n", - "max 100.00000 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "count 51.000000 \n", - "mean 886.957647 \n", - "std 178.296285 \n", - "min 641.960000 \n", - "25% 768.430000 \n", - "50% 858.970000 \n", - "75% 1007.945000 \n", - "max 1301.520000 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "count 51.000000 \n", - "mean 134.493137 \n", - "std 24.835922 \n", - "min 82.750000 \n", - "25% 114.645000 \n", - "50% 136.050000 \n", - "75% 151.870000 \n", - "max 194.780000 \n", - "Code executed successfully.\n", - "### Exit WORKFLOW\n" - ] - } - ], - "source": [ - "# Create an instance of the Tee class\n", - "tee_stream = Tee()\n", - "\n", - "# Redirect stdout to the Tee instance\n", - "sys.stdout = tee_stream\n", - "\n", - "\n", - "Python_agent = PythonAgentWorkflow()\n", - "Python_agent.workflow(planning_result)\n", - "\n", - "# Restore the original stdout\n", - "sys.stdout = tee_stream.original_stdout\n", - "\n", - "# Get the captured output\n", - "captured_output = tee_stream.getvalue()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "response = client.agents.complete(\n", - " agent_id= summarization_agent_id,\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": query + captured_output\n", - " },\n", - " ]\n", - ")\n", - "result = response.choices[0].message.content" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Analysis Report\n", - "\n", - "#### Dataset Description\n", - "The dataset contains information about driving behaviors and insurance metrics across 51 U.S. states. The dataset includes the following columns:\n", - "\n", - "- **State**: The name of the state.\n", - "- **Number of drivers involved in fatal collisions per billion miles**: The rate of fatal collisions per billion miles driven.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of fatal collisions involving speeding.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of fatal collisions involving alcohol impairment.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of fatal collisions not involving distractions.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of fatal collisions involving drivers with no previous accidents.\n", - "- **Car Insurance Premiums ($)**: The average car insurance premium in the state.\n", - "- **Losses incurred by insurance companies for collisions per insured driver ($)**: The average losses incurred by insurance companies due to collisions per insured driver.\n", - "\n", - "#### Data Inspection\n", - "The dataset was loaded successfully and inspected for missing values. There are no missing values in the dataset.\n", - "\n", - "#### Descriptive Statistics\n", - "Descriptive statistics were calculated for the numerical columns to understand the distribution of the data. The key findings are as follows:\n", - "\n", - "1. **Number of drivers involved in fatal collisions per billion miles**:\n", - " - Mean: 15.79\n", - " - Standard Deviation: 4.12\n", - " - Min: 5.90\n", - " - Max: 23.90\n", - "\n", - "2. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**:\n", - " - Mean: 31.73%\n", - " - Standard Deviation: 9.63%\n", - " - Min: 13.00%\n", - " - Max: 54.00%\n", - "\n", - "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**:\n", - " - Mean: 30.69%\n", - " - Standard Deviation: 5.13%\n", - " - Min: 16.00%\n", - " - Max: 44.00%\n", - "\n", - "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**:\n", - " - Mean: 85.92%\n", - " - Standard Deviation: 15.16%\n", - " - Min: 10.00%\n", - " - Max: 100.00%\n", - "\n", - "5. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**:\n", - " - Mean: 88.73%\n", - " - Standard Deviation: 6.96%\n", - " - Min: 76.00%\n", - " - Max: 100.00%\n", - "\n", - "6. **Car Insurance Premiums ($)**:\n", - " - Mean: $886.96\n", - " - Standard Deviation: $178.30\n", - " - Min: $641.96\n", - " - Max: $1301.52\n", - "\n", - "7. **Losses incurred by insurance companies for collisions per insured driver ($)**:\n", - " - Mean: $134.49\n", - " - Standard Deviation: $24.84\n", - " - Min: $82.75\n", - " - Max: $194.78\n", + "7. **Losses Incurred by Insurance Companies for Collisions per Insured Driver ($)**:\n", + " - Mean: $134.49\n", + " - Median: $136.05\n", + " - Mode: Not reported due to code execution issues.\n", "\n", "#### Conclusion\n", - "The dataset provides a comprehensive view of driving behaviors and insurance metrics across different states. The descriptive statistics indicate variations in the rates of fatal collisions, the involvement of speeding and alcohol impairment in these collisions, and the impact on insurance premiums and losses. This information can be useful for policymakers, insurance companies, and safety advocates to identify areas for improvement and to implement targeted interventions.\n" + "The dataset provides valuable insights into driving behaviors and their impacts on insurance premiums and losses. The statistical analysis reveals the average and median values for various metrics related to fatal collisions, speeding, alcohol impairment, distraction, previous accidents, insurance premiums, and losses. These insights can be used to inform policies aimed at reducing fatal collisions and improving road safety.\n", + "\n", + "#### Recommendations\n", + "Further analysis could include:\n", + "- Correlation analysis between different variables to understand their relationships.\n", + "- Visualizations such as histograms, box plots, and scatter plots to better understand the distribution and patterns in the data.\n", + "- Time series analysis if the dataset includes temporal data to track changes over time.\n", + "- Comparative analysis between states to identify best and worst performers in terms of road safety and insurance costs.\n" ] } ], @@ -1553,1000 +1133,14 @@ "print(result)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### View your traces\n", - "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Evaluate your agent\n", - "\n", - "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", - "\n", - "1. Export traces from Phoenix\n", - "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", - "3. Import the labeled traces into Phoenix." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Export traces from Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/html": [ - "

\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.output_messagesattributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messages
context.span_id
e47365057e2c8bccMistralClient.agentsLLMNone2024-10-16 18:56:34.274511+00:002024-10-16 18:56:46.406556+00:00OK[]e47365057e2c8bcc22678831aa324e4b171394f156af9a03...[{'message.content': '## Total number of steps...293{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json367660application/json{\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag...[{'message.content': '\n", - "Load this data: https:/...
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...[{'message.content': '```python\n", - "import pandas ...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Load th...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...[{'message.content': '```python\n", - "# Display the ...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Inspect...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...[{'message.content': '```python\n", - "descriptive_st...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Perform...
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...[{'message.content': '### Analysis Report\n", - "\n", - "###...3104{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", - "Load this data: https:/...
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "e47365057e2c8bcc MistralClient.agents LLM None \n", - "81682642a644b5e5 MistralClient.agents LLM None \n", - "d8635ee34648298b MistralClient.agents LLM None \n", - "a2247b0c2142629e MistralClient.agents LLM None \n", - "2aef7e010a055107 MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "e47365057e2c8bcc 2024-10-16 18:56:34.274511+00:00 \n", - "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", - "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", - "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", - "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "e47365057e2c8bcc 2024-10-16 18:56:46.406556+00:00 OK \n", - "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", - "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", - "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", - "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "e47365057e2c8bcc [] e47365057e2c8bcc 22678831aa324e4b171394f156af9a03 \n", - "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", - "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", - "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", - "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", - "\n", - " ... attributes.llm.output_messages \\\n", - "context.span_id ... \n", - "e47365057e2c8bcc ... [{'message.content': '## Total number of steps... \n", - "81682642a644b5e5 ... [{'message.content': '```python\n", - "import pandas ... \n", - "d8635ee34648298b ... [{'message.content': '```python\n", - "# Display the ... \n", - "a2247b0c2142629e ... [{'message.content': '```python\n", - "descriptive_st... \n", - "2aef7e010a055107 ... [{'message.content': '### Analysis Report\n", - "\n", - "###... \n", - "\n", - " attributes.llm.token_count.prompt \\\n", - "context.span_id \n", - "e47365057e2c8bcc 293 \n", - "81682642a644b5e5 168 \n", - "d8635ee34648298b 142 \n", - "a2247b0c2142629e 142 \n", - "2aef7e010a055107 3104 \n", - "\n", - " attributes.input.value \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", - "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "2aef7e010a055107 {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", - "\n", - " attributes.input.mime_type \\\n", - "context.span_id \n", - "e47365057e2c8bcc application/json \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "2aef7e010a055107 application/json \n", - "\n", - " attributes.llm.token_count.completion \\\n", - "context.span_id \n", - "e47365057e2c8bcc 367 \n", - "81682642a644b5e5 61 \n", - "d8635ee34648298b 40 \n", - "a2247b0c2142629e 26 \n", - "2aef7e010a055107 944 \n", - "\n", - " attributes.llm.token_count.total \\\n", - "context.span_id \n", - "e47365057e2c8bcc 660 \n", - "81682642a644b5e5 229 \n", - "d8635ee34648298b 182 \n", - "a2247b0c2142629e 168 \n", - "2aef7e010a055107 4048 \n", - "\n", - " attributes.output.mime_type \\\n", - "context.span_id \n", - "e47365057e2c8bcc application/json \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "2aef7e010a055107 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje... \n", - "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", - "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", - "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", - "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag... \n", - "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", - "\n", - " attributes.llm.input_messages \n", - "context.span_id \n", - "e47365057e2c8bcc [{'message.content': '\n", - "Load this data: https:/... \n", - "81682642a644b5e5 [{'message.content': '### Description:\n", - "Load th... \n", - "d8635ee34648298b [{'message.content': '### Description:\n", - "Inspect... \n", - "a2247b0c2142629e [{'message.content': '### Description:\n", - "Perform... \n", - "2aef7e010a055107 [{'message.content': '\n", - "Load this data: https:/... \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import phoenix as px\n", - "\n", - "spans = px.Client().get_spans_dataframe()\n", - "\n", - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When it comes to evaluating agents, a good general approach is to break down the steps your agent must complete, and evaluate each step individually.\n", - "\n", - "In this case, we can evaluate:\n", - "1. The code generated by the Python agent\n", - "2. The analysis report written by the summarization agent\n", - "\n", - "We'll evaluate each of these steps individually." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Evaluate Code Generation\n", - "\n", - "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", - "\n", - "The template requires two columns to be added to the dataframe:\n", - "- output: The code generated by the agent\n", - "- input: The original user query\n", - "\n", - "We already have the input, so just need to extract solely the generated code from the `attributes.llm.output_messages` column:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Extracting Python code\n", - "### Extracting Python code\n", - "### Extracting Python code\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/z6/6g1hmm4x2dl0z84s6bwkgdzr0000gn/T/ipykernel_32957/2273792046.py:2: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_code
context.span_id
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Load th...(import pandas as pd\\n\\nurl = 'https://raw.git...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Inspect...(# Display the first few rows of the DataFrame...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Perform...(descriptive_stats = df.describe()\\nprint(desc...
\n", - "

3 rows × 23 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "81682642a644b5e5 MistralClient.agents LLM None \n", - "d8635ee34648298b MistralClient.agents LLM None \n", - "a2247b0c2142629e MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", - "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", - "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", - "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", - "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", - "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", - "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", - "\n", - " ... attributes.llm.token_count.prompt \\\n", - "context.span_id ... \n", - "81682642a644b5e5 ... 168 \n", - "d8635ee34648298b ... 142 \n", - "a2247b0c2142629e ... 142 \n", - "\n", - " attributes.input.value \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "\n", - " attributes.input.mime_type \\\n", - "context.span_id \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "\n", - " attributes.llm.token_count.completion \\\n", - "context.span_id \n", - "81682642a644b5e5 61 \n", - "d8635ee34648298b 40 \n", - "a2247b0c2142629e 26 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "81682642a644b5e5 229 application/json \n", - "d8635ee34648298b 182 application/json \n", - "a2247b0c2142629e 168 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", - "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", - "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "81682642a644b5e5 [{'message.content': '### Description:\n", - "Load th... \n", - "d8635ee34648298b [{'message.content': '### Description:\n", - "Inspect... \n", - "a2247b0c2142629e [{'message.content': '### Description:\n", - "Perform... \n", - "\n", - " generated_code \n", - "context.span_id \n", - "81682642a644b5e5 (import pandas as pd\\n\\nurl = 'https://raw.git... \n", - "d8635ee34648298b (# Display the first few rows of the DataFrame... \n", - "a2247b0c2142629e (descriptive_stats = df.describe()\\nprint(desc... \n", - "\n", - "[3 rows x 23 columns]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "code_gen_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(python_agent_id)]\n", - "code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n", - "code_gen_spans.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", - "\n", - "def evaluate_code(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['generated_code'], input=row['attributes.input.value'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "MistralAIInstrumentor().uninstrument()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run our `evaluate_code` method on each row of the dataframe:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "results = code_gen_spans.apply(evaluate_code, axis=1)\n", - "code_gen_spans['label'] = results.apply(lambda x: x[0] if x else None)\n", - "code_gen_spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", - "code_gen_spans['score'] = code_gen_spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Evaluate Summarization\n", - "\n", - "We'll use a simple prompt to evaluate the summarization agent, this time using a different prebuilt evaluation template." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_codelabelexplanationscore
context.span_id
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", - "Load this data: https:/...(None, True)NoneNone0
\n", - "

1 rows × 26 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "2aef7e010a055107 MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", - "\n", - " ... attributes.llm.token_count.completion \\\n", - "context.span_id ... \n", - "2aef7e010a055107 ... 944 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "2aef7e010a055107 4048 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "2aef7e010a055107 [{'message.content': '\n", - "Load this data: https:/... \n", - "\n", - " generated_code label explanation score \n", - "context.span_id \n", - "2aef7e010a055107 (None, True) None None 0 \n", - "\n", - "[1 rows x 26 columns]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Filter the spans to only include those from our summarization agent\n", - "summarization_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(summarization_agent_id)]\n", - "summarization_spans.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "import phoenix.evals.default_templates as templates\n", - "\n", - "def evaluate_summarization(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": templates.SUMMARIZATION_PROMPT_TEMPLATE.explanation_template.format(output=row['attributes.output.value'], input=row['attributes.input.value'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" - ] - }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "id": "dyNNbLLtOhh0" + }, "outputs": [], - "source": [ - "summarization_spans['label'], summarization_spans['explanation'] = zip(*summarization_spans.apply(evaluate_summarization, axis=1))\n", - "summarization_spans['score'] = summarization_spans['label'].apply(lambda x: 1 if x == \"good\" else 0)\n", - "summarization_spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Import labeled traces into Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:34: UserWarning: The Phoenix server has an unknown version and may have compatibility issues.\n", - " warnings.warn(\n", - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", - " warnings.warn(\n" - ] - } - ], - "source": [ - "from phoenix.trace import SpanEvaluations\n", - "\n", - "px.Client().log_evaluations(\n", - " SpanEvaluations(eval_name=\"Code Quality\", dataframe=code_gen_spans),\n", - " SpanEvaluations(eval_name=\"Summarization\", dataframe=summarization_spans)\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can now view your evaluations in the Phoenix UI:\n", - "\n", - "![image info](../../third_party/Phoenix/images/phoenix-agent-summarization-eval.png)" - ] + "source": [] } ], "metadata": { @@ -2558,16 +1152,7 @@ "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.11.9" + "name": "python" } }, "nbformat": 4, diff --git a/mistral/agents/simple_Python_agent_workflow.ipynb b/mistral/agents/simple_Python_agent_workflow.ipynb index 4ee816fd..84f2de2b 100644 --- a/mistral/agents/simple_Python_agent_workflow.ipynb +++ b/mistral/agents/simple_Python_agent_workflow.ipynb @@ -2,7 +2,9 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "id": "D_GgusGnIUaM" + }, "source": [ "# Simple Python agent workflow\n", "\n", @@ -52,7 +54,7 @@ "id": "EuHgymvZQRfj" }, "source": [ - "## Install dependencies & setup keys\n", + "## Install dependencies\n", "\n", "First we will install the python SDK and set our API key!" ] @@ -67,14 +69,39 @@ "id": "JfXG-CmrQTSW", "outputId": "4eccd614-727e-4455-a0d7-5033e6f2f2ca" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: mistralai==1.0.0 in /usr/local/lib/python3.10/dist-packages (1.0.0)\n", + "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.27.0)\n", + "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (1.0.6)\n", + "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.8.2)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from mistralai==1.0.0) (0.9.0)\n", + "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7.1)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.7.4)\n", + "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", + "Requirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.7)\n", + "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.20.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", + "Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n", + "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.2.2)\n" + ] + } + ], "source": [ "!pip install mistralai==1.0.0" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "id": "UTcv5cgYQWZd" }, @@ -121,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "id": "T2QjE0EzPN2x" }, @@ -143,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 5, "metadata": { "id": "Sy087IOjours" }, @@ -236,6 +263,7 @@ " retry = False\n", " try:\n", " exec(python_function)\n", + " print(\"Code executed successfully.\")\n", " try:\n", " exec(test_function)\n", " print(\"Code passed test case.\")\n", @@ -274,7 +302,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -293,17 +321,10 @@ "User query: How can I remove duplicates from a list\n", "### Extracting Python code\n", "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "Test failed\n", - "Setting retry to True\n", - "TRY # 1\n", - "### Run Python agent\n", - "User query: How can I remove duplicates from a list\n", - "### Extracting Python code\n", - "### Extracting test case\n", + "Code executed successfully.\n", "Code passed test case.\n", - "Validated Python function: ```def remove_duplicates(input_list):\n", - " return list(set(input_list))```\n", + "Validated Python function: ```def remove_duplicates(lst):\n", + " return list(set(lst))```\n", "### EXIT WORKFLOW\n" ] } @@ -314,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -333,6 +354,7 @@ "User query: How can I sort a list of words and add the word love to each of word \n", "### Extracting Python code\n", "### Extracting test case\n", + "Code executed successfully.\n", "Code passed test case.\n", "Validated Python function: ```def sort_and_add_love(words):\n", " words.sort()\n", @@ -347,7 +369,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -362,10 +384,9 @@ "text": [ "### ENTER WORKFLOW\n", "TRY # 0\n", - "### Run Python agent\n", - "User query: How can calculate fibinacci \n", "### Extracting Python code\n", "### Extracting test case\n", + "Code executed successfully.\n", "Code passed test case.\n", "Validated Python function: ```def fibonacci(n):\n", " if n <= 0:\n", @@ -374,11 +395,11 @@ " return [0]\n", " elif n == 2:\n", " return [0, 1]\n", - " else:\n", - " fib_sequence = [0, 1]\n", - " while len(fib_sequence) < n:\n", - " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", - " return fib_sequence```\n", + "\n", + " fib_sequence = [0, 1]\n", + " while len(fib_sequence) < n:\n", + " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", + " return fib_sequence```\n", "### EXIT WORKFLOW\n" ] } @@ -387,928 +408,14 @@ "run_workflow(\"How can calculate fibinacci \")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# (Optional) Trace and Evaluate your Agent\n", - "\n", - "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", - "\n", - "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", - "\n", - "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install -q openinference-instrumentation-mistralai arize-phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Overriding of current TracerProvider is not allowed\n", - "Attempting to instrument while already instrumented\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🔭 OpenTelemetry Tracing Details 🔭\n", - "| Phoenix Project: mistral_agent_tracing\n", - "| Span Processor: SimpleSpanProcessor\n", - "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", - "| Transport: HTTP\n", - "| Transport Headers: {'api_key': '****'}\n", - "| \n", - "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", - "| \n", - "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", - "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", - "\n" - ] - } - ], - "source": [ - "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", - "from phoenix.otel import register\n", - "import os\n", - "\n", - "# Add Phoenix API Key for tracing\n", - "PHOENIX_API_KEY = \"Your Phoenix API Key Goes Here\"\n", - "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", - "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", - "\n", - "# configure the Phoenix tracer\n", - "tracer_provider = register() \n", - "\n", - "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", - "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run your agent again" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can I remove duplicates from a list\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can calculate fibinacci \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### View your traces\n", - "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Evaluate your agent\n", - "\n", - "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", - "\n", - "1. Export traces from Phoenix\n", - "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", - "3. Import the labeled traces into Phoenix." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Export traces from Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import phoenix as px\n", - "\n", - "spans = px.Client().get_spans_dataframe()\n", - "\n", - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Evaluate traces\n", - "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", - "\n", - "The template requires two columns to be added to the dataframe:\n", - "- output: The code generated by the agent\n", - "- input: The original user query" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Extracting Python code\n", - "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "### Extracting Python code\n", - "### Extracting test case\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinput
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...85155application/json{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...85155application/json{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...77147application/json{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...82159application/json{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...162228application/json{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
\n", - "

5 rows × 26 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", - "da0d7cde2e4cf311 MistralClient.agents LLM None \n", - "33f7a33fad606580 MistralClient.agents LLM None \n", - "d88a511a82477003 MistralClient.agents LLM None \n", - "671411e820abfd2d MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", - "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", - "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", - "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", - "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", - "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", - "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", - "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", - "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", - "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", - "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", - "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", - "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", - "\n", - " ... attributes.llm.token_count.completion \\\n", - "context.span_id ... \n", - "9dcc050d2cbe1fb3 ... 85 \n", - "da0d7cde2e4cf311 ... 85 \n", - "33f7a33fad606580 ... 77 \n", - "d88a511a82477003 ... 82 \n", - "671411e820abfd2d ... 162 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 155 application/json \n", - "da0d7cde2e4cf311 155 application/json \n", - "33f7a33fad606580 147 application/json \n", - "d88a511a82477003 159 application/json \n", - "671411e820abfd2d 228 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", - "da0d7cde2e4cf311 {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", - "33f7a33fad606580 {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", - "d88a511a82477003 {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", - "671411e820abfd2d {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", - "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", - "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", - "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", - "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", - "\n", - " code \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " query \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " output \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " input \n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - "[5 rows x 26 columns]" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spans['output'] = spans['attributes.llm.output_messages'].apply(lambda x: extract_code(x[0]['message.content']))\n", - "spans['input'] = spans['attributes.input.value']\n", - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the `CODE_READABILITY_PROMPT_TEMPLATE` to evaluate the code. The method below takes in a row of the dataframe and returns a label and explanation.\n", - "\n", - "Note that we're also asking the LLM to return an explanation for the label. This will be visible in the UI, and is extremely helpful for debugging." - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", - "\n", - "def evaluate_code(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['output'], input=row['input'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "MistralAIInstrumentor().uninstrument()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run our `evaluate_code` method on each row of the dataframe:" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "results = spans.apply(evaluate_code, axis=1)\n", - "spans['label'] = results.apply(lambda x: x[0] if x else None)\n", - "spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", - "spans['score'] = spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We should now have three more columns in our dataframe: `label`, `explanation`, and `score`." - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinputlabelexplanationscore
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the given code,...1
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, we ne...1
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************1. **Initial Observation**: The given code sni...0
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, let's...1
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************### EXPLANATION:\\n\\n1. **Structure and Formatt...0
\n", - "

5 rows × 29 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", - "da0d7cde2e4cf311 MistralClient.agents LLM None \n", - "33f7a33fad606580 MistralClient.agents LLM None \n", - "d88a511a82477003 MistralClient.agents LLM None \n", - "671411e820abfd2d MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", - "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", - "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", - "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", - "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", - "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", - "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", - "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", - "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", - "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", - "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", - "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", - "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", - "\n", - " ... attributes.output.value \\\n", - "context.span_id ... \n", - "9dcc050d2cbe1fb3 ... {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", - "da0d7cde2e4cf311 ... {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", - "33f7a33fad606580 ... {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", - "d88a511a82477003 ... {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", - "671411e820abfd2d ... {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", - "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", - "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", - "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", - "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", - "\n", - " code \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " query \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " output \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " input \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " label \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 readable \n", - "da0d7cde2e4cf311 readable \n", - "33f7a33fad606580 unreadable\\n\\n************ \n", - "d88a511a82477003 readable \n", - "671411e820abfd2d unreadable\\n\\n************ \n", - "\n", - " explanation score \n", - "context.span_id \n", - "9dcc050d2cbe1fb3 To evaluate the readability of the given code,... 1 \n", - "da0d7cde2e4cf311 To evaluate the readability of the code, we ne... 1 \n", - "33f7a33fad606580 1. **Initial Observation**: The given code sni... 0 \n", - "d88a511a82477003 To evaluate the readability of the code, let's... 1 \n", - "671411e820abfd2d ### EXPLANATION:\\n\\n1. **Structure and Formatt... 0 \n", - "\n", - "[5 rows x 29 columns]" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Import labeled traces into Phoenix" - ] - }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "id": "HEr6pIyEKkwX" + }, "outputs": [], - "source": [ - "from phoenix.trace import SpanEvaluations\n", - "\n", - "px.Client().log_evaluations(SpanEvaluations(eval_name=\"Code Quality\", dataframe=spans))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can now view your evaluations in the Phoenix UI:\n", - "\n", - "![image info](../../third_party/Phoenix/images/phoenix-agent-eval.png)" - ] + "source": [] } ], "metadata": { @@ -1320,16 +427,7 @@ "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.11.9" + "name": "python" } }, "nbformat": 4, diff --git a/third_party/Phoenix/analytical_agent_workflow.ipynb b/third_party/Phoenix/analytical_agent_workflow.ipynb new file mode 100644 index 00000000..6cce05d0 --- /dev/null +++ b/third_party/Phoenix/analytical_agent_workflow.ipynb @@ -0,0 +1,2575 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "JYV9wLKiS6Dl" + }, + "source": [ + "# Data analytical multi-agent workflow:\n", + "\n", + "![image info](../../images/agent_demo2.png)\n", + "\n", + "You can also use multiple agents in a workflow. Here is an example:\n", + "\n", + "1. Data Analysis Planning:\n", + "\n", + " The planning agent writes a comprehensive data analysis plan, outlining the steps required to analyze the data.\n", + "\n", + "2. Code Generation and Execution:\n", + "\n", + " For each step in the analysis plan, the Python agent generates the corresponding code.\n", + "The Python agent then executes the generated code to perform the specified analysis.\n", + "\n", + "3. Analysis Report Summarization:\n", + "\n", + " Based on the results of the executed code, the summarization agent writes an analysis report.\n", + "The report summarizes the findings and insights derived from the data analysis.\n", + "\n", + "\n", + "## Install dependencies\n", + "\n", + "First we will install the python SDK and set our API key!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "idrU7lh3jJSG", + "outputId": "34b9da8e-6ed8-4912-c6df-bfef0e6e7a9c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: mistralai==1.0.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (1.0.0)\n", + "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.27.2)\n", + "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (1.0.6)\n", + "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.8.2)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.9.0.post0)\n", + "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.9.0)\n", + "Requirement already satisfied: anyio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (4.6.0)\n", + "Requirement already satisfied: certifi in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", + "Requirement already satisfied: idna in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.10)\n", + "Requirement already satisfied: sniffio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.20.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", + "Requirement already satisfied: typing-extensions>=4.6.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", + "Requirement already satisfied: six>=1.5 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n" + ] + } + ], + "source": [ + "!pip install mistralai==1.0.0" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "YyLxYRmKjKQf" + }, + "outputs": [], + "source": [ + "import os\n", + "from mistralai import Mistral\n", + "import re\n", + "\n", + "api_key = os.environ[\"MISTRAL_API_KEY\"]\n", + "\n", + "client = Mistral(api_key=api_key)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V2dVirKpjaID" + }, + "source": [ + "## Agents\n", + "You can create an Agent in https://console.mistral.ai/build/agents/new, for this notebook we will use mistral-large-2407 as the model powering our agents!\n", + "\n", + "Here are the instructions provided to the agents we created:\n", + "\n", + "### Planning agent:\n", + "\n", + "```\n", + "You are a data analytical planning assistant. Given a dataset and its description,\n", + "your task is to provide specific and simple analysis plans, detailed instructions,\n", + "and suggested Python code that can later be given to a separate Python agent to generate\n", + "the Python code for executing the analysis plan.\n", + "Do not create figures.\n", + "\n", + "Return output with the following format:\n", + "\n", + "## Total number of steps:\n", + "\n", + "## Step 1:\n", + "```\n", + "\n", + "### Python agent:\n", + "```\n", + "You are a Python coding assistant that only outputs Python code without any explanations or comments.\n", + "Given an instruction and the suggested Python code, return the correct Python code.\n", + "```\n", + "\n", + "### Summarization agent:\n", + "```\n", + "You are an analysis summarization assistant.\n", + "Given a dataset's description and the analysis results. Provide an analysis report.\n", + "```\n", + "\n", + "### Agents IDs\n", + "Next, we will retrieve the Agents IDs from the UI where we created the agents.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "FEl6UMM7kJOU" + }, + "outputs": [], + "source": [ + "planning_agent_id = \"ag:8e2706f0:20240807:planning-agent:a0b3a053\"\n", + "summarization_agent_id = \"ag:8e2706f0:20240807:summarization-agent:d7482b8f\"\n", + "python_agent_id = \"ag:8e2706f0:20240807:python-agent:482c86de\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "csZ3Pw5iTZxU" + }, + "source": [ + "# Analysis Planning" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "FQ2E6s_I5WXe" + }, + "outputs": [], + "source": [ + "def run_analysis_planning_agent(query):\n", + " \"\"\"\n", + " Sends a user query to a Python agent and returns the response.\n", + "\n", + " Args:\n", + " query (str): The user query to be sent to the Python agent.\n", + "\n", + " Returns:\n", + " str: The response content from the Python agent.\n", + " \"\"\"\n", + " print(\"### Run Planning agent\")\n", + " print(f\"User query: {query}\")\n", + " try:\n", + " response = client.agents.complete(\n", + " agent_id= planning_agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "W3VN-YxmFF1M" + }, + "outputs": [], + "source": [ + "query = \"\"\"\n", + "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", + "\n", + "The dataset consists of 51 datapoints and has eight columns:\n", + "- State\n", + "- Number of drivers involved in fatal collisions per billion miles\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", + "- Car Insurance Premiums ($)\n", + "- Losses incurred by insurance companies for collisions per insured driver ($)\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AjUIAUMS5aSY", + "outputId": "5fa82d2f-0b36-461d-a8e8-6fcb77a32d24" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Run Planning agent\n", + "User query: \n", + "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", + "\n", + "The dataset consists of 51 datapoints and has eight columns:\n", + "- State\n", + "- Number of drivers involved in fatal collisions per billion miles\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", + "- Car Insurance Premiums ($)\n", + "- Losses incurred by insurance companies for collisions per insured driver ($)\n", + "\n" + ] + } + ], + "source": [ + "planning_result = run_analysis_planning_agent(query)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4rg10DgI1nQ0", + "outputId": "56b1d835-e591-4cf4-c59c-069f9e70842a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## Total number of steps: 3\n", + "\n", + "## Step 1:\n", + "\n", + "### Analysis Plan:\n", + "Load the dataset from the provided URL.\n", + "\n", + "### Detailed Instructions:\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", + "\n", + "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", + "data = pd.read_csv(url)\n", + "```\n", + "\n", + "## Step 2:\n", + "\n", + "### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", + "\n", + "### Detailed Instructions:\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.head())\n", + "print(data.isnull().sum())\n", + "```\n", + "\n", + "## Step 3:\n", + "\n", + "### Analysis Plan:\n", + "Perform basic statistical analysis on the dataset.\n", + "\n", + "### Detailed Instructions:\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "```\n" + ] + } + ], + "source": [ + "print(planning_result)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wzMIy7VvTfOv" + }, + "source": [ + "# Generate and execute Python code for each planning step" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "cHaJLA_Yx4sN" + }, + "outputs": [], + "source": [ + "class PythonAgentWorkflow:\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def extract_pattern(self, text, pattern):\n", + " \"\"\"\n", + " Extracts a pattern from the given text.\n", + "\n", + " Args:\n", + " text (str): The text to search within.\n", + " pattern (str): The regex pattern to search for.\n", + "\n", + " Returns:\n", + " str: The extracted pattern or None if not found.\n", + " \"\"\"\n", + " match = re.search(pattern, text, flags=re.DOTALL)\n", + " if match:\n", + " return match.group(1).strip()\n", + " return None\n", + "\n", + " def extract_step_i(self, planning_result, i, n_step):\n", + " \"\"\"\n", + " Extracts the content of a specific step from the planning result.\n", + "\n", + " Args:\n", + " planning_result (str): The planning result text.\n", + " i (int): The step number to extract.\n", + " n_step (int): The total number of steps.\n", + "\n", + " Returns:\n", + " str: The extracted step content or None if not found.\n", + " \"\"\"\n", + " if i < n_step:\n", + " pattern = rf'## Step {i}:(.*?)## Step {i+1}'\n", + " elif i == n_step:\n", + " pattern = rf'## Step {i}:(.*)'\n", + " else:\n", + " print(f\"Invalid step number {i}. It should be between 1 and {n_step}.\")\n", + " return None\n", + "\n", + " step_i = self.extract_pattern(planning_result, pattern)\n", + " if not step_i:\n", + " print(f\"Failed to extract Step {i} content.\")\n", + " return None\n", + "\n", + " return step_i\n", + "\n", + " def extract_code(self, python_agent_result):\n", + " \"\"\"\n", + " Extracts Python function and test case from the response content.\n", + "\n", + " Args:\n", + " result (str): The response content from the Python agent.\n", + "\n", + " Returns:\n", + " tuple: A tuple containing the extracted Python function and a retry flag.\n", + " \"\"\"\n", + " retry = False\n", + " print(\"### Extracting Python code\")\n", + " python_code = self.extract_pattern(python_agent_result, r'```python(.*?)```')\n", + " if not python_code:\n", + " retry = True\n", + " print(\"Python function failed to generate or wrong output format. Setting retry to True.\")\n", + "\n", + " return python_code, retry\n", + "\n", + " def run_python_agent(self, query):\n", + " \"\"\"\n", + " Sends a user query to a Python agent and returns the response.\n", + "\n", + " Args:\n", + " query (str): The user query to be sent to the Python agent.\n", + "\n", + " Returns:\n", + " str: The response content from the Python agent.\n", + " \"\"\"\n", + " print(\"### Run Python agent\")\n", + " print(f\"User query: {query}\")\n", + " try:\n", + " response = client.agents.complete(\n", + " agent_id= python_agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result\n", + "\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None\n", + "\n", + " def check_code(self, python_function, state):\n", + " \"\"\"\n", + " Executes the Python function and checks for any errors.\n", + "\n", + " Args:\n", + " python_function (str): The Python function to be executed.\n", + "\n", + " Returns:\n", + " bool: A flag indicating whether the code execution needs to be retried.\n", + "\n", + " Warning:\n", + " This code is designed to run code that’s been generated by a model, which may not be entirely reliable.\n", + " It's strongly recommended to run this in a sandbox environment.\n", + " \"\"\"\n", + " retry = False\n", + " try:\n", + " print(f\"### Python function to run: {python_function}\")\n", + " exec(python_function, state)\n", + " print(\"Code executed successfully.\")\n", + " except Exception:\n", + " print(f\"Code failed.\")\n", + " retry = True\n", + " print(\"Setting retry to True\")\n", + " return retry\n", + "\n", + " def process_step(self, planning_result, i, n_step, max_retries, state):\n", + " \"\"\"\n", + " Processes a single step, including retries.\n", + "\n", + " Args:\n", + " planning_result (str): The planning result text.\n", + " i (int): The step number to process.\n", + " n_step (int): The total number of steps.\n", + " max_retries (int): The maximum number of retries.\n", + "\n", + " Returns:\n", + " str: The extracted step content or None if not found.\n", + " \"\"\"\n", + "\n", + " retry = True\n", + " j = 0\n", + " while j < max_retries and retry:\n", + " print(f\"TRY # {j}\")\n", + " j += 1\n", + " step_i = self.extract_step_i(planning_result, i, n_step)\n", + " if step_i:\n", + " print(step_i)\n", + " python_agent_result = self.run_python_agent(step_i)\n", + " python_code, retry = self.extract_code(python_agent_result)\n", + " print(python_code)\n", + " retry = self.check_code(python_code, state)\n", + " return None\n", + "\n", + " def workflow(self, planning_result):\n", + " \"\"\"\n", + " Executes the workflow for processing planning results.\n", + "\n", + " Args:\n", + " planning_result (str): The planning result text.\n", + " \"\"\"\n", + " state = {}\n", + " print(\"### ENTER WORKFLOW\")\n", + " n_step = int(self.extract_pattern(planning_result, '## Total number of steps:\\s*(\\d+)'))\n", + " for i in range(1, n_step + 1):\n", + " print(f\"STEP # {i}\")\n", + " self.process_step(planning_result, i, n_step, max_retries=2, state=state)\n", + "\n", + "\n", + " print(\"### Exit WORKFLOW\")\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xND0_v3z1wp2", + "outputId": "b433658a-3a10-4230-d6fa-530451a8bead" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "STEP # 1\n", + "TRY # 0\n", + "### Analysis Plan:\n", + "Load the dataset from the provided URL.\n", + "\n", + "### Detailed Instructions:\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", + "\n", + "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", + "data = pd.read_csv(url)\n", + "```\n", + "### Run Python agent\n", + "User query: ### Analysis Plan:\n", + "Load the dataset from the provided URL.\n", + "\n", + "### Detailed Instructions:\n", + "1. Use the pandas library to read the CSV file.\n", + "2. Store the data in a DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", + "\n", + "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", + "data = pd.read_csv(url)\n", + "```\n", + "### Extracting Python code\n", + "import pandas as pd\n", + "\n", + "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", + "data = pd.read_csv(url)\n", + "### Python function to run: import pandas as pd\n", + "\n", + "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", + "data = pd.read_csv(url)\n", + "Code executed successfully.\n", + "STEP # 2\n", + "TRY # 0\n", + "### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", + "\n", + "### Detailed Instructions:\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.head())\n", + "print(data.isnull().sum())\n", + "```\n", + "### Run Python agent\n", + "User query: ### Analysis Plan:\n", + "Inspect the dataset to understand its structure and check for any missing values.\n", + "\n", + "### Detailed Instructions:\n", + "1. Display the first few rows of the dataset.\n", + "2. Check for missing values in each column.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.head())\n", + "print(data.isnull().sum())\n", + "```\n", + "### Extracting Python code\n", + "print(data.head())\n", + "print(data.isnull().sum())\n", + "### Python function to run: print(data.head())\n", + "print(data.isnull().sum())\n", + " State \\\n", + "0 Alabama \n", + "1 Alaska \n", + "2 Arizona \n", + "3 Arkansas \n", + "4 California \n", + "\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "0 18.8 \n", + "1 18.1 \n", + "2 18.6 \n", + "3 22.4 \n", + "4 12.0 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "0 39 \n", + "1 41 \n", + "2 35 \n", + "3 18 \n", + "4 35 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "0 30 \n", + "1 25 \n", + "2 28 \n", + "3 26 \n", + "4 28 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "0 96 \n", + "1 90 \n", + "2 84 \n", + "3 94 \n", + "4 91 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "0 80 \n", + "1 94 \n", + "2 96 \n", + "3 95 \n", + "4 89 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "0 784.55 \n", + "1 1053.48 \n", + "2 899.47 \n", + "3 827.34 \n", + "4 878.41 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "0 145.08 \n", + "1 133.93 \n", + "2 110.35 \n", + "3 142.39 \n", + "4 165.63 \n", + "State 0\n", + "Number of drivers involved in fatal collisions per billion miles 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", + "Car Insurance Premiums ($) 0\n", + "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", + "dtype: int64\n", + "Code executed successfully.\n", + "STEP # 3\n", + "TRY # 0\n", + "### Analysis Plan:\n", + "Perform basic statistical analysis on the dataset.\n", + "\n", + "### Detailed Instructions:\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "```\n", + "### Run Python agent\n", + "User query: ### Analysis Plan:\n", + "Perform basic statistical analysis on the dataset.\n", + "\n", + "### Detailed Instructions:\n", + "1. Calculate and display summary statistics for the dataset.\n", + "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "```\n", + "### Extracting Python code\n", + "print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + "### Python function to run: print(data.describe())\n", + "\n", + "numerical_columns = [\n", + " 'Number of drivers involved in fatal collisions per billion miles',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", + " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", + " 'Car Insurance Premiums ($)',\n", + " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", + "]\n", + "\n", + "for column in numerical_columns:\n", + " mean_value = data[column].mean()\n", + " median_value = data[column].median()\n", + " std_dev_value = data[column].std()\n", + " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "count 51.000000 \n", + "mean 15.790196 \n", + "std 4.122002 \n", + "min 5.900000 \n", + "25% 12.750000 \n", + "50% 15.600000 \n", + "75% 18.500000 \n", + "max 23.900000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "count 51.000000 \n", + "mean 31.725490 \n", + "std 9.633438 \n", + "min 13.000000 \n", + "25% 23.000000 \n", + "50% 34.000000 \n", + "75% 38.000000 \n", + "max 54.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "count 51.000000 \n", + "mean 30.686275 \n", + "std 5.132213 \n", + "min 16.000000 \n", + "25% 28.000000 \n", + "50% 30.000000 \n", + "75% 33.000000 \n", + "max 44.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "count 51.000000 \n", + "mean 85.921569 \n", + "std 15.158949 \n", + "min 10.000000 \n", + "25% 83.000000 \n", + "50% 88.000000 \n", + "75% 95.000000 \n", + "max 100.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "count 51.00000 \n", + "mean 88.72549 \n", + "std 6.96011 \n", + "min 76.00000 \n", + "25% 83.50000 \n", + "50% 88.00000 \n", + "75% 95.00000 \n", + "max 100.00000 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "count 51.000000 \n", + "mean 886.957647 \n", + "std 178.296285 \n", + "min 641.960000 \n", + "25% 768.430000 \n", + "50% 858.970000 \n", + "75% 1007.945000 \n", + "max 1301.520000 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "count 51.000000 \n", + "mean 134.493137 \n", + "std 24.835922 \n", + "min 82.750000 \n", + "25% 114.645000 \n", + "50% 136.050000 \n", + "75% 151.870000 \n", + "max 194.780000 \n", + "Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", + "Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", + "Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", + "Code executed successfully.\n", + "### Exit WORKFLOW\n" + ] + } + ], + "source": [ + "import sys\n", + "import io\n", + "\n", + "# See the output of print statements in the console while also capturing it in a variable,\n", + "class Tee(io.StringIO):\n", + " def __init__(self, *args, **kwargs):\n", + " super().__init__(*args, **kwargs)\n", + " self.original_stdout = sys.stdout\n", + "\n", + " def write(self, data):\n", + " self.original_stdout.write(data)\n", + " super().write(data)\n", + "\n", + " def flush(self):\n", + " self.original_stdout.flush()\n", + " super().flush()\n", + "\n", + "# Create an instance of the Tee class\n", + "tee_stream = Tee()\n", + "\n", + "# Redirect stdout to the Tee instance\n", + "sys.stdout = tee_stream\n", + "\n", + "\n", + "Python_agent = PythonAgentWorkflow()\n", + "Python_agent.workflow(planning_result)\n", + "\n", + "# Restore the original stdout\n", + "sys.stdout = tee_stream.original_stdout\n", + "\n", + "# Get the captured output\n", + "captured_output = tee_stream.getvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gP2y1VHuTlPU" + }, + "source": [ + "# Summarization" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "v6z9ZX7Ck1l6" + }, + "outputs": [], + "source": [ + "response = client.agents.complete(\n", + " agent_id= summarization_agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query + captured_output\n", + " },\n", + " ]\n", + ")\n", + "result = response.choices[0].message.content\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uTJ0WOu5OEYE", + "outputId": "515f673d-9185-401f-cba3-ad60ee8ca75a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## Analysis Report\n", + "\n", + "### Dataset Description\n", + "The dataset consists of 51 data points representing different states in the U.S. and includes the following eight columns:\n", + "1. **State**: The name of the state.\n", + "2. **Number of drivers involved in fatal collisions per billion miles**: The rate of drivers involved in fatal collisions per billion miles driven.\n", + "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of drivers speeding during fatal collisions.\n", + "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of drivers who were alcohol-impaired during fatal collisions.\n", + "5. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of drivers who were not distracted during fatal collisions.\n", + "6. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of drivers who had not been involved in previous accidents.\n", + "7. **Car Insurance Premiums ($)**: The average car insurance premiums in dollars.\n", + "8. **Losses incurred by insurance companies for collisions per insured driver ($)**: The losses incurred by insurance companies for collisions per insured driver.\n", + "\n", + "### Data Inspection\n", + "- **Missing Values**: There are no missing values in the dataset.\n", + "- **First Few Rows**:\n", + " ```plaintext\n", + " State | Number of drivers involved in fatal collisions per billion miles | Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding | Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired | Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted | Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents | Car Insurance Premiums ($) | Losses incurred by insurance companies for collisions per insured driver ($)\n", + " ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------- | -------------------------------------------------------------------------------------------------\n", + " Alabama | 18.8 | 39 | 30 | 96 | 80 | 784.55 | 145.08\n", + " Alaska | 18.1 | 41 | 25 | 90 | 94 | 1053.48 | 133.93\n", + " Arizona | 18.6 | 35 | 28 | 84 | 96 | 899.47 | 110.35\n", + " Arkansas | 22.4 | 18 | 26 | 94 | 95 | 827.34 | 142.39\n", + " California | 12.0 | 35 | 28 | 91 | 89 | 878.41 | 165.63\n", + " ```\n", + "\n", + "### Basic Statistical Analysis\n", + "- **Summary Statistics**:\n", + " ```plaintext\n", + " Number of drivers involved in fatal collisions per billion miles\n", + " count 51.000000\n", + " mean 15.790196\n", + " std 4.122002\n", + " min 5.900000\n", + " 25% 12.750000\n", + " 50% 15.600000\n", + " 75% 18.500000\n", + " max 23.900000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", + " count 51.000000\n", + " mean 31.725490\n", + " std 9.633438\n", + " min 13.000000\n", + " 25% 23.000000\n", + " 50% 34.000000\n", + " 75% 38.000000\n", + " max 54.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", + " count 51.000000\n", + " mean 30.686275\n", + " std 5.132213\n", + " min 16.000000\n", + " 25% 28.000000\n", + " 50% 30.000000\n", + " 75% 33.000000\n", + " max 44.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", + " count 51.000000\n", + " mean 85.921569\n", + " std 15.158949\n", + " min 10.000000\n", + " 25% 83.000000\n", + " 50% 88.000000\n", + " 75% 95.000000\n", + " max 100.000000\n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", + " count 51.00000\n", + " mean 88.72549\n", + " std 6.96011\n", + " min 76.00000\n", + " 25% 83.50000\n", + " 50% 88.00000\n", + " 75% 95.00000\n", + " max 100.00000\n", + "\n", + " Car Insurance Premiums ($)\n", + " count 51.000000\n", + " mean 886.957647\n", + " std 178.296285\n", + " min 641.960000\n", + " 25% 768.430000\n", + " 50% 858.970000\n", + " 75% 1007.945000\n", + " max 1301.520000\n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($)\n", + " count 51.000000\n", + " mean 134.493137\n", + " std 24.835922\n", + " min 82.750000\n", + " 25% 114.645000\n", + " 50% 136.050000\n", + " 75% 151.870000\n", + " max 194.780000\n", + " ```\n", + "\n", + "- **Mean, Median, and Standard Deviation**:\n", + " ```plaintext\n", + " Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", + " Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", + " Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", + " ```\n", + "\n", + "### Conclusion\n", + "The dataset provides insights into various factors that contribute to fatal collisions across different states. The analysis reveals the average rates of drivers involved in fatal collisions, the prevalence of speeding and alcohol-impaired driving, the extent of distracted driving, and the impact of previous accidents. Additionally, the dataset includes information on car insurance premiums and the financial losses incurred by insurance companies due to collisions.\n", + "\n", + "On average, the number of drivers involved in fatal collisions per billion miles is around 15.79, with a median of 15.6. Speeding and alcohol-impairment are significant factors in fatal collisions, with average percentages of 31.73% and 30.69%, respectively. Most drivers involved in fatal collisions were not distracted (85.92%) and had not been involved in previous accidents (88.73%).\n", + "\n", + "Car insurance premiums vary significantly across states, with an average of $886.96 and a median of $858.97. The financial losses incurred by insurance companies for collisions per insured driver average around $134.49, with a median of $136.05.\n", + "\n", + "This analysis provides a comprehensive overview of the dataset and highlights key statistics that can inform further investigations into road safety and insurance policies.\n" + ] + } + ], + "source": [ + "print(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# (Optional) Trace and Evaluate your Agent\n", + "\n", + "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", + "\n", + "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", + "\n", + "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q openinference-instrumentation-mistralai arize-phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔭 OpenTelemetry Tracing Details 🔭\n", + "| Phoenix Project: mistral_agent_2\n", + "| Span Processor: SimpleSpanProcessor\n", + "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", + "| Transport: HTTP\n", + "| Transport Headers: {'api_key': '****'}\n", + "| \n", + "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", + "| \n", + "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", + "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", + "\n" + ] + } + ], + "source": [ + "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", + "from phoenix.otel import register\n", + "import os\n", + "\n", + "# Add Phoenix API Key for tracing\n", + "PHOENIX_API_KEY = \"48624b3c339c53f04c6:a6d9fef\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "\n", + "# configure the Phoenix tracer\n", + "tracer_provider = register() \n", + "\n", + "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", + "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run your agent" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Run Planning agent\n", + "User query: \n", + "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", + "\n", + "The dataset consists of 51 datapoints and has eight columns:\n", + "- State\n", + "- Number of drivers involved in fatal collisions per billion miles\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", + "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", + "- Car Insurance Premiums ($)\n", + "- Losses incurred by insurance companies for collisions per insured driver ($)\n", + "\n" + ] + } + ], + "source": [ + "planning_result = run_analysis_planning_agent(query)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "STEP # 1\n", + "TRY # 0\n", + "### Description:\n", + "Load the dataset from the provided URL into a Pandas DataFrame.\n", + "\n", + "### Instructions:\n", + "1. Use the Pandas library to read the CSV file from the URL.\n", + "2. Store the data in a DataFrame named `df`.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", + "\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Load the dataset from the provided URL into a Pandas DataFrame.\n", + "\n", + "### Instructions:\n", + "1. Use the Pandas library to read the CSV file from the URL.\n", + "2. Store the data in a DataFrame named `df`.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "import pandas as pd\n", + "\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "```\n", + "### Extracting Python code\n", + "import pandas as pd\n", + "\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "### Python function to run: import pandas as pd\n", + "\n", + "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", + "df = pd.read_csv(url)\n", + "Code executed successfully.\n", + "STEP # 2\n", + "TRY # 0\n", + "### Description:\n", + "Inspect the data to understand its structure and check for any missing values.\n", + "\n", + "### Instructions:\n", + "1. Display the first few rows of the DataFrame.\n", + "2. Check for any missing values in the DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Inspect the data to understand its structure and check for any missing values.\n", + "\n", + "### Instructions:\n", + "1. Display the first few rows of the DataFrame.\n", + "2. Check for any missing values in the DataFrame.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "```\n", + "### Extracting Python code\n", + "# Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + "### Python function to run: # Display the first few rows of the DataFrame\n", + "print(df.head())\n", + "\n", + "# Check for missing values\n", + "print(df.isnull().sum())\n", + " State \\\n", + "0 Alabama \n", + "1 Alaska \n", + "2 Arizona \n", + "3 Arkansas \n", + "4 California \n", + "\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "0 18.8 \n", + "1 18.1 \n", + "2 18.6 \n", + "3 22.4 \n", + "4 12.0 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "0 39 \n", + "1 41 \n", + "2 35 \n", + "3 18 \n", + "4 35 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "0 30 \n", + "1 25 \n", + "2 28 \n", + "3 26 \n", + "4 28 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "0 96 \n", + "1 90 \n", + "2 84 \n", + "3 94 \n", + "4 91 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "0 80 \n", + "1 94 \n", + "2 96 \n", + "3 95 \n", + "4 89 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "0 784.55 \n", + "1 1053.48 \n", + "2 899.47 \n", + "3 827.34 \n", + "4 878.41 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "0 145.08 \n", + "1 133.93 \n", + "2 110.35 \n", + "3 142.39 \n", + "4 165.63 \n", + "State 0\n", + "Number of drivers involved in fatal collisions per billion miles 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", + "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", + "Car Insurance Premiums ($) 0\n", + "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", + "dtype: int64\n", + "Code executed successfully.\n", + "STEP # 3\n", + "TRY # 0\n", + "### Description:\n", + "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", + "\n", + "### Instructions:\n", + "1. Calculate the descriptive statistics for the numerical columns.\n", + "2. Display the statistics.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Calculate descriptive statistics\n", + "descriptive_stats = df.describe()\n", + "\n", + "# Display the statistics\n", + "print(descriptive_stats)\n", + "```\n", + "### Run Python agent\n", + "User query: ### Description:\n", + "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", + "\n", + "### Instructions:\n", + "1. Calculate the descriptive statistics for the numerical columns.\n", + "2. Display the statistics.\n", + "\n", + "### Suggested Python Code:\n", + "```python\n", + "# Calculate descriptive statistics\n", + "descriptive_stats = df.describe()\n", + "\n", + "# Display the statistics\n", + "print(descriptive_stats)\n", + "```\n", + "### Extracting Python code\n", + "descriptive_stats = df.describe()\n", + "print(descriptive_stats)\n", + "### Python function to run: descriptive_stats = df.describe()\n", + "print(descriptive_stats)\n", + " Number of drivers involved in fatal collisions per billion miles \\\n", + "count 51.000000 \n", + "mean 15.790196 \n", + "std 4.122002 \n", + "min 5.900000 \n", + "25% 12.750000 \n", + "50% 15.600000 \n", + "75% 18.500000 \n", + "max 23.900000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", + "count 51.000000 \n", + "mean 31.725490 \n", + "std 9.633438 \n", + "min 13.000000 \n", + "25% 23.000000 \n", + "50% 34.000000 \n", + "75% 38.000000 \n", + "max 54.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", + "count 51.000000 \n", + "mean 30.686275 \n", + "std 5.132213 \n", + "min 16.000000 \n", + "25% 28.000000 \n", + "50% 30.000000 \n", + "75% 33.000000 \n", + "max 44.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", + "count 51.000000 \n", + "mean 85.921569 \n", + "std 15.158949 \n", + "min 10.000000 \n", + "25% 83.000000 \n", + "50% 88.000000 \n", + "75% 95.000000 \n", + "max 100.000000 \n", + "\n", + " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", + "count 51.00000 \n", + "mean 88.72549 \n", + "std 6.96011 \n", + "min 76.00000 \n", + "25% 83.50000 \n", + "50% 88.00000 \n", + "75% 95.00000 \n", + "max 100.00000 \n", + "\n", + " Car Insurance Premiums ($) \\\n", + "count 51.000000 \n", + "mean 886.957647 \n", + "std 178.296285 \n", + "min 641.960000 \n", + "25% 768.430000 \n", + "50% 858.970000 \n", + "75% 1007.945000 \n", + "max 1301.520000 \n", + "\n", + " Losses incurred by insurance companies for collisions per insured driver ($) \n", + "count 51.000000 \n", + "mean 134.493137 \n", + "std 24.835922 \n", + "min 82.750000 \n", + "25% 114.645000 \n", + "50% 136.050000 \n", + "75% 151.870000 \n", + "max 194.780000 \n", + "Code executed successfully.\n", + "### Exit WORKFLOW\n" + ] + } + ], + "source": [ + "# Create an instance of the Tee class\n", + "tee_stream = Tee()\n", + "\n", + "# Redirect stdout to the Tee instance\n", + "sys.stdout = tee_stream\n", + "\n", + "\n", + "Python_agent = PythonAgentWorkflow()\n", + "Python_agent.workflow(planning_result)\n", + "\n", + "# Restore the original stdout\n", + "sys.stdout = tee_stream.original_stdout\n", + "\n", + "# Get the captured output\n", + "captured_output = tee_stream.getvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "response = client.agents.complete(\n", + " agent_id= summarization_agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query + captured_output\n", + " },\n", + " ]\n", + ")\n", + "result = response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Analysis Report\n", + "\n", + "#### Dataset Description\n", + "The dataset contains information about driving behaviors and insurance metrics across 51 U.S. states. The dataset includes the following columns:\n", + "\n", + "- **State**: The name of the state.\n", + "- **Number of drivers involved in fatal collisions per billion miles**: The rate of fatal collisions per billion miles driven.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of fatal collisions involving speeding.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of fatal collisions involving alcohol impairment.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of fatal collisions not involving distractions.\n", + "- **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of fatal collisions involving drivers with no previous accidents.\n", + "- **Car Insurance Premiums ($)**: The average car insurance premium in the state.\n", + "- **Losses incurred by insurance companies for collisions per insured driver ($)**: The average losses incurred by insurance companies due to collisions per insured driver.\n", + "\n", + "#### Data Inspection\n", + "The dataset was loaded successfully and inspected for missing values. There are no missing values in the dataset.\n", + "\n", + "#### Descriptive Statistics\n", + "Descriptive statistics were calculated for the numerical columns to understand the distribution of the data. The key findings are as follows:\n", + "\n", + "1. **Number of drivers involved in fatal collisions per billion miles**:\n", + " - Mean: 15.79\n", + " - Standard Deviation: 4.12\n", + " - Min: 5.90\n", + " - Max: 23.90\n", + "\n", + "2. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**:\n", + " - Mean: 31.73%\n", + " - Standard Deviation: 9.63%\n", + " - Min: 13.00%\n", + " - Max: 54.00%\n", + "\n", + "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**:\n", + " - Mean: 30.69%\n", + " - Standard Deviation: 5.13%\n", + " - Min: 16.00%\n", + " - Max: 44.00%\n", + "\n", + "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**:\n", + " - Mean: 85.92%\n", + " - Standard Deviation: 15.16%\n", + " - Min: 10.00%\n", + " - Max: 100.00%\n", + "\n", + "5. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**:\n", + " - Mean: 88.73%\n", + " - Standard Deviation: 6.96%\n", + " - Min: 76.00%\n", + " - Max: 100.00%\n", + "\n", + "6. **Car Insurance Premiums ($)**:\n", + " - Mean: $886.96\n", + " - Standard Deviation: $178.30\n", + " - Min: $641.96\n", + " - Max: $1301.52\n", + "\n", + "7. **Losses incurred by insurance companies for collisions per insured driver ($)**:\n", + " - Mean: $134.49\n", + " - Standard Deviation: $24.84\n", + " - Min: $82.75\n", + " - Max: $194.78\n", + "\n", + "#### Conclusion\n", + "The dataset provides a comprehensive view of driving behaviors and insurance metrics across different states. The descriptive statistics indicate variations in the rates of fatal collisions, the involvement of speeding and alcohol impairment in these collisions, and the impact on insurance premiums and losses. This information can be useful for policymakers, insurance companies, and safety advocates to identify areas for improvement and to implement targeted interventions.\n" + ] + } + ], + "source": [ + "print(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### View your traces\n", + "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Evaluate your agent\n", + "\n", + "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", + "\n", + "1. Export traces from Phoenix\n", + "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", + "3. Import the labeled traces into Phoenix." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Export traces from Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.output_messagesattributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messages
context.span_id
e47365057e2c8bccMistralClient.agentsLLMNone2024-10-16 18:56:34.274511+00:002024-10-16 18:56:46.406556+00:00OK[]e47365057e2c8bcc22678831aa324e4b171394f156af9a03...[{'message.content': '## Total number of steps...293{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json367660application/json{\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag...[{'message.content': '\n", + "Load this data: https:/...
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...[{'message.content': '```python\n", + "import pandas ...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Load th...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...[{'message.content': '```python\n", + "# Display the ...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Inspect...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...[{'message.content': '```python\n", + "descriptive_st...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Perform...
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...[{'message.content': '### Analysis Report\n", + "\n", + "###...3104{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", + "Load this data: https:/...
\n", + "

5 rows × 22 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "e47365057e2c8bcc MistralClient.agents LLM None \n", + "81682642a644b5e5 MistralClient.agents LLM None \n", + "d8635ee34648298b MistralClient.agents LLM None \n", + "a2247b0c2142629e MistralClient.agents LLM None \n", + "2aef7e010a055107 MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "e47365057e2c8bcc 2024-10-16 18:56:34.274511+00:00 \n", + "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", + "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", + "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", + "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "e47365057e2c8bcc 2024-10-16 18:56:46.406556+00:00 OK \n", + "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", + "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", + "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", + "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "e47365057e2c8bcc [] e47365057e2c8bcc 22678831aa324e4b171394f156af9a03 \n", + "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", + "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", + "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", + "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", + "\n", + " ... attributes.llm.output_messages \\\n", + "context.span_id ... \n", + "e47365057e2c8bcc ... [{'message.content': '## Total number of steps... \n", + "81682642a644b5e5 ... [{'message.content': '```python\n", + "import pandas ... \n", + "d8635ee34648298b ... [{'message.content': '```python\n", + "# Display the ... \n", + "a2247b0c2142629e ... [{'message.content': '```python\n", + "descriptive_st... \n", + "2aef7e010a055107 ... [{'message.content': '### Analysis Report\n", + "\n", + "###... \n", + "\n", + " attributes.llm.token_count.prompt \\\n", + "context.span_id \n", + "e47365057e2c8bcc 293 \n", + "81682642a644b5e5 168 \n", + "d8635ee34648298b 142 \n", + "a2247b0c2142629e 142 \n", + "2aef7e010a055107 3104 \n", + "\n", + " attributes.input.value \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", + "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "2aef7e010a055107 {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", + "\n", + " attributes.input.mime_type \\\n", + "context.span_id \n", + "e47365057e2c8bcc application/json \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "2aef7e010a055107 application/json \n", + "\n", + " attributes.llm.token_count.completion \\\n", + "context.span_id \n", + "e47365057e2c8bcc 367 \n", + "81682642a644b5e5 61 \n", + "d8635ee34648298b 40 \n", + "a2247b0c2142629e 26 \n", + "2aef7e010a055107 944 \n", + "\n", + " attributes.llm.token_count.total \\\n", + "context.span_id \n", + "e47365057e2c8bcc 660 \n", + "81682642a644b5e5 229 \n", + "d8635ee34648298b 182 \n", + "a2247b0c2142629e 168 \n", + "2aef7e010a055107 4048 \n", + "\n", + " attributes.output.mime_type \\\n", + "context.span_id \n", + "e47365057e2c8bcc application/json \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "2aef7e010a055107 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje... \n", + "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", + "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", + "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", + "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "e47365057e2c8bcc {\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag... \n", + "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", + "\n", + " attributes.llm.input_messages \n", + "context.span_id \n", + "e47365057e2c8bcc [{'message.content': '\n", + "Load this data: https:/... \n", + "81682642a644b5e5 [{'message.content': '### Description:\n", + "Load th... \n", + "d8635ee34648298b [{'message.content': '### Description:\n", + "Inspect... \n", + "a2247b0c2142629e [{'message.content': '### Description:\n", + "Perform... \n", + "2aef7e010a055107 [{'message.content': '\n", + "Load this data: https:/... \n", + "\n", + "[5 rows x 22 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import phoenix as px\n", + "\n", + "spans = px.Client().get_spans_dataframe()\n", + "\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When it comes to evaluating agents, a good general approach is to break down the steps your agent must complete, and evaluate each step individually.\n", + "\n", + "In this case, we can evaluate:\n", + "1. The code generated by the Python agent\n", + "2. The analysis report written by the summarization agent\n", + "\n", + "We'll evaluate each of these steps individually." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate Code Generation\n", + "\n", + "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", + "\n", + "The template requires two columns to be added to the dataframe:\n", + "- output: The code generated by the agent\n", + "- input: The original user query\n", + "\n", + "We already have the input, so just need to extract solely the generated code from the `attributes.llm.output_messages` column:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Extracting Python code\n", + "### Extracting Python code\n", + "### Extracting Python code\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/z6/6g1hmm4x2dl0z84s6bwkgdzr0000gn/T/ipykernel_32957/2273792046.py:2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_code
context.span_id
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Load th...(import pandas as pd\\n\\nurl = 'https://raw.git...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Inspect...(# Display the first few rows of the DataFrame...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", + "Perform...(descriptive_stats = df.describe()\\nprint(desc...
\n", + "

3 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "81682642a644b5e5 MistralClient.agents LLM None \n", + "d8635ee34648298b MistralClient.agents LLM None \n", + "a2247b0c2142629e MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", + "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", + "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", + "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", + "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", + "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", + "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", + "\n", + " ... attributes.llm.token_count.prompt \\\n", + "context.span_id ... \n", + "81682642a644b5e5 ... 168 \n", + "d8635ee34648298b ... 142 \n", + "a2247b0c2142629e ... 142 \n", + "\n", + " attributes.input.value \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", + "\n", + " attributes.input.mime_type \\\n", + "context.span_id \n", + "81682642a644b5e5 application/json \n", + "d8635ee34648298b application/json \n", + "a2247b0c2142629e application/json \n", + "\n", + " attributes.llm.token_count.completion \\\n", + "context.span_id \n", + "81682642a644b5e5 61 \n", + "d8635ee34648298b 40 \n", + "a2247b0c2142629e 26 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "81682642a644b5e5 229 application/json \n", + "d8635ee34648298b 182 application/json \n", + "a2247b0c2142629e 168 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", + "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", + "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "81682642a644b5e5 [{'message.content': '### Description:\n", + "Load th... \n", + "d8635ee34648298b [{'message.content': '### Description:\n", + "Inspect... \n", + "a2247b0c2142629e [{'message.content': '### Description:\n", + "Perform... \n", + "\n", + " generated_code \n", + "context.span_id \n", + "81682642a644b5e5 (import pandas as pd\\n\\nurl = 'https://raw.git... \n", + "d8635ee34648298b (# Display the first few rows of the DataFrame... \n", + "a2247b0c2142629e (descriptive_stats = df.describe()\\nprint(desc... \n", + "\n", + "[3 rows x 23 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "code_gen_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(python_agent_id)]\n", + "code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n", + "code_gen_spans.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", + "\n", + "def evaluate_code(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['generated_code'], input=row['attributes.input.value'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "MistralAIInstrumentor().uninstrument()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run our `evaluate_code` method on each row of the dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results = code_gen_spans.apply(evaluate_code, axis=1)\n", + "code_gen_spans['label'] = results.apply(lambda x: x[0] if x else None)\n", + "code_gen_spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", + "code_gen_spans['score'] = code_gen_spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate Summarization\n", + "\n", + "We'll use a simple prompt to evaluate the summarization agent, this time using a different prebuilt evaluation template." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_codelabelexplanationscore
context.span_id
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", + "Load this data: https:/...(None, True)NoneNone0
\n", + "

1 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "2aef7e010a055107 MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", + "\n", + " ... attributes.llm.token_count.completion \\\n", + "context.span_id ... \n", + "2aef7e010a055107 ... 944 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "2aef7e010a055107 4048 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "2aef7e010a055107 [{'message.content': '\n", + "Load this data: https:/... \n", + "\n", + " generated_code label explanation score \n", + "context.span_id \n", + "2aef7e010a055107 (None, True) None None 0 \n", + "\n", + "[1 rows x 26 columns]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Filter the spans to only include those from our summarization agent\n", + "summarization_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(summarization_agent_id)]\n", + "summarization_spans.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "import phoenix.evals.default_templates as templates\n", + "\n", + "def evaluate_summarization(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": templates.SUMMARIZATION_PROMPT_TEMPLATE.explanation_template.format(output=row['attributes.output.value'], input=row['attributes.input.value'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "summarization_spans['label'], summarization_spans['explanation'] = zip(*summarization_spans.apply(evaluate_summarization, axis=1))\n", + "summarization_spans['score'] = summarization_spans['label'].apply(lambda x: 1 if x == \"good\" else 0)\n", + "summarization_spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Import labeled traces into Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:34: UserWarning: The Phoenix server has an unknown version and may have compatibility issues.\n", + " warnings.warn(\n", + "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from phoenix.trace import SpanEvaluations\n", + "\n", + "px.Client().log_evaluations(\n", + " SpanEvaluations(eval_name=\"Code Quality\", dataframe=code_gen_spans),\n", + " SpanEvaluations(eval_name=\"Summarization\", dataframe=summarization_spans)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now view your evaluations in the Phoenix UI:\n", + "\n", + "![image info](../../third_party/Phoenix/images/phoenix-agent-summarization-eval.png)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/third_party/Phoenix/simple_Python_agent_workflow.ipynb b/third_party/Phoenix/simple_Python_agent_workflow.ipynb new file mode 100644 index 00000000..4ee816fd --- /dev/null +++ b/third_party/Phoenix/simple_Python_agent_workflow.ipynb @@ -0,0 +1,1337 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple Python agent workflow\n", + "\n", + "![image info](../../images/agent_demo1.png)\n", + "\n", + "Here is an example of a simple Python agent workflow using a Python agent with the following steps:\n", + "\n", + "1. User Query:\n", + "\n", + "The process starts when the user submits a query or request to the Python agent.\n", + "\n", + "2. Code and Test Case Generation:\n", + "\n", + "The agent interprets the user's query and generates the corresponding Python code. Alongside the code, the agent creates a test case to verify the functionality of the generated code.\n", + "\n", + "3. Execution and Validation:\n", + "\n", + "The agent attempts to run the generated code to ensure it executes without errors.\n", + "The agent then runs the test case to confirm that the code produces the correct output.\n", + "\n", + "4. Retry Mechanism:\n", + "\n", + "If the code fails to run or the test case does not pass, the agent initiates a retry.\n", + "It regenerates the code and test case, addressing any issues identified during the previous attempt.\n", + "\n", + "5. Result Output:\n", + "\n", + "Once the code runs successfully and passes the test case, the agent delivers the result to the user.\n", + "\n", + "\n", + "## In summary:\n", + "user query\n", + "\n", + "-> agent generate code and test case\n", + "\n", + "-> check if the code is runnable and the test is passed\n", + "\n", + " -> if no, retry and regenerate\n", + "\n", + " -> if yes output result\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EuHgymvZQRfj" + }, + "source": [ + "## Install dependencies & setup keys\n", + "\n", + "First we will install the python SDK and set our API key!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JfXG-CmrQTSW", + "outputId": "4eccd614-727e-4455-a0d7-5033e6f2f2ca" + }, + "outputs": [], + "source": [ + "!pip install mistralai==1.0.0" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "UTcv5cgYQWZd" + }, + "outputs": [], + "source": [ + "import os\n", + "from mistralai import Mistral\n", + "import re\n", + "\n", + "api_key = os.environ[\"MISTRAL_API_KEY\"]\n", + "\n", + "client = Mistral(api_key=api_key)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MyupUn2TMFOU" + }, + "source": [ + "## Agent\n", + "\n", + "You can create an Agent in https://console.mistral.ai/build/agents/new, for this notebook we will use mistral-large-2407 as the model powering our agents!\n", + "\n", + "Here is the instruction provided to the Python agent we create:\n", + "\n", + "```\n", + "You are a Python coding assistant that only outputs Python code without any explanations or comments.\n", + "\n", + "Return one Python function for the given query and one test case using assertion.\n", + "\n", + "Return Python code with two sections:\n", + "\n", + "## Python function\n", + "\n", + "## Test case\n", + "\n", + " \"\"\"\n", + "```\n", + "\n", + "After we create the agent, we will retrieve the Agents ID from the UI where we created the agent:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "T2QjE0EzPN2x" + }, + "outputs": [], + "source": [ + "agent_id= \"ag:8e2706f0:20240807:python-agent:ffdc79f8\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lPj6BEEYPYxp" + }, + "source": [ + "## Simple Python agent workflow\n", + "\n", + "Now we can write several functions `run_python_agent`, `extract_code`, `check_code`, and combine them in a `run_workflow` function." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "Sy087IOjours" + }, + "outputs": [], + "source": [ + "def run_python_agent(query):\n", + " \"\"\"\n", + " Sends a user query to a Python agent and returns the response.\n", + "\n", + " Args:\n", + " query (str): The user query to be sent to the Python agent.\n", + "\n", + " Returns:\n", + " str: The response content from the Python agent.\n", + " \"\"\"\n", + " print(\"### Run Python agent\")\n", + " print(f\"User query: {query}\")\n", + " try:\n", + " response = client.agents.complete(\n", + " agent_id= agent_id,\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": query\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " return result\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None\n", + "\n", + "def extract_pattern(text, pattern):\n", + " \"\"\"\n", + " Extracts a pattern from the given text.\n", + "\n", + " Args:\n", + " text (str): The text to search within.\n", + " pattern (str): The regex pattern to search for.\n", + "\n", + " Returns:\n", + " str: The extracted pattern or None if not found.\n", + " \"\"\"\n", + " match = re.search(pattern, text, flags=re.DOTALL)\n", + " if match:\n", + " return match.group(1).strip()\n", + " return None\n", + "\n", + "def extract_code(result):\n", + " \"\"\"\n", + " Extracts Python function and test case from the response content.\n", + "\n", + " Args:\n", + " result (str): The response content from the Python agent.\n", + "\n", + " Returns:\n", + " tuple: A tuple containing the extracted Python function, test function, and a retry flag.\n", + " \"\"\"\n", + " retry = False\n", + " print(\"### Extracting Python code\")\n", + " python_function = extract_pattern(result, r'## Python function(.*?)## Test case')\n", + " if not python_function:\n", + " retry = True\n", + " print(\"Python function failed to generate or wrong output format. Setting retry to True.\")\n", + "\n", + " print(\"### Extracting test case\")\n", + " test_function = extract_pattern(result, r'## Test case(.*?)```')\n", + " if not test_function:\n", + " retry = True\n", + " print(\"Test function failed to generate or wrong output format. Setting retry to True.\")\n", + "\n", + " return python_function, test_function, retry\n", + "\n", + "def check_code(python_function, test_function):\n", + " \"\"\"\n", + " Executes the Python function and its test case, and checks for any errors.\n", + "\n", + " Args:\n", + " python_function (str): The Python function to be executed.\n", + " test_function (str): The test case to be executed.\n", + "\n", + " Returns:\n", + " bool: A flag indicating whether the code execution needs to be retried.\n", + "\n", + " Warning:\n", + " This code is designed to run code that’s been generated by a model, which may not be entirely reliable.\n", + " It's strongly recommended to run this in a sandbox environment.\n", + " \"\"\"\n", + " retry = False\n", + " try:\n", + " exec(python_function)\n", + " try:\n", + " exec(test_function)\n", + " print(\"Code passed test case.\")\n", + " except Exception:\n", + " print(f\"Test failed\")\n", + " retry = True\n", + " print(\"Setting retry to True\")\n", + " except Exception:\n", + " print(f\"Code failed.\")\n", + " retry = True\n", + " print(\"Setting retry to True\")\n", + " return retry\n", + "\n", + "def run_workflow(query):\n", + " \"\"\"\n", + " Runs the complete workflow to generate, extract, and validate Python code.\n", + "\n", + " Args:\n", + " query (str): The user query to be processed.\n", + " \"\"\"\n", + " print(\"### ENTER WORKFLOW\")\n", + " i = 0\n", + " max_retries = 3\n", + " retry = True # just to get it started\n", + " while i < max_retries and retry:\n", + " print(f\"TRY # {i}\")\n", + " i += 1\n", + " result = run_python_agent(query)\n", + " python_function, test_function, retry = extract_code(result)\n", + " retry = check_code(python_function, test_function)\n", + "\n", + " if not retry:\n", + " print(f\"Validated Python function: ```{python_function}```\")\n", + " print(\"### EXIT WORKFLOW\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LGH7jsX2mfyj", + "outputId": "e66a0d0b-fa7b-4ec9-f053-c3b08f26906e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "TRY # 0\n", + "### Run Python agent\n", + "User query: How can I remove duplicates from a list\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "Test failed\n", + "Setting retry to True\n", + "TRY # 1\n", + "### Run Python agent\n", + "User query: How can I remove duplicates from a list\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Code passed test case.\n", + "Validated Python function: ```def remove_duplicates(input_list):\n", + " return list(set(input_list))```\n", + "### EXIT WORKFLOW\n" + ] + } + ], + "source": [ + "run_workflow(\"How can I remove duplicates from a list\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "utFqsK7vtqQ5", + "outputId": "9ece3a6a-383c-449c-f2e7-95eed0e95c39" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "TRY # 0\n", + "### Run Python agent\n", + "User query: How can I sort a list of words and add the word love to each of word \n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Code passed test case.\n", + "Validated Python function: ```def sort_and_add_love(words):\n", + " words.sort()\n", + " return [word + 'love' for word in words]```\n", + "### EXIT WORKFLOW\n" + ] + } + ], + "source": [ + "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "91TJK-zAurUN", + "outputId": "8d8b1648-6a45-4bc4-bdff-0f144b48fb65" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### ENTER WORKFLOW\n", + "TRY # 0\n", + "### Run Python agent\n", + "User query: How can calculate fibinacci \n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Code passed test case.\n", + "Validated Python function: ```def fibonacci(n):\n", + " if n <= 0:\n", + " return []\n", + " elif n == 1:\n", + " return [0]\n", + " elif n == 2:\n", + " return [0, 1]\n", + " else:\n", + " fib_sequence = [0, 1]\n", + " while len(fib_sequence) < n:\n", + " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", + " return fib_sequence```\n", + "### EXIT WORKFLOW\n" + ] + } + ], + "source": [ + "run_workflow(\"How can calculate fibinacci \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# (Optional) Trace and Evaluate your Agent\n", + "\n", + "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", + "\n", + "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", + "\n", + "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q openinference-instrumentation-mistralai arize-phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Overriding of current TracerProvider is not allowed\n", + "Attempting to instrument while already instrumented\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔭 OpenTelemetry Tracing Details 🔭\n", + "| Phoenix Project: mistral_agent_tracing\n", + "| Span Processor: SimpleSpanProcessor\n", + "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", + "| Transport: HTTP\n", + "| Transport Headers: {'api_key': '****'}\n", + "| \n", + "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", + "| \n", + "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", + "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", + "\n" + ] + } + ], + "source": [ + "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", + "from phoenix.otel import register\n", + "import os\n", + "\n", + "# Add Phoenix API Key for tracing\n", + "PHOENIX_API_KEY = \"Your Phoenix API Key Goes Here\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "\n", + "# configure the Phoenix tracer\n", + "tracer_provider = register() \n", + "\n", + "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", + "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run your agent again" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can I remove duplicates from a list\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_workflow(\"How can calculate fibinacci \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### View your traces\n", + "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Evaluate your agent\n", + "\n", + "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", + "\n", + "1. Export traces from Phoenix\n", + "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", + "3. Import the labeled traces into Phoenix." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Export traces from Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import phoenix as px\n", + "\n", + "spans = px.Client().get_spans_dataframe()\n", + "\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Evaluate traces\n", + "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", + "\n", + "The template requires two columns to be added to the dataframe:\n", + "- output: The code generated by the agent\n", + "- input: The original user query" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### Extracting Python code\n", + "### Extracting test case\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "Test function failed to generate or wrong output format. Setting retry to True.\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "### Extracting Python code\n", + "### Extracting test case\n", + "### Extracting Python code\n", + "### Extracting test case\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinput
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...85155application/json{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...85155application/json{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...77147application/json{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...82159application/json{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...162228application/json{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
\n", + "

5 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", + "da0d7cde2e4cf311 MistralClient.agents LLM None \n", + "33f7a33fad606580 MistralClient.agents LLM None \n", + "d88a511a82477003 MistralClient.agents LLM None \n", + "671411e820abfd2d MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", + "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", + "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", + "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", + "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", + "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", + "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", + "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", + "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", + "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", + "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", + "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", + "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", + "\n", + " ... attributes.llm.token_count.completion \\\n", + "context.span_id ... \n", + "9dcc050d2cbe1fb3 ... 85 \n", + "da0d7cde2e4cf311 ... 85 \n", + "33f7a33fad606580 ... 77 \n", + "d88a511a82477003 ... 82 \n", + "671411e820abfd2d ... 162 \n", + "\n", + " attributes.llm.token_count.total attributes.output.mime_type \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 155 application/json \n", + "da0d7cde2e4cf311 155 application/json \n", + "33f7a33fad606580 147 application/json \n", + "d88a511a82477003 159 application/json \n", + "671411e820abfd2d 228 application/json \n", + "\n", + " attributes.output.value \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", + "da0d7cde2e4cf311 {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", + "33f7a33fad606580 {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", + "d88a511a82477003 {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", + "671411e820abfd2d {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", + "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", + "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", + "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", + "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", + "\n", + " code \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " query \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " output \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " input \n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + "[5 rows x 26 columns]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spans['output'] = spans['attributes.llm.output_messages'].apply(lambda x: extract_code(x[0]['message.content']))\n", + "spans['input'] = spans['attributes.input.value']\n", + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the `CODE_READABILITY_PROMPT_TEMPLATE` to evaluate the code. The method below takes in a row of the dataframe and returns a label and explanation.\n", + "\n", + "Note that we're also asking the LLM to return an explanation for the label. This will be visible in the UI, and is extremely helpful for debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [], + "source": [ + "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", + "\n", + "def evaluate_code(row):\n", + " try:\n", + " response = client.chat.complete(\n", + " model=\"mistral-large-latest\",\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['output'], input=row['input'])\n", + " },\n", + " ]\n", + " )\n", + " result = response.choices[0].message.content\n", + " explanation, label = result.split(\"LABEL: \")\n", + " label = label.replace(\"\\\"\", \"\")\n", + " return label, explanation\n", + " except Exception as e:\n", + " print(f\"Request failed: {e}. Please check your request.\")\n", + " return None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "MistralAIInstrumentor().uninstrument()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run our `evaluate_code` method on each row of the dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "results = spans.apply(evaluate_code, axis=1)\n", + "spans['label'] = results.apply(lambda x: x[0] if x else None)\n", + "spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", + "spans['score'] = spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We should now have three more columns in our dataframe: `label`, `explanation`, and `score`." + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinputlabelexplanationscore
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the given code,...1
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, we ne...1
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************1. **Initial Observation**: The given code sni...0
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, let's...1
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************### EXPLANATION:\\n\\n1. **Structure and Formatt...0
\n", + "

5 rows × 29 columns

\n", + "
" + ], + "text/plain": [ + " name span_kind parent_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", + "da0d7cde2e4cf311 MistralClient.agents LLM None \n", + "33f7a33fad606580 MistralClient.agents LLM None \n", + "d88a511a82477003 MistralClient.agents LLM None \n", + "671411e820abfd2d MistralClient.agents LLM None \n", + "\n", + " start_time \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", + "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", + "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", + "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", + "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", + "\n", + " end_time status_code status_message \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", + "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", + "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", + "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", + "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", + "\n", + " events context.span_id context.trace_id \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", + "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", + "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", + "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", + "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", + "\n", + " ... attributes.output.value \\\n", + "context.span_id ... \n", + "9dcc050d2cbe1fb3 ... {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", + "da0d7cde2e4cf311 ... {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", + "33f7a33fad606580 ... {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", + "d88a511a82477003 ... {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", + "671411e820abfd2d ... {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", + "\n", + " attributes.llm.invocation_parameters \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", + "\n", + " attributes.llm.input_messages \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", + "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", + "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", + "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", + "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", + "\n", + " code \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " query \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " output \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", + "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", + "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", + "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", + "\n", + " input \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", + "\n", + " label \\\n", + "context.span_id \n", + "9dcc050d2cbe1fb3 readable \n", + "da0d7cde2e4cf311 readable \n", + "33f7a33fad606580 unreadable\\n\\n************ \n", + "d88a511a82477003 readable \n", + "671411e820abfd2d unreadable\\n\\n************ \n", + "\n", + " explanation score \n", + "context.span_id \n", + "9dcc050d2cbe1fb3 To evaluate the readability of the given code,... 1 \n", + "da0d7cde2e4cf311 To evaluate the readability of the code, we ne... 1 \n", + "33f7a33fad606580 1. **Initial Observation**: The given code sni... 0 \n", + "d88a511a82477003 To evaluate the readability of the code, let's... 1 \n", + "671411e820abfd2d ### EXPLANATION:\\n\\n1. **Structure and Formatt... 0 \n", + "\n", + "[5 rows x 29 columns]" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spans.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Import labeled traces into Phoenix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from phoenix.trace import SpanEvaluations\n", + "\n", + "px.Client().log_evaluations(SpanEvaluations(eval_name=\"Code Quality\", dataframe=spans))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now view your evaluations in the Phoenix UI:\n", + "\n", + "![image info](../../third_party/Phoenix/images/phoenix-agent-eval.png)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 34a7b0ebd92808aba374d0c978bc891cc9cd0c35 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Wed, 23 Oct 2024 08:32:55 -0700 Subject: [PATCH 05/11] Update README.md --- third_party/Phoenix/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/third_party/Phoenix/README.md b/third_party/Phoenix/README.md index ccd6956b..39a8ed09 100644 --- a/third_party/Phoenix/README.md +++ b/third_party/Phoenix/README.md @@ -28,6 +28,8 @@ The latest Phoenix + Mistral AI docs can be found [here](https://docs.arize.com/ ## Examples - [Tracing a Mistral AI application](./examples/arize_phoenix_tracing.ipynb) - [Evaluating a Mistral RAG pipeline](./examples/arize_phoenix_evaluate_rag.ipynb) +- [Tracing a simple Python agent workflow](./examples/simple_Python_agent_workflow.ipynb) +- [Evaluating a simple Python agent workflow](./examples/evaluate_simple_Python_agent_workflow.ipynb) ## See it in action From 1eb853444920cce7d8c0a5bee8fdebd7eb072ed0 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Mon, 25 Nov 2024 10:34:46 -0800 Subject: [PATCH 06/11] Make phoenix connection method consistent across nbs --- .../Phoenix/analytical_agent_workflow.ipynb | 15 +++++++++++++-- .../Phoenix/arize_phoenix_evaluate_rag.ipynb | 9 +++++++-- .../Phoenix/arize_phoenix_tracing.ipynb | 18 ++++++++++++++++-- .../Phoenix/simple_Python_agent_workflow.ipynb | 15 +++++++++++++-- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/third_party/Phoenix/analytical_agent_workflow.ipynb b/third_party/Phoenix/analytical_agent_workflow.ipynb index 6cce05d0..0f8581e4 100644 --- a/third_party/Phoenix/analytical_agent_workflow.ipynb +++ b/third_party/Phoenix/analytical_agent_workflow.ipynb @@ -1079,6 +1079,18 @@ "!pip install -q openinference-instrumentation-mistralai arize-phoenix" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from getpass import getpass\n", + "if not (api_key := os.getenv(\"PHOENIX_API_KEY\")):\n", + " api_key = getpass(\"🔑 Enter your Phoenix API key: \")\n", + "os.environ[\"PHOENIX_API_KEY\"] = api_key" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -1117,8 +1129,7 @@ "import os\n", "\n", "# Add Phoenix API Key for tracing\n", - "PHOENIX_API_KEY = \"48624b3c339c53f04c6:a6d9fef\"\n", - "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", "\n", "# configure the Phoenix tracer\n", diff --git a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb index bfaa1623..e524ad95 100644 --- a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb +++ b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb @@ -116,7 +116,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "During this tutorial, we will capture all the data we need to evaluate our RAG pipeline using Phoenix Tracing. To enable this, simply start the phoenix application and instrument LlamaIndex." + "During this tutorial, we will capture all the data we need to evaluate our RAG pipeline using Phoenix Tracing. Phoenix is a free-to-use open-source platform. You can get an API key from the [Phoenix website](https://phoenix.arize.com/). Alternatively, see here for details on [how to run Phoenix locally](https://docs.arize.com/phoenix/deployment/environments)." ] }, { @@ -125,7 +125,9 @@ "metadata": {}, "outputs": [], "source": [ - "session =px.launch_app()" + "if not (api_key := os.getenv(\"PHOENIX_API_KEY\")):\n", + " api_key = getpass(\"🔑 Enter your Phoenix API key: \")\n", + "os.environ[\"PHOENIX_API_KEY\"] = api_key" ] }, { @@ -141,6 +143,9 @@ "metadata": {}, "outputs": [], "source": [ + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", + "\n", "tracer_provider = register()\n", "LlamaIndexInstrumentor().instrument(skip_dep_check=True, tracer_provider=tracer_provider)" ] diff --git a/third_party/Phoenix/arize_phoenix_tracing.ipynb b/third_party/Phoenix/arize_phoenix_tracing.ipynb index 78e497f7..bdb6273e 100644 --- a/third_party/Phoenix/arize_phoenix_tracing.ipynb +++ b/third_party/Phoenix/arize_phoenix_tracing.ipynb @@ -106,7 +106,7 @@ "source": [ "## 3. Run Phoenix in the Background\n", "\n", - "Launch Phoenix as a background session to collect the trace data emitted by your instrumented Mistral client. For details on how to self-host Phoenix or connect to a remote Phoenix instance, see the [Phoenix documentation](https://docs.arize.com/phoenix/quickstart)." + "Phoenix is a free-to-use open-source platform. You can get an API key from the [Phoenix website](https://phoenix.arize.com/). Alternatively, see here for details on [how to run Phoenix locally](https://docs.arize.com/phoenix/deployment/environments)." ] }, { @@ -115,7 +115,21 @@ "metadata": {}, "outputs": [], "source": [ - "session = px.launch_app()\n", + "from getpass import getpass\n", + "if not (api_key := os.getenv(\"PHOENIX_API_KEY\")):\n", + " api_key = getpass(\"🔑 Enter your Phoenix API key: \")\n", + "os.environ[\"PHOENIX_API_KEY\"] = api_key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", + "\n", "tracer_provider = register()" ] }, diff --git a/third_party/Phoenix/simple_Python_agent_workflow.ipynb b/third_party/Phoenix/simple_Python_agent_workflow.ipynb index 4ee816fd..fbc0724e 100644 --- a/third_party/Phoenix/simple_Python_agent_workflow.ipynb +++ b/third_party/Phoenix/simple_Python_agent_workflow.ipynb @@ -416,6 +416,18 @@ "!pip install -q openinference-instrumentation-mistralai arize-phoenix" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from getpass import getpass\n", + "if not (api_key := os.getenv(\"PHOENIX_API_KEY\")):\n", + " api_key = getpass(\"🔑 Enter your Phoenix API key: \")\n", + "os.environ[\"PHOENIX_API_KEY\"] = api_key" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -454,8 +466,7 @@ "import os\n", "\n", "# Add Phoenix API Key for tracing\n", - "PHOENIX_API_KEY = \"Your Phoenix API Key Goes Here\"\n", - "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={PHOENIX_API_KEY}\"\n", + "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", "\n", "# configure the Phoenix tracer\n", From b5b8d98f24e8c57de81c43b7f61a8034bd6da7ce Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Thu, 5 Dec 2024 18:28:35 -0800 Subject: [PATCH 07/11] Bug fixes --- .../Phoenix/arize_phoenix_evaluate_rag.ipynb | 54 +++++++------------ .../Phoenix/arize_phoenix_tracing.ipynb | 27 ++++------ 2 files changed, 27 insertions(+), 54 deletions(-) diff --git a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb index e524ad95..4d5420aa 100644 --- a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb +++ b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb @@ -55,14 +55,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "!pip install -qq arize-phoenix gcsfs nest_asyncio openinference-instrumentation-llama_index\n", - "!pip install -q llama-index-embeddings-mistralai\n", - "!pip install -q llama-index-llms-mistralai\n", - "!pip install -qq \"mistralai>=1.0.0\"" + "!pip install -qq arize-phoenix==5.11.0 gcsfs==2024.10.0 nest_asyncio==1.6.0 openinference-instrumentation-llama_index==3.0.4\n", + "!pip install -q llama-index-embeddings-mistralai==0.3.0 llama-index-readers-file==0.4.0\n", + "!pip install -q llama-index-llms-mistralai==0.3.0\n", + "!pip install -qq mistralai==1.2.5" ] }, { @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -146,7 +146,7 @@ "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", "\n", - "tracer_provider = register()\n", + "tracer_provider = register(project_name='Mistral-RAG')\n", "LlamaIndexInstrumentor().instrument(skip_dep_check=True, tracer_provider=tracer_provider)" ] }, @@ -166,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -183,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -210,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -246,16 +246,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Remember that we are using Phoenix Tracing to capture all the data we need to evaluate our RAG pipeline. You can view the traces in the phoenix application." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"phoenix URL\", session.url)" + "Remember that we are using Phoenix Tracing to capture all the data we need to evaluate our RAG pipeline. You can view the traces in the [Phoenix application](https://app.phoenix.arize.com/)." ] }, { @@ -278,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -316,7 +307,7 @@ "source": [ "from phoenix.session.evaluation import get_retrieved_documents\n", "\n", - "retrieved_documents_df = get_retrieved_documents(px.Client())\n", + "retrieved_documents_df = get_retrieved_documents(px.Client(), project_name='Mistral-RAG')\n", "retrieved_documents_df" ] }, @@ -339,7 +330,7 @@ " run_evals,\n", ")\n", "\n", - "relevance_evaluator = RelevanceEvaluator(MistralAIModel)\n", + "relevance_evaluator = RelevanceEvaluator(MistralAIModel())\n", "\n", "retrieved_documents_relevance_df = run_evals(\n", " evaluators=[relevance_evaluator],\n", @@ -394,7 +385,7 @@ "source": [ "from phoenix.session.evaluation import get_qa_with_reference\n", "\n", - "qa_with_reference_df = get_qa_with_reference(px.Client())\n", + "qa_with_reference_df = get_qa_with_reference(px.Client(project_name='Mistral-RAG'))\n", "qa_with_reference_df" ] }, @@ -476,15 +467,6 @@ "We now have sent all our evaluations to Phoenix. Let's go to the Phoenix application and view the results! Since we've sent all the evals to Phoenix, we can analyze the results together to make a determination on whether or not poor retrieval or irrelevant context has an effect on the LLM's ability to generate the correct response." ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"phoenix URL\", session.url)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -520,7 +502,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/third_party/Phoenix/arize_phoenix_tracing.ipynb b/third_party/Phoenix/arize_phoenix_tracing.ipynb index bdb6273e..96a2b0a6 100644 --- a/third_party/Phoenix/arize_phoenix_tracing.ipynb +++ b/third_party/Phoenix/arize_phoenix_tracing.ipynb @@ -45,12 +45,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "!pip install -q arize-phoenix jsonschema openinference-instrumentation-mistralai\n", - "!pip install -qU mistralai " + "!pip install -q arize-phoenix==5.2.2 jsonschema==4.23.0 openinference-instrumentation-mistralai==1.0.0\n", + "!pip install -qU mistralai==1.2.5" ] }, { @@ -91,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -144,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -162,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -288,16 +288,7 @@ "source": [ "## 6. View traces in Phoenix\n", "\n", - "You should now be able to view traces in Phoenix." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f\"Current Phoenix URL: {session.url}\")" + "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com/)." ] }, { From 2fb70ab4094be8bf0895cf6503d631799fdb4b7b Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Fri, 20 Dec 2024 12:57:27 -0800 Subject: [PATCH 08/11] Update arize_phoenix_evaluate_rag.ipynb --- .../Phoenix/arize_phoenix_evaluate_rag.ipynb | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb index 4d5420aa..d4a2f72c 100644 --- a/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb +++ b/third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb @@ -59,7 +59,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install -qq arize-phoenix==5.11.0 gcsfs==2024.10.0 nest_asyncio==1.6.0 openinference-instrumentation-llama_index==3.0.4\n", + "!pip install -qq \"arize-phoenix>=7.2.0\" \"arize-phoenix-evals>=0.18.0\" gcsfs==2024.10.0 nest_asyncio==1.6.0 openinference-instrumentation-llama_index==3.0.4\n", "!pip install -q llama-index-embeddings-mistralai==0.3.0 llama-index-readers-file==0.4.0\n", "!pip install -q llama-index-llms-mistralai==0.3.0\n", "!pip install -qq mistralai==1.2.5" @@ -308,7 +308,7 @@ "from phoenix.session.evaluation import get_retrieved_documents\n", "\n", "retrieved_documents_df = get_retrieved_documents(px.Client(), project_name='Mistral-RAG')\n", - "retrieved_documents_df" + "print(retrieved_documents_df.head())" ] }, { @@ -330,7 +330,9 @@ " run_evals,\n", ")\n", "\n", - "relevance_evaluator = RelevanceEvaluator(MistralAIModel())\n", + "eval_model = MistralAIModel(api_key=os.getenv(\"MISTRAL_API_KEY\"))\n", + "\n", + "relevance_evaluator = RelevanceEvaluator(eval_model)\n", "\n", "retrieved_documents_relevance_df = run_evals(\n", " evaluators=[relevance_evaluator],\n", @@ -365,7 +367,7 @@ "documents_with_relevance_df = pd.concat(\n", " [retrieved_documents_df, retrieved_documents_relevance_df.add_prefix(\"eval_\")], axis=1\n", ")\n", - "documents_with_relevance_df" + "print(documents_with_relevance_df.head())" ] }, { @@ -385,8 +387,8 @@ "source": [ "from phoenix.session.evaluation import get_qa_with_reference\n", "\n", - "qa_with_reference_df = get_qa_with_reference(px.Client(project_name='Mistral-RAG'))\n", - "qa_with_reference_df" + "qa_with_reference_df = get_qa_with_reference(px.Client(), project_name='Mistral-RAG')\n", + "print(qa_with_reference_df.head())" ] }, { @@ -409,8 +411,8 @@ " run_evals,\n", ")\n", "\n", - "qa_evaluator = QAEvaluator(MistralAIModel())\n", - "hallucination_evaluator = HallucinationEvaluator(MistralAIModel())\n", + "qa_evaluator = QAEvaluator(eval_model)\n", + "hallucination_evaluator = HallucinationEvaluator(eval_model)\n", "\n", "qa_correctness_eval_df, hallucination_eval_df = run_evals(\n", " evaluators=[qa_evaluator, hallucination_evaluator],\n", @@ -426,7 +428,7 @@ "metadata": {}, "outputs": [], "source": [ - "qa_correctness_eval_df.head()" + "print(qa_correctness_eval_df.head())" ] }, { @@ -435,7 +437,7 @@ "metadata": {}, "outputs": [], "source": [ - "hallucination_eval_df.head()" + "print(hallucination_eval_df.head())" ] }, { @@ -502,7 +504,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.11" } }, "nbformat": 4, From a9ba8b2aaa95061ad64056dc5db6b30016236f1f Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Fri, 20 Dec 2024 20:56:38 -0700 Subject: [PATCH 09/11] Remove somewhat duplicative notebook --- .../simple_Python_agent_workflow.ipynb | 1348 ----------------- 1 file changed, 1348 deletions(-) delete mode 100644 third_party/Phoenix/simple_Python_agent_workflow.ipynb diff --git a/third_party/Phoenix/simple_Python_agent_workflow.ipynb b/third_party/Phoenix/simple_Python_agent_workflow.ipynb deleted file mode 100644 index fbc0724e..00000000 --- a/third_party/Phoenix/simple_Python_agent_workflow.ipynb +++ /dev/null @@ -1,1348 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple Python agent workflow\n", - "\n", - "![image info](../../images/agent_demo1.png)\n", - "\n", - "Here is an example of a simple Python agent workflow using a Python agent with the following steps:\n", - "\n", - "1. User Query:\n", - "\n", - "The process starts when the user submits a query or request to the Python agent.\n", - "\n", - "2. Code and Test Case Generation:\n", - "\n", - "The agent interprets the user's query and generates the corresponding Python code. Alongside the code, the agent creates a test case to verify the functionality of the generated code.\n", - "\n", - "3. Execution and Validation:\n", - "\n", - "The agent attempts to run the generated code to ensure it executes without errors.\n", - "The agent then runs the test case to confirm that the code produces the correct output.\n", - "\n", - "4. Retry Mechanism:\n", - "\n", - "If the code fails to run or the test case does not pass, the agent initiates a retry.\n", - "It regenerates the code and test case, addressing any issues identified during the previous attempt.\n", - "\n", - "5. Result Output:\n", - "\n", - "Once the code runs successfully and passes the test case, the agent delivers the result to the user.\n", - "\n", - "\n", - "## In summary:\n", - "user query\n", - "\n", - "-> agent generate code and test case\n", - "\n", - "-> check if the code is runnable and the test is passed\n", - "\n", - " -> if no, retry and regenerate\n", - "\n", - " -> if yes output result\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EuHgymvZQRfj" - }, - "source": [ - "## Install dependencies & setup keys\n", - "\n", - "First we will install the python SDK and set our API key!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JfXG-CmrQTSW", - "outputId": "4eccd614-727e-4455-a0d7-5033e6f2f2ca" - }, - "outputs": [], - "source": [ - "!pip install mistralai==1.0.0" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "id": "UTcv5cgYQWZd" - }, - "outputs": [], - "source": [ - "import os\n", - "from mistralai import Mistral\n", - "import re\n", - "\n", - "api_key = os.environ[\"MISTRAL_API_KEY\"]\n", - "\n", - "client = Mistral(api_key=api_key)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MyupUn2TMFOU" - }, - "source": [ - "## Agent\n", - "\n", - "You can create an Agent in https://console.mistral.ai/build/agents/new, for this notebook we will use mistral-large-2407 as the model powering our agents!\n", - "\n", - "Here is the instruction provided to the Python agent we create:\n", - "\n", - "```\n", - "You are a Python coding assistant that only outputs Python code without any explanations or comments.\n", - "\n", - "Return one Python function for the given query and one test case using assertion.\n", - "\n", - "Return Python code with two sections:\n", - "\n", - "## Python function\n", - "\n", - "## Test case\n", - "\n", - " \"\"\"\n", - "```\n", - "\n", - "After we create the agent, we will retrieve the Agents ID from the UI where we created the agent:\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "T2QjE0EzPN2x" - }, - "outputs": [], - "source": [ - "agent_id= \"ag:8e2706f0:20240807:python-agent:ffdc79f8\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lPj6BEEYPYxp" - }, - "source": [ - "## Simple Python agent workflow\n", - "\n", - "Now we can write several functions `run_python_agent`, `extract_code`, `check_code`, and combine them in a `run_workflow` function." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "id": "Sy087IOjours" - }, - "outputs": [], - "source": [ - "def run_python_agent(query):\n", - " \"\"\"\n", - " Sends a user query to a Python agent and returns the response.\n", - "\n", - " Args:\n", - " query (str): The user query to be sent to the Python agent.\n", - "\n", - " Returns:\n", - " str: The response content from the Python agent.\n", - " \"\"\"\n", - " print(\"### Run Python agent\")\n", - " print(f\"User query: {query}\")\n", - " try:\n", - " response = client.agents.complete(\n", - " agent_id= agent_id,\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": query\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " return result\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None\n", - "\n", - "def extract_pattern(text, pattern):\n", - " \"\"\"\n", - " Extracts a pattern from the given text.\n", - "\n", - " Args:\n", - " text (str): The text to search within.\n", - " pattern (str): The regex pattern to search for.\n", - "\n", - " Returns:\n", - " str: The extracted pattern or None if not found.\n", - " \"\"\"\n", - " match = re.search(pattern, text, flags=re.DOTALL)\n", - " if match:\n", - " return match.group(1).strip()\n", - " return None\n", - "\n", - "def extract_code(result):\n", - " \"\"\"\n", - " Extracts Python function and test case from the response content.\n", - "\n", - " Args:\n", - " result (str): The response content from the Python agent.\n", - "\n", - " Returns:\n", - " tuple: A tuple containing the extracted Python function, test function, and a retry flag.\n", - " \"\"\"\n", - " retry = False\n", - " print(\"### Extracting Python code\")\n", - " python_function = extract_pattern(result, r'## Python function(.*?)## Test case')\n", - " if not python_function:\n", - " retry = True\n", - " print(\"Python function failed to generate or wrong output format. Setting retry to True.\")\n", - "\n", - " print(\"### Extracting test case\")\n", - " test_function = extract_pattern(result, r'## Test case(.*?)```')\n", - " if not test_function:\n", - " retry = True\n", - " print(\"Test function failed to generate or wrong output format. Setting retry to True.\")\n", - "\n", - " return python_function, test_function, retry\n", - "\n", - "def check_code(python_function, test_function):\n", - " \"\"\"\n", - " Executes the Python function and its test case, and checks for any errors.\n", - "\n", - " Args:\n", - " python_function (str): The Python function to be executed.\n", - " test_function (str): The test case to be executed.\n", - "\n", - " Returns:\n", - " bool: A flag indicating whether the code execution needs to be retried.\n", - "\n", - " Warning:\n", - " This code is designed to run code that’s been generated by a model, which may not be entirely reliable.\n", - " It's strongly recommended to run this in a sandbox environment.\n", - " \"\"\"\n", - " retry = False\n", - " try:\n", - " exec(python_function)\n", - " try:\n", - " exec(test_function)\n", - " print(\"Code passed test case.\")\n", - " except Exception:\n", - " print(f\"Test failed\")\n", - " retry = True\n", - " print(\"Setting retry to True\")\n", - " except Exception:\n", - " print(f\"Code failed.\")\n", - " retry = True\n", - " print(\"Setting retry to True\")\n", - " return retry\n", - "\n", - "def run_workflow(query):\n", - " \"\"\"\n", - " Runs the complete workflow to generate, extract, and validate Python code.\n", - "\n", - " Args:\n", - " query (str): The user query to be processed.\n", - " \"\"\"\n", - " print(\"### ENTER WORKFLOW\")\n", - " i = 0\n", - " max_retries = 3\n", - " retry = True # just to get it started\n", - " while i < max_retries and retry:\n", - " print(f\"TRY # {i}\")\n", - " i += 1\n", - " result = run_python_agent(query)\n", - " python_function, test_function, retry = extract_code(result)\n", - " retry = check_code(python_function, test_function)\n", - "\n", - " if not retry:\n", - " print(f\"Validated Python function: ```{python_function}```\")\n", - " print(\"### EXIT WORKFLOW\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "LGH7jsX2mfyj", - "outputId": "e66a0d0b-fa7b-4ec9-f053-c3b08f26906e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "TRY # 0\n", - "### Run Python agent\n", - "User query: How can I remove duplicates from a list\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "Test failed\n", - "Setting retry to True\n", - "TRY # 1\n", - "### Run Python agent\n", - "User query: How can I remove duplicates from a list\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Code passed test case.\n", - "Validated Python function: ```def remove_duplicates(input_list):\n", - " return list(set(input_list))```\n", - "### EXIT WORKFLOW\n" - ] - } - ], - "source": [ - "run_workflow(\"How can I remove duplicates from a list\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "utFqsK7vtqQ5", - "outputId": "9ece3a6a-383c-449c-f2e7-95eed0e95c39" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "TRY # 0\n", - "### Run Python agent\n", - "User query: How can I sort a list of words and add the word love to each of word \n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Code passed test case.\n", - "Validated Python function: ```def sort_and_add_love(words):\n", - " words.sort()\n", - " return [word + 'love' for word in words]```\n", - "### EXIT WORKFLOW\n" - ] - } - ], - "source": [ - "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "91TJK-zAurUN", - "outputId": "8d8b1648-6a45-4bc4-bdff-0f144b48fb65" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "TRY # 0\n", - "### Run Python agent\n", - "User query: How can calculate fibinacci \n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Code passed test case.\n", - "Validated Python function: ```def fibonacci(n):\n", - " if n <= 0:\n", - " return []\n", - " elif n == 1:\n", - " return [0]\n", - " elif n == 2:\n", - " return [0, 1]\n", - " else:\n", - " fib_sequence = [0, 1]\n", - " while len(fib_sequence) < n:\n", - " fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n", - " return fib_sequence```\n", - "### EXIT WORKFLOW\n" - ] - } - ], - "source": [ - "run_workflow(\"How can calculate fibinacci \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# (Optional) Trace and Evaluate your Agent\n", - "\n", - "Now that your agent is running, you can optionally trace and evaluate it with Arize Phoenix. Phoenix is an open-source framework for tracing and evaluating LLM applications, including agents and RAG pipelines.\n", - "\n", - "Tracing refers to the process of recording the calls made between your application and the LLM. Evaluation can be thought of as the performance testing of your agent. Phoenix provides a UI for you to view traces and evaluations, as well as a suite of evaluation templates.\n", - "\n", - "To start off, create a Phoenix account and get your API key [here](https://phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Set up Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install -q openinference-instrumentation-mistralai arize-phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from getpass import getpass\n", - "if not (api_key := os.getenv(\"PHOENIX_API_KEY\")):\n", - " api_key = getpass(\"🔑 Enter your Phoenix API key: \")\n", - "os.environ[\"PHOENIX_API_KEY\"] = api_key" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Overriding of current TracerProvider is not allowed\n", - "Attempting to instrument while already instrumented\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🔭 OpenTelemetry Tracing Details 🔭\n", - "| Phoenix Project: mistral_agent_tracing\n", - "| Span Processor: SimpleSpanProcessor\n", - "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", - "| Transport: HTTP\n", - "| Transport Headers: {'api_key': '****'}\n", - "| \n", - "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", - "| \n", - "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", - "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", - "\n" - ] - } - ], - "source": [ - "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", - "from phoenix.otel import register\n", - "import os\n", - "\n", - "# Add Phoenix API Key for tracing\n", - "os.environ[\"PHOENIX_CLIENT_HEADERS\"] = f\"api_key={os.getenv('PHOENIX_API_KEY')}\"\n", - "os.environ[\"PHOENIX_COLLECTOR_ENDPOINT\"] = \"https://app.phoenix.arize.com\"\n", - "\n", - "# configure the Phoenix tracer\n", - "tracer_provider = register() \n", - "\n", - "# Phoenix provides an openinference package that automatically traces all requests to Mistral\n", - "MistralAIInstrumentor().instrument(tracer_provider=tracer_provider, skip_dep_check=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Run your agent again" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can I remove duplicates from a list\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can I sort a list of words and add the word love to each of word \")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_workflow(\"How can calculate fibinacci \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### View your traces\n", - "You should now be able to view traces in [Phoenix](https://app.phoenix.arize.com)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Evaluate your agent\n", - "\n", - "Now let's evaluate your agent. The flow for batch evaluation is as follows:\n", - "\n", - "1. Export traces from Phoenix\n", - "2. Attach labels to the traces. These can be created using an LLM as a judge, using code-based evaluation, or using a combination of both.\n", - "3. Import the labeled traces into Phoenix." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Export traces from Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import phoenix as px\n", - "\n", - "spans = px.Client().get_spans_dataframe()\n", - "\n", - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Evaluate traces\n", - "Phoenix has a [built-in LLM Judge template that can be used to evaluate Code Generation Agents](https://docs.arize.com/phoenix/evaluation/how-to-evals/running-pre-tested-evals/code-generation-eval). We'll use that template here.\n", - "\n", - "The template requires two columns to be added to the dataframe:\n", - "- output: The code generated by the agent\n", - "- input: The original user query" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Extracting Python code\n", - "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "Test function failed to generate or wrong output format. Setting retry to True.\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "### Extracting Python code\n", - "### Extracting test case\n", - "### Extracting Python code\n", - "### Extracting test case\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinput
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...85155application/json{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...85155application/json{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...77147application/json{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...82159application/json{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...162228application/json{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...
\n", - "

5 rows × 26 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", - "da0d7cde2e4cf311 MistralClient.agents LLM None \n", - "33f7a33fad606580 MistralClient.agents LLM None \n", - "d88a511a82477003 MistralClient.agents LLM None \n", - "671411e820abfd2d MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", - "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", - "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", - "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", - "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", - "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", - "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", - "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", - "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", - "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", - "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", - "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", - "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", - "\n", - " ... attributes.llm.token_count.completion \\\n", - "context.span_id ... \n", - "9dcc050d2cbe1fb3 ... 85 \n", - "da0d7cde2e4cf311 ... 85 \n", - "33f7a33fad606580 ... 77 \n", - "d88a511a82477003 ... 82 \n", - "671411e820abfd2d ... 162 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 155 application/json \n", - "da0d7cde2e4cf311 155 application/json \n", - "33f7a33fad606580 147 application/json \n", - "d88a511a82477003 159 application/json \n", - "671411e820abfd2d 228 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", - "da0d7cde2e4cf311 {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", - "33f7a33fad606580 {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", - "d88a511a82477003 {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", - "671411e820abfd2d {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", - "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", - "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", - "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", - "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", - "\n", - " code \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " query \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " output \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " input \n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - "[5 rows x 26 columns]" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spans['output'] = spans['attributes.llm.output_messages'].apply(lambda x: extract_code(x[0]['message.content']))\n", - "spans['input'] = spans['attributes.input.value']\n", - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the `CODE_READABILITY_PROMPT_TEMPLATE` to evaluate the code. The method below takes in a row of the dataframe and returns a label and explanation.\n", - "\n", - "Note that we're also asking the LLM to return an explanation for the label. This will be visible in the UI, and is extremely helpful for debugging." - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", - "\n", - "def evaluate_code(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['output'], input=row['input'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "MistralAIInstrumentor().uninstrument()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run our `evaluate_code` method on each row of the dataframe:" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "results = spans.apply(evaluate_code, axis=1)\n", - "spans['label'] = results.apply(lambda x: x[0] if x else None)\n", - "spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", - "spans['score'] = spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We should now have three more columns in our dataframe: `label`, `explanation`, and `score`." - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagescodequeryoutputinputlabelexplanationscore
context.span_id
9dcc050d2cbe1fb3MistralClient.agentsLLMNone2024-10-16 16:49:07.371632+00:002024-10-16 16:49:10.186793+00:00OK[]9dcc050d2cbe1fb3441ee3cd7233ddeb502369742fa743aa...{\"id\":\"036330244c4d490a94921cb76403738a\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the given code,...1
da0d7cde2e4cf311MistralClient.agentsLLMNone2024-10-16 16:49:10.353094+00:002024-10-16 16:49:15.158835+00:00OK[]da0d7cde2e4cf3116e5ea1185f6161d5fea4558435b796be...{\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(```python\\ndef remove_duplicates(lst):\\n r...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, we ne...1
33f7a33fad606580MistralClient.agentsLLMNone2024-10-16 16:50:29.864045+00:002024-10-16 16:50:33.187772+00:00OK[]33f7a33fad60658045afc6c918d091a852db77ab10e58710...{\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I remove duplica...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def remove_duplicates(lst):\\n return list(...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************1. **Initial Observation**: The given code sni...0
d88a511a82477003MistralClient.agentsLLMNone2024-10-16 16:50:33.351857+00:002024-10-16 16:50:36.773357+00:00OK[]d88a511a8247700304e3dc347d55f19c59b4f3e89f90ca64...{\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can I sort a list of...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def sort_and_add_love(words):\\n words.sort...{\"messages\": [{\"role\": \"user\", \"content\": \"How...readableTo evaluate the readability of the code, let's...1
671411e820abfd2dMistralClient.agentsLLMNone2024-10-16 16:50:36.884457+00:002024-10-16 16:50:41.075278+00:00OK[]671411e820abfd2d4aa91861501996e84880a7eea6a7b812...{\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20240912:python-code...[{'message.content': 'How can calculate fibina...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...(def fibonacci(n):\\n if n <= 0:\\n re...{\"messages\": [{\"role\": \"user\", \"content\": \"How...unreadable\\n\\n************### EXPLANATION:\\n\\n1. **Structure and Formatt...0
\n", - "

5 rows × 29 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 MistralClient.agents LLM None \n", - "da0d7cde2e4cf311 MistralClient.agents LLM None \n", - "33f7a33fad606580 MistralClient.agents LLM None \n", - "d88a511a82477003 MistralClient.agents LLM None \n", - "671411e820abfd2d MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:07.371632+00:00 \n", - "da0d7cde2e4cf311 2024-10-16 16:49:10.353094+00:00 \n", - "33f7a33fad606580 2024-10-16 16:50:29.864045+00:00 \n", - "d88a511a82477003 2024-10-16 16:50:33.351857+00:00 \n", - "671411e820abfd2d 2024-10-16 16:50:36.884457+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 2024-10-16 16:49:10.186793+00:00 OK \n", - "da0d7cde2e4cf311 2024-10-16 16:49:15.158835+00:00 OK \n", - "33f7a33fad606580 2024-10-16 16:50:33.187772+00:00 OK \n", - "d88a511a82477003 2024-10-16 16:50:36.773357+00:00 OK \n", - "671411e820abfd2d 2024-10-16 16:50:41.075278+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [] 9dcc050d2cbe1fb3 441ee3cd7233ddeb502369742fa743aa \n", - "da0d7cde2e4cf311 [] da0d7cde2e4cf311 6e5ea1185f6161d5fea4558435b796be \n", - "33f7a33fad606580 [] 33f7a33fad606580 45afc6c918d091a852db77ab10e58710 \n", - "d88a511a82477003 [] d88a511a82477003 04e3dc347d55f19c59b4f3e89f90ca64 \n", - "671411e820abfd2d [] 671411e820abfd2d 4aa91861501996e84880a7eea6a7b812 \n", - "\n", - " ... attributes.output.value \\\n", - "context.span_id ... \n", - "9dcc050d2cbe1fb3 ... {\"id\":\"036330244c4d490a94921cb76403738a\",\"obje... \n", - "da0d7cde2e4cf311 ... {\"id\":\"c6ba9bdb8c604fe1af0d05d5f9e9ad77\",\"obje... \n", - "33f7a33fad606580 ... {\"id\":\"0f7b9c06648941478e0163558281d716\",\"obje... \n", - "d88a511a82477003 ... {\"id\":\"167bc13355cd4a998c8aed587e76266b\",\"obje... \n", - "671411e820abfd2d ... {\"id\":\"771eceabd81e44a2a277ebe30ab6f0d7\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "da0d7cde2e4cf311 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "33f7a33fad606580 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "d88a511a82477003 {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "671411e820abfd2d {\"agent_id\": \"ag:ad73bfd7:20240912:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 [{'message.content': 'How can I remove duplica... \n", - "da0d7cde2e4cf311 [{'message.content': 'How can I remove duplica... \n", - "33f7a33fad606580 [{'message.content': 'How can I remove duplica... \n", - "d88a511a82477003 [{'message.content': 'How can I sort a list of... \n", - "671411e820abfd2d [{'message.content': 'How can calculate fibina... \n", - "\n", - " code \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " query \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " output \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "da0d7cde2e4cf311 (```python\\ndef remove_duplicates(lst):\\n r... \n", - "33f7a33fad606580 (def remove_duplicates(lst):\\n return list(... \n", - "d88a511a82477003 (def sort_and_add_love(words):\\n words.sort... \n", - "671411e820abfd2d (def fibonacci(n):\\n if n <= 0:\\n re... \n", - "\n", - " input \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "da0d7cde2e4cf311 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "33f7a33fad606580 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "d88a511a82477003 {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "671411e820abfd2d {\"messages\": [{\"role\": \"user\", \"content\": \"How... \n", - "\n", - " label \\\n", - "context.span_id \n", - "9dcc050d2cbe1fb3 readable \n", - "da0d7cde2e4cf311 readable \n", - "33f7a33fad606580 unreadable\\n\\n************ \n", - "d88a511a82477003 readable \n", - "671411e820abfd2d unreadable\\n\\n************ \n", - "\n", - " explanation score \n", - "context.span_id \n", - "9dcc050d2cbe1fb3 To evaluate the readability of the given code,... 1 \n", - "da0d7cde2e4cf311 To evaluate the readability of the code, we ne... 1 \n", - "33f7a33fad606580 1. **Initial Observation**: The given code sni... 0 \n", - "d88a511a82477003 To evaluate the readability of the code, let's... 1 \n", - "671411e820abfd2d ### EXPLANATION:\\n\\n1. **Structure and Formatt... 0 \n", - "\n", - "[5 rows x 29 columns]" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spans.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Import labeled traces into Phoenix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from phoenix.trace import SpanEvaluations\n", - "\n", - "px.Client().log_evaluations(SpanEvaluations(eval_name=\"Code Quality\", dataframe=spans))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can now view your evaluations in the Phoenix UI:\n", - "\n", - "![image info](../../third_party/Phoenix/images/phoenix-agent-eval.png)" - ] - } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "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.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From adcb13e7e81e6ace012bf7b5443fb1d19fa4acb7 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Fri, 20 Dec 2024 20:56:52 -0700 Subject: [PATCH 10/11] Update analytical_agent_workflow.ipynb --- .../Phoenix/analytical_agent_workflow.ipynb | 1908 +---------------- 1 file changed, 94 insertions(+), 1814 deletions(-) diff --git a/third_party/Phoenix/analytical_agent_workflow.ipynb b/third_party/Phoenix/analytical_agent_workflow.ipynb index 0f8581e4..c96709a9 100644 --- a/third_party/Phoenix/analytical_agent_workflow.ipynb +++ b/third_party/Phoenix/analytical_agent_workflow.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -42,38 +42,14 @@ "id": "idrU7lh3jJSG", "outputId": "34b9da8e-6ed8-4912-c6df-bfef0e6e7a9c" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: mistralai==1.0.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (1.0.0)\n", - "Requirement already satisfied: httpx<0.28.0,>=0.27.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.27.2)\n", - "Requirement already satisfied: jsonpath-python<2.0.0,>=1.0.6 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (1.0.6)\n", - "Requirement already satisfied: pydantic<2.9.0,>=2.8.2 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.8.2)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.9.0.post0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (2.9.0.post0)\n", - "Requirement already satisfied: typing-inspect<0.10.0,>=0.9.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from mistralai==1.0.0) (0.9.0)\n", - "Requirement already satisfied: anyio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (4.6.0)\n", - "Requirement already satisfied: certifi in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (2024.8.30)\n", - "Requirement already satisfied: httpcore==1.* in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.0.5)\n", - "Requirement already satisfied: idna in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (3.10)\n", - "Requirement already satisfied: sniffio in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (1.3.1)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from httpcore==1.*->httpx<0.28.0,>=0.27.0->mistralai==1.0.0) (0.14.0)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.20.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (2.20.1)\n", - "Requirement already satisfied: typing-extensions>=4.6.1 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from pydantic<2.9.0,>=2.8.2->mistralai==1.0.0) (4.12.2)\n", - "Requirement already satisfied: six>=1.5 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from python-dateutil<3.0.0,>=2.9.0.post0->mistralai==1.0.0) (1.16.0)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages (from typing-inspect<0.10.0,>=0.9.0->mistralai==1.0.0) (1.0.0)\n" - ] - } - ], + "outputs": [], "source": [ "!pip install mistralai==1.0.0" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "id": "YyLxYRmKjKQf" }, @@ -82,8 +58,11 @@ "import os\n", "from mistralai import Mistral\n", "import re\n", + "from getpass import getpass\n", "\n", - "api_key = os.environ[\"MISTRAL_API_KEY\"]\n", + "if not (api_key := os.getenv(\"MISTRAL_API_KEY\")):\n", + " api_key = getpass(\"🔑 Enter your Mistral API key: \")\n", + "os.environ[\"MISTRAL_API_KEY\"] = api_key\n", "\n", "client = Mistral(api_key=api_key)" ] @@ -133,15 +112,15 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "id": "FEl6UMM7kJOU" }, "outputs": [], "source": [ - "planning_agent_id = \"ag:8e2706f0:20240807:planning-agent:a0b3a053\"\n", - "summarization_agent_id = \"ag:8e2706f0:20240807:summarization-agent:d7482b8f\"\n", - "python_agent_id = \"ag:8e2706f0:20240807:python-agent:482c86de\"" + "planning_agent_id = \"ag:ad73bfd7:20241009:planning-agent:40a0d3e8\"\n", + "summarization_agent_id = \"ag:ad73bfd7:20241009:summarization-agent:3036db8a\"\n", + "python_agent_id = \"ag:ad73bfd7:20240912:python-codegen-agent:0375a7cf\"" ] }, { @@ -155,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": { "id": "FQ2E6s_I5WXe" }, @@ -192,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": { "id": "W3VN-YxmFF1M" }, @@ -215,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -223,35 +202,14 @@ "id": "AjUIAUMS5aSY", "outputId": "5fa82d2f-0b36-461d-a8e8-6fcb77a32d24" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Run Planning agent\n", - "User query: \n", - "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", - "\n", - "The dataset consists of 51 datapoints and has eight columns:\n", - "- State\n", - "- Number of drivers involved in fatal collisions per billion miles\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", - "- Car Insurance Premiums ($)\n", - "- Losses incurred by insurance companies for collisions per insured driver ($)\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "planning_result = run_analysis_planning_agent(query)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -259,77 +217,7 @@ "id": "4rg10DgI1nQ0", "outputId": "56b1d835-e591-4cf4-c59c-069f9e70842a" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "## Total number of steps: 3\n", - "\n", - "## Step 1:\n", - "\n", - "### Analysis Plan:\n", - "Load the dataset from the provided URL.\n", - "\n", - "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", - "data = pd.read_csv(url)\n", - "```\n", - "\n", - "## Step 2:\n", - "\n", - "### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", - "\n", - "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.head())\n", - "print(data.isnull().sum())\n", - "```\n", - "\n", - "## Step 3:\n", - "\n", - "### Analysis Plan:\n", - "Perform basic statistical analysis on the dataset.\n", - "\n", - "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "```\n" - ] - } - ], + "outputs": [], "source": [ "print(planning_result)" ] @@ -345,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "id": "cHaJLA_Yx4sN" }, @@ -520,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -528,323 +416,7 @@ "id": "xND0_v3z1wp2", "outputId": "b433658a-3a10-4230-d6fa-530451a8bead" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "STEP # 1\n", - "TRY # 0\n", - "### Analysis Plan:\n", - "Load the dataset from the provided URL.\n", - "\n", - "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", - "data = pd.read_csv(url)\n", - "```\n", - "### Run Python agent\n", - "User query: ### Analysis Plan:\n", - "Load the dataset from the provided URL.\n", - "\n", - "### Detailed Instructions:\n", - "1. Use the pandas library to read the CSV file.\n", - "2. Store the data in a DataFrame.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", - "data = pd.read_csv(url)\n", - "```\n", - "### Extracting Python code\n", - "import pandas as pd\n", - "\n", - "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", - "data = pd.read_csv(url)\n", - "### Python function to run: import pandas as pd\n", - "\n", - "url = \"https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\"\n", - "data = pd.read_csv(url)\n", - "Code executed successfully.\n", - "STEP # 2\n", - "TRY # 0\n", - "### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", - "\n", - "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.head())\n", - "print(data.isnull().sum())\n", - "```\n", - "### Run Python agent\n", - "User query: ### Analysis Plan:\n", - "Inspect the dataset to understand its structure and check for any missing values.\n", - "\n", - "### Detailed Instructions:\n", - "1. Display the first few rows of the dataset.\n", - "2. Check for missing values in each column.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.head())\n", - "print(data.isnull().sum())\n", - "```\n", - "### Extracting Python code\n", - "print(data.head())\n", - "print(data.isnull().sum())\n", - "### Python function to run: print(data.head())\n", - "print(data.isnull().sum())\n", - " State \\\n", - "0 Alabama \n", - "1 Alaska \n", - "2 Arizona \n", - "3 Arkansas \n", - "4 California \n", - "\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "0 18.8 \n", - "1 18.1 \n", - "2 18.6 \n", - "3 22.4 \n", - "4 12.0 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "0 39 \n", - "1 41 \n", - "2 35 \n", - "3 18 \n", - "4 35 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "0 30 \n", - "1 25 \n", - "2 28 \n", - "3 26 \n", - "4 28 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "0 96 \n", - "1 90 \n", - "2 84 \n", - "3 94 \n", - "4 91 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "0 80 \n", - "1 94 \n", - "2 96 \n", - "3 95 \n", - "4 89 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "0 784.55 \n", - "1 1053.48 \n", - "2 899.47 \n", - "3 827.34 \n", - "4 878.41 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "0 145.08 \n", - "1 133.93 \n", - "2 110.35 \n", - "3 142.39 \n", - "4 165.63 \n", - "State 0\n", - "Number of drivers involved in fatal collisions per billion miles 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", - "Car Insurance Premiums ($) 0\n", - "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", - "dtype: int64\n", - "Code executed successfully.\n", - "STEP # 3\n", - "TRY # 0\n", - "### Analysis Plan:\n", - "Perform basic statistical analysis on the dataset.\n", - "\n", - "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "```\n", - "### Run Python agent\n", - "User query: ### Analysis Plan:\n", - "Perform basic statistical analysis on the dataset.\n", - "\n", - "### Detailed Instructions:\n", - "1. Calculate and display summary statistics for the dataset.\n", - "2. Calculate the mean, median, and standard deviation for the numerical columns.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "```\n", - "### Extracting Python code\n", - "print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - "### Python function to run: print(data.describe())\n", - "\n", - "numerical_columns = [\n", - " 'Number of drivers involved in fatal collisions per billion miles',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted',\n", - " 'Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents',\n", - " 'Car Insurance Premiums ($)',\n", - " 'Losses incurred by insurance companies for collisions per insured driver ($)'\n", - "]\n", - "\n", - "for column in numerical_columns:\n", - " mean_value = data[column].mean()\n", - " median_value = data[column].median()\n", - " std_dev_value = data[column].std()\n", - " print(f\"{column}: Mean = {mean_value}, Median = {median_value}, Standard Deviation = {std_dev_value}\")\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "count 51.000000 \n", - "mean 15.790196 \n", - "std 4.122002 \n", - "min 5.900000 \n", - "25% 12.750000 \n", - "50% 15.600000 \n", - "75% 18.500000 \n", - "max 23.900000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "count 51.000000 \n", - "mean 31.725490 \n", - "std 9.633438 \n", - "min 13.000000 \n", - "25% 23.000000 \n", - "50% 34.000000 \n", - "75% 38.000000 \n", - "max 54.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "count 51.000000 \n", - "mean 30.686275 \n", - "std 5.132213 \n", - "min 16.000000 \n", - "25% 28.000000 \n", - "50% 30.000000 \n", - "75% 33.000000 \n", - "max 44.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "count 51.000000 \n", - "mean 85.921569 \n", - "std 15.158949 \n", - "min 10.000000 \n", - "25% 83.000000 \n", - "50% 88.000000 \n", - "75% 95.000000 \n", - "max 100.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "count 51.00000 \n", - "mean 88.72549 \n", - "std 6.96011 \n", - "min 76.00000 \n", - "25% 83.50000 \n", - "50% 88.00000 \n", - "75% 95.00000 \n", - "max 100.00000 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "count 51.000000 \n", - "mean 886.957647 \n", - "std 178.296285 \n", - "min 641.960000 \n", - "25% 768.430000 \n", - "50% 858.970000 \n", - "75% 1007.945000 \n", - "max 1301.520000 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "count 51.000000 \n", - "mean 134.493137 \n", - "std 24.835922 \n", - "min 82.750000 \n", - "25% 114.645000 \n", - "50% 136.050000 \n", - "75% 151.870000 \n", - "max 194.780000 \n", - "Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", - "Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", - "Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", - "Code executed successfully.\n", - "### Exit WORKFLOW\n" - ] - } - ], + "outputs": [], "source": [ "import sys\n", "import io\n", @@ -891,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": { "id": "v6z9ZX7Ck1l6" }, @@ -911,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -919,133 +491,7 @@ "id": "uTJ0WOu5OEYE", "outputId": "515f673d-9185-401f-cba3-ad60ee8ca75a" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "## Analysis Report\n", - "\n", - "### Dataset Description\n", - "The dataset consists of 51 data points representing different states in the U.S. and includes the following eight columns:\n", - "1. **State**: The name of the state.\n", - "2. **Number of drivers involved in fatal collisions per billion miles**: The rate of drivers involved in fatal collisions per billion miles driven.\n", - "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of drivers speeding during fatal collisions.\n", - "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of drivers who were alcohol-impaired during fatal collisions.\n", - "5. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of drivers who were not distracted during fatal collisions.\n", - "6. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of drivers who had not been involved in previous accidents.\n", - "7. **Car Insurance Premiums ($)**: The average car insurance premiums in dollars.\n", - "8. **Losses incurred by insurance companies for collisions per insured driver ($)**: The losses incurred by insurance companies for collisions per insured driver.\n", - "\n", - "### Data Inspection\n", - "- **Missing Values**: There are no missing values in the dataset.\n", - "- **First Few Rows**:\n", - " ```plaintext\n", - " State | Number of drivers involved in fatal collisions per billion miles | Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding | Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired | Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted | Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents | Car Insurance Premiums ($) | Losses incurred by insurance companies for collisions per insured driver ($)\n", - " ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------- | -------------------------------------------------------------------------------------------------\n", - " Alabama | 18.8 | 39 | 30 | 96 | 80 | 784.55 | 145.08\n", - " Alaska | 18.1 | 41 | 25 | 90 | 94 | 1053.48 | 133.93\n", - " Arizona | 18.6 | 35 | 28 | 84 | 96 | 899.47 | 110.35\n", - " Arkansas | 22.4 | 18 | 26 | 94 | 95 | 827.34 | 142.39\n", - " California | 12.0 | 35 | 28 | 91 | 89 | 878.41 | 165.63\n", - " ```\n", - "\n", - "### Basic Statistical Analysis\n", - "- **Summary Statistics**:\n", - " ```plaintext\n", - " Number of drivers involved in fatal collisions per billion miles\n", - " count 51.000000\n", - " mean 15.790196\n", - " std 4.122002\n", - " min 5.900000\n", - " 25% 12.750000\n", - " 50% 15.600000\n", - " 75% 18.500000\n", - " max 23.900000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", - " count 51.000000\n", - " mean 31.725490\n", - " std 9.633438\n", - " min 13.000000\n", - " 25% 23.000000\n", - " 50% 34.000000\n", - " 75% 38.000000\n", - " max 54.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", - " count 51.000000\n", - " mean 30.686275\n", - " std 5.132213\n", - " min 16.000000\n", - " 25% 28.000000\n", - " 50% 30.000000\n", - " 75% 33.000000\n", - " max 44.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", - " count 51.000000\n", - " mean 85.921569\n", - " std 15.158949\n", - " min 10.000000\n", - " 25% 83.000000\n", - " 50% 88.000000\n", - " 75% 95.000000\n", - " max 100.000000\n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", - " count 51.00000\n", - " mean 88.72549\n", - " std 6.96011\n", - " min 76.00000\n", - " 25% 83.50000\n", - " 50% 88.00000\n", - " 75% 95.00000\n", - " max 100.00000\n", - "\n", - " Car Insurance Premiums ($)\n", - " count 51.000000\n", - " mean 886.957647\n", - " std 178.296285\n", - " min 641.960000\n", - " 25% 768.430000\n", - " 50% 858.970000\n", - " 75% 1007.945000\n", - " max 1301.520000\n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($)\n", - " count 51.000000\n", - " mean 134.493137\n", - " std 24.835922\n", - " min 82.750000\n", - " 25% 114.645000\n", - " 50% 136.050000\n", - " 75% 151.870000\n", - " max 194.780000\n", - " ```\n", - "\n", - "- **Mean, Median, and Standard Deviation**:\n", - " ```plaintext\n", - " Number of drivers involved in fatal collisions per billion miles: Mean = 15.79019607843137, Median = 15.6, Standard Deviation = 4.122002178648661\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding: Mean = 31.725490196078432, Median = 34.0, Standard Deviation = 9.633438495931863\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired: Mean = 30.686274509803923, Median = 30.0, Standard Deviation = 5.132212762847742\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted: Mean = 85.92156862745098, Median = 88.0, Standard Deviation = 15.158948693435047\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents: Mean = 88.72549019607843, Median = 88.0, Standard Deviation = 6.960110434102462\n", - " Car Insurance Premiums ($): Mean = 886.9576470588235, Median = 858.97, Standard Deviation = 178.29628479122314\n", - " Losses incurred by insurance companies for collisions per insured driver ($): Mean = 134.49313725490197, Median = 136.05, Standard Deviation = 24.835922490634093\n", - " ```\n", - "\n", - "### Conclusion\n", - "The dataset provides insights into various factors that contribute to fatal collisions across different states. The analysis reveals the average rates of drivers involved in fatal collisions, the prevalence of speeding and alcohol-impaired driving, the extent of distracted driving, and the impact of previous accidents. Additionally, the dataset includes information on car insurance premiums and the financial losses incurred by insurance companies due to collisions.\n", - "\n", - "On average, the number of drivers involved in fatal collisions per billion miles is around 15.79, with a median of 15.6. Speeding and alcohol-impairment are significant factors in fatal collisions, with average percentages of 31.73% and 30.69%, respectively. Most drivers involved in fatal collisions were not distracted (85.92%) and had not been involved in previous accidents (88.73%).\n", - "\n", - "Car insurance premiums vary significantly across states, with an average of $886.96 and a median of $858.97. The financial losses incurred by insurance companies for collisions per insured driver average around $134.49, with a median of $136.05.\n", - "\n", - "This analysis provides a comprehensive overview of the dataset and highlights key statistics that can inform further investigations into road safety and insurance policies.\n" - ] - } - ], + "outputs": [], "source": [ "print(result)" ] @@ -1072,16 +518,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ - "!pip install -q openinference-instrumentation-mistralai arize-phoenix" + "!pip install -q openinference-instrumentation-mistralai arize-phoenix 'arize-phoenix-evals>=0.18.0'" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -1093,36 +539,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🔭 OpenTelemetry Tracing Details 🔭\n", - "| Phoenix Project: mistral_agent_2\n", - "| Span Processor: SimpleSpanProcessor\n", - "| Collector Endpoint: https://app.phoenix.arize.com/v1/traces\n", - "| Transport: HTTP\n", - "| Transport Headers: {'api_key': '****'}\n", - "| \n", - "| Using a default SpanProcessor. `add_span_processor` will overwrite this default.\n", - "| \n", - "| `register` has set this TracerProvider as the global OpenTelemetry default.\n", - "| To disable this behavior, call `register` with `set_global_tracer_provider=False`.\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "from openinference.instrumentation.mistralai import MistralAIInstrumentor\n", "from phoenix.otel import register\n", @@ -1148,306 +567,18 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Run Planning agent\n", - "User query: \n", - "Load this data: https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv\n", - "\n", - "The dataset consists of 51 datapoints and has eight columns:\n", - "- State\n", - "- Number of drivers involved in fatal collisions per billion miles\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted\n", - "- Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents\n", - "- Car Insurance Premiums ($)\n", - "- Losses incurred by insurance companies for collisions per insured driver ($)\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "planning_result = run_analysis_planning_agent(query)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### ENTER WORKFLOW\n", - "STEP # 1\n", - "TRY # 0\n", - "### Description:\n", - "Load the dataset from the provided URL into a Pandas DataFrame.\n", - "\n", - "### Instructions:\n", - "1. Use the Pandas library to read the CSV file from the URL.\n", - "2. Store the data in a DataFrame named `df`.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Load the dataset from the provided URL into a Pandas DataFrame.\n", - "\n", - "### Instructions:\n", - "1. Use the Pandas library to read the CSV file from the URL.\n", - "2. Store the data in a DataFrame named `df`.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "```\n", - "### Extracting Python code\n", - "import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "### Python function to run: import pandas as pd\n", - "\n", - "url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/bad-drivers/bad-drivers.csv'\n", - "df = pd.read_csv(url)\n", - "Code executed successfully.\n", - "STEP # 2\n", - "TRY # 0\n", - "### Description:\n", - "Inspect the data to understand its structure and check for any missing values.\n", - "\n", - "### Instructions:\n", - "1. Display the first few rows of the DataFrame.\n", - "2. Check for any missing values in the DataFrame.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", - "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Inspect the data to understand its structure and check for any missing values.\n", - "\n", - "### Instructions:\n", - "1. Display the first few rows of the DataFrame.\n", - "2. Check for any missing values in the DataFrame.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", - "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "```\n", - "### Extracting Python code\n", - "# Display the first few rows of the DataFrame\n", - "print(df.head())\n", - "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - "### Python function to run: # Display the first few rows of the DataFrame\n", - "print(df.head())\n", - "\n", - "# Check for missing values\n", - "print(df.isnull().sum())\n", - " State \\\n", - "0 Alabama \n", - "1 Alaska \n", - "2 Arizona \n", - "3 Arkansas \n", - "4 California \n", - "\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "0 18.8 \n", - "1 18.1 \n", - "2 18.6 \n", - "3 22.4 \n", - "4 12.0 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "0 39 \n", - "1 41 \n", - "2 35 \n", - "3 18 \n", - "4 35 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "0 30 \n", - "1 25 \n", - "2 28 \n", - "3 26 \n", - "4 28 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "0 96 \n", - "1 90 \n", - "2 84 \n", - "3 94 \n", - "4 91 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "0 80 \n", - "1 94 \n", - "2 96 \n", - "3 95 \n", - "4 89 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "0 784.55 \n", - "1 1053.48 \n", - "2 899.47 \n", - "3 827.34 \n", - "4 878.41 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "0 145.08 \n", - "1 133.93 \n", - "2 110.35 \n", - "3 142.39 \n", - "4 165.63 \n", - "State 0\n", - "Number of drivers involved in fatal collisions per billion miles 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted 0\n", - "Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents 0\n", - "Car Insurance Premiums ($) 0\n", - "Losses incurred by insurance companies for collisions per insured driver ($) 0\n", - "dtype: int64\n", - "Code executed successfully.\n", - "STEP # 3\n", - "TRY # 0\n", - "### Description:\n", - "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", - "\n", - "### Instructions:\n", - "1. Calculate the descriptive statistics for the numerical columns.\n", - "2. Display the statistics.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Calculate descriptive statistics\n", - "descriptive_stats = df.describe()\n", - "\n", - "# Display the statistics\n", - "print(descriptive_stats)\n", - "```\n", - "### Run Python agent\n", - "User query: ### Description:\n", - "Perform basic descriptive statistics on the numerical columns to understand the distribution of the data.\n", - "\n", - "### Instructions:\n", - "1. Calculate the descriptive statistics for the numerical columns.\n", - "2. Display the statistics.\n", - "\n", - "### Suggested Python Code:\n", - "```python\n", - "# Calculate descriptive statistics\n", - "descriptive_stats = df.describe()\n", - "\n", - "# Display the statistics\n", - "print(descriptive_stats)\n", - "```\n", - "### Extracting Python code\n", - "descriptive_stats = df.describe()\n", - "print(descriptive_stats)\n", - "### Python function to run: descriptive_stats = df.describe()\n", - "print(descriptive_stats)\n", - " Number of drivers involved in fatal collisions per billion miles \\\n", - "count 51.000000 \n", - "mean 15.790196 \n", - "std 4.122002 \n", - "min 5.900000 \n", - "25% 12.750000 \n", - "50% 15.600000 \n", - "75% 18.500000 \n", - "max 23.900000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding \\\n", - "count 51.000000 \n", - "mean 31.725490 \n", - "std 9.633438 \n", - "min 13.000000 \n", - "25% 23.000000 \n", - "50% 34.000000 \n", - "75% 38.000000 \n", - "max 54.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired \\\n", - "count 51.000000 \n", - "mean 30.686275 \n", - "std 5.132213 \n", - "min 16.000000 \n", - "25% 28.000000 \n", - "50% 30.000000 \n", - "75% 33.000000 \n", - "max 44.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted \\\n", - "count 51.000000 \n", - "mean 85.921569 \n", - "std 15.158949 \n", - "min 10.000000 \n", - "25% 83.000000 \n", - "50% 88.000000 \n", - "75% 95.000000 \n", - "max 100.000000 \n", - "\n", - " Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents \\\n", - "count 51.00000 \n", - "mean 88.72549 \n", - "std 6.96011 \n", - "min 76.00000 \n", - "25% 83.50000 \n", - "50% 88.00000 \n", - "75% 95.00000 \n", - "max 100.00000 \n", - "\n", - " Car Insurance Premiums ($) \\\n", - "count 51.000000 \n", - "mean 886.957647 \n", - "std 178.296285 \n", - "min 641.960000 \n", - "25% 768.430000 \n", - "50% 858.970000 \n", - "75% 1007.945000 \n", - "max 1301.520000 \n", - "\n", - " Losses incurred by insurance companies for collisions per insured driver ($) \n", - "count 51.000000 \n", - "mean 134.493137 \n", - "std 24.835922 \n", - "min 82.750000 \n", - "25% 114.645000 \n", - "50% 136.050000 \n", - "75% 151.870000 \n", - "max 194.780000 \n", - "Code executed successfully.\n", - "### Exit WORKFLOW\n" - ] - } - ], + "outputs": [], "source": [ "# Create an instance of the Tee class\n", "tee_stream = Tee()\n", @@ -1486,80 +617,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Analysis Report\n", - "\n", - "#### Dataset Description\n", - "The dataset contains information about driving behaviors and insurance metrics across 51 U.S. states. The dataset includes the following columns:\n", - "\n", - "- **State**: The name of the state.\n", - "- **Number of drivers involved in fatal collisions per billion miles**: The rate of fatal collisions per billion miles driven.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**: The percentage of fatal collisions involving speeding.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**: The percentage of fatal collisions involving alcohol impairment.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**: The percentage of fatal collisions not involving distractions.\n", - "- **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**: The percentage of fatal collisions involving drivers with no previous accidents.\n", - "- **Car Insurance Premiums ($)**: The average car insurance premium in the state.\n", - "- **Losses incurred by insurance companies for collisions per insured driver ($)**: The average losses incurred by insurance companies due to collisions per insured driver.\n", - "\n", - "#### Data Inspection\n", - "The dataset was loaded successfully and inspected for missing values. There are no missing values in the dataset.\n", - "\n", - "#### Descriptive Statistics\n", - "Descriptive statistics were calculated for the numerical columns to understand the distribution of the data. The key findings are as follows:\n", - "\n", - "1. **Number of drivers involved in fatal collisions per billion miles**:\n", - " - Mean: 15.79\n", - " - Standard Deviation: 4.12\n", - " - Min: 5.90\n", - " - Max: 23.90\n", - "\n", - "2. **Percentage Of Drivers Involved In Fatal Collisions Who Were Speeding**:\n", - " - Mean: 31.73%\n", - " - Standard Deviation: 9.63%\n", - " - Min: 13.00%\n", - " - Max: 54.00%\n", - "\n", - "3. **Percentage Of Drivers Involved In Fatal Collisions Who Were Alcohol-Impaired**:\n", - " - Mean: 30.69%\n", - " - Standard Deviation: 5.13%\n", - " - Min: 16.00%\n", - " - Max: 44.00%\n", - "\n", - "4. **Percentage Of Drivers Involved In Fatal Collisions Who Were Not Distracted**:\n", - " - Mean: 85.92%\n", - " - Standard Deviation: 15.16%\n", - " - Min: 10.00%\n", - " - Max: 100.00%\n", - "\n", - "5. **Percentage Of Drivers Involved In Fatal Collisions Who Had Not Been Involved In Any Previous Accidents**:\n", - " - Mean: 88.73%\n", - " - Standard Deviation: 6.96%\n", - " - Min: 76.00%\n", - " - Max: 100.00%\n", - "\n", - "6. **Car Insurance Premiums ($)**:\n", - " - Mean: $886.96\n", - " - Standard Deviation: $178.30\n", - " - Min: $641.96\n", - " - Max: $1301.52\n", - "\n", - "7. **Losses incurred by insurance companies for collisions per insured driver ($)**:\n", - " - Mean: $134.49\n", - " - Standard Deviation: $24.84\n", - " - Min: $82.75\n", - " - Max: $194.78\n", - "\n", - "#### Conclusion\n", - "The dataset provides a comprehensive view of driving behaviors and insurance metrics across different states. The descriptive statistics indicate variations in the rates of fatal collisions, the involvement of speeding and alcohol impairment in these collisions, and the impact on insurance premiums and losses. This information can be useful for policymakers, insurance companies, and safety advocates to identify areas for improvement and to implement targeted interventions.\n" - ] - } - ], + "outputs": [], "source": [ "print(result)" ] @@ -1594,352 +654,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.output_messagesattributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messages
context.span_id
e47365057e2c8bccMistralClient.agentsLLMNone2024-10-16 18:56:34.274511+00:002024-10-16 18:56:46.406556+00:00OK[]e47365057e2c8bcc22678831aa324e4b171394f156af9a03...[{'message.content': '## Total number of steps...293{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json367660application/json{\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag...[{'message.content': '\n", - "Load this data: https:/...
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...[{'message.content': '```python\n", - "import pandas ...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Load th...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...[{'message.content': '```python\n", - "# Display the ...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Inspect...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...[{'message.content': '```python\n", - "descriptive_st...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Perform...
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...[{'message.content': '### Analysis Report\n", - "\n", - "###...3104{\"messages\": [{\"role\": \"user\", \"content\": \"\\nL...application/json9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", - "Load this data: https:/...
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "e47365057e2c8bcc MistralClient.agents LLM None \n", - "81682642a644b5e5 MistralClient.agents LLM None \n", - "d8635ee34648298b MistralClient.agents LLM None \n", - "a2247b0c2142629e MistralClient.agents LLM None \n", - "2aef7e010a055107 MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "e47365057e2c8bcc 2024-10-16 18:56:34.274511+00:00 \n", - "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", - "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", - "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", - "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "e47365057e2c8bcc 2024-10-16 18:56:46.406556+00:00 OK \n", - "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", - "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", - "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", - "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "e47365057e2c8bcc [] e47365057e2c8bcc 22678831aa324e4b171394f156af9a03 \n", - "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", - "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", - "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", - "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", - "\n", - " ... attributes.llm.output_messages \\\n", - "context.span_id ... \n", - "e47365057e2c8bcc ... [{'message.content': '## Total number of steps... \n", - "81682642a644b5e5 ... [{'message.content': '```python\n", - "import pandas ... \n", - "d8635ee34648298b ... [{'message.content': '```python\n", - "# Display the ... \n", - "a2247b0c2142629e ... [{'message.content': '```python\n", - "descriptive_st... \n", - "2aef7e010a055107 ... [{'message.content': '### Analysis Report\n", - "\n", - "###... \n", - "\n", - " attributes.llm.token_count.prompt \\\n", - "context.span_id \n", - "e47365057e2c8bcc 293 \n", - "81682642a644b5e5 168 \n", - "d8635ee34648298b 142 \n", - "a2247b0c2142629e 142 \n", - "2aef7e010a055107 3104 \n", - "\n", - " attributes.input.value \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", - "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "2aef7e010a055107 {\"messages\": [{\"role\": \"user\", \"content\": \"\\nL... \n", - "\n", - " attributes.input.mime_type \\\n", - "context.span_id \n", - "e47365057e2c8bcc application/json \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "2aef7e010a055107 application/json \n", - "\n", - " attributes.llm.token_count.completion \\\n", - "context.span_id \n", - "e47365057e2c8bcc 367 \n", - "81682642a644b5e5 61 \n", - "d8635ee34648298b 40 \n", - "a2247b0c2142629e 26 \n", - "2aef7e010a055107 944 \n", - "\n", - " attributes.llm.token_count.total \\\n", - "context.span_id \n", - "e47365057e2c8bcc 660 \n", - "81682642a644b5e5 229 \n", - "d8635ee34648298b 182 \n", - "a2247b0c2142629e 168 \n", - "2aef7e010a055107 4048 \n", - "\n", - " attributes.output.mime_type \\\n", - "context.span_id \n", - "e47365057e2c8bcc application/json \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "2aef7e010a055107 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"id\":\"86817fa2de0c495cb6120fbdc4bdfe93\",\"obje... \n", - "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", - "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", - "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", - "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "e47365057e2c8bcc {\"agent_id\": \"ag:ad73bfd7:20241009:planning-ag... \n", - "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", - "\n", - " attributes.llm.input_messages \n", - "context.span_id \n", - "e47365057e2c8bcc [{'message.content': '\n", - "Load this data: https:/... \n", - "81682642a644b5e5 [{'message.content': '### Description:\n", - "Load th... \n", - "d8635ee34648298b [{'message.content': '### Description:\n", - "Inspect... \n", - "a2247b0c2142629e [{'message.content': '### Description:\n", - "Perform... \n", - "2aef7e010a055107 [{'message.content': '\n", - "Load this data: https:/... \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import phoenix as px\n", "\n", @@ -1978,324 +695,48 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "### Extracting Python code\n", - "### Extracting Python code\n", - "### Extracting Python code\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/z6/6g1hmm4x2dl0z84s6bwkgdzr0000gn/T/ipykernel_32957/2273792046.py:2: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.promptattributes.input.valueattributes.input.mime_typeattributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_code
context.span_id
81682642a644b5e5MistralClient.agentsLLMNone2024-10-16 18:57:56.825176+00:002024-10-16 18:57:58.956025+00:00OK[]81682642a644b5e54725fed7be91e18ee8e70f64eeed5b82...168{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json61229application/json{\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Load th...(import pandas as pd\\n\\nurl = 'https://raw.git...
d8635ee34648298bMistralClient.agentsLLMNone2024-10-16 18:57:59.294874+00:002024-10-16 18:58:00.961450+00:00OK[]d8635ee34648298b7e723183239af2bb7cc300c383c124e7...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json40182application/json{\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Inspect...(# Display the first few rows of the DataFrame...
a2247b0c2142629eMistralClient.agentsLLMNone2024-10-16 18:58:01.057661+00:002024-10-16 18:58:03.009694+00:00OK[]a2247b0c2142629e1d823518ded053d0244ee0e20fadf3d3...142{\"messages\": [{\"role\": \"user\", \"content\": \"###...application/json26168application/json{\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:python-code...[{'message.content': '### Description:\n", - "Perform...(descriptive_stats = df.describe()\\nprint(desc...
\n", - "

3 rows × 23 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "81682642a644b5e5 MistralClient.agents LLM None \n", - "d8635ee34648298b MistralClient.agents LLM None \n", - "a2247b0c2142629e MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "81682642a644b5e5 2024-10-16 18:57:56.825176+00:00 \n", - "d8635ee34648298b 2024-10-16 18:57:59.294874+00:00 \n", - "a2247b0c2142629e 2024-10-16 18:58:01.057661+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "81682642a644b5e5 2024-10-16 18:57:58.956025+00:00 OK \n", - "d8635ee34648298b 2024-10-16 18:58:00.961450+00:00 OK \n", - "a2247b0c2142629e 2024-10-16 18:58:03.009694+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "81682642a644b5e5 [] 81682642a644b5e5 4725fed7be91e18ee8e70f64eeed5b82 \n", - "d8635ee34648298b [] d8635ee34648298b 7e723183239af2bb7cc300c383c124e7 \n", - "a2247b0c2142629e [] a2247b0c2142629e 1d823518ded053d0244ee0e20fadf3d3 \n", - "\n", - " ... attributes.llm.token_count.prompt \\\n", - "context.span_id ... \n", - "81682642a644b5e5 ... 168 \n", - "d8635ee34648298b ... 142 \n", - "a2247b0c2142629e ... 142 \n", - "\n", - " attributes.input.value \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "d8635ee34648298b {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "a2247b0c2142629e {\"messages\": [{\"role\": \"user\", \"content\": \"###... \n", - "\n", - " attributes.input.mime_type \\\n", - "context.span_id \n", - "81682642a644b5e5 application/json \n", - "d8635ee34648298b application/json \n", - "a2247b0c2142629e application/json \n", - "\n", - " attributes.llm.token_count.completion \\\n", - "context.span_id \n", - "81682642a644b5e5 61 \n", - "d8635ee34648298b 40 \n", - "a2247b0c2142629e 26 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "81682642a644b5e5 229 application/json \n", - "d8635ee34648298b 182 application/json \n", - "a2247b0c2142629e 168 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"id\":\"d89506c5343e4f93a09f6cbe8b42facf\",\"obje... \n", - "d8635ee34648298b {\"id\":\"93c6d4434cd946718744629d31efa346\",\"obje... \n", - "a2247b0c2142629e {\"id\":\"90507fa7f96c4cc0a87f646e80b17303\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "81682642a644b5e5 {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "d8635ee34648298b {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "a2247b0c2142629e {\"agent_id\": \"ag:ad73bfd7:20241009:python-code... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "81682642a644b5e5 [{'message.content': '### Description:\n", - "Load th... \n", - "d8635ee34648298b [{'message.content': '### Description:\n", - "Inspect... \n", - "a2247b0c2142629e [{'message.content': '### Description:\n", - "Perform... \n", - "\n", - " generated_code \n", - "context.span_id \n", - "81682642a644b5e5 (import pandas as pd\\n\\nurl = 'https://raw.git... \n", - "d8635ee34648298b (# Display the first few rows of the DataFrame... \n", - "a2247b0c2142629e (descriptive_stats = df.describe()\\nprint(desc... \n", - "\n", - "[3 rows x 23 columns]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "code_gen_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(python_agent_id)]\n", - "code_gen_spans['generated_code'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n", + "code_gen_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(python_agent_id)].copy()\n", + "code_gen_spans.loc[:,'input'] = code_gen_spans['attributes.input.value']\n", + "code_gen_spans.loc[:,'output'] = code_gen_spans['attributes.llm.output_messages'].apply(lambda x: PythonAgentWorkflow().extract_code(x[0]['message.content']))\n", "code_gen_spans.head()" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "from phoenix.evals import CODE_READABILITY_PROMPT_TEMPLATE\n", + "from phoenix.evals import (CODE_READABILITY_PROMPT_TEMPLATE, \n", + " CODE_READABILITY_PROMPT_RAILS_MAP, \n", + " llm_classify, \n", + " MistralAIModel)\n", "\n", - "def evaluate_code(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": CODE_READABILITY_PROMPT_TEMPLATE.explanation_template.format(output=row['generated_code'], input=row['attributes.input.value'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we're going to use Mistral to evaluate the code, we'll uninstrument Mistral to prevent our traces view from being too cluttered." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "MistralAIInstrumentor().uninstrument()" + "import nest_asyncio\n", + "nest_asyncio.apply()\n", + "\n", + "eval_model = MistralAIModel(api_key=os.getenv(\"MISTRAL_API_KEY\"))\n", + "\n", + "code_gen_evals = llm_classify(\n", + " model=eval_model,\n", + " template=CODE_READABILITY_PROMPT_TEMPLATE,\n", + " dataframe=code_gen_spans,\n", + " concurrency=20,\n", + " provide_explanation=True,\n", + " rails=list(CODE_READABILITY_PROMPT_RAILS_MAP.values())\n", + ")\n", + "code_gen_evals['score'] = code_gen_evals['label'].apply(lambda x: 1 if x == \"readable\" else 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can run our `evaluate_code` method on each row of the dataframe:" + "This leaves us with a dataframe of evaluations. We'll add this back into Phoenix later on." ] }, { @@ -2304,10 +745,7 @@ "metadata": {}, "outputs": [], "source": [ - "results = code_gen_spans.apply(evaluate_code, axis=1)\n", - "code_gen_spans['label'] = results.apply(lambda x: x[0] if x else None)\n", - "code_gen_spans['explanation'] = results.apply(lambda x: x[1] if x else None)\n", - "code_gen_spans['score'] = code_gen_spans['label'].apply(lambda x: 1 if x == \"readable\" else 0)" + "code_gen_evals.head()" ] }, { @@ -2321,190 +759,36 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
namespan_kindparent_idstart_timeend_timestatus_codestatus_messageeventscontext.span_idcontext.trace_id...attributes.llm.token_count.completionattributes.llm.token_count.totalattributes.output.mime_typeattributes.output.valueattributes.llm.invocation_parametersattributes.llm.input_messagesgenerated_codelabelexplanationscore
context.span_id
2aef7e010a055107MistralClient.agentsLLMNone2024-10-16 18:58:21.822048+00:002024-10-16 18:58:47.476847+00:00OK[]2aef7e010a055107358f3431ae046baa14f14ccec1e2e842...9444048application/json{\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje...{\"agent_id\": \"ag:ad73bfd7:20241009:summarizati...[{'message.content': '\n", - "Load this data: https:/...(None, True)NoneNone0
\n", - "

1 rows × 26 columns

\n", - "
" - ], - "text/plain": [ - " name span_kind parent_id \\\n", - "context.span_id \n", - "2aef7e010a055107 MistralClient.agents LLM None \n", - "\n", - " start_time \\\n", - "context.span_id \n", - "2aef7e010a055107 2024-10-16 18:58:21.822048+00:00 \n", - "\n", - " end_time status_code status_message \\\n", - "context.span_id \n", - "2aef7e010a055107 2024-10-16 18:58:47.476847+00:00 OK \n", - "\n", - " events context.span_id context.trace_id \\\n", - "context.span_id \n", - "2aef7e010a055107 [] 2aef7e010a055107 358f3431ae046baa14f14ccec1e2e842 \n", - "\n", - " ... attributes.llm.token_count.completion \\\n", - "context.span_id ... \n", - "2aef7e010a055107 ... 944 \n", - "\n", - " attributes.llm.token_count.total attributes.output.mime_type \\\n", - "context.span_id \n", - "2aef7e010a055107 4048 application/json \n", - "\n", - " attributes.output.value \\\n", - "context.span_id \n", - "2aef7e010a055107 {\"id\":\"e37eaaf3445b45049518be4576a1ebff\",\"obje... \n", - "\n", - " attributes.llm.invocation_parameters \\\n", - "context.span_id \n", - "2aef7e010a055107 {\"agent_id\": \"ag:ad73bfd7:20241009:summarizati... \n", - "\n", - " attributes.llm.input_messages \\\n", - "context.span_id \n", - "2aef7e010a055107 [{'message.content': '\n", - "Load this data: https:/... \n", - "\n", - " generated_code label explanation score \n", - "context.span_id \n", - "2aef7e010a055107 (None, True) None None 0 \n", - "\n", - "[1 rows x 26 columns]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Filter the spans to only include those from our summarization agent\n", - "summarization_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(summarization_agent_id)]\n", + "summarization_spans = spans[spans['attributes.llm.invocation_parameters'].str.contains(summarization_agent_id)].copy()\n", + "summarization_spans = summarization_spans.assign(\n", + " input=summarization_spans['attributes.input.value'],\n", + " output=summarization_spans['attributes.llm.output_messages']\n", + ")\n", "summarization_spans.head()" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import phoenix.evals.default_templates as templates\n", "\n", - "def evaluate_summarization(row):\n", - " try:\n", - " response = client.chat.complete(\n", - " model=\"mistral-large-latest\",\n", - " messages = [\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": templates.SUMMARIZATION_PROMPT_TEMPLATE.explanation_template.format(output=row['attributes.output.value'], input=row['attributes.input.value'])\n", - " },\n", - " ]\n", - " )\n", - " result = response.choices[0].message.content\n", - " explanation, label = result.split(\"LABEL: \")\n", - " label = label.replace(\"\\\"\", \"\")\n", - " return label, explanation\n", - " except Exception as e:\n", - " print(f\"Request failed: {e}. Please check your request.\")\n", - " return None" + "summarization_evals = llm_classify(\n", + " model=eval_model,\n", + " template=templates.SUMMARIZATION_PROMPT_TEMPLATE,\n", + " dataframe=summarization_spans,\n", + " concurrency=20,\n", + " provide_explanation=True,\n", + " rails=list(templates.SUMMARIZATION_PROMPT_RAILS_MAP.values())\n", + ")\n", + "summarization_evals['score'] = summarization_evals['label'].apply(lambda x: 1 if x == \"good\" else 0)" ] }, { @@ -2513,9 +797,7 @@ "metadata": {}, "outputs": [], "source": [ - "summarization_spans['label'], summarization_spans['explanation'] = zip(*summarization_spans.apply(evaluate_summarization, axis=1))\n", - "summarization_spans['score'] = summarization_spans['label'].apply(lambda x: 1 if x == \"good\" else 0)\n", - "summarization_spans.head()" + "summarization_evals.head()" ] }, { @@ -2527,26 +809,15 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:34: UserWarning: The Phoenix server has an unknown version and may have compatibility issues.\n", - " warnings.warn(\n", - "/Users/jgilhuly/Documents/dev/GitHub/cookbook/.conda/lib/python3.11/site-packages/phoenix/utilities/client.py:54: UserWarning: The Phoenix server (5.2.2) and client (5.1.0) versions are mismatched and may have compatibility issues.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "from phoenix.trace import SpanEvaluations\n", "\n", "px.Client().log_evaluations(\n", - " SpanEvaluations(eval_name=\"Code Quality\", dataframe=code_gen_spans),\n", - " SpanEvaluations(eval_name=\"Summarization\", dataframe=summarization_spans)\n", + " SpanEvaluations(eval_name=\"Code Quality\", dataframe=code_gen_evals),\n", + " SpanEvaluations(eval_name=\"Summarization\", dataframe=summarization_evals)\n", ")" ] }, @@ -2558,6 +829,15 @@ "\n", "![image info](../../third_party/Phoenix/images/phoenix-agent-summarization-eval.png)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Congratulations! You've now successfully evaluated your agent.\n", + "\n", + "Check out [Phoenix](https://phoenix.arize.com) for more!\n" + ] } ], "metadata": { @@ -2578,7 +858,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.11.11" } }, "nbformat": 4, From be294cb28958b46558721ffa5c936c5bfc17b6e7 Mon Sep 17 00:00:00 2001 From: JohnGilhuly Date: Fri, 20 Dec 2024 20:56:54 -0700 Subject: [PATCH 11/11] Update README.md --- third_party/Phoenix/README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/third_party/Phoenix/README.md b/third_party/Phoenix/README.md index 39a8ed09..f1646006 100644 --- a/third_party/Phoenix/README.md +++ b/third_party/Phoenix/README.md @@ -6,7 +6,7 @@ |
GitHub | - Community + Community

@@ -26,10 +26,9 @@ Phoenix runs practically anywhere, including your Jupyter notebook, local machin The latest Phoenix + Mistral AI docs can be found [here](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai). ## Examples -- [Tracing a Mistral AI application](./examples/arize_phoenix_tracing.ipynb) -- [Evaluating a Mistral RAG pipeline](./examples/arize_phoenix_evaluate_rag.ipynb) -- [Tracing a simple Python agent workflow](./examples/simple_Python_agent_workflow.ipynb) -- [Evaluating a simple Python agent workflow](./examples/evaluate_simple_Python_agent_workflow.ipynb) +- [Tracing a Mistral AI application](third_party/Phoenix/arize_phoenix_tracing.ipynb) +- [Evaluating a Mistral RAG pipeline](third_party/Phoenix/arize_phoenix_evaluate_rag.ipynb) +- [Evaluating a Python agent workflow](third_party/Phoenix/analytical_agent_workflow.ipynb) ## See it in action @@ -37,5 +36,5 @@ The latest Phoenix + Mistral AI docs can be found [here](https://docs.arize.com/ ## Other Resources -- 🤝 [Join the Phoenix community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q) +- 🤝 [Join the Phoenix community](https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg?__hstc=259489365.a667dfafcfa0169c8aee4178d115dc81.1733501603539.1733501603539.1733501603539.1&__hssc=259489365.1.1733501603539&__hsfp=3822854628&submissionGuid=381a0676-8f38-437b-96f2-fc10875658df#/shared-invite/email) - 🐛 [Submit an issue or feature request](https://github.com/Arize-ai/phoenix/issues) \ No newline at end of file

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