当前位置: 首页 > news >正文

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

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'] = historydef has_history():return 'history' in st.session_statedef show_chat_history():if 'history' not in st.session_state:returnfor msg in st.session_state['history']:if 'content' not in msg:continueif 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":continueelse: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:returnfor 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 loggingimport boto3
import streamlit as st
from botocore.exceptions import ClientErrorlogger = 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'] = historydef has_history():return 'history' in st.session_statedef show_chat_history():if 'history' not in st.session_state:returnfor msg in st.session_state['history']:if 'content' not in msg:continueif 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":continueelse: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_bodydef 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 = 4096st.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 = Noneif 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 Messagesif 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

相关文章:

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

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

Golang基础 Label标签与goto跳转

使用方法 Label 和goto是必须的 Label可以声明再函数体的任何地方 Label的作用范围是在函数体中 Label在嵌套函数(闭包)是不可用的. 不管是在闭包里调用闭包外的Label, 还是在闭包外调用闭包里的Label 变量的声明必须在goto之前 示例 package mainimport "fmt"…...

二进制王国(蓝桥杯备赛)【sort/cmp的灵活应用】

二进制王国 题目链接 https://www.lanqiao.cn/problems/17035/learning/?contest_id177 题目描述 思路 这里就要灵活理解字典序排列,虽然string内置可以直接比较字符串字典序,但是在拼接时比较特殊,比如 11的字典序小于110,但…...

活用C语言之宏定义应用大全

零、C语言宏定义知多少 C语言的编程过程中经常会用到宏定义,然而如果你只是使用宏定义做一些常量的定义,那么你不是OUT了就是C语言小白。 那么我们在编程过程中,宏定义都有哪些作用呢? 常量定义 可以作为功能代码的开关 防止头文件被重复…...

【源码】I.MX6ULL移植OpenCV

编译完成的源码: git clone https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.下载源码放在自己的opecv源码目录下 2.QTOpenCV工程代码放置的位置 3.更改.pro工程文件的opencv地址 4.使用命令行编译 前提是自己环境中已经配置好arm-qt的交叉编译…...

pytorch深度学习——dataset(附数据集下载)

在学习深度学习的时候,我们需要考虑如何去处理数据去训练我们的模型,pytorch为我们提供了Dataset和DataLoader两个类来对数据进行处理,前者作用是提供了一种方式来获取数据及其label,后者的作用是为网络提供不同的数据形式。本文主…...

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统,采用M(model)V(view)C(controller)三层体系结构&…...

自动驾驶建图--道路边缘生成方案探讨

自动驾驶建图–道路边缘生成方案探讨 一、背景 对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。 对于建图来说,…...

图片编辑器中实现文件上传的三种方式和二进制流及文件头校验文件类型

背景 最近在 vue-design-editor 开源项目中实现 psd 等多种文件格式上传解析成模板过程中, 发现搞定设计文件上传没有使用 input 实现文件上传, 所以我研究了一下相关技术, 总结了以下三种文件上传方法 input 文件选择window.showOpenFilePicker 和 window.showDirectoryPicke…...

深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?

深度学习在OCR领域的应用已经取得了瞩目的成果,而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中,CRNN和Attention OCR犹如两颗璀璨的明珠,备受瞩目。 CRNN,这位结合了卷积神经网络(CNN)和…...

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见: 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨,就可以用飞桨进行推理了。刚开始计划用ONNX推理,但是在算能云没有装上,所以最…...

在MongoDB建模1对N关系的基本方法

“我在 SQL 和规范化数据库方面拥有丰富的经验,但我只是 MongoDB 的初学者。如何建立一对 N 关系模型?” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案,因为方法不只有一种,还有…...

C++基础之运算符重载(十一)

首先为什么要对运算符进行重载&#xff1f;因为C内置的运算符只能作用于一些基本数据类型&#xff0c;而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。 运算符重载的三种形式 1.以普通的函数进行重载 #include <…...

初始Java篇(JavaSE基础语法)(2)(逻辑控制)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …...

家用路由器和企业路由器的区别?

一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口&#xff0c;WAN口接公网一个地址&#xff0c;LAN口接你电脑一个IP地址&#xff0c;完全符合路由器的设计&#xff0c;而因为家里如果用了&#xff0c;说明要接多个电脑&#xff0c;那么如果还需要对每个接口…...

Gin简介(Go web基础知识)

Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的&#xff0c;就是做个笔记&#xff0c;仅分享。膜拜极客兔兔大佬 Go特性&#xff1a; 快速&#xff1a;路由不使用反射&#xff0c;基于Radix树&#xff0c;内存占用少。 中间件&#xff1a;HT…...

HBase的Bulk Load流程

目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles&#xff08;也称为Bulk Load&#xff09;是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…...

vue中图片替换 遇到问题

问题&#xff1a; 在img标签里动态绑定路径&#xff1a;<img v-bind:src"imgSrc" /> data里这样写是错误的&#xff1a;imgSrc:xx/xx.png 这样渲染的路径会有问题&#xff0c;导致出不来图片 解决了 是这样的 data(){return(){imgSrc:require("../…...

Android 观察者模式

在Android中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…...

阿里云部署MySQL、Redis、RocketMQ、Nacos集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能&#xff08;ESSD&#xff09; 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...