利用 Claude 3 on Amazon Bedrock 和 Streamlit 的“终极组合”,开发智能对话体验

news2024/11/14 13:22:40

0fee9371cfb67ce68a5a2f8fcf2a3130.gif

概述

通过本文,您将学会如何利用 Streamlit 框架快速搭建前端交互界面。该界面将集成图像上传功能,让用户可以方便地提交待处理图片。在后端,我们将借助 Amazon Bedrock 的 Message API,调用 Claude 3 家族中的 Sonnet 模型对图像进行理解和分析。

界面设计还将包含一个聊天窗口,实现人机对话交互。用户可以在此窗口中,基于上传图像提出连续性问题,例如询问图像中元素的性质、场景等详情。值得一提的是,我们将记录历史对话上下文,作为后续问答的参考依据。这一机制确保了对话的连贯性和一致性。

本文将为您一步步讲解实现过程,包括 Streamlit 界面设计、Amazon Bedrock API 集成,以及 Sonnet 模型调用等关键环节。我们还将分享一些实践中的经验和技巧,帮助您进一步提升应用质量和交互体验。

关于 Claude 3

Claude 3 是由 Anthropic 公司开发的一套大型人工智能语言模型。作为 Claude 家族的最新成员,它在自然语言处理、推理和生成等多个领域具有卓越能力。

021381777efc202c74fe273c4468984b.png

Claude 3 的核心优势包括:

  • 强大的多模态能力 – 可同时处理文本、图像、视频等不同模态的输入,在多模态任务上表现出色。

  • 高质量的输出 – 生成的文本内容通顺流畅,语义准确,减少了幻觉性错误。

  • 稳健的推理能力 – 能够有效理解和推理复杂的逻辑关系,完成多步推理任务。

  • 广泛的知识涵盖范围 – 涉及科学、历史、艺术、法律等多个领域的知识。

  • 集成了视觉模型 Sonnet – 赋予了出色的图像理解、分析和生成能力。

  • 强调 AI 伦理和安全 – Claude 3 在设计时注重 AI 系统的安全性和道德操守。

总的来说,Claude 3 凭借强大的自然语言处理、推理和多模态能力,可广泛应用于问答系统、智能写作、内容创作、视觉辅助等多个领域,为人类带来高效智能的 AI 助手体验。

312556ebf27a82d43cafe77fbb951343.png

Let’s build

前置条件:开通服务

在进入 Amazon Bedrock 服务后,需要以下几个步骤:

  1. 在侧边栏点击“模型访问权限”

  2. 在右上角点击“管理模型访问权限”

  3. 点击“提交应用场景详细信息”

  4. 在 Anthropic 下找到 Claude 3 Sonnet 模型,并在前面打勾

  5. 最后在右下角点击“保存更改”

220dedab2c7f069a49bb21c4b42b358a.png

开通后,我们可以看到模型后面的访问状态,已经是处于“已授予访问权限”。

在本地配置访问权限

通过 IAM User 的 AK/SK 获取后,使用 aws-cli 命令行工具配置,您在本地程序访问亚马逊云科技服务的权限。

aws configure

由于访问权限的配置不是本文的重点,因此可以直接参考此文档: 

  • 使用 IAM 用户凭证进行身份验证

    https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-authentication-user.html

Show Me The Code

在我们接下来的项目开发过程中,需要用到的主要框架包括亚马逊云科技提供的 Python SDK boto3,以及用于构建数据应用的流行开源框架 Streamlit。

boto3

boto3 是亚马逊云科技官方推出的 Python SDK,它提供了一组友好的面向对象的 API,使 Python 开发人员能够轻松地与亚马逊云科技的各种服务进行交互和操作。无论是启动 Amazon EC2 实例、部署 Amazon Lambda 函数,还是操作 Amazon S3 存储桶、Amazon DynamoDB 数据库等,boto3 都提供了相应的接口。它极大地简化了亚马逊云科技资源的管理和开发,是进行亚马逊云科技云端开发的利器。

Streamlit

