Arize Phoenix TS
    Preparing search index...
    • Binds an evaluator to a specific data structure using input mapping.

      This function creates a new evaluator instance that automatically transforms your data structure to match what the evaluator expects. This is particularly useful when your data schema doesn't match the evaluator's expected input format.

      Type Parameters

      • RecordType extends Record<string, unknown>

      Parameters

      Returns EvaluatorBase<RecordType>

      A new evaluator instance with the input mapping applied

      Basic usage with simple field mapping:

      import { bindEvaluator, createHallucinationEvaluator } from "@arizeai/phoenix-evals";
      import { openai } from "@ai-sdk/openai";

      type MyData = {
      question: string;
      context: string;
      answer: string;
      };

      const evaluator = bindEvaluator<MyData>(
      createHallucinationEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      input: "question", // Evaluator expects "input", map from "question"
      reference: "context", // Evaluator expects "reference", map from "context"
      output: "answer", // Evaluator expects "output", map from "answer"
      },
      }
      );

      // Now you can evaluate with your data structure
      const result = await evaluator.evaluate({
      question: "What is AI?",
      context: "AI is artificial intelligence...",
      answer: "AI stands for artificial intelligence",
      });

      Using nested property access:

      type ApiResponse = {
      request: {
      body: {
      query: string;
      context: string;
      };
      };
      response: {
      data: {
      text: string;
      };
      };
      };

      const evaluator = bindEvaluator<ApiResponse>(
      createHallucinationEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      input: "request.body.query",
      reference: "request.body.context",
      output: "response.data.text",
      },
      }
      );

      Using function-based mapping for data transformation:

      type RawData = {
      question: string;
      contexts: string[]; // Array of context strings
      answer: string;
      };

      const evaluator = bindEvaluator<RawData>(
      createHallucinationEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      input: "question",
      // Transform array to single string
      reference: (data) => data.contexts.join("\n\n"),
      output: "answer",
      },
      }
      );

      Using JSONPath for complex queries:

      type ComplexData = {
      conversation: {
      messages: Array<{ role: string; content: string }>;
      };
      metadata: {
      sources: string[];
      };
      };

      const evaluator = bindEvaluator<ComplexData>(
      createHallucinationEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      // Extract last user message
      input: "$.conversation.messages[?(@.role=='user')].content[-1]",
      // Extract all sources
      reference: "$.metadata.sources[*]",
      // Extract last assistant message
      output: "$.conversation.messages[?(@.role=='assistant')].content[-1]",
      },
      }
      );

      Binding multiple evaluators with different mappings:

      type EvaluationData = {
      userQuery: string;
      systemContext: string;
      modelOutput: string;
      expectedOutput?: string;
      };

      // Hallucination evaluator
      const hallucinationEvaluator = bindEvaluator<EvaluationData>(
      createHallucinationEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      input: "userQuery",
      reference: "systemContext",
      output: "modelOutput",
      },
      }
      );

      // Document relevancy evaluator (if it exists)
      const relevancyEvaluator = bindEvaluator<EvaluationData>(
      createDocumentRelevanceEvaluator({ model: openai("gpt-4") }),
      {
      inputMapping: {
      query: "userQuery",
      document: "systemContext",
      output: "modelOutput",
      },
      }
      );