Arize-ai / phoenix

AI Observability & Evaluation
https://docs.arize.com/phoenix
Other
4.04k stars 299 forks source link

🗺️ Session Tracking #2619

Open mikeldking opened 8 months ago

mikeldking commented 8 months ago

As a user of phoenix, I want to be able to associate multiple traces (e.g. conversational flows) under a single session_id. This way I can track the back and forth between a user and a chat completion endpoint (e.g. visualize the back and forth).

In addition to tracking a session.id, we might also want to track session metadata such as user_id etc.

As a developer building a chat or agent application, I want to be able to track user interactions with my application. Notably if my application keeps track of user interactions under a single “session”, I want to be able to view the user interactions at a higher level rather than a trace.

OpenInference Semantic Convention changes

OpenInference instrumentation changes

New “openinference-instrumentation” package

from openinference.instrumentation.session import using_session, set_session, clear_session

# Using a context manager
With using_session(id: “my-unique-id”):
       // Invoke application code here

# implicit
set_session(id: "my-session-id")
// run code here
clear_session(id: "my-session-id")       

Proposed solution is to leverage trace context to set “inheritable” attributes that would be added to each span that is nested below a session context. This means that the setting of the session

Open questions:

Custom Instrumentation


Custom instrumentation would also have to inherit the attributes in a simple way. We need to provide convenience to pull these attributes and attach them to the span.

from openinference.instrumentation import get_context_attributes

def do_work():
    with tracer.start_as_current_span("span-name", get_context_attributes()) as span:
        # do some work that 'span' will track
        print("doing some work...")
        # When the 'with' block goes out of scope, 'span' is closed for you

Architecture

Under the above, session.id would correlate to a trace (not a span) to avoid the danger of spans that get captured in the absence of a session.id. This must be the assumption when querying for sessions.

Milestone 1 - Instrumentation

Instrumentation Documentation

Milestone 2 - Sessions in the UI

Engineering Leads: @RogerHYang @Parker-Stafford

Server Support for Sessions

Sessions User-Interface

Sessions API

Milestone 2.5 Sessions JavaScript Support

JavaScript

Milestone 3 - Evaluations / Annotations

As a user I might want to evaluate how a session went.

axiomofjoy commented 8 months ago

With respect to threading and async, OpenTelemetry by default uses contextvars to ensure the context is unique to each thread/ task out of the box. So it's safe for a session context manager to interact with these APIs.

https://github.com/open-telemetry/opentelemetry-python/blob/721beb8b530e7a830c1e27b70c2fb9af6465baf1/opentelemetry-api/src/opentelemetry/context/contextvars_context.py#L19

DixitAdh commented 2 months ago

@mikeldking This looks like a great feature and looking forward to try it out. Let me know if you need any support on testing this. I have a phoenix server deployed in azure containers and logging the traces via databricks notebook. This all is done for RAG chain which is built using langchain.