AI 驱动的开发者(MEAP)(一)(2)

简介: AI 驱动的开发者(MEAP)(一)

AI 驱动的开发者(MEAP)(一)(1)https://developer.aliyun.com/article/1516309

2.3 让 Copilot 掌控!

现在让我们使用 GitHub Copilot 来解决 Asset 类的创建问题。附录 B 中有关于如何创建账户并将插件安装到你喜爱的 IDE 中的说明(假设你喜欢的 IDE 是 VS Code 或 PyCharm 中的一个)。安装完成后,你应该在你喜欢的 IDE 中创建一个新项目。首先,创建一个名为 asset.py 的新文件。这个类将保存 Asset 类的源代码。当你输入构造函数时,Copilot 将给出代码建议。你可能会得到类似于图 2.9 中源代码的代码。或者,你可以通过按下 Ctrl+Enter 来激活交互模式,Copilot 将基于当前上下文生成多达十个建议。

注意

在本书的大部分内容中,我们将主要使用内联模式,在该模式下,你可以使用 Tab 键来接受给定的建议。

虽然 Copilot 的第一次尝试令人钦佩,但它并不像我们感兴趣的类定义;我们想要一个 ITAM 系统资产,而不是一个通用的资产实现。就像我们在 ChatGPT 中所做的那样,我们将创建一个提示,来告诉 Copilot 我们的意图,给它提供额外的上下文和信息,以便它生成代码建议。在 Copilot 中输入提示非常简单,只需在源代码文件的开头添加注释。我们将告诉 Copilot 类的名称应该是什么,以及它应该具有什么属性。

清单 2.17 GitHub Copilot 的起始提示要求其创建名为 Asset 的新类
# Create a class named Asset
# Add the following attributes: id, asset_type, manufacturer, model, purchase_date, purchase_price, warranty_end_date, location, and status. 
# The class should have a function named get_details that returns a string that is the concatenation of all attributes.
# The class should have a function named to_dict that returns a dictionary of all attributes.

当您开始定义构造函数时,Copilot 将返回一个完整的代码建议,用于 ITAM 系统资产。 如果我们将 ChatGPT 生成的代码与 Copilot 生成的结果代码进行并排比较,我们会注意到它们非常相似。

图 2.9 根据我们添加到文件顶部的注释,Copilot 能够生成一个构造函数,其中包含提示中包含的所有属性。

接下来,添加 get_detailsto_dict 方法。 JSONResponse 类接受一个字典并将其转换为 JSON。 to_dict 方法将有助于简化此交接。 get_details 方法在调试过程中会很有用,使我们能够查看类的内容。

清单 2.18 Copilot 根据我们的请求生成的代码
# Create a class named Asset
# Add the following attributes: id, asset_type, manufacturer, model, purchase_date, purchase_price, warranty_end_date, location, and status. 
# The class should have a function named get_details that returns a string that is the concatenation of all attributes.
# The class should have a function named to_dict that returns a dictionary of all attributes.
class Asset:
    def __init__(self):
        self.id = None
        self.asset_type = None
        self.manufacturer = None
        self.model = None
        self.purchase_date = None
        self.purchase_price = None
        self.warranty_end_date = None
        self.location = None
        self.status = None
    def get_details(self):
        return f"{self.id}, {self.asset_type}, {self.manufacturer}, {self.model}, {self.purchase_date}, {self.purchase_price}, {self.warranty_end_date}, {self.location}, {self.status}"
    def to_dict(self): 
        return {
            "id": self.id,
            "asset_type": self.asset_type,
            "manufacturer": self.manufacturer,
            "model": self.model,
            "purchase_date": self.purchase_date,
            "purchase_price": self.purchase_price,
            "warranty_end_date": self.warranty_end_date,
            "location": self.location,
            "status": self.status
        }

现在我们有了资产类。 我们将继续 AssetManager 类。 我们将从一个基本提示开始,告诉 Copilot 创建 AssetManager 类并定义一些基本功能。

清单 2.19 让 Copilot 生成我们的 AssetManager 的提示
# Create a class called AssetManager that will allow us to store and retrieve assets.

在定义完类之后不久,您会注意到 Copilot 将建议为此管理器提供完整的源代码。

图 2.10 带有最少说明,Copilot 能够创建一个允许存储和检索资产的 AssetManager。

Copilot 的 AssetManager 源代码将与 ChatGPT 生成的代码非常相似。

清单 2.20 由 Copilot 从我们的初始提示生成的 AssetManager 完整源代码
# Create a class called AssetManager that will allow us to store and retrieve assets.
class AssetManager:
    def __init__(self):
        self.assets = []
    def add_asset(self, asset):
        self. Assets.append(asset)
    def get_assets(self):
        return self. assets
    def get_asset(self, asset_id):
        for asset in self.assets:
            if asset.id == asset_id:
                return asset
        return None
    def update_asset(self, asset_id, asset):
        for index, asset in enumerate(self.assets):
            if asset.id == asset_id:
                self.assets[index] = asset
                return True
        return False
    def delete_asset(self, asset_id):
        for index, asset in enumerate(self.assets):
            if asset.id == asset_id:
                del self.assets[index]
                return True
        return False

接下来,我们将组装 FastAPI 应用程序以运行和显示资产。 我们将从 app.py 类的开头开始。