Streamlit 则是一个用 Python 构建的开源框架,旨在让数据科学家以最简单、最高效的方式创建丰富的数据应用程序和交互式数据产品。它支持多种数据类型和数据源的渲染,如 DataFrame、图像、视频等,并允许用户以 Python 脚本的形式编写界面逻辑。Streamlit 的响应式布局、缓存机制等特性使其构建可视化分析和数据产品的体验非常流畅。

总的来说,boto3 帮助我们高效操作亚马逊云科技资源,而 Streamlit 则为构建数据应用提供了极佳的支持。两者结合将大大加快我们的开发效率。

关键代码解析

bedrock_runtime = boto3.client(
    service_name='bedrock-runtime',
    region_name=REGION,
)


model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'


response = bedrock_runtime.invoke_model(
    body=body, modelId=model_id)
response_body = json.loads(response.get('body').read())

通过 boto3 我们可以轻松创建 bedrock-runtime 的客户端,然后通过这个客户端的 invoke_model 来调用 Claude 模型。其中 modelId 就是 Claude 3 的模型。

接下来对 request 中需要传入的 body 进行代码展示:

message = {"role": "user",
           "content": [
               {"type": "text", "text": input_text}
           ]}
if not has_history():
    message["content"].append({"type": "image",
                               "source": {"type": "base64",
                                          "media_type": "image/jpeg",
                                          "data": content_image}})


messages = []


# Get History Messages
if has_history():
    messages.extend(get_chat_history())
messages.append(message)


system_input = """
You are Claude, an AI assistant created by Anthropic to be helpful,harmless, and honest. 
Your goal is to provide informative and substantive responses to queries while avoiding potential harms.
You should answer the questions in the same language with user input text.
"""


body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": max_tokens,
        "system": system_input,
        "messages": messages
    }
)

body 中有 4 个关键参数:

  •  anthropic_version 目前只能填写 bedrock-2023-05-31 ,未来随着模型的迭代应该会有更多可选参数。

  •  max_tokens 是 tokens 最大值的限制,这里是指 input 和 output 的累加值。在新的 Message API 中,每次消耗的 input tokens 和 output tokens 都会在返回值中明确给出。

  •  system 是用来设定 Claude 的“人设”,我们在这里需要设置一些符合我们输出预期的风格,告诉模型即将处理的任务目标,这样可以提高模型针对特定领域问题回答的精度。

  •  messages 是一个包含了角色(role)、信息类型(type)和值(source 或 text)的一个 json 字段。在这个 json 字段中,我们可以提交多个图片和一段文本信息。图片由 base 编码的字符串作为数据传入,目前支持 jpg、png、gif 和 webp 四种格式。历史的聊天记录也会存储在这个字段里面。

在这个样例代码中,我使用了 st.session 来存储会话的上下文信息。

def save_chat_history_message(history: list):
    st.session_state['history'] = history




def has_history():
    return 'history' in st.session_state




def show_chat_history():
    if 'history' not in st.session_state:
        return
    for msg in st.session_state['history']:
        if 'content' not in msg:
            continue
        if type(msg['content']) is list:
            for item in msg['content']:
                if item['type'] == "text":
                    st.chat_message(name=msg['role']).write(item['text'])
                elif item['type'] == "image":
                    continue
        else:
            st.chat_message(name=msg['role']).write(msg['content'])




def get_chat_history():
    if not has_history():
        return []
    return st.session_state['history']




def clear_chat_history_message():
    if 'history' in st.session_state:
        del st.session_state['history']

而历史的聊天记录,我们则需要插入到用户的输入信息中。历史记录将插入到 messages 中。

# Get History Messages
if has_history():
    messages.extend(get_chat_history())

由于 streamlit 每次都是根据代码的顺序去重新渲染界面的,所以我们还需要每次问答的文本记录起来,并且在下一次渲染界面的时候全部重绘。所以 show_chat_history() 这个函数会在每次获得文本输出后,先调用一次。

def show_chat_history():
    if 'history' not in st.session_state:
        return
    for msg in st.session_state['history']:
        if 'input' in msg:
            st.chat_message(name='user').write(msg['input'])
        if 'output' in msg:
            st.chat_message(name='ai').write(msg['output'])

运行测试

运行代码前准备好 python 环境,我测试的是 python3.11 版本,理论上其他版本应该也能运行。

