大型语言模型 (LLM) 函数 (Snowflake Cortex)

Snowflake Cortex 让您可以即时访问行业中先进的大型语言模型 (LLMs),这些模型由 Mistral、Reka、Meta 和 Google 等公司的研究人员进行训练,其中包括 Snowflake Arctic,它是 Snowflake 开发的开放式企业级模型。

由于这些 LLMs 完全由 Snowflake 托管和管理,因此无需设置即可使用它们。您的数据保留在 Snowflake 中,为您提供期望的性能、可扩展性和治理。

Snowflake Cortex 功能以 SQL 函数的形式提供,而且也可用于 Python 中。下面汇总了可用的函数。

  • COMPLETE:在给定提示的情况下,返回完成提示的响应。此函数接受单个提示或具有多个提示和响应的对话。

  • EMBED_TEXT_768:在给定一段文本的情况下,返回一个表示该文本的 向量嵌入

  • EXTRACT_ANSWER:在给定问题和非结构化数据的情况下,如果可以在数据中找到该问题的答案,则返回该问题的答案。

  • SENTIMENT:返回一个从 -1 到 1 的情绪分数,表示在给定文本中检测到的正面或负面情绪。

  • SUMMARIZE:返回给定文本的摘要。

  • TRANSLATE:将给定文本从任何受支持的语言翻译成任何其他语言。

所需权限

SNOWFLAKE 数据库中的 CORTEX_USER 数据库角色包含了允许用户调用 Snowflake Cortex LLM 函数的权限。默认情况下,CORTEX_USER 角色被授予给 PUBLIC 角色。PUBLIC 角色会自动授予给所有用户和角色,从而允许您账户中的所有用户使用 Snowflake Cortex LLM 函数。

如果您不希望所有用户都拥有此权限,则可以撤消对 PUBLIC 角色的访问权限,并授予对特定角色的访问权限。

要从 PUBLIC 角色中撤消 CORTEX_USER 数据库角色,请使用 ACCOUNTADMIN 角色运行以下命令:

REVOKE DATABASE ROLE SNOWFLAKE.CORTEX_USER
  FROM ROLE PUBLIC;
Copy

然后,您可以有选择地提供对特定角色的访问权限。不能直接向用户授予 SNOWFLAKE.CORTEX_USER 数据库角色。有关更多信息,请参阅 使用 SNOWFLAKE 数据库角色。具有 ACCOUNTADMIN 角色的用户可以将此角色授予自定义角色,以允许用户访问 Cortex LLM 函数。在以下示例中,使用 ACCOUNTADMIN 角色,并通过您为此目的创建的账户角色 cortex_user_role 向用户 some_user 授予 CORTEX_USER 数据库角色。

USE ROLE ACCOUNTADMIN;

CREATE ROLE cortex_user_role;
GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE cortex_user_role;

GRANT ROLE cortex_user_role TO USER some_user;
Copy

您还可以通过特定用户组通常使用的现有角色,授予对 Snowflake Cortex LLM 函数的访问权限。(请参阅 用户角色。)例如,如果您创建了一个 analyst 角色(它被组织中的分析师用作默认角色),则可以使用一条 GRANT 语句,轻松地向这些用户授予对 Snowflake Cortex LLM 函数的访问权限。

GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE analyst;
Copy

可用性

Snowflake Cortex LLM 函数目前在以下区域可用。

函数
(模型)
AWS US 西部 2
(俄勒冈)
AWS US 东部 1
(弗吉尼亚北部)
AWS 欧洲中部 1
(法兰克福)
Azure 东部 US 2
(弗吉尼亚)
Azure 西欧
(荷兰)
COMPLETE
(llama3-8b)

COMPLETE
(llama3-70b)

COMPLETE
(snowflake-arctic)

COMPLETE
(reka-core)

COMPLETE
(reka-flash)

COMPLETE
(mistral-large)

COMPLETE
(mixtral-8x7b)

COMPLETE
(llama2-70b-chat)

COMPLETE
(mistral-7b)

COMPLETE
(gemma-7b)