清单 2.21 启动提示,让 Copilot 构建我们的 FastAPI 应用程序
# Create a FastAPI app that allows CRUD operations on the Asset class.
图 2.11 Copilot 开始自动导入所需的库。

Copilot 将添加导入语句。 在定义 FastAPI 应用程序之后发生了一些有趣的事情:Copilot 将尝试定义 Asset 类。 封装和保护内部模型是一个好习惯,这就是 Asset 类。

图 2.12 Copilot 尝试定义基于 pydantic 的 Asset 类。 但是,我们已经定义了一个 Asset 类,它代表了我们的“内部”类的模型。 因此,我们拒绝了这个建议。

为了保护我们的内部模型,因此,我们将拒绝 ChatGPT 提供给我们的建议。相反,我们将创建两个类:AssetIn 和 AssetOut。 Copilot 生成的代码与 ChatGPT 提供给我们的解决方案非常相似。一旦我们键入 AssetIn,Copilot 将会帮助我们创建剩下的类,因为它已经猜到我们想要做什么。

图 2.13 Copilot 已确定我们不想直接暴露我们的内部模型,并创建一个类来表示我们尚未定义的 POST REST 端点的输入负载。

当我们继续定义我们的 FastAPI 应用程序中的方法时,Copilot 将预测方法的实现。

图 2.14 在 Copilot 生成了所有方法的实现后,文件 app.py 的最终内容。

最后,我们将让 Copilot 为我们创建一个 requirements.txt 文件。我们从列表 2.22 的提示开始。然后,当我们开始列举库的版本号时,Copilot 将添加版本号。

列表 2.22 此项目的 requirements.txt 文件
# generate a requirements.txt file for this project
fastapi==0.63.0
uvicorn==0.13.4
pydantic==1.7.3
starlette==0.13.6

使用以下命令启动应用程序:uvicorn app:app --reload。通过列表 2.23 中的 curl 命令创建一个新的资产。

列表 2.23 用于向我们的 Copilot 应用程序添加新资产的 curl 命令
curl -X POST -H "Content-Type: application/json" -d '{"id": "12345", "asset_type": "Laptop," "manufacturer": "Dell", "model": "Latitude 5400", "purchase_date": "2022-01-01", "warrenty_expiration": "2023-01-01", "location": "New York", "status": "Available", "purchase_price": "1000.00"}' http://localhost:8000/assets/

打开你的浏览器访问 http://localhost:8000/assets/ 通过 REST 控制器展示新的资产。

图 2.15 我们使用 POST 端点创建了一个单独的资产对象。这通过 GET 端点显示。

在本节中,我们开始了一个软件开发的比较之旅,使用了两种不同的生成性 AI 工具 - ChatGPT 和 GitHub Copilot,这两种工具都应用于相同的 IT 资产管理(ITAM)项目中。 ChatGPT 在我们的开发方式中提供了显著的灵活性,甚至使我们能够切换框架,尽管有些谨慎。它作为一位宝贵的顾问,提供建议和指导。

与此同时,我们与 Copilot 的经验需要采用不同的方法。我们使用提示来指示 Copilot 生成代码,这要求我们从一开始就对预期的实现有清晰的愿景。

接下来,我们计划引入 AWS CodeWhisperer 到混合中,为这个探索性练习增加另一层。最后,我们将对比这三个工具 - ChatGPT、Copilot 和 AWS CodeWhisperer。目标仍然是了解它们各自的独特优势和局限性,以及根据软件开发项目的需求和环境如何最佳地使用每个工具。

总的来说,通过我们对这些 AI 助力工具的实践经验,我们深入探讨了 AI 在软件开发领域的变革潜力。无论是 ChatGPT、Copilot 还是即将推出的 AWS CodeWhisperer,每个工具都在这一领域带来了独特的东西,承诺了一个更高效、更流畅的软件开发流程。然而,最大化它们的好处的关键在于我们不断适应和学习,充分利用每个工具的同时注意它们的局限性。

2.4 让 CodeWhisperer 大声说话

在我们开始使用 CodeWhisperer 之前,我们应该禁用 Copilot。单击扩展表并搜索 Copilot。一旦找到它,点击 Disable 按钮。你需要重新启动应用程序。一旦应用程序重新启动,你就可以开始使用 CodeWhisperer 了。如果你需要帮助安装或配置 CodeWhisperer,你应该参考附录 C。一旦插件安装完成并且你已经登录到你的开发者账户中,你应该创建一个名为 asset.py 的文件。

图 2.16 在我们切换到 CodeWhisperer 之前,我们必须禁用 Copilot。我们在扩展选项卡中禁用该扩展。

我们将使用与 Copilot 相同的提示。这里为了方便重新打印。

列表 2.24 让 CodeWhisperer 为我们创建 Asset 类的提示
# Create a class named Asset
# Add the following attributes: id, asset_type, manufacturer, model, purchase_date, purchase_price, warranty_end_date, location, and status. 
# The class should have a function named get_details that returns a string that is the concatenation of all attributes.
# The class should have a function named to_dict that returns a dictionary of all attributes.

一旦我们输入了这个提示并编写了类定义,CodeWhisperer 将开始编写构造函数。

