SnapLogic如何利用Amazon Bedrock构建了一个文本转换应用程序,将商业意图转化为行动

SnapLogic如何利用Amazon Bedrock构建文本转换应用程序,实现商业意图转化

这篇文章与SnapLogic的首席科学家Greg Benson、高级产品经理Aaron Kesler和企业解决方案架构师Rich Dill共同撰写。

许多客户正在使用Amazon Bedrock和Amazon CodeWhisperer构建生成性人工智能应用程序,以基于自然语言创建代码构件。这个用例突出显示了大型语言模型(LLMs)如何能够成为人类语言(英语、西班牙语、阿拉伯语等)与机器可解释语言(Python、Java、Scala、SQL等)之间的翻译者,以及复杂的内部推理。这种新兴的LLMs能力促使软件开发人员将LLMs用作自动化和用户体验增强工具,将自然语言转化为特定领域语言(DSL):系统指令、API请求、代码构件等。在本文中,我们将向您展示SnapLogic,一个亚马逊网络服务(AWS)客户,如何使用Amazon Bedrock为其SnapGPT产品提供动力,通过自动从人类语言中创建这些复杂DSL构件。

当客户从LLMs创建DSL对象时,生成的DSL要么是现有界面数据和模式的完全复制品,要么是派生版本,形成了UI和后端服务中业务逻辑之间的合约。这种模式在独立软件供应商(ISVs)和软件即服务(SaaS)ISVs中特别流行,因为他们以独特的方式通过代码表示配置,并希望简化其客户的用户体验。示例用例包括:

  • 将自然语言转换为特定工具的可视化和计算表达式,正如在Amazon QuickSight中最近宣布的生成性商业智能功能中所看到的。
  • 基于各个用户意图和上下文,在最佳效能的SaaS应用程序集成中生成正确的API调用,正如在AWS AppFabric中即将推出的生产力功能中所看到的。
  • 使用简单的人类提示创建复杂的集成管道,您将在本文中了解更多相关信息。

在AWS上使用LLMs构建和扩展文本到管道应用程序的最简单方法是使用Amazon Bedrock。Amazon Bedrock是使用基础模型(FMs)构建和扩展生成性人工智能应用程序的最简单方法。它是一个完全托管的服务,通过单个API提供访问来自领先人工智能公司的高性能基础FMs的选择,以及构建生成性人工智能应用程序所需的广泛功能,包括隐私和安全保护。Anthropic是一家AI安全和研究实验室,致力于构建可靠、可解释和可控的AI系统,是一个提供他们最先进的LLM Claude在Amazon Bedrock上访问的领先AI公司之一。Claude是一个LLM,在周到的对话、内容创作、复杂推理、创造力和编码方面表现出色。Anthropic提供Claude和Claude Instant模型,所有这些模型都可以通过Amazon Bedrock获得。Claude因其改进的推理能力在这些文本到管道应用程序中迅速赢得了广泛关注,这使得它在模糊技术问题解决方面表现出色。Amazon Bedrock上的Claude 2支持一个10万标记的上下文窗口,相当于约200页的英文文本。这是在构建需要复杂推理、详细说明和全面示例的文本到管道应用程序时可以依赖的一个特别重要的功能。

SnapLogic背景

SnapLogic是亚马逊网络服务(AWS)的客户,致力于将企业自动化引入全球。SnapLogic智能集成平台(IIP)通过连接应用程序、数据库、大数据、机器和设备、API等与预构建的智能连接器Snaps实现组织的企业级自动化。SnapLogic最近推出了一个名为SnapGPT的功能,它提供了一个文本界面,您可以在其中用简单的自然语言输入所需的集成管道。SnapGPT使用Anthropic的Claude模型通过Amazon Bedrock自动创建这些集成管道代码,然后通过SnapLogic的旗舰集成解决方案使用。但是,SnapLogic之所以能够推出SnapGPT,是源于多年来在人工智能领域的运作经验。

SnapLogic的AI之旅

在集成平台领域,SnapLogic一直处于领先地位,利用人工智能的转变力量。多年来,该公司致力于通过人工智能进行创新,特别是当我们追溯从Iris到AutoLink的发展历程时,这一点变得明显。

与Iris的谦逊起点

2017年,SnapLogic推出了Iris,这是业界首个由人工智能驱动的集成助手。Iris旨在使用机器学习算法来预测构建数据管道的下一步。通过分析数百万个元数据元素和数据流,Iris能够向用户提供智能建议,实现数据集成的民主化,使即使对技术了解不深的人也能创建复杂的工作流程。

