1. 项目概述:从零上手企业级AI开发平台

如果你刚开始接触生成式AI,可能听说过OpenAI的API,或者用过ChatGPT的网页版。但当你真正想把手头的想法变成一个能处理复杂任务、能调用工具、能稳定运行在业务里的AI应用时,往往会发现,从“玩一玩”到“用起来”之间,隔着一道巨大的鸿沟。你需要考虑模型选择、API成本、响应速度、数据安全、扩展性,还有最头疼的——如何把不同的AI能力(比如文本生成、图像理解、代码执行)像搭积木一样组合起来。这就是为什么像Amazon Bedrock这样的全托管服务变得越来越重要。

简单来说,Amazon Bedrock不是一个单一的AI模型,而是一个“AI模型超市”和“AI应用车间”的结合体。它让你能在一个统一的平台上,安全地访问来自Anthropic、AI21 Labs、Cohere、Meta以及亚马逊自家Titan系列的各种顶尖大语言模型和基础模型。更重要的是,它提供了一整套工具,让你能基于这些模型,快速构建、测试和部署可扩展的生成式AI应用,从简单的聊天机器人到能自主执行多步骤任务的智能体(AI Agent)。本教程的目标,就是带你从发出第一个提示词开始,一步步走过这个完整的旅程,最终构建出一个具备初步行动能力的AI智能体,让你直观感受现代AI应用开发的完整流程。

2. 核心概念与平台初探

2.1 为什么选择Bedrock?理解其核心价值

在深入操作之前,我们先厘清几个关键概念,这能帮你理解后续每一步操作背后的逻辑。首先, 基础模型(Foundation Models) 指的是像Claude 3、Llama 2这类经过海量数据预训练的大模型,它们是生成文本、代码或图像的“原材料”。Bedrock的价值在于,它让你无需自己准备昂贵的GPU服务器去部署这些模型,而是通过API按需调用。

其次, 智能体(AI Agent) 是本次教程的终极目标。它不同于简单的问答机器人。一个真正的智能体具备三个关键能力: 理解复杂目标、规划执行步骤、使用工具(Tools) 。例如,你告诉它“帮我分析一下上季度销售数据,并写一份总结报告”,一个智能体应该能自己决定:先调用工具连接数据库获取数据,再用另一个工具进行数据分析,最后利用语言模型生成报告文本。Bedrock专门提供了“Agents”功能来简化这类智能体的构建。

最后, 提示词工程(Prompt Engineering) 是与这些模型交互的核心技能。在Bedrock中,这不仅仅是在输入框里打字。你可以通过 “提示词工作流(Prompt Flows)” 可视化地编排复杂的提示逻辑,比如先让模型判断用户意图,再根据意图选择不同的信息库来生成答案。平台还提供了 “模型评估(Model Evaluation)” 功能,让你能用一批测试问题,客观地比较不同模型在特定任务上的表现,从而做出成本与效果最优的选择。

2.2 平台准备与基础环境配置

开始动手前,你需要一个AWS账户。如果还没有,可以去AWS官网注册,新用户通常有免费额度,足够完成本教程的体验。登录AWS管理控制台后,在服务搜索栏输入“Bedrock”即可进入。

进入Bedrock控制台,你首先会看到“模型访问(Model access)”页面。这里非常关键: 你需要手动请求启用你计划使用的模型 。AWS出于安全和责任共担的考虑,默认不开放所有模型的访问权限。点击“管理模型访问(Manage model access)”,在列表中找到你感兴趣的模型,例如Anthropic的Claude 3 Sonnet,勾选并点击“保存更改”。启用申请通常是即时生效的。

注意:不同模型的定价差异很大。在“模型”页面,每个模型卡片上都明确标注了每1000个输入令牌(Input Token)和输出令牌(Output Token)的价格。对于初学者,建议从性价比高的模型开始,如Claude 3 Haiku或Amazon Titan Text Lite,它们的响应速度快,适合进行大量的提示词调试和实验。

