作为一名云架构师,我经常发现自己需要为各种 PoC 项目快速制作原型。在头脑风暴阶段,通常依靠基础架构图来可视化项目的架构。但是,将这些图表转换为基础架构即代码(IaC) 可能非常耗时。
像Amazon CodeWhisperer这样的工具有助于加快这一任务,它可以帮助直接在 IDE 中快速生成代码 - 尤其是使用 IaC,因为它具有相对标准的性质。但如果有更快的方法呢?
最近,Anthropic 推出了其最新创新:Claude 3 ,目前是Amazon Bedrock提供的模型的一部分。Claude 3 最显着的进步是其解释图像的能力。此功能带来了一种令人着迷的可能性:如果您可以将头脑风暴会议的基础设施图直接转换为 IaC,并立即部署代码,那会怎样?
为什么我觉得这个想法很有趣?因为这种方法不仅使开发过程变得民主化,使具有不同编程专业知识水平的人都可以使用它,而且还可以作为技能开发的强大工具。这种方法促进了实践学习体验,使团队成员能够看到视觉设计立即转化为可执行代码的过程。因此,它为个人提供了快速掌握编码概念和实践的机会,加强了他们对基础设施设计及其编码含义的理解。通过简化 IaC 的切入点,它鼓励更广泛地参与开发过程,并在团队中培养持续学习和技能提升的文化。
为了证明我的观点,这个想法也需要快速制作原型。让我们看看怎么做!
使用 Amazon Bedrock 和 Claude 3 Sonnet 读取图像
首先,请确保您已准备好 AWS 账户并启用了 Anthropic Claude 3 Sonnet 模型。查看AWS 指南以获取详细说明。
让我们开始编码(所有示例均为 Python)来与 Amazon Bedrock 进行交互。
第一个函数将图像编码为base64。这对于用户上传的图像是必要的,以便为处理做准备。该函数获取表示上传图像路径的字符串,并将其转换为 base64 编码的字符串。
import os
import base64
import io
from PIL import Image
def image_base64_encoder(image_name):
open_image = Image.open(image_name)
image_bytes = io.BytesIO()
open_image.save(image_bytes, format=open_image.format)
image_bytes = image_bytes.getvalue()
image_base64 = base64.b64encode(image_bytes).decode('utf-8')
file_type = f"image/{open_image.format.lower()}"
return file_type, image_base64
第二个函数调用 Amazon Bedrock 使用 Claude 3 Sonnet 进行图像到文本的转换。这非常灵活,因为它可以处理图像和文本输入。在用户不提供任何文本的情况下,该函数将包含默认提示。Claude 3 需要文本输入,因此这确保了与其期望的兼容性。
def image_to_text(image_name, text) -> str:
file_type, image_base64 = image_base64_encoder(image_name)
system_prompt = """Describe every detail you can about this image, be extremely thorough and detail even the most minute aspects of the image. If a more specific question is presented by the user, make sure to prioritize that answer. """
if text == "":
text = "Use the system prompt"
prompt = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 10000,
"temperature": 0.5,
"system": system_prompt,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": file_type,
"data": image_base64
}
},
{
"type": "text",
"text": text
}
]
}
]
}
json_prompt = json.dumps(prompt)
response = bedrock.invoke_model(body=json_prompt, modelId="anthropic.claude-3-sonnet-20240229-v1:0",
accept="application/json", contentType="application/json")
response_body = json.loads(response.get('body').read())
llm_output = response_body['content'][0]['text']
return llm_output
这似乎好得令人难以置信,但事实就是如此!此代码是您与 Amazon Bedrock 交互并使用 Claude 3 Sonnet 模型所需的全部内容。现在,您只需运行此代码并将图像传递给它,即可生成可立即执行的 CDK 代码。就我而言,由于我想让朋友和同事轻松访问它,因此一个不错的 Web 界面可能会很方便。
使用 Streamlit 轻松制作界面 www.cqzlsb.com
在 PoC 和快速原型设计环境中,Web 界面也需要快速创建。可以说我的前端技能或多或少符合这一点(虽然不是我的,但我觉得它真的很完美 😅)。
为了快速构建 Web 界面,我使用了Streamlit,这是一个很酷的开源 Python 库,非常适合我们这些不是 UI 专家的人。只需几行 Python 代码,您就可以自动生成 Web 应用程序界面,而无需处理 UI 设计;它非常适合 PoC,因为界面不必与公司品牌完美匹配,但目标是快速创建一个工作示例。
在此app.py
文件中,您可以看到我们如何仅用几行代码创建一个视觉上吸引人的页面。此页面包含一个用于上传我们的架构图图像的输入、一个用于任何特定请求的可选文本字段和两个按钮。一个按钮生成图像的详细描述(例如,可用于文档),另一个按钮根据图表创建相应的CDK 代码。
import streamlit as st
st.title(f""":rainbow[Architecture Diagrams with Amazon Bedrock]""")
st.header(f""":rainbow[Diagram Analysis (Claude 3 Sonnet)]""")
with st.container():
st.subheader('Image File Upload:')
File = st.file_uploader('Upload an Image', type=["png", "jpg", "jpeg"], key="diag")
text = st.text_input("OPTIONAL: Do you have a question about the image? Or about anything in general?")
result1 = st.button("Describe Diagram")
result2 = st.button("Generate CDK Code")
当你按下按钮时,它会使用给定的提示运行我们之前编写的函数:
if result1:
input_text = "You are a AWS solution architect. The image provided is an architecture diagram. Explain the technical data flow in detail. Do not use preambles."
elif result2:
input_text = "You are a AWS solution architect. The image provided is an architecture diagram. Provide cdk python code to implement using aws-cdk-lib in detail."
st.write(image_to_text(File.name, input_text))
一旦设置了虚拟环境、激活了它、安装了依赖项requirements.txt
(并创建了一个.env
文件来设置您的 AWS CLI 配置文件),您的应用程序就全部设置好了。要启动应用程序及其基本前端,只需在终端中运行以下命令:
streamlit run app.py
您将拥有一个可以使用的 Web 界面,如下所示:
总结
在短短的时间内,我们就用 Streamlit 开发了一个可运行的应用程序,这非常简单。我们还看到了 Claude 3 Sonnet 如何快速为我们提供图表的详细描述或生成可运行的代码。
但请记住,就像任何生成式 AI 一样,如果您再次尝试,它可能会给您不同的结果。您可能会得到更好的结果,也可能会得到需要更多调整的结果。这就是我们的演示应用中的文本字段的用途 - 添加更多细节以获得正确的结果。