借鉴Iris的成功和经验教训,SnapLogic推出了AutoLink,这是一个旨在进一步简化数据映射过程的功能。使用AutoLink,手动在源系统和目标系统之间映射字段的繁琐任务变得轻而易举。借助人工智能,AutoLink自动识别并建议潜在匹配项。曾经需要几小时的集成现在可以在几分钟内完成。

SnapGPT的生成飞跃

SnapLogic在人工智能领域的最新尝试是SnapGPT,旨在进一步革新集成。借助SnapGPT,SnapLogic引入了世界上第一个生成式集成解决方案。这不仅仅是简化现有过程,而是彻底重新构想集成的设计方式。生成式人工智能的力量可以从头开始创建整个集成管道,根据所需的结果和数据特征优化工作流程。

SnapGPT对SnapLogic的客户非常有影响力,因为它们能够大大减少生成第一个SnapLogic管道所需的时间。传统上,SnapLogic的客户需要花费数天甚至数周的时间从头开始配置集成管道。现在,这些客户只需简单地向SnapGPT提出要求,例如“创建一个将我所有活跃的SFDC客户转移到WorkDay的管道。”为此客户自动创建了一份工作的初稿,大大缩短了创建集成管道基础所需的开发时间。这使最终客户可以将更多时间集中在对他们真正有业务影响力的事情上,而不是在集成管道的配置上工作。以下示例显示了SnapLogic客户如何使用SnapGPT功能输入描述以快速生成使用自然语言的管道。

在产品构建过程中,AWS和SnapLogic密切合作,并从中学到了很多东西。本文的余下部分将重点介绍AWS和SnapLogic在使用LLM进行文本到管道应用方面的技术学习。

解决方案概述

为了解决这个文本到管道问题,AWS和SnapLogic设计了一个全面的解决方案,如下所示的体系结构。

向SnapGPT发出请求经过以下工作流程:

  1. 用户提交请求描述。
  2. SnapLogic使用检索增强生成(RAG)方法检索与用户请求相似的SnapLogic管道的相关示例。
  3. 提取的相关示例与用户输入结合,在发送到Amazon Bedrock上的Claude之前进行一些文本预处理。
  4. Claude生成代表SnapLogic管道的JSON工件。
  5. JSON工件直接集成到核心SnapLogic集成平台。
  6. SnapLogic管道以直观友好的方式呈现给用户。

通过AWS和SnapLogic之间的各种实验,我们发现解决方案图中的提示工程步骤对于生成高质量的文本到管道输出非常重要。下一节将进一步介绍在该领域中与Claude一起使用的一些具体技术。

积极尝试

在SnapGPT的开发阶段中,AWS和SnapLogic发现对发送给Claude的提示进行快速迭代是提高SnapLogic输出中文本到流水线输出的准确性和相关性的关键开发任务。通过使用Amazon SageMaker Studio的交互式笔记本,AWS和SnapLogic团队能够使用Boto3 SDK连接到Amazon Bedrock,快速处理不同版本的提示。基于笔记本的开发使团队能够快速创建客户端连接到Amazon Bedrock,在Python代码中添加基于文本的描述以发送提示给Amazon Bedrock,并进行联合提示工程会议,迅速在多个角色之间进行迭代。

Anthropic Claude提示工程方法

在本节中,我们描述了一些我们用来创建基于用户请求的高性能提示的迭代技术:“创建一个使用ExampleCompany数据库并检索所有活跃客户的流水线。”请注意,此示例不是SnapGPT的架构所基于的模式,仅用于说明文本到流水线应用。

为了基准我们的提示工程,我们使用以下原始提示:

创建一个使用ExampleCompany数据库并检索所有活跃客户的流水线

预期输出如下:

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.customers WHERE status = 'active'"}

改进1:使用人类和助手的注释

Claude的训练过程教给了FM理解人类和助手对话的提示结构的能力。Claude用户可以通过在提示结尾处加上“Assistant:”来利用这个结构,这将触发Claude根据人类的发言生成查询的响应。请注意,因为Claude会持续生成文本直到被告知停止,请确保在使用Claude时在向Amazon Bedrock的API请求中使用一个停止序列“\n\nHuman:”。这将确保您只收到助手的响应,而不是对话链中人类的预测下一个响应。这些“\n\nHuman”和“\n\nAssistant”标识不仅有助于限制Claude的响应范围,还有助于在主要人类输入和其他交互的助手响应之间提供清晰的界定。这在少样本提示设置中特别有帮助,其中您可以具有多个查询和带有“\n\nHuman”标记的查询以及带有“\n\nAssistant”标记的先前响应。让我们看一下改进后的提示和通过Boto3 SDK向Amazon Bedrock的相关API调用。

我们使用以下提示:

人类:创建一个使用ExampleCompany数据库并检索所有活跃客户的流水线

