原文:zh.annas-archive.org/md5/135d60e8e373a747ba1020367cf7a0bb

译者:飞龙

协议:CC BY-NC-SA 4.0

第六章:使用 Amazon Bedrock 生成和总结文本

在本章中,我们将探讨使用 Amazon Bedrock 生成和总结文本的架构模式。您将了解文本生成的应用以及文本生成如何与 Amazon Bedrock 合作。然后,我们将使用一些提示工程技术,包括上下文提示和 LangChain 的编排。之后,我们将探索使用短文本/文件进行文本摘要、总结长篇文章和书籍,并发现文本摘要的使用案例和模式。

到本章结束时,您将能够理解和实现使用 Amazon Bedrock 在实际用例中的文本生成和总结。

本章将涵盖以下关键主题:

  • 生成文本

  • 总结文本

  • 创建安全的无服务器解决方案

技术要求

本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 并创建一个。

其次,您需要安装和配置 AWS CLI (aws.amazon.com/cli/)。您将使用它从您的本地机器访问 Amazon Bedrock FMs。由于我们将要执行的多数代码单元都是基于 Python 的,此时设置 AWS Python SDK (Boto3) (docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将非常有帮助。您可以通过任何方式执行 Python 设置:在您的本地机器上安装它,使用 AWS Cloud9,利用 AWS Lambda,或者利用 Amazon SageMaker。如果您使用带有 AWS Python SDK 的 Jupyter Notebook 与 Amazon Bedrock 交互,请确保在笔记本中运行以下代码单元以导入必要的库并创建 Bedrock 运行时客户端:

#Ensure you have the latest version of boto3 & langchain
!pip install -U boto3 langchain-community
#import the main packages and libraries
import boto3
import json
#Create bedrock runtime client
bedrock_client = boto3.client('bedrock-runtime') #Select the desired region

注意

调用和定制 Amazon Bedrock 的 FMs 将产生相关费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。

生成文本

文本生成在各个领域都发挥着至关重要的作用,从市场营销和广告到新闻业和创意写作。这种技术的意义在于其能够简化内容创作流程,提高生产力,并开启新的创意领域。

文本生成的一个关键优势是其能够节省宝贵的时间和资源。传统的内容创作方法可能耗时且劳动密集,通常需要大量的研究、写作和编辑工作。但通过使用生成式 AI 模型,企业和个人可以快速生成初稿、大纲或完整的内容,从而为其他任务腾出宝贵的时间。

此外,文本生成赋予内容创作者探索新的叙事途径和拓展其创造力的边界。通过提供起点或框架,这些工具可以激发新想法,并促进非传统叙事技巧或独特写作风格的探索。这种能力在原创性和独特性被高度重视的行业中尤其有价值,例如小说写作、广告活动或品牌故事讲述计划。

除了创意应用外,文本生成在需要大量信息和事实性内容的领域也具有巨大的潜力。例如,新闻报道、科学出版物、技术文档和文本生成可以帮助快速传播准确和最新的信息。通过利用庞大的数据存储库和专业知识,这些工具可以生成全面的报告、摘要或文章,确保相关信息能够迅速提供给目标受众。

此外,文本生成提供了令人兴奋的个性化和定制机会。通过分析用户偏好、人口统计信息和上下文数据,这些工具可以定制内容,使其与特定目标受众产生共鸣,增强参与度并加强与读者或客户的联系。

让我们详细看看文本生成在现实世界中的应用。

文本生成应用

虽然文本生成的应用无限,以下是一些示例以供参考:

  • 生成产品描述:Amazon Bedrock 的文本生成能力可以被用于为营销团队自动化创建产品描述。通过输入产品的特性、规格和关键优势,FM 可以生成引人入胜且 SEO 优化的描述,突出产品的独特卖点。这可以显著简化创建产品描述的过程,为营销团队节省时间和资源。

    生成的描述可以根据不同的目标受众、语气和风格偏好进行定制,确保在各种渠道上保持一致且引人入胜的品牌声音。此外,FM 可以定制现有的产品描述,使其能够学习和模仿期望的写作风格和格式。

  • 媒体文章和营销活动生成:Amazon Bedrock 的文本生成能力可用于创建媒体文章、博客文章和营销活动的高质量内容。通过提供相关信息、数据和指南,FM 可以生成结构良好且连贯的文章,可用于内容营销、思想领导或新闻传播。

    FM 可以在现有内容上进行训练,使其能够理解和模仿特定出版物或品牌的语气、风格和格式偏好。它还可以为营销活动生成吸引注意力的标题、引人入胜的引言和引人注目的行动号召(CTAs)。

  • 个性化电子邮件和消息撰写:Amazon Bedrock 可用于撰写个性化的电子邮件、消息和其他书面沟通,用于客户联系、营销活动,甚至内部沟通。通过利用客户数据和偏好,FM 可以生成高度定制和引人入胜的内容,提升客户体验并增加品牌忠诚度。

  • 医疗保健:临床文档是医疗保健的一个关键方面,但它可能耗时且容易出错。Bedrock 可以通过根据患者接触期间的对话或口述生成准确和全面的临床笔记来协助医疗保健专业人员简化笔记和文档过程。Amazon 还提供另一种名为AWS HealthScribe的服务,该服务由 Amazon Bedrock 提供支持,专门为此目的而设计。要了解更多关于 AWS HealthScribe 的信息,请访问aws.amazon.com/healthscribe/

    Bedrock 可用于生成针对个人独特健康状况、生活方式和偏好的个性化健康和福祉建议。通过分析来自各种来源的数据,例如电子健康记录(EHRs)、可穿戴设备和自我报告信息,Bedrock 可以提供针对饮食、锻炼、压力管理和预防保健的定制建议。

Amazon Bedrock 文本生成系统

如果您已经阅读了前面的章节,您可能已经尝试在 Amazon Bedrock 上生成文本。但为了提醒,一个简单的文本生成系统看起来是这样的:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_01.jpg

图 6.1 – 简单文本生成系统

您向模型提供提示并说类似于“为客服团队撰写一封电子邮件”的话。即使您没有提供任何上下文,模型也会为您生成一个示例电子邮件(如图6.2所示):

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_02.jpg

图 6.2 – 生成电子邮件

在您的 Jupyter Notebook 环境中使用 AWS Python SDK,运行以下示例脚本以调用 AI21 Jurassic 模型。请确保您首先导入必要的库并创建 Bedrock 运行时客户端,如技术要求部分所述:

prompt_data = """Human: Compose an email to a customer support team.
Assistant:
"""
body = json.dumps({"prompt": prompt_data, "maxTokens": 200})
modelId = "ai21.j2-mid-v1"  # change this to use a different version from the model provider
accept = «application/json»
contentType = «application/json»
response = bedrock_client.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get("body").read())
print(response_body.get("completions")[0].get("data").get("text"))

现在,根据您选择的模型,响应的结构和输出可能会有所不同。图 6.3显示了 AI21 Jurassic 模型的响应:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_03.jpg

图 6.3 – AI21 Jurassic 输出

在这里,我们提供了一个简单的提示,没有提供任何上下文或信息。现在,让我们继续探讨文本生成的先进架构模式,并了解上下文提示。

使用提示工程生成文本

在上一节中,我们查看了一种文本生成模式,我们没有向模型提供任何上下文或信息。让我们使用我们在 第三章 中了解到的某些提示工程技巧:

  • 零样本上下文提示:在这里,我们将以零样本的方式在提示中提供详细上下文:

    prompt = """
    
    Human: Write a descriptive and engaging travel guide section about a lesser-known but beautiful destination, capturing the local culture, cuisine, and must-see attractions in a way that inspires wanderlust.
    
    Assistant:"""
    
    body = json.dumps({"prompt": prompt,"max_tokens_to_sample": 500})
    
    modelId = "anthropic.claude-v2"  # change this to use a different version from the model provider
    
    accept = «application/json»
    
    contentType = «application/json»
    
    response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
    
    response_body = json.loads(response.get("body").read())
    
    print(response_body.get("completion"))
    

    运行前面的代码将生成类似于 图 6.4 中所示的一个响应:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_04.jpg

图 6.4 – 零样本上下文提示响应

在前面的场景中,我们使用了 Amazon Bedrock API – invoke_model – 并传递了提示、配置参数和模型 ID。如果您想了解更多关于可用的各种 Bedrock API,请鼓励您重新阅读 第二章

  • 少样本上下文提示:在这里,我们将在提示中提供一些示例,以便模型可以开始生成合理的延续:

    prompt = """
    
    Human: Here are some examples of product descriptions:
    
    Example 1:
    
    Product: Apple iPhone 13 Pro
    
    Description: The iPhone 13 Pro is a smartphone designed and manufactured by Apple Inc. It features a 6.1-inch Super Retina XDR display, a powerful A15 Bionic chip, and an advanced triple-camera system with improved low-light performance and 3x optical zoom. The phone also boasts 5G connectivity, longer battery life, and a durable Ceramic Shield front cover.
    
    Example 2:
    
    Product: Sony WH-1000XM4 Noise Cancelling Headphones
    
    Description: Experience exceptional audio quality with the Sony WH-1000XM4 Noise Cancelling Headphones. These over-ear headphones feature industry-leading noise cancellation technology, allowing you to immerse yourself in your music without distractions. The responsive touch controls and long-lasting battery life make them ideal for everyday use, while the comfortable design ensures hours of listening pleasure.
    
    Example 3:
    
    Product: Instant Pot Duo Crisp + Air Fryer
    
    Description: The Instant Pot Duo Crisp + Air Fryer is a versatile kitchen appliance that combines the functions of an electric pressure cooker, air fryer, and more. With its EvenCrisp technology, you can achieve crispy, golden results using little to no oil. The easy-to-use control panel and 11 built-in smart programs allow you to cook a wide variety of dishes with ease, making it a must-have for any modern kitchen.
    
    Your task: Generate a product description for the following product:
    
    Product: Sony A7 III Mirrorless Camera
    
    Assistant:"""
    
    body = json.dumps({"prompt": prompt, "max_tokens_to_sample": 500})
    
    modelId = "anthropic.claude-v2"
    
    accept = "application/json"
    
    contentType = "application/json"
    
    response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
    
    response_body = json.loads(response.get("body").read())
    
    print(response_body.get("completion"))
    

在这里,我们在提示中提供了三个示例,以告诉模型我们的响应应该是什么样子。然后,我们调用了模型来为 Sony A7 III 无反相机 生成产品描述。我们收到了 图 6.5 中所示的响应:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_05.jpg

图 6.5 – 少样本上下文提示响应

  • 在此情况下,使用 invoke_model API):

注意

在撰写本文时,我们使用了 langchain_community.llms 库来导入 Bedrock。然而,根据 LangChain 社区的更新,它可能容易发生变化。有关导入 LangChain 包的最新信息,请访问 python.langchain.com/v0.2/docs/integrations/platforms/

from langchain_community.llms import Bedrock
inference_modifier = {"max_tokens_to_sample": 4096, "temperature": 0.5, "top_k": 250, "top_p": 1, "stop_sequences": ["\n\nHuman"],}
llm = Bedrock(model_id="anthropic.claude-v2",  client=bedrock_client, model_kwargs=inference_modifier,)
response = llm("""
Human: Write a descriptive and engaging travel guide section about a lesser-known but beautiful destination, capturing the local culture, cuisine, and must-see attractions in a way that inspires wanderlust.
Assistant:""")
print(response)
Figure 6*.6*):

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_06.jpg

