AI 驱动的开发者(MEAP)(二)(1)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: AI 驱动的开发者(MEAP)(二)

第五章:通过 GitHub Copilot 和 Copilot Chat 管理数据

本章内容涵盖

  • 将我们的数据持久化到关系型数据库
  • 使用 Apache Kafka 进行数据流式传输
  • 融合事件驱动原则
  • 使用 Spark 分析我们的数据以监控位置

上一章为我们的信息技术资产管理系统奠定了基础。然而,没有数据,这个应用程序将无法满足我们的要求。数据是每个应用程序的命脉。这正是本章的主题:我们可以使用生成式 AI 来创建数据、流式传输数据、转换数据、对数据做出反应并从数据中学习的各种方式。

敏锐的人可能已经注意到在上一章中,我们的数据访问模式是无法正常工作的,因为它是不完整的。本章的开头部分将解决这个问题。之后,我们将设置我们的数据库,修复访问这些数据的类,并加载一些示例数据,以便在本章的其余部分使用。

5.1 积累我们的数据集

我们的第一个任务将是构建一个大量的数据集,以帮助我们在本章剩余的实验中。首先,我们将使用 GitHub Copilot 生成一千行资产信息。然而,我们很快会发现,这可能不是最适合这项任务的工具。使用这些工具的一个关键驱动因素是发现的概念:测试它们的边界,推动它们,有时候,反击它们。但旅程往往是快乐的源泉。一旦我们找到了这个边缘,我们将被介绍一个新的、以前从未见过的工具:GitHub Copilot Chat。最后,一旦我们创建了我们的资产列表,我们将再次使用 GitHub Copilot Chat 为这些资产添加位置信息。

在构建我们的初始数据集之前,我们需要让数据库运行起来。Docker 让这个任务变得微不足道,让我们能够快速启动一个空的 Postgres(或其他 RDBMS/NoSQL 服务器),几乎不费吹灰之力。你忘记了执行此操作的命令吗?别担心,我们可以问 Copilot。打开一个名为 data/initial_data_laod.sql 的新文件,并在你的新生成的 SQL 文件顶部输入以下提示。

片段 5.1 提示 GitHub Copilot 为我们提供一个 Docker 命令
-- Question: What is the command to run a docker container, running PostgreSQL for a database called itam_db. I would like to specify the password for this database.

Copilot 将逐渐揭示 Docker 命令:--Answer: docker run --name itam_db -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres. 一旦你在终端或命令行运行这个命令,我们就可以构建出我们的数据集。你应该能够连接到本地运行的数据库。你应该注意到里面有一个名为 itam_db 的数据库在运行。然而,这个数据库没有模式、表或数据。让我们首先设置一个新的模式。

在我们的 initial_data_file.sql 中,我们将添加一个提示,让 Copilot 起草模式创建命令。执行此命令将允许您从数据库客户端应用程序(例如 DataGrip、SQuirreL、pdAdmin,甚至使用 Docker exec 命令 docker exec -i itam_db psql -U postgres -c "create schema itam")中创建名为 itam 的新模式。

提示让 Copilot 创建新模式
-- create a schema called itam
create schema itam;

接下来,我们应该为应用程序中使用的用户添加一个用户。此用户将能够对我们的数据执行CRUD(创建、读取、更新、删除)操作,但将无法影响数据库表或存储过程的结构。

注意

以双破折号开头的行是 SQL 中的注释。从 Copilot 的角度来看,注释这些行是可选的,因为它将生成没有注释的解决方案;这样做可以更轻松地将代码直接复制粘贴到我们选择的数据库工具中。

在此期间,我们还将添加一个管理帐户,以执行我们的读写用户无法执行的操作,例如创建或删除表。

提示创建新用户
-- create two users called itam_user and itam_admin. itam_user should be able to read from and write to the tables in the itam schema. itam_admin should be able to read from and write to the tables in the itam schema and create and drop tables in the itam schema.
create user itam_user with password 'itam_user';
create user itam_admin with password 'itam_admin';
grant usage on schema itam to itam_user;
grant usage on schema itam to itam_admin;
grant select, insert, update, delete on all tables in schema itam to itam_user;
grant select, insert, update, delete on all tables in schema itam to itam_admin;
grant usage, drop on schema itam to itam_admin;

接下来,我们将把此模式的所有权授予 itam_admin 帐户。转移此所有权将确保只有此帐户可以更改表结构:数据定义。

