我创建了一个城市探索者应用,使用Amazon Bedrock的知识库推荐旅游景点。在这篇文章中,我详细介绍了如何创建这个应用程序。

[Veliswa Boya]

发布于2024年4月17日

在我的工作中,我很幸运能够遍及世界各地。正如你可能已经知道的那样,出差旅行与休闲旅行有所不同。出差时通常没有太多时间可以探索和观光。 为了安排一些观光时间,我通常会在当天工作安排开始之前很早起床,或者在一天结束时留出一个小时左右的时间。

由于观光时间如此有限,充分利用这些宝贵时间就显得很重要了。我并不总是做得很好,我的观光计划往往依赖从各种渠道收集的信息,包括旅游Instagram账号、TripAdvisor、朋友和同事等。

好了,朋友们和同事们不用再烦恼了!我已经创建了一个城市探索者应用,它使用Amazon Bedrock的知识库推荐游览景点。在这篇文章中,我详细阐述了如何创建这个应用程序

什么是知识库,为什么它们很重要?

[Retrieval-Augmented Generation (RAG)]可以通过在基于训练数据源之外引用权威知识库后再生成响应,优化你从大型语言模型 (LLM) 获得的输出。因此,知识库有助于为LLM提供更多上下文,从而生成更相关、更准确和更加定制化的输出。

我使用Amazon Bedrock的知识库构建城市探索者应用程序,原因如下:

  1. 我正在寻找一个单一准确的数据源,以满足城市探索者应用程序的所有需求。
  2. 我希望能够根据我的旅行行程快速且经济有效地修改我的数据源。

RAG使我能够更快地测试和改进我的应用程序,因为我可以根据不断变化的要求控制和更改LLM的数据源。

如何使用知识库构建我的应用程序

现在我将深入介绍构建应用程序所遵循的三个(是的,只有3个!)步骤:

  1. 数据源
  2. 创建知识库
  3. 调用知识库

该教程的所有代码和文档都可在GitHub上获得[GitHub]。

第1步:数据源

我选择了[[Amazon Simple Storage Service (Amazon S3)]]作为我的单一数据源,我将从各种来源(在本例中是世界各地城市的维基百科页面)汇总数据。我在与即将创建的知识库相同的区域(us-east-1)中创建了一个Amazon S3桶,然后以PDF格式上传了维基百科页面。

[允许的文档文件格式]包括.txt、.md、.html、.doc/.docx、.csv、.xls/.xlsx、.pdf。每个文件大小不能超过50MB的配额。

打开网易新闻 查看精彩图片

包含维基百科页面的S3桶

第2步:创建知识库

然后我[在Amazon Bedrock中创建了一个知识库],用于摄取上一步创建的数据。我在与数据源(us-east-1)相同的区域创建了知识库。

打开网易新闻 查看精彩图片

创建知识库

作为数据源,我链接了在第1步中创建的[Amazon S3桶]。

打开网易新闻 查看精彩图片

为知识库设置数据源

我很高兴在学习RAG的旅程开始时找到了[[Vector Embeddings and RAG Demystified: Leveraging Amazon Bedrock, Aurora, and LangChain - Part 1]]这篇文章。该文章以一种有助于加深我的理解的方式解释了向量嵌入的概念及其对RAG的重要性。向量嵌入是将内容(如单词、句子或图像)映射到机器可以处理和理解的多维向量空间中的数值表示形式。

在知识库中使用数据源(本例中是第1步创建的S3桶)中的城市探索者数据之前,需要将数据转换为嵌入向量。为此,我(和你:))需要一个[嵌入模型]。我不会在这里详细介绍嵌入技术,但一些流行的嵌入技术包括Word2Vec (用于单词)、Doc2Vec (用于文档)和图像嵌入(用于图像)。选择合适的嵌入模型取决于使用案例,而来自Hugging Face的[MTEB排行榜]是在寻找支持数据以帮助选择最佳模型时的绝佳指南。

因此,接下来我选择了嵌入模型,并配置了向量存储,选择了[Amazon OpenSearch Serverless]作为我的向量存储,用于保存文本嵌入向量,然后创建了我的知识库。

[在将模型指定为嵌入模型之前,请确保首先请求访问权限]。您需要访问将在知识库中引用的所有模型。

打开网易新闻 查看精彩图片

