为应用添加有明确边界的 AI 请求

AWSBeginner
立即练习

介绍

文档摘要命令需要为其 AI 依赖设置可预测的边界。你将为提供的应用添加有明确边界的 Bedrock 客户端,在推理前拒绝过长输入,并处理服务故障或慢响应而不暴露原始异常。

你应了解 Python 入门知识,以及上一引导式实验中的结构化输出验证。命令界面和响应解析器已经提供,让你专注于请求边界。这个 fresh VM 有自己的源文档、已配置身份和推理额度。

认证关联

认证 考试任务 练习内容
AI Practitioner (AIF-C01) 任务 3.1、3.2 限制推理输出,并在应用内处理生成的响应。

使用 draw.io 制作的概念图:应用在发送有上限的 Converse 请求前检查文档长度,并返回需审阅的摘要或安全的诊断错误。

连接有明确边界的 Bedrock 客户端

本步骤中,你将实现提供的命令所调用的客户端,并生成实际结构化摘要。

先进入工作区:

cd /home/labex/project

读取源文档和命令选项:

cat incident.txt
/opt/labex/aws/venv/bin/python application.py --help

事件为 INC-204。application.py 读取文档并打印 JSON 结果。它调用 client.request_summary;提供的 response_parser.py 检查完成原因和此前练习的三个字符串字段。初始 client.py 报告工作未完成,不发送请求。

输入限额在消耗推理额度前保护应用。本示例接受长度为 1–1000 的非空文本,将模型输出上限固定为 768 token,并设置明确的 SDK 连接与读取超时。total_max_attempts: 1 表示只发送一次初始请求,不自动重试。读取超时限制连接上的等待,不保证每个应用操作都恰好在该时刻结束。

使用此实现替换初始客户端。ClientError 表示服务返回的错误响应;ReadTimeoutError 表示读取等待超时。两者都会变成简短的诊断 JSON 结果。结果不会包含原始异常、请求头或凭据:

cat > client.py <<'EOF'
import boto3
from botocore.config import Config
from botocore.exceptions import BotoCoreError, ClientError, ReadTimeoutError
from response_parser import summarize_response


def request_summary(document, endpoint_url, read_timeout):
    if not document.strip() or len(document) > 1000:
        return {'status': 'rejected', 'reason': 'input_limit'}
    client = boto3.client('bedrock-runtime', endpoint_url=endpoint_url,
        config=Config(proxies={}, connect_timeout=3, read_timeout=read_timeout,
                      retries={'total_max_attempts': 1}))
    try:
        response = client.converse(
            modelId='labex.text-v1:0',
            system=[{'text': 'Summarize only facts supplied in the incident document. Return exactly one JSON object with string fields incident_id, impact and next_action. No Markdown fences, extra keys or surrounding prose. Do not turn planned work into completed work.'}],
            messages=[{'role': 'user', 'content': [{'text': document}]}],
            inferenceConfig={'maxTokens': 768, 'temperature': 0})
    except ReadTimeoutError:
        return {'status': 'unavailable', 'reason': 'read_timeout'}
    except ClientError as error:
        code = error.response.get('Error', {}).get('Code')
        reason = 'busy' if code == 'ThrottlingException' else 'service_unavailable'
        return {'status': 'unavailable', 'reason': reason}
    except BotoCoreError:
        return {'status': 'unavailable', 'reason': 'connection_failed'}
    return summarize_response(response)
EOF

使用应用正常配置的 Bedrock 端点运行命令。> accepted.json 保存打印输出:

/opt/labex/aws/venv/bin/python application.py > accepted.json

读取结果:

cat accepted.json

预期返回 status: ok 和三个摘要字段。根据文档审阅它们的含义。在上方 AWS View 中展开实际已完成请求并比较文本。输出上限限制生成 token,输入字符限额则是独立的应用策略。缓存响应可能复用实际模型输出,不产生新的 credits 扣减。

实际 AWS View 检查点:已完成请求报告 token 用量、完成原因和生成的事件摘要。数值与措辞可能变化。

在推理前拒绝过长输入

本步骤中,你将确认客户端会拒绝超出输入预算的文档。

提供的 oversized.txt 包含超过 1000 个字符。wc -m 统计字符数:

wc -m oversized.txt

将该文件交给同一个应用处理:

/opt/labex/aws/venv/bin/python application.py --document oversized.txt > too-long.json

这一预期拒绝会以退出码 2 结束。echo $? 打印前一个命令的退出码:

echo $?

读取安全结果:

cat too-long.json

预期返回 status: rejected 和 reason: input_limit。客户端在构造推理请求前检查输入,因此 AWS View 仍应只有先前的已完成请求。拒绝输入防止新的模型消耗;删除结果文件并不能撤销此前的扣减。

处理服务故障和读取超时

本步骤中,你将使用两个明确的本地传输测试服务检查客户端错误边界。

下面的端点刻意返回服务错误或延迟响应。它们不发送模型请求,不消耗推理 credits。它们是测试依赖,不是替代的成功推理提供方。

使用端口 5001 上的服务不可用测试端点:

/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5001 > unavailable.json

此预期失败以退出码 3 结束。查看其诊断结果:

cat unavailable.json

预期返回 status: unavailable 和 reason: service_unavailable,不包含堆栈、SDK 异常文本或凭据。

端口 5002 的测试服务等待三秒。将本次测试的读取超时改为一秒:

/opt/labex/aws/venv/bin/python application.py --endpoint-url http://127.0.0.1:5002 --read-timeout 1 > timed-out.json

读取结果:

cat timed-out.json

预期返回 status: unavailable 和 reason: read_timeout。SDK 只发送一次尝试。超时不能证明上游模型请求已取消或不收费:客户端停止等待后,真实上游仍可能完成。重试前查看等待中或失败的请求以及额度;不要添加无条件重试循环。

AWS View 仍应只有步骤 1 中的实际请求。正常命令的 150 秒读取超时是本练习采用的有限值;真实应用应根据延迟预算选择超时、重试策略和用户反馈。官方 Config 参考解释了独立的连接与读取超时及尝试次数控制。

删除测试输出并保留工作应用

本步骤中,你将清理四个本地结果文件,并保留能工作的客户端及提供的应用。

清理前应通过功能和失败检查。只删除指定输出:

rm accepted.json too-long.json unavailable.json timed-out.json

列出剩余文件:

ls

保留 application.py、client.py、response_parser.py、文档和测试样例。Converse 没有创建持久云工作负载;删除本地输出不会恢复 credits。应用源码会保留至此 VM 结束,供你继续练习。

总结

你为提供的摘要命令接入了实际 Bedrock 请求,限制输入和生成输出,禁用自动重试,并配置有限的连接与读取等待。你测试了服务故障和超时,没有用预设的成功推理替代正常路径;返回了安全诊断结果,并只删除本地测试输出。