EMBED_TEXT_768
(e5-base-v2)

EMBED_TEXT_768
(snowflake-arctic-embed-m)

EXTRACT_ANSWER

SENTIMENT

SUMMARIZE

TRANSLATE

成本注意事项

Snowflake Cortex LLM 函数根据处理的词元数产生计算成本。请参阅 消耗表,以了解每个函数的每百万个词元消耗的 credit 成本。

备注

在 2024 年 6 月 3 日之前,使用 Snowflake Arctic 不会产生计算成本。

词元是 Snowflake Cortex LLM 函数处理的最小文本单位,大约等于四个字符的文本。原始输入或输出文本与词元的等价性可能因模型而异。

  • 对于在响应中生成新文本的函数(COMPLETE、SUMMARIZE 和 TRANSLATE),输入和输出词元都被计数。

  • 对于 EMBED_TEXT_768 函数,仅输入词元被计数。

  • 对于仅从输入中提取信息的函数(EXTRACT_ANSWER 和 SENTIMENT),仅输入词元被计数。

  • 对于 EXTRACT_ANSWER,可计费词元的数量是 from_textquestion 字段中的词元数量之和。

  • SUMMARIZE、TRANSLATE、EXTRACT_ANSWER 和 SENTIMENT 会向输入文本添加提示,以生成响应。因此,输入词元计数略高于您提供的文本中的词元数。

Snowflake 建议在使用较小仓库(不大于 MEDIUM)的情况下执行调用 Snowflake Cortex LLM 函数的查询,因为较大的仓库不会提高性能。在执行调用 Snowflake Cortex LLM 函数的查询时,与保持仓库活动相关的成本将继续适用。有关计算成本的一般信息,请参阅 了解计算成本

跟踪 AI 服务的成本

要跟踪账户中用于 AI 服务(包括 LLM 函数)的 credit,请使用 METERING_HISTORY 视图

SELECT *
  FROM snowflake.account_usage.metering_daily_history
  WHERE SERVICE_TYPE='AI_SERVICES'
Copy

使用量配额

为确保所有 Snowflake 客户都可以访问 LLM 功能,Snowflake Cortex LLM 函数在高使用率期间可能会受到限流。使用量配额不会在账户级别应用。

受到限流的请求将收到一个 错误响应,并应稍后重试。

备注

没有有效支付方式的按需 Snowflake 账户(例如试用账户)在使用 Snowflake Cortex LLM 函数方面会受到限制,即每天只能使用大约一个 credit。要取消此限制,请 将试用账户转为付费账户

管理成本和限流

在调用 Snowflake Cortex LLM 函数时,Snowflake 建议使用不大于 MEDIUM 的仓库。使用不必要的较大仓库不会提高性能,但可能会导致不必要的成本和更高的限流风险。由于产品更新在即,此建议将来可能不适用。

模型限制

Snowflake Cortex 使用的模型具有大小限制,如下表所述。大小以词元数指定。词元通常对应于单词,但并非所有词元都是单词,因此限制对应的单词数略小于词元数。超过限制的输入将导致错误。

函数

模型

上下文窗口(词元)

COMPLETE

snowflake-arctic

4,096

mistral-large

32,000

reka-flash

100,000

reka-core

32,000

mixtral-8x7b

32,000

llama2-70b-chat

4,096

llama3-8b

8,000

llama3-70b

8,000

mistral-7b

32,000

gemma-7b

8,000

EMBED_TEXT_768

e5-base-v2

512

snowflake-arctic-embed-m

512

EXTRACT_ANSWER

Snowflake 托管模型

2,048(对于文本)
64(对于问题)

SENTIMENT

Snowflake 托管模型

512

SUMMARIZE

Snowflake 托管模型

32,000

TRANSLATE

Snowflake 托管模型

1,024

选择模型

Snowflake Cortex COMPLETE 函数支持多种不同功能、延迟和成本的模型。 这些模型经过精心挑选,符合常见的客户用例。要实现最佳的 每 credit 性能,请选择与任务的内容大小和复杂性正确匹配的模型。以下是可用模型的简要概述。