助手:

输出如下:

以下是一个从ExampleCompany数据库检索所有活跃客户的MongoDB流水线:

pipeline = [    {        '$match': {            'database': 'ExampleCompany',             'status': 'active'        }    }]db.customers.aggregate(pipeline)

关键步骤如下:

– `$match` 用于筛选ExampleCompany数据库中状态为“active”的文档。

– `db.customers.aggregate()` 在customers集合上运行流水线并返回筛选结果。

因此,这将返回ExampleCompany数据库中状态字段设置为“active”的所有客户文档。

请注意,在输出中,Claude在没有任何上下文的情况下回答了我们的问题。这个答案可能有帮助,但它与我们要解决的问题不具体相关,因为它没有足够的上下文提供。还需要注意的是,在使用Claude模型时,Anthropic要求使用这种人类和助手的格式;如果不包括此步骤,Amazon Bedrock将返回错误。

改进2:在告知Claude该做什么之前,包含高度具体的上下文

克劳德在给予它任务的过程中,最好能提供关于它需要完成什么以及如何完成该任务的良好背景。在您告诉它任务之前,以下是一些提供给克劳德背景信息的示例:

  • 描述您希望克劳德履行的工作职能。通过这样做,您让克劳德以该工作的角色思考,或者更像是刚刚在这个特定职位上被雇用的员工。这将有助于克劳德从特定职位角度制定答案,减少答案中的幻觉和随机性。
  • 包含有关输出格式的技术细节。基础模型通常擅长跟随操作,因此要求克劳德在特定格式或架构中生成输出,并提供一个或多个示例,将帮助克劳德以正确的格式提供答案,减少对输出的过滤和后期处理的需求。以下提示中的示例显示了一个与预期输出匹配的虚构架构。

让我们结合这些建议改进我们最初的提示:

人类:您的工作是作为ETL流水线的专家。具体而言,您的工作是创建一个JSON表示的ETL流水线,该流水线将解决提供给您的用户请求。

JSON输出应遵循以下格式:

{  "database": "在此处填写您将要使用的数据库名称",  "query": "在此处放置用于解决当前任务的SQL表示"}

这是您的任务:创建一个使用ExampleCompany数据库的流水线,该流水线可以检索所有活跃客户

助理:

输出如下:

以下是从ExampleCompany数据库检索所有活跃客户的ETL流水线的JSON表示:

{  "database": "ExampleCompany",  "query": "SELECT * FROM customers WHERE status = 'active'"}

该流水线使用ExampleCompany数据库和一个SQL查询,从customers表中选择所有status为“active”的记录。

通过添加背景,模型现在能够基本上达到我们的答案。它现在知道如何构造输出,并且知道它需要编写一个SQL语句来解决任务。然而,您将注意到模型没有正确使用我们期望的ec_prod.customers命名法。还有改进的空间!请注意,在实践中,为了在文本到流水线的用例中获得高质量的结果,您需要包含比我们在此示例中提供的更多背景信息。

改进3:使用XML标记包含示例

Few-shot学习是提高FMs准确性的一种流行方法,当您有相关示例可以指导FM的任务时,这尤其重要。这在文本到流水线应用中尤为重要,因为这些高度特定的流水线输出通常不包含在任何公共数据集中,因为它们是特定于个别客户数据表示的。在使用克劳德时,您可以利用其对任意XML标记的内在知识,以few-shot格式提供这些示例。在以下改进的提示中,请注意运用了封装在<example> XML标记中的示例。此外,您可以使用缩写形式的人类和助理(H和A)来为克劳德提供上下文,而无需让它认为这些是已经发生的具体对话片段。

我们使用以下提示:

人类:您的工作是作为ETL流水线的专家。具体而言,您的工作是创建一个JSON表示的ETL流水线,该流水线将解决提供给您的用户请求。

JSON输出应遵循以下格式:

{  "database": "在此处填写您将要使用的数据库名称"  "query": "在此处放置用于解决当前任务的SQL表示"}

以下是一些用户请求的示例以及正确解决任务的关联输出JSON工件。如果您使用相同的数据库,请确保使用示例中提供的相同名称。

<example-1>

H:查询ExampleCompany数据库中客户#1234的任何活跃订单

A:

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.orders WHERE customer_id = 1234 AND status  = 'active'"}

这个查询的理由是,客户#1234被过滤,并且我们正在“orders”表中搜索任何现有记录以获取“active”过滤器之后的记录。

</example-1>

<example-2>

H:删除ExampleCompany数据库中在过去一个月内未活跃的所有客户

A:

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.customers WHERE status != 'active'"}

