应用教程第13章:AI辅助编程
《生成式AI与提示工程权威指南》应用教程第13章:AI辅助编程
要点:
- 代码生成:可利用LLM(大语言模型)完成代码生成、调试、重构,乃至模拟服务器等任务。
- 降低复杂度:AI聊天机器人能减少重复性任务耗时,例如添加注释或优化低效脚本。
- 记忆与多文件处理:聊天机器人可处理多文件对话及代码,模拟数据库、Web服务器等功能。
- 分步指导:本文通过实用示例演示如何运用LLM处理代码相关任务。
LLM可用于调试、生成代码、重新格式化、添加注释等任务。某款热门聊天机器人宣称支持40余种编程语言的代码操作。
| 非常老旧 | 老旧 | 较新 | 尖端 |
| ---- | ---- | ---- | ---- |
| BASIC | Perl | Swift | Kotlin |
| Assembly | Pascal | TypeScript | Julia |
| Fortran | PHP | Rust | Crystal |
| Lisp | Python | Kotlin/Native | Racket |
| COBOL | C | Julia (GPU) | Lua |
| Algol | C++ | Go | Zig |
| SNOBOL | Java | Dart | Nim |
| RPG | Smalltalk | Elixir | Crystal (LLVM) |
| Forth | Tcl | Groovy | Vlang |
| Ada | SQL | Scala Native | Erlang |
代码生成
要求 ChatGPT 或其他基于大语言模型(LLM)的 AI 聊天机器人生成代码非常简单,示例如下:
Prompt:
请扮演一名初级 Python 程序员,编写代码从三个数组中(各包含 6 项元素:介词、动词和名词,其中名词也作为直接宾语)生成填词游戏。编写完成后执行代码。
输出结果示例如下
AI Output:
python
import random
prepositions = ['at', 'in', 'on', 'with', 'under', 'over']
verbs = ['run', 'jump', 'dance', 'sing', 'laugh', 'cry']
nouns = ['cat', 'dog', 'tree', 'flower', 'book', 'computer']
preposition = random.choice(prepositions)
verb = random.choice(verbs)
noun = random.choice(nouns)
madlib = f"I {verb} {preposition} the {noun}."
print(madlib)
代码注释与格式化
你可以要求AI助手为代码添加注释并重新格式化,使其更易读。在提示指令后添加三个井号(###),将提示语与待处理的代码分隔开。
Prompt:
请为以下Python代码添加行注释并重新格式化以提升可读性:
###
import math
amplitude = 30
frequency = 2
num_points = 50
for i in range(num_points):
y = int(round(amplitude * math.sin(2 * math.pi * frequency * i / num_points)))
print(' ' * (amplitude + y) + '*')
输出结果示例如下
AI Output:
# 导入数学模块
import math
# 设置波形参数:振幅、频率和采样点数量
amplitude = 30
frequency = 2
num_points = 50
# 遍历每个采样点
for i in range(num_points):
# 使用正弦函数计算当前点的y坐标值
y = int(round(amplitude * math.sin(2 * math.pi * frequency * i / num_points)))
# 输出:通过空格控制位置,并在对应波形位置打印星号
print(' ' * (amplitude + y) + '*')
调试功能
基于LLM的AI聊天机器人不仅能检测代码中的语法错误,还能发现程序运行时出现的逻辑错误。以下是一个Python脚本示例:由于第3行的逻辑错误,最终会导致第4行出现除零错误。使用这个简单的指令即可定位并修复错误:
Prompt:
Please debug this Python code:
1. pizza_cost = 100 2. partygoers = 10 3. while partygoers = 0: 4. cost_per_person = pizza_cost / partygoers 5. print("the cost per person is #34;, "{:.2f}".format(cost_per_person)) 6. partygoers -= 2
AI Output:
3. while partygoers > 0:
针对更复杂的错误,您可能需要提供更多具体信息:如错误提示、环境变量、引用的程序库或不同的输入参数等情况。
代码优化
如果您的脚本执行时间过长,使用诸如ChatGPT等AI聊天机器人可以对其进行优化。以下是一个优化查找质数的低效脚本的示例:
Prompt:
请以资深Python开发者的身份优化以下脚本:
or num in range(1, 101):
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
print(num)
优化后的脚本(可能采用埃拉托斯特尼筛法查找质数):
AI Output:
numbers = list(range(2, 101))
for i in numbers:
for j in range(i * 2, 101, i):
if j in numbers:
numbers.remove(j)
print(numbers)
请注意,我们要求AI助手"以资深开发者的身份"来优化脚本。您还可以指定其具备特定领域的专业知识(例如排序算法),或要求其具备若干年的开发经验。反之,如果您的脚本过于复杂,您也可以要求AI助手"以初级开发者的身份"来重写该脚本。
编程语言转换
AI聊天机器人提供的一项非常实用的功能是能够将程序从一种语言转换到另一种语言。这一功能的典型应用场景包括将旧式语言的代码升级为更现代的编程语言:
Prompt:
请以同时精通COBOL和Python的资深开发者身份,将以下COBOL程序转换为Python:
IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULATE-SS-TAX.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALARY PIC 9(7)V99.
01 SS-TAX PIC 9(7)V99.
PROCEDURE DIVISION.
DISPLAY "Enter employee's salary: ".
ACCEPT SALARY.
COMPUTE SS-TAX = SALARY * 0.062.
DISPLAY "Social Security tax is: #34;, SS-TAX.
STOP RUN.
输出结果示例如下
AI Output:
salary = float(input("Enter employee's salary: "))
ss_tax = salary * 0.062
print("Social Security tax is: #34;, round(ss_tax, 2))
多文件处理与代码重构
如需让AI聊天机器人评估多个文件,只需提供文件名并粘贴每个文件的内容即可:
Prompt:
我的Python脚本使用了位于不同目录下的两个文件,请显示执行conversation.py后的输出结果:
// 文件1:
./phrases/coming_and_going.pydef hi(name):
print(f"Hello, {name}!")
def bye(name):
print(f"Goodbye, {name}!")
// 文件2:./conversation.py
from phrases.coming_and_going import hi, bye
hi("John")
bye("John")
通过这种方法,您可以在单次提示中向AI助手提交多个文件,并要求其重构代码。或者,您也可以让它先"记住"每个文件的内容,然后在后续提示中执行相关操作。
模拟数据库服务器
虽然大多数AI聊天机器人仅能处理代码,但部分先进的模型还能模拟服务器环境,例如数据库、Web服务器和邮件服务器等。请看以下示例提示:
Prompt:
请模拟Microsoft SQL Server环境:
创建名为"politics"的数据库
在该数据库中创建"politicians"表
填充50行数据(1900-2000年间世界各国著名政治家)
包含字段:全名、国家、出生日期、逝世日期(如适用)
创建视图显示寿命最长的3位政治家
生成并执行Transact-SQL命令输出该视图内容
AI Output:
生成的T-SQL脚本:
-- 创建politics数据库
CREATE DATABASE politics;
GO
-- 使用politics数据库
USE politics;
GO
-- 创建politicians表
CREATE TABLE politicians (
id INT PRIMARY KEY,
full_name VARCHAR(50),
country VARCHAR(50),
date_of_birth DATE,
date_of_death DATE
);
-- 此处应包含50条政治家数据插入语句
-- INSERT INTO politicians VALUES (1, 'Winston Churchill', 'United Kingdom', '1874-11-30', '1965-01-24');
-- ...
-- 创建长寿政治家视图
CREATE VIEW longest_living_politicians AS
SELECT TOP 3
full_name,
country,
DATEDIFF(YEAR, date_of_birth, ISNULL(date_of_death, GETDATE())) AS lifespan
FROM politicians
ORDER BY lifespan DESC;
GO
-- 输出视图内容
SELECT * FROM longest_living_politicians;
GO
基于此,您可以进一步添加数据列、创建索引等操作:
Prompt:
为politicians表添加一个"副手"列,并为每行数据更新该字段。
AI Output:
ALTER TABLE politicians ADD second_in_command VARCHAR(255); UPDATE politicians SET second_in_command = CASE name WHEN 'Winston Churchill' THEN 'Clement Attlee' WHEN 'Franklin D. Roosevelt' THEN 'Harry S. Truman' WHEN 'Mao Zedong' THEN 'Lin Biao' ---为每个politicians添加处理ELSE NULL END;
模拟 Web 服务器
部分 AI 聊天机器人还能模拟多种其他服务器和 API 环境。以下是一个模拟 Apache 服务器针对特定浏览器请求头返回响应的示例指令:
Prompt:
请模拟Apache Web服务器对以下HTTP请求头的响应:
GET /example HTTP/1.1 Host: www.example.com
AI Output:
HTTP/1.1 200 OK Date: [current date and time] Server: Apache/2.4.41 (Ubuntu) Last-Modified: [date and time of last modification of the requested resource] Content-Type: [MIME type of the requested resource, e.g. text/html]
以下是某款主流聊天机器人能够模拟的部分服务器和API类型:
非常老旧 | 老旧 | 较新 | 尖端
------------------------------------------------------------------------------------
Telnet HTTP/1.0 RESTful API GraphQL API
FTP SMTP SOAP API GRPC API
POP3 LDAP OAuth 2.0 Docker API
IMAP DHCP OpenAPI (Swagger) Kubernetes API
DNS NTP gRPC-web API Istio API
SNMP RADIUS MQTT API Prometheus API
Syslog SFTP WebSocket API Envoy API
TFTP SSH AWS API Gateway Istio Mixer API
NFS XML-RPC AzureAPIManagement OpenTracing API
SMB JSON-RPC GoogleCloudEndpoints NATS Streaming API
模拟命令行环境
由于 Linux 中的 Shell(或 Windows PowerShell)本质上也是一种编程语言,您可以通过 AI 聊天机器人与其交互,并构建自己的文件系统环境:
Prompt:
请以 Debian Linux 命令行终端的模式响应我的指令(尽量简化说明)。我的第一条命令是:
ls -l
AI Output:
-rw-r--r-- 1 user group 2048 Mar 3 14:23 file1.txt drwxr-xr-x 2 user group 4096 Feb 28 09:12 directory1 -rwx------ 1 user group 16384 Feb 25 19:41 executable1
可尝试其他命令
Prompt:
> touch greeting.txt > echo "hello" > greeting.txt > ls -l
根据其上下文窗口的大小,该AI助手应能(至少暂时性地)记住您所做的更改,最终输出结果应类似于:
AI Output:
-rw-r--r-- 1 user group 2048 Mar 3 14:23 file1.txt drwxr-xr-x 2 user group 4096 Feb 28 09:12 directory1 -rwx------ 1 user group 16384 Feb 25 19:41 executable1 -rw-r--r-- 1 user group 6 Mar 4 16:15 greeting.txt
关于将AI聊天机器人作为虚拟机使用的完整探讨,可参阅engraved.blog网站上的相关文章。
单元测试生成
基于大语言模型(LLM)构建的AI聊天机器人,特别适合用于自动化生成耗时的单元测试。以下是为税务计算程序创建系列单元测试的示例指令:
Prompt:
请以Python软件测试工程师的身份,为以下税务计算程序中的calculate_tax函数编写单元测试:
###
def get_user_inputs():
total_income = float(input('Enter your income (wages, tips, etc.): #39;))
dependent_care_expenses = float(input('Enter your dependent care expenses: #39;))
return total_income, dependent_care_expenses
def calculate_tax(total_income, dependent_care_expenses):
deduction = 12500 # 2020年单身纳税人标准扣除额
...(其余代码省略)...
AI Output:
import unittest
def calculate_tax(total_income, dependent_care_expenses):
# ... (此处为现有计算逻辑代码)
class TestCalculateTax(unittest.TestCase):
def test_low_income_no_expenses(self):
"""测试低收入且无抚养支出的计税情况"""
self.assertEqual(calculate_tax(10000, 0), 0)
def test_mid_income_no_expenses(self):
"""测试中等收入且无抚养支出的计税情况"""
self.assertEqual(calculate_tax(50000, 0), 4476.0)
def test_high_income_no_expenses(self):
"""测试高收入且无抚养支出的计税情况"""
self.assertEqual(calculate_tax(100000, 0), 14776.0)
def test_low_income_with_expenses(self):
"""测试低收入但有抚养支出的计税情况"""
self.assertEqual(calculate_tax(10000, 2000), -400.0)
# ... (其他测试用例)
if __name__ == '__main__':
unittest.main()