环境准备的最后一步是权限。为了安全起见,我们不会使用账户的根用户(Root User)进行操作。你需要创建一个具有编程访问权限的IAM用户,并为其附加必要的策略。最简便的方式是直接附加AWS托管的策略 AmazonBedrockFullAccess 。然后,为该用户创建访问密钥(Access Key ID和Secret Access Key)。请务必妥善保存Secret Access Key,它只显示一次。

3. 从第一个提示词到复杂工作流

3.1 在Playground中完成首次对话

Bedrock控制台内置的“Playground”是我们学习和测试的绝佳沙盒。它分为“文本(Text)”、“聊天(Chat)”和“图像(Image)”等多种模式。我们首先从“聊天”模式开始,它模拟了多轮对话的场景。

在模型选择下拉菜单中,选择你已经启用访问的模型,例如“Claude 3 Sonnet”。你会看到界面分为“系统提示(System Prompt)”和用户对话区域。系统提示是用来给AI设定角色和基础行为准则的,它对整个对话过程产生全局性影响。例如,你可以输入:“你是一个乐于助人且简洁的编程助手。如果用户的问题不明确,请主动询问澄清。”

接下来,在用户输入框中,尝试你的第一个提示词:“用Python写一个函数,计算斐波那契数列的第n项。”点击“运行”。几秒钟后,你将看到模型返回的代码和解释。Playground右侧提供了丰富的调试参数:

  • 温度(Temperature) :控制输出的随机性。值越高(如0.8),回答越创造性、多样化;值越低(如0.1),回答越确定、一致。对于代码生成,通常设置较低的值(0.2-0.5)以获得更稳定的输出。
  • 最大生成长度(Max Tokens) :限制单次响应的大小。如果响应被意外截断,可以调高此值。
  • Top P :另一种控制随机性的采样方法。通常与温度二选一即可,Bedrock默认使用温度。

试着修改这些参数,重新运行相同的提示,观察输出有何不同。这是理解模型行为的第一步。

3.2 构建你的第一个提示词工作流

单一提示词能解决的问题有限。真实场景中,我们往往需要将任务分解。Bedrock的“提示词工作流(Prompt Flows)”功能允许你以可视化拖拽的方式,构建复杂的处理流水线。

假设我们要构建一个“技术文档问答助手”。它的工作流程是:1) 理解用户问题;2) 从指定的知识库中检索相关文档片段;3) 基于检索到的上下文生成精准答案。

在控制台找到“提示词工作流”,创建一个新流程。你会看到一个画布。从左侧组件库中,拖入以下节点:

  1. 输入节点 :定义用户问题,如“如何在AWS S3上设置静态网站托管?”
  2. 检索节点(Retrieval) :这是关键。你需要先将你的技术文档(PDF、TXT等)上传到Bedrock的知识库(Knowledge Base)中。知识库会使用嵌入模型(Embedding Model)将文档切片并转换为向量,存储在向量数据库(如Pinecone, AWS OpenSearch)中。在检索节点中,关联你创建好的知识库,它会自动根据输入问题查找最相关的文本片段。
  3. 提示词编排节点(Prompt Template) :在这里设计你的最终提示词模板。例如:
    你是一个AWS专家助手。请根据以下上下文信息回答问题。如果答案不在上下文中,请直接说“根据提供的信息,我无法回答这个问题”。
    
    上下文:{retrieved_context}
    
    问题:{user_question}
    
    答案:
    
    注意 {retrieved_context} {user_question} 是变量,它们会分别接收来自检索节点和输入节点的输出。
  4. 模型调用节点(Invoke Model) :选择Claude 3 Haiku模型,并将上一步提示词节点的输出作为本节点的输入。
  5. 输出节点 :定义最终答案的输出格式。

连接这些节点,并点击“运行”。这个工作流成功地将用户问题、知识检索和文本生成串联起来,实现了基于私有知识的精准问答。你可以将此工作流保存为模板,未来通过API直接调用整个流水线。

4. 迈向智能:构建你的第一个AI智能体

4.1 智能体核心三要素:指令、模型与行动组

