使用 Bedrock 生成客服回复

Beginner
立即练习

介绍

客服团队需要为重复扣款报告起草回复。你将把工单发送给 Bedrock Runtime,完善起草指令,查看生成的响应,并将 token 用量与输出限额比较。新的 LabEx VM 已配置好 AWS CLI;只使用这里提供的合成工单。

你应掌握运行命令和读取文本文件的基本操作。本任务是生成并审阅草稿,不会发送客户消息或更改账单记录。

认证关联

认证 考试任务 练习内容
AI Practitioner (AIF-C01) 任务 3.1、3.2 调整输出长度,提供明确的起草指令,并审阅生成文本。

使用 draw.io 制作的概念图:工单与明确指令输入 Bedrock Converse,生成的草稿和 token 用量需要审阅。

起草客服回复

本步骤中,你将选择可用的文本模型,并把客服工单发送给 Bedrock Runtime。

上方 AWS View 显示模型和实际请求结果,下方 Terminal 用于输入命令。发送请求前,View 中没有回复。发送后,它会显示等待中的请求,随后显示响应、用量和剩余额度。

Bedrock 提供基础模型的访问能力,这类模型可以为多种任务生成文本。模型标识符用于选择模型;Converse 是受支持对话模型的通用请求格式。这里使用工作区内可用的文本模型。

先进入练习目录。cd 改变 Terminal 的当前目录:

cd /home/labex/project

列出能够输出文本的模型。--by-output-modality TEXT 筛选目录;--query 选择标识符和易读名称;--output table 将这些字段显示为表格:

aws bedrock list-foundation-models \
  --by-output-modality TEXT \
  --query 'modelSummaries[].[modelId,modelName]' \
  --output table

表格包含下面将使用的 labex.text-v1:0。目录条目描述一个模型,并不代表推理请求已经执行。

Converse 请求包含 modelId、messages 列表和可选推理设置。每条消息都有 role 和内容块。user 消息承载问题或任务,文本内容块使用 text 字段。maxTokens 限制生成输出;temperature 控制采样变化。较低的 temperature 可以减少变化,但不保证回复准确或完全相同。

以 JSON 创建请求。cat > request.json 写入文件;<<'EOF' 标记开始按原样读取多行输入,最后的 EOF 结束输入。这里只替换指定的练习文件:

cat > request.json <<'EOF'
{
  "modelId": "labex.text-v1:0",
  "messages": [
    {
      "role": "user",
      "content": [{"text": "Customer ticket Q-42: the customer reports that invoice Q-42 was charged twice. Draft an English support reply in two sentences."}]
    }
  ],
  "inferenceConfig": {"maxTokens": 512, "temperature": 0}
}
EOF

使用 bedrock-runtime converse 发送请求。--cli-input-json file://request.json 从该文件读取请求字段。末尾的 > reply.json 将 JSON 响应保存到文件,而不是打印出来:

aws bedrock-runtime converse \
  --cli-input-json file://request.json \
  > reply.json

等待 Terminal 提示符重新出现。生成文本通常需要几秒。第一个请求仍在等待时,不要运行另一个请求。

读取响应:

cat reply.json

寻找 output.message.role: "assistant" 和非空的 text 内容块。usage 报告处理的 token,metrics.latencyMs 报告以毫秒计的响应时间。在 Terminal 上方的 AWS View 中展开已完成请求,将回复与文件比较。

仔细阅读草稿。它是否声称调查已开始、退款已发出或扣款已确认?工单没有提供这些事实。流畅的响应也可能包含编造的细节;下一步将收紧指令。不要把模型生成的句子当成已完成的账单操作。

完善起草指令

本步骤中,你将添加明确指令,并根据同样的已报告事实生成新草稿。

system 字段提供任务和风格指令。将工单保留在 user 消息中,把起草约束放在 system 消息中。更具体的指令可以减少不需要的细节,但仍必须审阅响应。

创建独立请求,保留原始草稿以便比较:

cat > revised-request.json <<'EOF'
{
  "modelId": "labex.text-v1:0",
  "system": [
    {"text": "You draft customer-support replies. Use only the facts in the ticket. Write two concise English sentences. Acknowledge the customer's report and ask for information needed to verify it. Do not claim that a charge was confirmed, an investigation started or a refund issued."}
  ],
  "messages": [
    {
      "role": "user",
      "content": [{"text": "Customer ticket Q-42: the customer reports that invoice Q-42 was charged twice. No billing check or refund has been completed. Draft a reply."}]
    }
  ],
  "inferenceConfig": {"maxTokens": 512, "temperature": 0}
}
EOF