将模式所有权转移给管理员帐户的提示
-- grant ownership of the itam schema to itam_admin
alter schema itam owner to itam_admin;

配置完成、帐户创建和系统的崇拜已经完成,我们可以开始专注于数据。我们将从添加参考数据开始,即支持资产的数据:折旧策略。这些数据的性质更加静态;它们的变化频率较低,甚至根本不变。接下来,我们将定义并存储这些策略。

提示创建折旧策略表
-- create a table called depreciation_strategy in the itam schema. the table should have the following columns: id (int), name (varchar), and description (varchar). the table should have a primary key on id.
-- id needs to be in quotes because it is a reserved word in postgresql
-- there are two values for depreciation_strategy: straight line and double declining balance
create table itam.depreciation_strategy (
    "id" int primary key,
    "name" varchar,
    "description" varchar
);

我们将使用序列作为此表的主键。虽然对于一个不会很大并且我们可以手动输入已知值的表而言,这并不是严格必要的,但是添加此序列将允许我们与 Copilot 更多地合作并让它提出一些建议。此外,询问 Copilot 并在文本文件中获得 Copilot 的回答是有趣的。

提示为折旧策略表的主键创建序列
-- create a sequence called depreciation_strategy_seq, which should start at 1 and increment by 1 and should be used as the primary key for the depreciation_strategy table.
create sequence itam.depreciation_strategy_seq start 1 increment 1;

自然地,有了我们手中的序列,我们需要知道如何将序列与depreciation_stategy表的主键列关联起来。幸运的是,Copilot 有答案。

询问 Copilot 如何将序列与主键关联
-- question: how do I make the sequence the primary key for the depreciation_strategy table?
-- answer: use the following command
alter table itam.depreciation_strategy alter column "id" set default nextval('itam.depreciation_strategy_seq'::regclass);

最后,我们将通过将以下静态条目插入表格来完成此表格。目前我们只使用两种折旧策略:直线法和双倍余额递减法。

将静态条目添加到折旧策略表
insert into depreciation_strategy (id, name, description) values (1, 'straight line', 'straight line');
insert into depreciation_strategy (id, name, description) values (2, 'double declining balance', 'double declining balance');

接下来,我们将转向资金细节表。这些信息告诉我们如何为我们的设备进行融资,再销售价值,并对资产在其有用生命周期结束后应采取的措施进行说明。我们在折旧策略中所做的步骤顺序将与此相同,唯一的区别是我们不会添加静态条目,因为这些数据直接与个体资产相关。我们将定义表,创建序列,并将该序列应用于表,作为主键的功能。

列表 5.6 资金详情表的完整代码列表
-- create a table called funding_details in the itam schema. the table should have the following columns: id (int), name (varchar),depreciation_strategy_id (int) and depreciation_rate (float). the table should have a primary key on id.
-- depreciation_stategy_id is a foreign key to the depreciation_strategy table.
-- id needs to be in quotes because it is a reserved word in postgresql
create table itam.funding_details (
    "id" int primary key,
    "name" varchar,
    "depreciation_strategy_id" int,
    "depreciation_rate" float
);
-- create a sequence called funding_details_seq, which should start at 1 and increment by 1 and should be used as the primary key for the funding_details table.
create sequence itam.funding_details_seq start 1 increment 1;
alter table itam.funding_details alter column "id" set default nextval('itam.funding_details_seq'::regclass);

我们将定义和生成的最后信息是资产本身。这个列表也是冗余的,但出于完整性考虑已包括在内。最后,我们创建表,创建序列,并将其用作主键。

列表 5.7 资产表的完整代码列表
-- create a table called assets in the itam schema. the table should have the following columns: 
-- id (int), name (varchar), status (varchar), category (varchar), cost (float), useful_life (int), salvage_value (float), purchase_date (date), funding_details_id (int). The table should have a primary key on id and a foreign key on funding_details_id.
-- id needs to be in quotes because it is a reserved word in postgresql
-- the table should have a sequence called assets_id_seq, which should start at 1 and increment by 1 and should be used as the primary key for the assets table.
create table itam.assets (
    "id" int primary key,
    "name" varchar,
    "status" varchar,
    "category" varchar,
    "cost" float,
    "useful_life" int,
    "salvage_value" float,
    "purchase_date" date,
    "funding_details_id" int
);
-- create a sequence called assets_seq, which should start at 1 and increment by 1 and should be used as the primary key for the assets table.
create sequence itam.assets_seq start 1 increment 1;
alter table itam.assets alter column "id" set default nextval('itam.assets_seq'::regclass);

