> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何使用 REST API 上传在 LangSmith 外部运行的实验

一些用户更喜欢在 LangSmith 外部管理数据集和运行实验，但希望使用 LangSmith 的 UI 来查看结果。我们的端点支持此功能。

本指南将向您展示如何使用 REST API 上传评估，以 Python 中的 `requests` 库为例。但相同的原则适用于任何语言。

## 请求体结构

上传实验需要指定实验和数据集的相关高级信息，以及实验中各个示例和运行的单独数据。`results` 中的每个对象代表实验中的一个“行”——一个单独的数据集示例及其关联的运行。请注意，`dataset_id` 和 `dataset_name` 指的是您外部系统中的数据集标识符，用于将外部实验分组到单个数据集中。它们不应引用 LangSmith 中的现有数据集（除非该数据集是通过此端点创建的）。

您可以使用以下结构将实验上传到 `/datasets/upload-experiment` 端点：

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "experiment_name": "字符串（必需）",
  "experiment_description": "字符串（可选）",
  "experiment_start_time": "日期时间（必需）",
  "experiment_end_time": "日期时间（必需）",
  "dataset_id": "UUID（可选 - 外部数据集 ID，用于将实验分组在一起）",
  "dataset_name": "字符串（可选 - 必须提供 dataset_id 或 dataset_name 之一）",
  "dataset_description": "字符串（可选）",
  "experiment_metadata": { // 对象（任意形状 - 可选）
    "key": "value"
  },
  "summary_experiment_scores": [ // 摘要反馈对象列表（可选）
    {
      "key": "字符串（必需）",
      "score": "数字（可选）",
      "value": "字符串（可选）",
      "comment": "字符串（可选）",
      "feedback_source": { // 对象（可选）
        "type": "字符串（必需）"
      },
      "feedback_config": { // 对象（可选）
        "type": "字符串枚举：continuous、categorical 或 freeform",
        "min": "数字（可选）",
        "max": "数字（可选）",
        "categories": [ // 反馈类别对象列表（可选）
          {
            "value": "数字（必需）",
            "label": "字符串（可选）"
          }
        ]
      },
      "created_at": "日期时间（可选 - 默认为当前时间）",
      "modified_at": "日期时间（可选 - 默认为当前时间）",
      "correction": "对象或字符串（可选）"
    }
  ],
  "results": [ // 实验行对象列表（必需）
    {
      "row_id": "UUID（必需）",
      "inputs": { // 对象（必需 - 任意形状）。这将
        "key": "val" // 是运行和数据集示例的输入。
      },
      "expected_outputs": { // 对象（可选 - 任意形状）。
        "key": "val" // 这些将是数据集示例的输出。
      },
      "actual_outputs": { // 对象（可选 - 任意形状）。
        "key": "val" // 这些将是运行的输出。
      },
      "evaluation_scores": [ // 运行的反馈对象列表（可选）
        {
          "key": "字符串（必需）",
          "score": "数字（可选）",
          "value": "字符串（可选）",
          "comment": "字符串（可选）",
          "feedback_source": { // 对象（可选）
            "type": "字符串（必需）"
          },
          "feedback_config": { // 对象（可选）
            "type": "字符串枚举：continuous、categorical 或 freeform",
            "min": "数字（可选）",
            "max": "数字（可选）",
            "categories": [ // 反馈类别对象列表（可选）
              {
                "value": "数字（必需）",
                "label": "字符串（可选）"
              }
            ]
          },
          "created_at": "日期时间（可选 - 默认为当前时间）",
          "modified_at": "日期时间（可选 - 默认为当前时间）",
          "correction": "对象或字符串（可选）"
        }
      ],
      "start_time": "日期时间（必需）", // 运行的开始/结束时间将用于
      "end_time": "日期时间（必需）", // 计算延迟。它们必须全部介于
      "run_name": "字符串（可选）", // 实验的开始和结束时间之间。
      "error": "字符串（可选）",
      "run_metadata": { // 对象（任意形状 - 可选）
        "key": "value"
      }
    }
  ]
}
```

响应 JSON 将是一个包含 `experiment` 和 `dataset` 键的字典，每个键都是一个对象，包含有关创建的实验和数据集的相关信息。

## 注意事项

您可以通过在多次调用之间提供相同的 dataset\_id 或 dataset\_name，将多个实验上传到同一数据集。您的实验将被分组到单个数据集中，并且您将能够[使用比较视图来比较实验之间的结果](/langsmith/compare-experiment-results)。

确保各个行的开始和结束时间都介于实验的开始和结束时间之间。

您必须提供 dataset\_id 或 dataset\_name 之一。如果您只提供 ID 且数据集尚不存在，我们将为您生成一个名称；反之，如果您只提供名称，情况也是如此。

您不能将实验上传到不是通过此端点创建的数据集。上传实验仅支持外部管理的数据集。

## 示例请求

以下是一个调用 `/datasets/upload-experiment` 的简单示例。这是一个基本示例，仅使用最重要的字段进行说明。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import os
import requests

body = {
    "experiment_name": "我的外部实验",
    "experiment_description": "上传到 LangSmith 的实验",
    "dataset_name": "my-external-dataset",
    "summary_experiment_scores": [
        {
            "key": "summary_accuracy",
            "score": 0.9,
            "comment": "做得好！"
        }
    ],
    "results": [
        {
            "row_id": "<<uuid>>",
            "inputs": {
                "input": "你好，今天旧金山的天气怎么样？"
            },
            "expected_outputs": {
                "output": "抱歉，我无法提供当前天气信息。"
            },
            "actual_outputs": {
                "output": "天气多云，最高气温 65 度。"
            },
            "evaluation_scores": [
                {
                    "key": "hallucination",
                    "score": 1,
                    "comment": "聊天机器人编造了天气，而不是识别出他们没有足够的信息来回答这个问题。这是幻觉。"
                }
            ],
            "start_time": "2024-08-03T00:12:39",
            "end_time": "2024-08-03T00:12:41",
            "run_name": "聊天机器人"
        },
        {
            "row_id": "<<uuid>>",
            "inputs": {
                "input": "你好，49 的平方根是多少？"
            },
            "expected_outputs": {
                "output": "49 的平方根是 7。"
            },
            "actual_outputs": {
                "output": "7。"
            },
            "evaluation_scores": [
                {
                    "key": "hallucination",
                    "score": 0,
                    "comment": "聊天机器人正确识别了答案。这不是幻觉。"
                }
            ],
            "start_time": "2024-08-03T00:12:40",
            "end_time": "2024-08-03T00:12:42",
            "run_name": "聊天机器人"
        }
    ],
    "experiment_start_time": "2024-08-03T00:12:38",
    "experiment_end_time": "2024-08-03T00:12:43"
}

resp = requests.post(
    "https://api.smith.langchain.com/api/v1/datasets/upload-experiment", # 对于自托管安装或欧盟区域，请相应更新
    json=body,
    headers={"x-api-key": os.environ["LANGSMITH_API_KEY"]}
)

print(resp.json())
```