Playground和工作流虽然强大,但仍然是“被动响应”。AI智能体的精髓在于“主动行动”。在Bedrock中创建智能体,你需要配置三个核心部分:

  1. 智能体指令(Agent Instructions) :这是智能体的“宪法”,定义了它的身份、目标和行为边界。指令需要非常清晰具体。例如: “你是一个电商客服智能体,负责处理用户的订单查询。你的目标是准确、高效地解答用户关于订单状态、物流信息、退货政策的问题。你必须严格遵守以下规则:1. 只能使用已提供的工具来获取真实数据,绝不能编造信息。2. 如果用户询问与订单无关的问题,应礼貌地表示无法处理,并引导回主题。3. 所有涉及用户订单号的对话,都必须先验证用户身份(要求提供注册邮箱后四位)。” 指令的质量直接决定了智能体行为的可靠性和安全性。

  2. 基础模型选择 :为智能体的“大脑”选择模型。智能体需要强大的推理和规划能力,因此建议选择能力更强的模型,如Claude 3 Sonnet或Opus。这个模型负责解析用户请求、规划步骤、理解工具执行结果并组织最终回复。

  3. 行动组(Action Groups) :这是智能体的“手和脚”。一个行动组对应一个具体的工具函数,通常通过一个Lambda函数(AWS的无服务器计算服务)来实现。例如,你可以创建以下行动组:

    • GetOrderStatus :接收订单号,查询数据库,返回状态。
    • EstimateDeliveryDate :接收订单号和邮编,调用物流API,返回预估送达日期。
    • InitiateReturn :接收订单号和产品SKU,在售后系统中创建退货单。

4.2 实战:创建“订单查询”智能体

让我们一步步实现一个最简单的订单查询智能体。

第一步:创建Lambda函数(工具实现) 前往AWS Lambda控制台,创建一个新的函数,运行环境选择Python 3.12。使用以下示例代码:

import json
import boto3
from datetime import datetime, timedelta

# 模拟一个简单的订单数据库
ORDERS_DB = {
    "ORD-12345": {"status": "已发货", "product": "无线耳机", "shipped_date": "2023-10-26"},
    "ORD-67890": {"status": "处理中", "product": "编程书籍", "shipped_date": None},
}

def lambda_handler(event, context):
    # Bedrock智能体会以特定格式调用此函数
    action_group = event['actionGroup']
    function_name = event['function']
    parameters = event.get('parameters', [])

    # 处理 GetOrderStatus 动作
    if function_name == 'GetOrderStatus':
        order_id = None
        for param in parameters:
            if param['name'] == 'orderId':
                order_id = param['value']
                break

        if not order_id or order_id not in ORDERS_DB:
            return {
                'statusCode': 404,
                'response': {
                    'message': f'未找到订单 {order_id} 的信息。'
                }
            }

        order_info = ORDERS_DB[order_id]
        # 如果是已发货订单,模拟计算送达日期
        delivery_info = ""
        if order_info['status'] == '已发货' and order_info['shipped_date']:
            shipped_date = datetime.strptime(order_info['shipped_date'], "%Y-%m-%d")
            estimated_delivery = shipped_date + timedelta(days=5)
            delivery_info = f",预计送达日期为 {estimated_delivery.strftime('%Y年%m月%d日')}。"

        response_body = {
            'message': f"订单 {order_id} 的状态是:{order_info['status']}。购买商品为:{order_info['product']}{delivery_info}"
        }

        return {
            'statusCode': 200,
            'response': response_body
        }

    # 可以在这里添加其他 function_name 的处理逻辑
    return {
        'statusCode': 404,
        'response': {'message': f'未知功能: {function_name}'}
    }

部署这个函数后,记下它的ARN(Amazon Resource Name)。