图 2.17 根据我们在文件开头输入的提示,CodeWhisperer 建议了一个构造函数。

然后,我们继续编写方法定义,CodeWhisperer 将忠实地生成实现。

列表 2.25 CodeWhisperer 生成的完整代码
# Create a class named Asset
# Add the following attributes: id, asset_type, manufacturer, model, purchase_date, purchase_price, warranty_end_date, location, and status.
# The class should have a function named get_details that returns a string which is the concatenation of all attributes.
# The class should have a function named to_dict that returns a dictionary of all attributes.
class Asset():
    def __init__(self, id, asset_type, manufacturer, model, purchase_date, purchase_price, warranty_end_date, location, status):
        self.id = id
        self.asset_type = asset_type
        self.manufacturer = manufacturer
        self.model = model
        self.purchase_date = purchase_date
        self.purchase_price = purchase_price
        self.warranty_end_date = warranty_end_date
        self.location = location
        self.status = status
    def get_details(self):
        return f"{self.id}, {self.asset_type}, {self.manufacturer}, {self.model}, {self.purchase_date}, {self.purchase_price}, {self.warranty_end_date}, {self.location}, {self.status}"
    def to_dict(self):
        return {"id": self.id, "asset_type": self.asset_type, "manufacturer": self.manufacturer, "model": self.model, "purchase_date": self.purchase_date, "purchase_price": self.purchase_price, "warranty_end_date": self.warranty_end_date, "location": self.location, "status": self.status}

最终的代码应该类似于 Copilot 创建的代码。非常相似。基于此,我们将跳过项目中的其他文件的编写。完成项目将留给一个有动力的读者。

在这一部分,我们将 AWS CodeWhisperer 引入了其中。像它的前辈一样,CodeWhisperer 能够生成项目的关键组件,强化了 AI 在软件开发领域的变革潜力。

鉴于这些工具生成的代码之间惊人的相似性,一个引人入胜的问题自然而然地出现:这些产品到底如何真正比较?对于这个问题的答案并不像人们想象的那样直截了当,因为每个工具具有独特的优势和局限性。

在接下来的部分中,我们将深入探讨这个问题,比较这三种工具 - ChatGPT、Copilot 和 AWS CodeWhisperer - 以便了解它们的独特优势、最佳使用案例,以及它们可能如何重塑软件开发的未来。我们的目标是提供一份全面的指南,帮助软件开发人员在这个快速发展的 AI 驱动工具领域中找到方向。

2.5 比较 ChatGPT、Copilot 和 CodeWhisperer

我们要考虑的第一个维度是参与模型:我们如何与 AI 互动。就 ChatGPT 而言,我们登录聊天网站并将提示输入到聊天输入框中。然后,我们在后续提示中完善我们的需求。反馈循环从先前的提示中提取上下文,将其应用于当前提示,并生成输出,用户对其作出反应并重新发出。如果我们将这种参与模型与 Copilot 和 CodeWhisperer 的模型进行对比,我们会注意到后两种工具是在集成开发环境中工作的。我们不能在 IDE 外部使用它;尽管我们努力,但这种方法并不是本质上劣质的,它只是不同。

Copilot 和 CodeWhisperer 让你保持在你的集成开发环境中可能被视为一种优势而不是不足之处。在即将推出的 Copilot X 版本中,你将获得两全其美:ChatGPT 和 GPT 4.0 都在你的集成开发环境中。这些工具让你在没有干扰的情况下更长时间地保持在你的代码中。无干扰地工作是提高生产力的关键之一。Copilot 和 CodeWhisperer 擅长让你专注于工作;让你不必切换上下文;让你远离干扰;让你更长时间地保持在工作状态中。它们做得很好。你与 ChatGPT 进行对话;Copilot 和 CodeWhisperer 给你建议。对话会花费更长时间来完成;建议则快速且免费。

接下来,我们将检查代码是如何呈现和生成的。ChatGPT 可以将代码创建为块、方法、类或项目。如果需要,ChatGPT 会有意识地逐步展示项目。但 ChatGPT 实际上在幕后创建了项目。毕竟,ChatGPT 喜欢交谈。对于 Copilot 和 CodeWhisperer,代码一次性展开一个方法,至少最初是这样的。随着使用的增加,你会注意到它们可以为给定类编写越来越多的代码。但遗憾的是,它们无法通过一个小提示编写整个项目。

它们都共享的一个特性是它们能够响应提示。对于 ChatGPT,提示是唯一与工具互动的方式。对于 Copilot 和 CodeWhisperer,响应提示并不是严格必要的,但编写这些提示将使输出更接近你最初的想法。

综合考虑这些因素,我们可能得出 ChatGPT 是进行探索和原型开发的最佳选择。然而,ChatGPT 可能会引起不必要的分心,部分原因是因为你离开了你的集成开发环境(IDE),现在进入到了一个带有所有浏览器相关诱惑的网页浏览器中。ChatGPT 本身就是引入不必要干扰的一部分。你最终会掉进那个寓言中的兔子洞里。这个工具使事情变得过于容易,而不是相反。不要被这吓到。它是一个很棒的资源。

