# 从分析连接开始

创建一个分析连接，从通过 Qlik Cloud 或各种第三方机器学习工具部署的模型中加载和生成数据。这些模型通常公开基于 REST 的 API 端点。在创建和使用连接之前，您需要创建和部署或访问所需的机器学习模型。

除了 Qlik Predict，还有几个第三方平台可以创建、训练和部署机器学习模型，例如：

* Azure ML

* Amazon SageMaker

[在 Azure 机器学习工作室中用无代码 AutoML 训练分类模型](https://docs.microsoft.com/en-gb/azure/machine-learning/tutorial-first-experiment-automated-ml)

[Amazon SageMaker 入门](https://docs.aws.amazon.com/sagemaker/latest/dg/gs.html)

## 为机器学习端点启用分析连接

默认情况下，机器学习端点是禁用的。

租户管理员可以在设置窗口的特性控制下的 Administration 中启用机器学习端点。

## 使用分析连接和服务器端扩展语法

分析连接可以将数据发送到 Qlik Predict 或外部暴露的机器学习端点以进行计算。从这些连接返回的数据可以加载到 Qlik Sense 应用程序中。

数据加载脚本和图表表达式是向 Qlik Sense 应用程序添加分析连接的两种方式。服务器端扩展 (SSE) 函数和参数都在 Qlik Sense 中处理，然后转换为 REST 请求，发送给机器学习模型。SSE 加载脚本和图表表达式必须遵守 SSE 语法。请参阅[服务器端扩展语法](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/sse-syntax.htm)。

### 数据加载脚本

* 您可以从 SSE 调用返回一个表，并使用 Qlik Sense 数据加载脚本中的 LOAD ... EXTENSION 语句从分析连接加载数据。您可以向模型发送单个表，然后返回单个数据表。

* 当您在 Qlik Sense 数据加载脚本中使用SSE函数（LOAD ... EXTENSION 语句除外）时，基数将被保留，并返回一列。

* 来自任何其他加载语句例如 Load ... From ... 的 SSE 函数调用只支持标量和聚合函数类型。这意味着包含 n 行数据将导致对模型的 n 次调用，除非您将数据聚合为单个调用。

* 将在分析连接中自动检测数据类型。如果数据没有数值以及至少一个非 NULL 文本字符串，则字段被视为文本。在其他任何情况下中，其将被视为数字。可以通过用 String() 或 Mixed() 包装字段名来强制数据类型。String() 强制字段为文本。如果字段是数字，则会提取双重值的文本部分，不会执行转换。 Mixed() 强制字段为双。

### 图表表达式

* 图表表达式不能使用从 SSE 函数调用已返回的表。当您在图表表达式中使用 SSE 函数时，基数将被保留，并且只有返回的第一列将被 Qlik Sense 使用。

### 引用数据连接的空间

如果要将应用程序或脚本发布到托管空间，或者希望 SSE 请求引用当前空间中的连接，请使用相对语法。或者，使用对特定空间名称的引用来配置请求。这些概念在加载脚本和图表表达式中都很重要。

有关使用空间感知语法的更多信息，请参阅：

* [连接到加载脚本中的数据源](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/connect-data-sources-data-load-editor.htm)

* [受管空间中应用程序的数据源](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Spaces/app-data-managed-spaces.htm)

#### 示例 1：加载脚本中的相对空间语法

以下示例是加载脚本中从连接到分析连接的示例。代码已被修改成指向应用程序或脚本当前空间中的连接。这是通过在连接名称的开头添加一个冒号来完成的（在本例中为“`:Amazon_Titan_(Amazon_Bedrock)`”）。如果没有这个冒号，引用将指向运行重新加载的用户（或重新加载计划所有者）的个人空间中的连接。

```
EXTENSION endpoints.ScriptEval('{"RequestType":"endpoint", "endpoint":{"connectionname":":Amazon_Titan_(Amazon_Bedrock)"}}', QuestionsTable{Question_ID,Question});
```

在将应用程序或脚本发布到也包含分析连接的托管空间之前，可以使用这种空间感知语法。

#### 示例 2：图表表达式中的相对空间语法

以下示例是一个图表表达式，其中包含对当前空间中连接的引用。这是通过在连接名称的开头添加一个冒号来完成的（在本例中为“`:Amazon_Titan_(Amazon_Bedrock)`”）。如果没有这个冒号，引用将指向运行重新加载的用户（或重新加载计划所有者）的个人空间中的连接。

```
if(vQuestion <> '', endpoints.scriptAggrStr('{"RequestType":"endpoint", "endpoint":{"connectionname":":Amazon_Titan_(Amazon_Bedrock)","column":"outputText"}}',vQuestion))
```

在将应用程序或脚本发布到也包含分析连接的托管空间之前，可以使用这种空间感知语法。

#### 示例 3：加载脚本中的硬编码空间语法

如果希望对分析连接的引用仅在特定空间中起作用，则可以对表达式进行硬编码，使其包含对该空间的直接引用。如果不包括空间名称（也省略了添加到示例 1 和 2 中的冒号），则语法将硬编码为引用运行重新加载的用户（或重新加载计划所有者）的个人空间中的连接。

如果使用选择数据向导添加加载语句，则会自动使用此语法。

```
EXTENSION endpoints.ScriptEval('{"RequestType":"endpoint", "endpoint":{"connectionname":"My_Shared_Space:Amazon_Titan_(Amazon_Bedrock)"}}', QuestionsTable{Question_ID,Question});
```

在这种情况下，引用指向名为 My\_Shared\_Space 的空间中的连接。

#### 示例 4：图表表达式中的硬编码空间语法

该示例与示例 3 相似。如果不包括空间名称（也省略了添加到示例 1 和 2 中的冒号），则语法将硬编码为引用运行重新加载的用户（或重新加载计划所有者）的个人空间中的连接。

```
if(vQuestion <> '', endpoints.scriptAggrStr('{"RequestType":"endpoint", "endpoint":{"connectionname":"My_Shared_Space:Amazon_Titan_(Amazon_Bedrock)","column":"outputText"}}',vQuestion))
```

在这种情况下，引用指向名为 My\_Shared\_Space 的空间中的连接。