第二步:在Bedrock中配置智能体

  1. 在Bedrock控制台,进入“智能体”页面,点击“创建智能体”。
  2. 输入名称,如 OrderHelperAgent
  3. 在“模型”部分,选择“Claude 3 Sonnet”。
  4. 关键步骤:配置指令 。将前面设计好的电商客服智能体指令粘贴进去。
  5. 进入“行动组”部分,点击“添加行动组”。
    • 名称: OrderStatusActions
    • 描述: 用于查询订单状态和物流信息。
    • 行动组类型 :选择“通过Lambda函数定义”
    • Lambda函数ARN:粘贴你刚才记下的ARN。
    • API模式 :选择“函数调用”。这是告诉智能体,这个Lambda里具体有哪些函数可用。
  6. 接下来是最容易出错的一步: 定义函数模式(Function Schema) 。你需要以JSON Schema的格式,精确地描述Lambda函数里可用的函数、它们的参数以及返回值的结构。点击“添加函数”,填写:
    • 函数名称: GetOrderStatus (必须与Lambda代码中的 function_name 完全一致)
    • 描述: 根据订单号查询订单状态和详情。
    • 参数:添加一个参数,名称 orderId ,描述 用户的订单号 ,类型 string ,是否必需 true
    • (可选)定义返回值的结构,这能帮助模型更好地理解工具的输出。
  7. 保存行动组。

第三步:测试与迭代 保存智能体后,进入“预览”界面。你可以像在Playground中一样与它对话。尝试输入:“我的订单ORD-12345到哪里了?” 智能体的大脑(Claude模型)会解析你的问题,识别出意图是查询订单状态,并发现需要调用 GetOrderStatus 这个工具,且需要参数 orderId=ORD-12345 。然后,Bedrock后台会自动去调用你配置的Lambda函数,获取真实的订单数据,再将结果返回给模型,由模型组织成一段通顺的话回复给你:“您的订单ORD-12345状态为‘已发货’,购买商品为无线耳机,预计送达日期为2023年10月31日。”

如果智能体没有正确调用工具,或者回复不符合预期,你需要回到指令或函数描述中进行调试。通常问题源于:1) 指令不够清晰,未能约束模型必须使用工具;2) 函数描述不准确,模型无法正确匹配。

5. 进阶技巧与生产环境考量

5.1 提示词工程进阶:少样本学习与思维链

在Playground或智能体指令中,除了系统提示,你还可以利用“少样本学习(Few-shot Learning)”来显著提升模型在特定任务上的表现。方法是在系统提示或用户消息中,提供几个“输入-输出”的示例。

例如,你想让智能体以固定格式提取用户邮件中的会议信息:

系统指令:你是一个信息提取助手。请从用户输入中提取会议主题、时间和参会人,并以JSON格式输出。

示例1:
用户:”下午三点和Alice、Bob开项目评审会。”
助手:{"topic": "项目评审会", "time": "15:00", "attendees": ["Alice", "Bob"]}

示例2:
用户:”明天上午十点,团队周会。”
助手:{"topic": "团队周会", "time": "明天10:00", "attendees": ["团队"]}

现在请处理新的用户输入:

这种方式能极大地引导模型输出符合你要求的格式和内容。

另一个强大技巧是 思维链(Chain-of-Thought) 。对于复杂推理问题,在提示词中要求模型“逐步思考”,可以提升其答案的准确性。例如:“请一步步推理:如果一本书打八折后售价是24美元,那么它的原价是多少?请先列出计算步骤。”

5.2 监控、成本与安全最佳实践

当你准备将应用从实验推向生产时,以下几点至关重要:

监控与日志 :务必启用Bedrock的日志记录功能,将模型的输入和输出发送到Amazon CloudWatch Logs。这对于调试错误、分析用户交互模式、检测提示词注入攻击至关重要。你可以在IAM策略中为智能体配置一个日志组ARN。

成本控制 :生成式AI的成本主要由令牌数驱动。实施以下策略:

  • 缓存 :对常见、重复的查询结果进行缓存,避免重复调用模型。
  • 设置使用限额(Quotas) :在AWS服务配额控制台,为Bedrock的“模型调用”设置每日或每月限额,防止因意外流量或恶意攻击导致成本失控。
  • 选择合适模型 :在原型阶段使用轻量级模型(如Haiku),上线前再用更强大的模型(如Sonnet)进行关键任务的质量校验。