大型模型

如果不确定从哪里开始,请先尝试功能最强大的模型,以建立基准来评估其他模型。reka-corellama3-70bmistral-large 是 Snowflake Cortex 提供的最强大的模型,将让您很好地了解先进的模型可以做什么。

  • reka-core 是 Reka AI 先进的大型语言模型,具有较强的推理能力、代码生成能力和多语种流利度。

  • llama3-70b 是一种开源模型,提供先进的性能,非常适合聊天应用程序、内容创建和企业应用程序。

  • mistral-large 是 Mistral AI 先进的大型语言模型,具有极强的推理能力。Mistral Large 非常适合需要大推理量能力或高度专业化的复杂任务,例如合成文本生成、代码生成或代理。

中型模型

  • snowflake-arctic 是 Snowflake 侧重于企业的一流 LLM。Arctic 擅长执行企业任务,例如 SQL 生成、编码和指令遵循基准测试。

  • reka-flash 是一种功能强大的多语种语言模型,针对需要高质量的快速工作负载进行了优化,例如编写产品描述或博客文章、编码以及从数百页的文档中提取答案。

  • mixtral-8x7b 非常适合文本生成、分类和问答用途。Mistral 模型针对低延迟和低内存要求进行了优化,从而能为企业用例带来更高吞吐量。

  • llama2-70b-chat 非常适合需要低到中等推理量的任务,例如提取数据或帮助您撰写职位描述。

小型模型

  • llama3-8b 非常适合需要低到中等推理量且准确性高于 llama2-70b-chat 的任务,如文本分类、摘要和情绪分析。

  • mistral-7b 非常适合需要快速完成的最简单的摘要、结构化和问答任务。它通过其 32K 上下文窗口为多页文本提供低延迟和高吞吐量处理。

  • gemma-7b 适用于简单的代码和文本完成任务。它提供 8,000 个词元的上下文窗口,但在该限制内功能惊人强大,而且成本效益极高。

下表介绍了常见模型在各种基准测试中的表现,包括 Snowflake Cortex COMPLETE 提供的模型和其他一些常见模型。

模型

上下文窗口
(词元)
MMLU
(推理)
MT-Bench
(指令遵循)
HumanEval
(编码)
Spider 1.0
(SQL)

Snowflake Arctic

4,096

67.3

-

64.3

79.0

