作者的图片
在这次博客里,我们将探讨亚马逊Bedrock的新特性,重点介绍Converse API及其与Anthropic Claude 3的工具使用。这些更新让开发者能够更轻松地创建动态且用户友好的AI互动。利用Converse API,管理多轮对话变得简单且一致。此外,调用工具或函数的能力意味着模型能够访问外部数据,从而提供更准确和有用的回复。
对话API vs 调用API我知道这挺复杂的,我来帮帮你的。
亚马逊Bedrock(Bedrock)推出新的Converse API - 了解更多有关亚马逊AWS的最新消息aws.amazon.com5月30日,亚马逊Bedrock推出了新的Converse API,提供了一种统一的方法,让开发人员能够调用亚马逊Bedrock模型并管理多轮对话。此API通过消除了需要针对特定模型进行调整的需求,并启用结构化的对话历史记录,简化了流程。此外,它支持选定模型中的工具使用(功能调用),允许开发人员访问外部工具和API,从而扩展应用程序的功能。
要使用Converse API,您需要使用这些Amazon Bedrock模型。
支持 Converse API 的模型有 — 参考:使用 Converse API 的方法,Amazon Bedrock 文档中的相关内容
我们先深入了解一下API本身,这部分的价值就体现在那里。为了方便举例说明,这里我不会使用流式API,但请注意,模型调用和Converse API都支持答案流式传输。以下所有示例都将基于Anthropic Claude 3 Haiku。
首先,我们来看看针对Anthropic Claude 3模型的经典API调用。这里是你需要这样写(使用boto3
,不使用Converse API)的。
# 使用原生推断 API 向 Anthropic Claude 发送文本消息。
import boto3
import json
from botocore.exceptions import ClientError
# 在您选择的 AWS 区域以创建一个 Bedrock Runtime 客户端。
client = boto3.client("bedrock-runtime", region_name="us-east-1")
# 指定模型 ID,例如,Claude 3 Haiku。
model_id = "anthropic.claude-3-haiku-20240307-v1:0"
# 定义模型使用的提示。
prompt = "用一句话描述 'hello world' 程序的目的。"
# 使用模型的原生格式格式化请求负载。
native_request = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 512,
"temperature": 0.5,
"messages": [
{
"role": "user",
"content": [{"type": "text", "text": prompt}],
}
],
}
# 将原生请求转换为 JSON 格式。
request = json.dumps(native_request)
try:
# 使用请求调用模型。
response = client.invoke_model(modelId=model_id, body=request)
except (ClientError, Exception) as e:
print(f"错误:无法调用模型 '{model_id}'。原因:{e}")
exit(1)
# 解析响应正文。
model_response = json.loads(response["body"].read())
# 提取并打印响应中的文本。
response_text = model_response["content"][0]["text"]
print(response_text)
现在,我们来看看这次用Converse API调用该模型的场景:
# 使用Conversation API向Anthropic的Claude发送一条文本消息。
import boto3
from botocore.exceptions import ClientError
# 在您想要使用的AWS区域中创建Bedrock Runtime客户端。
client = boto3.client("bedrock-runtime", region_name="us-east-1")
# 设置模型ID,例如 'Claude 3 Haiku'。
model_id = "anthropic.claude-3-haiku-20240307-v1:0"
# 使用用户消息开始对话。
user_message = "用一句话描述'hello world'程序的目的。"
conversation = [
{
"role": "user",
"content": [{"text": user_message}],
}
]
try:
# 使用基本推理配置将消息发送到模型。
response = client.converse(
modelId=model_id,
messages=conversation,
inferenceConfig={"maxTokens": 512, "temperature": 0.5, "topP": 0.9},
)
# 提取并打印响应中的文本。
response_text = response["output"]["message"]["content"][0]["text"]
print(response_text)
except (ClientError, Exception) as e:
print(f"错误:无法调用 '{model_id}'。原因:{e}")
# 退出程序并返回错误代码1。
exit(1)
你可能会想问:“这里到底有什么不同呢?”这确实是个合理的问题,因为最初看,似乎没什么变化。不过,仔细一瞧,就能发现几个重要的不同之处。
- 一致性和简化 — Converse API 提供了一个与所有支持消息的模型一致的接口,将参数移出对话内容本身。这意味着你不必担心根据每个模型的原生格式来构建请求负载,从而简化了你的代码并减少了潜在的错误。
- 消息处理 — 在 Converse API 中,消息的处理方式模仿了自然对话的流程,使交互更加直观,符合典型的对话式AI使用场景。
- 推理配置 — 在 Converse API 中,推理配置(如
maxTokens
和temperature
)作为单独的参数,使对话负载更加干净和易读。
通过使用Converse API,你可以获得更流畅和一致的与模型互动的方式,这可以显著提升你的开发体验,并使代码库更易于维护。
工具使用 / 调用函数Converse API调用示例流程 — 作者提供
Amazon Bedrock工具使用(功能调用)您可以使用Amazon Bedrock API让模型访问工具,这些工具可以帮助生成回复。
切换到Converse API的一个好处是,可以使用工具来回答请求,也称为功能调用。在使用Amazon Bedrock模型时,加入工具可以显著提高模型生成准确且上下文相关回答的能力。功能调用涉及定义模型在推理过程中可以请求使用的工具。让我们通过Converse API来探索一下这个过程。
步骤1:发送消息及工具定义滞留 — 图片来自作者
首先,使用 JSON 架构定义工具,并将该工具与用户的请求一起传递到 Converse API 请求中。例如,一个获取广播电台最热门歌曲的工具可以定义如下:
{
"tools": [
{
"toolSpec": {
"name": "top_song",
"description": "获取某广播电台播放的最热门歌曲。",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"sign": {
"type": "string",
"description": "广播电台的呼号,例如WZPZ或KPOP。"
}
},
"required": ["sign"]
}
}
}
}
]
}
用户的留言也被包含在内。
[
{
"role": "角色",
"content": [{ "text": "哪首歌在Radio XYZ上最受欢迎?"}]
}
]
接下来:获取模型的工具请求
智能LLM,作者的图片
收到请求后,模型会判断是否需要用到工具来生成响应。如果需要,它会返回一个响应,说明需要工具,并附上所需输入参数。
步骤 3.:让工具为模型发出请求作者供图:工具使用不过是输入和输出之间的交易。
使用提供的工具信息,运行这个工具请求。生成实际结果的关键环节在于结果反馈回LLM生成答案之前。在这个阶段,你应该实现自己的业务逻辑。这个工具可以是:
- 本地代码执行(比如运行计算器)
- 调用一个 API(比如获取一些信息)
- 一个外部的服务
然后,将结果通过后续消息反馈给模型。注意,这条消息需要设置为由用户发送(即设置为 "role": "user"
)。
{
"role": "user",
"content": [
{
"toolResult": {
"toolUseId": "工具使用ID",
"content": [
{
"json": {
"song": "Never Gonna Give You Up", // 《永不放弃你》, 艾瑞克·拉斯利的歌曲
"artist": "Rick Astley" // 艾瑞克·拉斯利
}
}
]
}
}
]
}
第 4 步:得到模型的回复
最后,模型利用工具的结果生成对最初的查询的全面答案。是的,你可能在2024年中了rickroll的招。rickrolled(rickroll是指一个经典的网络恶作剧,通常会播放老歌《Never Gonna Give You Up》)。
代码例子下面是使用Converse API(Converse API)的工具使用示例。
import boto3
import json
from botocore.exceptions import ClientError
client = boto3.client("bedrock-runtime", region_name="us-east-1")
model_id = "anthropic.claude-3-haiku-20240307-v1:0"
def get_top_song(sign: str):
# 获取热门歌曲
return {
"title": "Never Gonna Give You Up",
"author": "Rick Astley",
"played_times": 420
}
tool_config = {
"tools": [
{
"toolSpec": {
"name": "top_song",
"description": "获取某个电台播放次数最多的热门歌曲。",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"sign": {
"type": "string",
"description": "电台的呼号。"
}
},
"required": ["sign"]
}
}
}
}
]
}
messages = [
{
"role": "user",
"content": [{"text": "Radio XYZ 上播放次数最多的歌曲是什么?"}]
}
]
try:
response = client.converse(modelId=model_id, messages=messages, toolConfig=tool_config)
tool_request = response['output']['message']['content'][0]['toolUse']
##### 在此实现你的工具逻辑 #####
tool_result = get_top_song(tool_request['input']['sign'])
##########################################
tool_result_message = {
"role": "user",
"content": [
{
"toolResult": {
"toolUseId": tool_request['toolUseId'],
"content": [{"json": tool_result}]
}
}
]
}
final_response = client.converse(modelId=model_id, messages=[tool_result_message])
print(final_response['output']['message']['content'][0]['text'])
except ClientError as e:
print(f"错误: {e}")
此代码可以在AWS Lambda函数中非常轻松且成本低廉地运行,甚至在本地PC上运行,只要你已经正确配置了AWS凭证。
通过按照这些步骤操作,您可以将相关工具有效地集成到与Amazon Bedrock模型的互动中,从而获得更动态和准确的实时响应。
结论部分恭喜,(作者提供图片)
通过使用Converse API和工具集成,开发人员可以借助Amazon Bedrock和Anthropic Claude 3将他们的AI应用程序提升到一个新的层次。这些功能不仅简化了开发过程,还增强了模型的能力,使其更加准确和情境感知,从而实现了更准确和情境感知的交互。通过采用这些创新,您将能够构建更复杂、更用户友好的AI解决方案。更多详细信息请参阅Amazon Bedrock的用户指南。
感谢你阅读这篇 Medium 博客文章。如果你喜欢生成式 AI 应用程序开发、低代码/无代码的机器学习以及一般的技术新闻和资讯,请你感兴趣的话,可以关注我并通过电子邮件订阅新博客。欢迎通过我的 LinkedIn 联系我,提出新的主题或合作想法!
共同学习,写下你的评论
评论加载中...
作者其他优质文章