图 6.6 – 使用 LangChain 的零样本提示

  • 使用 LangChain 的上下文生成:在这里,我们在将提示发送到模型之前,将在我们的提示中提供指令和上下文:

    from langchain_community.llms import Bedrock
    
    inference_modifier = {'max_tokens_to_sample':4096, "temperature":0.5, "top_k":250, "top_p":1, "stop_sequences": ["\n\nHuman"]}
    
    llm = Bedrock(model_id = "anthropic.claude-v2", client = boto3_bedrock, model_kwargs = inference_modifier)
    
    from langchain.prompts import PromptTemplate
    
    product_description_prompt = PromptTemplate(   input_variables=["product_name", "product_category", "key_features"],
    
        template="""
    
    You are a professional copywriter tasked with creating an engaging and informative product description for a new Amazon product.
    
    Product Name: {product_name}
    
    Product Category: {product_category}
    
    Key Features: {key_features}
    
    Write a compelling product description that highlights the key features and benefits of the product, while keeping the tone engaging and persuasive for potential customers.
    
    Product Description:
    
    «»»
    
    )
    
    prompt = product_description_prompt.format(
    
        product_name="Smart Home Security Camera",
    
        product_category="Home Security",
    
        key_features="- 1080p HD video recording\n- Motion detection alerts\n- Two-way audio communication\n- Night vision capabilities\n- Cloud storage for recorded footage")
    
    response = llm(prompt)
    
    product = response[response.index('\n')+1:]
    
    print(product)
    

    在这个场景中,我们使用了 Bedrock 的 LangChain 实现。我们定义了一个用于创建产品描述的提示模板,并调用了 Anthropic Claude 模型来生成智能家用安全摄像头的描述。提示模板本质上是一个可重复使用的模板,用于构建提示。在提示模板中,您可以提供上下文、输入变量、任务以及一些少样本示例供模型参考。要了解更多关于提示模板的信息,请访问 python.langchain.com/v0.2/docs/concepts/#prompt-templates

    下图显示了提供前面代码片段的响应:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_07.jpg

图 6.7 – 使用 LangChain 的上下文生成

现在我们已经探讨了各种文本生成模式,让我们看看如何使用 Amazon Bedrock 进行摘要。

摘要文本

文本摘要是一项高度需求的能力,在各个领域都具有巨大的价值。它涉及将长文本文档浓缩成简洁且连贯的摘要的复杂任务,这些摘要旨在保留最显著的信息,同时省略冗余或不相关的细节,从而实现高效的数据消费和理解。

文本摘要广泛应用于各个领域,从研究、学术界到新闻、商业智能和法律文件。随着每天产生的文本数据的指数级增长,对有效摘要技术的需求变得越来越迫切。想象一下,在大量的报告、新闻文章或法律文件中筛选——文本摘要成为提炼核心信息的有力工具,为专业人士和研究人员节省时间和认知努力。

让我们看看文本摘要的一些实际应用:

  • 内容整理:在当今信息丰富的世界中,文本摘要技术在整理和浓缩大量数据方面发挥着关键作用。这使得用户能够快速抓住长篇文章、报告或在线内容的精髓,而无需阅读每个单词。

  • 新闻聚合:新闻聚合器和媒体平台可以利用文本摘要技术提供突发新闻故事的简洁摘要,使用户能够了解最新的发展,而不会因详尽细节而感到困扰。

  • 研究辅助:研究人员和学者可以从文本摘要技术中受益,以快速从大量文献中识别最相关的信息,从而节省他们宝贵的时间和精力。

  • 客户服务:文本摘要可以通过自动生成长客户咨询或反馈的简洁摘要来增强客户服务,使支持代理能够快速理解问题的核心并提供及时响应。

  • 法律和金融领域:在准确呈现原始文本至关重要的行业,如法律或金融部门,文本摘要技术可以用于生成合同、协议或报告的摘要,确保关键信息不会被忽视。

  • 电子邮件管理:电子邮件客户端或生产力工具可以利用文本摘要技术提供长电子邮件线程或对话的简洁概述,帮助用户快速抓住要点,而无需阅读每条消息。

  • 会议回顾:文本摘要可以应用于会议记录或笔记,生成简洁的摘要,捕捉最重要的讨论、决策和行动项目,使参与者能够快速回顾并跟进关键点。

  • 社交媒体监控:企业和组织可以利用文本摘要来分析和总结大量的社交媒体数据,如客户反馈、产品评论或品牌提及,使他们能够了解公众情绪并迅速做出回应。

  • 知识提取:文本摘要技术可以用于从大型数据集或知识库中提取和总结相关知识,使其更容易访问和利用有价值的信息,用于各种应用,如决策或知识管理系统。

  • 教育资源:文本摘要技术可以应用于教育材料,如教科书或在线课程,以生成简洁的摘要或学习辅助工具,帮助学生更有效地掌握关键概念并准备考试。

虽然应用范围无限,涵盖了各行各业,但让我们看看摘要系统如何与 Amazon Bedrock 协同工作。我们将了解两种方法:

  • 小文件的摘要

  • 大文件的摘要

我们所说的“小文件”,是指可以适应模型上下文长度的文本片段。这可以是从几句话到几段文字不等。另一方面,“大文件”则是指那些信息量巨大,无法适应模型上下文长度的文档或书籍。需要注意的是,没有一种适用于所有模型的万能解决方案。每个模型及其不同版本可能具有不同的上下文长度。例如,Cohere Command R+的上下文长度为 128K 个标记,而 Cohere Command Light 的上下文长度为 4,000 个标记。

小文件的摘要

小文件可以包括会议记录、博客文章、新闻文章、电子邮件和通话记录。这些文件随后被用作提示的上下文并发送给模型。这里的提示可能非常简单,例如“摘要内容”。然后,模型将处理文件并提供摘要响应。图 6.8展示了小文件摘要的过程:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_08.jpg

图 6.8 – 小文件摘要

让我们以 Yahoo! Finance 的新闻文章为例。由于新闻文章可以适应模型的上下文长度,我们将将其作为提示中的上下文,即“摘要以下新闻文章”,并将其发送给模型。然后,模型将处理请求并提供摘要响应,如图6.9所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_09.jpg

图 6.9 – 新闻文章的摘要

在 Bedrock 中总结小文件有几种方法。如果你使用 AWS Python SDK,可以直接将小文件文本传递到提示中,如下面的代码所示。然而,如果你想总结几段文字,你可以利用 提示模板 将文本动态地放置在提示中,并使用 LangChain 调用模型:

prompt = """
Today we're going to take a look at the well-established Amazon.com, Inc. (NASDAQ:AMZN). The company's stock led the NASDAQGS gainers with a relatively large price hike in the past couple of weeks. The recent jump in the share price has meant that the company is trading at close to its 52-week high. With many analysts covering the large-cap stock, we may expect any price-sensitive announcements have already been factored into the stock's share price. But what if there is still an opportunity to buy? Let's take a look at Amazon.com's outlook and value based on the most recent financial data to see if the opportunity still exists.
Check out our latest analysis for Amazon.com
What's The Opportunity In Amazon.com?
Great news for investors – Amazon.com is still trading at a fairly cheap price. According to our valuation, the intrinsic value for the stock is $238.66, but it is currently trading at US$174 on the share market, meaning that there is still an opportunity to buy now. What's more interesting is that, Amazon.com's share price is quite volatile, which gives us more chances to buy since the share price could sink lower (or rise higher) in the future. This is based on its high beta, which is a good indicator for how much the stock moves relative to the rest of the market.
Can we expect growth from Amazon.com?
earnings-and-revenue-growth
earnings-and-revenue-growth
Future outlook is an important aspect when you're looking at buying a stock, especially if you are an investor looking for growth in your portfolio. Buying a great company with a robust outlook at a cheap price is always a good investment, so let's also take a look at the company's future expectations. With profit expected to more than double over the next couple of years, the future seems bright for Amazon.com. It looks like higher cash flow is on the cards for the stock, which should feed into a higher share valuation.
What This Means For You
Are you a shareholder? Since AMZN is currently undervalued, it may be a great time to accumulate more of your holdings in the stock. With a positive outlook on the horizon, it seems like this growth has not yet been fully factored into the share price. However, there are also other factors such as financial health to consider, which could explain the current undervaluation.
Are you a potential investor? If you've been keeping an eye on AMZN for a while, now might be the time to enter the stock. Its buoyant future outlook isn't fully reflected in the current share price yet, which means it's not too late to buy AMZN. But before you make any investment decisions, consider other factors such as the strength of its balance sheet, in order to make a well-informed investment decision.
Diving deeper into the forecasts for Amazon.com mentioned earlier will help you understand how analysts view the stock going forward. Luckily, you can check out what analysts are forecasting by clicking here.
If you are no longer interested in Amazon.com, you can use our free platform to see our list of over 50 other stocks with a high growth potential.
"""
body = json.dumps({"inputText": prompt,
                   "textGenerationConfig":{
                       "maxTokenCount":4096,
                       "stopSequences":[],
                       "temperature":0,
                       "topP":1
                   },
                  })
modelId = 'amazon.titan-tg1-large' # change this to use a different version from the model provider
accept = 'application/json'
contentType = 'application/json'
response = bedrock_client.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
print(response_body.get('results')[0].get('outputText'))

响应在 图 6.10 中显示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_10.jpg

图 6.10 – 小文件总结响应

我们已经将一篇新闻文章(finance.yahoo.com/news/us-174-time-put-amazon-110026932.html)从 Yahoo! Finance 解析出来,作为提示的样本上下文,并调用了 Titan 文本模型来生成总结的响应,如图中所示。

现在,让我们看看总结大文件的技术。

大文件的总结

大文件可以包括大量文档或书籍的信息,这些信息不适合模型的上下文长度。当我们说大文档时,这包括 10-K 报告、联邦公开市场委员会FOMC)报告、公共卫生报告、临床试验报告、电子杂志、服务文档等等。亚马逊的 10-K 报告就是一个大文件的例子:www.sec.gov/Archives/edgar/data/1018724/000101872424000008/amzn-20231231.htm

当处理用于总结文本的大文件时,会涉及几个挑战:

  • 上下文长度限制:所有 FM,例如在 Amazon Bedrock 中使用的 FM,都有一个它们可以一次性处理的最大上下文长度或输入大小。这个限制因模型而异,但通常在几千个标记(单词或词片段)的范围内。例如,你可以找到具有 200k 标记的 Anthropic Claude 3 系列的 FM。当处理超过这个上下文长度的文档时,就变得不可能准确和连贯地总结整个文档。模型可能会错过重要信息,或者无法捕捉到原始文本中存在的整体上下文和细微差别。

  • 幻觉:幻觉是一种现象,其中模型生成的输出不是基于输入数据,或者包含事实上的不一致。当处理大文档时,这个问题可能会更加普遍,因为模型可能难以保持连贯性和对原始文本的忠实度。随着输入大小的增加,模型可能会开始生成听起来合理但实际上错误的信息,这可能导致总结不准确。

  • 内存和计算限制:总结大文档可能非常耗费计算资源,并且可能需要大量的内存资源。生成式 AI 模型需要处理和存储整个输入文本,以及中间表示和生成的输出。当处理非常大的文档时,如果没有使用专门的计算能力来处理,可能会因为高计算需求而出现性能下降(参见第十二章中的配置吞吐量架构部分)。

  • 上下文理解:大文档通常包含复杂的结构,如章节、子章节和交叉引用。生成式 AI 模型可能难以准确捕捉和理解文档不同部分之间的关系和依赖。这可能导致摘要缺乏连贯性或无法准确代表原始内容的整体结构和流程。

  • 主题漂移和连贯性:随着输入文本长度的增加,模型在摘要过程中保持关注和连贯性变得更加困难。模型可能会偏离主要主题,或者无法正确连接和过渡到文档的不同方面,导致摘要缺乏连贯性或清晰度。

为了应对这些挑战,让我们看看如何使用 LangChain 来总结大文件。

使用 LangChain 的摘要链进行文本摘要

使用 LangChain,我们将大文件分解成更小、更易于管理的块,并按顺序处理它们。图 6.11展示了使用 LangChain 进行大文本摘要的架构:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_11.jpg

图 6.11 – LangChain 中的大文件摘要

这里是这个过程的工作原理:

  1. 数据摄取:这个过程的第一步是将一个大文档或文件加载到系统中。这涉及到从 Amazon S3 存储桶中加载文件或直接从互联网下载。您可以提供的文件可以是文本、PDF、Word 文档等多种形式。

  2. 根据 LangChain 文档的建议,RecursiveCharacterTextSplitter 适用于通用文本:python.langchain.com/v0.2/docs/how_to/recursive_text_splitter/.

    它递归地将文本分割成更小的块,直到每个块的大小低于指定的阈值。分割过程利用分隔符("\n\n""\n"),确保单个段落保持完整,而不是被分割到多个块中。

  3. stuff:正如其名所示,这个链将所有块填充到一个单独的提示中。

  4. map_reduce:map-reduce 链是一个强大的模式,允许您将一个大任务分解成更小的子任务,独立处理它们,然后将结果合并。在文本摘要的上下文中,这种链类型用于将长文本文档分解成更小的块,独立使用 LLM 对每个块进行摘要,然后将摘要合并成最终的摘要输出。

  5. refine:这个链首先对第一个块进行摘要。然后,refine将这个摘要与第二个块结合,生成一个新的摘要,包含这两部分信息。这个过程继续进行,最新的摘要与下一个块结合,生成一个新的摘要。这种迭代方法一直重复,直到所有块都被纳入最终的摘要中。

要加载这些摘要链中的任何一个,您可以调用load_summarize_chain并提供链类型:

from langchain.chains.summarize import load_summarize_chain
summary_chain = load_summarize_chain(llm=llm, chain_type="map_reduce", verbose=False)
  1. 最终摘要:基于您选择的摘要链,一旦所有块都已处理,最终的摘要代表了整个原始文档的浓缩版本。

github.com/aws-samples/amazon-bedrock-workshop/blob/main/06_OpenSource_examples/00_Langchain_TextGeneration_examples/05_long-text-summarization-titan%20Langchain.ipynb的笔记本中展示了使用 LangChain 进行长文本摘要的使用示例。在这个例子中,它使用map_reduce作为链类型。我们建议您尝试不同的链类型,并提供任何博客文章、文件或新闻文章作为提示。

现在我们已经使用 LangChain 链类型对大文件进行了摘要,假设我们想要摘要一本书或多本书的信息。在这种情况下,当需要总结大量手稿或书籍时,RAG 方法可能具有潜在的好处。但是请注意,摘要的响应可能不包含书籍的一些基本元素——换句话说,可能会有信息丢失。可以使用各种高级 RAG 技术,如查询细化,来检索摘要响应和文本中的基本元素。要了解更多关于 RAG 查询细化的信息,请参阅论文RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation (arxiv.org/html/2404.00610v1)。

要了解更多关于 RAG 如何工作以及一些高级 RAG 技术,请参阅第五章

接下来,我们将通过 Amazon Bedrock 知识库查看文本摘要。

Amazon Bedrock 知识库

第五章中,我们探讨了 Amazon Bedrock 知识库的工作原理以及如何设置它。让我们看看使用知识库进行摘要的示例。

我们已经将 Attention is All You Need 研究论文放入我们的数据存储 Amazon S3 存储桶,并将其与我们的 Bedrock 知识库同步,如图 图 6.12* 所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_12.jpg

图 6.12 – 知识库数据源

选择模型并提供一个提示来总结内容。您将看到 LLM 的响应,如图 图 6.13* 所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_13.jpg

图 6.13 – 测试知识库

如果您想通过 API 尝试,您可以调用 Retrieve API 或 RetrieveAndGenerate API。Retrieve API 访问并从知识库检索相关数据,而 RetrieveAndGenerate API 除了检索数据外,还根据检索到的结果生成响应。有关 Amazon Bedrock 知识库的更多详细信息,请参阅 第五章

在本节中,我们讨论了如何利用 Amazon Bedrock 中的文本摘要系统。总结小文件很简单,涉及利用模型的上下文长度。然而,总结大文件需要分块和专门的技巧,如 LangChain 的摘要链、RAG 或 Amazon Bedrock 知识库来处理上下文长度限制、幻觉、计算约束和连贯性问题。

既然我们已经了解了如何使用 Amazon Bedrock 生成和总结文本,那么让我们看看组织如何使用这些技术并创建一个涉及其他 AWS 服务的安全无服务器解决方案。

创建一个安全无服务器解决方案

当与 Amazon Bedrock 的生成式 AI 模型一起工作时,组织可以开发一个既安全又无服务器的应用程序。他们不必直接使用 SDK 与 Amazon Bedrock 交互,而是可以拥有一个交互式聊天机器人,该机器人抽象出任何复杂性,提供丰富的客户体验,并提高整体生产力。

图 6.14* 展示了用户如何通过 AWS Amplify 开发的基于 Web 的聊天机器人进行交互,进行对话,生成各种形式的文本,并执行语言翻译、文本摘要等操作:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_06_14.jpg

图 6.14 – 基于 Amazon Bedrock 的无服务器企业应用程序

让我们更仔细地看看这个过程:

  1. 用户与 AWS Amplify 中的聊天机器人交互:AWS Amplify 是一套全面的工具和服务,用于简化全栈云驱动型 Web 和移动应用程序的开发和部署。用户通过与使用 AWS Amplify 开发的 Web 应用程序中集成的聊天机器人交互来启动工作流程。

  2. 使用 Amazon Cognito 进行用户身份验证和授权:Amazon Cognito 是 AWS 提供的一项强大的用户身份管理服务。当用户与聊天机器人交互时,AWS 会与 Amazon Cognito 通信以执行用户身份验证和授权。Amazon Cognito 支持各种身份验证方法,包括传统的用户名/密码组合、社交身份提供者(例如,Google 或 Facebook)和多因素身份验证。它还提供用户注册、账户恢复和用户数据安全存储的功能。

  3. API 网关作为集中入口点:一旦用户经过身份验证和授权,他们的请求将通过 API 网关路由,该网关充当 API 的集中入口点。API 网关是一项完全托管的服务,简化了创建、发布、维护、监控和保障 API 的过程。

  4. 将请求发送到执行对 Amazon Bedrock LLMs 调用操作的 AWS Lambda 函数(例如,/text):

    1. 此 Lambda 函数将用户的输入或提示传递给 Amazon Bedrock LLMs 以生成相关且连贯的文本。例如,用户可以要求生成一封电子邮件或为特定目的地准备旅行行程。

    2. 一旦 Amazon Bedrock LLMs 生成了所需文本,Lambda 函数接收响应并通过 API 网关将其发送回用户。在这里,API 网关充当中介,促进客户端(即聊天机器人)与后端服务(Lambda 函数和 Amazon Bedrock LLMs)之间的通信。

  5. 将请求发送到专门设计用于执行对 Amazon Bedrock LLMs 总结任务调用操作的另一个 AWS Lambda 函数(例如,/summarize):

    1. 此 Lambda 函数执行对 Amazon Bedrock LLMs 的调用,根据用户的输入或提示和提供的上下文(小或大文件)总结文本。

    2. 在 Amazon Bedrock LLM 生成总结文本后,Lambda 函数接收响应并通过 API 网关将其发送回用户。

通过将文本生成和总结任务分别分配给不同的 Lambda 函数和 API 网关路由,应用程序可以高效地处理不同类型的请求,并利用 Amazon Bedrock LLMs 在每个任务中的专业能力。

此工作流程突出了 AWS 服务的灵活性和模块化特性,允许集成多个组件以构建复杂的应用程序。AWS Lambda 函数作为计算引擎,向 Amazon Bedrock LLMs 发起调用以执行文本生成和总结。

通过将应用程序分解为更小、更独立的组件,开发者可以轻松维护、更新和扩展系统的各个部分,而不会影响整个应用程序。

如果你好奇想要尝试使用 Amazon Bedrock 的无服务器聊天机器人,请查看github.com/aws-samples/amazon-serverless-chatbot-using-bedrock

到目前为止,你应该能够理解和实现使用 Amazon Bedrock 在实际用例中进行文本生成和总结。

摘要

在本章中,我们探讨了使用 Amazon Bedrock 生成和总结文本的架构模式。本章的第一部分涵盖了文本生成。我们通过提示工程技术、内联上下文训练和与 LangChain 的编排来探讨文本生成的根本原理。然后,我们探讨了可以应用于实际场景的各种文本生成用例和模式。

本章的第二部分涵盖了文本摘要。我们讨论了提取式和抽象式摘要方法及其相应的应用。此外,我们还考察了可以使用 Amazon Bedrock 进行文本摘要的系统和技术。

在下一章中,我们将探讨构建问答和对话界面的方法。

第七章:构建问答系统和对话界面

在本章中,我们将深入探讨问答(QA)和对话界面的领域,利用 Amazon Bedrock 的力量。本章从展示 Amazon Bedrock 在问答方面的实际应用案例开始,演示这项技术的实际应用和好处。随后,本章将涵盖小型和大型文档上问答的架构模式,为理解其底层机制提供坚实的基础。此外,还将解释对话记忆的概念,允许存储和利用聊天历史,从而实现更具情境意识和连贯性的对话。

本章还将深入探讨嵌入的概念及其在问答系统架构流程中的重要性。此外,我们将学习关于聊天机器人提示工程技术的知识,为您提供制作有效提示并提升其对话界面性能的技能。同时,还将讨论情境意识,解释如何开发能够无缝集成和利用外部文件和数据源的聊天机器人。

最后,我们将通过探讨对话界面的实际应用案例来结束本章节,展示这项技术在各个领域的多样应用和潜在影响。

本章将涵盖以下关键主题:

  • 问答概述

  • 使用 Amazon Bedrock 进行文档摄取

  • 对话界面

技术要求

本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 并创建一个 AWS 账户。

其次,您需要在创建账户后安装和配置 AWS CLI (aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的代码单元格大部分基于 Python,此时设置 Python 的 AWS SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)将非常有用。您可以通过以下方式执行 Python 设置 – 在您的本地机器上安装它,使用 AWS Cloud9,利用 AWS Lambda,或利用 Amazon SageMaker。

注意

使用 Amazon Bedrock 的 FMs 调用和定制将产生费用。有关更多信息,请参阅 aws.amazon.com/bedrock/pricing/

问答概述

问答系统旨在理解自然语言查询并根据给定上下文或知识源提供相关答案。这些系统利用先进的 NLP 技术和机器学习模型来理解用户问题的意图,从可用信息中提取最合适的响应。

让我们考虑一个典型问答系统的示例场景:假设你是某科技公司的内容创作者,需要向你的听众解释光学字符识别OCR)的概念。问答系统可以通过提供其知识库中的相关信息或分析与 OCR 相关的给定文本语料库来协助你完成这项任务。

这里是一个问答系统如何处理诸如“什么是光学字符识别用于什么?”这样的查询的例子:

  • 查询理解:系统首先分析查询以理解用户的意图并提取关键实体和概念。在这种情况下,它认识到查询询问的是光学字符识别的使用案例或应用。

  • 上下文检索:系统随后在其知识库或提供的文本语料库中搜索与 OCR 及其应用相关的相关信息。它可能识别出讨论 OCR 目的和实际用途的段落或段落。

  • 答案提取:在检索到相关上下文后,系统采用先进的 NLP 技术,如命名实体识别、关系提取和语义分析,以识别直接回答查询的最相关信息。它可能从文本中提取 OCR 的具体使用案例或应用。

  • 答案生成:最后,系统根据提取的信息编写一个简洁且自然流畅的答案。例如,它可能会以以下方式回应:

"Optical character recognition (OCR) is used to convert text in images, scanned documents, or handwritten text into machine-readable and editable text format. It has several applications, including:
Digitizing printed documents, books, and archives for easier storage and search.
Extracting text from images or photographs for indexing or further processing.
Automating data entry tasks by extracting information from forms, invoices, or receipts.
Enabling text-to-speech capabilities for visually impaired users.
Facilitating translation of text between languages by first converting it to editable format."

系统还可能提供额外的上下文、示例或相关信息,以增强用户对主题的理解。

从理论上讲,这一切看起来完美且简单直接。然而,让我们思考一下这种情况中的一些挑战。

由于这些问答系统旨在通过分析和从提供的数据或文本源中提取相关信息来自动生成响应,它们可能或可能不明确包含给定查询的完整答案。换句话说,系统从各种上下文中推断和组合不同信息的能力至关重要,因为完整的答案可能不在提供的单一、自包含的陈述中 readily available。

QA 提出了重大挑战,因为它要求模型深入理解查询背后的语义意义和意图,而不仅仅是依赖表面关键词匹配或模式识别。这种高级的语言理解能力对于准确识别构建合适响应所需的相关信息至关重要,即使查询和可用上下文之间的确切措辞或术语不同。

克服这些障碍对于开发能够进行流畅对话、提供准确信息并提升广泛领域和应用的用户体验的智能系统至关重要。

在撰写本文时,短短一段时间内就产生了大量的生成式 AI 用例。企业正在扩大其对话界面——聊天机器人和 QA 系统——的规模,目标是减少人工劳动并用自动化的生成式 AI 系统替换现有框架。

LLMs 和生成式 AI 技术最有希望的应用之一实际上是 QA。能够用自然语言提问并获得准确、相关的答案可能会改变我们与信息和计算机互动的方式。

潜在的 QA 应用

强健的 QA 系统在许多行业和领域中的应用范围非常广泛:

  • 客户服务:允许客户用自然语言提问,并接收定制化的帮助和故障排除,而不是搜索文档

  • 研究和分析:允许分析师和研究人员提出开放式探索性问题,以发现大型数据集中的见解

  • 教育:创建智能辅导系统,学生可以提出后续问题并接收符合其水平的解释

  • 知识管理:通过允许自然语言查询,使组织的数据、文档和流程更加易于访问

当然,与任何生成式 AI 系统一样,围绕事实准确性、安全性和潜在误用的担忧必须得到妥善解决,因为 QA 系统在开发和部署过程中必须谨慎处理。

尽管如此,通过自然语言查询打破人与信息之间障碍的能力代表了人工智能进步的关键前沿。随着在 Amazon Bedrock 上可用的 FMs,这些由 LLMs 驱动的 QA 系统为那个未来提供了一个令人兴奋的预览。

基于 Amazon Bedrock 的 QA 系统

企业级 QA 系统通常建立在最先进的 NLP 技术基础之上,包括 transformer 架构和迁移学习。它们应该被设计成理解人类语言的细微差别,使其能够理解复杂的查询并从各种数据源中提取相关信息。

Amazon Bedrock 的一个关键优势是它能够处理需要推理和推理的开放性问题。与传统依赖于预定义规则或模式的 QA 系统不同,Bedrock 可以理解潜在上下文,并根据其学习到的信息提供深思熟虑的响应。

在 Amazon Bedrock 上有大量的 FM(功能模块)可供选择,开发者、数据科学家或生成式 AI 爱好者可以构建能够潜在地擅长处理模糊性和不确定性的应用程序或服务。如果可用信息不完整或相互矛盾,这些引人入胜的应用程序可以提供反映其置信水平的响应,或者它们可以请求更多信息,使交互更加自然和人性化。

此外,Amazon Bedrock 具有高度的扩展性,可以轻松集成到各种应用程序和平台中,例如聊天机器人、虚拟助手和知识管理系统。其基于云的架构和高可用性确保它可以处理大量查询并适应不断变化的数据和用户需求。

无上下文 QA

在没有提供额外上下文或支持文档的情况下,QA 系统必须完全依赖其预训练的知识来生成响应。与提供上下文的情况相比,这种无上下文 QA 呈现出几个关键挑战。其中一些挑战如下:

  • 知识范围和完整性:当没有提供上下文时,QA 系统的知识完全来自其训练数据中存在的部分。这使得训练数据的范围和完整性变得极其重要。理想情况下,训练数据应涵盖广泛的主题,并具有事实准确性。然而,训练数据集可能存在空白、偏差或错误,这些随后会被编码到模型的认知中。

  • 查询正确知识:没有上下文来定位问题,QA 系统必须准确地将问题映射到其参数中相关的知识领域。这需要强大的自然语言理解能力来正确解释查询,识别关键实体/关系,并检索适当的事实知识来形成响应。

  • 幻觉:一个关键挑战是幻觉——当模型生成与训练数据相矛盾的错误信息时。没有基于上下文的限制,模型可能生成的信息种类就较少。幻觉可能从细微的错误到以高置信度呈现的完全虚构的输出都有可能。

无上下文 QA 的提示示例和模板

当 LLM 被问到一个没有任何额外上下文的问题时,它可能很难理解问题并生成准确的答案。这就像给他们提供了一个缺少拼图的谜题。提示工程帮助我们提供缺失的拼图,使 LLM 更容易理解我们的问题并提供准确的答案。

因此,需要仔细的提示工程来引导生成正确的方向,并鼓励准确、真实的回答。在无上下文的情况下,QA 中的提示工程有三个主要技术:

  • 法国的首都是什么?,你可以问法国的首府是哪个城市?。让我们再举一个例子。与其问什么导致了恐龙的灭绝?(一个宽泛的问题),重新构架的提示应该像这样关于恐龙灭绝最广泛接受的理论是什么?(它关注一个特定的方面)。

  • 五大湖是什么?,你可以问提供北美五大湖的列表(这指定了期望的答案格式)。

  • 谁写了《哈姆雷特》?这似乎是一个简单的问题,但 LLM 可能不确定它是指原始剧本的作者还是现代改编。相反,你可以用某种方式对模型进行归因校准来提问,例如你能明确告诉我谁写了原始剧本《哈姆雷特》吗?根据我对文学的理解,我非常可能(或不太确定)是正确的。这种提示版本的提示提供了一系列的信心水平(非常可能不太确定),而不是仅仅自信不确定。这允许 LLM 根据它处理的信息表达更细微的确定性水平。

  • 除了上述技术之外,你还应该利用系统提示来塑造 LLM 在最终用户查询时的解释和响应。将系统提示视为精心设计的指令,旨在指导模型的行为,将其引导到期望的结果。

  • 例如,当为角色扮演场景制作提示时,系统提示可以定义 AI 应展现的性格特征、交流风格和领域知识。想象一下你正在创建一个虚拟助手。通过系统提示,你可以指定一个有帮助、信息丰富的角色,确保 FM 使用适合角色的语言和知识。

  • 此外,系统提示可以帮助保持模型响应的一致性,尤其是在长时间交互期间。通过在提示中概述人物和期望的语气,你确保模型保持其性格,培养信任并提高用户体验的自然性。

  • 以下是一个使用 Anthropic Claude 模型的系统提示示例,我们鼓励您浏览promptengineering.org/claudes-system-prompt-a-prompt-engineering-case-study/。您应该始终记住,最佳的提示将取决于具体问题和您使用的 LLM 的能力。尝试不同的措辞和模板,以找到最适合您需求的方法。

  • 通过使用提示工程,总是可以在没有上下文的情况下提高 LLM 在 QA 任务中的准确性和可靠性。

简单的问题提示

提示生成模型最直接的方法之一是提出一个直接的问题,在代码中多行综合提示的情况下,格式化为三引号。让我们在 Amazon Bedrock 聊天游乐场中尝试一个示例。

为了在 Amazon Bedrock 游乐场中执行简单的 QA 提示,让我们回到 AWS 控制台,导航到 Amazon Bedrock 登录页面。一旦到达登录页面,滚动左侧面板,然后在游乐场下的聊天选项上点击Chat

通过导航到选择模型,在聊天游乐场中选择一个特定的模型。在我们的例子中,让我们选择Jurassic-2 Ultra FM,并使用图 7.1中的以下示例来启动对话。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_01.jpg

图 7.1 – 聊天游乐场中使用 Amazon Bedrock 模型的简单提示

如前例所示,一个简单的提示,如拉宾德拉纳特·泰戈尔著名的诗篇“Geetanjali”是关于什么的?被使用,而没有向模型提供任何上下文。为了进一步与模型进行聊天,还问了一个后续问题,他还有哪些著名诗作?,模型提供了相当不错的回答。(您可以在 Bedrock 游乐场中使用其他模型运行此示例提示,并继续对话链以观察响应中的任何差异。)

您还可以通过在聊天游乐场窗口右侧切换滑块来利用比较模式,如图图 7.2所示,并对 Amazon Bedrock 上可用的多个 FM 执行类似的提示。如图所示,在特定问题上比较了三个模型。注意第三个模型是通过点击右侧的**+**选项添加的。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_02.jpg

图 7.2 – 在 Amazon Bedrock 中使用比较模式进行简单 QA 提示

同样,通过使用 Amazon Bedrock API,可以在 QA 环境中提示模型:

prompt = """You are an expert AI assistant. You will answer questions in a succinct manner. If you are unsure about the
answer, say 'I am not sure about this answer'
Question: How can I connect my old Samsung TV with my Mac laptop?
Answer:"""
parameters = {
    "maxTokenCount":1024,
    "temperature":0.1,
    "topP":0.8,
    "stopSequences":[]
    }

使用前面的提示,可以在 Amazon Bedrock 中调用可用的 FM;然后模型可以提供特定的响应。我们鼓励您使用 Amazon Titan 模型运行此提示,并将响应作为练习捕获。

模型鼓励和约束

你可以选择以激励的方式构建提示来鼓励模型。通过结合模型鼓励和约束,你可以创建更有效的提示,引导 LLMs 生成高质量的响应。

以下是一些示例:

  • 提供上下文和特定关键词可以鼓励模型生成更准确的响应。

  • 设置长度和格式约束可以帮助模型生成简洁、结构化的响应。

  • 将模型限制在特定领域或主题可以帮助它生成更准确、更相关的响应。

一个提示示例可以按照以下顺序格式化:

你是一位在清晰和吸引人的方式中解释复杂科学概念的专家。你将复杂主题分解成可理解术语的能力使你成为教育目的的无价资源。

约束条件:假设你的听众是具有计算机科学和物理基础知识的大学生或专业人士。你的解释应该是易于理解且信息丰富的,涵盖量子计算的理論和實踐方面。

接着是这个问题:

请提供一个关于量子计算的全面概述,包括其原理、潜在应用以及它面临的挑战。

图 7.3 展示了在 Amazon Bedrock 的聊天沙盒中使用模型鼓励和约束调用 Meta Llama 模型的示例用法。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_03.jpg

图 7.3 – 在 Amazon Bedrock 的聊天沙盒中使用模型鼓励和约束对 Meta Llama 3 模型的简单提示示例

鼓励你在自己的端执行这个提示,并注意有/没有约束条件和模型鼓励时的响应差异。你会发现这种类型的提示可以帮助引导模型提供深思熟虑、详尽的响应。

以下是一个供你执行的示例,你可以在 Amazon Bedrock 的聊天沙盒中执行,或者通过使用 Amazon Bedrock API 调用模型:

你对复杂的机器学习概念有很好的掌握,并且能够以清晰易懂的方式解释它们。

请解释一下机器学习中梯度下降的概念。

请确保你的解释简洁,适合具有机器学习基础知识读者。

假设你用一个假设性的问题调用一个 FM,没有任何相关上下文。在某些情况下,它可能会产生幻觉。*图 7.4* 展示了一个有趣的场景,其中模型在查询一个虚构的 BMX Subaru 自行车时产生了幻觉,而这个自行车在现实生活中并不存在!

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_04.jpg

图 7.4 – 在 Amazon Bedrock 的聊天沙盒中无上下文的 QA 提示示例

如果提供了适当的提示指令和上下文,模型将努力在上下文中找到相关内容,然后提供合理的期望响应。

请记住,虽然无上下文的 QA 极具挑战性,但诸如宪法 AI 和利用模型内部知识以新颖方式利用和重新组合的迭代优化技术等策略可以帮助提高开放域 QA 的性能。

注意

宪法 AI是人工智能研究的一个领域,关注于开发遵守伦理原则和法律框架的人工智能系统。这可能包括设计公平、透明和可问责的人工智能系统,并尊重人权和隐私。

有上下文的 QA

有上下文的 QA涉及提供输入文本和问题,语言模型必须基于给定文本中的信息生成答案。这项任务要求模型理解上下文,识别相关细节,并综合一个直接回答查询且不引入外部信息的连贯响应。

对于这个用例,通过首先展示输入文本,然后提出问题来结构化提示是有益的。这种顺序允许模型在尝试形成答案之前完全处理上下文,这可能会提高响应的质量和准确性。如前所述,结合诸如模型鼓励等技术可以进一步提高 QA 任务的表现。

理想的提示应该具有以下结构:

input_text: {{文本}}

问题:{{问题}}

answer:

现在,让我们看看提示的内容会是怎样的:

输入文本

"""北极狐(Vulpes lagopus)是一种小型狐狸,原产于北半球的北极地区,在北极苔原生物群落中很常见。它非常适合生活在寒冷环境中,拥有密集的毛皮绝缘层和紧凑的体形,这有助于减少对寒冷的暴露。成年狐狸体重 3-5 公斤(6.6-11 磅),体长 46-68 厘米(18-27 英寸)。它们厚厚的毛皮像保温毯一样,即使在北极冬天的深处也能保持温暖。北极狐有一层厚厚的底毛,可以隔离寒冷,以及一层密集的绝缘保护毛皮覆盖在顶部。"""

北极狐在寒冷的北极环境中有哪些关键的适应性特征?

示例输出

"The Arctic fox has several key adaptations that allow it to survive in the cold Arctic environments:
1\. Dense fur insulation to keep it warm.
2\. A compact body shape that limits exposure to the cold.
3\. A thick underfur that insulates it from the cold.
4\. A dense, insulating guard hair coat on top.
These physical adaptations, such as thick fur coats and compact body shape, enable the Arctic fox to withstand the extreme cold temperatures of the Arctic tundra region."

上述示例提示展示了这样一个场景:提供了一个关于北极狐对寒冷环境物理适应性的答案,问题提示模型从文本中识别和总结相关细节。

接下来,让我们通过一个使用 Amazon Bedrock API 的 QA 有上下文示例提示来进行分析:

# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#create bedrock runtime client
bedrock_runtime = boto3.client('bedrock-runtime')
#Provide the model paramters
model_parameters = {
     "maxTokenCount":1024,
     "temperature":0,
     "stopSequences":[],
     "topP":0.9
     }
#Provide relevant context to the model
context= """Using your Apple Watch to locate a misplaced iPhone is a handy feature that can save you a lot of time and frustration. The process typically begins by opening the Control Center on your watch by swiping up from thebottom of the watch face. From there, you'll see an icon that looks like a ringing iPhone - tapping this will remotely activate a loud pinging sound on your iPhone, even if it's on silent mode. If you're within earshot, simply follow the sound to track down your missing device. Alternatively, you can use the FindMy app on your Apple Watch, which provides a map showing the last known location of your iPhone. Tap the "Devices" tab, select your iPhone, and it will display its location, as well as give you the option to force it to emit a sound to aid in your search. For an even quicker option, you can simply raise your wrist and ask Siri "Hey Siri, find my iPhone," and the virtual assistant will attempt to pinpoint the location of your iPhone and provide directions. However, for any of these methods to work, your iPhone must be powered on, connected to a cellular or WiFi network, and have the Find My feature enabled in Settings under your Apple ID. As long as those criteria are met, your Apple Watch can be a powerful tool for tracking down a wandering iPhone."""
#Take the entire context/excerpt provided above and augment to the model along with the input question
question = "How can I find my iPhone from my Apple watch in case I lose my phone?"
prompt_data = f""" Answer the user's question solely only on the information provided between <></> XML tags. Think step by step and provide detailed instructions.
<context>
{context}
</context>
Question: {question}
Answer:"""
#Now, you can Invoke the foundation model using boto3 to generate the output response.
body = json.dumps({"inputText": prompt_data, "textGenerationConfig": model_parameters})
accept = "application/json"
contentType = "application/json"
# You can change this modelID to use an alternate version from the model provider
modelId = "amazon.titan-tg1-large"
response = bedrock_runtime.invoke_model(
    body=body, modelId=modelId, accept=accept, contentType=contentType)
generated_response_body = json.loads(response.get("body").read())
print(generated_response_body.get("results")[0].get("outputText").strip())

运行前面的代码,并尝试在自己的 Amazon Bedrock FM 上测试结果。生成的输出可能类似于图 7.5

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_05.jpg

图 7.5 – 来自 Amazon Bedrock FM 的示例输出

在执行调用模型的代码后,您将观察到模型可以通过利用提供作为上下文的信息,在大多数情况下生成适当的响应。

现在我们已经讨论了在 Bedrock 上的 QA 用例中的提示工程,让我们通过 Amazon Bedrock 的文档摄取框架来了解文档摄取。

使用 Amazon Bedrock 进行文档摄取

带有上下文的 QA 系统的架构模式可以大致分为两类 – 小型文档上的 QA知识库上的大型文档 QA。虽然核心组件保持相似,但所采用的方法和技术可能因输入数据的大小和复杂性而异。

小型文档上的 QA

对于旨在处理小型文档(如段落或短文章)的 QA 系统,其架构模式通常遵循以下阶段的管道方法:

  1. 查询处理:将自然语言查询预处理为向量表示。

  2. 文档检索:根据查询关键词或语义相似性度量从语料库中检索相关文档或段落。对于较小的文档,检索可以很直接;您可以直接嵌入和索引整个文档或段落到您的向量存储中。在另一种情况下,由于输入文档的性质较小,只要它们可以适应模型的令牌大小限制,可能就没有必要将它们分成更小的块。一旦检查,文档就可以在模型提示模板的上下文中直接解析。

  3. 段落排名:检索到段落后,根据其与查询的相关性进行排名。这种排名可以使用诸如**词频-逆文档频率(TF-IDF)**语义相似性或专门的神经排名模型等技术来完成。可以使用编排器或类型或向量数据库来实现段落排名的自动化。例如,Amazon Kendra 内置了 SOTA 语义搜索机制,用于执行相关性排名。

  4. 答案提取:分析排名靠前的段落,以识别最相关的范围或短语,这些范围或短语可能回答查询。这一阶段通常涉及诸如命名实体识别、指代消解和 QA 模型等技术。因此,在生成式 AI 框架的情况下,相关上下文提取可以由这些 LLM 执行,而无需显式调用复杂的技术。

  5. 答案评分和排名:提取的答案候选者根据其置信度或与查询的相关性进行评分和排名,使用的技术包括答案验证模型或评分函数。还有一些重新排名模型,例如 Cohere Rerank,也可以利用来提高召回性能。

  6. 答案生成:生成排名最高的答案,可能涉及后处理步骤,如格式化、改写或生成自然语言响应。

这种管道方法非常适合小型文档的问答,因为它允许高效地检索和排名相关段落,然后进行针对性的答案提取和评分,而无需将文档分成块或以不同的方式处理。

让我们通过一个使用 Amazon Bedrock 的小型文档摄取示例来了解。

对于使用 Amazon Bedrock 和 LangChain 的小型文档摄取,您可以使用 TextLoaderPDFLoader,实际上它们是 Python 类,而不是软件组件。以下是一个简要的解释:

  • 使用 TextLoaderPDFLoader 分别加载和解析文本和 PDF 文档。

  • 这些类是 LangChain 文档加载功能的一部分,有助于在 AI 应用中准备文档以进行进一步处理。

以下是一个使用 TextLoader 的示例。

注意

如前几章所示,请确保安装 LangChain 所需的库以及 Chroma DB。我们仅使用 Chroma DB 作为示例目的。根据用例,您可以使用其他向量数据库,如 Chroma、Weaviate、Pinecone 和 Faiss。如果未安装 Chroma DB,请在运行以下代码之前执行 !pip install chromadb

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
# Load the document
loader = TextLoader('path/to/document.txt')
documents = loader.load()
# Split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# Create embeddings and store in Chroma vector store
from langchain_community.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings()
db = Chroma.from_documents(texts, embeddings)

知识库中大型文档的问答

当处理知识库中的大型文档时,可能需要调整架构模式以处理数据的规模和复杂性。一种常见的方法是结合信息检索和开放域问答系统的技术。以下步骤突出了摄取大型文档、创建向量索引和创建端到端问答管道的过程:

  1. 知识库构建:大型语料库或知识库被预处理、索引和结构化,以便于高效检索和查询。

  2. 查询处理:类似于小型文档的情况,自然语言查询通过将其转换为向量表示进行预处理。

  3. 文档或段落检索

    • 分块:对于较大的文档,直接嵌入整个文档可能并不理想。您应该考虑将文档分成更小、更易于管理的部分,例如段落或句子。

    • 从小到大检索:在这种情况下,遵循以下过程:

      1. 在检索期间使用较小的块进行嵌入和搜索。

      2. 根据检索到的分数识别相关的块。

      3. 使用检索到的块 ID 访问并提供相应的较大文档段给 LLM 以生成答案。这样,LLM 可以访问更广泛的环境,而检索则利用更小、更专注的单位。

    • 效率:通过减少嵌入和搜索大量文档的计算负载,将文档分块和从小到大检索可以帮助提高效率。

  4. 段落重新排序:检索到的段落或知识库条目可能根据其与查询的相关性进行进一步的重新排序或过滤,使用技术如神经重新排序器或语义相似度度量。

  5. 答案提取和生成:根据查询和知识库的性质,答案提取和生成可能涉及多跳推理、知识图谱遍历或从结构化数据生成自然语言响应等技术。

  6. 答案评分和排序:类似于小文档的情况,提取的答案候选者将根据其置信度因子或与查询的相关性进行评分和排序。

  7. 答案展示:最终的答案或答案集将展示给用户,可能涉及格式化、摘要或生成自然语言解释。

  8. 额外考虑点 值得考虑

    • 自适应检索限制:根据查询和文档集合的复杂性,设置自适应的检索文档数量限制可以优化性能。

    • 压缩:诸如摘要或信息提取等技术可以预处理大量文档,在不丢失上下文的情况下压缩信息,从而进一步帮助 LLM 在答案生成过程中。

这种方法特别适用于在大型、多样化和可能未结构化的知识库上运行的问题回答系统,因为它利用信息检索技术,在答案提取和生成之前,有效地检索和排序相关信息。

对于大量文档的摄取,建议使用 Amazon Bedrock 的知识库来处理摄取工作流程并将嵌入存储在向量数据库中,具体内容请参阅第五章

无论文档大小如何,现代 QA 系统往往都会采用高级技术,如基于 Transformer 的语言模型、图神经网络和多任务学习。此外,迁移学习、少样本学习和领域自适应等技术也常被采用,以适应不同领域或知识库的 QA 模型。

重要的是要注意,具体实现细节和采用的技术可能因特定 QA 系统的要求、约束和可用资源而异。架构模式作为一个通用框架,提供了一个理解底层机制的基础,并指导针对不同用例和领域的 QA 系统的设计和开发。

使用 Amazon Bedrock 的 QA 实现模式

在本节中,我们将探讨与 QA 相关的不同模式。首先,我们将探讨如何直接向模型提出查询。之后,我们将介绍另一种使用 RAG 的方法,其中我们将添加上下文信息。让我们开始吧!

基线方法:知识领域的无界探索

在这个初始模式中,我们开始了一段旅程,在这个旅程中,问题直接向模型提出,不受外部约束的限制。我们收到的回答根植于模型的基础知识。然而,正如你现在所清楚理解的,这种方法提出了一个巨大的挑战——输出内容广泛且通用,缺乏定义客户独特商业景观的细微差别和具体细节。图 7.6展示了用户与 Amazon Bedrock 交互并使用直接提示时的旅程,提示中的小文档用于调用模型。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_06.jpg

图 7.6 – 使用直接输入提示对 Bedrock LLM 进行 QA 生成的提示

注意,我们在展示如何利用 Amazon Bedrock Titan 模型向用户查询提供信息性回答时详细介绍了这种方法,如带上下文的 QA部分所示。

如前所述,示例演示了 Bedrock Titan 模型如何在没有任何上下文信息提供的情况下生成回答。随后,我们手动将上下文纳入模型输入中,以增强其回答的质量。重要的是要注意,这种方法不涉及任何 RAG 来将外部知识纳入模型的输出。

虽然这种直接的方法对于短文档或单一应用可能效果良好,但它可能无法有效地扩展到企业级 QA 场景。在这种情况下,需要考虑大量企业文档,整个上下文可能无法放入发送给模型的提示中,这需要更高级的技术。

RAG 方法:上下文照明

在这个第二个模式中,我们将开始一段更精细的旅程,这段旅程利用了 RAG 的力量。在这里,我们巧妙地将问题与相关的上下文信息交织在一起,创造出一个更有可能包含我们寻求的答案或见解的图案。这种方法类似于带着精心编制的阅读清单进入图书馆,引导我们走向存放我们渴望的知识的书架。

然而,即使在改进后的这种方法中,仍然存在一个限制——我们可以整合的上下文信息量受到模型强加的上下文窗口的限制。这就像在我们的比喻背包中携带有限数量的书籍,迫使我们仔细挑选携带的上下文信息,以免超过重量限制并遗漏可能至关重要的见解。

如您在第五章中学习到的,RAG 结合了使用嵌入来索引文档语料库、构建知识库以及使用 LLM 来执行嵌入的方法,目的是最终从知识库中的一部分文档中提取相关信息。为了准备 RAG,构成知识库的文档被分成固定或可变大小的块。然后,这些块通过模型传递以获得其各自的嵌入向量。每个嵌入向量及其对应的文档块和附加元数据都存储在向量数据库中,该数据库针对高效向量之间的相似性搜索进行了优化。

图 7.7展示了在 QA 生成框架的背景下使用 Amazon Bedrock 的基于 RAG 的工作流程。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_07.jpg

图 7.7 – 使用 RAG 方法与 Amazon Bedrock 进行 QA

通过利用这种 RAG 方法,我们可以访问大量的上下文信息库,使我们的生成式 AI 模型能够产生更明智和准确的输出。然而,我们必须保持对令牌限制的警觉,并仔细挑选我们纳入的上下文信息。这样做将确保我们在领域知识的广度和深度之间取得平衡(将解析到模型中以提供响应,而不是让模型进行幻想),同时保持在模型的约束范围内。

在这种方法中,我们将基于前一小节中讨论的小型文档摄取代码进行构建。但是,您将在代码中找到不同的片段 – 尤其是在识别与源数据中的查询的相似性以及利用相关信息,增强提示以调用 LLM 的部分:

#importing the respective libraries
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
!pip install chromadb
Import boto3
Import botocore
#Create client side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(
    service_name='bedrock-runtime',
    region_name=region,
)
# Load the document
loader = TextLoader('path/to/document.txt')
documents = loader.load()
# Split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# Create embeddings and store in Chroma vector store
from langchain_community.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings(client=boto3_bedrock, model_id="amazon.titan-embed-text-v1")
db = Chroma.from_documents(texts, embeddings)
# Enter a user query
query = "Enter your query here"
#Perform Similarity search by finding relevant information from the embedded data
retriever = db.similarity_search(query, k=3)
full_context = '\n'.join([f'Document {indexing+1}: ' + i.page_content for indexing, i in enumerate(retriever)])
print(full_context)
#Since we have the relevant documents identified within "full_context", we can use the LLM to generate an optimal answer based on the retreived documents. Prior to that, let us format our prompt template before feeding to the LLM.
prompt_template = f"""Answer the user's question solely only on the information provided between <></> XML tags. Think step by step and provide detailed instructions.
<context>
{full_context}
</context>
Question: {query}
Answer:"""
PROMPT = PromptTemplate.from_template(prompt_template)
#Prompt data input creation to feed to the LLM
prompt_data_input = PROMPT.format(human_input=query, context=context_string)
#Now, you can Invoke the foundation model using boto3 to generate the output response.
body = json.dumps({"inputText": prompt_data_input, "textGenerationConfig": model_parameters})
accept = "application/json"
contentType = "application/json"
# You can change this modelID to use an alternate version from the model provider
modelId = "amazon.titan-tg1-large"
response = bedrock_runtime.invoke_model(
    body=body, modelId=modelId, accept=accept, contentType=contentType)
