Amazon Bedrock Workshop实战:深入理解Agents调用机制
引言
在构建基于大语言模型(LLM)的应用程序时,Amazon Bedrock提供的Agents功能是一个强大的工具,它能够将知识库检索、API调用和LLM推理能力无缝集成。本文将通过一个餐厅预订代理的实际案例,深入探讨如何有效调用Amazon Bedrock Agents,并展示其核心功能与最佳实践。
Agents基础概念
Amazon Bedrock Agents由两个主要组件构成:
- 管理客户端(bedrock-agent):负责Agent和知识库的创建、更新、删除等管理操作
- 运行时客户端(bedrock-agent-runtime):处理Agent的实际调用和知识库检索
本文重点介绍运行时客户端的invoke_agent
API,这是与Agent交互的核心接口。
环境准备
在开始调用Agent前,我们需要完成以下准备工作:
import boto3
import logging
import uuid
from datetime import datetime
# 初始化客户端
bedrock_agent_runtime_client = boto3.client('bedrock-agent-runtime')
dynamodb = boto3.resource('dynamodb')
# 配置日志
logging.basicConfig(
format='[%(asctime)s] p%(process)s {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
Agent调用辅助函数
我们使用一个精心设计的辅助函数invoke_agent_helper
来简化Agent调用过程。这个函数支持以下关键功能:
def invoke_agent_helper(query, session_id, agent_id, alias_id,
enable_trace=False, session_state=None):
"""
参数说明:
- query: 用户查询文本
- session_id: 会话标识符,用于维护对话上下文
- agent_id: Agent的唯一标识
- alias_id: Agent版本的别名
- enable_trace: 是否启用执行追踪
- session_state: 会话状态信息(包含prompt属性等)
"""
# 实际调用逻辑...
实战案例:餐厅预订Agent
1. 知识库查询
首先测试Agent从知识库中检索儿童菜单信息的能力:
session_id = str(uuid.uuid1())
query = "What is in the childrens menu?"
response = invoke_agent_helper(query, session_id, agent_id, alias_id)
print(response)
关键点:每次调用使用唯一的session_id
会创建新的对话上下文。
2. 上下文保持
利用相同的session_id
进行后续查询,Agent会自动保持对话上下文:
query = "Which of those options are vegetarian?"
response = invoke_agent_helper(query, session_id, agent_id, alias_id)
print(response)
3. 动作组调用
测试Agent通过API创建预订记录的能力:
query = "Hi, I am Maria. I want to create a booking for 4 people, at 9pm on the 5th of May 2024."
response = invoke_agent_helper(query, session_id, agent_id, alias_id)
print(response)
验证机制:通过查询DynamoDB确认预订记录已正确创建:
table = dynamodb.Table('restaurant_bookings')
response = table.scan()
pd.DataFrame(response['Items'])
4. 会话属性应用
使用promptSessionAttributes
传递用户上下文信息:
session_id = str(uuid.uuid1())
query = "I want to create a booking for 2 people, at 8pm on the 6th of May 2024."
session_state = {
"promptSessionAttributes": {
"name": "John"
}
}
response = invoke_agent_helper(query, session_id, agent_id, alias_id,
session_state=session_state)
print(response)
5. 时间上下文处理
结合当前日期处理相对时间查询:
today = datetime.today().strftime('%b-%d-%Y')
query = "I want to create a booking for 2 people, at 8pm tomorrow."
session_state = {
"promptSessionAttributes": {
"name": "John",
"today": today
}
}
response = invoke_agent_helper(query, session_id, agent_id, alias_id,
session_state=session_state)
print(response)
6. 高级查询能力
展示Agent的推理和知识检索能力:
# 过敏友好建议
query = "I am allergic to shrimps. What can I eat at this restaurant?"
response = invoke_agent_helper(query, str(uuid.uuid1()), agent_id, alias_id)
print(response)
# 儿童饮食建议
query = "What do you have for kids that don't like fries?"
response = invoke_agent_helper(query, str(uuid.uuid1()), agent_id, alias_id)
print(response)
高级功能探索
执行追踪(Trace)
启用追踪功能查看Agent的决策过程:
query = "What are the desserts on the adult menu?"
response = invoke_agent_helper(query, str(uuid.uuid1()), agent_id, alias_id,
enable_trace=True)
print(response)
追踪信息会显示Agent的完整推理链条,包括知识库检索和API调用决策。
多语言支持
Agent原生支持多语言交互,无需额外配置:
# 西班牙语查询
query = "¿Podrías reservar una mesa para dos 25/07/2024 a las 19:30"
session_state = {
"promptSessionAttributes": {
"Nombre": "Gabriela"
}
}
response = invoke_agent_helper(query, str(uuid.uuid1()), agent_id, alias_id,
session_state=session_state)
print(response)
最佳实践总结
- 会话管理:合理使用
session_id
维护对话上下文 - 属性传递:利用
promptSessionAttributes
增强Agent的上下文感知 - 验证机制:对关键操作(如数据库修改)实施结果验证
- 追踪调试:开发阶段启用Trace功能优化Agent行为
- 多语言设计:利用LLM原生多语言能力扩展应用场景
通过本教程,您应该已经掌握了Amazon Bedrock Agents的核心调用机制和实际应用技巧。这些技术可以广泛应用于客服系统、智能助手、数据查询等各种基于大语言模型的场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考