如何使用ChatGPT自动化AWS任务:与S3存储桶互动的示例

本教程将向您展示如何使用ChatGPT函数来执行与Amazon S3存储桶相关的任务的示例。这篇教程涵盖了S3存储桶的关键功能,包括运行简单的列出命令、在所有存储桶中搜索特定文件、将文件上传到存储桶以及从存储桶下载文件。OpenAI Chat API可以理解用户的指令,生成自然语言响应,并根据用户输入提取适当的函数调用。

先决条件

在开始之前,请确保您具备以下条件:

  1. 生成一个具有S3存储桶写入权限的AWS访问密钥,并将它们存储在与OpenAI密钥一起的本地环境文件中。环境文件的格式如下:
AWS_ACCESS_KEY_ID=<您的密钥>
AWS_SECRET_ACCESS_KEY=<您的密钥>
OPENAI_API_KEY=<您的密钥>
  1. 安装所需的Python模块。您可以使用以下命令来安装它们:
!pip install openai boto3 tenacity python-dotenv

代码示例

以下是使用ChatGPT和AWS S3存储桶互动的示例代码。

import openai
import json
import boto3
import os
import datetime
from urllib.request import urlretrieve
from dotenv import load_dotenv

# 从.env文件加载环境变量
load_dotenv()

# 设置OpenAI API密钥
openai.api_key = os.environ.get("OPENAI_API_KEY")
GPT_MODEL = "gpt-3.5-turbo"

# 创建S3客户端
s3_client = boto3.client('s3')

# 定义函数字典,以便为GPT模型提供S3操作的详细信息
functions = [
    # 列出所有可用的S3存储桶
    {
        "name": "list_buckets",
        "description": "列出所有可用的S3存储桶",
        "parameters": {
            "type": "object",
            "properties": {}
        }
    },
    # 列出给定S3存储桶内的对象或文件
    {
        "name": "list_objects",
        "description": "列出给定S3存储桶内的对象或文件",
        "parameters": {
            "type": "object",
            "properties": {
                "bucket": {"type": "string", "description": "S3存储桶的名称"},
                "prefix": {"type": "string", "description": "S3存储桶中的文件夹路径"},
            },
            "required": ["bucket"],
        },
    },
    # 从S3存储桶中下载特定文件到本地目标文件夹
    {
        "name": "download_file",
        "description": "从S3存储桶中下载特定文件到本地目标文件夹",
        "parameters": {
            "type": "object",
            "properties": {
                "bucket": {"type": "string", "description": "S3存储桶的名称"},
                "key": {"type": "string", "description": "S3存储桶中文件的路径"},
                "directory": {"type": "string", "description": "本地目标目录,由用户指定。"},
            },
            "required": ["bucket", "key", "directory"],
        }
    },
    # 将文件上传到S3存储桶
    {
        "name": "upload_file",
        "description": "将文件上传到S3存储桶",
        "parameters": {
            "type": "object",
            "properties": {
                "source": {"type": "string", "description": "本地源文件路径或远程URL"},
                "bucket": {"type": "string", "description": "S3存储桶的名称"},
                "key": {"type": "string", "description": "S3存储桶中文件的路径"},
                "is_remote_url": {"type": "boolean", "description": "提供的源是否为URL(True)还是本地路径(False)"},
            },
            "required": ["source", "bucket", "key", "is_remote_url"],
        }
    },
    # 在S3存储桶内搜索特定文件名
    {
        "name": "search_s3_objects",
        "description": "在S3存储桶内搜索特定文件名",
        "parameters": {
            "type": "object",
            "properties": {
                "search_name": {"type": "string", "description": "要搜索的文件名"},
                "bucket": {"type": "string", "description": "S3存储桶的名称"},
                "prefix": {"type": "string", "description": "S3存储桶中的文件夹路径"},
                "exact_match": {"type": "boolean", "description": "如果搜索应匹配完整文件名,请将exact_match设置为True。将exact_match设置为False以比较文件名字符串的一部分(文件包含)"}
            },
            "required": ["search_name"],
        },
    }
]

# 创建用于将S3操作与函数连接的辅助函数

def datetime_converter(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")

def list_buckets():
    response = s3_client.list_buckets()
    return json.dumps(response['Buckets'], default=datetime_converter)

def list_objects(bucket, prefix=''):
    response = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix)
    return json.dumps(response.get('Contents', []), default=datetime_converter)

