点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


本文将以调用阿里云API为例,介绍如何使用AI编写Java和Python代码,并对比传统编程与AI编程的区别。最后,我们将总结使用AI编写代码的注意事项和不足之处。
传统编程与AI编程的区别
1.1 传统编程
传统编程方式要求开发者手动编写每一行代码,从设计架构到实现功能,再到调试和优化,整个过程耗时较长。开发者需要熟悉编程语言的语法、API文档、调试工具等,并且需要具备较强的逻辑思维能力。
优点:
代码可控性强,开发者可以完全掌控代码的逻辑和结构。 适合复杂项目,能够根据需求进行深度定制。
缺点:
开发周期长,尤其是对于新手开发者,学习曲线陡峭。 调试和优化过程繁琐,容易出错。
1.2 AI编程
AI编程工具(如GitHub Copilot、ChatGPT等)通过自然语言处理和机器学习技术,能够根据开发者的需求自动生成代码。开发者只需描述功能需求,AI工具即可生成相应的代码片段,极大地提高了开发效率。
优点:
开发速度快,AI可以快速生成代码,减少手动编写的时间。 降低编程门槛,即使是非专业开发者也能通过AI工具完成简单的编程任务。 提供代码建议和优化方案,帮助开发者提高代码质量。
缺点:
生成的代码可能不够精确,需要开发者进行二次修改和调试。 对于复杂逻辑或特定业务场景,AI生成的代码可能无法完全满足需求。 依赖AI工具,可能导致开发者对编程基础知识的掌握不足。
如何使用AI编写Python代码
注:以调用阿里云API为例。
2.1 调用阿里云API的传统编程方式
以平台自发现脚本,用python调用阿里云获取ECS主机API为例,传统编程方式需要开发者查询阿里云API文档,编写HTTP请求、处理响应、解析数据等、封装步骤。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
def send_sms():
client = AcsClient('your-access-key-id', 'your-access-key-secret', 'default')
request = CommonRequest()
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https')
request.set_version('2017-05-25')
request.set_action_name('SendSms')
request.add_query_param('PhoneNumbers', '1234567890')
request.add_query_param('SignName', 'your-sign-name')
request.add_query_param('TemplateCode', 'your-template-code')
request.add_query_param('TemplateParam', '{"code":"1234"}')
response = client.do_action_with_exception(request)
print(response)
send_sms()
2.2 使用AI工具生成代码
不同AI侧重点不同,这里调用阿里云API,我们以阿里云AI为例,我们可以通过描述需求,让AI生成相应的代码。
需求描述:
“请帮我生成一个Python代码,调用阿里云的API,获取ECS主机数据”
AI的回答:
以下是使用Python代码调用阿里云API获取ECS主机数据的示例。此代码基于阿里云Python SDK(V2.0)实现,确保您已安装相关依赖并配置了访问凭证。
步骤 1:安装依赖在运行代码之前,请确保安装了阿里云ECS Python SDK
可以通过以下命令安装:
pip install alibabacloud_ecs20140526
步骤 2:配置访问凭证
为了安全起见,建议通过环境变量配置AccessKey ID和AccessKey Secret,而不是直接写入代码中。
在Linux、macOS或Windows系统中设置环境变量:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<您的AccessKey ID>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<您的AccessKey Secret>
步骤 3:编写Python代码
以下代码展示了如何调用DescribeInstances接口获取ECS实例的详细信息:
import os
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_tea_openapi.models import Config
from alibabacloud_ecs20140526.models import DescribeInstancesRequest
from alibabacloud_tea_util.models import RuntimeOptions
# 初始化ECS客户端
defcreate_client():
config = Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='ecs.cn-hangzhou.aliyuncs.com'# 替换为您的区域Endpoint
)
return EcsClient(config)
# 调用DescribeInstances接口获取ECS实例数据
defdescribe_ecs_instances():
client = create_client()
# 构造请求对象
request = DescribeInstancesRequest(
region_id='cn-hangzhou', # 替换为您的目标区域ID
page_size=10, # 每页返回的实例数量
page_number=1 # 当前页码
)
# 设置运行时参数
runtime = RuntimeOptions()
try:
# 发起调用
response = client.describe_instances_with_options(request, runtime)
instances = response.body.instances.instance
# 打印实例信息
for instance in instances:
print(f"实例ID: {instance.instance_id}, "
f"实例名称: {instance.instance_name}, "
f"状态: {instance.status}, "
f"公网IP: {instance.public_ip_address.ip_address[0] if instance.public_ip_address else'无'}")
except Exception as e:
print(f"调用API失败: {e}")
if __name__ == "__main__":
describe_ecs_instances()
代码说明初始化客户端
使用Config类配置访问凭证和区域Endpoint。create_client函数返回一个ECS客户端实例。
构造请求对象
DescribeInstancesRequest用于指定查询条件,例如区域ID、分页参数等。
发起调用
使用describe_instances_with_options方法发送请求,并传入运行时参数RuntimeOptions。
处理响应
解析返回的实例列表,提取关键信息(如实例ID、实例名称、状态、公网IP等)并打印。
重要提醒权限管理
确保使用的RAM用户具有AliyunECSReadOnlyAccess权限策略,或者根据实际需求自定义授权。区域Endpoint:请根据目标区域选择正确的Endpoint,例如ecs.cn-beijing.aliyuncs.com。异常处理:代码中包含异常捕获逻辑,便于排查API调用失败的原因。
运行结果示例
假设您有以下ECS实例:
实例ID:i-bp1234567890abcdef实例名称:ecs001状态:Running公网IP:123.123.123.123运行代码后输出如下:
实例ID: i-bp1234567890abcdef, 实例名称: ecs001, 状态: Running, 公网IP: 123.123.123.123通过以上代码,您可以轻松获取ECS实例的详细信息。如果需要进一步扩展功能(如批量操作或筛选特定实例),可以参考阿里云ECS API文档进行调整。
2.3 对比分析
从上述代码可以看出,AI生成的代码不仅能够根据需求描述快速生成可用的代码片段,极大地节省了开发时间、而且还给开发者提供了代码说明、重要提醒、以及运行结果示例。然而,AI生成的代码仍然需要开发者进行二次验证和调试,确保其符合实际需求。
2.4 描述优化提升
从上述代码可以看出,虽然能获取到数据,但并不满足我们自发现的数据格式,AI生成的代码基于我们描述的语言,如果要添加其它代码处理逻辑,必须丰富我们的描述。
需求描述:
“请帮我生成一个Python代码,调用阿里云的API,获取所有地域下的ECS主机数据并完善分页逻辑。”
生成代码:
import os
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_tea_openapi.models import Config
from alibabacloud_ecs20140526.models import DescribeRegionsRequest, DescribeInstancesRequest
from alibabacloud_tea_util.models import RuntimeOptions
# 初始化ECS客户端
defcreate_client():
config = Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='ecs.aliyuncs.com'# 全局Endpoint
)
return EcsClient(config)
# 获取所有地域信息
defdescribe_regions(client):
request = DescribeRegionsRequest()
runtime = RuntimeOptions()
try:
response = client.describe_regions_with_options(request, runtime)
regions = [region.region_id for region in response.body.regions.region]
return regions
except Exception as e:
print(f"获取地域信息失败: {e}")
return []
# 获取指定地域下的ECS实例数据(支持分页)
defdescribe_instances_in_region(client, region_id):
all_instances = []
page_number = 1
page_size = 50# 每页返回的实例数量
whileTrue:
request = DescribeInstancesRequest(
region_id=region_id,
page_size=page_size,
page_number=page_number
)
runtime = RuntimeOptions()
try:
response = client.describe_instances_with_options(request, runtime)
instances = response.body.instances.instance
total_count = response.body.total_count
ifnot instances:
break
all_instances.extend(instances)
# 如果当前页码 * 每页数量 >= 总实例数,则退出循环
if page_number * page_size >= total_count:
break
page_number += 1
except Exception as e:
print(f"获取地域 {region_id} 的ECS实例数据失败: {e}")
break
return all_instances
# 主函数:获取所有地域下的ECS实例数据
defdescribe_all_ecs_instances():
client = create_client()
regions = describe_regions(client)
ifnot regions:
print("未获取到任何地域信息")
return
all_instances = []
for region_id in regions:
print(f"正在获取地域 {region_id} 的ECS实例数据...")
instances = describe_instances_in_region(client, region_id)
all_instances.extend(instances)
# 打印所有实例信息
for instance in all_instances:
print(f"地域: {instance.region_id}, "
f"实例ID: {instance.instance_id}, "
f"实例名称: {instance.instance_name}, "
f"状态: {instance.status}, "
f"公网IP: {instance.public_ip_address.ip_address[0] if instance.public_ip_address else'无'}")
if __name__ == "__main__":
describe_all_ecs_instances()
可以看到AI输出的代码根据我们的描述增加了获取地域、根据地域循环获取ECS主机的逻辑,并在获取ECS主机数据时添加了分页的逻辑。
2.5 指定属性与转换格式
需求描述:
“请帮我生成一个Python代码,调用阿里云的API,获取所有地域下的ECS主机数据并完善分页逻辑,需要查询ECS的属性有:IP地址,实例状态,网络计费类型,实例计费方式,公网IP,内网IP,地域ID,可用区ID,地域,可用区,实例名称,实例创建时间,操作系统名称,操作系统类型,CPU数 ,内存大小(MiB),标签。并将查询结果输出为如下JSON数组格式:
[{
"ciCode": "aliyun_ecs",
"attributes": [
{
"attrName": "snc-agent安装路径",
"attrCode": "",
"attrValue": "'`snc_agent_path`'"
}
]
}]
”其中attrName为资产属性名,attrValue为资产属性值。
生成代码:
import os
import json
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_tea_openapi.models import Config
from alibabacloud_ecs20140526.models import DescribeRegionsRequest, DescribeInstancesRequest
from alibabacloud_tea_util.models import RuntimeOptions
# 初始化ECS客户端
defcreate_client():
config = Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='ecs.aliyuncs.com'# 全局Endpoint
)
return EcsClient(config)
# 获取所有地域信息
defdescribe_regions(client):
request = DescribeRegionsRequest()
runtime = RuntimeOptions()
try:
response = client.describe_regions_with_options(request, runtime)
regions = [region.region_id for region in response.body.regions.region]
return regions
except Exception as e:
print(f"获取地域信息失败: {e}")
return []
# 获取指定地域下的ECS实例数据(支持分页)
defdescribe_instances_in_region(client, region_id):
all_instances = []
page_number = 1
page_size = 50# 每页返回的实例数量
whileTrue:
request = DescribeInstancesRequest(
region_id=region_id,
page_size=page_size,
page_number=page_number
)
runtime = RuntimeOptions()
try:
response = client.describe_instances_with_options(request, runtime)
instances = response.body.instances.instance
total_count = response.body.total_count
ifnot instances:
break
all_instances.extend(instances)
# 如果当前页码 * 每页数量 >= 总实例数,则退出循环
if page_number * page_size >= total_count:
break
page_number += 1
except Exception as e:
print(f"获取地域 {region_id} 的ECS实例数据失败: {e}")
break
return all_instances
# 格式化ECS实例数据为JSON数组
defformat_instance_data(instances):
formatted_data = []
for instance in instances:
# 提取所需属性
instance_data = {
"ciCode": "aliyun_ecs",
"attributes": [
{"attrName": "IP地址", "attrCode": "ip_address", "attrValue": instance.public_ip_address.ip_address[0] if instance.public_ip_address else"无"},
{"attrName": "实例状态", "attrCode": "status", "attrValue": instance.status},
{"attrName": "网络计费类型", "attrCode": "internet_charge_type", "attrValue": instance.internet_charge_type},
{"attrName": "实例计费方式", "attrCode": "instance_charge_type", "attrValue": instance.instance_charge_type},
{"attrName": "公网IP", "attrCode": "public_ip", "attrValue": instance.public_ip_address.ip_address[0] if instance.public_ip_address else"无"},
{"attrName": "内网IP", "attrCode": "private_ip", "attrValue": instance.vpc_attributes.private_ip_address.ip_address[0] if instance.vpc_attributes and instance.vpc_attributes.private_ip_address else"无"},
{"attrName": "地域ID", "attrCode": "region_id", "attrValue": instance.region_id},
{"attrName": "可用区ID", "attrCode": "zone_id", "attrValue": instance.zone_id},
{"attrName": "地域", "attrCode": "region", "attrValue": instance.region_id}, # 地域ID与地域一致
{"attrName": "可用区", "attrCode": "zone", "attrValue": instance.zone_id}, # 可用区ID与可用区一致
{"attrName": "实例名称", "attrCode": "instance_name", "attrValue": instance.instance_name},
{"attrName": "实例创建时间", "attrCode": "creation_time", "attrValue": instance.creation_time},
{"attrName": "操作系统名称", "attrCode": "os_name", "attrValue": instance.os_name},
{"attrName": "操作系统类型", "attrCode": "os_type", "attrValue": instance.os_type},
{"attrName": "CPU数", "attrCode": "cpu", "attrValue": instance.cpu},
{"attrName": "内存大小(MiB)", "attrCode": "memory", "attrValue": instance.memory},
{"attrName": "标签", "attrCode": "tags", "attrValue": ", ".join([f"{tag.tag_key}:{tag.tag_value}"for tag in instance.tags.tag]) if instance.tags and instance.tags.tag else"无"}
]
}
formatted_data.append(instance_data)
return formatted_data
# 主函数:获取所有地域下的ECS实例数据并输出为JSON
defdescribe_all_ecs_instances():
client = create_client()
regions = describe_regions(client)
ifnot regions:
print("未获取到任何地域信息")
return
all_instances = []
for region_id in regions:
print(f"正在获取地域 {region_id} 的ECS实例数据...")
instances = describe_instances_in_region(client, region_id)
all_instances.extend(instances)
# 格式化数据为JSON数组
formatted_data = format_instance_data(all_instances)
# 输出JSON结果
print(json.dumps(formatted_data, ensure_ascii=False, indent=4))
if __name__ == "__main__":
describe_all_ecs_instances()
可以看到AI不仅将要求的属性一一列出,不能直接获取的属性还单独做了解析处理,并且完全按照我们的需要的格式进行输出。这个一个自发现脚本的编写、调试周期可以由原来的2天,缩短到0.5天,大大提升了工作效率。
注意事项vs不足
验证生成的代码 AI生成的代码可能不完全符合需求,开发者需要仔细检查代码的逻辑和功能,确保其正确性。 理解代码逻辑 虽然AI可以生成代码,但开发者仍需理解代码的逻辑和结构,以便在出现问题时能够快速定位和修复。 结合业务需求 AI生成的代码通常是通用的,开发者需要根据具体的业务需求进行定制和优化。 保护敏感信息 在使用AI工具时,避免将敏感信息(如API密钥、密码等)输入到AI工具中,以防信息泄露。
3.2 AI编写代码的不足之处
代码质量参差不齐 AI生成的代码质量取决于训练数据和模型的准确性,有时生成的代码可能不符合最佳实践。 缺乏创造性 AI工具通常基于已有的代码库生成代码,缺乏创造性,难以应对复杂的业务逻辑或创新需求。 依赖性强 过度依赖AI工具可能导致开发者对编程基础知识的掌握不足,影响长期的技术成长。 调试困难 AI生成的代码可能包含隐藏的错误,调试过程可能比手动编写的代码更加复杂。
总 结
4.1 传统编程流程图
4.2 AI编程流程图
AI编程工具为开发者提供了极大的便利,能够快速生成代码,降低开发门槛。
然而,AI生成的代码仍然需要开发者进行验证和调试,确保其符合实际需求。
在使用AI工具时,开发者应保持对代码逻辑的理解,并结合业务需求进行定制和优化。尽管AI编程工具存在一些不足之处,但随着技术的不断进步,AI在编程领域的应用前景将更加广阔。

本文作者:赵建强(上海新炬中北团队)
本文来源:“IT那活儿”公众号