安装依赖包

pip install boto3 streamlit

完整代码

以下是完整代码,新建一个 app.py 的文件。复制粘贴全部代码到 app.py 中。其中 region 字段可以根据实际情况进行配置,这里选择的是 us-west-2 ,需要配置成您在 Amazon Bedrock 中实际开通模型访问的区域。

import base64
import json
import logging


import boto3
import streamlit as st
from botocore.exceptions import ClientError


logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)


st.sidebar.title("Building with Bedrock")  # Title of the application
st.sidebar.subheader("Q&A for the uploaded image")


REGION = "us-west-2"




def save_chat_history_message(history: list):
    st.session_state['history'] = history




def has_history():
    return 'history' in st.session_state




def show_chat_history():
    if 'history' not in st.session_state:
        return
    for msg in st.session_state['history']:
        if 'content' not in msg:
            continue
        if type(msg['content']) is list:
            for item in msg['content']:
                if item['type'] == "text":
                    st.chat_message(name=msg['role']).write(item['text'])
                elif item['type'] == "image":
                    continue
        else:
            st.chat_message(name=msg['role']).write(msg['content'])




def get_chat_history():
    if not has_history():
        return []
    return st.session_state['history']




def clear_chat_history_message():
    if 'history' in st.session_state:
        del st.session_state['history']




def run_multi_modal_prompt(bedrock_runtime, model_id, messages, max_tokens):
    """
    Invokes a model with a multimodal prompt.
    Args:
        bedrock_runtime: The Amazon Bedrock boto3 client.
        model_id (str): The model ID to use.
        messages (JSON): The messages to send to the model.
        max_tokens (int): The maximum  number of tokens to generate.
    Returns:
        None.
    """


    system_input = """
    You are Claude, an AI assistant created by Anthropic to be helpful,harmless, and honest. 
    Your goal is to provide informative and substantive responses to queries while avoiding potential harms.
    You should answer the questions in the same language with user input text.
    """


    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": max_tokens,
            "system": system_input,
            "messages": messages
        }
    )


    response = bedrock_runtime.invoke_model(
        body=body, modelId=model_id)
    response_body = json.loads(response.get('body').read())


    return response_body




def main():
    """
    Entrypoint for Anthropic Claude multimodal prompt example.
    """


    try:


        bedrock_runtime = boto3.client(
            service_name='bedrock-runtime',
            region_name=REGION,
        )


        model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'
        max_tokens = 4096
        st.sidebar.header("What image would you like to analyst?")
        uploaded_file = st.sidebar.file_uploader("Upload an image",
                                                 type=['jpg', 'jpeg', 'png', 'gif', 'webp'],
                                                 on_change=clear_chat_history_message)
        content_image = None
        if uploaded_file:
            st.sidebar.image(uploaded_file)
            content_image = base64.b64encode(uploaded_file.read()).decode('utf8')


        # Read reference image from file and encode as base64 strings.


        input_text = st.chat_input(placeholder="What do you want to know?")
        if content_image:
            if input_text:
                show_chat_history()
                st.chat_message(name='user').write(input_text)
                message = {"role": "user",
                           "content": [
                               {"type": "text", "text": input_text}
                           ]}
                if not has_history():
                    message["content"].append({"type": "image",
                                               "source": {"type": "base64",
                                                          "media_type": "image/jpeg",
                                                          "data": content_image}})


                messages = []


                # Get History Messages
                if has_history():
                    messages.extend(get_chat_history())
                messages.append(message)
                with st.spinner('I am thinking about this...'):
                    response = run_multi_modal_prompt(bedrock_runtime, model_id, messages, max_tokens)


                st.chat_message(name='assistant').write(response.get("content")[0].get("text"))
                messages.append({
                    "role": "assistant",
                    "content": response.get("content")[0].get("text")
                })
                save_chat_history_message(messages)
                logger.debug(json.dumps(response, indent=4))


    except ClientError as err:
        message = err.response["Error"]["Message"]
        logger.error("A client error occurred: %s", message)




if __name__ == "__main__":
    main()

运行

在命令行模式下,使用 streamlit run app.py 来运行。

d029a2bd19124aabbe60d73bcb003d83.jpeg

