Cortex Analyst REST API¶
使用此 API 通过自然语言查询来回答有关数据的问题。
发送消息¶
POST /api/v2/cortex/analyst/message
使用请求中提供的语义模型为给定的问题生成 SQL 查询。可以指定一个或多个模型;指定多个模型时,Cortex Analyst 选择最合适的模型。您可以进行多轮对话,在对话中可以基于之前问题提出后续问题。有关更多信息,请参阅 Cortex Analyst 中的多轮对话。
请求包括用户问题;而响应包括用户问题和分析师的回复。响应中的每条消息可以有多个不同类型的内容块。内容对象的 type
字段目前支持的三个值是:text
、suggestions
和 sql
。
响应可以在处理完成后立即发送,也可以在生成响应时逐步发送。
请求标头¶
标头 |
描述 |
---|---|
|
(必需)授权令牌。有关更多信息,请参阅 对服务器进行身份验证。 |
|
(必需)应用程序/json |
|
(可选)授权令牌类型。默认为 OAuth。有关更多信息,请参阅 对服务器进行身份验证。 |
请求正文¶
请求正文包含说话者的角色(必须是 user
)、用户的问题和语义模型 YAML 文件的路径。用户问题包含在一个 content
对象中,该对象具有两个字段,分别为 type
和 text
。text
也是字段 type
的唯一允许值。
字段 |
描述 |
---|---|
|
(必需)用于创建消息的实体的角色。目前仅支持 类型:string:enum 示例: |
|
(必需)作为消息一部分的内容对象。 类型:对象
|
|
(必填)内容类型。目前仅支持 类型:string:enum 示例: |
|
(必填)用户的问题。 类型:字符串 示例: |
|
语义模型 YAML 文件的路径。必须是一个包括数据库和架构的完全限定的暂存区 URL。您可以改为在 类型:字符串 示例: |
|
包含整个语义模型 YAML 的字符串。您可以改为在 类型:字符串 |
|
一个包含 JSON 对象的数组,其中每个对象都包含一个 此功能简化了用户与 Cortex Analyst 的交互。用户无需选择要查询的数据源,也不必跟踪每个数据源使用的语义模型。只需在每个查询中指定所有模型,然后让 Cortex Analyst 找出要使用的模型即可。 类型:数组 小技巧 Cortex Analyst 不要求您指定多个模型。如果您指定单一模型,则该请求在功能上等同于包含顶级 |
|
(可选)如果设置为 类型:布尔 |
重要
您必须在请求正文中提供 semantic_model_file
、semantic_model
或 semantic_models
。
示例¶
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "which company had the most revenue?"
}
]
}
],
"semantic_model_file": "@my_db.my_schema.my_stage/my_semantic_model.yaml"
}
非流式传输响应¶
此操作可以返回下面列出的响应代码。响应始终具有以下结构。目前,响应支持三种内容类型:text
、suggestion
和 sql
。内容类型 suggestion
和 sql
互斥,因此,如果响应包含 sql
内容类型,则不会包含 suggestion
内容类型,反之亦然。suggestion
内容类型仅在用户问题不明确且 Cortex Analyst 无法为查询返回 SQL 语句时才会包含在响应中。
当请求包含 semantic_models
字段时,响应会包含 semantic_model_selection
字段,指明为请求选择了哪种语义模型。
为确保向前兼容性,请确保实施考虑了内容类型并可处理类型。
代码 |
描述 |
---|---|
200 |
语句已成功执行。 响应正文包含一个消息对象,该对象包含以下字段:
|
默认情况下,在 Cortex Analyst 完全处理用户的问题后,立即返回完整的响应。有关流式传输模式响应的格式,请参阅 流式传输响应。
{ "request_id": "75d343ee-699c-483f-83a1-e314609fb563", "message": { "role": "analyst", "content": [ { "type": "text", "text": "We interpreted your question as ..." }, { "type": "sql", "statement": "SELECT * FROM table", "confidence": { "verified_query_used": { "name": "My verified query", "question": "What was the total revenue?", "sql": "SELECT * FROM table2", "verified_at": 1714497970, "verified_by": "Jane Doe" } } } ] }, "warnings": [ { "message": "Table table1 has (30) columns, which exceeds the recommended maximum of 10" }, { "message": "Table table2 has (40) columns, which exceeds the recommended maximum of 10" } ] }
流式传输响应¶
流式传输模式允许您的客户端在 Cortex Analyst 生成响应时即可接收响应,而不是等待整个响应生成。这提高了应用程序的感知响应能力,尤其是长时间运行的查询,因为用户可以更快地看到输出。流式传输响应还提供状态信息,可以帮助您了解在哪里 Cortex Analyst 正在生成响应和警告,帮助了解在 Cortex Analyst 未按预期工作时出现了什么问题。
要接收流式传输响应,请将请求正文中的 stream
字段设置为 true
。流式传输响应使用 服务器发送事件 (https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)。
Cortex Analyst 在流式传输响应中发送五种不同类型的事件:
status
:传达有关 SQL 生成过程的状态更新。message.content.delta
:包含一段响应。此事件会多次发送。error
:表示 Cortex Analyst 遇到了错误,无法继续处理请求。不会发送更多message.content.delta
事件。warnings
:在响应结束时发送,以传达处理过程中遇到的任何警告。警告不会停止处理。done
:已发送,表示处理已完成,不会发送其他message.content.delta
事件。
其中,message.content.delta
事件最需要理解,因为它们包含实际的响应内容。每个 delta
包含来自完整响应中某个字段的词元。每个 delta
事件可能包含单个字符到完整响应之间的任意字符,并且它们的长度可能不同。您在这些词元生成时即可收到它们;您可以自行将它们组合成最终的响应。
重要
来自不同响应(甚至是极其相似的响应)的事件可能会有所不同。不能保证活动将以相同的顺序或相同的内容发送。
简单示例¶
以下是简单查询的非流式传输响应示例:
{
"message": {
"role": "analyst",
"content": [
{
"type": "text",
"text": "This is how we interpreted your question and this is how the sql is generated"
},
{
"type": "sql",
"statement": "SELECT * FROM table"
}
]
}
}
这是该响应可能发生的一系列流式传输事件(也可能一系列不同的事件):
event: status
data: { status: "interpreting_question" }
event: message.content.delta
data: {
index: 0,
type: "text",
text_delta: "This is how we interpreted your question"
}
event: status
data: { status: "generating_sql" }
event: status
data: { status: "validating_sql" }
event: message.content.delta
data: {
index: 0,
type: "text",
text_delta: " and this is how the sql is generated"
}
event: message.content.delta
data: {
index: 1,
type: "sql",
statement_delta: "SELECT * FROM table"
}
event: status
data: { status: "done" }
使用 message.content.delta
响应中的 index
字段,确定该事件属于完整响应中的哪个字段。例如,这里前两个 delta
事件使用索引 0,这意味着它们属于非流式传输响应的 content
数组中的第一个字段(元素 0)。同样,包含 SQL 响应的 delta
事件使用索引 1。
带建议的示例¶
此示例包含针对模糊问题的建议问题。以下是非流式传输响应:
{
"message": {
"role": "analyst",
"content": [
{
"type": "text",
"text": "Your question is ambigous, here are some alternatives:"
},
{
"type": "suggestions",
"suggestions": [
"which company had the most revenue?",
"which company placed the most orders?"
]
}
]
}
}
以下是构成该响应的一系列可能的流式传输事件:
event: status
data: { status: "interpreting_question" }
event: message.content.delta
data: {
index: 0,
type: "text",
text_delta: "Your question is ambigous,"
}
event: status
data: { status: "generating_suggestions" }
event: message.content.delta
data: {
index: 0,
type: "text",
text_delta: " here are some alternatives:"
}
event: message.content.delta
data: {
index: 1,
type: "suggestions",
suggestions_delta: {
index: 0,
suggestion_delta: "which company had",
}
}
event: message.content.delta
data: {
index: 1,
type: "suggestions",
suggestions_delta: {
index: 0,
suggestion_delta: " the most revenue?",
}
}
event: message.content.delta
data: {
index: 1,
type: "suggestions",
suggestions_delta: {
index: 1,
suggestion_delta: "which company placed",
}
}
event: message.content.delta
data: {
index: 1,
type: "suggestions",
suggestions_delta: {
index: 1,
suggestion_delta: " the most orders?",
}
}
event: status
data: { status: "done" }
在此示例中,非流式响应的 content
字段是一个数组。content
的元素之一是 suggestions
数组。因此,text
和 suggestions
delta 事件的 index
字段的含义是指这两个不同数组中元素的位置。在组建完整响应时,您需要单独跟踪这些索引。
备注
当前,生成的 SQL 语句总是在单个事件中发送。将来可能不是这样。您的客户端必须做好在多个事件中收到 SQL 语句的准备。
其他示例¶
您可以在 Cortex Analyst GitHub 存储库 (https://github.com/Snowflake-Labs/sfguide-getting-started-with-cortex-analyst/blob/main/cortex_analyst_streaming_demo.py) 中为 Cortex Analyst 找到 Streamlit 流式传输客户端。此演示必须在本地运行;目前 SiS 不支持流式传输。
请参阅 AI/ML Studio 中(在 Snowsight 中)的 Cortex Analyst Playground,了解流式传输响应的交互式演示。
流式传输事件架构¶
以下是流式传输响应中 Cortex Analyst 发送的事件的 OpenAPI/Swagger 架构。
- status
- message.content.delta
- error
StreamingError: type: object properties: message: type: string description: A description of the error code: type: string description: The Snowflake error code categorizing the error request_id: type: string description: Unique request ID
- warnings
Warnings: type: object description: Warnings found while processing the request properties: warnings: type: array items: $ref: "#/components/schemas/Warning" Warning: type: object title: The warning object description: Represents a warning within a chat. properties: message: type: string description: A human-readable message describing the warning
发送反馈¶
POST /api/v2/cortex/analyst/feedback
提供定性最终用户反馈。在 Snowsight 中,反馈显示在 Monitoring 下方的 Semantic Model Admins 中。
请求标头¶
标头 |
描述 |
---|---|
|
(必需)授权令牌。有关更多信息,请参阅 对服务器进行身份验证。 |
|
(必需)应用程序/json |
请求正文¶
字段 |
描述 |
---|---|
|
(必填)您发送消息的请求 ID。在 类型:字符串 示例: |
|
(必填)反馈是积极的还是消极的。积极的或“点赞”为 类型:布尔 示例:
|
|
(可选)用户的反馈消息。 示例: |
响应¶
空响应正文,状态代码 200。
访问控制要求¶
有关所需权限的信息,请参阅 访问控制要求。
有关如何对 API 进行身份验证的详细信息,请参阅 使用 Snowflake 对 Snowflake REST APIs 进行身份验证。