Copilot 和 CodeWhisperer 要求你有一个预期结果。因此,这些工具非常适合在你希望完成具备精确要求和紧密期限的编码任务时使用。当你熟悉语言和框架时,Copilot 和 CodeWhisperer 效果最佳。它们可以自动化很多枯燥的工作,让你专注于能够增加价值的业务需求,这很可能是你编写软件的原因。

下表简要总结了这三种人工智能的利与弊:

图 2.18 ChatGPT、Copilot 和 CodeWhisperer 的正负比较。

在本章中,我们经历了很多,多次重复编写相同的代码。然而,编写 ITAM 系统相同子节的三个版本为我们提供了合适使用 ChatGPT 而不是使用其他以 IDE 为重点的工具(如 Copilot 和 CodeWhisperer)的时机打下了基础。在随后的章节中,我们将利用这些知识,选择最合适的工具。

最后要注意的是,这些工具在它们一起使用时效果最佳。ChatGPT 是一个很好的示例和结构工具。Copilot 和 CodeWhisperer 为您提供了扩展和自定义代码的能力。这使得即将发布的 Copilot X 版本非常令人兴奋:它是这两种方法的结合。

2.6 小结

  • 信息技术资产管理(ITAM)系统是一种用于管理和跟踪硬件设备、软件许可证和其他与信息技术相关的组件的工具。这些系统允许公司控制成本、管理供应商关系,并确保许可和合规性。
  • 在本章中,我们通过在这三个工具中编写相同的代码,探索了使用 ChatGPT、GitHub Copilot 和 AWS CodeWhisperer 的方式。编写相同的代码三次允许我们比较它们的特点,并对使用方式的差异进行对比和对照:如何以及何时使用每个工具。
  • ChatGPT 是一个基于提示的生成式人工智能,与用户进行对话,帮助他们探索想法,以协助设计和开发整个项目。此外,ChatGPT 精巧地为其编写的每种方法生成文档。我们之所以开始使用它来开始本章,是因为它帮助定义了我们在本章剩余部分中使用的模板之一。这是一个迷人的产品,可以导致不必要但令人愉快的分心。
  • Copilot 和 CodeWhisperer 是头脑风暴式的工具,在您知道要做什么并需要一些关于如何最好地完成的建议时效果最佳。与这些工具的互动方式非常相似,结果也是如此。
  • 我们撰写本文时,ChatGPT 不支持在集成开发环境中进行开发。然而,与 GitHub Copilot 和 AWS CodeWhisperer 不同,它可以生成整个项目,并轻松将代码从一种编程语言转换为另一种。GitHub Copilot 和 AWS CodeWhisperer 从您的注释中获取提示,推断出您想要编写的代码。而在 ChatGPT 中,您需要明确编写提示,ChatGPT 将使用这些提示来创建代码。

第三章:使用 ChatGPT 设计软件

本章涵盖

  • 使用 ChatGPT 进行潜在设计原型
  • 在 Mermaid 中记录我们的架构
  • 完成我们的设计与 ChatGPT

现在我们已经对何时使用生成式人工智能有了直觉,我们将开始设计、探索和记录我们应用程序的架构。预先布置一些关键组件在几个方面都是有益的。例如,它使我们能够将一些设计工作委派给子架构师或将一些开发工作交给其他团队成员。提前设计还将有助于我们澄清我们对实施的思考,使我们能够预见并避免一些陷阱。最后,将设计记录为文档使我们能够证明我们的重要设计决策,向我们未来的自己、利益相关者以及可能继承该项目的人传达我们的意图。

首先,让我们询问 ChatGPT 关于如何最好地设计这个项目,并看看它能提出什么解决方案。

3.1 请求 ChatGPT 协助我们进行系统设计

在一个新的会话中,我们将从一个提示开始,概述我们的需求。鉴于我们在上一章节大部分时间都在思考我们的需求,我们应该能够构建一个复杂的提示,并且应该对所需内容有很好的了解。或者,我们可以请求 ChatGPT 提供这样一个系统的需求。然后,我们可以将这些需求纳入我们的提示中,并根据需要进行编辑。

毫无疑问,你已经遇到了无数篇声称展示正确的提示工程方法的文章。提示工程,或者是设计和优化初始输入或“提示”以获得所需输出的做法,是我们与大型语言模型互动的重要组成部分。我们在本书中所做的大部分工作都将被视为提示链接、生成知识提示和零-shot 推理。这些主要是学术上的说法,即我们将与生成式人工智能工具进行对话。重要的要点是,与任何对话一样,当你需要一个具体的答案时,你要问一个具体的问题。或者你要求生成式人工智能逐步思考问题,并尽可能具体。因此,我们将向 ChatGPT 提供一个非常具体的提示,以正式化需求收集过程。