generated_response_body = json.loads(response.get("body").read())
print(generated_response_body.get("results")[0].get("outputText").strip())

执行此代码将帮助您了解恰当地构建提示模板并调用模型以生成期望的响应。

您还被鼓励在不同的文档上执行代码,并尝试不同的向量数据库和 FM,以更深入地了解这种方法。

用户应致力于找到相关文档,以提供对其查询的准确答案。用户在使用生成式 AI 用例时可能遇到的两个关键挑战可能包括以下内容:

  • 管理超过令牌限制的大型文档

  • 确定给定问题的最相关文档

为了应对这些挑战,RAG 方法提出了以下策略:

  • 文档准备和嵌入:在回答问题之前,文档必须被处理并存储在文档存储索引中,如使用 Amazon Bedrock 进行文档摄取部分所示。涉及到的步骤包括以下内容:

    1. 加载文档。

    2. 将其处理并分割成更小、更易于管理的块。

    3. 使用 Amazon Bedrock Titan Embeddings 模型或替代嵌入模型为每个块创建数值向量表示(嵌入)。

    4. 使用块及其相应的嵌入创建索引。

  • 问题处理:一旦文档索引准备就绪,用户可以提出问题,并根据查询检索相关文档块。以下步骤将被执行:

    1. 创建输入问题的嵌入。

    2. 将问题嵌入与索引中的嵌入进行比较。

    3. 获取Top K个相关文档块。

    4. 将这些块作为提示中的上下文部分添加。

    5. 将提示发送到 Amazon Bedrock FM。

    6. 根据检索到的文档接收上下文答案。

通过在代码中采用这种方法,我们可以利用生成式 AI、嵌入和向量数据存储的力量,为用户查询提供准确和上下文感知的响应,即使在处理大量文档集时也是如此。

现在我们已经详细了解了问答系统,是时候揭开其衍生领域——即对话界面的面纱了。

对话界面

对话界面,如虚拟助手或聊天机器人,在各种领域得到了广泛应用,包括客户服务、销售和电子商务,为用户提供快速高效的响应。它们可以通过多种渠道访问,如网站、消息应用和社交媒体平台,从而确保无缝的用户体验。

使用 Amazon Bedrock 的聊天机器人

在生成式 AI 领域,Amazon Bedrock 提供了一个强大的平台,用于开发和部署聊天机器人。图 7.8突出了 Amazon Bedrock 中包含聊天历史集成的整体对话流程。该流程包括以下步骤:

  1. 某个用户通过界面向适当的 Bedrock LLM 提出特定问题。

  2. 模型将对话历史存储到特定的数据库中,例如 DynamoDB。聊天历史和问题被附加在一起形成增强提示。对话历史存储在数据库中,例如 DynamoDB。这个历史记录,连同当前用户查询一起,用于创建增强提示。然后,这个增强提示被用来通知生成式 AI 模型,这有助于在未来的交互中改进聊天机器人的响应。通过整合对话历史,聊天机器人可以避免向用户提出他们已经回答过的问题。这促进了更自然和吸引人的对话。

  3. 从 LLM 检索增强提示以获取相关响应。

  4. 对话以反馈的形式继续,其中生成的输出随后以对话链的形式反馈,以继续与用户的持续交互。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_08.jpg

图 7.8 – 与 Amazon Bedrock 的对话流程

在 Amazon Bedrock 上构建的聊天机器人的用例多种多样,适应广泛场景:

  • 基本聊天机器人 - 零样本:这个用例涉及开发一个利用预训练的 FM 进行对话交互的基本聊天机器人,无需任何额外的上下文或提示。例如,可以提供以下提示:

您是一个友好且有帮助的对话式人工智能助手。您应该就广泛的话题进行自然语言对话,尽您所能回答问题。如果您对某事不确定,您可以礼貌地回应您对该特定主题的信息不足。您的主要目标是以对话方式向用户提供有用的信息。您不需要任何额外的上下文或示例来开始对话。

  • 基于提示的聊天机器人(LangChain):在这个场景中,聊天机器人被设计在由提示模板定义的特定上下文中运行。利用 LangChain 库,开发者可以创建能够进行情境化对话的聊天机器人,提供相关和定制的响应。例如,以下代码片段展示了如何使用提示模板与 LangChain 交互,并在对话链中与用户进行交互:

    from langchain import PromptTemplate, LLMChain
    
    from langchain_community.llms import Bedrock
    
    # Define the prompt template
    
    template = """You are a helpful travel assistant. You will be provided with information about a user's travel plans, and your task is to provide relevant suggestions and recommendations based on their preferences and requirements.
    
    Travel Details: {travel_details}
    
    Using the information provided, suggest some activities, attractions, restaurants, or any other recommendations that would enhance the user's travel experience. Provide your response in a conversational and friendly tone."""
    
    # Create the prompt template object
    
    prompt = PromptTemplate(template=template, input_variables=["travel_details"])
    

    现在,用户可以创建 LLM 链并提供一个示例提示,如下所示,并相应地调用模型:

    # Sample user input
    
    user_travel_details = """I'm planning a 5-day trip to Paris with my family (two adults and two children, ages 8 and 12). We're interested in exploring the city's history, architecture, and cultural attractions. We also enjoy trying local cuisine and engaging in family-friendly activities."""
    
  • 以角色驱动的聊天机器人:这个用例涉及创建具有明确角色或身份的聊天机器人。例如,可以开发一个职业导师聊天机器人,与用户进行对话,提供与职业相关的事务指导和建议,同时在整个互动过程中保持一致的角色。例如,聊天机器人可以用作教学助理,为学生提供信息和解答他们的问题。聊天机器人可以被设计成符合教师的个性,或者采取更轻松的角色,使学习更加有趣。另一种场景可能涉及客户服务或医疗保健领域的角色驱动聊天机器人。具体来说,医疗保健领域的聊天机器人可以用来向患者提供有关其健康状况的信息,或者回答有关药物的问题。聊天机器人可以被设计成富有同情心和理解的,并且可以使用患者容易理解的语言。

  • 上下文感知聊天机器人:在这个高级用例中,聊天机器人被设计为根据通过外部文件提供的信息理解和响应。通过从这些文件生成嵌入,聊天机器人可以理解和整合提供的信息到其响应中,提供高度相关和特定上下文的交互。例如,第五章中提供的例子强调了上下文感知聊天机器人的用例,其中提示与从摄取的文档/外部文件中提取的上下文相结合,以增强提示与匹配的上下文。

这些用例展示了基于 Amazon Bedrock 构建的聊天机器人的多功能性和强大功能,使开发者能够创建满足不同用户需求和场景的对话接口。

通过 Amazon Bedrock 和 LangChain 框架赋能聊天机器人开发

在对话接口的领域,如聊天机器人,保持上下文和跨交互保留记忆至关重要。这不仅适用于短期交流,也适用于长期对话,其中回忆和基于先前交互构建的能力是至关重要的。

如前文所述,在更详细地讨论问答系统(除了第五章)的部分(以及第五章中提到的第五章),LangChain 提供了两种不同形式的记忆组件来满足这一需求。首先,它提供了一套辅助工具,旨在管理和操作之前的聊天消息。这些工具是模块化的,并且非常灵活,可以集成到各种工作流程和应用中。

其次,LangChain 简化了将这些记忆工具集成到链中的过程,链是创建复杂对话系统的基本构建块。通过利用 LangChain 的抽象和易于使用的接口,开发者可以轻松定义和交互不同类型的记忆组件,从而创建复杂且上下文感知的聊天机器人。

无论您是在构建一个简单的问答机器人,还是一个复杂的多轮对话代理,LangChain 的记忆管理功能,结合其与 Amazon Bedrock 的集成,使您能够打造智能且引人入胜的聊天机器人体验。

打造上下文感知对话接口——基本支柱

如“使用 Amazon Bedrock 的问答系统”部分所述,开发上下文感知聊天机器人的基石在于生成上下文嵌入。如您现在所知,这一初始阶段涉及一个摄取过程,通过嵌入模型将数据喂入,其中这些嵌入随后被仔细存储在专门的数据结构中,通常称为向量存储,以促进高效的检索和处理。

图 7.9展示了将文档或文件作为输入,进行处理或转换,然后将其转换为存储在向量存储中的嵌入的过程。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_09.jpg

图 7.9 – 分块大型文档并将嵌入存储在向量存储中

与使用 Bedrock 的 QA 系统实现模式相同,用户交互编排中的第二个关键组件可以定义为请求处理机制。这个复杂的过程包括接收用户输入,解释意图和上下文,调用适当的模型或服务,并综合相关响应。它作为中央枢纽,协调各种组件以提供无缝且上下文相关的对话体验。在我们的场景中,这种形式或编排器或请求处理中心可以使用 Langchain 或 Amazon Bedrock 代理执行。图 7.10说明了 QA 对话界面工作流程,通过从向量存储中提取所需信息来从分块文档中检索相关响应。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_10.jpg

图 7.10 – 带有相似性搜索和相关信息分块的问题回答对话工作流程