生成修改后的草稿:

aws bedrock-runtime converse \
  --cli-input-json file://revised-request.json \
  > revised-reply.json

使用 Python 标准 JSON 格式化工具检查保存的响应。它会验证文件是否为有效 JSON,并格式化显示:

python3 -m json.tool revised-reply.json

在上方 AWS View 中展开新的已完成请求。根据给定工单比较两份草稿。修改后的请求应清楚表达你的要求;这一次响应是否遵循要求,仍需人工判断。若它编造了操作,不要在客户回复中使用该句子。

这些请求相互独立。复用同一模型不会自动把前一次响应作为对话历史发送。后续对话需要把先前的 user 和 assistant 消息明确加入 messages。

查看 token 用量和输出限额

本步骤中,你将为同一起草任务设置更小的输出上限,并查看实际用量。

Token 是模型处理文本的单位,并不一定等于一个单词。输入 token 包含任务、system 指令和提供的任何历史。输出 token 包含模型报告的生成 token,可能包括内部推理。返回的 totalTokens 是输入与输出 token 之和。

maxTokens 是上限,不是要求恰好生成该数量的 token。模型可能提前结束。创建输出上限为 384 token、而不是 512 的请求:

cat > bounded-request.json <<'EOF'
{
  "modelId": "labex.text-v1:0",
  "system": [
    {"text": "You draft customer-support replies. Use only the facts in the ticket. Write two concise English sentences. Acknowledge the customer's report and ask for information needed to verify it. Do not claim that a charge was confirmed, an investigation started or a refund issued."}
  ],
  "messages": [
    {
      "role": "user",
      "content": [{"text": "Customer ticket Q-42: the customer reports that invoice Q-42 was charged twice. No billing check or refund has been completed. Draft a reply."}]
    }
  ],
  "inferenceConfig": {"maxTokens": 384, "temperature": 0}
}
EOF

发送请求并保存响应:

aws bedrock-runtime converse \
  --cli-input-json file://bounded-request.json \
  > bounded-reply.json

查看结果:

python3 -m json.tool bounded-reply.json

将 usage.outputTokens 与 384 token 上限比较。stopReason: "end_turn" 表示模型正常结束;"max_tokens" 表示达到输出上限,因此文本可能不完整。不要将部分回复视为已完成文档。

上方 AWS View 显示相同的用量和当前剩余 credits。Credits 反映模型特定的输入与输出消耗;仅凭 token 数量不能得出不同模型的统一价格。重复请求可能由缓存的模型结果响应,因此即使有 token 用量,剩余 credits 也可能不变。上限有助于约束请求,但更小的上限不保证这次简短回复比每一次先前回复都消耗更少的 token。

来自 fresh VM 的实际 AWS View:有上限的回复报告 96 个输入 token、330 个输出 token 和 end_turn。本次复用了缓存中的模型结果,因此额度未变;你的文本、用量和耗时可能不同。

如果请求失败或用量不确定,重试前先检查错误。不确定的请求可能保留预留额度,另发请求也可能增加消耗。课程后续会介绍应用如何处理这些情况。

清理练习文件

本步骤中,你将在审阅草稿后删除本地请求和响应文件。

Converse 发送推理请求,不会创建需要删除的服务器或数据库。六个 JSON 文件是本地练习产物。删除它们不会撤销 token 用量,也不会恢复已经消耗的 credits。

rm 删除指定文件。使用下面的准确文件名,并保留其他项目文件:

rm request.json reply.json revised-request.json revised-reply.json bounded-request.json bounded-reply.json

列出工作区剩余的可见条目:

ls

六个练习文件应已不存在。AWS View 为此 VM 保留实际已完成请求的结果和用量;删除本地文件不能把失败请求变成成功请求,也不能抹去消耗。

总结

你使用 Bedrock Converse 发送了实际文本请求,完善 system 指令,查看生成回复和 token 用量,限制输出长度,并删除本地练习文件。你还区分了看似合理的草稿与已验证的业务事实:响应在使用前必须审阅。

进一步阅读 AWS 官方资料:Converse 消息、指令与推理设置; Converse 响应内容、停止原因与用量。