应用会在本地启动一个 8501 端口,并且自动在浏览器中打开应用。

界面中,侧边栏包含一个可以上传图片的组件,右边则是一个聊天窗口。

测试

初体验——看图计算

c224ac3bde2980c495c8eca20ffa59fc.png

我们上传一张描述三角形的图片,并输入 计算它的面积 ,让大语言模型计算它的面积。

dac83462a13d86ab59e6819a69260285.png

我们可以看到 Claude 3 已经识别到这是一个三角形,并且准确的获取来三角形的“底”和“高”,并通过面积公式来计算出了这个三角形的面积。

再体验——上下文记忆

我们输入 假设它的高是 4cm 呢? ,看看应用是否能够获取上下文并理解当前设定。依然能正确给出答案。

bacb12878e9ebaa5d73719263bd1c17f.png

我们看到了答案,结果依然计算正确,说明这个应用能够正确理解上下文。虽然在第二个问题中,我们并没有明确说是计算面积,但是通过上图的回答,依然可以获得我们想要的答案。

总结

在 Claude 3 支持的多模态场景下,我们尝试了让模型去理解一个数学问题,并根据图片内容计算相关结果。除此之外,Claude 3 在归因、文本理解、多语言等方面相对 Claude 2 都有大幅度的性能提升。您可以根据本文提供的样例代码,构建您自己专属的 AI Bot。甚至您还可以尝试使用 Agents for Amazon Bedrock 来整合工作流,以构建更加专注于某个领域的智能体。

参考链接

  • Anthropic Claude Messages API – Amazon Bedrock

    https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

  • streamlit.io

    https://streamlit.io/

  • AgentsforBedrockRuntime – Boto3 1.34.58 documentation

    https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-agent-runtime.html

  • 使用 IAM 用户凭证进行身份验证

    https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-authentication-user.html

您仍然可以继续领略 Amazon Bedrock 上包括 Mistral, llama2 等领先的基础模型的魅力,对于 Amazon Bedrock 上的 Claude 3 模型,如果您的业务有出海需求,可以由您的海外关联公司在海外访问亚马逊云科技海外区域提供的相关模型,感受先进技术带来的无限可能,感谢您的支持与理解!

本篇作者

187430168eb2e793195cb0663634685b.jpeg

林业

亚马逊云科技资深解决方案架构师,负责基于亚马逊云科技的云计算方案的咨询与架构设计。拥有超过 14 年研发经验,曾打造千万级用户 APP,多项 Github 开源项目贡献者。在游戏、IoT、智慧城市、汽车、电商等多个领域都拥有丰富的实践经验。

aa7d29c9628b5906e7ea630c32a49218.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

b186d734b39fb30d68411f1f5430ada8.gif

听说,点完下面4个按钮

就不会碰到bug了!

cb291fba290b3a2da0c97cb26cfb0b9b.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker-镜像仓库

Docker ⛅Docker-Registry🌠分类🌠镜像仓库工作机制🌠常用的镜像仓库🌠镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout 🌠镜像命令[部分]☃️docker images☃️docke…

突破边界:Web3开启数字化社会的新纪元

引言 随着科技的不断进步和数字化社会的发展,Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态,Web3具有突破传统边界、实现去中心化的特点,被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景&#xf…

如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf?

如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf? 步骤1 编译安装内核获取源码修改配置编译编译成功后配置重启WSL测试 步骤2 安装bcc安装依赖下载bcc,编译测试 环境: wsl2windows 11 步骤1 编译安装内核 去https://kernel.org/找你想要的版本, …

Spark-Scala语言实战(4)

在之前的文章中,我们学习了如何在scala中定义无参,带参以及匿名函数。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言…

用css滤镜做颜色不同的数据卡片(背景图对于css滤镜的使用)

<template> <div class"xx_modal_maincon"><div class"xx_model_bt">履约起始日至计算日配额及履约情况</div><el-row><el-col :span"6"><div class"xx_modal_mod"><div class"mod…

asp.net在线租车平台

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net在线租车平台 用户功能有首页 行业新闻用户注册车辆查询租车介绍访问后台 后台管理员可以进行用户管理 管…