以下是收到的响应：

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{
  "dataset": {
    "name": "my-external-dataset",
    "description": null,
    "created_at": "2024-08-03T00:36:23.289730+00:00",
    "data_type": "kv",
    "inputs_schema_definition": null,
    "outputs_schema_definition": null,
    "externally_managed": true,
    "id": "<<uuid>>",
    "tenant_id": "<<uuid>>",
    "example_count": 0,
    "session_count": 0,
    "modified_at": "2024-08-03T00:36:23.289730+00:00",
    "last_session_start_time": null
  },
  "experiment": {
    "start_time": "2024-08-03T00:12:38",
    "end_time": "2024-08-03T00:12:43+00:00",
    "extra": null,
    "name": "我的外部实验",
    "description": "上传到 LangSmith 的实验",
    "default_dataset_id": null,
    "reference_dataset_id": "<<uuid>>",
    "trace_tier": "longlived",
    "id": "<<uuid>>",
    "run_count": null,
    "latency_p50": null,
    "latency_p99": null,
    "first_token_p50": null,
    "first_token_p99": null,
    "total_tokens": null,
    "prompt_tokens": null,
    "completion_tokens": null,
    "total_cost": null,
    "prompt_cost": null,
    "completion_cost": null,
    "tenant_id": "<<uuid>>",
    "last_run_start_time": null,
    "last_run_start_time_live": null,
    "feedback_stats": null,
    "session_feedback_stats": null,
    "run_facets": null,
    "error_rate": null,
    "streaming_rate": null,
    "test_run_number": 1
  }
}
```

请注意，实验结果中的延迟和反馈统计信息为 null，因为运行尚未有机会被持久化，这可能需要几秒钟。如果您保存实验 ID 并在几秒钟后再次查询，您将看到所有统计信息（尽管 token/成本仍将为 null，因为我们在请求体中未请求此信息）。

## 在 UI 中查看实验

现在，登录 UI 并点击您新创建的数据集！您应该会看到一个实验：<img src="https://mintcdn.com/other-405835d4/HWk8WH3Ivd1grcHm/langsmith/images/uploaded-dataset.png?fit=max&auto=format&n=HWk8WH3Ivd1grcHm&q=85&s=dd35c5168c5f9063da5f454d2a30b364" alt="上传的实验表格" width="3454" height="1914" data-path="langsmith/images/uploaded-dataset.png" />

您的示例将被上传：<img src="https://mintcdn.com/other-405835d4/HWk8WH3Ivd1grcHm/langsmith/images/uploaded-dataset-examples.png?fit=max&auto=format&n=HWk8WH3Ivd1grcHm&q=85&s=c0abf9194423d6860a0269bd34c92d68" alt="上传的示例" width="3454" height="1912" data-path="langsmith/images/uploaded-dataset-examples.png" />

点击您的实验将带您进入比较视图：<img src="https://mintcdn.com/other-405835d4/HWk8WH3Ivd1grcHm/langsmith/images/uploaded-experiment.png?fit=max&auto=format&n=HWk8WH3Ivd1grcHm&q=85&s=de2387a3b0875ede0f11c04ba52995dd" alt="上传的实验比较视图" width="3452" height="1912" data-path="langsmith/images/uploaded-experiment.png" />

随着您向数据集上传更多实验，您将能够在比较视图中比较结果并轻松识别回归。

***

<div className="source-links">
  <Callout icon="terminal-2">
    [通过 MCP 将这些文档](/use-these-docs)连接到 Claude、VSCode 等，以获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在 GitHub 上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/langsmith/upload-existing-experiments.mdx) 或 [提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
