Amazon Bedrock Workshop实战:为智能代理关联知识库
本文是Amazon Bedrock Workshop系列教程的一部分,重点讲解如何为已创建的智能代理关联知识库,使其能够回答基于文档内容的问题。
技术背景
Amazon Bedrock的智能代理(Agent)功能允许开发者创建能够执行复杂任务的AI助手。当我们需要代理能够回答基于特定文档内容的问题时,可以通过关联知识库(Knowledge Base)来实现。知识库会将文档内容转换为向量存储在向量数据库中,使代理能够快速检索相关信息。
实战目标
我们将扩展一个餐厅预订助手的功能,使其不仅能处理预订请求,还能回答关于餐厅菜单的问题。具体步骤包括:
- 创建知识库及其基础设施
- 上传菜单文档并同步到知识库
- 更新代理权限以访问知识库
- 将知识库与代理关联
- 测试代理的知识检索能力
详细实现步骤
1. 准备工作
首先需要加载之前创建代理时保存的变量,并初始化必要的AWS客户端:
%store -r # 加载之前保存的变量
# 初始化AWS客户端
iam_client = boto3.client('iam')
bedrock_agent_client = boto3.client('bedrock-agent')
bedrock_agent_runtime_client = boto3.client('bedrock-agent-runtime')
s3_client = boto3.client('s3')
2. 设置知识库参数
定义知识库的基本信息:
knowledge_base_name = f'{agent_name}-kb'
knowledge_base_description = "包含餐厅菜单的知识库"
bucket_name = f'{agent_name}-{suffix}' # 存储文档的S3桶
3. 创建知识库基础设施
使用Amazon OpenSearch Serverless作为向量数据库,创建知识库:
kb = KnowledgeBasesForAmazonBedrock()
kb_id, ds_id = kb.create_or_retrieve_knowledge_base(
knowledge_base_name,
knowledge_base_description,
bucket_name
)
注意:OpenSearch Serverless集合的创建可能需要几分钟时间。
4. 上传并同步文档
将包含菜单的文档上传到S3,然后同步到知识库:
# 上传文档到S3
def upload_directory(path, bucket_name):
for root, dirs, files in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
s3_client.upload_file(file_path, bucket_name, file)
upload_directory("kb_documents", bucket_name)
# 同步知识库
kb.synchronize_data(kb_id, ds_id)
5. 测试知识库
验证知识库是否能正确回答问题:
response = bedrock_agent_runtime_client.retrieve_and_generate(
input={"text": "儿童菜单中有哪些主菜?"},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
'knowledgeBaseId': kb_id,
"modelArn": f"arn:aws:bedrock:{region}::foundation-model/{agent_foundation_model}",
"retrievalConfiguration": {
"vectorSearchConfiguration": {"numberOfResults":5}
}
}
}
)
print(response['output']['text'])
6. 更新代理权限
为代理添加访问知识库的权限:
kb_policies_statements = [
{
"Sid": "QueryKB",
"Effect": "Allow",
"Action": ["bedrock:Retrieve", "bedrock:RetrieveAndGenerate"],
"Resource": [f"arn:aws:bedrock:{region}:{account_id}:knowledge-base/{kb_id}"]
}
]
policy = iam_client.create_policy(
PolicyName=f"{agent_name}-kb-{kb_id}",
PolicyDocument=json.dumps({
"Version": "2012-10-17",
"Statement": kb_policies_statements
})
)
iam_client.attach_role_policy(
RoleName=agent_role['Role']['RoleName'],
PolicyArn=policy['Policy']['Arn']
)
7. 关联知识库与代理
response = bedrock_agent_client.associate_agent_knowledge_base(
agentId=agent_id,
agentVersion='DRAFT',
description='当顾客询问菜单中的菜品时访问知识库',
knowledgeBaseId=kb_id,
knowledgeBaseState='ENABLED'
)
8. 准备代理
关联知识库后需要重新准备代理:
response = bedrock_agent_client.prepare_agent(agentId=agent_id)
while bedrock_agent_client.get_agent(agentId=agent_id)['agent']['agentStatus'] in ['CREATING', 'PREPARING', 'UPDATING', 'VERSIONING']:
time.sleep(10)
9. 测试代理
现在可以测试代理是否能正确回答基于知识库的问题:
session_id = str(uuid.uuid1())
query = "儿童菜单中有哪些开胃菜?"
response = invoke_agent_helper(query, session_id, agent_id, alias_id)
print(response)
技术要点解析
-
向量数据库选择:使用OpenSearch Serverless作为向量数据库,它专为AI工作负载优化,无需管理基础设施。
-
权限管理:代理需要显式权限才能访问知识库,遵循最小权限原则。
-
文档处理:知识库会自动将上传的文档分块、嵌入并存储在向量数据库中。
-
检索增强生成(RAG):代理会先检索相关知识,再生成回答,确保回答基于可信来源。
最佳实践建议
-
文档质量:确保上传的文档结构清晰、内容准确,这将直接影响回答质量。
-
测试策略:设计全面的测试用例,覆盖各种可能的提问方式。
-
性能监控:关注知识库检索的延迟和准确性,必要时调整分块策略或检索参数。
-
版本控制:更新文档时考虑版本管理,避免影响现有功能。
总结
通过本教程,我们成功地为Amazon Bedrock智能代理添加了知识库支持,使其能够回答基于特定文档内容的问题。这种架构模式非常适用于需要结合操作能力(如预订)和知识问答(如菜单查询)的场景。
在后续实践中,可以进一步优化知识库内容、调整检索参数,并探索如何将操作请求和知识查询更自然地结合在一起,提供更流畅的用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