嵌入模型和向量存储

同步:),与知识库同步数据源是一个非常重要的后续步骤!值得一提的是,这是我特别喜欢知识库的一个功能。在实验知识库的早期阶段,我经常更改数据源中的数据,我喜欢这样一个事实,即无需重新训练任何模型就可以更改数据源,我只需要重新同步即可。这与我在本文开头概述的选择知识库的第二个原因相一致。

同步

同步完成后,我可以在控制台中测试知识库,[ Claude 3 Sonnet]是我用来生成响应的LLM。

[每次向数据源的S3桶中添加、修改或删除文件时,您都必须同步数据源,以便将其重新索引到知识库]。

打开网易新闻 查看精彩图片

测试知识库

第3步:调用知识库

很快就轮到我编写代码来完成城市探索者应用程序的构建了。这是我的[[Amazon Lambda]]函数作为API,用于调用知识库的 [[RetrieveandGenerate]]API。

import os
import boto3
import random
import string
boto3_session = boto3.session.Session()
region = boto3_session.region_name
# create a boto3 bedrock client
bedrock_agent_runtime_client = boto3.client('bedrock-agent-runtime')
# get knowledge base id from environment variable
kb_id = os.environ.get("KNOWLEDGE_BASE_ID")
print (kb_id)
# declare model id for calling RetrieveAndGenerate API
model_id = "anthropic.claude-instant-v1"
model_arn = f'arn:aws:bedrock:{region}::foundation-model/{model_id}'
def retrieveAndGenerate(input, kbId, model_arn, sessionId):
#print(input, kbId, model_arn, sessionId)
if sessionId != "":
return bedrock_agent_runtime_client.retrieve_and_generate(
input={
'text': input
},
retrieveAndGenerateConfiguration={
'type': 'KNOWLEDGE_BASE',
'knowledgeBaseConfiguration': {
'knowledgeBaseId': kbId,
'modelArn': model_arn
}
},
sessionId=sessionId
)
else:
return bedrock_agent_runtime_client.retrieve_and_generate(
input={
'text': input
},
retrieveAndGenerateConfiguration={
'type': 'KNOWLEDGE_BASE',
'knowledgeBaseConfiguration': {
'knowledgeBaseId': kbId,
'modelArn': model_arn
}
}
)

我使用[Streamlit]测试了我的城市探索者应用程序,使用以下命令调用它:

python -m streamlit run cityexplorer.py

打开网易新闻 查看精彩图片

城市探索者应用程序

这是由LLM返回的JSON响应:

{“question”: “which city has an eiffel tower”, “sessionId”: ““} {‘statusCode’: 200, ‘body’: {‘question’: ‘which city has an eiffel tower’, ‘answer’: ‘Paris, France has an Eiffel Tower.’, ‘sessionId’: ‘7954e8a2-9510-48b5-9d39-037d1d563eee’}}

{“question”: “what else is interesting in Paris”, “sessionId”: “7954e8a2-9510-48b5-9d39-037d1d563eee”} {‘statusCode’: 200, ‘body’: {‘question’: ‘what else is interesting in Paris’, ‘answer’: ‘Some other interesting things to do in Paris besides the Eiffel Tower include visiting the Louvre museum, Notre Dame Cathedral, Arc de Triomphe, Champs-Elysées, and Sainte-Chapelle.’, ‘sessionId’: ‘7954e8a2-9510-48b5-9d39-037d1d563eee’}}

想了解更多信息并开始构建自己的智能应用程序,请参考:

  1. [Amazon Bedrock代码示例] - 我们不断增加的跨模型和编程语言的示例列表。
  2. [Generative AI Space]这里的community.aws有一个精选的文章列表,全部围绕Amazon Bedrock和生成式AI。
  3. [知识库现在支持Amazon Aurora PostgreSQL和Cohere嵌入模型]
  4. [Vector Embeddings and RAG Demystified: Leveraging Amazon Bedrock, Aurora, and LangChain - Part 1]

我很高兴能构建这个应用程序,我学到了很多东西。请在[Bedrock示例GitHub仓库]中找到代码,了解更多信息并使用Amazon Bedrock的知识库构建自己的智能应用程序。我期待听到你构建的内容,欢迎在评论中告诉我!

本文中的任何观点都是作者个人观点,可能与亚马逊云科技的观点不一致。