From f9ec6b72475152ed147f8336bdf3cab83a390543 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 19 Dec 2024 08:51:35 -0800 Subject: [PATCH] Update agent eval tutorial (#582) Co-authored-by: Tanushree <87711021+tanushree-sharma@users.noreply.github.com> --- docs/evaluation/tutorials/agents.mdx | 2226 ++++++++++++++--- docs/evaluation/tutorials/index.mdx | 2 +- .../tutorials/static/agent_tutorial_graph.png | Bin 0 -> 37935 bytes .../tutorials/static/chinook-diagram.png | Bin 0 -> 208720 bytes docs/evaluation/tutorials/static/qa_graph.png | Bin 0 -> 8904 bytes .../tutorials/static/refund_graph.png | Bin 0 -> 13445 bytes .../tutorials/static/sql_agent_graph.png | Bin 0 -> 12720 bytes src/css/custom.css | 75 +- src/theme/CodeBlock/index.js | 172 +- 9 files changed, 2053 insertions(+), 422 deletions(-) create mode 100644 docs/evaluation/tutorials/static/agent_tutorial_graph.png create mode 100644 docs/evaluation/tutorials/static/chinook-diagram.png create mode 100644 docs/evaluation/tutorials/static/qa_graph.png create mode 100644 docs/evaluation/tutorials/static/refund_graph.png create mode 100644 docs/evaluation/tutorials/static/sql_agent_graph.png diff --git a/docs/evaluation/tutorials/agents.mdx b/docs/evaluation/tutorials/agents.mdx index c66aacdb..09e0b543 100644 --- a/docs/evaluation/tutorials/agents.mdx +++ b/docs/evaluation/tutorials/agents.mdx @@ -1,370 +1,867 @@ ---- -sidebar_position: 6 ---- - import { RegionalUrl } from "@site/src/components/RegionalUrls"; # Evaluate an agent -In this tutorial, we will walk through 3 evaluation strategies LLM agents, building on the conceptual points shared in our [evaluation guide](../concepts#agents). +:::info Key concepts +[Agent evaluation](../concepts#agents) | [Evaluators](../concepts#evaluators) | [LLM-as-judge evaluators](../concepts#llm-as-judge) +::: + +In this tutorial, we'll build a customer support bot that helps users navigate a digital music store. Then, we'll go through the three most effective types of evaluations to run on chat bots: -- `Final Response`: Evaluate the agent's final response. -- `Single step`: Evaluate any agent step in isolation (e.g., whether it selects the appropriate tool). -- `Trajectory`: Evaluate whether the agent took the expected path (e.g., of tool calls) to arrive at the final answer. +- [Final response](../concepts#evaluating-an-agents-final-response): Evaluate the agent's final response. +- [Trajectory](../concepts#evaluating-an-agents-trajectory): Evaluate whether the agent took the expected path (e.g., of tool calls) to arrive at the final answer. +- [Single step](../concepts#evaluating-a-single-step-of-an-agent): Evaluate any agent step in isolation (e.g., whether it selects the appropriate first tool for a given ). -First, we will build an agent using [LangGraph](https://github.com/langchain-ai/langgraph). +We'll build our agent using [LangGraph](https://github.com/langchain-ai/langgraph), but the techniques and LangSmith functionality shown here are framework-agnostic. -## Set up environment +## Setup -We'll set up our environment variables for OpenAI and and install +### Configure the environment + +Let's install the required dependencies: ```bash -%pip install --upgrade --quiet langchain langsmith langchain-community langchain-experimental langgraph +pip install -U langgraph langchain langchain-community langchain-openai ``` +Let's set up environment variables for OpenAI and : + ```python +#region import getpass import os -def _set_env(var: str): +def _set_env(var: str) -> None: if not os.environ.get(var): - os.environ[var] = getpass.getpass(f"{var}: ") + os.environ[var] = getpass.getpass(f"Set {var}: ") -_set_env("OPENAI_API_KEY") os.environ["LANGCHAIN_TRACING_V2"] = "true" -os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com" # Update appropriately for self-hosted installations or the EU region _set_env("LANGCHAIN_API_KEY") +_set_env("OPENAI_API_KEY") +#endregion ``` -## Configure the database +### Download the database -We will be creating a SQLite database for this tutorial. SQLite is a lightweight database that is easy to set up and use. We will be loading the `chinook` database, which is a sample database that represents a digital media store. +We will create a SQLite database for this tutorial. SQLite is a lightweight database that is easy to set up and use. +We will load the `chinook` database, which is a sample database that represents a digital media store. Find more information about the database [here](https://www.sqlitetutorial.net/sqlite-sample-database/). -For convenience, we have hosted the database (`Chinook.db`) on a public GCS bucket. +For convenience, we have hosted the database in a public GCS bucket: ```python +#region import requests + url = "https://storage.googleapis.com/benchmarks-artifacts/chinook/Chinook.db" response = requests.get(url) if response.status_code == 200: # Open a local file in binary write mode - with open("Chinook.db", "wb") as file: + with open("chinook.db", "wb") as file: # Write the content of the response (the file) to the local file file.write(response.content) print("File downloaded and saved as Chinook.db") else: print(f"Failed to download the file. Status code: {response.status_code}") +#endregion ``` -We will use a handy SQL database wrapper available in the `langchain_community` package to interact with the database. The wrapper provides a simple interface to execute SQL queries and fetch results. We will also use the `langchain_openai` package to interact with the OpenAI API for language models later in the tutorial. +Here's a sample of the data in the db: ```python -from langchain_community.utilities import SQLDatabase +#region [collapsed] +import sqlite3 + +conn = sqlite3.connect("chinook.db") +cursor = conn.cursor() -db = SQLDatabase.from_uri("sqlite:///Chinook.db") -print(db.dialect) -print(db.get_usable_table_names()) -db.run("SELECT * FROM Artist LIMIT 10;") +# Fetch all results +cursor.execute("SELECT * FROM Artist LIMIT 10;").fetchall() +#endregion ``` -## SQL Agent +```console +[(1, 'AC/DC'), (2, 'Accept'), (3, 'Aerosmith'), (4, 'Alanis Morissette'), (5, 'Alice In Chains'), (6, 'Antônio Carlos Jobim'), (7, 'Apocalyptica'), (8, 'Audioslave'), (9, 'BackBeat'), (10, 'Billy Cobham')] +``` -We'll use a [LangGraph agent](https://www.langchain.com/agents) with access to a set of tools for working with SQL: +And here's the database schema (image from https://github.com/lerocha/chinook-database): -![](./static/agent_lg_overview.png) +![Chinook DB](./static/chinook-diagram.png) -### LLM +### Define the customer support agent -```python -from langchain_openai import ChatOpenAI +We'll create a [LangGraph](https://langchain-ai.github.io/langgraph/) agent with limited access to our database. For demo purposes, our agent will support two basic types of requests: -llm=ChatOpenAI(model="gpt-4o",temperature=0) -experiment_prefix="sql-agent-gpt4o" -metadata = "Chinook, gpt-4o base-case-agent" -``` +- Lookup: The customer can look up song titles, artist names, and albums based on other identifying information. For example: "What songs do you have by Jimi Hendrix?" +- Refund: The customer can request a refund on their past purchases. For example: "My name is Claude Shannon and I'd like a refund on a purchase I made last week, could you help me?" + +For simplicity in this demo, we'll implement refunds by deleting the corresponding database records. We'll skip implementing user authentication and other production security measures. + +The agent's logic will be structured as two separate subgraphs (one for lookups and one for refunds), with a parent graph that routes requests to the appropriate subgraph. -### Tools +#### Refund agent -We'll use [SQL toolkit](https://python.langchain.com/v0.2/docs/tutorials/sql_qa/#agents) as well as some custom tools to check the query before executing it and check the query result from the database to confirm it is not empty or irrelevant to the question. +Let's build the refund processing agent. This agent needs to: +1. Find the customer's purchase records in the database +2. Delete the relevant Invoice and InvoiceLine records to process the refund + +We'll create two SQL helper functions: +1. A function to execute the refund by deleting records +2. A function to look up a customer's purchase history + +To make testing easier, we'll add a "mock" mode to these functions. When mock mode is enabled, the functions will simulate database operations without actually modifying any data. ```python -import json +import sqlite3 -from langchain_community.agent_toolkits import SQLDatabaseToolkit - -from langgraph.checkpoint.sqlite import SqliteSaver -from langgraph.graph import END, MessageGraph -from langgraph.prebuilt.tool_node import ToolNode -from langchain_core.messages import AIMessage -from langchain_core.prompts import ChatPromptTemplate -from langchain.agents import tool - -# SQL toolkit -toolkit = SQLDatabaseToolkit(db=db, llm=llm) -tools = toolkit.get_tools() - -# Query checking -query_check_system = """You are a SQL expert with a strong attention to detail. -Double check the SQLite query for common mistakes, including: -- Using NOT IN with NULL values -- Using UNION when UNION ALL should have been used -- Using BETWEEN for exclusive ranges -- Data type mismatch in predicates -- Properly quoting identifiers -- Using the correct number of arguments for functions -- Casting to the correct data type -- Using the proper columns for joins - -If there are any of the above mistakes, rewrite the query. If there are no mistakes, just reproduce the original query. - -Execute the correct query with the appropriate tool.""" -query_check_prompt = ChatPromptTemplate.from_messages([("system", query_check_system),("user", "{query}")]) -query_check = query_check_prompt | llm +#region [collapsed] +def _refund(invoice_id: int | None, invoice_line_ids: list[int] | None, mock: bool = False) -> float: + """Given an Invoice ID and/or Invoice Line IDs, delete the relevant Invoice/InvoiceLine records in the Chinook DB. -@tool -def check_query_tool(query: str) -> str: - """ - Use this tool to double check if your query is correct before executing it. + Args: + invoice_id: The Invoice to delete. + invoice_line_ids: The Invoice Lines to delete. + mock: If True, do not actually delete the specified Invoice/Invoice Lines. Used for testing purposes. + + Returns: + float: The total dollar amount that was deleted (or mock deleted). """ - return query_check.invoke({"query": query}).content -# Query result checking -query_result_check_system = """You are grading the result of a SQL query from a DB. -- Check that the result is not empty. -- If it is empty, instruct the system to re-try!""" -query_result_check_prompt = ChatPromptTemplate.from_messages([("system", query_result_check_system),("user", "{query_result}")]) -query_result_check = query_result_check_prompt | llm + if invoice_id is None and invoice_line_ids is None: + return 0.0 -@tool -def check_result(query_result: str) -> str: + # Connect to the Chinook database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + total_refund = 0.0 + + try: + # If invoice_id is provided, delete entire invoice and its lines + if invoice_id is not None: + # First get the total amount for the invoice + cursor.execute( + """ + SELECT Total + FROM Invoice + WHERE InvoiceId = ? + """, + (invoice_id,), + ) + + result = cursor.fetchone() + if result: + total_refund += result[0] + + # Delete invoice lines first (due to foreign key constraints) + if not mock: + cursor.execute( + """ + DELETE FROM InvoiceLine + WHERE InvoiceId = ? + """, + (invoice_id,), + ) + + # Then delete the invoice + cursor.execute( + """ + DELETE FROM Invoice + WHERE InvoiceId = ? + """, + (invoice_id,), + ) + + # If specific invoice lines are provided + if invoice_line_ids is not None: + # Get the total amount for the specified invoice lines + placeholders = ",".join(["?" for _ in invoice_line_ids]) + cursor.execute( + f""" + SELECT SUM(UnitPrice * Quantity) + FROM InvoiceLine + WHERE InvoiceLineId IN ({placeholders}) + """, + invoice_line_ids, + ) + + result = cursor.fetchone() + if result and result[0]: + total_refund += result[0] + + if not mock: + # Delete the specified invoice lines + cursor.execute( + f""" + DELETE FROM InvoiceLine + WHERE InvoiceLineId IN ({placeholders}) + """, + invoice_line_ids, + ) + + # Commit the changes + conn.commit() + + except sqlite3.Error as e: + # Roll back in case of error + conn.rollback() + raise e + + finally: + # Close the connection + conn.close() + + return float(total_refund) + +#endregion + +#region [collapsed] +def _lookup( + customer_first_name: str, + customer_last_name: str, + customer_phone: str, + track_name: str | None, + album_title: str | None, + artist_name: str | None, + purchase_date_iso_8601: str | None, +) -> list[dict]: + """Find all of the Invoice Line IDs in the Chinook DB for the given filters. + + Returns: + a list of dictionaries that contain keys: { + 'invoice_line_id', + 'track_name', + 'artist_name', + 'purchase_date', + 'quantity_purchased', + 'price_per_unit' + } """ - Use this tool to check the query result from the database to confirm it is not empty and is relevant. + + # Connect to the database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + # Base query joining all necessary tables + query = """ + SELECT + il.InvoiceLineId, + t.Name as track_name, + art.Name as artist_name, + i.InvoiceDate as purchase_date, + il.Quantity as quantity_purchased, + il.UnitPrice as price_per_unit + FROM InvoiceLine il + JOIN Invoice i ON il.InvoiceId = i.InvoiceId + JOIN Customer c ON i.CustomerId = c.CustomerId + JOIN Track t ON il.TrackId = t.TrackId + JOIN Album alb ON t.AlbumId = alb.AlbumId + JOIN Artist art ON alb.ArtistId = art.ArtistId + WHERE c.FirstName = ? + AND c.LastName = ? + AND c.Phone = ? """ - return query_result_check.invoke({"query_result": query_result}).content -tools.append(check_query_tool) -tools.append(check_result) + # Parameters for the query + params = [customer_first_name, customer_last_name, customer_phone] + + # Add optional filters + if track_name: + query += " AND t.Name = ?" + params.append(track_name) + + if album_title: + query += " AND alb.Title = ?" + params.append(album_title) + + if artist_name: + query += " AND art.Name = ?" + params.append(artist_name) + + if purchase_date_iso_8601: + query += " AND date(i.InvoiceDate) = date(?)" + params.append(purchase_date_iso_8601) + + # Execute query + cursor.execute(query, params) + + # Fetch results + results = cursor.fetchall() + + # Convert results to list of dictionaries + output = [] + for row in results: + output.append( + { + "invoice_line_id": row[0], + "track_name": row[1], + "artist_name": row[2], + "purchase_date": row[3], + "quantity_purchased": row[4], + "price_per_unit": row[5], + } + ) + + # Close connection + conn.close() + + return output +#endregion ``` -### State +Now let's define our graph. We'll use a simple architecture with three main paths: -```python -from typing import Annotated -from typing_extensions import TypedDict +1. Extract customer and purchase information from the conversation +2. Route the request to one of three paths: + - Refund path: If we have sufficient purchase details (Invoice ID or Invoice Line IDs) to process a refund + - Lookup path: If we have enough customer information (name and phone) to search their purchase history + - Response path: If we need more information, respond to the user requesting the specific details needed + +The graph's state will track: +- The conversation history (messages between user and agent) +- All customer and purchase information extracted from the conversation +- The next message to send to the user (followup text) + +````python +#region +from typing import Literal +import json + +from langchain.chat_models import init_chat_model +from langchain_core.runnables import RunnableConfig +from langgraph.graph import END, StateGraph from langgraph.graph.message import AnyMessage, add_messages +from langgraph.types import Command, interrupt +from tabulate import tabulate +from typing_extensions import Annotated, TypedDict +#endregion +# Graph state. +#region class State(TypedDict): + """Agent state.""" messages: Annotated[list[AnyMessage], add_messages] -``` + followup: str | None + + invoice_id: int | None + invoice_line_ids: list[int] | None + customer_first_name: str | None + customer_last_name: str | None + customer_phone: str | None + track_name: str | None + album_title: str | None + artist_name: str | None + purchase_date_iso_8601: str | None +#endregion + +# Instructions for extracting the user/purchase info from the conversation. +#region +gather_info_instructions = """You are managing an online music store that sells song tracks. \ +Customers can buy multiple tracks at a time and these purchases are recorded in a database as \ +an Invoice per purchase and an associated set of Invoice Lines for each purchased track. + +Your task is to help customers who would like a refund for one or more of the tracks they've \ +purchased. In order for you to be able refund them, the customer must specify the Invoice ID \ +to get a refund on all the tracks they bought in a single transaction, or one or more Invoice \ +Line IDs if they would like refunds on individual tracks. + +Often a user will not know the specific Invoice ID(s) or Invoice Line ID(s) for which they \ +would like a refund. In this case you can help them look up their invoices by asking them to \ +specify: +- Required: Their first name, last name, and phone number. +- Optionally: The track name, artist name, album name, or purchase date. + +If the customer has not specified the required information (either Invoice/Invoice Line IDs \ +or first name, last name, phone) then please ask them to specify it.""" +#endregion + +# Extraction schema, mirrors the graph state. +#region +class PurchaseInformation(TypedDict): + """All of the known information about the invoice / invoice lines the customer would like refunded. Do not make up values, leave fields as null if you don't know their value.""" + + invoice_id: int | None + invoice_line_ids: list[int] | None + customer_first_name: str | None + customer_last_name: str | None + customer_phone: str | None + track_name: str | None + album_title: str | None + artist_name: str | None + purchase_date_iso_8601: str | None + followup: Annotated[ + str | None, + ..., + "If the user hasn't enough identifying information, please tell them what the required information is and ask them to specify it.", + ] +#endregion + +# Model for performing extraction. +info_llm = init_chat_model("gpt-4o-mini").with_structured_output( + PurchaseInformation, method="json_schema", include_raw=True +) -### SQL Assistant +# Graph node for extracting user info and routing to lookup/refund/END. +#region +async def gather_info(state: State) -> Command[Literal["lookup", "refund", END]]: + info = await info_llm.ainvoke( + [ + {"role": "system", "content": gather_info_instructions}, + *state["messages"], + ] + ) + parsed = info["parsed"] + if any(parsed[k] for k in ("invoice_id", "invoice_line_ids")): + goto = "refund" + elif all( + parsed[k] + for k in ("customer_first_name", "customer_last_name", "customer_phone") + ): + goto = "lookup" + else: + goto = END + update = {"messages": [info["raw"]], **parsed} + return Command(update=update, goto=goto) +#endregion + +# Graph node for executing the refund. +# Note that here we inspect the runtime config for an "env" variable. +# If "env" is set to "test", then we don't actually delete any rows from our database. +# This will become important when we're running our evaluations. +#region +def refund(state: State, config: RunnableConfig) -> dict: + # Whether to mock the deletion. True if the configurable var 'env' is set to 'test'. + mock = config.get("configurable", {}).get("env", "prod") == "test" + refunded = _refund( + invoice_id=state["invoice_id"], invoice_line_ids=state["invoice_line_ids"], mock=mock + ) + response = f"You have been refunded a total of: ${refunded:.2f}. Is there anything else I can help with?" + return { + "messages": [{"role": "assistant", "content": response}], + "followup": response, + } +#endregion + +# Graph node for looking up the users purchases +#region +def lookup(state: State) -> dict: + args = ( + state[k] + for k in ( + "customer_first_name", + "customer_last_name", + "customer_phone", + "track_name", + "album_title", + "artist_name", + "purchase_date_iso_8601", + ) + ) + results = _lookup(*args) + if not results: + response = "We did not find any purchases associated with the information you've provided. Are you sure you've entered all of your information correctly?" + followup = response + else: + response = f"Which of the following purchases would you like to be refunded for?\n\n```json{json.dumps(results, indent=2)}\n```" + followup = f"Which of the following purchases would you like to be refunded for?\n\n{tabulate(results, headers='keys')}" + return { + "messages": [{"role": "assistant", "content": response}], + "followup": followup, + "invoice_line_ids": [res["invoice_line_id"] for res in results], + } +#endregion -Use [prompt based roughly on what is shown here](https://python.langchain.com/v0.2/docs/tutorials/sql_qa/#agents). +# Building our graph +graph_builder = StateGraph(State) -```python -from langchain_core.runnables import Runnable, RunnableConfig - -# Assistant -class Assistant: - - def __init__(self, runnable: Runnable): - self.runnable = runnable - - def __call__(self, state: State, config: RunnableConfig): - while True: - # Append to state - state = {**state} - # Invoke the tool-calling LLM - result = self.runnable.invoke(state) - # If it is a tool call -> response is valid - # If it has meaningful text -> response is valid - # Otherwise, we re-prompt it b/c response is not meaningful - if not result.tool_calls and ( - not result.content - or isinstance(result.content, list) - and not result.content[0].get("text") - ): - messages = state["messages"] + [("user", "Respond with a real output.")] - state = {**state, "messages": messages} - else: - break - return {"messages": result} - -# Assistant runnable -query_gen_system = """ -ROLE: -You are an agent designed to interact with a SQL database. You have access to tools for interacting with the database. -GOAL: -Given an input question, create a syntactically correct SQLite query to run, then look at the results of the query and return the answer. -INSTRUCTIONS: -- Only use the below tools for the following operations. -- Only use the information returned by the below tools to construct your final answer. -- To start you should ALWAYS look at the tables in the database to see what you can query. Do NOT skip this step. -- Then you should query the schema of the most relevant tables. -- Write your query based upon the schema of the tables. You MUST double check your query before executing it. -- Unless the user specifies a specific number of examples they wish to obtain, always limit your query to at most 5 results. -- You can order the results by a relevant column to return the most interesting examples in the database. -- Never query for all the columns from a specific table, only ask for the relevant columns given the question. -- If you get an error while executing a query, rewrite the query and try again. -- If the query returns a result, use check_result tool to check the query result. -- If the query result result is empty, think about the table schema, rewrite the query, and try again. -- DO NOT make any DML statements (INSERT, UPDATE, DELETE, DROP etc.) to the database.""" - -query_gen_prompt = ChatPromptTemplate.from_messages([("system", query_gen_system),("placeholder", "{messages}")]) -assistant_runnable = query_gen_prompt | llm.bind_tools(tools) -``` +graph_builder.add_node(gather_info) +graph_builder.add_node(refund) +graph_builder.add_node(lookup) -### Graph Utilities +graph_builder.set_entry_point("gather_info") +graph_builder.add_edge("lookup", END) +graph_builder.add_edge("refund", END) -We will define a few utility functions to help us with the agent implementation. Specifically, we will wrap a ToolNode with a fallback to handle errors and surface them to the agent. +refund_graph = graph_builder.compile() +```` -```python -from langchain_core.messages import ToolMessage -from langchain_core.runnables import RunnableLambda +We can visualize our refund graph: -def create_tool_node_with_fallback(tools: list) -> dict: - return ToolNode(tools).with_fallbacks( - [RunnableLambda(handle_tool_error)], exception_key="error" - ) +```python +# Assumes you're in an interactive Python environment +#region [collapsed] +from IPython.display import Image, display -def _print_event(event: dict, _printed: set, max_length=1500): - current_state = event.get("dialog_state") - if current_state: - print(f"Currently in: ", current_state[-1]) - message = event.get("messages") - if message: - if isinstance(message, list): - message = message[-1] - if message.id not in _printed: - msg_repr = message.pretty_repr(html=True) - if len(msg_repr) > max_length: - msg_repr = msg_repr[:max_length] + " ... (truncated)" - print(msg_repr) - _printed.add(message.id) - -def handle_tool_error(state) -> dict: - error = state.get("error") - tool_calls = state["messages"][-1].tool_calls - return { - "messages": [ - ToolMessage( - content=f"Error: {repr(error)}\n please fix your mistakes.", - tool_call_id=tc["id"], - ) - for tc in tool_calls - ] - } +display(Image(refund_graph.get_graph(xray=True).draw_mermaid_png())) +#endregion ``` -### Graph +![Refund graph](./static/refund_graph.png) -We will then define the workflow for the agent. +#### Lookup agent + +For the lookup (i.e. question-answering) agent, we'll use a simple ReACT architecture and give the agent tools for looking up track names, artist names, and album names based on various filters. For example, you can look up albums by a particular artist, artists who released songs with a specific name, etc. ```python -from langgraph.checkpoint.sqlite import SqliteSaver -from langgraph.graph import END, StateGraph -from langgraph.prebuilt import ToolNode, tools_condition - -# Graph -builder = StateGraph(State) - -# Define nodes: these do the work -builder.add_node("assistant", Assistant(assistant_runnable)) -builder.add_node("tools", create_tool_node_with_fallback(tools)) - -# Define edges: these determine how the control flow moves -builder.set_entry_point("assistant") -builder.add_conditional_edges( - "assistant", - # If the latest message (result) from assistant is a tool call -> tools_condition routes to tools - # If the latest message (result) from assistant is a not a tool call -> tools_condition routes to END - tools_condition, - # "tools" calls one of our tools. END causes the graph to terminate (and respond to the user) - {"tools": "tools", END: END}, -) -builder.add_edge("tools", "assistant") +#region +from langchain.embeddings import init_embeddings +from langchain_core.tools import tool +from langchain_core.vectorstores import InMemoryVectorStore +from langgraph.prebuilt import create_react_agent +#endregion + +#region +# Our SQL queries will only work if we filter on the exact string values that are in the DB. +# To ensure this, we'll create vectorstore indexes for all of the artists, tracks and albums +# ahead of time and use those to disambiguate the user input. E.g. if a user searches for +# songs by "prince" and our DB records the artist as "Prince", ideally when we query our +# artist vectorstore for "prince" we'll get back the value "Prince", which we can then +# use in our SQL queries. +#endregion +#region [collapsed] +def index_fields() -> tuple[InMemoryVectorStore, InMemoryVectorStore, InMemoryVectorStore]: + """Create an index for all artists, an index for all albums, and an index for all songs.""" + try: + # Connect to the chinook database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + # Fetch all results + tracks = cursor.execute("SELECT Name FROM Track").fetchall() + artists = cursor.execute("SELECT Name FROM Artist").fetchall() + albums = cursor.execute("SELECT Title FROM Album").fetchall() + finally: + # Close the connection + if conn: + conn.close() + + embeddings = init_embeddings("openai:text-embedding-3-small") + + track_store = InMemoryVectorStore(embeddings) + artist_store = InMemoryVectorStore(embeddings) + album_store = InMemoryVectorStore(embeddings) + + track_store.add_texts([t[0] for t in tracks]) + artist_store.add_texts([a[0] for a in artists]) + album_store.add_texts([a[0] for a in albums]) + return track_store, artist_store, album_store +#endregion + +track_store, artist_store, album_store = index_fields() + +# Agent tools +@tool +#region [collapsed] +def lookup_track( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[dict]: + """Lookup a track in Chinook DB based on identifying information about. + + Returns: + a list of dictionaries per matching track that contain keys {'track_name', 'artist_name', 'album_name'} + """ + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT t.Name as track_name, ar.Name as artist_name, al.Title as album_name + FROM Track t + JOIN Album al ON t.AlbumId = al.AlbumId + JOIN Artist ar ON al.ArtistId = ar.ArtistId + WHERE 1=1 + """ + params = [] + + if track_name: + track_name = track_store.similarity_search(track_name, k=1)[0].page_content + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + album_title = album_store.similarity_search(album_title, k=1)[0].page_content + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + artist_name = artist_store.similarity_search(artist_name, k=1)[0].page_content + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") + + cursor.execute(query, params) + results = cursor.fetchall() + + tracks = [ + {"track_name": row[0], "artist_name": row[1], "album_name": row[2]} + for row in results + ] + + conn.close() + return tracks +#endregion -# The checkpointer lets the graph persist its state -memory = SqliteSaver.from_conn_string(":memory:") -graph = builder.compile(checkpointer=memory) -``` +@tool +#region [collapsed] +def lookup_album( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[dict]: + """Lookup an album in Chinook DB based on identifying information about. + + Returns: + a list of dictionaries per matching album that contain keys {'album_name', 'artist_name'} + """ + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT al.Title as album_name, ar.Name as artist_name + FROM Album al + JOIN Artist ar ON al.ArtistId = ar.ArtistId + LEFT JOIN Track t ON t.AlbumId = al.AlbumId + WHERE 1=1 + """ + params = [] -### Test + if track_name: + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") -```python -questions = ["Which country's customers spent the most? And how much did they spend?", - "How many albums does the artist Led Zeppelin have?", - "What was the most purchased track of 2017?", - "Which sales agent made the most in sales in 2009?"] + cursor.execute(query, params) + results = cursor.fetchall() + + albums = [{"album_name": row[0], "artist_name": row[1]} for row in results] + + conn.close() + return albums +#endregion + +@tool +#region [collapsed] +def lookup_artist( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[str]: + """Lookup an album in Chinook DB based on identifying information about. + + Returns: + a list of matching artist names + """ + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT ar.Name as artist_name + FROM Artist ar + LEFT JOIN Album al ON al.ArtistId = ar.ArtistId + LEFT JOIN Track t ON t.AlbumId = al.AlbumId + WHERE 1=1 + """ + params = [] + + if track_name: + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") + + cursor.execute(query, params) + results = cursor.fetchall() + + artists = [row[0] for row in results] + + conn.close() + return artists +#endregion + +# Agent model +qa_llm = init_chat_model("claude-3-5-sonnet-latest") +# The prebuilt ReACT agent only expects State to have a 'messages' key, so the +# state we defined for the refund agent can also be passed to our lookup agent. +qa_graph = create_react_agent(qa_llm, [lookup_track, lookup_artist, lookup_album]) ``` ```python -## Invoke -import uuid -_printed = set() -thread_id = str(uuid.uuid4()) - -config = { - "configurable": { - # Checkpoints are accessed by thread_id - "thread_id": thread_id, - } -} +display(Image(qa_graph.get_graph(xray=True).draw_mermaid_png())) +``` -msg = {"messages": ("user", questions[0])} -messages = graph.invoke(msg,config) -messages['messages'][-1].content +![QA Graph](./static/qa_graph.png) -## Stream -_printed = set() -thread_id = str(uuid.uuid4()) +#### Parent agent -config = { - "configurable": { - # Checkpoints are accessed by thread_id - "thread_id": thread_id, - } -} +Now let's define a parent agent that combines our two task-specific agents. +The only job of the parent agent is to route to one of the sub-agents by classifying the user's current intent, and to compile the output into a followup message. -events = graph.stream( - {"messages": ("user", questions[0])}, config, stream_mode="values" +```python +# Schema for routing user intent. +# We'll use structured outputs to enforce that the model returns only +# the desired output. +#region +class UserIntent(TypedDict): + """The user's current intent in the conversation""" + + intent: Literal["refund", "question_answering"] +#endregion + +# Routing model with structured output +router_llm = init_chat_model("gpt-4o-mini").with_structured_output( + UserIntent, method="json_schema", strict=True ) -for event in events: - _print_event(event, _printed) + +# Instructions for routing. +#region +route_instructions = """You are managing an online music store that sells song tracks. \ +You can help customers in two types of ways: (1) answering general questions about \ +tracks sold at your store, (2) helping them get a refund on a purhcase they made at your store. + +Based on the following conversation, determine if the user is currently seeking general \ +information about song tracks or if they are trying to refund a specific purchase. + +Return 'refund' if they are trying to get a refund and 'question_answering' if they are \ +asking a general music question. Do NOT return anything else. Do NOT try to respond to \ +the user. +""" +#endregion + +# Node for routing. +#region +async def intent_classifier( + state: State, +) -> Command[Literal["refund_agent", "question_answering_agent"]]: + response = router_llm.invoke( + [{"role": "system", "content": route_instructions}, *state["messages"]] + ) + return Command(goto=response["intent"] + "_agent") +#endregion + +# Node for making sure the 'followup' key is set before our agent run completes. +#region +def compile_followup(state: State) -> dict: + """Set the followup to be the last message if it hasn't explicitly been set.""" + if not state.get("followup"): + return {"followup": state["messages"][-1].content} + return {} +#endregion + +# Agent definition +graph_builder = StateGraph(State) +graph_builder.add_node(intent_classifier) +# Since all of our subagents have compatible state, +# we can add them as nodes directly. +graph_builder.add_node("refund_agent", refund_graph) +graph_builder.add_node("question_answering_agent", qa_graph) +graph_builder.add_node(compile_followup) + +graph_builder.set_entry_point("intent_classifier") +graph_builder.add_edge("refund_agent", "compile_followup") +graph_builder.add_edge("question_answering_agent", "compile_followup") +graph_builder.add_edge("compile_followup", END) + +graph = graph_builder.compile() ``` -## Eval +We can visualize our compiled parent graph including all of its subgraphs: -Agent evaluation can focus on at least 3 things: +```python +display(Image(graph.get_graph().draw_mermaid_png())) +``` + +![graph](./static/agent_tutorial_graph.png) + +#### Try it out -- `Response`: The inputs are a prompt and an optional list of tools. The output is the final agent response. -- `Single step`: As before, the inputs are a prompt and an optional list of tools. The output the tool call. -- `Trajectory`: As before, the inputs are a prompt and an optional list of tools. The output is the list of tool calls +Let's give our custom support agent a whirl! -![](./static/agent_eval.png) +```python +#region +state = await graph.ainvoke( + {"messages": [{"role": "user", "content": "what james brown songs do you have"}]} +) +print(state["followup"]) +#endregion +``` -:::tip +```console +#region [collapsed] +I found 20 James Brown songs in the database, all from the album "Sex Machine". Here they are: + +1. Please Please Please +2. Think +3. Night Train +4. Out Of Sight +5. Papa's Got A Brand New Bag Pt.1 +6. I Got You (I Feel Good) +7. It's A Man's Man's Man's World +8. Cold Sweat +9. Say It Loud, I'm Black And I'm Proud Pt.1 +10. Get Up (I Feel Like Being A) Sex Machine +11. Hey America +12. Make It Funky Pt.1 +13. I'm A Greedy Man Pt.1 +14. Get On The Good Foot +15. Get Up Offa That Thing +16. It's Too Funky In Here +17. Living In America +18. I'm Real +19. Hot Pants Pt.1 +20. Soul Power (Live) + +This includes many of his most famous hits like "I Got You (I Feel Good)", "It's A Man's Man's Man's World", and "Living In America". All these tracks are collected on the album "Sex Machine". +#endregion +``` -See our [evaluation guide](../concepts#agents) for more details on Agent evaluation. +```python +#region +state = await graph.ainvoke({"messages": [ + { + "role": "user", + "content": "my name is Aaron Mitchell and my number is +1 (204) 452-6452. I bought some songs by Led Zeppelin that i'd like refunded", + } +]}) +print(state["followup"]) +#endregion +``` -::: +```console +#region [collapsed] +Which of the following purchases would you like to be refunded for? -### Response evaluation + invoice_line_id track_name artist_name purchase_date quantity_purchased price_per_unit +----------------- -------------------------------- ------------- ------------------- -------------------- ---------------- + 267 How Many More Times Led Zeppelin 2009-08-06 00:00:00 1 0.99 + 268 What Is And What Should Never Be Led Zeppelin 2009-08-06 00:00:00 1 0.99 +#endregion +``` -We can evaluate how well an agent does overall on a task. This basically involves treating the agent as a black box and just evaluating whether it gets the job done or not. +## Evaluations -:::tip +Now that we've got a testable version of our agent, let's run some evaluations. +Agent evaluation can focus on at least 3 things: -See the full overview of agent response evaluation in our [conceptual guide](../concepts#evaluating-an-agents-final-response). +- [Final response](../concepts#evaluating-an-agents-final-response): The inputs are a prompt and an optional list of tools. The output is the final agent response. +- [Trajectory](../concepts#evaluating-an-agents-trajectory): As before, the inputs are a prompt and an optional list of tools. The output is the list of tool calls +- [Single step](../concepts#evaluating-a-single-step-of-an-agent): As before, the inputs are a prompt and an optional list of tools. The output is the tool call. -::: +Let's run each type of evaluation: -`Dataset` +### Final response evaluator -First, create a dataset that evaluates end-to-end performance of the agent. We can take some questions related to the Chinook database from [here](https://github.com/brianchiang-tw/SQL_for_DataScience/blob/master/Module3_Practice_Quiz). +First, let's create a [dataset](../concepts#datasets) that evaluates end-to-end performance of the agent. +For simplicity we'll use the same dataset for final response and trajectory evaluation, so we'll add both ground-truth responses and trajectories for each example question. +We'll cover the trajectories in the next section. ```python from langsmith import Client @@ -372,231 +869,1130 @@ from langsmith import Client client = Client() # Create a dataset +#region examples = [ - ("Which country's customers spent the most? And how much did they spend?", "The country whose customers spent the most is the USA, with a total expenditure of $523.06"), - ("What was the most purchased track of 2013?", "The most purchased track of 2013 was Hot Girl."), - ("How many albums does the artist Led Zeppelin have?","Led Zeppelin has 14 albums"), - ("What is the total price for the album “Big Ones”?","The total price for the album 'Big Ones' is 14.85"), - ("Which sales agent made the most in sales in 2009?", "Steve Johnson made the most sales in 2009"), + { + "question": "How many songs do you have by James Brown", + "response": "We have 20 songs by James Brown", + "trajectory": ["question_answering_agent", "lookup_track"] + }, + { + "question": "My name is Aaron Mitchell and I'd like a refund.", + "response": "I need some more information to help you with the refund. Please specify your phone number, the invoice ID, or the line item IDs for the purchase you'd like refunded.", + "trajectory": ["refund_agent"], + }, + { + "question": "My name is Aaron Mitchell and I'd like a refund on my Led Zeppelin purchases. My number is +1 (204) 452-6452", + "response": 'Which of the following purchases would you like to be refunded for?\n\n invoice_line_id track_name artist_name purchase_date quantity_purchased price_per_unit\n----------------- -------------------------------- ------------- ------------------- -------------------- ----------------\n 267 How Many More Times Led Zeppelin 2009-08-06 00:00:00 1 0.99\n 268 What Is And What Should Never Be Led Zeppelin 2009-08-06 00:00:00 1 0.99', + "trajectory": ["refund_agent", "lookup"], + }, + { + "question": "Who recorded Wish You Were Here again? What other albums of there's do you have?", + "response": "Wish You Were Here is an album by Pink Floyd", + "trajectory": ["question_answering_agent", "lookup_album"], + }, + { + "question": "I want a full refund for invoice 237", + "response": "You have been refunded $0.99.", + "trajectory": ["refund_agent", "refund"], + }, ] +#endregion -dataset_name = "SQL Agent Response" +dataset_name = "Chinook Customer Service Bot: E2E" + +#region if not client.has_dataset(dataset_name=dataset_name): dataset = client.create_dataset(dataset_name=dataset_name) - inputs, outputs = zip( - *[({"input": text}, {"output": label}) for text, label in examples] + client.create_examples( + inputs=[{"question": ex["question"]} for ex in examples], + outputs=[{"response": ex["response"], "trajectory": ex["trajectory"]} for ex in examples], + dataset_id=dataset.id ) - client.create_examples(inputs=inputs, outputs=outputs, dataset_id=dataset.id) +#endregion ``` -`Run chain` +We'll create a custom [LLM-as-judge](../concepts#llm-as-judge) evaluator that uses another model to compare our agent's output on each example to the reference response, and judge if they're equivalent or not: ```python -def predict_sql_agent_answer(example: dict): - """Use this for answer evaluation""" - msg = {"messages": ("user", example["input"])} - messages = graph.invoke(msg, config) - return {"response": messages['messages'][-1].content} +# LLM-as-judge instructions +#region +grader_instructions = """You are a teacher grading a quiz. + +You will be given a QUESTION, the GROUND TRUTH (correct) RESPONSE, and the STUDENT RESPONSE. + +Here is the grade criteria to follow: +(1) Grade the student responses based ONLY on their factual accuracy relative to the ground truth answer. +(2) Ensure that the student response does not contain any conflicting statements. +(3) It is OK if the student response contains more information than the ground truth response, as long as it is factually accurate relative to the ground truth response. + +Correctness: +True means that the student's response meets all of the criteria. +False means that the student's response does not meet all of the criteria. + +Explain your reasoning in a step-by-step manner to ensure your reasoning and conclusion are correct.""" +#endregion + +# LLM-as-judge output schema +#region +class Grade(TypedDict): + """Compare the expected and actual answers and grade the actual answer.""" + reasoning: Annotated[str, ..., "Explain your reasoning for whether the actual response is correct or not."] + is_correct: Annotated[bool, ..., "True if the student response is mostly or exactly correct, otherwise False."] +#endregion + +# Judge LLM +grader_llm = init_chat_model("gpt-4o-mini", temperature=0).with_structured_output(Grade, method="json_schema", strict=True) + +# Evaluator function +#region +async def final_answer_correct(inputs: dict, outputs: dict, reference_outputs: dict) -> bool: + """Evaluate if the final response is equivalent to reference response.""" + + # Note that we assume the outputs has a 'response' dictionary. We'll need to make sure + # that the target function we define includes this key. + user = f"""QUESTION: {inputs['question']} + GROUND TRUTH RESPONSE: {reference_outputs['response']} + STUDENT RESPONSE: {outputs['response']}""" + + grade = await grader_llm.ainvoke([{"role": "system", "content": grader_instructions}, {"role": "user", "content": user}]) + return grade["is_correct"] +#endregion ``` -`Evaluator` +Now we can run our evaluation. Our evaluator assumes that our target function returns a 'response' key, so lets define a target function that does so. -This can [follow what we do for RAG](./rag) where we compare the generated answer with the reference answer. +Also remember that in our refund graph we made the refund node configurable, so that if we specified `config={"env": "test"}`, we would mock out the refunds without actually updating the DB. +We'll use this configurable variable in our target `run_graph` method when invoking our graph: ```python -from langchain import hub -from langchain_openai import ChatOpenAI +# Target function +#region +async def run_graph(inputs: dict) -> dict: + """Run graph and track the trajectory it takes along with the final response.""" + result = await graph.ainvoke({"messages": [ + { "role": "user", "content": inputs['question']}, + ]}, config={"env": "test"}) + return {"response": result["followup"]} +#endregion + +# Evaluation job and results +experiment_results = await client.aevaluate( + run_graph, + data=dataset_name, + evaluators=[final_answer_correct], + experiment_prefix="sql-agent-gpt4o-e2e", + num_repetitions=1, + max_concurrency=4, +) +experiment_results.to_pandas() +``` -# Grade prompt -grade_prompt_answer_accuracy = prompt = hub.pull("langchain-ai/rag-answer-vs-reference") +You can see what these results look like here: [LangSmith link](https://smith.langchain.com/public/708d08f4-300e-4c75-9677-c6b71b0d28c9/d). -def answer_evaluator(run, example) -> dict: - """ - A simple evaluator for RAG answer accuracy - """ +### Trajectory evaluator - # Get question, ground truth answer, RAG chain answer - input_question = example.inputs["input"] - reference = example.outputs["output"] - prediction = run.outputs["response"] +As agents become more complex, they have more potential points of failure. Rather than using simple pass/fail evaluations, it's often better to use evaluations that can give partial credit when an agent takes some correct steps, even if it doesn't reach the right final answer. - # LLM grader - llm = ChatOpenAI(model="gpt-4-turbo", temperature=0) +This is where trajectory evaluations come in. A trajectory evaluation: +1. Compares the actual sequence of steps the agent took against an expected sequence +2. Calculates a score based on how many of the expected steps were completed correctly - # Structured prompt - answer_grader = grade_prompt_answer_accuracy | llm +For this example, our end-to-end dataset contains an ordered list of steps that we expect the agent to take. Let's create an evaluator that checks the agent's actual trajectory against these expected steps and calculates what percentage were completed: - # Run evaluator - score = answer_grader.invoke({"question": input_question, - "correct_answer": reference, - "student_answer": prediction}) - score = score["Score"] +```python +#region +def trajectory_subsequence(outputs: dict, reference_outputs: dict) -> float: + """Check how many of the desired steps the agent took.""" + if len(reference_outputs['trajectory']) > len(outputs['trajectory']): + return False + + i = j = 0 + while i < len(reference_outputs['trajectory']) and j < len(outputs['trajectory']): + if reference_outputs['trajectory'][i] == outputs['trajectory'][j]: + i += 1 + j += 1 + + return i / len(reference_outputs['trajectory']) +#endregion +``` + +Now we can run our evaluation. Our evaluator assumes that our target function returns a 'trajectory' key, so lets define a target function that does so. We'll need to usage [LangGraph's streaming capabilities](https://langchain-ai.github.io/langgraph/concepts/streaming/) to record the trajectory. - return {"key": "answer_v_reference_score", "score": score} +Note that we are reusing the same dataset as for our final response evaluation, so we could have run both evaluators together and defined a target function that returns both "response" and "trajectory". +In practice it's often useful to have separate datasets for each type of evaluation, which is why we show them separately here: + +```python +#region +async def run_graph(inputs: dict) -> dict: + """Run graph and track the trajectory it takes along with the final response.""" + trajectory = [] + # Set subgraph=True to stream events from subgraphs of the main graph: https://langchain-ai.github.io/langgraph/how-tos/streaming-subgraphs/ + # Set stream_mode="debug" to stream all possible events: https://langchain-ai.github.io/langgraph/concepts/streaming + async for namespace, chunk in graph.astream({"messages": [ + { + "role": "user", + "content": inputs['question'], + } + ]}, subgraphs=True, stream_mode="debug"): + # Event type for entering a node + if chunk['type'] == 'task': + # Record the node name + trajectory.append(chunk['payload']['name']) + # Given how we defined our dataset, we also need to track when specific tools are + # called by our question answering ReACT agent. These tool calls can be found + # when the ToolsNode (named "tools") is invoked by looking at the AIMessage.tool_calls + # of the latest input message. + if chunk['payload']['name'] == 'tools' and chunk['type'] == 'task': + for tc in chunk['payload']['input']['messages'][-1].tool_calls: + trajectory.append(tc['name']) + + return {"trajectory": trajectory} +#endregion + +experiment_results = await client.aevaluate( + run_graph, + data=dataset_name, + evaluators=[trajectory_subsequence], + experiment_prefix="sql-agent-gpt4o-trajectory", + num_repetitions=1, + max_concurrency=4, +) +experiment_results.to_pandas() ``` -`Create evaluation` +You can see what these results look like here: [LangSmith link](https://smith.langchain.com/public/708d08f4-300e-4c75-9677-c6b71b0d28c9/d). + +### Single step evaluators + +While end-to-end tests give you the most signal about your agents performance, for the sake of debugging and iterating on your agent it can be helpful to pinpoint specific steps that are difficult and evaluate them directly. + +In our case, a crucial part of our agent is that it routes the user's intention correctly into either the "refund" path or the "question answering" path. Let's create a dataset and run some evaluations to directly stress test this one component. ```python -from langsmith import evaluate +# Create dataset +#region +examples = [ + {"messages": [{"role": "user", "content": "i bought some tracks recently and i dont like them"}], "route": "refund_agent"}, + {"messages": [{"role": "user", "content": "I was thinking of purchasing some Rolling Stones tunes, any recommendations?"}], "route": "question_answering_agent"}, + {"messages": [{"role": "user", "content": "i want a refund on purchase 237"}, {"role": "assistant", "content": "I've refunded you a total of $1.98. How else can I help you today?"}, {"role": "user", "content": "did prince release any albums in 2000?"}], "route": "question_answering_agent"}, + {"messages": [{"role": "user", "content": "i purchased a cover of Yesterday recently but can't remember who it was by, which versions of it do you have?"}], "route": "question_answering_agent"}, +] +#endregion -experiment_results = evaluate( - predict_sql_agent_answer, +dataset_name = "Chinook Customer Service Bot: Intent Classifier" +#region +if not client.has_dataset(dataset_name=dataset_name): + dataset = client.create_dataset(dataset_name=dataset_name) + client.create_examples( + inputs = [{"messages": ex["messages"]} for ex in examples], + outputs = [{"route": ex["route"]} for ex in examples], + dataset_id=dataset.id + ) +#endregion + +# Evaluator +def correct(outputs: dict, reference_outputs: dict) -> bool: + """Check if the agent chose the correct route.""" + return outputs["route"] == reference_outputs["route"] + +# Target function for running the relevant step +async def run_intent_classifier(inputs: dict) -> dict: + # Note that we can access and run the intent_classifier node of our graph directly. + command = await graph.nodes['intent_classifier'].ainvoke(inputs) + return {"route": command.goto} + +# Run evaluation +experiment_results = await client.aevaluate( + run_intent_classifier, data=dataset_name, - evaluators=[answer_evaluator], - experiment_prefix=experiment_prefix + "-response-v-reference", - num_repetitions=3, - metadata={"version": metadata}, + evaluators=[correct], + experiment_prefix="sql-agent-gpt4o-intent-classifier", + max_concurrency=4, ) ``` -### Single step evaluation +You can see what these results look like here: [LangSmith link](https://smith.langchain.com/public/f133dae2-8a88-43a0-9bfd-ab45bfa3920b/d). -Agents generally make multiple actions. While it is useful to evaluate them end-to-end, it can also be useful to evaluate the individual actions. This generally involves evaluating a single step of the agent - the LLM call where it decides what to do. +## Reference code -:::tip +Here's a consolidated script with all the above code: -See the full overview of single step evaluation in our [conceptual guide](../concepts#evaluating-a-single-step-of-an-agent). +````python +#region [collapsed] +import json +import sqlite3 +from typing import Literal + +from langchain.chat_models import init_chat_model +from langchain.embeddings import init_embeddings +from langchain_core.runnables import RunnableConfig +from langchain_core.tools import tool +from langchain_core.vectorstores import InMemoryVectorStore +from langgraph.graph import END, StateGraph +from langgraph.graph.message import AnyMessage, add_messages +from langgraph.prebuilt import create_react_agent +from langgraph.types import Command, interrupt +from langsmith import Client +import requests +from tabulate import tabulate +from typing_extensions import Annotated, TypedDict -::: +url = "https://storage.googleapis.com/benchmarks-artifacts/chinook/Chinook.db" -We can check a specific tool call using [a custom evaluator](../how_to_guides/custom_evaluator): +response = requests.get(url) -- Here, we just invoke the assistant, `assistant_runnable`, with a prompt and check if the resulting tool call is as expected. -- Here, we are using a specialized agent where the tools are hard-coded (rather than passed with the dataset input). -- We specify the `reference` tool call for the step that we are evaluating, `expected_tool_call`. +if response.status_code == 200: + # Open a local file in binary write mode + with open("chinook.db", "wb") as file: + # Write the content of the response (the file) to the local file + file.write(response.content) + print("File downloaded and saved as Chinook.db") +else: + print(f"Failed to download the file. Status code: {response.status_code}") -```python -from langsmith.schemas import Example, Run -def predict_assistant(example: dict): - """Invoke assistant for single tool call evaluation""" - msg = [ ("user", example["input"]) ] - result = assistant_runnable.invoke({"messages":msg}) - return {"response": result} +def _refund( + invoice_id: int | None, invoice_line_ids: list[int] | None, mock: bool = False +) -> float: + """Given an Invoice ID and/or Invoice Line IDs, delete the relevant Invoice/InvoiceLine records in the Chinook DB. + Args: + invoice_id: The Invoice to delete. + invoice_line_ids: The Invoice Lines to delete. + mock: If True, do not actually delete the specified Invoice/Invoice Lines. Used for testing purposes. -def check_specific_tool_call(root_run: Run, example: Example) -> dict: - """ - Check if the first tool call in the response matches the expected tool call. + Returns: + float: The total dollar amount that was deleted (or mock deleted). """ - # Expected tool call - expected_tool_call = 'sql_db_list_tables' - # Run - response = root_run.outputs["response"] + if invoice_id is None and invoice_line_ids is None: + return 0.0 + + # Connect to the Chinook database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + total_refund = 0.0 - # Get tool call try: - tool_call = getattr(response, 'tool_calls', [])[0]['name'] - except (IndexError, KeyError): - tool_call = None + # If invoice_id is provided, delete entire invoice and its lines + if invoice_id is not None: + # First get the total amount for the invoice + cursor.execute( + """ + SELECT Total + FROM Invoice + WHERE InvoiceId = ? + """, + (invoice_id,), + ) - score = 1 if tool_call == expected_tool_call else 0 - return {"score": score, "key": "single_tool_call"} + result = cursor.fetchone() + if result: + total_refund += result[0] + + # Delete invoice lines first (due to foreign key constraints) + if not mock: + cursor.execute( + """ + DELETE FROM InvoiceLine + WHERE InvoiceId = ? + """, + (invoice_id,), + ) + + # Then delete the invoice + cursor.execute( + """ + DELETE FROM Invoice + WHERE InvoiceId = ? + """, + (invoice_id,), + ) + + # If specific invoice lines are provided + if invoice_line_ids is not None: + # Get the total amount for the specified invoice lines + placeholders = ",".join(["?" for _ in invoice_line_ids]) + cursor.execute( + f""" + SELECT SUM(UnitPrice * Quantity) + FROM InvoiceLine + WHERE InvoiceLineId IN ({placeholders}) + """, + invoice_line_ids, + ) -experiment_results = evaluate( - predict_assistant, - data=dataset_name, - evaluators=[check_specific_tool_call], - experiment_prefix=experiment_prefix + "-single-tool", - num_repetitions=3, - metadata={"version": metadata}, + result = cursor.fetchone() + if result and result[0]: + total_refund += result[0] + + if not mock: + # Delete the specified invoice lines + cursor.execute( + f""" + DELETE FROM InvoiceLine + WHERE InvoiceLineId IN ({placeholders}) + """, + invoice_line_ids, + ) + + # Commit the changes + conn.commit() + + except sqlite3.Error as e: + # Roll back in case of error + conn.rollback() + raise e + + finally: + # Close the connection + conn.close() + + return float(total_refund) + + +def _lookup( + customer_first_name: str, + customer_last_name: str, + customer_phone: str, + track_name: str | None, + album_title: str | None, + artist_name: str | None, + purchase_date_iso_8601: str | None, +) -> list[dict]: + """Find all of the Invoice Line IDs in the Chinook DB for the given filters. + + Returns: + a list of dictionaries that contain keys: { + 'invoice_line_id', + 'track_name', + 'artist_name', + 'purchase_date', + 'quantity_purchased', + 'price_per_unit' + } + """ + + # Connect to the database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + # Base query joining all necessary tables + query = """ + SELECT + il.InvoiceLineId, + t.Name as track_name, + art.Name as artist_name, + i.InvoiceDate as purchase_date, + il.Quantity as quantity_purchased, + il.UnitPrice as price_per_unit + FROM InvoiceLine il + JOIN Invoice i ON il.InvoiceId = i.InvoiceId + JOIN Customer c ON i.CustomerId = c.CustomerId + JOIN Track t ON il.TrackId = t.TrackId + JOIN Album alb ON t.AlbumId = alb.AlbumId + JOIN Artist art ON alb.ArtistId = art.ArtistId + WHERE c.FirstName = ? + AND c.LastName = ? + AND c.Phone = ? + """ + + # Parameters for the query + params = [customer_first_name, customer_last_name, customer_phone] + + # Add optional filters + if track_name: + query += " AND t.Name = ?" + params.append(track_name) + + if album_title: + query += " AND alb.Title = ?" + params.append(album_title) + + if artist_name: + query += " AND art.Name = ?" + params.append(artist_name) + + if purchase_date_iso_8601: + query += " AND date(i.InvoiceDate) = date(?)" + params.append(purchase_date_iso_8601) + + # Execute query + cursor.execute(query, params) + + # Fetch results + results = cursor.fetchall() + + # Convert results to list of dictionaries + output = [] + for row in results: + output.append( + { + "invoice_line_id": row[0], + "track_name": row[1], + "artist_name": row[2], + "purchase_date": row[3], + "quantity_purchased": row[4], + "price_per_unit": row[5], + } + ) + + # Close connection + conn.close() + + return output + + +# Graph state. +class State(TypedDict): + """Agent state.""" + + messages: Annotated[list[AnyMessage], add_messages] + followup: str | None + + invoice_id: int | None + invoice_line_ids: list[int] | None + customer_first_name: str | None + customer_last_name: str | None + customer_phone: str | None + track_name: str | None + album_title: str | None + artist_name: str | None + purchase_date_iso_8601: str | None + + +# Instructions for extracting the user/purchase info from the conversation. +gather_info_instructions = """You are managing an online music store that sells song tracks. \ +Customers can buy multiple tracks at a time and these purchases are recorded in a database as \ +an Invoice per purchase and an associated set of Invoice Lines for each purchased track. + +Your task is to help customers who would like a refund for one or more of the tracks they've \ +purchased. In order for you to be able refund them, the customer must specify the Invoice ID \ +to get a refund on all the tracks they bought in a single transaction, or one or more Invoice \ +Line IDs if they would like refunds on individual tracks. + +Often a user will not know the specific Invoice ID(s) or Invoice Line ID(s) for which they \ +would like a refund. In this case you can help them look up their invoices by asking them to \ +specify: +- Required: Their first name, last name, and phone number. +- Optionally: The track name, artist name, album name, or purchase date. + +If the customer has not specified the required information (either Invoice/Invoice Line IDs \ +or first name, last name, phone) then please ask them to specify it.""" + + +# Extraction schema, mirrors the graph state. +class PurchaseInformation(TypedDict): + """All of the known information about the invoice / invoice lines the customer would like refunded. Do not make up values, leave fields as null if you don't know their value.""" + + invoice_id: int | None + invoice_line_ids: list[int] | None + customer_first_name: str | None + customer_last_name: str | None + customer_phone: str | None + track_name: str | None + album_title: str | None + artist_name: str | None + purchase_date_iso_8601: str | None + followup: Annotated[ + str | None, + ..., + "If the user hasn't enough identifying information, please tell them what the required information is and ask them to specify it.", + ] + + +# Model for performing extraction. +info_llm = init_chat_model("gpt-4o-mini").with_structured_output( + PurchaseInformation, method="json_schema", include_raw=True ) -``` -### Trajectory -We can check a trajectory of tool calls using [custom evaluators](../how_to_guides/custom_evaluator): +# Graph node for extracting user info and routing to lookup/refund/END. +async def gather_info(state: State) -> Command[Literal["lookup", "refund", END]]: + info = await info_llm.ainvoke( + [ + {"role": "system", "content": gather_info_instructions}, + *state["messages"], + ] + ) + parsed = info["parsed"] + if any(parsed[k] for k in ("invoice_id", "invoice_line_ids")): + goto = "refund" + elif all( + parsed[k] + for k in ("customer_first_name", "customer_last_name", "customer_phone") + ): + goto = "lookup" + else: + goto = END + update = {"messages": [info["raw"]], **parsed} + return Command(update=update, goto=goto) + + +# Graph node for executing the refund. +# Note that here we inspect the runtime config for an "env" variable. +# If "env" is set to "test", then we don't actually delete any rows from our database. +# This will become important when we're running our evaluations. +def refund(state: State, config: RunnableConfig) -> dict: + # Whether to mock the deletion. True if the configurable var 'env' is set to 'test'. + mock = config.get("configurable", {}).get("env", "prod") == "test" + refunded = _refund( + invoice_id=state["invoice_id"], + invoice_line_ids=state["invoice_line_ids"], + mock=mock, + ) + response = f"You have been refunded a total of: ${refunded:.2f}. Is there anything else I can help with?" + return { + "messages": [{"role": "assistant", "content": response}], + "followup": response, + } -- Here, we just invoke the agent, `graph.invoke`, with a prompt. -- Here, we are using a specialized agent where the tools are hard-coded (rather than passed with the dataset input). -- We extract the list of tools called, using `find_tool_calls`. -- Custom functions can process these tool calls in various user-defined ways. -- We can check if all expected tools are called in any order: `contains_all_tool_calls_any_order` -- We can check if all expected tools are called in order, allowing for insertion of tool calls: `contains_all_tool_calls_in_order` -- We can check if all expected tools are called in the exact order: `contains_all_tool_calls_in_order_exact_match` -:::tip +# Graph node for looking up the users purchases +def lookup(state: State) -> dict: + args = ( + state[k] + for k in ( + "customer_first_name", + "customer_last_name", + "customer_phone", + "track_name", + "album_title", + "artist_name", + "purchase_date_iso_8601", + ) + ) + results = _lookup(*args) + if not results: + response = "We did not find any purchases associated with the information you've provided. Are you sure you've entered all of your information correctly?" + followup = response + else: + response = f"Which of the following purchases would you like to be refunded for?\n\n```json{json.dumps(results, indent=2)}\n```" + followup = f"Which of the following purchases would you like to be refunded for?\n\n{tabulate(results, headers='keys')}" + return { + "messages": [{"role": "assistant", "content": response}], + "followup": followup, + "invoice_line_ids": [res["invoice_line_id"] for res in results], + } -See the full overview of single step evaluation in our [conceptual guide](../concepts#evaluating-an-agents-trajectory). -::: +# Building our graph +graph_builder = StateGraph(State) -```python -def predict_sql_agent_messages(example: dict): - """Use this for answer evaluation""" - msg = {"messages": ("user", example["input"])} - messages = graph.invoke(msg, config) - return {"response": messages} +graph_builder.add_node(gather_info) +graph_builder.add_node(refund) +graph_builder.add_node(lookup) -def find_tool_calls(messages): - """ - Find all tool calls in the messages returned - """ - tool_calls = [tc['name'] for m in messages['messages'] for tc in getattr(m, 'tool_calls', [])] - return tool_calls +graph_builder.set_entry_point("gather_info") +graph_builder.add_edge("lookup", END) +graph_builder.add_edge("refund", END) + +refund_graph = graph_builder.compile() + + +# Our SQL queries will only work if we filter on the exact string values that are in the DB. +# To ensure this, we'll create vectorstore indexes for all of the artists, tracks and albums +# ahead of time and use those to disambiguate the user input. E.g. if a user searches for +# songs by "prince" and our DB records the artist as "Prince", ideally when we query our +# artist vectorstore for "prince" we'll get back the value "Prince", which we can then +# use in our SQL queries. +def index_fields() -> ( + tuple[InMemoryVectorStore, InMemoryVectorStore, InMemoryVectorStore] +): + """Create an index for all artists, an index for all albums, and an index for all songs.""" + try: + # Connect to the chinook database + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + # Fetch all results + tracks = cursor.execute("SELECT Name FROM Track").fetchall() + artists = cursor.execute("SELECT Name FROM Artist").fetchall() + albums = cursor.execute("SELECT Title FROM Album").fetchall() + finally: + # Close the connection + if conn: + conn.close() + + embeddings = init_embeddings("openai:text-embedding-3-small") + + track_store = InMemoryVectorStore(embeddings) + artist_store = InMemoryVectorStore(embeddings) + album_store = InMemoryVectorStore(embeddings) + + track_store.add_texts([t[0] for t in tracks]) + artist_store.add_texts([a[0] for a in artists]) + album_store.add_texts([a[0] for a in albums]) + return track_store, artist_store, album_store -def contains_all_tool_calls_any_order(root_run: Run, example: Example) -> dict: + +track_store, artist_store, album_store = index_fields() + + +# Agent tools +@tool +def lookup_track( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[dict]: + """Lookup a track in Chinook DB based on identifying information about. + + Returns: + a list of dictionaries per matching track that contain keys {'track_name', 'artist_name', 'album_name'} """ - Check if all expected tools are called in any order. + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT t.Name as track_name, ar.Name as artist_name, al.Title as album_name + FROM Track t + JOIN Album al ON t.AlbumId = al.AlbumId + JOIN Artist ar ON al.ArtistId = ar.ArtistId + WHERE 1=1 """ - expected = ['sql_db_list_tables', 'sql_db_schema', 'sql_db_query_checker', 'sql_db_query', 'check_result'] - messages = root_run.outputs["response"] - tool_calls = find_tool_calls(messages) - # Optionally, log the tool calls - - #print("Here are my tool calls:") - #print(tool_calls) - if set(expected) <= set(tool_calls): - score = 1 - else: - score = 0 - return {"score": int(score), "key": "multi_tool_call_any_order"} + params = [] + + if track_name: + track_name = track_store.similarity_search(track_name, k=1)[0].page_content + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + album_title = album_store.similarity_search(album_title, k=1)[0].page_content + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + artist_name = artist_store.similarity_search(artist_name, k=1)[0].page_content + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") + + cursor.execute(query, params) + results = cursor.fetchall() + + tracks = [ + {"track_name": row[0], "artist_name": row[1], "album_name": row[2]} + for row in results + ] -def contains_all_tool_calls_in_order(root_run: Run, example: Example) -> dict: + conn.close() + return tracks + + +@tool +def lookup_album( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[dict]: + """Lookup an album in Chinook DB based on identifying information about. + + Returns: + a list of dictionaries per matching album that contain keys {'album_name', 'artist_name'} """ - Check if all expected tools are called in exact order. + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT al.Title as album_name, ar.Name as artist_name + FROM Album al + JOIN Artist ar ON al.ArtistId = ar.ArtistId + LEFT JOIN Track t ON t.AlbumId = al.AlbumId + WHERE 1=1 """ - messages = root_run.outputs["response"] - tool_calls = find_tool_calls(messages) - # Optionally, log the tool calls - - #print("Here are my tool calls:") - #print(tool_calls) - it = iter(tool_calls) - expected = ['sql_db_list_tables', 'sql_db_schema', 'sql_db_query_checker', 'sql_db_query', 'check_result'] - if all(elem in it for elem in expected): - score = 1 - else: - score = 0 - return {"score": int(score), "key": "multi_tool_call_in_order"} + params = [] + + if track_name: + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") + + cursor.execute(query, params) + results = cursor.fetchall() + + albums = [{"album_name": row[0], "artist_name": row[1]} for row in results] + + conn.close() + return albums + -def contains_all_tool_calls_in_order_exact_match(root_run: Run, example: Example) -> dict: +@tool +def lookup_artist( + track_name: str | None = None, + album_title: str | None = None, + artist_name: str | None = None, +) -> list[str]: + """Lookup an album in Chinook DB based on identifying information about. + + Returns: + a list of matching artist names """ - Check if all expected tools are called in exact order and without any additional tool calls. + conn = sqlite3.connect("chinook.db") + cursor = conn.cursor() + + query = """ + SELECT DISTINCT ar.Name as artist_name + FROM Artist ar + LEFT JOIN Album al ON al.ArtistId = ar.ArtistId + LEFT JOIN Track t ON t.AlbumId = al.AlbumId + WHERE 1=1 """ - expected = ['sql_db_list_tables', 'sql_db_schema', 'sql_db_query_checker', 'sql_db_query', 'check_result'] - messages = root_run.outputs["response"] - tool_calls = find_tool_calls(messages) - # Optionally, log the tool calls - - #print("Here are my tool calls:") - #print(tool_calls) - if tool_calls == expected: - score = 1 - else: - score = 0 + params = [] + + if track_name: + query += " AND t.Name LIKE ?" + params.append(f"%{track_name}%") + if album_title: + query += " AND al.Title LIKE ?" + params.append(f"%{album_title}%") + if artist_name: + query += " AND ar.Name LIKE ?" + params.append(f"%{artist_name}%") + + cursor.execute(query, params) + results = cursor.fetchall() + + artists = [row[0] for row in results] + + conn.close() + return artists + + +# Agent model +qa_llm = init_chat_model("claude-3-5-sonnet-latest") +# The prebuilt ReACT agent only expects State to have a 'messages' key, so the +# state we defined for the refund agent can also be passed to our lookup agent. +qa_graph = create_react_agent(qa_llm, [lookup_track, lookup_artist, lookup_album]) - return {"score": int(score), "key": "multi_tool_call_in_exact_order"} -experiment_results = evaluate( - predict_sql_agent_messages, +# Schema for routing user intent. +# We'll use structured outputs to enforce that the model returns only +# the desired output. +class UserIntent(TypedDict): + """The user's current intent in the conversation""" + + intent: Literal["refund", "question_answering"] + + +# Routing model with structured output +router_llm = init_chat_model("gpt-4o-mini").with_structured_output( + UserIntent, method="json_schema", strict=True +) + +# Instructions for routing. +route_instructions = """You are managing an online music store that sells song tracks. \ +You can help customers in two types of ways: (1) answering general questions about \ +tracks sold at your store, (2) helping them get a refund on a purhcase they made at your store. + +Based on the following conversation, determine if the user is currently seeking general \ +information about song tracks or if they are trying to refund a specific purchase. + +Return 'refund' if they are trying to get a refund and 'question_answering' if they are \ +asking a general music question. Do NOT return anything else. Do NOT try to respond to \ +the user. +""" + + +# Node for routing. +async def intent_classifier( + state: State, +) -> Command[Literal["refund_agent", "question_answering_agent"]]: + response = router_llm.invoke( + [{"role": "system", "content": route_instructions}, *state["messages"]] + ) + return Command(goto=response["intent"] + "_agent") + + +# Node for making sure the 'followup' key is set before our agent run completes. +def compile_followup(state: State) -> dict: + """Set the followup to be the last message if it hasn't explicitly been set.""" + if not state.get("followup"): + return {"followup": state["messages"][-1].content} + return {} + + +# Agent definition +graph_builder = StateGraph(State) +graph_builder.add_node(intent_classifier) +# Since all of our subagents have compatible state, +# we can add them as nodes directly. +graph_builder.add_node("refund_agent", refund_graph) +graph_builder.add_node("question_answering_agent", qa_graph) +graph_builder.add_node(compile_followup) + +graph_builder.set_entry_point("intent_classifier") +graph_builder.add_edge("refund_agent", "compile_followup") +graph_builder.add_edge("question_answering_agent", "compile_followup") +graph_builder.add_edge("compile_followup", END) + +graph = graph_builder.compile() + + +client = Client() + +# Create a dataset +examples = [ + { + "question": "How many songs do you have by James Brown", + "response": "We have 20 songs by James Brown", + "trajectory": ["question_answering_agent", "lookup_tracks"], + }, + { + "question": "My name is Aaron Mitchell and I'd like a refund.", + "response": "I need some more information to help you with the refund. Please specify your phone number, the invoice ID, or the line item IDs for the purchase you'd like refunded.", + "trajectory": ["refund_agent"], + }, + { + "question": "My name is Aaron Mitchell and I'd like a refund on my Led Zeppelin purchases. My number is +1 (204) 452-6452", + "response": "Which of the following purchases would you like to be refunded for?\n\n invoice_line_id track_name artist_name purchase_date quantity_purchased price_per_unit\n----------------- -------------------------------- ------------- ------------------- -------------------- ----------------\n 267 How Many More Times Led Zeppelin 2009-08-06 00:00:00 1 0.99\n 268 What Is And What Should Never Be Led Zeppelin 2009-08-06 00:00:00 1 0.99", + "trajectory": ["refund_agent", "lookup"], + }, + { + "question": "Who recorded Wish You Were Here again? What other albums of there's do you have?", + "response": "Wish You Were Here is an album by Pink Floyd", + "trajectory": ["question_answering_agent", "lookup_album"], + }, + { + "question": "I want a full refund for invoice 237", + "response": "You have been refunded $2.97.", + "trajectory": ["refund_agent", "refund"], + }, +] + +dataset_name = "Chinook Customer Service Bot: E2E" + +if not client.has_dataset(dataset_name=dataset_name): + dataset = client.create_dataset(dataset_name=dataset_name) + client.create_examples( + inputs=[{"question": ex["question"]} for ex in examples], + outputs=[ + {"response": ex["response"], "trajectory": ex["trajectory"]} + for ex in examples + ], + dataset_id=dataset.id, + ) + +# LLM-as-judge instructions +grader_instructions = """You are a teacher grading a quiz. + +You will be given a QUESTION, the GROUND TRUTH (correct) RESPONSE, and the STUDENT RESPONSE. + +Here is the grade criteria to follow: +(1) Grade the student responses based ONLY on their factual accuracy relative to the ground truth answer. +(2) Ensure that the student response does not contain any conflicting statements. +(3) It is OK if the student response contains more information than the ground truth response, as long as it is factually accurate relative to the ground truth response. + +Correctness: +True means that the student's response meets all of the criteria. +False means that the student's response does not meet all of the criteria. + +Explain your reasoning in a step-by-step manner to ensure your reasoning and conclusion are correct.""" + + +# LLM-as-judge output schema +class Grade(TypedDict): + """Compare the expected and actual answers and grade the actual answer.""" + + reasoning: Annotated[ + str, + ..., + "Explain your reasoning for whether the actual response is correct or not.", + ] + is_correct: Annotated[ + bool, + ..., + "True if the student response is mostly or exactly correct, otherwise False.", + ] + + +# Judge LLM +grader_llm = init_chat_model("gpt-4o-mini", temperature=0).with_structured_output( + Grade, method="json_schema", strict=True +) + + +# Evaluator function +async def final_answer_correct( + inputs: dict, outputs: dict, reference_outputs: dict +) -> bool: + """Evaluate if the final response is equivalent to reference response.""" + + # Note that we assume the outputs has a 'response' dictionary. We'll need to make sure + # that the target function we define includes this key. + user = f"""QUESTION: {inputs['question']} + GROUND TRUTH RESPONSE: {reference_outputs['response']} + STUDENT RESPONSE: {outputs['response']}""" + + grade = await grader_llm.ainvoke( + [ + {"role": "system", "content": grader_instructions}, + {"role": "user", "content": user}, + ] + ) + return grade["is_correct"] + + +# Target function +async def run_graph(inputs: dict) -> dict: + """Run graph and track the trajectory it takes along with the final response.""" + result = await graph.ainvoke( + { + "messages": [ + {"role": "user", "content": inputs["question"]}, + ] + }, + config={"env": "test"}, + ) + return {"response": result["followup"]} + + +# Evaluation job and results +experiment_results = await client.aevaluate( + run_graph, data=dataset_name, - evaluators=[contains_all_tool_calls_any_order,contains_all_tool_calls_in_order,contains_all_tool_calls_in_order_exact_match], - experiment_prefix=experiment_prefix + "-trajectory", - num_repetitions=3, - metadata={"version": metadata}, + evaluators=[final_answer_correct], + experiment_prefix="sql-agent-gpt4o-e2e", + num_repetitions=1, + max_concurrency=4, ) -``` +experiment_results.to_pandas() + + +def trajectory_subsequence(outputs: dict, reference_outputs: dict) -> float: + """Check how many of the desired steps the agent took.""" + if len(reference_outputs["trajectory"]) > len(outputs["trajectory"]): + return False + + i = j = 0 + while i < len(reference_outputs["trajectory"]) and j < len(outputs["trajectory"]): + if reference_outputs["trajectory"][i] == outputs["trajectory"][j]: + i += 1 + j += 1 + + return i / len(reference_outputs["trajectory"]) + + +async def run_graph(inputs: dict) -> dict: + """Run graph and track the trajectory it takes along with the final response.""" + trajectory = [] + # Set subgraph=True to stream events from subgraphs of the main graph: https://langchain-ai.github.io/langgraph/how-tos/streaming-subgraphs/ + # Set stream_mode="debug" to stream all possible events: https://langchain-ai.github.io/langgraph/concepts/streaming + async for namespace, chunk in graph.astream( + { + "messages": [ + { + "role": "user", + "content": inputs["question"], + } + ] + }, + subgraphs=True, + stream_mode="debug", + ): + # Event type for entering a node + if chunk["type"] == "task": + # Record the node name + trajectory.append(chunk["payload"]["name"]) + # Given how we defined our dataset, we also need to track when specific tools are + # called by our question answering ReACT agent. These tool calls can be found + # when the ToolsNode (named "tools") is invoked by looking at the AIMessage.tool_calls + # of the latest input message. + if chunk["payload"]["name"] == "tools" and chunk["type"] == "task": + for tc in chunk["payload"]["input"]["messages"][-1].tool_calls: + trajectory.append(tc["name"]) + + return {"trajectory": trajectory} + + +experiment_results = await client.aevaluate( + run_graph, + data=dataset_name, + evaluators=[trajectory_subsequence], + experiment_prefix="sql-agent-gpt4o-trajectory", + num_repetitions=1, + max_concurrency=4, +) +experiment_results.to_pandas() -You can see the results from the evaluations logged to the dataset! +# Create dataset +examples = [ + { + "messages": [ + { + "role": "user", + "content": "i bought some tracks recently and i dont like them", + } + ], + "route": "refund_agent", + }, + { + "messages": [ + { + "role": "user", + "content": "I was thinking of purchasing some Rolling Stones tunes, any recommendations?", + } + ], + "route": "question_answering_agent", + }, + { + "messages": [ + {"role": "user", "content": "i want a refund on purchase 237"}, + { + "role": "assistant", + "content": "I've refunded you a total of $1.98. How else can I help you today?", + }, + {"role": "user", "content": "did prince release any albums in 2000?"}, + ], + "route": "question_answering_agent", + }, + { + "messages": [ + { + "role": "user", + "content": "i purchased a cover of Yesterday recently but can't remember who it was by, which versions of it do you have?", + } + ], + "route": "question_answering_agent", + }, +] -[https://smith.langchain.com/public/20808486-67c3-4e30-920b-6d49d6f2b6b8/d](https://smith.langchain.com/public/20808486-67c3-4e30-920b-6d49d6f2b6b8/d) +dataset_name = "Chinook Customer Service Bot: Intent Classifier" +if not client.has_dataset(dataset_name=dataset_name): + dataset = client.create_dataset(dataset_name=dataset_name) + client.create_examples( + inputs=[{"messages": ex["messages"]} for ex in examples], + outputs=[{"route": ex["route"]} for ex in examples], + dataset_id=dataset.id, + ) + + +# Evaluator +def correct(outputs: dict, reference_outputs: dict) -> bool: + """Check if the agent chose the correct route.""" + return outputs["route"] == reference_outputs["route"] + + +# Target function for running the relevant step +async def run_intent_classifier(inputs: dict) -> dict: + # Note that we can access and run the intent_classifier node of our graph directly. + command = await graph.nodes["intent_classifier"].ainvoke(inputs) + return {"route": command.goto} + + +# Run evaluation +experiment_results = await client.aevaluate( + run_intent_classifier, + data=dataset_name, + evaluators=[correct], + experiment_prefix="sql-agent-gpt4o-intent-classifier", + max_concurrency=4, +) +experiment_results.to_pandas() +#endregion +```` diff --git a/docs/evaluation/tutorials/index.mdx b/docs/evaluation/tutorials/index.mdx index 18da8297..9e313600 100644 --- a/docs/evaluation/tutorials/index.mdx +++ b/docs/evaluation/tutorials/index.mdx @@ -5,4 +5,4 @@ New to LangSmith or to LLM app development in general? Read this material to qui - [Evaluate your LLM application](./tutorials/evaluation) - [RAG Evaluations](./tutorials/rag) - [Backtesting](./tutorials/backtesting) -- [Agent Evaluations](./tutorials/agents) +- [Evaluate an agent](./tutorials/agents) diff --git a/docs/evaluation/tutorials/static/agent_tutorial_graph.png b/docs/evaluation/tutorials/static/agent_tutorial_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..181a69aba5ed9dc1f7489c3f03744d5bcf46af72 GIT binary patch literal 37935 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%0A0ML@Td=@jOsCI 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 JWt~$(69B$Xs3ZUY literal 0 HcmV?d00001 diff --git a/docs/evaluation/tutorials/static/chinook-diagram.png b/docs/evaluation/tutorials/static/chinook-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..fca0ec6507e918171107d22b72f08c9a1fc2e654 GIT binary patch literal 208720 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 literal 0 HcmV?d00001 diff --git a/docs/evaluation/tutorials/static/sql_agent_graph.png b/docs/evaluation/tutorials/static/sql_agent_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cc75fe3f0e86722f64da8d0d9e0c03e9f14c532d GIT binary patch literal 12720 zcmb7rbx<5pzhy%b+${tN5+vy0?g4@a2oT&|gS(U99vEDM1$PPV?(XjH&UW7Sw(9L4 zTU$FdRo!#@*0ui0Ip^L9mY4gCibQ|}0063_gs38TT>=0YO$1o*u7jUG0KCB1D}ELM zN`{H{0Du&b6ctu-NjXY&*2L*~=rJj^{r-cOD`HtRiptL~ZnjkyCmf%hRu#)K7(ZOl zT{4VWJX<`w8!KEmJeUE~qG(o#CaW9G@6yZp`}d~jXVvCTQK9~$qh;n3sQ2pf@nB#R zdL?V+2%rD%l^fuTfr7OROBzMx(;R?-xhsu;>HB}&AT7hr3yEbaQcX)7un~l7Q_ie0 zE<2@N1^==- z0urX@-KF(XCEHn0B=NiH+{q^^x~g(NGU(cpRxDa**py(8o+!bUb=Vy5O zC{+YcCo8yJ6m?9qhK&T+8J-9Z!rH+3H>4cR9n98N4TLll{I0+DDnYeKSwaXp0Tis(br!O!u-(Q(Xp|y!OFq{0Apig&EDw0 zPDkVBgqG#D8{N(;o;TCQ8qCbhVAaILL>q1E?~e~q) zdV6Q5$T&AQ z2aiUiTRCTIYimk|6>KFO?C;B3Zb~{QS)!7{Ojkk`}0h?+gJcN$! z6(EzqME3EcX=f1TuCTYaH`0&xjWa)g|FI8-EO)DI{s`k31d57^F)1mFyV7w|)#g)w zT3cJU89BL7EJ89+I!gQsd@3PRQpA1$?a(Rar?s^;OAhy|{i)Em5Hxgjn>Cqei7K0w z=Blcyh6Wx02)+8EA(l5mC~HQ9Zy8b~XD~<*j5z!xormZx9H-w@Glyzy0JNq34>u7_B`O?oitv^Z5Y<&Lam<(3 z)YKR)Jnh)|e<+?%Ek8TC+(3J-ZS7i+QpwX>z*p^?$om3i)Z)==e@#bM$m@K3`|yz6 z^GQU6QM)lAA)(i}(%;WdS%!zhUG8yjTSQ{ zKjVs(53CN?&e?>#o?rrz^?e&EB-XYqR?|{c>4*FJ>OJo4#Kpx&()hm>skRxizyQL+ z!k{(0Wz=*zTNe`&Y8}n|DjhT-}ioSxq^mn=`2q8wK?t7TeM$YjDfX&z=*BI z`?wuLvXW`l1$Mga0Z2=u>&13*&(YBl9bGblMpaEs_c4Rh2O1ihLX~3k^AB&|LStfL zI3r1Tod%bi=cJ?+O@ z(Zg`wSz%#xf#XU0RF74@-FBtk_ya%L{-NKk#lm0%$YXf%{rEH>ew_Ap{M}|$o9q{h zWRjh0=uOBfkJ~sHujmmbwX-e>%`_m2)Ff6sgY7Buy$*pbG?&N*!e5&a*XE^vnV31! z-ShWa`~<)>d7ynA*8Jx>5{pyaLMiKitGdvy>C$f zMTp|SK05-UtJ`PG4T%dhy*EEJHi|=bF_xg=lS+T+kZ@zvtBbUy$;q(Fef=9iXQ|gL zDK0M73$51w+H0uWMP6x@Um~D_rxI{5ij5t6Mmb%iTCP8uA*`UF;DYQ6kVo{8VSqVN z*tglzr)NX2ih^hyEdxS`f$%zE+r_sEad!Z2*MTSa^$DDU&x+_Pq#q)Ata0257x4EL zFnFO;A{5-6y+S%1@;W-DW38|0MPa~lUS3}0(BZ!!{-*z)XlWHI(VnTmm;v`#BBEg1 zWfc{E7owdoUf8I;hAdoPM2WycT_*gpCJMCEWK$v9xc2K9E+HL}AcRY!R~#H1Old*j zPYzP7U|l{;+yA8T0XP>v?N}OQvO2(X&PRw;zHrK=(1#81L?k00g`&>R&9$9zfpsl2 z8X5>9dV*hFQU(NpjQ}%ySV-WcR(Z5UVE(&u>(xd8EI69~x`N}!|04Pk9FotOXaMYg zk6D)`(a_Fh7iz{vaL*bnDkUY=uA!cnTUm>t$#^qW_-%JYu>c3im^m=e z*FT+}n%g@ZIqQq1exa5v%g)~TMf3Ia>uZ=%sP13_^YHL+_{-G6)hjp@FyQtm$?C*zg#CzUf+S=Q9Xkfm+#{#PQevg@gsi&-* z0wI_AJyg2N4=YD8Seef?!^F_%b9`iEt2q!S>~NdqAF6#wGRDJ7Efa&2DOs#R!|(cjwy)?%!SEZUB&)OIel7Y&Vo z0HhU$s9cEQPkxp!LeT-4QVA+(Q2P8@Ye4Yizmx12RTS%EWX4}wjR0v ztEMDT#Z!!k-l`#dvom(I6E6DM!uF0DQLb{^TAFb+h=55rT`(74zrVJL969yi4!Ys)N! z>S!y}Sj^n0-AtIVA(PmwL<&An)+P(ewG`eNs2t_UP%YGWb`0JIgcCZA($hCDRB`Zs zaJ=fjLKf640Qmx?(0Gre7&n8* zy4kr(0Xhi8ieBv_&fvr0MuVGe`=VH-iD#}#;SMArIz2sb<-~kD;fs4Pi^;WLvu6hk zfZg3=^>|!3vI7Bg4$^D>ii+_GRz(;9oH~>-J(_j4aARYc zmXHi#Fh!+vD^MZ;eC}H&C!L%;%Iole)0^xEz~}UoY}fX+aJ$HZcD)-6@SS(d4b0jK zUts}>Qmf>cv@~^PEpGDr)b0=F)eQ}Q#)DeacG?#`=7+N+sgdz*IwtFCxoB5rKd zX(oq-@v5gfEzL6kz)8sx4pLWAwX|S*%i?r=-~q%$z=1~x7Qh?S>DFcXLP=a$T6%GL zs@`I4F%rczSwYBoI9q9=0e0@e`v5L;;?4M|bV{nGleJ)(`$^4*7Gfcc&V>a|~lsZNEAN`xza5{&+T=t+-^8cKj|Esai@EZGA2bZN-vWdJNWEUS(OS}=8 z5i=lUqF@;Mmk$0vZh{V^IUmx;$8g$ypIp=%V6A@C2 zv@W8l)9}FB35&Z-%OspV{VKzGUq3A~2hO*y+2N{ub5?PD_}d0U=cy*Y=Dar!I@xhk z56OCWVYZ=m38qT^(Gr8}utNpSO%KLviGwPA-~DHHVbK)Fw}N$VT&2Ox3;6h%RO}>X zsYe&pC}yh^I;f|H7q7KU-Z$_Ngc}Rz5jGm)u)ND;mApQ_9F;ge;_Y*Fb+z9fY|Ce4 z^%-q$1R-NbAbMp*MSp+)Z^Z&7S}=@**05M>ldebCKQtsOAyHOY$?I`jrYCJ3;rVb) zNloqj@^ljs5z$>RRz-U3)(bKc5LbhkoJ|AHEo#U(l8|$F)sa}hLzNVxck6rr3Tb&L zVU8&pPT{r(lRc}+a9DVFDw|mhra2o!(87&?>-lf(($5&b$9@3-Ba{#q*Jw86{NjR@ zl@$iS3f`R2@n*MNV_4nTus>d`A0Hp*w%?Y>QOusQz`~dT7l4q{I^%9a9^>^pZoA)Y z7LqbDMMXuT0}y)pM!T($wn9^1u~59B1ZIP?^{$!8|LKeGH{^m?pa(SqX#^OHxFn9R#N!7YKa6 zHOYD<;-;@EHjixm3H!d{$k(W4_uVJ1Yy!cggYb#*g#CaKfH<=UW5O zA3m38)G~5$;RCDN+ua*yW%y^mb8@03C{pF}W)8**g75F|J3B@FzfBU5laoh~2zuR~ zt_>w~Zjk$MVc4d9q@>(h?+QJbE@m~(foL~^EQjws85RmLzuP5PzT)*@1%~}`?68ZS zk&$%4mD?+?v#z%$BWdhjO+yMwN^EwUy))-!s1YHpcx?P&;>8;gRErjV*=jBm{ zcCmof*7o<^z=iIKB(Yg)z_nrE63W=QwP|@$QBkQe#T@+o0*Q%@t+igd2Z1`q??^qO zpmA*hkK0oa9B?I7{QgZLC`eK|uc5m;nh9E0cxdQf#{;}&^)PrckHlZU9Ig-Nt`254 z^2s0&8<2u=A(_H}gassdxp{dnmlI!HESRxCF1#ySQhBbxH&pd6*i1)B*%mwL+lHVI*GGix=1MomOJ`W8R3AP^Pl+z4f+c1Xxdlqw^=#^0tvNvNo^d4`NwG~D%qqs} z!ot8pt!h+2#eT_v3~ZhK?UW4epVJ;UDf zt7pn@Zf>qJ{I-$-*RD7E!;2c8eir@+6eMNl)$>ZmY|}+*pp@ZX8^Tek-xXrhd%;$FbPt^!l(du!%+#TDS$U9RR;m2{n`fi z2;N>t!0j@qO;=Yd)D{$1#E0c3tQ(t}D6tTiY3I?mn>`+HnKS*yc@YRk1>CPK>op^4 z(F)?dv>jV{FUeJ-?fy22cC}BP!Yy}Lx0a_&>i;laI=xG2Zj$bGc$U;&>`c4D>rItYN9R&49kUq_I8m< z8;F93r{`ESM#S1WCMG5YmLz%fuei84C^Ycr&+Gjui{2GRQJcB{G;UIYPtdTjjE_VpsL_H>|vAp#(OKqrW3Xr z)7+BKEx_m#RdjT1TF_cUWt0024;NSC%ku+%TqGuX$;`87As!i7>vvA^yoneLETQFR z&je096+?v|?QI<_E*N>zH}P2{%$5*oDJe}Yt#UdNWb0>|Q8S@QhqqKczs~Cu@nQ&M z?{%i6>W536D+yioW?Ozq<>caGdOW$XC(0m&uM2sJ-k}cc zoM!R(4Zh_cV*OZy)7ODebV_rhi6%-EPnu{68B;53AdWo5!2vr|;~24U{{S7+C1s+_f1YJRqUA{7 zkj*$%?-WaCl6U*J(9S`wBq6%H^tTpOasChF+2%Th%O7V-KuRh!P&7bWx_R>4Owe+L z%PEBn`?ub#c6@xiz7kjGVOv>Kzz8@L-%=#r&L1suFRuHh3JNf>efujmx{p2SSv?oX z=MnD(f2BSRc6C`jH|8w;h0pF8pzC)!x)(U`;t4li+cq)SuVnpu-EQc*4%UrkgNGbQ1DtPC1gxBHecDXPs;k)rkLP3D zcBsOQF|mm5-R>B6IqA!qECqw%Z>;AZs|!OPUOb!a+HdR5&lUS$w40vYHg}>{%idf- z3zYuE6~4`)x&0y1);Jaod+Qhut?b+|$-JL7oGw5!X{<3m-f8W4e`F1er zE>W&<%ABoqCN4SoqT@Pzqo=DzR|+RlrpD^wXW|(mi0d=dR6T0VtlY%+_u~%UdNrRv zKZTJvdq<|#xDGTJ^q_x^3{$JuPxbeo*oWYO2nX==Z8Yu6qbcC*jtouZKd3xE_vSGG zXThaf4K+R)*x&!76G?>6Vc8jCWHI&uTQCI)5UQ*nO0Q+3r6mAXkGJp4+AoV9_CPvF z^z0}IHK;V2ux86LQr!%yD=-+=;$pWs&Po-ucKZH(zWfOw@MYhAIxC%_jFy-#(%L^D zWU|<9oHk8nbr)V~UITnUa>Lg0pOFBonzFn<;^pM@nen*pR75==sw)O_dFDZEq{Laf$QT`SYU!2q{K>p=hQ7W+xeaRc(@o858AmwW$dqd_& zs+Z|ms@Vjx&s4i6X=q744Gi#mhAK08Vue7`>P^SBVu7WbWV9W* z)mAUY14#d1ULV{H7rlEizraT^R#tuk_^ik%)Vp$T;Tm}~Kb^Etdo?-Pe`fn2@reMr zKnWIDwR={3>@(IFFk~rEQdd@9dphy5`Y^P267+l9XCuw29aNG_Lq@zq*$MT^XZ3B1 zlNY=vq_Y_@rx21GL!@#_bZV79Vinz)?==-&cE=ZeICb#=gtSrwJ-w@|(*F{abh+dpT_a|Q-&OP+Swp7}ualRMk%(HWJtgYP8 zY49j1f8C_Lk{~>>G{nkO)|26j32Gm_PS$P~48?6D5Dej{s!N>97TP#k27XFX(jXZs zclQTl6G1vgM$0Czst!`<07@3>n~vuk*N5?`DSkJ@!8v>H>8aq3_WR(jYLk)Yv!@$( zjXJ~mNi{Pwno#IqDw9COKy_blUG|jOO!1N*X>U)bAHTA4^Tq98MPmp~N@(7XpCEZ2WTI z+wjPX$95e$)x!KK$c8-%y#OEQ8Ed2;`a|ycj4z&{3pvs=H=iSUU3T+=GCQm+EqOnBwLKc4z+EVfm*3y>d_gb0I;gouLHs0U zy;x>2l4b=4o%5r^j*dXXWoh@q=b)f9&~#>EAb3z5f=;MvwRu-p7l_8d%x2zIAF$dT zYz_zACNvJOjgsq3tyE^zzVz`r + ); +} + export default function CodeBlockWrapper({ children, ...props }) { if (typeof children === "string") { - return {children}; + return {children}; } return ( <> - {children.content} - + {children.content} + {children.imports && } ); }

cG(?k(1k(>M&v+7Z!EAHiWoZRzpLsI3j_s!)a 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 Qf58AG#pFawM0EZB7fi7##sB~S literal 0 HcmV?d00001 diff --git a/src/css/custom.css b/src/css/custom.css index 1d80a0ed..8543d1ef 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -250,11 +250,82 @@ html[data-theme="dark"] { box-shadow: none !important; } +/* Update gutter styles */ +.fold-markers { + border-right: none; + border-left: 1px solid var(--joy-palette-divider) !important; + border-top: 1px solid var(--joy-palette-divider) !important; + border-bottom: 1px solid var(--joy-palette-divider) !important; + border-radius: var(--ifm-code-border-radius) 0 0 var(--ifm-code-border-radius); + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 12px; + background: var(--prism-background-color); + z-index: 1; +} + +/* Dark mode specific styling */ +[data-theme='dark'] .fold-markers { + /* background: var(--prism-background-color) !important; */ + background: #1e1e1e; +} + +.fold-marker { + position: absolute; + cursor: pointer; + user-select: none; + color: var(--ifm-menu-color); + width: 12px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + transition: color 0.2s ease, transform 0.2s ease; + transform-origin: center; + left: 12px; + padding-top: 20px; +} +.fold-marker.collapsed { + transform: rotate(-90deg) translateX(-13px) translateY(-12px); +} +.fold-marker:hover { + color: var(--ifm-menu-color-active); +} + +/* Remove border radius when inside tabs */ +.tabs-container .fold-markers { + border-radius: 0 !important; +} + +/* Remove code block border and shadow */ .theme-code-block { - border-color: var(--joy-palette-divider) !important; - padding-left: 0 !important; + border: 1px solid var(--joy-palette-divider) !important; + border-left: none !important; + box-shadow: var(--ifm-global-shadow-lw); +} + +/* Ensure wrapper doesn't add extra shadows */ +.code-block-wrapper { + box-shadow: none !important; +} + +/* Remove any nested borders */ +.code-block-wrapper > .code-block-with-gutter > div, +.code-block-wrapper > .code-block-with-gutter > div pre { + border-left: none !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; + box-shadow: none !important; +} + +.code-block-with-gutter { + padding-left: 12px } +/* Remove theme border */ .theme-code-block::before { display: none !important; } diff --git a/src/theme/CodeBlock/index.js b/src/theme/CodeBlock/index.js index 7169757c..85e2f2d2 100644 --- a/src/theme/CodeBlock/index.js +++ b/src/theme/CodeBlock/index.js @@ -1,5 +1,5 @@ /* eslint-disable react/jsx-props-no-spreading */ -import React from "react"; +import React, { useState } from "react"; import CodeBlock from "@theme-original/CodeBlock"; function Imports({ imports }) { @@ -33,15 +33,179 @@ function Imports({ imports }) { ); } +function CollapsibleCodeBlock({ children, ...props }) { + const processCode = (code) => { + const lines = code.split("\n"); + const processedLines = []; + let currentSection = null; + + for (let i = 0; i < lines.length; i += 1) { + const line = lines[i]; + + // Check for region with optional [collapsed] flag + const regionMatch = line.match( + /(\/\/#region|#region)\s*(\[collapsed\])?\s*(.*)/ + ); + if (regionMatch) { + currentSection = { + start: i, + title: regionMatch[3].trim(), + content: [], + defaultCollapsed: !!regionMatch[2], // true if [collapsed] is present + }; + } else if (line.includes("#endregion") || line.includes("//#endregion")) { + if (currentSection) { + processedLines.push({ + type: "section", + ...currentSection, + end: i, + }); + currentSection = null; + } + } else if (currentSection) { + currentSection.content.push(line); + } else { + processedLines.push({ type: "line", content: line }); + } + } + + return processedLines; + }; + + const [collapsedSections, setCollapsedSections] = useState(() => { + const initial = new Set(); + if (typeof children === "string") { + const processed = processCode(children); + processed.forEach((item, index) => { + if (item.type === "section" && item.defaultCollapsed) { + initial.add(index); + } + }); + } + return initial; + }); + + const toggleSection = (index) => { + const newCollapsed = new Set(collapsedSections); + if (newCollapsed.has(index)) { + newCollapsed.delete(index); + } else { + newCollapsed.add(index); + } + setCollapsedSections(newCollapsed); + }; + + const renderCode = () => { + if (typeof children !== "string") { + return children; + } + + const processedCode = processCode(children); + let result = ""; + + processedCode.forEach((item, index) => { + if (item.type === "line") { + result += `${item.content}\n`; + } else { + const isCollapsed = collapsedSections.has(index); + // Always show the first line + result += item.content[0] + (isCollapsed ? " ...\n" : "\n"); + if (!isCollapsed) { + // Add the rest of the content starting from the second line + result += + item.content.slice(1).join("\n") + + (index < processedCode.length - 1 ? "\n" : ""); // Only add newline if not last item + } + } + }); + + return result.trimEnd(); // Remove trailing whitespace and newlines + }; + + const getGutterItems = () => { + if (typeof children !== "string") return []; + + const processedCode = processCode(children); + const items = []; + let lineCount = 0; + + processedCode.forEach((item, index) => { + if (item.type === "line") { + lineCount += 1; + } else { + const isCollapsed = collapsedSections.has(index); + items.push({ + line: lineCount, + title: item.title, + isCollapsed, + index, + }); + // Always count the first line + lineCount += 1; + if (!isCollapsed) { + // Add the remaining lines if not collapsed + lineCount += item.content.slice(1).length; + } + } + }); + + return items; + }; + + React.useEffect(() => { + const style = document.createElement("style"); + style.textContent = ` + .code-block-wrapper { + position: relative; + } + + `; + document.head.appendChild(style); + return () => document.head.removeChild(style); + }, []); + + const gutterItems = getGutterItems(); + const codeContent = renderCode(); + + return ( +