在定义和创建表之后,我们现在将专注于创建数据。在我们的文本文件中,我们使用参数指示 Copilot 我们正在寻找的数据集。Copilot 可能会尝试帮助您概述围绕新数据集的属性。

列表 5.8 为资产表创建数据集
-- Generate a dataset of assets for an ITAM system. The dataset should include the following columns: id (int), name (varchar), status (varchar), category (varchar), cost (float), useful_life (int), salvage_value (float), purchase_date (date), funding_details_id (int). The dataset should have 1000 rows, sorted by id. Each row should have the following characteristics:
-- - id should be a unique integer and sequential starting at 1.
-- - name should be a random string of characters between 1 and 50 characters long.
-- - status should be a random selection from the following valid asset statuses: in use, in storage, disposed of, in repair, in transit, other.
-- - category should be a random selection from the following valid categories: hardware, software, other.
-- - cost should be a random float between 0 and 100000.
-- - useful_life should be a random int between 1 and 10.
-- - salvage_value should be a random float greater than 0 but less than the cost of the asset.
-- - purchase_date should be a random date between 1/1/2019 and 12/31/2022.
-- - funding_details_id should be a random integer either 1 or 2.
-- The dataset should be saved as a CSV file named assets.csv in the data directory. The file should have a header row and the columns should have the following data types: id (int), name (varchar), status (varchar), category (varchar), cost (float), useful_life (float), salvage_value (float), funding_details_id (int)

Copilot 提供的解决方案是新颖的。它使用 Postgres 内置功能构建了一个大系列,这意味着这不是一个可移植的解决方案。然而,考虑到这是我们将要使用的数据库,这是一个足够合适的解决方案。生成的数据集经过了精心制作。如果我们使用 Python 并要求 Copilot 帮助编写一个用于加载到 Postgres 的文件的脚本,我们可能会得到更好的结果。然而,鉴于这个数据集只是用来玩应用程序,目前我们不需要过于担心数据质量。尽管在现实世界中,数据质量是至关重要的。

列表 5.9 Copilot 的响应:基于一系列构建的插入语句
insert into itam.assets (id, name, status, category, cost, useful_life, salvage_value, purchase_date, funding_details_id)
select
    id,
    name,
    status,
    category,
    cost,
    useful_life,
    salvage_value,
    purchase_date,
    funding_details_id
from (
    select
        row_number() over (order by random()) as id,
        md5(random()::text) as name,
        case
            when random() < 0.2 then 'in use'
            when random() < 0.4 then 'in storage'
            when random() < 0.6 then 'disposed of'
            when random() < 0.8 then 'in repair'
            when random() < 0.9 then 'in transit'
            else 'other'
        end as status,
        case
            when random() < 0.5 then 'hardware'
            when random() < 0.9 then 'software'
            else 'other'
        end as category,
        random() * 100000 as cost,
        (random() * 100)::int as useful_life,
        random() * (random() * 100000) as salvage_value,
        -- generate a random date between 1/1/2019 and 12/31/2022
        -- this does not work please fix
        -- '2019-01-01'::date + random() * ('2022-12-31'::date - '2019-01-01'::date) as purchase_date,
        '2019-01-01'::date + (random() * (DATE '2022-12-31' - DATE '2019-01-01')::integer)::integer as purchase_date
        case
            when random() < 0.5 then 1
            else 2
        end as funding_details_id
    from generate_series(1, 1000)
) as assets;

如果我们仅仅转向 ChatGPT,我们可以得到如何创建这样的数据集的第二意见。ChatGPT 建议使用 Python 库fakerfaker包用于生成虚假数据,例如常见的英文姓名。numpy用于生成成本、有用生命和残值的随机浮点值。pandas用于在DataFrame(表)中管理数据。此外,我们可以使用df.to_csv('assets.csv', index=False)方法将DataFrame保存到 CSV 文件中。