这个查询的理由是,“ec_prod.customers”表是ExampleCompany数据库中唯一包含客户记录的表。

</example-2>

这是您的任务:创建一个使用ExampleCompany数据库的流水线,该流水线可以检索所有活跃客户。

助理:

输出如下:

下面是从ExampleCompany数据库中检索所有活跃客户的ETL流水线的JSON表示:

{
  "database": "ExampleCompany",
  "query": "SELECT * FROM ec_prod.customers WHERE status = 'active'"
}

推理如下:

将ExampleCompany数据库指定为要使用的数据库

ec_prod.customers表包含客户数据

状态字段表示客户是否活跃,因此查询仅过滤活跃客户

这将从ExampleCompany数据库检索所有活跃的客户记录。如果您需要任何澄清或对ETL流水线有其他要求,请告诉我!

JSON输出现在具有正确的数据库命名法,Claude能够使用我们提供的示例来使用它。将人类和助手指示符与XML标记相结合,使Claude更容易理解任务和类似示例中的答案,其中明确区分了多个few-shot示例。Claude越容易理解,答案就会越好、更相关,进一步减少模型产生错误答案和提供随机无关答案的可能性。

改进4:使用XML标记触发Claude开始JSON生成

使用FMs的文本到流水线应用程序的一个小挑战是需要准确解析结果文本,以便在下游应用程序中将其解释为代码。通过利用Claude对XML标记的理解,并将其与自定义停止序列结合使用,可以解决这个问题。在以下提示中,我们已指示Claude使用<json></json> XML标记将输出括起来。然后,我们将<json>标记添加到提示的末尾。这确保了Claude输出的第一段文本将是JSON输出的开头部分。如果不这样做,Claude通常会先回答一些对话性的文本,然后是真实的代码响应。通过指示Claude立即开始生成输出,您可以在看到关闭的</json>标记时轻松停止生成。这在更新后的Boto3 API调用中显示出来。这种技术的好处有两个。首先,您能够准确解析Claude的代码响应。其次,您能够降低成本,因为Claude只生成代码输出,而没有多余的文本。这样可以降低Amazon Bedrock上的成本,因为您将根据所有FMs产生的输出标记计费。

我们使用以下提示:

您的工作是作为ETL流水线的专家。具体来说,您的工作是创建解决用户请求的ETL流水线的JSON表示。

JSON输出应遵循以下格式:

{
  "database": "在此处填入将要使用的数据库名称",
  "query": "在此处填入解决任务的SQL表示"
}

下面是一些用户请求和正确解决任务的关联输出JSON工件的示例。如果您使用相同的数据库,请确保使用示例中提供的相同术语。

<example-1>

H: 查询ExampleCompany数据库中客户#1234的任何活动订单

A:

<json>

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.orders WHERE customer_id = 1234 AND status  = 'active'"}

</json>

此查询的理由是客户#1234被筛选,并且我们正在“orders”表中搜索任何“active”筛选后的现有记录。

</example-1>

<example-2>

H: 删除ExampleCompany数据库中最近一个月未活跃的所有客户

A:

<json>

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.customers WHERE status != 'active'"}

</json>

此查询的理由是“ec_prod.customers”表是ExampleCompany数据库中唯一包含客户记录的表。

</example-2>

记得始终用<json></json>标记括起来您的JSON输出。

您的任务如下:创建一个使用ExampleCompany数据库的流水线,检索所有活跃客户。

助手:

<json>

我们使用以下代码:

body = json.dumps({"prompt": prompt, "stop_sequences": ['\n\n人类:', '</json>']})response = bedrock.invoke_model(   body=body,   modelId='anthropic.claude-v2')

输出结果如下:

{  "database": "ExampleCompany",  "query": "SELECT * FROM ec_prod.customers WHERE status = 'active'"}

现在我们已经得到了预期的输出,仅返回了JSON对象!通过使用这种方法,我们能够生成一个立即可用的技术工件,并通过减少输出标记来降低生成成本。

结论

要立即开始使用SnapGPT,请请求SnapLogic的免费试用版或请求产品演示。如果您想在今天开始使用这些概念构建应用程序,我们建议在本文的提示工程部分中进行实际操作,并在适合您的业务的不同DSL生成用例上使用相同的流程,并深入了解通过Amazon Bedrock提供的RAG功能。

SnapLogic和AWS能够有效合作,构建了一个高级的翻译器,将人类语言与由Amazon Bedrock驱动的SnapLogic集成流水线的复杂模式之间进行转换。在这个过程中,我们看到了如何使用特定的提示工程技术来改进Claude生成的文本到流水线应用程序。AWS和SnapLogic对于在生成式人工智能领域继续合作并期待未来的合作和创新充满激情。