在请求处理阶段,系统利用先前生成的嵌入,采用复杂的算法从向量存储中识别最相关的信息。这种上下文检索使聊天机器人能够提供针对特定对话线程的响应,考虑到用户的意图、先前的话语和整体对话上下文。

现在,让我们深入探讨在对话界面情况下上下文感知的架构工作流程。

上下文感知聊天机器人的架构流程

该架构的过程流程(也在图 7.11中展示)如下:

  1. 初始时,上下文文档使用强大的嵌入模型(如亚马逊的 Titan Embeddings 模型)转换为数值嵌入。这些嵌入存储在专门的向量数据库中,以便高效检索。

  2. 使用嵌入模型将用户的查询编码成数值表示,使系统能够理解其语义含义。

  3. 用户的查询嵌入和聊天历史被输入到 FM 中,特别是文本嵌入模型,该模型在向量数据库中搜索最相关的上下文信息。

  4. 向量数据库返回与查询最佳匹配的上下文嵌入,使 LLM 能够生成包含相关上下文的响应。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_07_11.jpg

图 7.11 – 一种用于上下文感知聊天机器人的对话架构流程

使用 Amazon Titan 构建此架构流程的代码可在github.com/aws-samples/amazon-bedrock-workshop/blob/main/06_OpenSource_examples/02_Langchain_Chatbot_examples/00_Chatbot_Titan.ipynb找到。

在 Amazon Bedrock 样本页上,还有来自 Anthropic、AI21 Labs 和 Meta 的不同 FM 的额外示例。随着时间的推移,Amazon Bedrock GitHub 样本页上还将继续添加更多示例,供用户进行实验并用于他们的企业用例。

此外,有关使用 Amazon Bedrock 构建基于知识库的上下文聊天应用的信息,您可以在此找到:aws.amazon.com/blogs/machine-learning/build-a-contextual-chatbot-application-using-knowledge-bases-for-amazon-bedrock/

我们还鼓励您阅读有关基于 AWS 解决方案构建的明确问答机器人的文章,以扩展您构建企业级对话聊天机器人的可能性:aws.amazon.com/blogs/machine-learning/deploy-generative-ai-self-service-question-answering-using-the-qnabot-on-aws-solution-powered-by-amazon-lex-with-amazon-kendra-and-amazon-bedrock/

在生成式 AI 的领域内,问答模式和对话界面代表了知识获取和传播不断演进的旅程。在我们探索这些路径的过程中,我们不断寻求创新的方法来优化我们的查询,增强我们的上下文,并推动可能性的边界,所有这些都在追求解锁这些卓越模型中蕴藏的知识宝库。

随着企业继续拥抱生成式 AI 并寻求更智能和自动化的解决方案,Amazon Bedrock 作为一个强大的工具脱颖而出,可以构建先进的问答系统,从而提升客户体验,简化运营流程,并解锁人机交互中的新可能性。

摘要

在本章中,我们探讨了现代问答界面和聊天机器人的架构复杂性及其关键组件。我们了解了促进自然和吸引人对话的提示工程技巧。我们还展示了如何使用 Amazon Bedrock 无缝设计问答系统和对话系统,突出了这些模式的结构化工作流程。

在下一章中,我们将揭示更多使用 Amazon Bedrock 的生成式 AI 的潜在用例和应用。我们将更深入地了解使用 Amazon Bedrock 进行实体提取和代码生成,以及其潜在的实际应用场景。

第八章:使用 Amazon Bedrock 提取实体和生成代码

本章揭示了实体提取领域,这是自然语言处理中的一个关键技术。我们将探讨实体提取应用的复杂性,提供使用 Amazon Bedrock 实施实体提取的全面理解。通过实际案例,您将深入了解实体提取在各个领域的实际应用。

此外,本章将引导您进入代码生成的激动人心的生成式 AI 世界。我们将探讨使 AI 系统能够生成代码片段、函数甚至整个应用程序的底层原理和方法。您将学习如何利用 Amazon Bedrock 简化您的开发工作流程并提高生产力。

通过掌握这些技术,您将具备解决复杂 NLP 任务和利用生成式 AI 在编码工作中的力量的知识和技能。

以下主题将详细介绍:

  • 实体提取 – 全面探索

  • 实体提取的工业应用案例 – 解放非结构化数据的力量

  • 使用 Amazon Bedrock 进行实体提取

  • 使用大型语言模型进行代码生成 – 解放 AI 驱动的开发力量

技术要求

本章要求您拥有 AWS 账户访问权限。如果您还没有账户,可以访问 aws.amazon.com/getting-started/ 创建一个 AWS 账户。

其次,您需要在创建账户后从 aws.amazon.com/cli/ 安装和配置 AWS CLI,这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的大多数代码单元都是基于 Python 的,因此在此时设置 AWS Python SDK(Boto3)docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html 将非常有用。您可以通过以下方式执行 Python 设置:在您的本地机器上安装它,使用 AWS Cloud9 或 AWS Lambda,或利用 Amazon SageMaker。

注意

与调用和定制 Amazon Bedrock FMs 相关的费用将会产生。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。

实体提取 – 全面探索

在大数据和信息过载的时代,从非结构化文本数据中提取有意义的见解的能力变得越来越有价值。实体提取,作为 NLP 的一个子领域,在这一努力中发挥着关键作用,通过识别和分类文本中的命名实体(如人物、组织、地点等),从而不仅促进了信息检索和知识管理,还使各种应用成为可能,包括问答情感分析决策支持系统(DSSs)。

实体提取的旅程始于简单的模式匹配和基于规则的系统,这些系统严重依赖于手动制定的规则和词汇表。虽然这些方法有用,但在处理多样化和复杂的数据集时,它们缺乏可扩展性和鲁棒性。

因此,传统上,实体提取是一个具有挑战性的任务,需要大量的手动工作和领域专业知识。然而,生成式 AI 的出现,尤其是 LLMs,彻底改变了这一领域,提供了更准确、可扩展和高效的解决方案。在本章中,我们将探讨 LLMs 在 Amazon Bedrock 上用于实体提取的各种技术,深入其底层架构、优势和局限性。

深度学习方法

机器学习的出现引入了利用特征工程统计模型。这些模型,包括隐马尔可夫模型(HMMs)和条件随机字段(CRFs),代表了一个重大进步。它们利用手工制作的特征和概率框架来提高提取精度。然而,它们的性能仍然受到专家设计的特征的质量和全面性的限制。

神经网络通过自动化特征学习和捕捉数据中的复杂模式,在实体提取中实现了范式转变。早期神经网络的应用,如循环神经网络(RNNs)和长短期记忆网络(LSTMs),展示了深度学习在处理序列数据和以更高精度提取实体方面的潜力。

虽然 BERT 及其后续模型在 NLP 领域代表了一个重大飞跃,但我们的关注点将始终集中在与 Bedrock 中使用的实际应用和工具相一致的模式和技巧上。我们将探讨一些在多种场景中证明有效的深度学习方法和模型,它们与我们的框架相关。

基于 Transformer 的模型

Transformer 架构,由开创性的论文 Attention is All You Need (*Vaswani 等人,2017: arxiv.org/abs/1706.03762) 提出,已成为许多 SOTA LLMs 用于实体提取的骨干。这些模型采用自注意力机制来捕捉输入文本中的长距离依赖关系,使它们能够更好地理解上下文以及实体之间的关系。

由谷歌 AI 开发的 BERT 是一个基于转换器的模型,它在各种 NLP 任务中,包括实体提取中取得了卓越的成果。它是一个双向模型,这意味着它可以同时处理文本的两个方向,使其比前辈更有效地捕捉上下文信息。

序列标注和 CRFs

实体提取可以被视为一个序列标注问题,其中输入文本中的每个标记都被分配一个标签,指示其实体类型(例如,人、组织、地点)或非实体标签。LLMs 可以通过利用 CRFs 或更近期的双向 LSTM 与 CRF(BiLSTM-CRF)架构等技术来训练执行此任务。

条件随机场(CRFs)是能够有效捕捉序列中标签之间依赖关系的概率图模型,这使得它们非常适合实体提取任务。它们模型化给定输入文本的标签序列的条件概率,允许结合丰富的特征和上下文信息。

双向长短时记忆网络-条件随机场(BiLSTM-CRF)模型结合了 BiLSTM 在捕捉长距离依赖关系和 CRFs 在序列标注方面的优势。这种混合方法在实体提取中表现出令人印象深刻的性能,尤其是在实体可能跨越多个标记或具有复杂结构的情况下。

基于规则的系统

尽管近年来深度学习方法获得了显著的关注,但基于规则的系统在实体提取领域仍然是宝贵的工具。这些系统依赖于手动编写的规则和模式来识别和分类文本中的实体,利用领域特定知识和专家见解。这些规则可以增强到 Amazon Bedrock 的提示模板中,以便从 FMs 生成期望的响应。例如,在医疗应用中,基于规则的组件可能会使用预定义的模式来识别药物名称、剂量和患者信息。

正则表达式和模式匹配

正则表达式模式匹配技术是规则基于实体提取系统的基本构建块。这些方法允许定义可以匹配和提取特定实体类型(例如电话号码、电子邮件地址或特定的命名实体,例如公司名称和产品名称)的模式。

虽然正则表达式对于定义明确和结构化的实体类型可能非常有效,但它们在处理需要上下文理解的更复杂或模糊的实体时可能会遇到困难。尽管如此,它们仍然是宝贵的工具,尤其是在与其他技术结合使用或作为更高级方法预处理步骤时。以下是一些例子:

  • 规则集:使用正则表达式和模式匹配定义规则,以识别特定的实体,如药物名称、剂量和患者信息

  • \d+mg(例如,500mg

  • 可以通过诸如Patient: [A-Za-z]+之类的模式识别患者信息

地名词典和词典

地名词典词典是已知实体的精选集合,通常按实体类型或领域组织。这些资源可以通过对预定义列表进行查找来用于匹配和提取文本中的实体。

例如,地理位置的地名词典可以用来识别和提取给定文本中提到的城市、国家或其他地点。同样,人名或组织名词典可以简化这些实体类型的提取。

虽然地名词典和词典对于它们覆盖的实体可能非常准确,但它们可能难以处理歧义、变化或新出现的实体,这些实体不在预定义的列表中。此外,维护和更新这些资源可能是一个劳动密集型过程,尤其是在快速发展的领域。

混合方法

在实践中,许多实体提取系统采用深度学习和基于规则的技术的组合,利用两种方法的优势来实现最佳性能。这些混合方法旨在在深度学习模型的灵活性和泛化能力与基于规则的系统的精确性和可解释性之间取得平衡。

集成方法

集成方法涉及结合多个实体提取模型的输出,可能使用不同的架构或技术,以提高整体性能。这种方法可以利用单个模型的优势,同时减轻其弱点,从而实现更稳健和准确的实体提取。

例如,一个集成系统可能结合了基于 BERT 的转换器模型的预测以及基于规则的系统或地名词典查找的预测。这些模型的输出可以通过各种策略结合,例如多数投票、加权平均或更复杂的集成学习技术。

混合架构

混合架构将深度学习和基于规则的组件集成到单个模型中,允许两种方法的无缝集成。这些架构通常涉及一个用于学习表示和捕获上下文信息的深度学习组件,并结合基于规则的组件来融入特定领域的知识或处理定义明确的实体类型。

混合架构的一个例子是使用 LLM 进行实体表示学习,然后使用基于规则的组件进行实体分类或提取。LLM 组件可以学习输入文本的丰富表示,捕捉上下文信息和长距离依赖关系,而基于规则的组件可以利用专家知识和精确模式进行实体识别和分类。例如,考虑一个旨在从公司收益报告中提取财务信息的应用程序。以下是一个混合架构如何实现的详细示例:

  • 收入净收入运营费用

  • 收入净收入费用

  • 使用正则表达式提取日期和财政期间。

  • 识别公司特定的术语和缩写。

基于规则的系统分析由 LLM 生成的表示,应用这些规则以准确提取特定的金融实体。

现在我们来看看这些表示是如何集成和优化的:

  • 管道:系统通过 LLM 处理收益报告,输出丰富的文本表示。然后,这些表示被输入到基于规则的组件中。

  • 输出:最终输出包括精确提取的金融实体,如收入数字、净收入金额和财政期间,所有这些都根据预定义的规则进行了验证和分类。

通过在 Amazon Bedrock 上采用这种混合方法,应用程序利用了 LLM 提供的全面文本理解以及基于规则的提取方法的精确性和可靠性。这种方法确保了实体提取的准确性更高,并且具有更强的上下文意识,使其适用于金融分析等复杂领域。

为了更深入地了解混合 LLM 框架,鼓励读者阅读以下论文:从结构化数据生成业务洞察的混合 LLM-基于规则的途径(https://arxiv.org/pdf/2404.15604)和从非结构化文本数据中提取命名实体的创新混合方法(https://www.researchgate.net/publication/332676137_An_innovative_hybrid_approach_for_extracting_named_entities_from_unstructured_text_data)。

在本节中,我们介绍了与实体提取相关联的不同方法(深度学习、基于规则和混合方法)。现在,我们已经对这些方法有了基本的了解,让我们深入了解一些实体提取的工业应用案例。

实体提取的工业应用案例——释放非结构化数据的力量

实体提取在各个领域有广泛的应用,从信息检索和知识管理到决策支持系统(DSS)和商业智能BI)。在本节中,我们将探讨一些使用 GenAI 的实体提取的实际用例和应用:

  • Google 是由拉里·佩奇和谢尔盖·布林在斯坦福大学攻读博士学位时创立的。

使用实体提取,可以提取以下信息:

  • Google (组织)

  • Larry Page (人物)

  • Sergey Brin (人物)

  • Stanford University (组织)

  • (Google -> 拉里·佩奇和谢尔盖·布林) 和 就读于 (拉里·佩奇和谢尔盖·布林 -> 斯坦福大学),被确立为连接节点的边。这种结构化表示允许对信息进行高效的查询和推理。* Google (组织)* Larry Page (人物)* Sergey Brin (人物)* Stanford University (组织)* Google -> 创始人 -> 拉里·佩奇* Google -> 创始人 -> 谢尔盖·布林* 拉里·佩奇 -> 就读于 -> 斯坦福大学* 谢尔盖·布林 -> 就读于 -> 斯坦福大学

亚马逊 Bedrock 上的 LLM 可用于准确和可扩展的实体提取,促进从多样化的数据源(如新闻文章、科学出版物或社交媒体帖子)创建全面的知识图谱。这些知识图谱可以支持各种应用,包括问答系统、推荐引擎和决策支持工具。以下是一些示例:

  • 生物医学和科学文献分析:在生物医学和科学领域,实体提取特别有价值,因为这些领域通过研究出版物、临床笔记和其他来源产生了大量非结构化文本数据。识别和分类诸如基因、蛋白质、疾病和化学化合物等实体,可以使研究人员和医疗保健专业人员快速导航并从这些丰富的信息中提取见解。

    亚马逊 Bedrock 中的 LLM 可以在特定领域的数据集上进行微调,以实现提取生物医学和科学实体的高精度。这些模型可以帮助进行文献综述过程、药物发现流程以及精准医疗和个性化医疗的知识库开发。

  • 商业智能和竞争分析:在商业领域,实体提取可以用于竞争分析、市场研究和商业智能应用。通过从新闻文章、社交媒体帖子和其他在线来源中提取公司名称、产品名称和行业特定术语等实体,企业可以对其竞争对手、市场趋势和客户情绪获得有价值的见解。

    亚马逊 Bedrock API 可以与商业智能平台BIps)和分析工具结合使用,实现大量非结构化数据的实时实体提取和分析。这可以促进数据驱动决策、战略规划和识别新的商业机会。

  • 社交媒体监控和情感分析:社交媒体平台产生大量用户生成内容,包含有关公众舆论、趋势以及对各种实体(如品牌、产品或公众人物)的情感的有价值信息。实体提取在社交媒体监控和情感分析中发挥着关键作用,通过识别这些非结构化数据中的相关实体。

Amazon Bedrock 中的 LLMs 可以用于从社交媒体帖子中准确提取实体,从而实现围绕这些实体的情感分析和意见挖掘。这可以为业务提供有关客户反馈、品牌认知以及潜在问题或机会的宝贵见解,使他们能够积极应对并相应地调整其营销和沟通策略。

在本节中,我们介绍了适用于实体提取背景下的工业应用。请记住,随着我们在不同行业中发现更多多样化的场景,这些用例的数量可以呈指数级增长。现在,让我们学习如何利用 Amazon Bedrock 进行实体提取用例。

Amazon Bedrock 的实体提取

在其核心,使用 GenAI 进行实体提取涉及提供提示,指导模型在给定的文本输入中识别和分类相关实体。关键在于构建清晰、一致且提供足够示例的提示,以便模型理解期望的行为。

Amazon Bedrock 服务,能够以无服务器的方式调用 LLMs,为实体提取提供可扩展且成本效益高的解决方案。此服务允许开发者利用预训练模型或在其自定义数据集上进行微调,从而实现针对特定领域或用例的定制实体提取。

结构化实体提取提示

在设计实体提取任务的提示时,向模型提供清晰的指示和示例至关重要。一个结构良好的提示通常包括以下组件:

  • 在给定的文本中识别和分类以下实体。

  • PersonOrganizationLocation等等。

  • 示例输入和输出:包括一个或多个带有相应实体标注的输入文本示例。这有助于模型理解期望的输出格式并从现实世界的实例中学习。

以下是一个示例提示:

'''

: 在给定的文本中识别和分类以下实体:

实体类型:Person,Organization,Location

: "迈克尔·乔丹,芝加哥公牛队的传奇篮球运动员,在辉煌的职业生涯后宣布退役。"

输出看起来像这样:

[Person: Michael Jordan], [Organization: Chicago Bulls], [Location: NBA]

让我们再看一个例子:

: "苹果公司,位于加利福尼亚州库比蒂诺的科技巨头,在新闻发布会上发布了其最新的 iPhone 型号。"

输出看起来像这样:

[Organization: Apple Inc.], [Location: Cupertino], [Location: California]

'''

让我们通过一个代码示例来探索这些用例,并通过在 Amazon Bedrock 上调用 Anthropic Claude 3 Sonnet FM 来生成输出。

注意

请确保您已安装所需的库,例如boto3,以便运行代码。如果没有,请在您的编辑器中使用pip install boto3命令安装库。

此外,请确保您已启用对 Amazon Bedrock 上可用的模型访问权限。有关 Bedrock 上模型访问的进一步文档,请访问 https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html。

# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt_data = """
Human: You are a helpful AI assistant. If you are unsure about the answer, say I do not know. Skip the preamble.
Task: Identify and classify the following entities in the given text:
Entity Types: Person, Organization, Location
Input Text: "Michael Jordan, the legendary basketball player for the Chicago Bulls, announced his retirement from the NBA after an illustrious career."
Assistant:
"""
messages=[{ "role":'user', "content":[{'type':'text','text': prompt_data}]}]
body=json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            «max_tokens»: 512,
            «messages»: messages,
            «temperature»: 0.1,
            "top_p": 1
        }
    )
response = bedrock_runtime.invoke_model(body=body, modelId="anthropic.claude-3-sonnet-20240229-v1:0")
response_body = json.loads(response.get('body').read())
print(response_body['content'][0].get("text"))

这里是 FM 的一个示例输出:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_01.jpg

图 8.1 – 示例输出

虽然这种基本结构适用于简单情况,但更高级的提示技术对于稳健、生产级别的实体提取是必需的。

结合上下文和领域知识

实体提取场景通常受益于上下文信息和领域特定知识。在提示中提供相关的背景或领域特定细节,可以增强模型的理解并提高其准确识别实体的能力。

这里有一个带有上下文的示例提示:

```py ``````py

: Identify and classify entities related to sports in the given text.

Entity Types: Athlete, Team, Tournament, Sport

: This text discusses sports events, teams, and athletes involved in various sports competitions.

: "Serena Williams, a well renowned Tennis player, defeated Venus Williams to win 23rd Grand Slam title at the 2017 Australian Open."

The output looks like this:


[运动员:塞雷娜·威廉姆斯], [运动员:维纳斯·威廉姆斯], [赛事:大满贯], [赛事:澳大利亚公开赛], [运动:网球]

```py

```````py ````

在*图 8*.2 中,展示了前一个用例的代码示例。需要注意的是,代码并未明确提及已安装的库。假设用户已经预先安装了之前代码示例中详细说明的所需 Python 包和库:

<https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_02.jpg>

图 8.2 – 使用上下信息提示 Amazon Bedrock FM 进行实体提取

它可能会根据输入指令为某些 FM 生成有利的输出。然而,在其他情况下,它有可能生成幻觉或无关的额外信息,如*图 8*.3 所示。因此,在这种情况下使用少样本提示对于实体提取是有益的:

<https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_03.jpg>

图 8.3 – AI21 Labs J2 Jumbo Instruct FM 输出

## 利用少样本学习

如您所知,少样本学习涉及在训练或推理期间向模型提供少量标记示例。这种方法对于实体提取任务尤其有效,因为它允许模型从有限的高质量示例中学习并推广到新的、未见过的数据。

这里是一个带有少样本学习的示例提示:

```py` ``````py`

`: Identify and classify entities related to technology companies in the` `given text.`

`: Company,` `Product, Location`

`:`

`: "Microsoft, based in Redmond, Washington, unveiled its latest operating system, Windows 11, at a` `virtual event."`

`The output looks` `like this:`

[公司:微软], [产品:Windows 11], [地点:雷德蒙德], [地点:华盛顿州]


`Here's` `another example:`

`: "Google's parent company, Alphabet Inc., announced plans to expand its data center operations in Iowa` `and Nevada."`

`The output looks` `like this:`

[公司:Alphabet Inc.], [公司:Google], [地点:爱荷华州], [地点:内华达州]


`Let's look at` `another example:`

`: "Samsung Electronics, the South Korean tech giant, launched its new flagship smartphone, the Galaxy S22, featuring a powerful camera and improved` `battery life."`

`The output looks` `like this:`

[公司:三星电子], [产品:Galaxy S22], [地点:韩国]


`Now, look at the following` `use case:`

`: "Amazon, the e-commerce behemoth based in Seattle, Washington, unveiled its latest line of Echo smart speakers and Alexa-powered devices at a` `hardware event."`

```````py ````

让我们为前面的用例编写一个代码示例,并在 Amazon Bedrock 上调用 Amazon Titan 模型:

```py
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt_data = """Task: Identify and classify entities related to technology companies in the given text.
Entity Types: Company, Product, Location
Few-Shot Examples:
Input Text: "Microsoft, based in Redmond, Washington, unveiled its latest operating system, Windows 11, at a virtual event."
Output: [Company: Microsoft], [Product: Windows 11], [Location: Redmond], [Location: Washington]
Input Text: "Google's parent company, Alphabet Inc., announced plans to expand its data center operations in Iowa and Nevada."
Output: [Company: Alphabet Inc.], [Company: Google], [Location: Iowa], [Location: Nevada]
Input Text: "Samsung Electronics, the South Korean tech giant, launched its new flagship smartphone, the Galaxy S22, featuring a powerful camera and improved battery life."
Output: [Company: Samsung Electronics], [Product: Galaxy S22], [Location: South Korea]
Your Input Text: "Amazon, the e-commerce behemoth based in Seattle, Washington, unveiled its latest line of Echo smart speakers and Alexa-powered devices at a hardware event."
Output:
"""
body = {
    "inputText": prompt_data
}
modelId = "amazon.titan-tg1-large"
accept = «application/json»
contentType = «application/json»
response = invoke_model(body, modelId, accept, contentType)
response_body = json.loads(response.get("body").read())
print(response_body.get("results")[0].get("outputText"))

执行前面的代码会生成以下输出,如图8.4所示:

[Company: Amazon], [Product: Echo smart speakers, Alexa-powered devices], [Location: Seattle], [Location: Washington]

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_04.jpg

图 8.4 – Amazon Titan FM 生成的输出

因此,在这个例子中,提示提供了一组标记实例,以帮助模型理解技术领域内的实体提取任务。通过利用少量样本学习,模型可以熟练地泛化到不熟悉的输入文本,同时保持高精度。

迭代优化和评估

提示工程是一个迭代过程,通常需要优化和评估。在探索各种提示和技术时,通过自动模型评估或人工评估方法评估模型的性能至关重要,如第十一章所述。通过仔细分析模型的输出并确定改进领域,您可以迭代地优化您的提示,从而提高实体提取系统的整体准确性。

看一下以下模型分析和优化的示例:

'''

:

: 识别和分类给定文本中的实体。

实体类型:人物,组织,位置

: "Elon Musk,特斯拉公司的首席执行官,宣布计划在 Austin, Texas 建设一个新的超级工厂。"

输出看起来是这样的:

[Person: Elon Musk], [Organization: Tesla Inc.], [Location: Austin]

: 模型正确地识别了人物和组织实体,但遗漏了 位置 "Texas."

:

: 识别和分类给定文本中的实体,包括嵌套或 多词实体。

实体类型:人物,组织,位置

: "Elon Musk,特斯拉公司的首席执行官,宣布计划在 Austin, Texas 建设一个新的超级工厂。"

输出看起来是这样的:

[Person: Elon Musk], [Organization: Tesla Inc.], [Location: Austin, Texas]

'''

通过细化提示以包括处理嵌套或多词实体的说明,模型的性能得到了提升,正确地将位置识别为 Austin, Texas。

我们鼓励用户在 Amazon Bedrock 上运行提供的代码,使用 Claude 3 模型和Messages API 提取相关实体。如前所述,请确保在 Amazon Bedrock 上启用对这些模型的访问。有关在 Bedrock 上访问模型的进一步文档,请访问docs.aws.amazon.com/bedrock/latest/userguide/model-access.html

注意

确保您已安装boto3库,如前几章所述。如果没有,请使用以下命令安装最新版本:pip install boto3

#importing the relevant libraries
import boto3
import json
#Creating Bedrock client and region
bedrock_client = boto3.client('bedrock-runtime',region_name='us-east-1')
prompt = """
Task: Identify and classify entities in the given text.
Entity Types: Person, Organization, Location
Input Text: "Elon Musk, the CEO of Tesla Inc., announced plans to build a new Gigafactory in Austin, Texas.
Output:
"""
messages = [{ "role":'user', "content":[{'type':'text','text': prompt}]}]
max_tokens=512
top_p=1
temp=0.5
system = "You are an AI Assistant"
body=json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            «max_tokens»: max_tokens,
            «messages»: messages,
            "temperature": temp,
            "top_p": top_p,
            "system": system
        }
    )
response = bedrock_client.invoke_model(body= body, modelId = "anthropic.claude-3-sonnet-20240229-v1:0")
response_body = json.loads(response.get('body').read())
print(response_body)

按照前面的代码片段打印response_body可能会得到以下预期的输出:

{'id': 'msg_01RqxLfg6hEEu1K8jY3g8gzq',
 'type': 'message',
 'role': 'assistant',
 'content': [{'type': 'text',
   'text': 'Person: Elon Musk\nOrganization: Tesla Inc.\nLocation: Austin, Texas'}],
 'model': 'claude-3-sonnet-28k-20240229',
 'stop_reason': 'end_turn',
 'stop_sequence': None,
 'usage': {'input_tokens': 71, 'output_tokens': 23}}

因此,通过利用 Amazon Bedrock 中的有效提示工程技术,例如提供清晰的指令、相关的示例和解决歧义,GenAI 模型可以被引导在多个用例和不同领域执行高质量实体提取。与任何 AI 应用一样,它需要仔细的设计、测试和改进,以构建一个真正适合生产的系统。

随着大型语言模型(LLMs)的规模和复杂性的持续增长,它们在实体提取方面的能力预计将进一步提高,从而实现更准确和稳健的解决方案。

持续的研究还集中在将外部知识源(如知识图谱或本体)集成到 LLMs 中以进行实体提取。通过将这些结构化知识嵌入到模型的架构或训练方案中,这些方法有可能丰富模型对实体及其相互关系的理解,从而有可能提高性能和可解释性。

请查看以下 AWS 博客,展示了在 AWS AI/ML 服务(如 Amazon Textract 与 Amazon Bedrock 和 LangChain)的背景下,使用智能文档处理(IDP)进行实体提取自动化的集成:aws.amazon.com/blogs/machine-learning/intelligent-document-processing-with-amazon-textract-amazon-bedrock-and-langchain/

此解决方案特别有益于处理手写或扫描文档,包括从各种文件格式(如 PDF、PNG、TIFF 和 JPEG)中提取相关数据,无论文档布局如何。Amazon Textract 服务简化了此类扫描文档中文本、手写和数据的自动提取。

因此,此解决方案利用了每个组件的优势:Amazon Textract 用于精确数据提取,Amazon Bedrock 用于简化的数据处理管道,LangChain 用于无缝集成 LLMs 到工作流程中。总的来说,该博客文章提供了一个实用的解决方案,用于自动化文档处理任务,强调了利用 AWS 服务和开源框架(如 LangChain)开发智能应用的优点。因此,它具有在多样化的文档处理场景中提供动态适应不断变化的数据模式的大量潜力。

在此处还添加了使用 Bedrock 进行实体提取的更多示例:github.com/aws-samples/amazon-bedrock-workshop/blob/main/01_Text_generation/04_entity_extraction.ipynb。鼓励用户运行和执行代码单元,以更好地理解使用 Amazon Bedrock 进行 GenAI 用例的实体提取。

现在你已经更详细地掌握了实体提取的概念,我们将深入亚马逊 Bedrock 宇宙中的更多代码生成场景。

使用 LLM 进行代码生成——释放 AI 驱动开发的潜力

随着人工智能领域的持续发展,最令人兴奋和有前景的领域之一是使用 LLM 进行代码生成,尤其是在提高开发者生产力的方面。客户可以利用亚马逊 Bedrock 上提供的最先进的 LLM 生成高质量的代码,从而彻底改变开发者对待软件开发的方式。

代码生成过程

使用亚马逊 Bedrock 进行代码生成的过程简单直观,开发者可以通过基于网页的界面或 API 与平台交互,如前几章所述。该过程通常包括以下步骤:

  1. 问题描述:开发者提供对所需功能或任务的天然语言描述,该代码需要执行。

  2. 上下文和约束:开发者可以选择提供额外的上下文,例如编程语言偏好、编码风格或特定库或框架的使用。

  3. LLM 代码生成:亚马逊 Bedrock 的 LLM 分析问题描述和提供的任何上下文,并生成相应的代码。

  4. 代码优化:生成的代码可以通过额外的提示或开发者的反馈进行迭代优化,从而实现协作和交互式的过程。

  5. 代码集成:最终生成的代码可以无缝集成到开发者的项目或代码库中。

使用亚马逊 Bedrock 进行代码生成的益处

利用大型语言模型(LLM)进行代码生成为开发者带来了众多好处,包括以下几方面:

  • 提高生产力:借助亚马逊 Bedrock,开发者可以快速生成用于各种任务和功能的代码,减少手动编码所需的时间和精力。

  • 提高代码质量:亚马逊 Bedrock 的 LLM 生成的代码可以提供高质量的输出,遵循基于提示迭代优化的最佳实践和编码标准。

  • 减少错误:通过提示工程生成正确且连贯的代码,LLM 可以帮助减少常见编码错误的可能性,例如语法错误或逻辑错误。

  • 探索和原型设计:Bedrock 使开发者能够快速探索和原型设计不同的想法和方法,从而促进更高效和更具创造性的问题解决。

  • 易用性:通过利用自然语言描述和用于代码生成的 FM(如 Llama、Claude、Titan、Mistral 等),亚马逊 Bedrock 使得代码生成对具有不同技术水平或背景的开发者更加容易。

局限性和考虑因素

虽然基于 LLM 的代码生成提供了许多优势,但了解其局限性和考虑因素同样重要:

  • 专业领域知识:LLMs 可能并不总是生成需要高度专业领域知识或复杂算法的代码。在某些情况下,仍然可能需要人类的专家知识和审查。

  • 安全和合规性:生成的代码应彻底审查和测试,以确保其符合安全最佳实践和任何相关的合规性要求。

  • 集成和维护:生成的代码可能需要随着时间的推移进行适应和维护,因为需求或依赖关系发生变化。

  • 伦理考量:与任何 AI 系统一样,确保 LLMs 负责任和道德地使用至关重要,考虑到潜在的偏见或意外后果。

用例和示例

Amazon Bedrock 的代码生成能力可以应用于各个领域和编程语言的广泛用例。以下是一些示例:

  • Web 开发:开发者可以使用 Bedrock 使用 JavaScript、Python 或 Ruby 等语言生成用于 Web 应用程序、API 或用户界面的代码。

  • 数据处理和分析:开发者可以利用 Bedrock 使用 Python 或 R 等语言编写数据操作、分析和可视化任务的代码。

  • 移动应用开发:Bedrock 可用于使用 Swift、Kotlin 或 React Native 等语言生成移动应用的代码。

  • 嵌入式系统和物联网(IoT)设备:开发者可以在 Bedrock 模型的帮助下,使用 C、C++或 Rust 等语言创建嵌入式系统、微控制器或 IoT 设备的代码。

  • 科学计算:Bedrock 可以通过其代码生成功能帮助编写使用 MATLAB、Julia 或 Fortran 等语言进行科学模拟、数值计算或数据处理任务的代码。

现在,让我们看看一些使用 Amazon Bedrock 进行代码生成、调试或代码转换用例的例子。

Amazon Bedrock 的提示工程示例

以下是在 Amazon Bedrock 中给 Claude 3 Sonnet 模型提供的示例提示,以采用 Python 开发者的角色并执行代码生成任务:

py`Human: You are an expert Python developer tasked with coding a web scraper for an experienced developer. The scraper should extract data from multiple web pages and store the results in a SQLite database. Write clean, high-quality Python code for this task, including necessary imports. Do not write anything before the python 代码块。在编写代码后,仔细检查错误。如果存在错误,请在标签内列出它们,并提供一个新的修正版本。如果没有错误,请在标签内写上“CHECKED: NO ERRORS”。

导入相应的库

import boto3

import botocore

import os

import json

import sys

#使用 Boto3 库创建客户端 Amazon Bedrock 连接

region = os.environ.get(“AWS_REGION”)

bedrock_runtime = boto3.client(service_name=‘bedrock-runtime’,region_name=region)

在此处添加提示示例:

prompt_data = “”“Human: 你是一位经验丰富的 Python 开发者,需要编写一个用于经验丰富的开发者的网络爬虫。爬虫应从多个网页中提取数据,并将结果存储在 SQLite 数据库中。为这个任务编写干净、高质量的 Python 代码,包括必要的导入。不要在 ```pypython block. After writing the code, carefully check for errors. If errors exist, list them within tags and provide a new corrected version. If no errors, write “CHECKED: NO ERRORS” within tags.
Assistant:
“””

Using Messages API with Anthropic Claude

messages=[{ “role”:‘user’, “content”:[{‘type’:‘text’,‘text’: prompt_data}]}]
body=json.dumps(
        {
            “anthropic_version”: “bedrock-2023-05-31”,
            «max_tokens»: 512,
            «messages»: messages,
            «temperature»: 0.1,
            “top_p”: 1
        }
    )
response = bedrock_runtime.invoke_model(body=body, modelId=“anthropic.claude-3-sonnet-20240229-v1:0”)
response_body = json.loads(response.get(‘body’).read())


我们不会深入探讨生成的全部输出,但 *图 8**.5* 中提供了一个由 Amazon Bedrock API 通过前面的提示调用 Claude 3 Sonnet 模型生成的代码片段:

<https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_05.jpg>

图 8.5 – 通过 Amazon Bedrock 调用 Claude 3 Sonnet 模型生成的输出代码片段

*图 8**.6* 展示了另一个代码调试用例的示例,利用 Amazon Bedrock 上的 Llama 2 Chat 13B 模型在聊天沙盒中进行:

<https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_08_06.jpg>

图 8.6 – 在 Amazon Bedrock 上使用 Llama 2 Chat 13B 模型进行代码调试

现在,让我们看看一个代码翻译场景。以下是在 Amazon Bedrock 上使用 Mixtral 8X7B 指令模型的一个代码翻译用例的示例提示,随后是生成的输出:

```py
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt="""
[INST] You are an AI code translator specialized in converting code between different programming languages while preserving functionality, readability, and style. Your task is to translate the provided Python code to JavaScript.
Here is a brief description of the code's purpose:
This code defines a class called 'BankAccount' that represents a basic bank account. It has methods to deposit and withdraw money, as well as to check the account balance.
Python code is in the following code block:
```python

class BankAccount:

def __init__(self, initial_balance=0):

self.balance = initial_balance

def deposit(self, amount):

self.balance += amount

def withdraw(self, amount):

if self.balance >= amount:

self.balance -= amount

else:

print("Insufficient funds")

def check_balance(self):

return self.balance

```py
Translate the above Python code to JavaScript, maintaining clear variable naming, proper indentation, and adding comments to explain any non-trivial logic or language-specific constructs used in the translation.
After translating the code, carefully review your work for any errors or inconsistencies. If errors are found, list them within `<error>` tags and provide a corrected version. If no errors are present, write "CHECKED: NO ERRORS" within `<error>` tags.
[/INST]"""
#Model ID and parameter details
modelId = 'mistral.mixtral-8x7b-instruct-v0:1'
accept = 'application/json'
contentType = 'application/json'
body = json.dumps({
    'prompt': prompt,
    'max_tokens': 1000,
    'top_p': 0.9,
    'temperature': 0.2,
})
#Output response
response = bedrock_runtime.invoke_model(body=body.encode('utf-8'), # Encode to bytes
      modelId=modelId,
      accept=accept,
      contentType=contentType)
response_body = json.loads(response.get('body').read().decode('utf-8'))
print(response_body.get('outputs')[0].get('text'))

翻译后的 JavaScript 代码输出如下所示:

Here's the Python code translated into JavaScript with clear variable naming, proper indentation, and comments explaining non-trivial logic or language-specific constructs used in the translation:
```javascript

// 定义 BankAccount 类

class BankAccount {

// 使用初始余额 0 初始化余额属性

constructor(initial_balance = 0) {

this.balance = initial_balance;

}

// 存款方法,向余额中添加金额

deposit(amount) {

this.balance += amount;

}

// 提款方法,如果余额充足则从余额中减去金额

withdraw(amount) {

if (this.balance >= amount) {

this.balance -= amount;

} else {

console.log("Insufficient funds");

}

}

// 检查余额方法,返回当前余额

check_balance() {

return this.balance;

}

}

```py
After reviewing the translated code, no errors or inconsistencies were found.
<error>NO ERRORS</error>

在这个例子中,提示提供了关于代码目的和原始 Python 代码的上下文,并指示 Code Llama 将其翻译成 JavaScript。模型被要求保持清晰的变量命名和适当的缩进,并添加注释来解释非平凡逻辑或语言特定的结构。

生成的输出显示了翻译后的 JavaScript 代码,类结构和方法的翻译正确,同时保留了原始功能。在翻译代码后,模型仔细审查了其工作,并在 <error> 标签内指示 CHECKED: NO ERRORS,表示翻译正确且无错误。

本例演示了如何构建一个提示来引导 Code Llama(或类似的 AI 代码模型)执行代码翻译任务,同时确保翻译后的代码经过验证且正确。请注意,始终对生成的输出进行人工评估,以验证这些模型的准确性并纠正任何问题。

鼓励用户在 Amazon Bedrock 沙盒中尝试这些示例,或者利用 Amazon Bedrock API 与 Amazon Titan、Cohere Command、Meta Llama 以及其他 Anthropic Claude 或 Mistral 模型的变体等几个其他模型一起测试生成的输出并进一步优化。

用户还被邀请探索这个代码示例,其中使用了 Amazon Bedrock LLMs 进行零样本提示以生成 SQL 和 Python 程序:github.com/aws-samples/amazon-bedrock-workshop/blob/main/01_Text_generation/01_code_generation_w_bedrock.ipynb

利用 GenAI 进行实体提取代表了我们从非结构化文本数据中提取有价值见解能力的重要进步。通过利用 LLM 的力量并将它们与基于规则的技巧相结合,混合方法为广泛的适用范围提供了准确、可扩展和领域自适应的解决方案。随着我们继续推动这些领域的边界,我们有望在各个行业和领域中解锁知识发现、决策支持和数据驱动创新的新机会。

基于 LLM 的代码生成领域也在迅速发展,Amazon Bedrock 处于这一激动人心的发展的最前沿。随着 LLM 变得更加先进,可用的训练数据持续增长,代码生成的功能和应用将得到进一步扩展。Amazon Bedrock 在代码生成领域迈出了重要的一步,使开发者能够利用 LLM 的力量提高生产力,改善代码质量,并更有效地探索新想法。随着这项技术的不断成熟,它有可能彻底改变软件开发的方式,并为各个行业和领域开辟新的创新可能性。

摘要

本章从深入探讨实体提取开始,揭示了其基础、技术和最佳实践。然后转向展示实体提取在工业应用中的潜力,突出展示了在各个行业从非结构化数据中解锁有价值见解的实际用例。

认识到提示工程的关键作用,本章进一步提供了一份关于如何制作有效提示的全面指南,为读者提供了优化实体提取性能的策略和指导方针。转换话题,讨论随后聚焦于在亚马逊 Bedrock 上使用 LLM 进行代码生成的变革潜力。我们深入了解了 LLM 在推动基于 AI 的开发方面的能力和局限性,以及利用这些前沿模型的方法。

最后,本章以对代码生成实际用例的引人入胜的探索作为结尾,展示了这项技术如何加速创新并提高各个领域的生产力。通过现实世界的例子和案例研究,读者亲眼见证了代码生成在简化开发流程和释放新可能性方面的深远影响。在下一章中,我们将探讨亚马逊 Bedrock 的图像生成用例及其潜在应用。敬请期待!

第九章:使用亚马逊 Bedrock 生成和转换图像

到目前为止,我们已经探索了几个能够生成文本响应的 LLMs。本章将探讨使用亚马逊 Bedrock 上可用的选择 FM 生成图像。我们将从图像生成的概述开始,其中我们将检查如 GANs 和变分自编码器VAEs)等模型架构。然后,我们将介绍一些图像生成和亚马逊 Bedrock 中可用的多模态模型的实际应用。此外,我们将深入了解几个多模态设计模式,以及亚马逊 Bedrock 提供的伦理考虑和保障措施。

到本章结束时,您将了解如何使用亚马逊 Bedrock 实现图像生成及其设计模式,以应用于实际案例。

本章将涵盖以下关键主题:

  • 图像生成概述

  • 多模态模型

  • 多模态设计模式

  • 伦理考虑和保障措施

技术要求

本章要求您拥有 AWS 账户访问权限。如果您还没有账户,可以访问aws.amazon.com/getting-started/创建一个。

其次,您需要在aws.amazon.com/cli/创建账户后安装和配置 AWS CLI,这将用于从您的本地机器访问亚马逊 Bedrock FM。由于我们将执行的多数代码单元都是基于 Python 的,因此在此时设置 AWS Python SDK(Boto3)docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html将非常有用。您可以通过任何方式执行 Python 设置。在您的本地机器上安装它,或者使用 AWS Cloud9,或者利用 AWS Lambda,或者利用 Amazon SageMaker。

注意

与亚马逊 Bedrock FM 的调用和定制相关将产生费用。请参阅aws.amazon.com/bedrock/pricing/以获取更多信息。

图像生成概述

图像生成是一个令人着迷且快速发展的领域。自从深度学习技术的兴起和计算能力的增强以来,机器已经获得了从零开始或基于文本提示创建高度逼真和复杂的图像的非凡能力。这种能力在各种领域打开了广泛的应用,包括创意产业、媒体和娱乐、广告、产品包装等。

图像生成的历史可以追溯到计算机视觉和模式识别的早期发展。研究人员和科学家长期以来一直在寻求理解和复制人类的视觉感知系统,为图像合成和操纵的初始技术铺平了道路。然而,图像生成的真正突破是在深度学习出现时,特别是 GANs 和 VAEs 的引入。

请注意,我们强调这些技术是为了历史参考。当前的图像生成 FM 并不使用这些技术。

GANs 和 VAEs 是什么?

GANs(生成对抗网络),由伊恩·古德费洛及其同事于 2014 年提出,彻底改变了图像生成领域。您可以在arxiv.org/pdf/1406.2661上了解更多相关信息。GANs 采用了一种独特的训练方法,其中两个神经网络在竞争中相互对抗。第一个网络被称为生成器,其任务是生成模仿真实数据的合成样本。例如,生成器可以生成新的图像、文本或音频剪辑。第二个网络被称为判别器。其作用是分析示例,包括真实和合成的,以分类哪些是真实的,哪些是人工生成的。

通过这种对抗过程,生成器学会产生越来越令人信服的伪造品,可以欺骗判别器。同时,判别器在检测揭示合成样本的微妙异常方面的能力也在不断进化。它们竞争的目标推动两个网络不断改进。GANs 的演示可以在thispersondoesnotexist.com/上看到。通过不断刷新页面,用户会看到一个不断涌现的新颖人脸流。然而,这些面孔都不是真实的——所有这些都是由一个在大量真实人脸图像数据库上训练的 GAN 生成的合成肖像。该网站展示了 GANs 如何在许多领域合成高度逼真的输出。

自 GANs 问世以来,已经实施了许多进步和变化,导致图像生成领域取得了显著成就。如 StyleGAN、BigGAN 和扩散模型等技术推动了图像质量、分辨率和多样性的边界。这些模型可以生成逼真的人脸、风景、物体甚至艺术作品的图像,模糊了人工和真实之间的界限。

另一方面,VAEs(变分自编码器)是训练生成式 AI 算法的一种更简单的方法。它们也利用两个神经网络:编码器解码器。编码器通过将其映射到低维潜在空间来学习数据中的模式;解码器使用这些潜在空间中的模式来生成逼真的样本。

图像生成领域最令人兴奋的发展之一就是自然语言处理能力的集成。例如 DALL-E、Stable Diffusion 和 Midjourney 等模型,使得用户只需提供文本描述或提示,就能生成图像。这种语言与视觉的结合为创意表达、快速原型设计和各种机器学习任务的数据增强开辟了新的途径。

虽然图像生成技术的进步令人瞩目,但解决与这项技术相关的伦理考虑和潜在风险至关重要。如深度伪造、偏见和恶意用途等问题必须得到妥善处理,以确保这些强大工具的负责任和道德部署。我们将在本章的“伦理考虑和保障措施”部分详细探讨这一主题。

让我们来看看图像生成模型的一些实际应用。

实际应用

图像生成的应用是无限的。以下是图像生成的一些实际应用:

  • 广告和营销:在广告和营销的世界里,视觉在吸引注意力和有效传达信息方面发挥着至关重要的作用。通过图像生成,你可以通过生产针对特定目标受众的独特、视觉冲击力强的图像来革新营销活动。营销人员可以利用 Bedrock 模型生成个性化的产品广告、社交媒体视觉图像和吸引人的图形,这些图像与他们的目标受众产生共鸣。此外,营销人员可以根据客户偏好创建图像变体,确保营销材料高度相关且具有吸引力。

  • 图形设计和内容创作:图形设计师和内容创作者在执行之前,常常面临构思和可视化想法的挑战。借助 Bedrock 的图像生成模型,你可以通过依赖这个强大的工具来生成初始概念、插图和视觉资产,从而简化这一过程。设计师可以使用图像生成模型来探索不同的风格、构图和配色方案,促进快速迭代和实验。此外,内容创作者可以利用 Bedrock 模型生成独特且吸引人的图像,用于博客文章、文章或其他营销材料,增强其视觉吸引力并提高参与度。

  • 产品可视化和原型设计:有效的产品可视化对于迭代设计、收集反馈和展示产品至关重要。借助 Bedrock 图像生成模型,企业可以生成产品设计的逼真可视化,从而在投资物理原型之前进行快速原型设计和评估。Bedrock 模型可以创建产品在不同环境或不同角度的图像,为利益相关者提供产品外观和功能的全面理解。这种能力可以显著加速产品开发周期,并有助于市场营销和销售工作。

  • 游戏和虚拟环境:游戏和虚拟现实VR)行业高度依赖视觉沉浸式体验。Bedrock 的图像生成模型可以赋予开发者创建独特纹理、环境和资产的能力,用于视频游戏、VR 或增强现实AR)应用。Bedrock 图像模型可以根据用户规格或游戏叙事生成定制的头像、角色设计和复杂的视觉元素。此外,开发者可以增强其虚拟世界的真实性和多样性,为玩家提供更具吸引力和个性化的体验。

  • 建筑和室内设计:对于建筑师、室内设计师以及他们的客户来说,可视化建筑设计和室内空间至关重要。Bedrock 图像模型可以生成提议设计的逼真渲染图,使利益相关者在施工或翻新前沉浸于设想的空间。Bedrock 的能力有助于可视化不同的材料、家具布局和照明条件,使建筑师和设计师能够完善他们的概念并向客户或决策者展示有说服力的提案。

  • 时尚和服装:在时尚和服装行业中,Amazon Bedrock 图像模型可以生成独特的纺织品设计、图案和服装风格,使时尚设计师能够探索新概念并保持对潮流的领先。此外,Bedrock 还可以创建不同体型或不同环境中的服装物品的视觉表示,让客户在购买前预览服装的真实效果。这种能力可以提升购物体验并降低退货率。

  • 科学可视化:在研究和教育中,有效地传达科学数据、现象和模拟至关重要。Amazon Bedrock 的图像生成模型可以帮助科学家和研究人员创建复杂概念的视觉表示,使它们更加易于获取和理解。Bedrock 模型可以为科学出版物、演示或教育材料生成插图、图表或 3D 模型,促进知识转移并加深对复杂主题的理解。

  • 艺术和创意表达:艺术家可以利用 Bedrock 图像模型通过基于文本提示或概念框架生成独特和富有想象力的图像来探索新的风格、技术和概念。

  • 电子商务和产品目录:在电子商务领域,高质量的产品图像对于吸引顾客和推动销售至关重要。Amazon Bedrock 图像模型可以为在线目录或电子商务平台生成吸引人的、准确的产品图像,减少大量拍摄和相关的成本。这些模型还可以根据客户偏好创建定制产品或配置的可视化,增强购物体验并实现大规模个性化。

既然我们已经看到了一些实际应用,让我们探索各种多模态模型及其内部工作原理。

多模态模型

到目前为止,在这本书中,我们已经探讨了单模态模型架构模式,例如文本到文本生成,这包括问答、摘要、代码生成等。现在让我们扩展我们的理解,到另一种生成式 AI 模型:多模态模型。

多模态模型是一种可以理解和解释多种模态(如图像、音频和视频)的模型,如图 9.1 所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_01.jpg

图 9.1 – 多模态

这些模型收到的响应也可以是多模态的。幕后,这些 FM 包含多个处理文本、图像、音频和视频的单模态神经网络。

现在,让我们看看 Amazon Bedrock 内部可用的多模态模型。

稳定扩散

稳定扩散 是一种在生成式 AI 领域受到广泛关注的最先进的图像生成模型。与许多其他图像生成模型不同,稳定扩散采用了一种独特的基于扩散的方法,使其与其他方法或技术区分开来。

稳定扩散的核心概念是 扩散,它涉及正向和反向扩散过程。在 正向扩散 中,高斯噪声逐渐添加到图像中,直到它完全随机。然后,模型学习逆转这个过程,逐渐去除噪声以重建原始图像。这种逆转称为 反向扩散,是稳定扩散出色性能的关键。

这个扩散过程有几个关键组成部分:

  • 对比语言-图像预训练CLIP):CLIP 是在大量图像-文本对数据集上训练的神经网络,使其能够理解视觉和文本表示之间的语义关系。该组件在连接自然语言提示及其相应的视觉表现之间起着至关重要的作用。

  • U-Net:这作为图像生成过程的骨干。U-Net 是一个用于图像到图像翻译任务的卷积神经网络,如分割和去噪。分割是将图像分割成多个部分或像素集的过程,以定位对象和边界。去噪是从图像中去除噪声以提高其质量。在稳定扩散的上下文中,U-Net 负责根据输入提示和 CLIP 的引导生成和细化输出图像。

  • VAE:这是另一个关键组件,有助于确保生成的图像既连贯又逼真。在稳定扩散中,VAE 将生成的图像编码成一个压缩表示,然后解码以生成最终的输出图像。

图 9.2所示,这里是对整个过程的高级概述:

  1. 用户提供一个描述所需图像的自然语言提示。

  2. CLIP 模型分析提示并生成相应的嵌入,表示文本的语义意义。

  3. U-Net 架构将这个嵌入作为输入,以及一个初始的随机噪声图像。

  4. 通过一系列卷积和反卷积操作,U-Net 在 CLIP 嵌入的引导下迭代地细化噪声图像,以生成与输入提示匹配的图像。

  5. 生成的图像随后通过 VAE,对其进行编码和解码,确保连贯性和逼真性。

  6. 生成最终的输出图像,反映了用户的提示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_02.jpg

图 9.2 – 稳定扩散过程

通过结合这些架构元素,稳定扩散能够生成高质量、多样化的图像,这些图像不仅视觉上吸引人,而且与输入提示在语义上保持一致。为了理解扩散过程的详细工作原理,鼓励读者阅读研究论文关于扩散模型设计基础的综述。可以在arxiv.org/pdf/2306.04542.pdf找到。

本文解释了扩散模型是如何工作的,通过逐渐向训练数据添加噪声,然后学习逆转这一过程以生成新的样本。文章突出了扩散模型广泛的应用范围,包括图像编辑、文本到图像生成和 3D 物体创建。

此外,建议读者探索 DeepLearning.AI 的扩散模型是如何工作的课程,learn.deeplearning.ai/courses/diffusion-models/

泰坦图像生成器 G1

Titan 图像生成器 G1是 Amazon 的一个专有图像生成模型,允许用户从文本生成图像,编辑现有图像,并创建图像的变体。该模型旨在通过根据文本描述生成多个图像选项来简化用户对图像概念的迭代。该模型在多样化的高质量数据集上进行了训练,因此它可以理解包含多个对象的复杂提示并生成逼真的图像。

此模型支持图像编辑功能,例如使用内置分割模型进行基于文本的编辑,生成图像的变体,使用图像遮罩进行修复,以及扩展或更改图像背景的扩展。您可以上传现有的图像并提供指令或提示来修改图像的特定方面。该模型可以智能地改变构图,添加或删除元素,更改颜色,或应用各种艺术风格,同时保持原始图像的整体一致性和现实主义。

我们将在多模态设计 模式部分深入探讨这些功能。

Titan 多模态嵌入

Titan 多模态嵌入模型是 Amazon Titan 模型系列的一部分,专为需要高精度和快速响应的应用场景,如图像搜索和基于相似度的推荐而设计。

Titan 多模态嵌入模型的核心优势在于其能够为文本和视觉数据生成高维向量表示。这些嵌入封装了不同模态之间的语义关系,允许进行高效有效的搜索和检索操作。

该模型支持最多 128 个 token 作为英文输入文本,以及高达 25MB 的图像大小,并将这些转换为向量嵌入。默认的嵌入维度是 1024,提供丰富的表示,能够捕捉细微的细节和复杂的关系。然而,您也可以根据您的具体用例和性能要求配置更小的向量维度以优化速度和成本。

Anthropic Claude 3 – Sonnet、Haiku 和 Opus

Anthropic Claude 3 模型变体——Claude 3 SonnetClaude 3 HaikuClaude 3 Opus——是 Amazon Bedrock 上可用的 Anthropic Claude 模型中最新的、最先进的系列。所有这些模型都具有多模态能力,这意味着它们能够感知和分析图像以及文本输入,拥有 200K 的上下文窗口。如果您想再次了解它们的详细信息,请参阅第一章中的Anthropic Claude部分。

现在我们已经了解了 Amazon Bedrock 中可用的多模态模型,让我们来探索一些设计模式。

多模态设计模式

通过多模态设计模式,我们整合了不同的模态,如文本、图像、音频等。随着可用的多模态模型,从文本或其他输入模态生成、操作和理解图像的能力在广泛的领域中变得越来越重要,从创意设计到科学可视化等。

可以使用多模态模型创建多种模式。在本节中,我们将介绍一些常见的模式。

文本到图像

在文本到图像模式中,您将文本作为提示提供给模型。然后,模型将根据该提示生成图像,如图图 9.3所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_03.jpg

图 9.3 – 文本到图像模式

参数

图像生成模型的核心是一组可定制的推理参数和控制,使用户能够从模型中获得所需的图像。让我们看看这些参数:

  • Cloudseating bench来排除它们从图像中,如图图 9.4所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_04.jpg

图 9.4 – 带有负面提示的文本到图像模式

  • 参考图像:这为用户提供将参考图像输入到模型的能力,模型可以利用它作为生成响应(生成图像)的基线。例如,如果我们使用前一个图生成的图像并将其作为参考与提示一起传递,提示可能如下所示:

一个夜晚的未来城市景观,由玻璃和金属构成的摩天大楼。建筑被蓝色、紫色和粉红色的霓虹灯光照亮。街道上排列着全息广告牌和广告。

模型将使用参考图像和提示来生成一个新的图像,如图图 9.5所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_05.jpg

图 9.5 – 使用参考图像的文本到图像模式

  • 提示强度 (cfg_scale): 提示强度,也称为无分类器指导尺度 (cfg_scale),决定了生成的图像遵循提供文本提示的程度。较高的值表示图像生成过程将更紧密地遵循文本提示,而较低的值允许更多的创造性解释和生成图像的多样性。通常建议使用中间的 cfg_scale 值(10-15),因为它在忠实代表文本提示和允许艺术表达之间取得了平衡。然而,最佳值可能因您的用例或您所寻找的内容而异,提示的复杂性以及生成图像所需细节的水平。

  • 生成步骤 (步骤): 稳定扩散中的步骤参数指的是算法从输入文本生成图像所经历的迭代或循环次数。这是一个影响最终图像质量和细节的重要设置。以下是其工作原理:

    • 该过程从随机噪声开始,并且随着每一步的进行,部分噪声被移除,逐渐揭示出预期的图像。

    • 步骤数越多通常会导致图像质量更高,细节更丰富,但也会有一个收益递减的点。

    • 理想步骤数可能因你试图生成的图像的复杂性和个人偏好而异。然而,步骤数过多可能不会显著提高图像质量,但会增加生成时间。

    • 对于简单主题或场景,大约10-15步可能就足够了。但对于更复杂或详细的图像,你可能需要增加步骤到40-50或更多,具体取决于你想要多详细。

我们所讨论的只是其中的一些参数。以下图例突出了稳定扩散的附加参数。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_06.jpg

图 9.6 – 稳定扩散文本到图像参数

要详细了解这些参数,你可以查阅platform.stability.ai/docs/api-reference#tag/Image-to-Image上的稳定扩散文档。

如果你正在使用亚马逊 Titan 图像生成器,以下是你可以使用的参数列表:docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-titan-image.html.

图像搜索

图像搜索已成为一种强大的工具,使用户能够探索和利用大量的视觉数据集。通过亚马逊 Bedrock 的 FMs,你可以执行图像搜索以理解和解释视觉内容。你可以识别和理解图像中的各种元素,如物体、场景、颜色、纹理,甚至抽象概念。为了说明图像搜索的力量,让我们考虑一个实际例子。

假设你是一家拥有大量服装商品目录的时尚零售商。使用 Bedrock,你可以上传你的产品图片,并利用图像搜索功能,让客户能够找到视觉上相似的商品。例如,一位客户可以上传一张他们喜欢的连衣裙图片,Bedrock 会从你的目录中返回一组视觉上相似的连衣裙,从而促进更吸引人和个性化的购物体验。

图像搜索的一种强大方法是基于跨模态嵌入,它允许在向量空间中同时表示文本和图像。这些向量捕捉图像的视觉特征和语义信息。然后,这些向量以及如图像路径之类的元数据存储在可搜索的索引向量数据库中,例如 OpenSearch Serverless、FAISS 或 Pinecone。这项技术使您能够使用文本查询搜索图像或根据给定图像(或文本和图像的组合)找到相似图像。

当用户发起搜索时,他们的输入(文本、图像或两者兼有)也会使用相同的跨模态嵌入模型转换为向量表示。然后,搜索向量与索引中的向量进行比较,并根据向量相似度分数检索最相似的向量。这种方法允许灵活直观的图像搜索,因为用户可以使用自然语言描述进行搜索,上传示例图像,或结合文本和图像以获得更精确的结果。例如,您可以搜索“城市街道上的红色跑车”并从其数据存储中返回匹配视觉和文本标准的相关图像。

如您现在可能已经注意到的,这个过程与我们讨论的第五章中的 RAG 过程类似。这里的区别在于,模型是从其数据存储中检索图像,而不是生成新图像。以下是一个尝试跨模态嵌入和搜索的绝佳示例:github.com/aws-samples/amazon-bedrock-workshop/blob/main/04_Image_and_Multimodal/bedrock-titan-multimodal-embeddings.ipynb

跨模态嵌入的图像搜索在各个领域有众多实际应用。在电子商务平台上,它可以用于增强产品搜索和推荐系统,使客户能够找到视觉上相似的产品或使用自然语言描述或示例图像进行搜索。在媒体和娱乐行业,它可以通过识别相似或重复的图像来协助内容组织、标签建议和版权侵权检测。

图像理解

Anthropic Claude 3 模型——Sonnet、Haiku 和 Opus——引入了图像理解能力,通过该能力,模型可以分析图像并根据您想要了解的内容为您提供响应。例如,您可以提供厨房或客厅的图像,并要求模型提供图像的详细描述或根据图像编写虚构故事。

示例 1

使用以下提示:“提供此图像的详细描述”。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_07.jpg

图 9.7 – 输出中的图像理解和详细描述

图 9.7 中,我们向 Anthropic Claude 3 模型提供了厨房的图像,并要求它提供图像的详细描述。模型能够提供诸如 房间特征为深色木制橱柜,与浅色大理石台面形成对比 等细微细节。

示例 2

使用以下提示:根据所附图像编写一个虚构故事

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_08.jpg

图 9.8 – 使用虚构故事进行图像理解

图 9.8 中,您可以看到模型根据提供给它的图书馆图像生成了一个虚构故事。

示例 3

使用以下提示:提供图像中存在的物品/对象的列表,并解释每个物品

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_09.jpg

图 9.9 – 使用对象识别进行图像理解

图 9.9 中,模型能够识别图像中的物品和对象及其详细信息,展示了图像分类/对象识别能力。

Claude 模型的图像理解能力不仅限于前面示例中讨论的内容。它们还可以用于图像标题、创建详细的图像描述、识别主题以及回答有关图像内容的问题。您可以在 docs.anthropic.com/claude/docs/use-cases-and-capabilities#vision-capabilities 查看图像理解的多种用例。

在 Amazon Bedrock 控制台中使用此功能,您可以按照以下步骤操作:console.aws.amazon.com/bedrock-

  1. 前往 Amazon Bedrock 控制台:https://console.aws.amazon.com/bedrock。

  2. 导航到 Chat Playground

  3. 点击 选择模型。选择 Anthropic Claude 3 SonnetAnthropic Claude 3 HaikuAnthropic Claude 3 Opus 模型。

  4. 附加您想要分析的图像,并根据您所寻找的内容提供提示,如图 图 9.10 所示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_10.jpg

图 9.10 – 如何使用 Anthropic Claude 3 模型分析图像

如果您正在使用 AWS SDK,您可以使用 Anthropic 的 Messages API 创建聊天应用程序并提供图像进行理解。以下是一个用于 Claude 3 Sonnet 模型的多模态消息的 AWS Python SDK 示例代码:docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#api-inference-examples-claude-multimodal-code-example

图像到图像模式

当涉及到图像到图像生成时,模型以现有的图像作为输入,并根据您提供的提示或指令对其进行修改。这与基于文本生成图像不同,后者模型完全从头开始创建一个全新的图像,仅基于文本描述或提示。在图像到图像生成中,模型使用现有的图像作为起点,然后应用必要的更改或转换以生成所需的输出图像。这可能涉及调整颜色、纹理、物体或图像的整体构图等各个方面,所有这些都由提示指导。这就像拥有一个黏土模型,并将其重塑成您期望的形状,而不是从一块原始的黏土开始。修改和操作现有图像的能力为各种创意可能性和用例打开了大门,从增强和编辑照片到创建艺术诠释或可视化。

图 9.11 展示了图像到图像生成的一个简单示例。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_11.jpg

图 9.11 – 简单的图像到图像生成

当使用稳定扩散模型进行图像到图像生成时,除了图 9.6 中提到的文本到文本参数外,还有一些额外的参数需要考虑。这些额外的参数在图 9.12 中突出显示。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_12.jpg

图 9.12 – 稳定扩散图像到图像参数

您可以在此处了解更多信息:platform.stability.ai/docs/api-reference#tag/Image-to-Image/operation/imageToImage

接下来,让我们看看一些图像到图像模式。

图像变化

图像变化,也称为图像到图像翻译风格迁移,是生成式人工智能中的一个强大技术,它通过修改现有图像来创建新的独特图像。这个过程涉及获取一个输入图像,并对其应用一个期望的风格或转换,从而生成一个输出图像,该图像结合了原始图像的内容和期望的美学或视觉特征。

一个现实世界的图像变化例子是在时尚设计领域。设计师可以取一个现有的服装或配饰,并应用各种风格、图案或纹理来创建新的创新设计,而无需从头开始。这不仅节省了时间和资源,还允许快速实验和迭代,使设计师能够探索广泛的可能。

在艺术界,图像变化技术也可以用来创建独特和富有表现力的艺术作品。艺术家可以采用简单的照片或绘画,并应用各种艺术风格,如印象派、立体主义或抽象表现主义,以创建完全新的作品,将原始内容与所需的艺术风格融合在一起。这为创造性表达开辟了新的途径,并允许艺术家探索非传统和引人深思的视觉解释。

图像变化在室内设计和建筑可视化领域也有应用。设计师和建筑师可以采用现有的空间或结构,应用不同的材料、纹理或照明条件来可视化空间在不同设计选择下的可能外观。这有助于客户理解和欣赏所提出的设计,同时也使得设计师能够快速迭代和细化他们的概念。

使用 Bedrock,您可以利用 Titan 图像生成器来创建图像变化。让我们尝试以下提示并通过 Titan 图像生成器运行它:

一种精致的自然图案,细致描绘了鸟类、蝴蝶和叶子的图案,非常适合浪漫波西米亚风格的连衣裙或围巾

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_13.jpg

图 9.13 – 图像变化

如*图 9**.13 所示,Titan 图像生成器将创建一个图像(原始图像)。您可以使用原始图像作为参考来生成图像变化,同时还可以提供可选的提示供模型使用。

遮罩

Amazon Bedrock 模型——Amazon Titan Generator 和 Stable Diffusion——提供了两种强大的图像编辑技术:遮罩绘画

使用遮罩,我们定义图像中的特定区域并将其遮罩,要么保留要么重新绘制。这种遮罩可以通过图像文件或提示来完成。

图像遮罩

图像遮罩的方法使用一个单独的图像文件,称为遮罩图像,来指定要遮罩或保留在原始图像中的像素。遮罩图像必须满足以下要求:

  • 与原始图像相同的尺寸和分辨率:在应用图像遮罩时,确保遮罩图像与您想要遮罩的原始图像具有完全相同的尺寸和分辨率至关重要。这确保了遮罩图像中的每个像素都与原始图像中的像素相对应,从而实现精确的遮罩。如果尺寸或分辨率不同,遮罩过程可能会产生扭曲或不理想的结果。

    例如,如果您的原始图像分辨率为 1920 x 1080 像素,遮罩图像也必须具有 1920 x 1080 像素的分辨率。任何尺寸或分辨率的差异都可能导致遮罩与原始图像错位,导致不理想的遮罩效果。

  • 无 alpha 通道:遮罩图像不应包含 alpha 通道,这是某些图像格式中的一个单独组件,用于表示透明度。虽然 PNG 格式通过 alpha 通道支持透明度,但对于图像遮罩目的,遮罩图像应仅依赖于颜色值(红色、绿色、蓝色RGB)或灰度)来表示遮罩和未遮罩区域。

    alpha 通道的缺失简化了遮罩过程,并确保遮罩仅基于像素颜色,而不包含任何额外的透明度信息。这种方法通常因其简单性和与广泛图像处理工具和库的兼容性而受到青睐。

  • 0, 0, 0) 作为遮罩区域,而任何非黑色像素都被视为未遮罩区域。

  • 0(黑色)到255(白色)。遮罩过程将值为0的像素解释为遮罩区域,而将非零值的像素视为未遮罩区域。

RGB 和灰度色彩模式的选择取决于您的具体用途以及您用于图像遮罩的工具或库。某些工具可能对某种色彩模式有偏好。

例如,假设您在食品和饮料行业工作,并且您想从图像中遮罩掉某些食品项目,以创建菜单设计的透明层。假设您想遮罩下图中芯片碗,并可能将其从菜单中移除。图 9*.14*显示了原始图像和遮罩图像,其中遮罩是在芯片碗上进行的。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_14.jpg

图 9.14 – 图像遮罩

如果您想尝试图像遮罩,您可以使用在线照片编辑工具或应用程序。还有Python 图像库PIL),这是一个非常流行的 Python 库,值得在pillow.readthedocs.io/en/stable/reference/Image.html上查看。

此外,我们建议您尝试来自 Amazon Bedrock 研讨会的工作坊中的以下 GitHub 示例,这些示例展示了图像遮罩和绘画:github.com/aws-samples/amazon-bedrock-workshop/tree/main/04_Image_and_Multimodal

遮罩提示

遮罩提示涉及通过使用文本提示来遮罩图像。这些文本提示作为模型的指南,帮助模型理解图像中期望的遮罩区域。

与图像遮罩相比,使用遮罩提示的优点在于其动态性。您只需简单地更改文本提示,就可以轻松地修改遮罩,从而实现快速迭代和实验。这种灵活性使得艺术家、设计师和内容创作者能够探索广泛的视觉概念和叙事,而不会受到传统图像编辑工具的限制。

此外,遮罩提示可以无缝集成到各种工作流程和应用中,实现无缝协作并提高生产力。例如,在视觉叙事领域,作家和导演可以利用此功能来构思和细化他们的愿景,而设计师可以在最终确定最终设计之前快速原型化和迭代视觉概念。

为了确保生成内容的完整性和原创性,Amazon Bedrock 已经实施了强大的措施来防范剽窃和不道德的行为。我们将在下一节讨论道德考虑和保障措施。

让我们以先前的图中的相同例子为例。而不是图像遮罩,我们想要应用遮罩提示。我们将说您想要从原始图像中移除薯片碗。通过遮罩提示,您可以提供只有薯片碗的提示,然后进一步进行绘画。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_15.jpg

图 9.15 – 遮罩提示

图 9.15中,我们执行了图像替换,将薯片碗改为苹果片碗。让我们更详细地讨论绘画。

绘画

绘画是一种技术,您可以使用它填充图像中的遮罩区域或使用图像生成模型扩展它。有两种绘画方法:图像修复和扩展绘画。

图像修复

通过图像修复,您实际上是在重建或填充图像中缺失、被遮罩或损坏的部分。这种技术在图像已被损坏或遮挡,或者其中包含需要移除或替换的不希望存在的元素的场景中特别有用。通过向图像生成模型提供周围环境和有效的提示,它可以在指定区域智能地生成和融合新内容,无缝地重建遮罩区域。

让我们看看一些例子:

  • 电话线并提供一个空的提示文本("")。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_16.jpg

图 9.16 – 图像修复移除

  • 图像替换修复:假设您想要替换图像中的任何对象或场景。在这种情况下,您可以执行图像替换修复。如图图 9.17所示,您可以在提示文本中指定您想要替换的内容。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_17.jpg

图 9.17 – 图像替换修复

扩展绘画

扩展绘画是指将图像扩展到其原始边界之外的过程,换句话说,是在遮罩区域之外进行绘画。扩展绘画在原始图像或艺术品需要通过添加额外的元素、环境或视角进行扩展或增强的场景中非常有用。

让我们看看一个例子。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_18.jpg

图 9.18 – 扩展绘画

图 9.18中,你可以看到我们在蒙版图像或提示(在这种情况下,印度咖喱)之外进行绘画,以添加一些细节。这些包括木质桌子的背景,以及添加勺子、刀子、一碟米饭和一杯奶茶。

如果你想了解 Titan Image Generator 模型的提示工程最佳实践,请查看tinyurl.com/titan-image-generator-prompt

现在我们已经探讨了多模态和图像模式的不同模式,让我们来看看 Amazon Bedrock 中关于伦理考量及可用的安全措施,以确保生成式 AI 的负责任使用。

伦理考量与安全措施

生成式 AI 模型,尤其是那些能够生成高度逼真图像的模型,在传播虚假信息和深度伪造方面引发了重大的伦理担忧。随着这些模型变得越来越强大和易于访问,积极应对这些伦理挑战至关重要,以促进这项技术的负责任开发和部署。

围绕图像生成模型的主要伦理担忧之一是创建和传播误导性或操纵性内容的危险。随着从文本提示生成逼真图像的能力,恶意行为者有可能创建和传播虚假或编造的视觉信息。这可能会产生深远的影响,例如损害对媒体的信任、传播虚假信息,甚至影响政治或社会叙事。

为了应对这一主要伦理挑战,对于组织和研究人员来说,优先考虑生成式 AI 生命周期的负责任开发和部署至关重要。当使用 Amazon Bedrock 时,用户可以利用其水印检测功能来识别由 Amazon Titan Image Generator 生成的图像。

Amazon Bedrock 中的水印检测功能旨在促进 AI 生成图像使用的透明度和问责制。通过在每个由模型创建的图像中嵌入一个不可见的水印,内容创作者、新闻机构、风险分析师等可以迅速验证图像是否是由 Amazon Titan Image Generator 生成的。

这种方法有两个主要的伦理目的:

  • 它通过提供一种验证图像真实性的机制来帮助对抗虚假信息和深度伪造的传播。这有助于在视觉内容中建立信任和信誉,特别是在信息完整性至关重要的领域,如新闻业、执法和科学研究。

  • 水印检测功能促进了图像生成模型使用中的透明度和问责制。通过使识别 AI 生成内容变得更加容易,它鼓励内容创作者和利益相关者采取负责任和道德的做法,从而促进围绕这项技术使用的更开放对话。

要尝试水印检测,你只需在 Amazon Bedrock 控制台中导航到水印检测并上传一张图像。然后 Amazon Bedrock 会分析图像以检测 Amazon Titan 嵌入的水印。

除了检测水印外,你还将收到一个置信度分数,该分数决定了模型能够以多大程度(或确定性)识别图像是由 Amazon Titan 生成的。通常,当图像几乎没有修改时,你会看到一个高置信度分数。然而,如果你对生成的图像进行了一些修改,你可能会看到一个较低的置信度分数。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_19.jpg

图 9.19 – 水印检测

图 9.19所示,我们已上传由 Amazon Titan 生成的图像。水印检测功能能够分析和检测 Titan 生成的水印。

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_09_20.jpg

图 9.20 – 水印未检测到

图 9.20所示,我们已上传由 Stable Diffusion 生成的图像。我们可以看到水印未检测到。

如果你想要尝试使用 API,你可以调用 DetectGeneratedContent 来验证水印是否存在:

import boto3
import json
import base64
bedrock_runtime = boto3.client(service_name="bedrock-runtime")
image_path = "landscape.png"
with open(image_path, "rb") as image_file:
    input_landscape = image_file.read()
response = bedrock_runtime.detect_generated_content(
    foundationModelId = "amazon.titan-image-generator-v1",
    content = {
        "imageContent": { "bytes": input_landscape }
    }
)

这就是响应应该看起来像什么:

response.get("detectionResult")
'GENERATED'
response.get("confidenceLevel")
'HIGH'

这里是水印检测的演示:www.youtube.com/watch?v=M5Vqb3UoXtc

虽然水印检测不是解决所有道德问题的方案,但它是在正确方向上迈出的一步。我们将在本书的第十一章中更深入地讨论道德和负责任的 AI。你现在应该能够理解使用 Amazon Bedrock 的图像生成和设计模式。

摘要

在本章中,我们探讨了图像生成的工作原理。我们还讨论了 Amazon Bedrock 内部多模态模型的工作方式。我们还涵盖了几个现实世界的应用和多模态设计模式,包括文本到图像、图像搜索、图像理解和图像到图像模式,如修复和扩展。我们以对道德考虑的简要概述以及对 Amazon Bedrock 内部水印检测能力的探讨结束本章。在整个章节中,我们更深入地了解了如何利用 Amazon Bedrock 的多模态模型来构建基于文本和图像提示生成、理解和操作图像的应用程序。

在下一章中,我们将探讨使用 Amazon Bedrock 构建智能代理的主题。

第十章:使用 Amazon Bedrock 开发智能代理

在本章中,读者将探索 生成式人工智能GenAI)中的代理概念,深入了解其重要性、益处以及可用的各种工具和类型。

读者将学习构建知识库并开发专门为 Amazon Bedrock 设计的代理,深入了解配置、测试和部署策略。此外,本章将展示现实世界的工业用例,突出代理与 Amazon Bedrock 结合的实际应用。

通过实际案例,读者将获得描述代理角色、将 LangChain 代理与 Amazon Bedrock 集成、理解代理在 Amazon Bedrock 中的配置、构建、测试和部署针对此服务的代理的技能。此外,他们还将探索各种工业用例,展示代理在增强 Amazon Bedrock 功能方面的多功能性和潜力。

具体来说,读者将清楚地了解以下内容:

  • 什么是代理?

  • GenAI 代理角色、职责和用例场景

  • Amazon Bedrock 与 LangChain 代理的集成

  • Amazon Bedrock 代理

  • 在 Amazon Bedrock 上部署代理

技术要求

本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 创建 AWS 账户。

其次,您需要在创建账户后安装和配置 AWS CLI (aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的大多数代码单元基于 Python,此时设置 AWS Python SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将非常有用。您可以通过以下方式执行 Python 设置:在您的本地机器上安装它,或使用 AWS Cloud9,或利用 AWS Lambda,或利用 Amazon SageMaker。

备注

使用 Amazon Bedrock FMs 的调用和定制将产生费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。

什么是代理?

在人工智能的动态领域中,一类复杂的新系统已经出现,它们将显著影响我们与技术的关系。这些被称为 GenAI 代理 的实体,代表了自主性、适应性和认知能力的重大进步。

GenAI 代理是经过工程设计的软件构造,旨在以最小的人类监督理解并执行复杂任务。它们展现出评估目标、制定战略计划并采取行动以实现目标的能力,同时不断根据反馈学习和改进方法。

区分 GenAI 代理与先前迭代的特点是其多面性,结合了反应性、主动性、学习能力和社会适应性。这种独特的融合使它们能够迅速应对不断变化的环境,预测未来的需求,通过持续的学习过程进化,并与人类和其他代理无缝协作。

代理的特点

这里是代理的一些关键特性:

  • 快速响应敏捷性:GenAI 代理在快速响应提示方面表现出色,确保在动态环境中具有敏捷性。例如,在制造业环境中,这些代理可以高效地重新校准流程和重新分配资源,以维持运营效率,即使在需求波动或意外中断的情况下。

  • 思维链(CoT)/推理和行动(ReAct)风格的行动:GenAI 代理根据 CoT/ReAct 风格的提示采取行动,确保对刺激的快速和有效响应。如果你还记得,ReAct 提示是一种旨在提示 LLMs 的方法,旨在提高其响应的准确性,与其他方法如 CoT 相比。例如,在客户服务中,这些代理可以根据预定义的对话提示生成对查询的响应。

  • 预测效用:尽管 GenAI 代理不能自主预测未来事件,但它们根据预定义的参数和输入采取行动。在金融预测中,这些代理利用历史数据和预定义的算法来生成预测,而不是自主预测未来趋势。

  • 持续学习:GenAI 代理具备持续学习和自我改进的能力。与人类同行类似,这些代理根据结果优化其策略和决策过程,不断进化并优化性能。例如,在线推荐系统中,这些代理通过不断学习用户互动来改进个性化推荐。

  • 协作:GenAI 代理在与人及其他代理的无缝协作中表现出色。通过有效的沟通和协调,它们在互联环境中提高生产力和效率。在自动驾驶车辆系统中,这些代理与其他车辆和基础设施协作,以确保在道路上安全高效地导航。

代理的实际应用——释放潜力

GenAI 代理在各个行业都有广泛的应用,展示了它们的多样性和潜在影响。在金融领域,这些代理正在被实验性地用于探索分析市场趋势、发现投资机会和执行交易的可能性,从而增强决策过程并优化投资策略。例如,它们可以利用历史数据和预测算法来识别模式并预测市场走势,帮助金融专业人士做出明智的投资决策。

在物流和供应链管理SCM)中,GenAI 代理可以在优化资源配置、简化分销网络和降低运营成本方面发挥关键作用。通过利用实时数据和预测分析,这些代理可以优化库存管理、路线规划和仓库运营,提高效率并缩短交货时间。例如,它们可以根据交通状况和需求波动动态调整运输路线,以确保货物的及时交付。

此外,GenAI 代理有潜力通过为学生个性化学习体验来改变教育。它们可以根据个别学生的需求和学习风格调整课程和教学方法,促进个性化的学习路径,并提高学生的学习成果。例如,这些代理可以分析学生的表现数据,确定改进领域,并推荐定制的学习资源和活动,以满足特定的学习需求。

虽然 GenAI 代理在各个行业都拥有重大的承诺和潜力,但必须承认,这些技术的广泛采用和规模化可能仍处于早期阶段。虽然确实有一些组织和研究项目正在积极探索和实施 GenAI 解决方案,但要实现广泛采用和可扩展性通常需要克服各种技术、监管和伦理挑战。

在许多情况下,GenAI 代理的实际实施可能涉及试点项目、概念验证POCs)或针对性的部署,而不是在整个行业范围内的大规模实施。此外,这些技术的有效性和影响可能因数据质量、模型性能和具体用例等因素而异。

因此,在讨论 GenAI 代理的应用时,必须以批判性的眼光进行,考虑当前的技术状态、现有的限制以及与广泛采用相关的潜在挑战。

现在,让我们进一步探索与 GenAI 代理相关的各种用例场景。

GenAI 代理的角色、职责和用例场景

在 GenAI 的背景下,GenAI 代理在企业中被大量用作协调者。协调指的是在各个角色和用例中协调管理和部署这些代理。

GenAI 代理在这个协调中可以扮演多种角色。以下是一些 GenAI 代理的潜在用途案例及其可能扮演的角色:

  • 虚拟 助手角色

    • 个人助理:代理可以作为个人助理,帮助个人管理日程、设置提醒,并处理诸如预约、预订或跟踪交付等任务。

    • 信息检索:他们还可以作为信息检索工具,快速访问各个领域的知识,例如时事、体育、娱乐或一般参考查询。

    • 个性化推荐者:通过学习个人偏好和模式,这些代理可以提供针对每个用户需求和兴趣的个性化推荐和建议。

  • 客户服务 聊天机器人角色

    • 客户支持代理:代理可以处理客户咨询和支持请求,全天候提供即时帮助,减少人工代理的等待时间。

    • 产品顾问:他们可以指导客户通过故障排除过程,提供产品信息,并根据客户偏好和购买历史提供个性化推荐。

    • 聊天机器人还可以处理常规任务,如订单跟踪、退款请求和账户管理,为人工代理腾出时间处理更复杂的问题,例如解决技术问题、提供个性化推荐、解决纠纷和提供专业知识。

  • 辅导和 教育角色

    • 辅导教师:GenAI 代理可以作为虚拟辅导教师,提供适合每个学生节奏、水平和学习风格的个性化学习体验。他们可以用引人入胜的方式解释复杂概念,提供练习题,并提供反馈和指导以加强学习。

    • 领域专家:代理还可以作为领域专家,在各个学术科目或专业领域提供深入的知识和见解。

  • 内容 创作角色

    • 作家:代理可以通过根据提供的提示或想法生成初稿、大纲或摘要来协助作家、记者和内容创作者。

    • 故事讲述者:他们可以帮助构思、故事发展和创意写作任务,提供建议并扩展概念。

    • 内容生成器:代理还可以生成营销文案、产品描述或社交媒体内容,帮助企业和创作者节省时间和精力。

  • 创意 设计角色

    • 设计师:代理可以作为创意合作伙伴,根据提供的提示或规格生成设计理念、艺术作品、标志和视觉概念。

    • 艺术家:他们可以提供灵感和新的视角,帮助设计师探索新的方向并克服创作障碍。

    • 创意合作者:代理还可以协助迭代设计过程,根据人类设计师的反馈和指导生成变体和改进。

  • 游戏和娱乐角色

    • 游戏角色:在游戏中,代理可以扮演非玩家角色(NPCs),提供吸引人的互动、对话和故事情节,这些情节会根据玩家的行动和选择进行调整。

    • 互动伴侣:作为互动伴侣,代理可以参与对话、讲故事、提供娱乐,甚至在虚拟环境中提供情感支持或陪伴。

  • 医疗保健角色

    • 医疗助手:代理可以作为医疗助手,向患者提供有关疾病、治疗和健康生活方式建议的信息。

    • 耐心教育者:他们可以协助患者教育,用易于理解的语言解释复杂的医学概念,并解决常见的担忧或问题。

    • 代理还可以通过总结患者记录、生成医疗报告或在研究和数据分析任务中提供帮助来支持医疗保健专业人员。

  • 软件开发角色

    • 代码助手:GenAI 代理可以作为代码助手,通过生成代码片段、提出改进建议或解释编程概念来帮助开发者编写和优化代码。

    • 文档生成器:他们可以帮助生成文档,自动为代码段创建描述和解释,使维护和协作项目更加容易。

    • 代理还可以帮助进行代码重构,识别优化区域,并提出更高效或更安全的编码实践。

  • 研究和分析角色

    • 研究助手:智能代理可以作为研究助手,从各种来源收集和综合信息,生成摘要,并识别关键见解或趋势。

    • 数据分析师/数据工程师:他们可以帮助进行数据分析任务,例如探索数据集、识别模式并生成可视化或报告。

    • 机器学习工程师/数据科学家:代理还可以通过生成假设、提出实验设计或基于现有知识和数据提出进一步探索的想法来支持研究人员。

  • 语言学习角色

    • 对话伙伴:GenAI 代理可以作为对话伙伴,让语言学习者在一个安全且鼓励的环境中练习口语和听力理解。

    • 语言导师:作为语言导师,代理可以提供关于发音、语法和词汇的反馈,根据个别学习者的需求和进度调整课程和练习。

    • 他们还可以生成吸引人的语言学习材料,如对话、故事或练习,根据学习者的熟练程度调整内容和难度级别。

在所有这些情况下,代理的作用是增强人类能力,提供个性化协助,并在各个领域提高效率和生产力。

现在,让我们进一步探讨代理及其在 Amazon Bedrock 环境中的实用功能。

Amazon Bedrock 与 LangChain 代理的集成

LangChain 是一个强大的框架,用于开发使用 LLM 的应用程序,它提供了一个强大且灵活的代理系统,使开发者能够构建能够应对各种挑战的复杂代理。

LangChain 中的代理是一个高级抽象,它结合了 LLM、一组工具和其他组件,以协调动作的执行。代理利用 LLM 的自然语言理解NLU)能力来解释用户输入,确定适当的动作,并协调使用可用工具来完成所需任务。

LangChain 代理的核心组件包括以下内容:

  • WebSearchTool: 使用搜索引擎(如 Google)进行网络搜索。

  • WikipediaSearchTool: 从 维基百科 中搜索和检索信息。

  • PythonCallbackTool: 作为工具执行 Python 函数。

  • CSVTool: 与 CSV 文件交互,允许进行读取、写入和查询数据等操作。

  • LLM: LLM 作为代理背后的推理引擎。它负责理解用户的意图,确定适当的动作,并解释工具执行的结果。* SQLDatabaseToolkit 包含与 SQL 数据库交互的工具,包括查询、创建表和插入数据。* ConversationBufferMemory 存储对话历史,允许代理在对话中参考先前的输入和输出。

LangChain 提供了一系列内置工具和代理类,以满足各种用例。以下是一些可用的工具:

  • serpapi: 一个用于查询网络搜索结果的搜索引擎工具

  • google-search: 一个围绕 Google Search 进行网络搜索的包装器

  • llm-math: 一个使用 LLM 回答数学相关问题的工具

  • open-meteo-api: 一个用于从 Open-Meteo API 检索天气信息的工具

  • news-api: 一个用于获取当前新闻头条信息的工具

  • tmdb-api: 一个用于查询 The Movie DatabaseTMDB)信息的工具

  • wolfram-alpha: 一个用于查询 Wolfram|Alpha 计算知识引擎的工具

  • requests: 一个用于从特定 URL 获取内容的工具

  • terminal: 一个用于执行终端命令的工具

  • pal-math: 一个专门解决复杂文字数学问题的语模型

  • pal-colored-objects: 一个用于推理物体位置和颜色属性的语模型

至于代理类,LangChain 提供了几个选项,每个选项都有自己的动作选择和问题解决策略。以下是一些例子:

  • zero-shot-react-description:一个依赖于 LLM 的零样本能力来根据工具描述选择操作的代理

  • conversational-react-description:一个采用对话方式,在需要时请求澄清,并根据工具描述选择操作的代理

  • react-docstore:一个利用文档存储检索相关信息并根据工具描述选择操作的代理

关于上述工具和代理类的详细信息在此处突出显示:api.python.langchain.com/en/latest/_modules/langchain/agents/agent_types.html

现在我们已经了解了 LangChain 代理,让我们深入了解 LangChain 代理与 Amazon Bedrock 的集成,通过一个实际用例来展示。我们将通过 LangChain 包导入 Bedrock,并利用两个 LangChain 工具,即YoutubeSearchToolWikipediaTool,使 LangChain 代理能够利用它们的功能。此外,我们将在这个简单应用中通过 Bedrock 利用 Anthropic Claude 模型。

注意

确保您有正确的权限来调用 Amazon Bedrock,如前几章所述。此外,请确保按照代码安装 LangChain 包和库的最新版本。如果包未安装,请在您的 Jupyter 笔记本中运行以下命令(请注意,如果您从 Python 终端运行 Python 代码,则不需要!%):

%pip install <library_name>

# Install the respective packages for YoutubeSearchTool and Wikipedia Tool in your Jupyter Notebook
%pip install --upgrade --quiet wikipedia youtube_search langchain
#Install LangChain modules
%pip install -U langchain-community
%pip install -U langchain-aws langchainhub
# Import langchain libaries for Tools, Agents and Amazon Bedrock
from langchain.agents import AgentType
from langchain.agents import initialize_agent, Tool
from langchain_aws import BedrockLLM
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
# Import respective packages for Wikipedia and Youtube tools
from langchain_community.tools import YouTubeSearchTool
from langchain_community.utilities import WikipediaAPIWrapper
# Using anthropic model with langchain
llm = BedrockLLM(model_id="anthropic.claude-v2")
# Define Tools below
wikipedia_wrapper = WikipediaAPIWrapper()
# Wikipedia Tool
wikipedia_tool = Tool(
        name="Wikipedia",
        func=wikipedia_wrapper.run,
        description="Useful tool for finding information on the Internet related to world events, issues, etc. Worth using for general topics. Use precise questions.",)
youtube_wrapper = YouTubeSearchTool()
#Youtube Tool
youtube_tool = Tool(name= "Youtube", func = youtube_wrapper.run, description = "Useful tool for searching youtube videos on and sharing the youtube links to the user. Use precise questions.")
#Create a memory instance
conversational_memory = ConversationBufferMemory()
prompt = hub.pull("hwchase17/react")
memory = conversational_memory
model = llm
tools = [wikipedia_tool,youtube_tool]
# Create an agent
agent = create_react_agent(model, tools, prompt = prompt)
# Create an agent executor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
#Run the agent executor
response = agent_executor.invoke({"input": "Memristor?"})
print(response)

生成的输出看起来是这样的:

{'input': 'Memristor?', 'output': 'A memristor is a non-linear two-terminal electrical component that relates electric charge and magnetic flux linkage. It was first theorized by Leon Chua in 1971 as the fourth fundamental circuit element alongside the resistor, capacitor and inductor. Unlike those components, memristors exhibit memory - their resistance depends on the history of current that has previously flowed through them. Memristors have applications in memory, computing, and neuromorphic/brain-inspired computing due to their ability to store and process information. They are an active area of research in nanoelectronics.'}

输出可能看起来像图 10.1图 10.2中所示的那样。您将注意到代理正在使用问题、思考、行动和链式推理进行推理:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_01.jpg

图 10.1 – AgentExecutor 链输出

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_02.jpg

图 10.2 – 使用 Bedrock 的 LangChain 代理生成的链

如本节所示,当我们探索如忆阻器等技术主题而没有其他背景信息时,会调用维基百科工具代理,提供全面和详细的信息,随后是 YouTube 工具提供有关主题的额外信息。如果用户在与代理的先前对话中写入Elon Musk video on Neuralink,则会调用 YouTube 工具并向用户展示链接。鼓励用户尝试不同的问题并测试代理。

这里是response = agent_executor.invoke({"input": "Elon Musk video on Neuralink"})的示例输出响应:

> Entering new AgentExecutor chain...
 Here is my process for answering your question about finding a video of Elon Musk discussing Neuralink:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has given talks and interviews about Neuralink. YouTube would be a good place to search for videos of him discussing it.
Action: Youtube
Action Input: "elon musk neuralink"
['https://www.youtube.com/watch?v=tN1lVwTHCMw&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK', 'https://www.youtube.com/watch?v=k0I9Z-ARbjo&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK'] Here is my thought process for answering your question:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has discussed Neuralink, his brain-machine interface company, in various interviews and presentations. YouTube would be a good place to search for videos of him talking about Neuralink.
Action: Youtube
Action Input: "elon musk neuralink"
['https://www.youtube.com/watch?v=tN1lVwTHCMw&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK', 'https://www.youtube.com/watch?v=k0I9Z-ARbjo&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK'] Here is my thought process and answer:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has given presentations and interviews about Neuralink, the brain-computer interface company he founded. YouTube would be a good place to search for videos of him discussing Neuralink and its technology.
...
https://www.youtube.com/watch?v=tN1lVwTHCMw
https://www.youtube.com/watch?v=k0I9Z-ARbjo
> Finished chain.

如演示所示,利用这些工具使我们能够深入了解主题知识。值得注意的是,LangChain 还提供了创建自定义工具的能力,进一步扩展了代理的功能。这种灵活性在python.langchain.com/docs/modules/agents/tools/custom_tools的文档中得到了强调,您可以在那里找到有关定制工具以适应您特定需求的指导。

如前所述,由于我们正在寻找关于忆阻器的技术主题,我们使用维基百科工具代理获取详细信息。您也可以使用代理创建自定义工具,如下所示:python.langchain.com/docs/modules/agents/tools/custom_tools

您可以在以下博客中查看如何使用亚马逊 Bedrock 和 LangChain 构建生成式 AI 代理,结合亚马逊 Kendra、亚马逊 DynamoDB、亚马逊 Lex,aws.amazon.com/blogs/machine-learning/build-generative-ai-agents-with-amazon-bedrock-amazon-dynamodb-amazon-kendra-amazon-lex-and-langchain/

通过有效地将亚马逊 Bedrock 与 LangChain 代理集成,组织可以释放 LLM 的全部潜力,从而开发出智能和情境感知的应用程序,推动创新,自动化复杂的工作流程,并提供卓越的用户体验。

现在,让我们跳转到构建亚马逊 Bedrock 代理,以利用端到端的生成式 AI 应用。

亚马逊 Bedrock 代理

亚马逊 Bedrock 提供的一项强大功能是能够在您的应用程序内构建和配置自主代理。这些代理作为智能助手,根据组织数据和用户输入帮助最终用户完成任务。代理协调 FM(LLM)、数据源、软件应用程序和用户对话之间的交互。它们可以自动调用 API 采取行动,并调用知识库为这些行动补充信息。通过集成代理,开发者可以节省数周的开发工作量,并加速生成式 AI 应用的交付。

亚马逊 Bedrock 上的代理旨在自动化客户任务,并对他们的问题提供智能响应。例如,您可以创建一个代理,帮助客户处理保险索赔或预订旅行。代理的优点是您不必担心提供容量、管理基础设施或从头开始编写自定义代码。亚马逊 Bedrock 处理提示工程、内存管理、监控、加密、用户权限和 API 调用的复杂性。

亚马逊 Bedrock 上的代理执行以下关键任务:

  • 扩展 FM:代理利用 LLM 来理解用户请求,并将复杂任务分解成更小、更易管理的步骤。

  • 收集额外信息:通过自然对话,代理可以从用户那里收集额外信息,以有效地满足他们的请求。

  • 采取行动:代理可以调用您公司的系统 API 来执行操作并满足客户请求。

  • 增强性能和准确性:通过查询数据源和知识库,代理可以增强其性能并提供更准确的响应。

为了利用 Amazon Bedrock 的代理力量,开发者遵循一个简单的过程:

  1. 创建一个知识库来存储您组织的私有数据,这可以用来增强代理的性能和准确性。这一步是可选的,因为并非所有代理都需要访问私有组织数据来执行其分配的目标。如果代理的任务和目标不依赖于或从访问此类数据中获得显著益处,则创建知识库可能不是必要的。这取决于特定用例和正在开发的代理的具体要求。

  2. 为您的特定用例配置代理,定义它可以执行的操作。用您首选的编程语言编写的 Lambda 函数决定了代理如何处理这些操作。这是一个可选步骤,因为代理不一定需要创建动作组。

  3. 将代理与知识库关联起来,以进一步增强其功能。

  4. 通过修改预处理、编排、知识库响应生成和后处理步骤的提示模板来自定义代理的行为。请注意,并非所有代理都需要对提示模板进行大量修改以实现其目标。定制的需求取决于代理预期执行的任务的复杂性和开发者期望的控制和微调水平。对于简单任务或通用用例,默认提示模板可能就足够了,因此不需要进行大量定制。

  5. 使用 Amazon Bedrock 控制台或 API 调用测试代理,并根据需要修改配置。利用跟踪来深入了解代理在编排每个步骤时的推理过程。

  6. 当代理准备部署时,创建一个指向特定代理版本的别名。

  7. 通过与代理别名集成您的应用程序,实现无缝的 API 调用和交互。

  8. 根据需要迭代代理,创建新版本和别名以适应不断变化的需求。

在整个开发过程中,Amazon Bedrock 处理提示工程、内存管理、监控、加密、用户权限和 API 调用的复杂性,让您能够专注于构建针对特定用例的智能代理。

揭示 Amazon Bedrock 中 GenAI 代理的内部工作原理

当深入到 Amazon Bedrock 的领域时,会遇到一套强大的工具集,旨在促进智能代理的创建和管理。这个工具集由两类不同的 API 操作组成,每一类在代理的生命周期中都有其特定的目的:

  • 第一类,恰当地称为构建时 API 操作,使开发者能够构建、配置和监督他们的代理及其相关资源。这些操作作为基础构建块,使得能够创建满足特定需求和目标的代理。通过这些 API,开发者可以微调代理的各个方面,确保它们具备处理手头任务所需的能力。有关构建时 API 操作的更多详细信息,请参阅此处:docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html

  • 第二类,运行时 API 操作,为代理注入活力,使其能够与用户输入交互并启动复杂的编排过程以完成其指定的任务。当用户提供输入时,这些 API 使代理能够处理和解释信息,触发一系列动作,最终达到预期的结果。

现在,让我们深入了解构建时和运行时配置。

构建时配置

在构建阶段,代理由以下关键组件组装:

  • FM: 您选择一个预训练的语言模型,该模型由代理使用来解释用户输入、生成响应并指导其决策过程。

  • 指令提示: 您创建指令来界定代理的目的和期望的行为。通过高级提示技术,您可以在代理工作流程的每个阶段动态调整这些指令,并通过无服务器函数集成自定义逻辑。

  • 动作组: 您通过以下方式定义代理可以执行的动作:

    • 一个 OpenAPI 模式规范,概述代理可以调用的操作。

    • 一个无服务器函数,根据代理的输入执行指定的 API 操作并返回结果。

  • 知识库: 您可以将知识库与代理关联,使它能检索相关上下文以增强其响应生成和决策能力。

  • 提示模板: 委派者公开了在代理生命周期各个阶段使用的默认提示模板,例如预处理输入、编排动作、查询知识库和后处理输出。您可以根据需要自定义这些模板来修改代理的行为或禁用特定阶段。

在构建过程中,这些组件被组合起来创建基础提示,引导智能体的编排流程,直到满足用户的请求。通过高级提示技术,你可以增强这些基础提示,添加额外的逻辑、示例和元数据,以提高智能体在调用每个阶段的准确性和性能。在配置智能体的组件和安全设置后,你可以准备智能体在运行时环境中进行部署和测试,如图图 10.3所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_03.jpg

图 10.3 – 创建智能体的构建时 API 操作

运行时过程

在这个运行时过程中,InvokeAgent API 操作是核心,它是一个强大的指挥者,启动智能体序列。智能体的表现分为三个和谐的阶段:预处理、编排和后处理。

第一幕 – 预处理

在帷幕升起之前,预处理阶段会细致地管理智能体如何对用户输入进行上下文关联和分类。这一关键步骤还可以验证输入,确保后续阶段的顺利过渡。

第二幕 – 编排 – 盛大演出

编排阶段是真正的魔法发生的地方,是解释、调用和知识综合的交响乐章。这一行为包括以下几个部分:

  1. 解释:智能体巧妙地使用 FM 解释用户输入,生成一个阐述下一步逻辑路径的理由。

  2. 调用和综合:就像一位熟练的指挥家一样,智能体调用动作组和查询知识库,检索额外的上下文并总结数据以增强其生成能力。

  3. 观察和增强:从调用的动作组和总结的知识库结果中,智能体生成一个输出,称为观察。然后,这个观察被用来丰富基础提示,随后由 FM 进行解释。智能体接着确定是否需要进一步的编排迭代。

这个迭代循环会持续进行,直到智能体向用户交付最终响应或需要从用户那里获取更多信息。

在编排阶段,基础提示模板被智能体指令、动作组和知识库增强,形成了一个丰富的信息织锦。这个增强的基础提示随后被输入到 FM 中,预测满足用户请求的最佳轨迹。在每次迭代中,FM 选择适当的 API 操作或知识库查询,从而产生一个响应迅速且上下文准确的输出。

第三幕 – 后处理 – 终曲

在最后一幕,后处理阶段,智能体格式化其努力的成果 – 将返回给用户的最终响应。然而,这一步可以优雅地跳过,让表演留有解释的空间。

在代理的性能过程中,用户可以选择在运行时调用跟踪,揭示代理的思考过程。这个跟踪仔细追踪代理在每个步骤中的推理、行动、查询和观察。它包括发送给 FM 的完整提示,以及模型的输出、API 响应和知识库查询。通过检查这个跟踪,用户可以获得关于代理推理的宝贵见解,为持续改进和精炼铺平道路。

随着用户与代理的会话通过连续的InvokeAgent请求继续进行,对话历史被仔细保存,不断丰富代理基提示模板的上下文。这个过程有助于提高代理的准确性和性能,建立了用户和 AI 之间的共生关系。

在运行时,代理的过程是一个引人入胜的解释、综合和适应的相互作用,如图 10.4所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_04.jpg

图 10.4 – 代理工作流程的运行时流程

利用 GenAI 提升推理能力——ReAct 入门

GenAI 模型在处理和生成类似人类的文本方面表现出卓越的能力,但它们在处理复杂任务和提供逐步解决方案方面的能力仍然是一个挑战。Yao 等人开发了一种称为 ReAct 的技术,如论文ReAct:在语言模型中协同推理和行动arxiv.org/abs/2210.03629)所述,以提高这些模型的推理能力,使它们能够系统地处理和解决用户请求的任务。

ReAct 技术涉及构建提示,引导模型通过一系列推理步骤和相应的行动。这些提示由一系列问题-思考-行动-观察示例组成,其中以下适用:

  • 问题代表用户请求的任务或需要解决的问题

  • 思考是一个推理步骤,展示了如何解决问题并识别潜在的行动

  • 行动是模型可以从预定义的允许操作集中调用的 API 调用或函数

  • 观察是从执行所选操作获得的结果或输出

允许执行的动作集合由附加到示例提示文本的指令定义。这种结构化方法鼓励模型参与逐步推理过程,将复杂任务分解成更小、可操作的动作步骤。

为了说明构建 ReAct 提示的结构,考虑以下示例提示结构,包含问题-思考-行动-观察序列:

示例 1

  • 问题:最小化缺货的最佳库存水平是多少?

  • 思考:为了避免缺货,我们必须根据需求预测和再订购点来平衡库存水平。

  • 使用历史销售数据和需求预测的optimizeInventoryLevels函数。

  • 观察:将库存维持在预测需求的 80%可以减少缺货 30%,同时优化了持有成本。

示例 2

  • 问题:我们如何提高客户满意度评分?

  • 思考:为了提高满意度,我们应该分析反馈数据并实施有针对性的改进。

  • 使用analyzeCustomerFeedback API 来识别趋势和洞察。

  • 观察:根据分析,实施个性化客户支持使满意度评分提高了 20%。

这些示例展示了 ReAct 技术如何指导模型通过推理步骤,从而得出可操作的成果。

虽然手动制作这些提示的过程可能耗时且复杂,但 Amazon Bedrock Agent 通过根据提供的信息和可用操作自动生成提示,简化了这一过程。Bedrock 代理处理提示工程的复杂性,使研究人员和开发者能够专注于定义任务要求和可用操作。

鼓励读者查看github.com/aws-samples/agentsforbedrock-retailagent,该链接揭示了通过利用 Amazon Bedrock 的代理创建一个由 FM 驱动的客户服务机器人。

ReAct 技术和 Bedrock 代理代表了在 GenAI 领域的一项重大进步,使模型能够展示出改进的推理能力,并更有效地处理复杂任务。通过提供解决问题的结构化方法并利用提示的力量,这项技术有可能解锁 GenAI 在各个领域的新可能性和应用。让我们通过一些实际用例来探索 Amazon Bedrock Agents 的工作原理。

使用 Amazon Bedrock Agents 的实际用例和功能

在本节中,我们将深入了解利用 Amazon Bedrock Agents 在 GenAI 中的实际应用和运营洞察。让我们考虑一个多语言摘要机器人示例场景,其中 GenAI 代理可以被用来简化操作并自动将内容以用户选择的语言进行摘要翻译。为了开始,开发者必须访问 Bedrock 控制台并启动代理创建工作流程,如图 10**.5所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_05.jpg

图 10.5 – Bedrock 控制台中的代理创建

此过程涉及通过 AWS 身份和访问管理 (IAM) 服务角色提供必要细节,例如代理的名称、描述和必要的权限。此角色授予代理访问所需服务(如 Amazon Simple Storage Service (Amazon S3) 和 AWS Lambda)的权限,如图 图 10*.6* 所示。例如,该图展示了创建一个多语言文档摘要和翻译代理,用于从文档中提取相关信息,并以翻译语言将信息传达给用户:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_06.jpg

图 10.6 – 带有 IAM 权限的 Bedrock 代理创建过程

默认情况下,Amazon Bedrock 使用加密来保护与用户的代理会话,使用 AWS 代表您拥有和管理的密钥。但是,如果您更喜欢使用您已设置的 AWS 密钥管理服务 (KMS) 中的客户管理密钥,您可以选择相应地自定义加密设置。这允许您控制用于保护代理-用户交互的加密密钥,以满足您组织的安全和合规要求。

接下来,开发者从 Bedrock 中选择一个与所需用例相匹配的 FM。这一步骤涉及提供自然语言指令,以定义代理的任务和它应扮演的角色。例如,在 图 10*.7* 中展示的示例中,指令可能是 您是一个多语言代理,旨在帮助从相关文档中提取所需信息,并以 翻译语言 的形式提供响应

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_07.jpg

图 10.7 – Amazon Bedrock 代理模型选择和代理角色配置

控制台还提供了用户选择护栏以实施特定于应用程序的安全保障的选项,这些安全保障遵守负责任的 AI 政策。为了简单起见,我们可以将其留空并进入下一部分。我们将在 第十二章 中详细介绍护栏。

随后,开发者添加操作组,这些操作组是代理可以通过向公司系统发出 API 调用来自动执行的任务集合。这一步骤涉及定义一个 API 架构,概述组内所有操作的 API,并提供一个封装每个 API 商业逻辑的 Lambda 函数。例如,名为 Summarizer_Translator_ActionGroup 的操作组可以处理存储在数据库中或特定位置的文档,识别用户请求的信息,并以用户请求的翻译语言向用户发送总结后的响应。图 10*.8* 展示了创建操作组来自动执行代理任务的创建过程:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_08.jpg

图 10.8 – 创建 Bedrock 代理的动作组

如前所述,你需要创建一个 Lambda 函数来处理来自代理的请求并选择一个 API 架构。请确保你已经为你的 AWS Lambda 函数提供了调用 Bedrock 代理的正确权限。

对于文档识别、摘要和翻译的情况,我们提供了以下 Lambda 函数,用户可以利用它来执行工作流程:

import json
import time
import boto3
# Define a mock dictionary with document IDs and content
Document_id  = {
    "doc_1": {
        "title": "The Importance of Mindfulness",
        "author": "Jane Smith",
        "content": "Mindfulness is the practice of being fully present and engaged in the current moment, without judgment or distraction. It involves paying attention to your thoughts, feelings, and bodily sensations with a curious and non-judgmental attitude. By cultivating mindfulness, you can reduce stress, improve emotional regulation, and enhance overall well-being. In this document, we will explore the benefits of mindfulness and provide practical techniques for incorporating it into your daily life."
      },
    "doc_2": {
        "title": "Sustainable Living: A Guide to Eco-Friendly Practices",
        "author": "Michael Johnson",
        "content": "In today's world, it's essential to adopt sustainable living practices to protect our planet's resources and ensure a better future for generations to come. This document will provide you with practical tips and strategies for reducing your environmental impact in various aspects of your life, such as energy consumption, waste management, transportation, and food choices. Together, we can make a significant difference by embracing eco-friendly habits and promoting a more sustainable lifestyle."
      },
    "doc_3": {
        "title": "The Art of Effective Communication",
        "author": "Emily Davis",
        "content": "Effective communication is a crucial skill in both personal and professional settings. It involves the ability to convey your thoughts, ideas, and emotions clearly and respectfully, while also actively listening and understanding the perspectives of others. In this document, we will explore the key elements of effective communication, such as active listening, nonverbal cues, and empathy. By mastering these techniques, you can improve your relationships, resolve conflicts more effectively, and achieve greater success in your personal and professional endeavors."
      }
    }
def getDocID(event):
        docID = event['parameters'][0]['value']
        print("NAME PRINTED: ", docID)
        if(docID== "doc_1" or "doc1"):
            return Document_id["doc_1"]["content"]
        elif docID == "doc_2" or "doc2":
            return Document_id["doc_2"]["content"]
        elif docID == "doc_3" or "doc3":
            return Document_id["doc_3"]["content"]
        else:
            return "No document found by that ID"
def lambda_handler(event, context):
    response_code = 200
    """Main lambda handler directing requests based on the API path, preserving the specified response structure."""
    print("event OUTPUT : ")
    print(event)
    action_group = event.get("actionGroup")
    print("action group :" + str(action_group))
    api_path = event.get("apiPath")
    print ("api_path : " + str(api_path))
    result = ''
    response_code = 200
    if api_path == '/getDoc':
        result = getDocID(event)
        print(result)
    else:
        response_code = 404
        result = f"Unrecognized api path: {action_group}::{api_path}"
    response_body = {
        'application/json': {
            'body': result
        }
    }
    action_response = {
        'actionGroup': event['actionGroup'],
        'apiPath': event['apiPath'],
        'httpMethod': event['httpMethod'],
        'httpStatusCode': response_code,
        'responseBody': response_body
    }
    api_response = {'messageVersion': '1.0', 'response': action_response}
    return api_response

运行前面工作流程的用户也可以使用以下 OpenAPI 架构并将其存储在 S3 中,作为本例的一部分:

{
    "openapi": "3.0.1",
    "info": {
        "title": "DocSummarizerTranslator API",
        "version": "1.0.0",
        "description": "APIs for fetching, translating and summarizing docs by fetching the document ID and identifying the language to translate the document"
    },
    "paths": {
        "/getDoc": {
            "get": {
                "description": "Get the document content for a document by document ID.",
                "operationId": "getDoc",
                "parameters": [
                    {
                        "name": "DocID",
                        "in": "query",
                        "description": "ID of the document to retrieve",
                        "required": true,
                        "schema": {
                            "type": "string"}}],
                "responses": {
                    "200": {
                        "description": "Successful response with document content data",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }}}}}}},
        "/getDoc/summarize": {
            "get": {
                "description": "Summarize the content of the document for given document ID",
                "operationId": "summarizeDoc",
                "parameters": [
                    {
                        "name": "DocID",
                        "in": "query",
                        "description": "ID of the document to summarize",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successful response with the summary of the document content for given document ID",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "string",
                                    "properties": {
                                        "summary": {
                                            "type": "string",
                                            "description": "Summary of the document"}}}}}}}}}}}

在下一步中,用户可以选择一个知识库,如图 图 10.9 所示。这展示了 Bedrock 代理如何通过执行相似性搜索并提供所需响应给用户,轻松创建基于 RAG 的解决方案来从知识库中提取相关信息。为了简化,我们将忽略这一点并进入最终的创建步骤:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_09.jpg

图 10.9 – 使用 Bedrock 代理集成创建知识库

注意

如果你想要深入了解涉及知识库与代理集成的用例,你可以执行以下代码示例:github.com/aws-samples/amazon-bedrock-workshop/tree/main/05_Agents/insurance_claims_agent/with_kb.

GitHub 仓库中的附加代码进一步说明了如何使用 Python SDK 创建和调用 Bedrock 代理,如下面的笔记本所示:github.com/aws-samples/amazon-bedrock-workshop/blob/main/05_Agents/insurance_claims_agent/with_kb/create_and_invoke_agent_with_kb.ipynb.

完成前面的步骤后,你可以验证代理配置并选择创建代理。恭喜你创建你的 Amazon Bedrock 代理 (图 10.10)!

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_10.jpg

图 10.10 – Amazon Bedrock 代理版本

在屏幕的右侧,你可以通过询问文档相关问题并请求它总结和将文档翻译成你希望的语言来轻松测试你的代理,如图 图 10.11 所示:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_11.jpg

图 10.11 – 在 AWS 控制台中测试 Bedrock 代理

在本节中,我们获得了对开发和使用文本摘要用例定制的 Amazon Bedrock 代理的实际理解。在确保代理的配置和功能与指定任务相符后,就到了部署阶段。

部署 Amazon Bedrock 代理

将 Amazon Bedrock 代理集成到您的应用程序中需要创建一个别名,该别名作为对代理代码和配置特定版本的引用。按照以下步骤创建别名:

  1. 访问 Amazon Bedrock 控制台,导航到您希望部署的代理。从代理概览页面,导航到别名部分,然后点击创建以启动别名创建过程。

  2. 为别名提供名称和描述(可选)。您还需要决定是否要将此别名与代理的新版本或您之前创建的现有版本关联。

  3. 用户还可以选择通过选择**预配吞吐量(PT)**按钮为别名提供预配吞吐量。一旦选择,下拉菜单将列出使用预配吞吐量创建的模型。如果没有选项显示,则表示在 Amazon Bedrock 环境中不存在预配吞吐量模型。有关更多信息,用户可以利用docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html

通过创建别名,Bedrock 会对代理当前的代码和配置设置进行快照,并将该快照(版本)链接到您定义的别名。然后,您可以使用此别名在您的应用程序中集成和交互特定版本的代理。图 10.12展示了为摘要翻译代理创建的两个别名:

https://github.com/OpenDocCN/freelearn-dl-zh/raw/master/docs/genai-amzn-rdrk/img/B22045_10_12.jpg

图 10.12 – Amazon Bedrock 代理的别名

别名本质上充当一个稳定的参考点,允许您管理代理的不同版本,同时确保您的应用程序正在与期望的版本交互。

Amazon Bedrock 代理能够提升生产力、增强客户体验以及自动化工作流程。它们的通用性允许在任务自动化、对话界面和 DevOps 流程等各个领域进行创新实施,从而推动运营效率和商业价值的提升。

Bedrock Agents 可以有几种其他工业用例。例如,在保险领域,通过利用 Amazon Bedrock 上的 GenAI,保险公司可以提高运营效率和客户体验。代理可以自动化繁琐和重复的任务,释放人力资源,以便专注于更复杂和战略性的工作。此外,代理处理自然语言指令的能力允许其无缝集成到现有的工作流程和系统中,促进向 AI 驱动的运营的平稳过渡。

此外,GenAI 在保险行业的潜在应用不仅限于索赔处理。代理可以被训练来协助个性化政策推荐、风险评估、欺诈检测,甚至通过自然语言交互提供客户支持。随着技术的不断发展,保险领域内的创新和优化机会无疑将扩大。

以下链接演示了使用 AWS Python SDK 开始使用 Amazon Bedrock Agents 的端到端场景:github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/bedrock-agent/scenario_get_started_with_agents.py.

笔记本揭示了以下步骤:

  1. 为 Bedrock 代理生成特定的执行角色

  2. 实例化 Bedrock 代理并部署初始草案版本

  3. 构建 Lambda 函数及其相应的执行角色

  4. 授予必要的 IAM 权限以部署代理以调用 Lambda 函数

  5. 建立一个将代理与 Lambda 函数链接的动作组

  6. 使用指定的别名部署完全配置的代理

  7. 使用用户提供的提示调用代理

  8. 删除在过程中创建的所有资源

用户可以通过执行此场景的端到端操作,以深入了解在 Amazon Bedrock 上创建 GenAI 代理的实用方法。

对于有兴趣深入了解 Amazon Bedrock 代理世界的读者,强烈建议利用 Amazon 的 使用代理构建 Amazon Bedrock 生成式 AI 应用程序 工作坊:catalog.us-east-1.prod.workshops.aws/workshops/f8a7a3f8-1603-4b10-95cb-0b471db272d8/en-US.

鼓励读者进一步了解使用 Amazon Bedrock Agent 链接和数字保险代理用例进行工作流程编排:github.com/build-on-aws/workflow-orchestration-bedrock-agent-chaining/tree/main.

摘要

在本章中,我们探讨了 GenAI 宇宙中代理的复杂概念。我们研究了与代理相关的各种用例和角色,进一步阐明了它们在现实场景中的应用实例。此外,我们还揭示了 LangChain 代理与 Amazon Bedrock 的无缝集成,并通过实际代码示例探讨了创建 Amazon Bedrock 代理以及它们的编排工作流程,用于构建、测试和部署 Bedrock 代理。

现在我们已经对代理及其编排过程有了深入的了解,我们将在下一章探讨在大规模企业中监控 Amazon Bedrock 模型的有效策略。这将使我们具备在复杂组织环境中管理和优化这些模型的安全和治理的必要知识,确保最佳利用率和效率。

第三部分:模型管理和安全考量

在本部分,我们将了解评估和监控模型的核心方面,以及确保在 Amazon Bedrock 环境中安全和隐私。第十一章探讨了评估模型性能的技术,包括自动模型评估、人工评估和开源工具。此外,它还涵盖了监控技术,如 Amazon CloudWatch、模型调用日志以及与 AWS CloudTrail 和 Amazon EventBridge 的集成。第十二章侧重于数据保护、身份和访问管理、网络安全、伦理考量以及实施护栏以遵守负责任的 AI 实践和政策。

本部分包含以下章节:

  • 第十一章, 使用 Amazon Bedrock 评估和监控模型

  • 第十二章确保在 Amazon Bedrock 中安全和隐私

Logo

更多推荐