列表 5.10 ChatGPT 建议使用 Faker 来生成虚假数据集
import pandas as pd
import numpy as np
import random
from faker import Faker
# Create Faker object
fake = Faker()
# Define our valid statuses, categories, funding_details and depreciation_strategies
valid_statuses = ['in use', 'in storage', 'disposed', 'in repair', 'in transit', 'other']
valid_categories = ['hardware']
valid_funding_details = ['purchased']
valid_depreciation_strategies = ['straight line']
# Generate the data
data = {
    'id': list(range(1, 1001)),
    'name': [fake.first_name() for _ in range(1000)],
    'status': [random.choice(valid_statuses) for _ in range(1000)],
    'category': [random.choice(valid_categories) for _ in range(1000)],
    'cost': np.random.uniform(0, 100000, 1000),
    'useful_life': np.random.uniform(1, 10, 1000),
    'salvage_value': np.random.uniform(0, 10000, 1000),
    'funding_details': [random.choice(valid_funding_details) for _ in range(1000)],
    'depreciation_strategy': [random.choice(valid_depreciation_strategies) for _ in range(1000)],
}
# Create DataFrame
df = pd.DataFrame(data)
# Ensure the DataFrame is sorted by id
df = df.sort_values('id')
# Show the DataFrame
print(df)

对于这些资产的每一项,我们也需要资金细节;它们是如何融资的(在这种情况下购买),以及折旧细节。毫不奇怪,我们从 Copilot 得到了类似的解决方案:使用与我们为资产使用的类似提示生成一系列条目。我们需要确保对于每个资产标识符(1-1000),我们都有相应的资金细节条目。否则,在运行我们的代码时会出现空指针的风险。

清单 5.11 创建funding_details表的数据集
-- Generate a dataset of funding details for an ITAM system. The dataset should include the following columns: id (int), name (varchar), depreciation_strategy_id (int), depreciation_rate (float). The dataset should have 1000 rows, sorted by id. 
-- Each row should have the following characteristics:
-- - id should be a unique integer and sequential starting at 1.
-- - name should be a random string of characters between 1 and 10 characters long.
-- - depreciation_strategy_id should be a random integer either 1 or 2.
-- - depreciation_rate should be a random float between 0 and .4.
insert into itam.funding_details (id, name, depreciation_strategy_id, depreciation_rate)
select
    id,
    name,
    depreciation_strategy_id,
    depreciation_rate
from (
    select
        row_number() over (order by random()) as id,
        md5(random()::text) as name,
        case
            when random() < 0.5 then 1
            else 2
        end as depreciation_strategy_id,
        random() * 0.4 as depreciation_rate
    from generate_series(1, 1000)
) as funding_details;

有了在数据库中生成和存储的数据集,我们应该能够通过 REST API 连接我们应用程序的其余部分来存储和显示资产。然而,由于我们在构建阶段之前已经剥离了所有的 SQLAlchemy 元数据(请参阅上一章),我们需要一种不同的方法来将这些元数据与我们的适配器进行连接。

有了这个,我们已经达到了 Copilot 的能力边缘。我们对接下来会发生什么感到困惑;我们如何解决我们最近的困境。尽管诱人,我们不能放弃回家。因此,现在是时候介绍 Copilot 产品套件的最新成员了:Copilot Chat。Copilot Chat 是嵌入式的 GPT-4 模型,可以集成到你的 IDE 中(目前仅支持 Visual Studio Code)。我们将打开聊天对话框,询问如何保持我们的业务模型清晰,但仍然使用 SQLAlchemy 的 ORM(对象关系模型)功能。

图 5.1 GitHub Copilot Chat 对我们最近困境的解决方案


Copilot Chat 建议我们创建一个单独的数据访问层。这种方法与我们迄今为止使用的端口和适配器方法非常契合。此外,Copilot Chat 建议将这些类建模得与领域类类似,但包括 ORM 功能正常工作所需的元数据。生成的代码见清单 5.12。

清单 5.12 领域类之外的 ORM 支持。
Base  = declarative_base()
class FundingDetailsModel(Base):
    __tablename__ = 'funding_details'
    id = Column(Integer, primary_key=True)
    depreciation_rate = Column(Float)
    depreciation_strategy_id = Column(Integer)
    def get_depreciation_strategy(self) -> DepreciationStrategy:
        if self.depreciation_strategy_id is 1:
            return StraightLineDepreciationStrategy()
        else:
            return DoubleDecliningDepreciationStrategy()
class AssetModel(Base):
    __tablename__ = 'assets'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    status = Column(String)
    category = Column(String)
    cost = Column(Float)
    useful_life = Column(Float)
    salvage_value = Column(Float)
    purchase_date = Column(Date)
    funding_details_id = Column(Integer, ForeignKey('funding_details.id'))
    funding_details = relationship('FundingDetailsModel')