列表 3.1 包含我们系统需求的提示
Please take the following criteria for an information technology asset management system and create a Python project that satisfies them: 
Asset Inventory: The system should be able to maintain a complete inventory of all hardware and software assets owned by an organization. 
Asset Tracking: The system should be able to track asset location, status, and usage. This includes information such as who uses the asset, when it was last serviced, and when it is due for replacement. 
Asset Lifecycle Management: The system should be able to manage the entire lifecycle of an asset, from procurement to disposal. This includes tracking warranty and lease information, managing asset maintenance and repair, and ensuring compliance with regulations. 
Asset Allocation: The system should be able to allocate assets to employees or departments, track usage, and manage reservations for assets that are in high demand. 
Asset Reporting: The system should be able to generate reports on asset utilization, availability, and maintenance history. Reports should be customizable and easy to understand. 
Integration: The system should be able to integrate with other IT systems, such as procurement, help desk, and financial systems, to ensure consistency and accuracy of data. Security: The system should have robust security features to protect sensitive information about assets, including user authentication, role-based access control, and data encryption. 
Scalability: The system should be scalable to accommodate changes in the organization's IT infrastructure, including new hardware and software assets, as well as changes in the number of users and departments. 
User-Friendly Interface: The system should have a user-friendly interface that is easy to navigate, search, and use. It should also be customizable to meet the needs of individual users and departments. 
Accessibility: The system should be accessible from different devices and locations, including mobile devices and remote areas. It should also be accessible to users with disabilities.

经过一番思考,ChatGPT 将返回开发此项目所需的高层步骤。哦,我们在开玩笑,它几乎立即就能生成这些步骤。这些建议很有帮助,但我们想要解决空白文件的问题:我们想要开始设计。我们需要散文和图表来帮助我们理解组件级别的系统。我们需要任务而不是配方。我们应该要求 ChatGPT 展示它的工作过程。

列表 3.2 要求 ChatGPT 展示其工作的提示
Please show the package structure

在这个提示下,ChatGPT 将生成并返回一个包图(这个列表略有删节),演示它不仅可以设计软件,还可以帮助我们布置物理文件。我们可能对整体的包结构有异议(或者也可能没有),但这将为我们提供足够的灵感来开始。

列表 3.3 ChatGPT 创建的资产管理系统的包结构
asset_management_system/
├── app/
│   ├── __init__.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── asset.py
│   │   ├── user.py
│   │   └── ...
│   ├── auth/
│   │   ├── __init__.py
│   │   ├── login.py
│   │   ├── register.py
│   │   └── ...
│   ├── models/
│   │   ├── __init__.py
│   │   ├── asset.py
│   │   ├── user.py
│   │   └── ...
│   ├── views/
│   │   ├── __init__.py
│   │   ├── asset.py
│   │   ├── user.py
│   │   └── ...
├── requirements.txt
└── run.py

我们可以审查宏观情况,也可以要求 ChatGPT 提供微观情况。我们可以创建提示,让 ChatGPT 按顺序显示每个文件的内容。我们可以将内容认真地复制到一个与 ChatGPT 建议的文件名相同的文件中。然而,我们始终要仔细检查 ChatGPT 的工作,不过,我们不应假设它是 100%安全或准确的。我们偶尔会发现 ChatGPT 生成的代码无法工作。与我们不同,ChatGPT 的重点是生成下一个标记,而不是思考系统。话虽如此,我们应该快速查看它生成的代码,以评估质量并确定其有用性。

列表 3.4 要求 ChatGPT 展示其(详细的)工作的提示
please show the source code for asset_management_system/models/asset.py

ChatGPT 将返回此类的源代码。它使用 Flask 和 SQLAlchemy,因此域模型有点混乱。下次,我们应该要求它使用我们首选的应用服务器,并保持域模型的清晰。这些对我们来说也是额外的数据点。现在我们知道了我们不想要的东西。

