Featured image of post OpenAI 测评

OpenAI 测评

能不能用 OpenAI 写博客呢(

OpenAI 测评

本文由 High Ping Network 的小伙伴 sam 进行编撰,首发于 Sam博客

引言

作为2023年的爆炸性事件,Openai这家公司可以说是改变了世界。虽然网络上已经有很多对他们的模型进行了试用和测评的文章,但是经过博主的深度尝试,为大家带来这篇测评

注意事项 / Notice

Openai公司是不对中国(除台湾)提供服务的。

但是估计能看到这个的人都是有能力用到的

本文使用了大量来自GPT的回答作为Example,可能略显冗长,介意的朋友可以前往B站或其他平台寻找测评。

正文

文本生成

英语能力

作为一个英语国家的公司,他的英语文本生成能力毋庸置疑,不管是3.5还是4都具有很好的表现力 以下是一个高中作文题作为示例,各位可以看看:

Q:

假定你是李华。你校英文报就"你是否赞成将业余时间用于参加非学科类校外培训(non-academic extracurricular training)“的话题向全校学生征稿。请你用英文写一篇文章投稿,内容包括:1.你的观点:2.简要说明理由。

CHAT-GPT 3.5:

A:

Should You Spend Your Spare Time on Non-Academic Extracurricular Training?

As a student, I firmly believe that engaging in non-academic extracurricular training during spare time is beneficial for personal growth and development. There are several reasons why I hold this viewpoint.

Firstly, such activities offer opportunities to explore and develop interests beyond the confines of the traditional academic curriculum. While academic studies are undoubtedly important, they often focus on specific subjects and may not cater to individual interests or talents. Non-academic extracurricular training, on the other hand, allows students to pursue diverse passions such as sports, arts, music, or vocational skills. This not only enriches their overall learning experience but also helps them discover their strengths and talents.

Secondly, participating in non-academic extracurricular activities fosters holistic development by nurturing various skills and qualities essential for success in life. Whether it’s teamwork, leadership, time management, or creativity, these activities provide a platform for students to hone a wide range of soft skills that are invaluable in both personal and professional spheres. Moreover, involvement in such training can instill qualities like discipline, perseverance, and resilience, which are crucial for overcoming challenges and achieving goals in any field.

Furthermore, engaging in non-academic extracurricular training promotes a healthy work-life balance. While academic pursuits are undoubtedly important, excessive focus on studies alone can lead to burnout and hinder overall well-being. Participating in activities outside the academic realm provides students with a much-needed break from their routine studies, allowing them to recharge and rejuvenate their minds. This balance not only enhances academic performance but also contributes to overall happiness and satisfaction.

In conclusion, I believe that dedicating spare time to non-academic extracurricular training is highly beneficial for students. It not only broadens their horizons and cultivates diverse skills but also promotes a balanced and fulfilling lifestyle. Therefore, I encourage my fellow students to seize the opportunities offered by such activities and make the most of their spare time for personal growth and development.

Sincerely,

Li Hua

可以看到他非常优雅的使用了总分总的结构,并且使用了大量的高级但属于正常范畴的词汇。 这很议论文

中文能力

但是对于中文能力,GPT就有点回天乏术了,同样我们使用一篇高中作文作为示例

Q:

《现代汉语词典》:榜样是作为仿效的人或事例(多指好的)。

在生活中,有人认为榜样的价值就在于可以复制,也有人对此说法不以为然。

对此争议,你怎么看?请写一篇议论文,谈谈你的思考。字数800字

CHAT-GPT 3.5:

A:

榜样的重要性与争议

榜样,作为一种社会文化现象,在塑造个体行为和价值观方面起着重要作用。《现代汉语词典》将其定义为作为仿效的人或事例,尤其是好的榜样。然而,在现实生活中,对榜样的价值和作用存在着争议。一些人认为榜样的意义在于可以复制,而另一些人则持不同意见。本文将探讨榜样的重要性及其争议,以及我个人的看法。

首先,让我们探讨榜样的积极价值。榜样可以激励人们向更高的目标努力。当一个人看到身边的榜样取得成功,展现出良好的品德和行为,他们会受到启发,产生对自身能力和潜力的信心,从而激发内在动力,追求自己的目标。此外,榜样还可以为人们树立正确的道德观念和行为准则。通过观察他人的行为,学习他们的优点和成功经验,人们可以提升自己的道德素养,形成正确的行为模式,使社会更加和谐。

然而,榜样的复制并非总是积极的。一些人可能过度模仿榜样,失去了自己的个性和创造力。他们可能盲目地模仿他人,而不是根据自己的情况和能力制定适合自己的目标和计划。此外,榜样并非都是完美的,他们也会犯错和犯错。如果盲目模仿榜样,可能会重复他们的错误,造成不良后果。因此,盲目模仿榜样并不总是一个好主意。

对于榜样的争议,我认为关键在于如何正确地对待和利用榜样。首先,我们应该明确榜样的作用,将其作为一种借鉴和启发的资源,而不是盲目模仿。我们应该学会从榜样的成功经验中汲取经验教训,根据自己的情况和能力制定适合自己的发展路径。其次,我们应该理性地对待榜样,不将其神化或过分理想化。我们应该意识到榜样也是普通人,他们也有自己的局限性和缺点。因此,我们应该学会从榜样的优点和成功经验中学习,同时也要理性地对待他们的缺点和错误。

综上所述,榜样在塑造个体行为和价值观方面具有重要作用,但其作用和价值存在争议。正确地对待和利用榜样,可以为个体的成长和发展提供有益的借鉴和启发。因此,我们应该理性地对待榜样,不盲目模仿,同时也不过分理想化,以实现个体的自我发展和社会的和谐稳定。

CHAT-GPT 4:

A:

榜样的价值:借鉴与超越

榜样,作为一种仿效的人或事例,一直以来都备受争议。有人认为榜样的价值在于可以复制,而另一些人则对此说法不以为然。然而,我认为榜样的真正价值在于可以供他人借鉴并超越。在生活中,榜样的存在可以激发人们的积极向上的动力,帮助我们树立正确的价值观和行为准则,发现自己的潜力和可能性,促进社会的进步和发展。

榜样可以激发人们的积极向上的动力。当我们看到别人取得了成功,我们会被他们的努力和成就所鼓舞。例如,历史上的杰出人物马克思,他的思想和理论对世界产生了深远的影响。通过模仿榜样的行为和思维方式,我们可以学习到他们的成功经验,并将其应用到自己的生活中。这样,我们可以更加努力地追求自己的目标。

榜样可以帮助我们树立正确的价值观和行为准则。优秀的榜样往往具备良好的品德和道德观念。例如,历史上的圣雄甘地,他以非暴力和和平抵抗的方式领导印度独立运动,成为全世界的榜样。通过学习他们的行为和价值观,我们可以更好地认识到什么是正确的,什么是值得追求的。这种学习不仅可以指导我们的行为,还可以塑造我们的人格,使我们成为更好的人。

榜样还可以帮助我们发现自己的潜力和可能性。当我们看到别人取得了成功,我们会意识到自己也有可能达到同样的成就。例如,历史上的爱因斯坦,他的理论革命了物理学的发展,成为科学界的榜样。榜样的存在让我们相信,只要我们付出努力,我们也可以取得成功。这种信念可以激发我们的自信心,让我们敢于追求自己的梦想,并发掘自己的潜力。

榜样的存在可以促进社会的进步和发展。当一个人成为榜样,他的成功不仅仅是个人的成就,还可以影响和激励更多的人。例如,历史上的罗斯福总统,他的领导力和改革精神推动了美国的经济复苏和社会进步。这种影响力可以传递给更多的人,形成良好的社会风气和价值观。通过榜样的力量,社会可以不断进步,人们可以共同追求更高的目标。

综上所述,榜样的价值在于可以供他人借鉴并超越。榜样可以激发人们的积极向上的动力,帮助我们树立正确的价值观和行为准则,发现自己的潜力和可能性,促进社会的进步和发展。因此,我们应该积极地寻找和学习榜样,并将他们的经验和智慧应用到自己的生活中。这样,我们才能不断进步,成为更好的自己。

我们可以看到作为Openai公司的最牛模型,GPT-4的文章明显优于3.5,他使用了真实世界中的例子,而不仅仅是干巴巴的说话。但是俩个模型都存在一定的问题。尽管他们都使用了标准的总分总结构来写这篇议论文,但是他们的论述都不太与生活沾边,而且意义升华的太快没有合格的铺垫,基本为:个人-社会。这样子的跳跃太快并不符合议论文所需。

不过拿来水水寒假暑假作业的GPT-4还是够用了

代码能力

代码生成能力

作为引爆互联网的时代顶流,他的代码生成能力非常不错。常用语言基本上他都能非常好的给出代码,尽管有时候代码不能运行,但是你把报错丢给他,他都能非常好的修复

以下是一些语言的范例(模型均为3.5):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import socket
import threading
import base64
import markdown2
import emoji

# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定 IP 和端口
server_socket.bind(('0.0.0.0', 5555))

# 监听连接
server_socket.listen()

# 存储连接的客户端和对应的地址
clients = {}
addresses = {}

# 发送消息给指定客户端
def send_to_client(message, client_socket):
    try:
        client_socket.send(message)
    except:
        pass

# 广播消息给所有客户端
def broadcast(message, client_socket=None):
    for client in clients:
        if client != client_socket:
            try:
                client.send(message)
            except:
                remove_client(client)

# 移除断开连接的客户端
def remove_client(client_socket):
    addr = clients[client_socket]
    del clients[client_socket]
    del addresses[str(addr)]
    broadcast(f"Client {addr} has left the chat.")

# 处理客户端的消息
def handle_client(client_socket, addr):
    while True:
        try:
            message = client_socket.recv(1024)
            if not message:
                break
            decoded_message = base64.b64decode(message).decode()

            # 判断消息类型并处理
            if decoded_message.startswith("/p2p "):
                target_addr, message_content = decoded_message[len("/p2p "):].split(": ", 1)
                if target_addr in addresses:
                    target_socket = addresses[target_addr]
                    send_to_client(message, target_socket)
                else:
                    client_socket.send(f"Client {target_addr} not found.".encode())
            elif decoded_message.startswith("/broadcast "):
                broadcast_message_content = decoded_message[len("/broadcast "):]
                broadcast_message = f"Broadcast from {addr}: {broadcast_message_content}"
                broadcast(base64.b64encode(broadcast_message.encode()), client_socket)
            else:
                broadcast_message = f"{addr}: {emoji.emojize(markdown2.markdown(decoded_message))}"  # 使用emoji库
                broadcast(base64.b64encode(broadcast_message.encode()), client_socket)

        except:
            remove_client(client_socket)
            break

# 接受客户端连接
while True:
    client_socket, addr = server_socket.accept()
    clients[client_socket] = addr
    addresses[str(addr)] = client_socket
    broadcast(f"Client {addr} has joined the chat.")
    print(f"Connection from {addr}")

    # 启动一个新线程来处理客户端
    client_thread = threading.Thread(target=handle_client, args=(client_socket, addr))
    client_thread.start()

这是一个聊天软件的服务器的实现,我已经将这个软件的全部代码上传到了GitHub仓库,感兴趣的朋友可以去看看。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Chunk Upload</title>
</head>
<body>
    <input type="file" id="fileInput">
    <button onclick="uploadFile()">Upload</button>

    <script>
        function uploadFile() {
            const fileInput = document.getElementById('fileInput');
            const file = fileInput.files[0];
            const chunkSize = 1024 * 1024; // 1MB chunk size
            const totalChunks = Math.ceil(file.size / chunkSize);
            let currentChunk = 0;

            const uploadChunk = () => {
                const start = currentChunk * chunkSize;
                const end = Math.min(start + chunkSize, file.size);
                const chunk = file.slice(start, end);

                const formData = new FormData();
                formData.append('file', chunk);
                formData.append('chunk', currentChunk);
                formData.append('totalChunks', totalChunks);

                fetch('upload.php', {
                    method: 'POST',
                    body: formData
                })
                .then(response => response.json())
                .then(data => {
                    currentChunk++;
                    if (currentChunk < totalChunks) {
                        uploadChunk();
                    } else {
                        console.log('File upload complete');
                    }
                })
                .catch(error => {
                    console.error('Error:', error);
                });
            };

            uploadChunk();
        }
    </script>
</body>
</html>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$targetDir = 'uploads/';
$fileName = $_FILES['file']['name'];
$chunkNumber = $_POST['chunk'];
$totalChunks = $_POST['totalChunks'];
$chunkSize = 1024 * 1024; // 1MB chunk size
$targetFile = $targetDir . $fileName . '.part' . $chunkNumber;

move_uploaded_file($_FILES['file']['tmp_name'], $targetFile);

if ($chunkNumber == $totalChunks - 1) {
    // All chunks uploaded, merge them
    $outputFile = $targetDir . $fileName;
    $outputStream = fopen($outputFile, 'wb');

    for ($i = 0; $i < $totalChunks; $i++) {
        $inputFile = $targetDir . $fileName . '.part' . $i;
        $inputStream = fopen($inputFile, 'rb');
        stream_copy_to_stream($inputStream, $outputStream);
        fclose($inputStream);
        unlink($inputFile);
    }

    fclose($outputStream);
    echo json_encode(['success' => true]);
} else {
    echo json_encode(['success' => false]);
}
?>

这是一段网页分段上传文件的代码示例,包括了 PHP+HTML+JavaScript。但是这段代码我并没有进行可用性测试,我并不知道他的可用性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

echo "请输入隧道名:"
read -r filename

echo "请输入你的私钥:"
read -r private_key

echo "请输入你监听的端口:"
read -r listen_port

echo "请输入你的dn42 IP:"
read -r your_dn42_ip

echo "请输入对方的dn42 IP:"
read -r peer_dn42_ip

echo "请输入对方的公钥:"
read -r peer_public_key

echo "请输入对方的endpoint:"
read -r peer_endpoint

content="[Interface]
PrivateKey = $private_key
ListenPort = $listen_port
PostUp = ip addr add $your_dn42_ip peer $peer_dn42_ip dev %i
Table = off

[Peer]
PublicKey = $peer_public_key
Endpoint = $peer_endpoint
AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64"

echo "$content" | sudo tee "/etc/wireguard/$filename.conf" > /dev/null

echo "内容已写入到 /etc/wireguard/$filename.conf 文件中。"

sudo systemctl enable "wg-quick@$filename"
wg-quick up $filename
echo "隧道 $filename 已建立。"

wg

这是一段 Shell(也就是俗称的脚本)代码,非常优雅的实现了 WireGuard 的一个隧道建立。

尽管他的代码不错,但是建议不要应用于大型项目,他的代码能力仍具有一定的局限性,项目大了很容易出问题。

代码阅读能力

我们使用刚刚的 Python 代码作为例子给 GPT-3.5 让他尝试理解,下面是他的回答:

这段代码是一个简单的基于 Socket 的聊天服务器。它使用 Python 的 socket 模块来创建服务器,并允许多个客户端连接和发送消息。

首先,代码导入了一些必要的模块,包括 socket、threading、base64、markdown2 和 emoji。然后,创建了一个服务器 socket 对象,使用 AF_INET 和 SOCK_STREAM 参数来指定使用 IPv4 地址和 TCP 协议。

接下来,服务器绑定到IP地址 ‘0.0.0.0’ 和端口号 5555 上,并开始监听连接请求。clients 和 addresses 字典用于存储连接的客户端和对应的地址。

代码中定义了一些函数和方法来处理客户端的连接和消息。 send_to_client 函数被用于将消息发送给指定的客户端,broadcast 函数被用于将消息广播给所有连接的客户端,remove_client 函数用于移除断开连接的客户端。

handle_client 函数是在新线程中启动的,用于处理每个连接的客户端。它通过接收客户端发送的消息,并根据消息的内容进行不同的处理。如果收到的消息以 “/p2p " 开头,它会将消息转发给指定的客户端。如果收到的消息以 “/broadcast " 开头,它将广播消息给所有客户端。否则,它会将消息以广播形式发送给所有客户端。

最后,通过一个无限循环来接受客户端的连接,并为每个连接的客户端启动一个新线程来处理。每当有新的客户端连接成功,服务器会广播一个加入聊天室的消息,并打印出连接的信息。

这段代码简单地演示了一个聊天服务器,但在现实的应用中还需要添加更多的功能和安全性检查。这包括验证客户端发送的消息、处理异常情况以及保护服务器免受恶意攻击。

我们可以看到,他非常完美的get到了代码的意思,还推测了代码的用途,并给出了安全建议。

或许这就是他为什么能火罢

图片生成

本次测试模型为Dell-E-2

以下为一些测试图片 IMG_20240128_121534_386.jpg

IMG_20240128_121517_855.jpg

IMG_20240128_121524_445.jpg

IMG_20240128_121432_984.jpg

IMG_20240128_121437_668.jpg

IMG_20240128_121509_439.jpg

IMG_20240128_121449_545.jpg 我们可以看到,图片生成效果大抵还是不错的。 但是作为AI绘图的老毛病,画人和画手多少还是有点大病。特别是人,就像是拼贴画一样,这里一个部件那里一个部件。整个看下来非常的不协调。 总的来说作为生成式的绘图AI他已经非常不错了,完全可以日常使用。只要他不涉及到绘制人像

总结

作为一个工作助手,Openai提供的服务是完全够用了,语言能力能看,代码能力耐打,图片生成能用。尽管还有不少的进步空间,但是Openai一直在努力。希望他们以后会带来更加震撼的产品。

番外

你甚至可以用来当作化学实验室使用 Screenshot_20240128_131318_com.openai.chatgpt.jpg 是不是还挺好玩 后续会有一篇文章来更新Openai提示词

欢迎加入 High Ping 大家庭:

Licensed under CC BY-NC-SA 4.0
我们所经历的每个平凡的日常,也许就是连续发生的奇迹。
使用 Hugo 构建
主题 StackJimmy 设计