第七届强网杯-PWN-【simpleinterpreter】

对于一个刚入门的三个月的菜鸡pwn手打算按照难度慢慢复现qwb的题目 先simpleinterpreter吧 simpleinterpreter libc 2.27 逆向 解释器相关用到的陌生函数 法1 方法1参考链接 程序实现了一个 C 语言解释器,可用的关键字如下: char else enum if int return sizeof whi…

NVIDIA 推出地球-2云平台,使用AI超级计算机的模拟技术,预测整个地球的气候变化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

视频无水印批量下载软件|抖音视频提取工具

视频无水印批量下载软件 在当今社交媒体充斥着大量优质视频内容的时代&#xff0c;很多用户都希望能够轻松下载自己喜爱的视频进行收藏或分享。为了满足用户的需求&#xff0c;我们特别推出了一款专业的视频无水印批量下载软件&#xff0c;让您可以方便快捷地获取喜爱的视频内容…

[C++]20:unorderedset和unorderedmap结构和封装。

unorderedset和unorderedmap结构和封装 一.哈希表&#xff1a;1.直接定址法&#xff1a;2.闭散列的开放定址法&#xff1a;1.基本结构&#xff1a;2.insert3.find4.erase5.补充&#xff1a;6.pair<k,v> k的数据类型&#xff1a; 3.开散列的拉链法/哈希桶&#xff1a;1.基…

Jackson 2.x 系列【3】解析器 JsonParser

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 解析原理3. 案例演示3.1 创建 JsonParser3.2 解析3.3 读取3.4 测试 1. 前…

流畅的 Python 第二版(GPT 重译)(三)

第五章&#xff1a;数据类构建器 数据类就像孩子一样。它们作为一个起点是可以的&#xff0c;但要作为一个成熟的对象参与&#xff0c;它们需要承担一些责任。 马丁福勒和肯特贝克 Python 提供了几种构建简单类的方法&#xff0c;这些类只是一组字段&#xff0c;几乎没有额外功…

隐私计算实训营学习一:数据可信流通,从运维信任到技术信任

文章目录 一、数据可信流通二、数据可信流通的技术信任基础三、技术信任开启数据密态时代&#xff0c;保障广域数据可信流通 一、数据可信流通 可信数据流通体系&#xff1a;数据二十条第一次明确提出可信流通&#xff0c;建立数据来源可确认、使用范围可界定、流通过程可追溯…

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

智慧公园:AI智能分析网关V4城市公园视频智能监管方案

一、背景分析 随着天气渐渐转暖&#xff0c;城市公园的花卉也逐渐盛开&#xff0c;春暖花开时节&#xff0c;前往公园赏花游玩的城市居民也渐渐多起来&#xff0c;因此安全问题也成为相关监管部门的重要管理任务之一。随着科技的不断进步&#xff0c;智能监控技术已经成为现代…

使用paho.mqtt.client实现MQTT Client连接EMQX Broker

目录 概述 1 认识paho.mqtt.client 2 实现MQTT Client 2.1 功能介绍 2.2 paho.mqtt.client库函数介绍 2.3 MQTT Client实现 2.3.1 创建项目 2.3.2 编写MQTT Client代码 2.3.3 Log工具源码 2.4 功能测试代码实现 2.4.1 功能介绍 2.4.2 代码实现 3 测试 3.1 EMQX上创…

回归预测 | Matlab基于SAO-LSTM雪消融算法优化长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-LSTM雪消融算法优化长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-LSTM雪消融算法优化长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-LSTM雪消融…

课时70:流程控制_for循环_嵌套循环

2.4.4 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

[STM32] Keil MDK 新建工程编译不通过(warning: #2803-D和Error: L6218E)解决方法备忘

按照野火的PDF教程的第4章&#xff1a;[野火]《RT-Thread 内核实现与应用开发实战—基于STM32》.pdf 新建 Keil MDK 工程&#xff0c;工程设置完成后点击编译按钮&#xff0c;编译不通过&#xff1a; RTE\Device\ARMCM3\startup_ARMCM3.c(75): warning: #2803-D: unrecognize…

nodejs社区垃圾分类管理平台的设计与实现python-flask-django-php

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 语言&#xf…