def download_file(bucket, key, directory):

    filename = os.path.basename(key)

    # 解析目标,得到正确的文件路径
    destination = os.path.join(directory, filename)

    s3_client.download_file(bucket, key, destination)
    return json.dumps({"status": "success", "bucket": bucket, "key": key, "destination": destination})

def upload_file(source, bucket, key, is_remote_url=False):
    if is_remote_url:
        file_name = os.path.basename(source)
        urlretrieve(source, file_name)
        source = file_name

    s3

_client.upload_file(source, bucket, key)
    return json.dumps({"status": "success", "source": source, "bucket": bucket, "key": key})

def search_s3_objects(search_name, bucket=None, prefix='', exact_match=True):
    search_name = search_name.lower()

    if bucket is None:
        buckets_response = json.loads(list_buckets())
        buckets = [bucket_info["Name"] for bucket_info in buckets_response]
    else:
        buckets = [bucket]

    results = []

    for bucket_name in buckets:
        objects_response = json.loads(list_objects(bucket_name, prefix))
        if exact_match:
            bucket_results = [obj for obj in objects_response if search_name == obj['Key'].lower()]
        else:
            bucket_results = [obj for obj in objects_response if search_name in obj['Key'].lower()]

        if bucket_results:
            results.extend([{"Bucket": bucket_name, "Object": obj} for obj in bucket_results])

    return json.dumps(results)

# 连接名称和函数以供执行
available_functions = {
    "list_buckets": list_buckets,
    "list_objects": list_objects,
    "download_file": download_file,
    "upload_file": upload_file,
    "search_s3_objects": search_s3_objects
}

# ChatGPT函数调用
def chat_completion_request(messages, functions=None, function_call='auto', 
                            model_name=GPT_MODEL):

    if functions is not None:
        return openai.ChatCompletion.create(
            model=model_name,
            messages=messages,
            functions=functions,
            function_call=function_call)
    else:
        return openai.ChatCompletion.create(
            model=model_name,
            messages=messages)

# 主要对话函数
def run_conversation(user_input, topic="S3 bucket functions.", is_log=False):

    system_message=f"不要假设要插入函数的值。如果用户请求不明确,请请求澄清。如果用户要求与{topic}无关的问题,请告诉他您的范围是{topic}。"

    messages = [{"role": "system", "content": system_message},
                {"role": "user", "content": user_input}]

    # 调用模型以获取响应
    response = chat_completion_request(messages, functions=functions)
    response_message = response['choices'][0]['message']

    if is_log:
        print(response['choices'])

    # 检查GPT是否想要调用函数
    if response_message.get("function_call"):
        function_name = response_message['function_call']['name']
        function_args = json.loads(response_message['function_call']['arguments'])

        # 调用函数
        function_response = available_functions[function_name](**function_args)

        # 将响应添加到对话中
        messages.append(response_message)
        messages.append({
            "role": "function",
            "name": function_name,
            "content": function_response,
        })

        # 再次调用模型以总结结果
        second_response = chat_completion_request(messages)
        final_message = second_response['choices'][0]['message']['content']
    else:
        final_message = response_message['content']

    return final_message

# 测试S3存储桶助手
# 列出和搜索
print(run_conversation('列出我的S3存储桶'))

search_file = '<文件名>'
print(run_conversation(f'在所有存储桶中搜索文件{search_file}'))

search_word = '<文件名部分>'
bucket_name = '<存储桶名称>'
print(run_conversation(f'在{bucket_name}中搜索包含{search_word}的文件'))

# 检查模型是否会拒绝无关的任务
print(run_conversation('今天天气如何'))

# 下载文件
search_file = '<文件名>'
bucket_name = '<存储桶名称>'
local_directory = '<本地目录路径>'
print(run_conversation(f'从{bucket_name}存储桶中下载{search_file}到{local_directory}目录'))

# 上传文件
local_file = '<文件名>'
bucket_name = '<存储桶名称>'
print(run_conversation(f'将{local_file}上传到{bucket_name}存储桶'))

结论

