← Материалы разборы Yersham
разбор · статьятема-фронтир · H 1.58
3.0
из 10
смотреть не обязательно — забрать выжимку и пункты
оценка машинная и частично зависит от длины ролика — спорите, открывайте оригинал

Автоматическая оценка предвзятости retrieved-документов в RAG

URL Source: https://raw.githubusercontent.com/Arize-ai/phoenix/main/examples/llamaindex-workflows-research-agent/evaluat

Phoenix и LlamaIndex позволяют автоматически оценивать retrieved-документы на предвзятость с помощью LLM-эвалуатора, агрегировать оценки и логировать аннотации для мониторинга качества RAG.

Phoenix и LlamaIndex позволяют автоматически оценивать retrieved-документы на предвзятость с помощью LLM-эвалуатора, агрегировать оценки и логировать аннотации для мониторинга качества RAG.

что из этого моё

Можно внедрить автоматическую проверку retrieved-документов на предвзятость в RAG-пайплайн, чтобы отслеживать качество и корректность ответов. Это повышает доверие к AI-ассистенту и позволяет выявлять проблемные источники данных.

Что забрать
отметь, что берёшь в работу → или отбрось как не своёмоё →
вынести функцию get_retrieved_documents из Phoenix Client в отдельный модуль для переиспользования
настроить evaluate_dataframe с кастомным промптом для классификации предвзятости retrieved-документов
логировать аннотации через log_span_annotations_dataframe и log_document_annotations_dataframe
расшифровка ролика ↓

Title:

URL Source: https://raw.githubusercontent.com/Arize-ai/phoenix/main/examples/llamaindex-workflows-research-agent/evaluate_traces.ipynb

Markdown Content: { "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from phoenix.client import Client\n", "\n", "pxc = Client()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from phoenix.client.helpers.spans import get_retrieved_documents\n", "\n", "retrieved_documents = get_retrieved_documents(pxc, project_name=\"research_assistant\")\n", "retrieved_documents.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import nest_asyncio\n", "from phoenix.evals import (\n", " LLM,\n", " ClassificationEvaluator,\n", " evaluate_dataframe,\n", ")\n", "\n", "nest_asyncio.apply()\n", "\n", "llm = LLM(\n", " provider=\"openai\",\n", " model=\"gpt-4o\",\n", " temperature=0.0,\n", ")\n", "\n", "bias_detection_prompt = \"\"\"\n", "You are an AI assistant designed to detect bias in documents. Given an original question\n", "and a document, your task is to analyze the document and determine if there is any bias present.\n", "\n", "Please follow these steps:\n", "1. Read the original question carefully.\n", "2. Read the document provided.\n", "3. Identify any statements, language, or information in the document that may indicate bias.\n", "4. Provide a classification of the document's bias level:\n", "Unbiased, Somewhat Unbiased, Somewhat Biased, Biased.\n", "5. Provide a detailed explanation for your classification, citing specific parts of the\n", "document that influenced your decision.\n", "\n", "Original Question: {input}\n", "Document: {reference}\n", "\n", "Your analysis should be thorough and objective. Please ensure that your explanation\n", "is clear and concise.\n", "\n", "Example response:\n", "************\n", "EXPLANATION: An explanation of your reasoning for the label you chose\n", "LABEL: \"bias\", \"unbiased\", \"somewhat biased\", \"somewhat unbiased\"\n", "************\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "bias_evaluator = ClassificationEvaluator(\n", " name=\"bias_detection\",\n", " llm=llm,\n", " prompt_template=bias_detection_prompt,\n", " choices={\n", " \"Unbiased\": 1.0,\n", " \"Somewhat Unbiased\": 0.75,\n", " \"Somewhat Biased\": 0.5,\n", " \"Biased\": 0.0,\n", " },\n", ")\n", "\n", "bias_results = evaluate_dataframe(\n", " dataframe=retrieved_documents,\n", " evaluators=[bias_evaluator],\n", ")\n", "\n", "# Extract label, explanation, and score from the score dict column\n", "bias_classifications = bias_results.copy()\n", "bias_classifications[\"label\"] = bias_classifications[\"bias_detection_score\"].apply(\n", " lambda x: x.get(\"label\") if x else None\n", ")\n", "bias_classifications[\"explanation\"] = bias_classifications[\"bias_detection_score\"].apply(\n", " lambda x: x.get(\"explanation\") if x else None\n", ")\n", "bias_classifications[\"score\"] = bias_classifications[\"bias_detection_score\"].apply(\n", " lambda x: x.get(\"score\") if x else None\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "bias_classifications.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "span_bias_classifications = bias_classifications.copy()\n", "\n", "span_bias_classifications[\"average_score\"] = span_bias_classifications.groupby(\"context.span_id\")[\n", " \"score\"\n", "].transform(\"mean\")\n", "\n", "span_bias_classifications[\"label\"] = (\n", " span_bias_classifications[\"average_score\"]\n", " .apply(\n", " lambda x: min(\n", " {1: \"unbiased\", 0.75: \"somewhat unbiased\", 0.5: \"somewhat biased\", 0: \"biased\"}.keys(),\n", " key=lambda k: abs(k - x),\n", " )\n", " )\n", " .map({1: \"unbiased\", 0.75: \"somewhat unbiased\", 0.5: \"somewhat biased\", 0: \"biased\"})\n", ")\n", "\n", "# Combine all rows with the same context.span_id into one row, with explanations being a concatenation of all the explanations\n", "span_bias_classifications = (\n", " span_bias_classifications.groupby(\"context.span_id\")\n", " .agg(\n", " {\n", " \"label\": \"first\",\n", " \"explanation\": lambda x: \"\\n----\\n\".join(str(e) for e in x),\n", " \"score\": \"mean\",\n", " \"average_score\": \"first\",\n", " }\n", " )\n", " .reset_index()\n", ")\n", "span_bias_classifications.set_index(\"context.span_id\", inplace=True)\n", "span_bias_classifications.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from phoenix.client import Client\n", "from phoenix.evals.utils import to_annotation_dataframe\n", "\n", "client = Client()\n", "\n", "# Span-level annotations use custom aggregation from cell above\n", "client.spans.log_span_annotations_dataframe(\n", " dataframe=span_bias_classifications,\n", " annotation_name=\"Bias Detection\",\n", " annotator_kind=\"LLM\",\n", ")\n", "\n", "# Document-level annotations using to_annotation_dataframe\n", "relevance_annotations = to_annotation_dataframe(bias_results, [\"bias_detection\"])\n", "client.spans.log_document_annotations_dataframe(\n", " dataframe=relevance_annotations,\n", " annotation_name=\"Relevance\",\n", " annotator_kind=\"LLM\",\n", ")" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }

дальше в дело
Собрать это в маршрут
все маршруты →
не хочешь разбираться сам
Сделаю это под задачу
форматы и цены →
ещё разборы