现在,外部模型类已经创建,我们必须将这些 ORM 实例映射到我们的领域模型,然后返回给系统核心。虽然对于这样一个简单的应用程序来说,这似乎是过度设计的代码,但这给了我们很大的灵活性,使我们的领域模型可以进行复杂的操作。例如,我们的模型可以执行 CRUD 之外的复杂操作。如果我们将我们的领域模型身份限制在数据访问层中使用的模型上,我们将受到这些操作的限制。

接下来,我们将使用 Copilot 和 Copilot Chat 探索将事件驱动思想纳入我们的应用程序中。事件驱动的概念将允许我们实时跟踪我们的 IT 资产:它们的位置、状态和市场价值,例如。

AI 驱动的开发者(MEAP)(二)(2)https://developer.aliyun.com/article/1516330

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
8天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
7天前
|
人工智能 Cloud Native 数据管理
媒体声音|重磅升级,阿里云发布首个“Data+AI”驱动的一站式多模数据平台
在2024云栖大会上,阿里云瑶池数据库发布了首个一站式多模数据管理平台DMS:OneMeta+OneOps。该平台由Data+AI驱动,兼容40余种数据源,实现跨云数据库、数据仓库、数据湖的统一数据治理,帮助用户高效提取和分析元数据,提升业务决策效率10倍。DMS已服务超10万企业客户,降低数据管理成本高达90%。
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI驱动的个性化学习平台构建###
【10月更文挑战第29天】 本文将深入探讨如何利用人工智能技术,特别是机器学习与大数据分析,构建一个能够提供高度个性化学习体验的在线平台。我们将分析当前在线教育的挑战,提出通过智能算法实现内容定制、学习路径优化及实时反馈机制的技术方案,以期为不同背景和需求的学习者创造更加高效、互动的学习环境。 ###
25 3
|
11天前
|
机器学习/深度学习 人工智能 运维
智能化运维:AI驱动下的IT运维革命###
本文探讨了人工智能(AI)技术在IT运维领域的创新应用,强调其在提升效率、预防故障及优化资源配置中的关键作用,揭示了智能运维的新趋势。 ###
|
8天前
|
数据采集 人工智能 搜索推荐
|
8天前
|
数据采集 人工智能 搜索推荐
大咖说|Data+AI:企业智能化转型的核心驱动力
在数字化浪潮的推动下,企业正面临前所未有的挑战与机遇。数据与人工智能的结合,形成了强大的Data+AI力量,尤其在近期人工智能迅速发展的背景下,这一力量正在加速重塑企业的运营模式、竞争策略和市场前景,成为适应变化、提升竞争力、推动创新的核心驱动力。本文将讨论企业采用Data+AI平台的必要性及其在企业智能化转型中的作用。
53 0
大咖说|Data+AI:企业智能化转型的核心驱动力
|
20天前
|
人工智能 安全 决策智能
OpenAI推出实验性“Swarm”框架,引发关于AI驱动自动化的争论
OpenAI推出实验性“Swarm”框架,引发关于AI驱动自动化的争论
|
15天前
|
机器学习/深度学习 人工智能 测试技术
探索 AI 驱动的软件开发:未来技术的新趋势
【10月更文挑战第19天】本文探讨了人工智能(AI)在软件开发中的应用现状和技术优势,包括代码生成、缺陷检测、自动化测试和性能优化。AI 可以提高开发效率、减少人为错误、加速创新并持续学习。文章还讨论了实施 AI 驱动开发的挑战和最佳实践,强调了数据管理和技能培训的重要性。
|
14天前
|
机器学习/深度学习 数据采集 人工智能
探索AI驱动的自动化测试新纪元###
本文旨在探讨人工智能如何革新软件测试领域,通过AI技术提升测试效率、精准度和覆盖范围。在智能算法的支持下,自动化测试不再局限于简单的脚本回放,而是能够模拟复杂场景、预测潜在缺陷,并实现自我学习与优化。我们正步入一个测试更加主动、灵活且高效的新时代,本文将深入剖析这一变革的核心驱动力及其对未来软件开发的影响。 ###
|
24天前
|
人工智能 开发框架 搜索推荐
AI 骁龙 PC 开发者 技术 沙龙
AI 骁龙 PC 开发者 技术 沙龙
30 1

热门文章

最新文章

下一篇
无影云桌面