列表 3.5 资产管理系统中 asset_management_system/models/asset.py 的示例源代码:
from datetime import datetime
from asset_management_system import db
class Asset(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    description = db.Column(db.String(255))
    category = db.Column(db.String(80))
    purchase_date = db.Column(db.DateTime, default=datetime.utcnow)
    purchase_cost = db.Column(db.Float)
    warranty_expiry = db.Column(db.Date)
    lease_expiry = db.Column(db.Date)
    status = db.Column(db.String(80), default="Available")
    location = db.Column(db.String(80), default="IT Department")
    assigned_to = db.Column(db.String(80))
    assigned_date = db.Column(db.DateTime)
    retired_date = db.Column(db.DateTime)
    created_date = db.Column(db.DateTime, default=datetime.utcnow)
    updated_date = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    def __repr__(self):
        return '<Asset %r>' % self.name

现在我们对 ChatGPT 如何解决问题有了一定了解,让我们听听第二种意见。为此,我们将探索现有的项目和库。我们还将使用 ChatGPT 进行此项调查。

3.2 审视全局情况

如果我们以前从未使用过或见过信息技术资产管理(ITAM)系统,我们会想了解它是什么,它应该做什么,以及如何实现这样一个系统。正如我们在上一章中所经历的,ChatGPT 非常适合这项任务。当问题空间和已知条件明确时,GitHub Copilot 和 CodeWhisperer 是出色的工具,当你准备进行高效编码时,这些工具非常有用。另一方面,ChatGPT 可以用来探索这个问题空间,进行交互式原型设计,并设计和记录您的解决方案。探索问题空间的一个很好的第一步是检查当前的开源项目。我们可以使用这些“开箱即用”的项目或利用它们的设计来激发我们的灵感。使用 ChatGPT,我们可以快速浏览开源世界,并聚焦于可能与我们试图构建的内容类似的项目。我们可以从列表 3.1 中开始。

列表 3.6 查找 ITAM 项目的提示
What are some examples of ITAM projects or products?

ChatGPT 回复了几个示例,总结了它们的核心特点。然而,由于我们正在寻找开发项目的灵感,我们应该开始将此列表精简到仅包含代码可用的项目;也就是说,哪些是开源项目?

图 3.1 ChatGPT 展示了 ITAM 特性和几个拥有这些特性的产品和项目的属性列表。

接下来,我们将开始精简过程。鉴于进行这种分析和探索当前 ITAM 系统的目的是我们可以看到软件中需要哪些特性以及我们如何实现这些特性,我们只想返回源代码可用的项目。因此,让我们只获取开源项目的列表。

寻找开源 ITAM 项目的提示
Are any of these products open-source?

ChatGPT 最令人兴奋和有用的功能之一是它可以延续上下文;它理解在这个上下文中,“任何”意味着前面提到的任何项目。ChatGPT 回复了一个开源项目列表。

图 3.2 ChatGPT 返回了一个开源 ITAM 项目的列表。

我们将继续精简过程。我们打算用 Python 来实现我们的系统,因此我们只对具有 Python 作为与系统交互手段的项目感兴趣。

寻找用 Python 编写的 ITAM 项目的提示
Are any of these written in Python?

根据我们的提示,ChatGPT 将会将这个列表精简到只有用 Python 编写的项目。它返回了五个项目。我们将评估每个项目,并确定我们应该进一步探索哪一个。

图 3.3 ChatGPT 告诉我们有四个具有 Python 组件的开源项目。

在这个列表中,Ralph 似乎是最有前途的。Snipe-IT 和 Open-AudIT 是用 PHP 编写的,具有我们可以与之交互的基于 Python 的 API;然而,我们希望一个用 Python 编写的项目。NetBox 不是 ITAM 而是 IP 地址管理(IPAM)系统。最后,CMDBuild 是用 Java 编写的。我们希望用 Python 构建一个 IT 资产管理系统。因此,Ralph 似乎是最符合我们用例的选择。

在现实世界中

如果我们必须在现实世界中实施 ITAM 系统,我们将评估每个产品(商业和开源)在不同用例下的适用程度。例如,如果 Ralph 能够满足大多数或所有这些用例,我们将简单地搭建一个新实例;或者在商业产品的情况下,我们将获取许可证。我们将执行这个分析,因为我们得到的是为企业创造价值的报酬,而不是编写代码。如果我们可以拿来即用,那么我们很快就能创造价值,可能比我们自己开发它还要快。

现在我们已经发现了一个与我们要构建的项目相似的项目(一个子集),我们可以开始探索它,审查它的设计,并检查它的源代码。我们将从这个源代码和设计中汲取灵感,大胆借鉴,并在必要时进行更改。让我们首先来了解系统的概述。

3.3 探索一个库

首先,我们将要求 ChatGPT 描述 Ralph 的整体结构。这个结构可能会在我们开发架构时给我们启发。或者,它可能会提醒我们如何不要组织我们的代码。

列表 3.9 查找开源项目 Ralph 结构的提示
Please describe the modules of Ralph. 

ChatGPT 将返回 Ralph 的高级模块列表。值得注意的一点是,在撰写本文时,ChatGPT 将以 2021 年的 Ralph 设计返回。ChatGPT 的训练数据截止日期(根据 ChatGPT 本身)是 2021 年 9 月。因此,2021 年 9 月后对设计的任何后续更改都不会在 ChatGPT 中显示。未来,当 GPT 有了互联网访问和扩展功能时,所有这些都将发生改变。但是,目前,我们必须接受这一限制。

图 3.4 ChatGPT 解释了 Ralph 开源项目的高级模块布局

资产和库存模块似乎是一个很好的开始地方。接下来,我们将要求 ChatGPT 分别呈现每个模块的美人鱼图。让我们首先从资产开始。

列表 3.10 在 Ralph 的资产模块中查找类的提示
Please show me a class diagram in Mermaid for all classes in the Asset module. 
美人鱼

美人鱼是由 Knut Sveidqvist 发明的现代、开源、简化的图表定义语言。它于 2015 年发布。它允许用户创建各种图表,包括流程图、序列、类、甘特图等。由于它是基于文本的,因此很容易复制粘贴到设计工具中。它的语法非常易于阅读和理解,几乎不需要正式培训(与 UML 等不同)。

ChatGPT 将返回一个美人鱼文档,概述类、它们的属性和它们的关系。首先,让我们来看一下这个美人鱼文档中的类定义。列表 3.11 的第一行指示美人鱼我们正在定义一个类图类型,而不是它支持的其他类型。第二行表示类(在本例中为资产)。接下来的行列举了类的字段。减号表示它是一个私有属性。倒数第二行是公共方法的定义。我们知道它是公共的;加号表示一个公共方法。

列表 3.11 资产类定义
classDiagram
    class Asset {
        - name: string
        - status: string
        - model: Model
        - category: Category
        - manufacturer: Manufacturer
        - sn: string
        - barcode: string
        - price: decimal
        - purchase_date: date
        - order_no: string
        - delivery_date: date
        - invoice_date: date
        - invoice_no: string
        - provider: Provider
        - budget_info: BudgetInfo
        - warehouse: Warehouse
        - owner: User
        - location: Location
        - asset_info: AssetInfo[]
        - attachments: Attachment[]
        + get_name(): string
    }

接下来,我们将看看如何在美人鱼中定义关系。箭头的双短线表示单向关联。在以下示例中,一个资产有一个型号。此外,资产有一个类别。

列表 3.12 在美人鱼文档中的关系定义
Asset --> Model
    Asset --> Category

使用完整的 Mermaid 图,我们可以使用建模工具导入和可视化类图。以这种方式可视化将更容易理解。毕竟,众所周知,一幅(图表)胜过千言万语。您应该能够将文本插入 mermaid.live 生成并可视化图表。

图 3.5 使用 Mermaid 类图可视化的资产类的可视化。

Mermaid 在表现力和简洁性之间取得了适当的平衡,使其成为一种理想的建模语言,无论您是否时间紧迫。但你的实际情况可能有所不同。

接下来,让我们把注意力转向库存模块。我们可以要求 ChatGPT 生成一个类似于先前请求的资产图的文档。我们将跳到此文档的可视化部分。

图 3.6 使用 Mermaid 类图可视化的库存包的可视化。

库存模块的可视化澄清了库存模块在 Ralph 项目中的重要性,但对我们构建以硬件为重点的 ITAM 来说是多余的。我们感兴趣的是追踪我们的全部资产,整个服务器;我们不一定对每张视频卡或每个内存模块进行追踪:只对整个服务器感兴趣。因此,我们将这个模块放在一边。

接下来,我们将深入研究资产类,因为这似乎是资产模块的根源。让我们让 ChatGPT 展示这个类。

列表 3.13 提示,让 ChatGPT 显示资产类的源代码的用法
Please show me the source code for the Asset class.

ChatGPT 将返回资产类的源代码。为简洁起见,我们不会显示导入语句。此外,我们只检查此代码块中的几行。很明显,这个类有很多特定于 Django 的代码,例如,model 属性从数据库中查找模型对象。category 也是如此。

让 ChatGPT 继续

有时,ChatGPT 会在中途或中途停止输出。这是 ChatGPT 设计中内置的输出限制所致。看起来你无法通过告诉 ChatGPT 忽略这个限制(对于某些系统约束,你可以这样做)来克服这个限制。但是,你可以告诉它“继续”或“继续”。它会恢复输出并从中断的地方继续输出。如果它在代码块内停止,则应指定它应该在哪里恢复输出。

列表 3.14 简化版的资产类源代码
class Asset(TransitionModelMixin, NamedMixin, AdminAbsoluteUrlMixin, models.Model):
    """
    A hardware or software asset
    """
    name = models.CharField(max_length=255, unique=True)
    status = models.CharField(choices=STATUS_CHOICES, default=STATUS_NEW, max_length=50)
    model = models.ForeignKey(
        'assets.AssetModel',
        verbose_name=_('model'),
        related_name='assets',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
    )
    category = models.ForeignKey(
        'assets.Category',
        verbose_name=_('category'),
        related_name='assets',
        on_delete=models.PROTECT,
    )

我们不想在项目中使用 Django。我们希望我们的应用程序以 API 为先,而不需要 Django 提供的额外功能。此外,我们更希望一个干净的领域模型。Django 非常有主见,建议您修改领域模型类以继承自 Django 基类。基类定义了领域模型类与数据库进行持久化交互的方式。我们更愿意自己处理持久化。因此,让我们请求 ChatGPT 彻底删除项目中的 Django。

列表 3.15 提示 ChatGPT 删除 Django 并返回 Asset 类代码。
Take the open-source Ralph project, remove Django, and show me the source code for the Asset class.

ChatGPT 生成的输出将更加简洁。下面是缩写后用于与 Django 定义进行比较的结果。以下列表仅显示构造函数,其他类细节现在不相关。

列表 3.16 没有 Django 特定功能的 Asset 类源代码
class Asset:
    def __init__(self, name, status, model, category, manufacturer, sn=None, barcode=None, price=None, purchase_date=None, order_no=None, delivery_date=None, invoice_date=None, invoice_no=None, provider=None, budget_info=None, warehouse=None, owner=None, location=None, asset_info=None, attachments=None):
        self.name = name
        self.status = status
        self.model = model
        self.category = category
        self.manufacturer = manufacturer
        self.sn = sn
        self.barcode = barcode
        self.price = price
        self.purchase_date = purchase_date
        self.order_no = order_no
        self.delivery_date = delivery_date
        self.invoice_date = invoice_date
        self.invoice_no = invoice_no
        self.provider = provider
        self.budget_info = budget_info
        self.warehouse = warehouse
        self.owner = owner
        self.location = location
        self.asset_info = asset_info or []
        self.attachments = attachments or []

如果我们要求 ChatGPT 重新创建 Mermaid 类图,我们不会注意到任何变化。我们不会看到任何变化,因为 Django 特定的功能已封装在类中。

图 3.7 Asset 类的更新后 Mermaid 类图。该类与之前的版本没有变化

AI 驱动的开发者(MEAP)(一)(3)https://developer.aliyun.com/article/1516312

相关文章
|
4天前
|
人工智能 Python Shell
CodeFormer——AI驱动的面部图像修复与增强
CodeFormer是由南洋理工大学和商汤科技联合研发的AI人脸复原模型,结合VQGAN和Transformer技术,能从模糊或马赛克图像中生成清晰图像。它具备老照片修复、黑白照片彩色化、马赛克修复和低码率视频增强等功能。安装过程涉及miniconda3、Python环境配置、相关库的安装及模型训练数据下载。在测试视频增强时,虽然初期遇到ffmpeg导入问题,但通过安装ffmpeg-python得以解决,不过CPU占用率高。此外,还展示了对图片进行增强的命令行操作及结果示例。
|
4天前
|
机器学习/深度学习 人工智能 数据挖掘
AI技术对开发者职业天花板的双重影响
随着AI技术的不断创新和飞速发展,人工智能技术在软件开发、数据分析、自动化等领域的应用愈发广泛,并产生了深远的影响。尤其是在程序圈中,对于开发者这一职业群体而言,AI技术的融入不仅改变了传统的开发流程,还对开发者的职业前景带来了全新的挑战和机遇。那么本文就来简单聊聊AI技术究竟对开发者的职业天花板是提升还是降低呢?讨论一下AI技术如何影响开发者的职业天花板。
138 3
AI技术对开发者职业天花板的双重影响
|
10天前
|
机器学习/深度学习 人工智能 算法
关于AI技术,是 提高 or 降低 开发者的职业天花板
【6月更文挑战第5天】关于AI技术,是 提高 or 降低 开发者的职业天花板
|
11天前
|
人工智能 自然语言处理 算法
AI技术对开发者的职业天花板是提升还是降低?
AI技术对开发者的影响复杂多面,既提升也降低了职业天花板。一方面,AI提高开发效率,自动化重复工作,扩展了应用领域,促使开发者持续学习新技能。另一方面,它带来职业转型压力,技能可能过时,竞争加剧。开发者应持续学习,跨领域发展,培养创新思维,以适应和利用AI技术提升自身职业发展空间。
15 0
|
11天前
|
机器学习/深度学习 人工智能 算法
探索软件测试的新时代:AI驱动的自动化
【6月更文挑战第4天】随着人工智能技术的不断进步,软件测试领域正经历着一场革命。本文将探讨AI如何改变传统的软件测试方法,提高测试效率和准确性,以及这一趋势对测试工程师未来技能要求的影响。
21 6
|
14天前
|
机器学习/深度学习 人工智能 算法
后端开发者如何利用AI进行跨学科融合
【6月更文挑战第1天】后端开发者如何利用AI进行跨学科融合
17 6
|
15天前
|
机器学习/深度学习 人工智能 安全
探索软件测试的新时代:AI驱动的测试自动化
本文深入探讨了人工智能(AI)如何革新软件测试领域,特别是测试自动化。随着AI技术的不断进步,它为测试自动化带来了前所未有的效率和准确性,从而极大地提高了软件开发的速度和质量。本文将详细介绍AI在软件测试中的应用,以及它如何帮助测试人员克服传统测试方法的局限性。
|
16天前
|
人工智能 自然语言处理 安全
构建未来:AI驱动的自适应网络安全防御系统提升软件测试效率:自动化与持续集成的实践之路
【5月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私和企业持续运营的关键。传统的安全防御手段,如防火墙和入侵检测系统,面对日益复杂的网络攻击已显得力不从心。本文提出了一种基于人工智能(AI)技术的自适应网络安全防御系统,该系统能够实时分析网络流量,自动识别潜在威胁,并动态调整防御策略以应对未知攻击。通过深度学习算法和自然语言处理技术的结合,系统不仅能够提高检测速度和准确性,还能自主学习和适应新型攻击模式,从而显著提升网络安全防御的效率和智能化水平。 【5月更文挑战第30天】 在快速迭代的软件开发周期中,传统的手动测试方法已不再适应现代高效交付的要求。本文探讨了如
|
传感器 人工智能 监控
面向零售业的AI驱动的视频分析
人工智能(AI)与数据科学直接相关,后者旨在从一系列信息中提取业务价值。 该价值可以包括扩展预测能力,规律知识,明智的决策,降低成本等。换句话说,人工智能以大量信息运行,分析输入数据,并根据这些信息开发自适应解决方案。
242 0
面向零售业的AI驱动的视频分析
|
3天前
|
人工智能
当AI“复活”成为产业:确保数字生命技术始终用于正途的探讨
随着科技的飞速发展,AI技术日益成熟,我们迎来了一个令人瞩目的时代——当AI“复活”不再是科幻电影的情节,而是逐渐成为现实世界的产业,这其中就包括所谓的“数字生命”技术。在这一背景下,通过人物已有影像、声音、语言等内容的学习,克隆数字化的人物形象成为了可能,创造出数字化的“复活”形象。但是正如电影《流浪地球2》所展示的那样,图恒宇将女儿的意识上传到超强计算机,创造出拥有自我意识的数字图丫丫,这一技术奇迹引发了关于伦理、法律和社会责任的深刻探讨,所以说当AI“复活”技术逐渐从实验室走向产业化,我们不得不面对一个严峻的问题:如何确保这项技术始终用于正途?那么本文就来聊聊如何确保数字生命技术始终用于
14 1
当AI“复活”成为产业:确保数字生命技术始终用于正途的探讨