安全与合规

  • 数据隐私 :所有通过Bedrock与模型交互的数据,在传输和静态时默认都是加密的。对于敏感数据,你可以使用AWS Key Management Service (KMS) 管理自己的加密密钥。
  • 内容过滤 :Bedrock内置了内容安全过滤器,可以拦截包含仇恨言论、暴力、性暗示等有害内容的输入和输出。你可以在模型调用配置中设置过滤级别。
  • 权限最小化 :为智能体配置的IAM角色和Lambda函数的执行角色,必须遵循最小权限原则,只授予其完成特定任务所必需的最低权限。

6. 常见问题与故障排查实录

在实际操作中,你几乎一定会遇到下面这些问题。这里记录了我的踩坑经验和解决方案。

问题1:智能体总是忽略工具,直接用自己的知识回答。

  • 排查 :这是最常见的问题。首先,检查智能体指令。指令中必须明确、强制性地要求智能体在回答前先使用工具。例如,加入“ 在回答任何关于订单、物流、库存的问题前,你必须调用相应的行动组函数来获取最新数据。严禁基于自身知识猜测。
  • 其次 ,检查函数描述。描述要清晰说明函数的用途和输入参数,让模型能准确匹配用户意图到具体函数。
  • 最后 ,在测试时,使用预览窗格中的“追踪(Trace)”功能。它能完整展示智能体的思考过程:是否识别了需要调用工具、选择了哪个函数、传递了什么参数、Lambda返回了什么结果。这是最强大的调试工具。

问题2:Lambda函数被调用,但智能体说“执行失败”或无法解析结果。

  • 排查 :查看CloudWatch中该Lambda函数的日志。99%的问题出在Lambda函数的返回格式上。Bedrock智能体要求Lambda返回一个非常特定的JSON结构:
    {
        "statusCode": 200,
        "response": {
            // 你的实际返回数据,必须是一个对象
            "message": "查询成功",
            "orderStatus": "shipped"
        }
    }
    
    statusCode 必须是200表示成功, response 字段必须是一个JSON对象。如果返回的是字符串或数组,智能体可能无法解析。确保你的Lambda代码在最后是 return 了这个结构。

问题3:提示词工作流中的知识库检索结果不相关。

  • 排查 :知识库的检索质量取决于两个因素:文档分块(Chunking)策略和嵌入模型。
    • 分块 :上传文档时,Bedrock会按默认大小(如500字符)将文档切片。如果一个问题答案跨越了两个切片,就可能检索不全。尝试调整分块大小和重叠区(Chunk Overlap),对于技术文档,较小的分块(如300字符)和一定的重叠(如50字符)有时效果更好。
    • 测试 :在知识库页面有“测试”功能,输入一些关键词或问题,查看返回的文本片段是否相关。如果不相关,考虑优化文档结构或尝试不同的嵌入模型(如果平台支持选择)。

问题4:模型响应速度慢或超时。

  • 排查 :首先检查 Max Tokens 参数是否设置过高,导致模型生成了非常长的文本。适当调低。
  • 对于智能体,响应时间还包括了调用外部工具(如Lambda)的耗时。确保你的Lambda函数运行在合适的区域,且逻辑高效。如果Lambda冷启动严重,可以考虑使用Provisioned Concurrency。
  • 考虑使用响应更快的模型,如Claude 3 Haiku,它在保持不错能力的同时,速度比Sonnet快很多。

构建基于Bedrock的AI应用是一个“设计-测试-迭代”的循环过程。从第一个简单的提示词开始,到构建出能自主调用工具完成任务的智能体,每一步都加深了你对模型能力边界和应用架构的理解。最关键的是动手去试,在Playground里大胆实验不同的提示词,在智能体追踪里仔细观察它的思考逻辑,遇到错误时耐心查看日志。这个平台将基础设施的复杂性大幅降低,让你能更专注于AI应用逻辑本身的价值创造。

更多推荐