GPT 4 Turbo (https://openai.com/research/gpt-4)*

32,000

86.4

8.96

67

86.6

reka-core (https://arxiv.org/pdf/2404.12387)

32,000

83.2

-

76.8

-

llama3-70b (https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md)

8,000

82

-

81.7

80.2

mistral-large (https://mistral.ai/news/mistral-large/)

32,000

81.2

-

45.1

81

Claude 2 (https://www.anthropic.com/news/claude-2)*

100,000

78.5

8.06

71.2

-

reka-flash (https://arxiv.org/pdf/2404.12387)

100,000

75.9

8.2

72

-

mixtral-8x7b (https://mistral.ai/news/mixtral-of-experts/)

32,000

70.6

8.30

40.2

-

GPT 3.5 Turbo (https://openai.com/research/gpt-4)*

4,097

70

8.39

48.1

-

llama-2-70b-chat (link removed)

4,096

68.9

6.86

30.5

-

llama3-8b (https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md)

8,000

68.4

-

62.2

69.9

mistral-7b (https://mistral.ai/news/announcing-mistral-7b/)

32,000

62.5

6.84

26.2

-

gemma-7b (link removed)

8,000

64.3

-

32.3

-

llama2-7b (link removed)*

4,096

45.3

6.27

12.2

-

*仅供比较;在 Snowflake Cortex COMPLETE 中不可用。

LLM 函数概览

COMPLETE

在给定提示的情况下,指令遵循 COMPLETE 函数使用您选择的语言模型生成响应。在最简单的用例中,提示是一个字符串。您还可以为交互式聊天风格的用途提供包含多个提示和响应的对话,在这种形式的函数中,您还可以指定超参数选项来自定义输出的样式和大小。

COMPLETE 函数支持以下模型。不同的模型可以有不同的 成本

  • snowflake-arctic

  • mistral-large

  • reka-flash

  • reka-core

  • mixtral-8x7b

  • llama2-70b-chat

  • llama3-8b

  • llama3-70b

  • mistral-7b

  • gemma-7b

请参阅 COMPLETE (SNOWFLAKE.CORTEX),以了解语法和示例。

EMBED_TEXT_768

EMBED_TEXT_768 函数为给定的英语文本创建向量嵌入。要了解有关嵌入和向量比较函数的更多信息,请参阅 向量嵌入

有关语法和示例,请参阅 EMBED_TEXT_768 (SNOWFLAKE.CORTEX)

EXTRACT_ANSWER

EXTRACT_ANSWER 函数从文本文档中提取给定问题的答案。文档可以是简单的英语文档,也可以是半结构化 (JSON) 数据对象的字符串表示形式。

请参阅 EXTRACT_ANSWER (SNOWFLAKE.CORTEX),以了解语法和示例。

SENTIMENT

对于给定的英语输入文本,SENTIMENT 函数返回介于 -1 和 1 之间的情绪分数(其中 -1 表示最消极,1 表示最积极,接近 0 的值表示中性)。

请参阅 SENTIMENT (SNOWFLAKE.CORTEX),以了解语法和示例。

SUMMARIZE

SUMMARIZE 函数返回给定英语文本的摘要。

请参阅 SUMMARIZE (SNOWFLAKE.CORTEX),以了解语法和示例。

TRANSLATE

TRANSLATE 函数将文本从指定的或检测到的源语言翻译成目标语言。

请参阅 TRANSLATE (SNOWFLAKE.CORTEX),以了解语法和示例。

错误条件

Snowflake Cortex LLM 函数可能会生成以下错误消息。

消息

解释

too many requests

由于系统负载过大,请求被拒绝。请重试您的请求。

invalid options object

传递给函数的 options 对象包含无效的选项或值。

budget exceeded

超出了模型消耗预算。

unknown model "<模型名称>"

指定的模型不存在。

invalid language "<语言>"

指定的语言不受 TRANSLATE 函数支持。

max tokens of <计数> exceeded

请求超出了模型支持的最大词元数(请参阅 模型限制)。

all requests were throttled by remote service

由于使用率很高,请求已受到限流。请稍后再试。

将 Snowflake Cortex LLM 函数与 Python 一起使用

Snowflake Cortex LLM 函数可用于 Snowpark ML 版本 1.1.2 及更高版本。请参阅 安装 Snowpark ML,以了解有关设置 Snowpark ML 的说明。

如果在 Snowflake 之外运行 Python 脚本,则必须创建 Snowpark 会话才能使用这些函数。有关说明,请参阅 连接到 Snowflake

以下 Python 示例演示了如何对单个值调用 Snowflake Cortex LLM 函数:

from snowflake.cortex import Complete, ExtractAnswer, Sentiment, Summarize, Translate

text = """
    The Snowflake company was co-founded by Thierry Cruanes, Marcin Zukowski,
    and Benoit Dageville in 2012 and is headquartered in Bozeman, Montana.
"""

print(Complete("llama2-70b-chat", "how do snowflakes get their unique patterns?"))
print(ExtractAnswer(text, "When was snowflake founded?"))
print(Sentiment("I really enjoyed this restaurant. Fantastic service!"))
print(Summarize(text))
print(Translate(text, "en", "fr"))
Copy

您也可以对表列调用 LLM 函数,如下所示。此示例需要一个会话对象(存储在 session 中)和一个包含文本列 abstract_text 的表 articles,并会创建一个新列 ``abstract_summary``(包含摘要的汇总)。

from snowflake.cortex import Summarize
from snowflake.snowpark.functions import col

article_df = session.table("articles")
article_df = article_df.withColumn(
    "abstract_summary",
    Summarize(col("abstract_text"))
)
article_df.collect()
Copy

备注

高级聊天风格(多消息)形式的 COMPLETE 目前在 Python 中不受支持。

语言: 中文