通过本教程,您已经学会了如何使用ChatGPT自动化AWS S3存储桶任务。这个互动的示例展示了如何连接ChatGPT的自然语言处理能力和AWS S3存储桶的功能,以执行列出、搜索、下载和上传文件等操作。这种自动化可以节省大量时间,提高工作效率。

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:如何使用ChatGPT自动化AWS任务:与S3存储桶互动的示例

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年10月14日
下一篇 2023年10月14日

相关推荐

  • ChatGPT的超级使用者:拥有4大关键特质的人才

    ChatGPT的超级使用者:拥有4大关键特质的人才 引言 在当今信息时代,ChatGPT等自然语言处理工具已成为无可争议的现象级工具。然而,要想真正发挥其超级价值,需要具备一系列优秀特质。本文将探讨这些特质,并为您解…

    2023年9月9日
    00
  • 了解全新Bing Chat:与ChatGPT的对比

    曾经,Bing只是一款备受争议的搜索引擎,往往被谷歌所遮盖。但是,事情发生了变化。微软将大量资金投入Bing,并将其赋能了生成式人工智能。今天,我们将揭开Bing Chat的神秘面纱,看看它与ChatGPT的差异和优势。 如…

    2023年9月28日
    00
  • OpenAI估值破千亿:AI领域新巨头崛起

    在科技界的风起云涌中,人工智能一直是一个令人激动的话题。最近,有关OpenAI的新闻再次引起了业界的广泛关注。据彭博社报道,这家人工智能研究公司正进行一轮新的融资,其估值可能达到惊人的1000亿美元。这一数字…

    2023年12月27日
    00
  • ChatGPT免费版本永存:OpenAI副总裁Peter Deng的表态

    你是否曾经遇到过在寻找解答时,遇到了一个无法言语的障碍?或是在工作中遇到了无法解决的难题?OpenAI的ChatGPT,这个智能聊天机器人,正是诞生出来为了解决这些问题。随着技术的不断进步,ChatGPT已经成为我们生…

    2024年3月12日
    00
  • HelpLook:你的一站式帮助中心与知识库建设工具

    你是否曾经在工作中遇到文档管理混乱、知识孤立的问题?是否常常为了寻找产品手册、FAQ或重要文档而感到困惑?现代工作中,如何提供全方位的支持与帮助,解决这些问题成为了一个重要的挑战。今天,我将向你介绍一款…

    2023年10月6日
    00
  • ChatGPT发送消息没有响应问题解决办法

    最近使用ChatGPT的时候总会有发送消息没有响应,关闭浏览器修改DNS之后也没有什么用,最终排查发现是打开了ChatGPT的中文alpha测试的原因。所以,清空浏览器cookies之后,重新登陆ChatGPT,不要加入alpha测试就可以…

    2024年3月12日
    00
  • 如何使用Selenium自动化浏览器操作获取网页数据

    在当今互联网时代,网页上的数据是我们获取信息和进行各种任务的关键。有时候,我们需要自动化地进行浏览器操作,以获取网页上的数据,而这正是Selenium库的用武之地。在这篇教程中,我们将学习如何使用Selenium来…

    2023年10月16日
    00
  • ChatGPT CPU占用问题曝光:用户CPU资源被”挖矿”?

    最近,不少笔记本用户纷纷注意到一个令人困扰的问题:每次打开 ChatGPT 时,风扇会疯狂转动,CPU资源被大量占用,导致电脑卡顿不堪。这个问题不仅在Windows和Mac平台上出现,连使用ChatGPT网页版的iPhone和安卓用户…

    2023年12月5日
    00
  • 为什么人工智能代码生成器在处理新的算法问题时表现较差?

    本文探讨了人工智能代码生成器,特别是OpenAI的ChatGPT在编写代码方面的表现。我们将分析其在不同编程语言和任务难度上的成功率,并深入研究其在处理新算法问题时的局限性。通过了解这些局限性,开发人员可以更好地…

    2024年7月8日
    00
  • ChatGPT及其众多追随者:2023年AI热点突破

    在2023年,人工智能领域迎来了令人瞩目的突破,其中ChatGPT及其众多追随者成为了焦点。根据CNBC和Writerbuddy的最新研究数据,仅OpenAI的ChatGPT在2022年9月至2023年8月之间的访问量已经达到了惊人的140亿次,这标…

    2023年12月26日
    00