封面/Pixabay
作者/孙刺猬
前言
现在我本人有几个可访问的AI模型(免费且无需科学上网),就对他们的代码编写能力进行了简单测试/测评。
目前参与测试的包含:
另外也请小伙伴帮忙测试了下OpenAI的ChatGPT(3.5版)作为对照
在独立的初始会话中测试如下prompt:
请使用Python实现下述功能:4核并行;使用multiprocessing库;
在 /user/aaa/files/ 路径下有 AAA.*.txt 文件一千多个,
对每一个文件:输出文件名,
用函数 load_data() 读取其中数据(此函数不需要你编写),
使用函数 plot_data() 进行绘图(此函数不需要你编写);
输出程序运行时间;每个并行进程单独使用文件保存日志;
脚本中包含注释
实际我在代码中修改路径,根据我的环境改成了 '/Users/XXX/data/temp/' (问话时象征性保护信息)。
放了九个名字比较随机的文件,AAA.1.txt AAA.2.txt … AAA.142.txt,里面随便打了两列数值。
prompt中增加“(此函数不需要你编写)”是因为有AI不够智能没有理解清我的意图,花了大精力在那俩函数上。实际中真碰到这情况也应该是细化要求,那我干脆就在提示中加上了。
结果
各家的结果先贴出来,如果不想细看可以直接跳到下一部分——“总结”,会有整体的对比表。
我自己是印象笔记高级账户,除了开源的Open Assistant不需要额外申请外,也是印象笔记先给我AI用(他家甚至不搞什么“测试”,直接全线上线!就冲这个胆识也要夸一夸~),所以把他放第一个
印象笔记的AI助手是全线推开的,只要使用最新版本app(必须是桌面版,移动端还不行)“超级笔记”就能调用。
有token限制,但我没记住具体是多少。
import os
import time
import multiprocessing as mp
# 加载数据函数
def load_data(file_path):
# 此函数不需要编写,这里只是简单的示例
with open(file_path, 'r') as f:
data = f.readlines()
return data
# 绘图函数
def plot_data(file_path, data):
# 此函数不需要编写,这里只是简单的示例
import matplotlib.pyplot as plt
plt.plot(data)
plt.savefig(file_path + '.png')
# 处理单个文件的函数
def process_file(file_path, log_file_path):
start_time = time.time()
# 读取数据
data = load_data(file_path)
# 绘制图形
plot_data(file_path, data)
# 记录日志
with open(log_file_path, 'w') as f:
f.write("Processed {} in {:.2f} seconds".format(file_path, time.time() - start_time))
# 主函数
if __name__ == '__main__':
# 设置路径和文件名模式
path = '/Users/XXX/data/temp/'
file_pattern = 'AAA.*.txt'
# 获取文件列表
file_list = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt') and f.startswith('AAA')]
# 创建日志文件夹
log_folder = os.path.join(path, 'logs')
if not os.path.exists(log_folder):
os.makedirs(log_folder)
# 设置进程池大小
pool = mp.Pool(processes=4)
# 处理每个文件
for file_path in file_list:
log_file_path = os.path.join(log_folder, os.path.basename(file_path) + '.log')
pool.apply_async(process_file, args=(file_path, log_file_path))
# 关闭进程池
pool.close()
# 等待所有进程完成
pool.join()
# 输出程序运行时间
print("Total time: {:.2f} seconds".format(time.time() - start_time))
简评:
- 文件搜索完整,路径补充合理,日志按处理文件名保存,并行逻辑完整
- 要是注释和上一行代码间能默认加个空行就更好了,看起来不费眼
这个是完全开源的工具,还可以每天上去贡献点儿训练和标定样本,我挺看好他的,开源大 法好~!
不过目前中文占比还是太少了,经常问他个中文问题,他虽然看懂了但拿英文回答,让他翻译成中文或用中文回答也不一定顶用。
建议大家没事也多去搞俩任务做做,早日让他中文妥了~~
https://open-assistant.io/
当然,细说的话他家模型不只一个,甚至自己可以定制一些参数。但这里咱仅从使用角度出发,默认是啥就用啥~(而且我也确实不知道啥模型效果最好嘛)
如果不想注册,不想做任务做贡献,HuggingFace也接入了他家AI,点开就能用:
https://huggingface.co/chat/
import multiprocessing as mp
from datetime import timedelta
def process(file):
start = time.time()
filename, ext = os.path.splitext(os.path.basename(file))
data = load_data(file) # replace with your own load_data function
result = plot_data(data) # replace with your own plot_data function
end = time.time()
run_time = "{:.2f}s".format(end - start)
print("Processed {} in {}. Data saved to file.".format(filename, run_time))
if __name__ == '__main__':
files = [f for f in os.listdir("/Users/XXX/data/temp/") if f.startswith('AAA') and f.endswith('.txt')]
chunksize = len(files) // 4
processes = []
for i in range(0, len(files), chunksize):
chunk = files[i:i + chunksize]
p = mp.Process(target=process, args=(chunk,))
p.start()
processes.append(p)
for p in processes:
p.join()
简评:
- 在并行部分搞得比较复杂,做了 chunksize 判断,但是造成参数传递 chunk 和 file 不一致的问题,需要从逻辑上再修改,比如把process里的file搞成filelist啥的,本来比较简单的问题给复杂化了
这是科大讯飞搞的大预言模型,申请-通过 流程比较快,是需要申请内测的几个中最早给我内测资格的。
因为科大本身做语言识别、翻译等不错,想来也有优势。
https://xinghuo.xfyun.cn/
import multiprocessing as mp
import time
import numpy as np
from matplotlib import pyplot as plt
def load_data(file_path):
# 读取文件数据的函数,根据实际情况编写
return data
def plot_data(data):
# 绘图函数,根据实际情况编写
plt.plot(data)
plt.show()
if __name__ == '__main__':
# 获取文件路径列表
dir_path = '/Users/XXX/data/temp/'
fileNames = [fn for fn in os.listdir(dir_path) if fn.endswith('AAA.*.txt')]
num_cores = mp.cpu_count() # 获取CPU核心数
tic = time.time() # 记录程序开始时间
results = [] # 结果列表,用于保存每个文件的结果
for i, file_name in enumerate(fileNames):
# 对于每个文件,创建一个进程并运行load_data和plot_data函数
p = mp.Process(target=lambda: (load_data(os.path.join(dir_path, file_name)), plot_data(load_data(os.path.join(dir_path, file_name)))))
p.start() # 启动进程
results.append((p, i)) # 将进程对象和文件名添加到结果列表中
p.join() # 等待进程结束
tic = time.time()-tic # 计算程序运行时间
print('Total time taken: {} seconds'.format(tic)) # 输出程序运行时间
for result in results:
result[1] += num_cores # 每个进程使用不同的文件保存日志,因此需要将文件名加1以便对应不同的文件。这里使用result[1]作为文件名。
简评:
- 并行逻辑有问题,p.join 放在循环里,这种似是而非的代码能把初学者整死……
- 让他用4核,用了mp.cpu_count(),但后面用的是mp.Process 不是 mp.Pool 相当于num_cores就没用到,虚晃我一枪
- 最后似乎是没生成完整,但大家都公平点儿,不给他额外机会了
这是昆仑搞的模型,在发公布会的时候敢直接搞现场演示,可以说自己底气很足呀。
他家给内测也比较干脆,而且是在MacOS下(Windows未测试)少数能区分 【输入法的回车】和【聊天框的回车】的。(比如我中文输入法中希望打个import,需要出来选项后点回车键或者shift键,此时容易一点回车直接把半截内容发给AI…)。
https://neice.tiangong.cn/
import multiprocessing as mp
import time
def load_data(file_path):
# 读取文件数据,此处省略
pass
def plot_data(data):
# 绘制数据
pass
def main():
# 设置进程数为4
num_processes = 4
# 设置每个进程的工作目录
work_dir = f'/Users/XXX/data/temp/'
# 创建进程列表
processes = [mp.Process(target=load_data, args=(work_dir+'/'+file_name, )) for file_name in os.listdir(work_dir)]
# 创建一个进程管理器,用于控制进程的启动和停止
process_manager = mp.Manager()
# 创建一个文件,用于记录进程的日志
log_file = open(f'{work_dir}/log.txt', 'a')
# 启动所有进程
for process in processes:
process.start()
process.join()
# 关闭所有进程
for process in processes:
process.terminate()
# 输出程序运行时间
end_time = time.time()
print('程序运行时间:', end_time - start_time)
# 关闭进程管理器
process_manager.shutdown()
# 关闭日志文件
log_file.close()
if __name__ == '__main__':
start_time = time.time()
main()
end_time = time.time()
print('程序运行时间:', end_time - start_time)
简评:
- 并行逻辑不好,声明4核但无效,每个进程都直接 process.join
百度家的,让我排了老久的队才给的测试资格……
https://yiyan.baidu.com/
直接看结果吧
import multiprocessing
import os
import time
def load_data(filename):
# 从文件中读取数据,可以根据具体的数据格式进行修改
data = []
with open(filename, 'r') as f:
for line in f:
data.append(line.strip())
return data
def plot_data(data, title, x_axis, y_axis):
# 绘制数据的图形
import matplotlib.pyplot as plt
plt.plot(x_axis, y_axis, label='Data')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title(title)
plt.legend()
plt.show()
def run_script():
# 初始化进程池
pool = multiprocessing.Pool(processes=4)
# 并行读取数据,可以使用循环进行处理
for filename in os.listdir('/Users/XXX/data/temp/'):
if filename.endswith('.txt'):
data = load_data(filename)
pool.apply_async(plot_data, args=(data, 'Data', 'X-axis', 'Y-axis'))
# 关闭进程池
pool.close()
pool.join()
# 输出程序运行时间
print('Script finished in {} seconds'.format(time.time() - start_time))
if __name__ == '__main__':
start_time = time.time()
run_script()
简评:
这是大家熟悉的了,就不做说明。
但我没有账号,是请同事帮忙测的
import multiprocessing
import os
import time
import os
import time
import multiprocessing
# 定义文件路径和要保存日志的文件夹路径
file_path = "/Users/XXX/data/temp/"
log_path = "/Users/XXX/data/temp/"
# 加载数据函数(不需要编写)
def load_data(file):
# 加载文件中的数据
with open(file, "r") as f:
data = f.read()
return data
# 绘图函数(不需要编写)
def plot_data(file, data):
# 绘制数据图表
# 在这里,你可以使用你自己的绘图代码
pass
# 并行处理文件函数
def process_file(file):
# 获取文件名
file_name = os.path.basename(file)
# 加载数据
data = load_data(file)
# 绘制数据图表
plot_data(file_name, data)
# 记录运行时间
end_time = time.time()
# 保存日志
with open(os.path.join(log_path, f"{file_name}.log"), "w") as f:
f.write(f"Processing {file_name} took {end_time - start_time} seconds")
if __name__ == "__main__":
# 获取所有.txt文件的列表
files = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.endswith(".txt")]
# 开始时间
start_time = time.time()
# 创建进程池
pool = multiprocessing.Pool(processes=4)
# 并行处理所有文件
pool.map(process_file, files)
# 关闭进程池
pool.close()
pool.join()
# 结束时间
end_time = time.time()
# 输出程序运行时间
print(f"Total time: {end_time - start_time} seconds")import os
import time
import multiprocessing
# 定义文件路径和要保存日志的文件夹路径
file_path = "/Users/XXX/data/temp/"
log_path = "/Users/XXX/data/temp/"
# 加载数据函数(不需要编写)
def load_data(file):
# 加载文件中的数据
with open(file, "r") as f:
data = f.read()
return data
# 绘图函数(不需要编写)
def plot_data(file, data):
# 绘制数据图表
# 在这里,你可以使用你自己的绘图代码
pass
# 并行处理文件函数
def process_file(file):
# 获取文件名
file_name = os.path.basename(file)
# 加载数据
data = load_data(file)
# 绘制数据图表
plot_data(file_name, data)
# 记录运行时间
end_time = time.time()
# 保存日志
with open(os.path.join(log_path, f"{file_name}.log"), "w") as f:
f.write(f"Processing {file_name} took {end_time - start_time} seconds")
if __name__ == "__main__":
# 获取所有.txt文件的列表
files = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.endswith(".txt")]
# 开始时间
start_time = time.time()
# 创建进程池
pool = multiprocessing.Pool(processes=4)
# 并行处理所有文件
pool.map(process_file, files)
# 关闭进程池
pool.close()
pool.join()
# 结束时间
end_time = time.time()
# 输出程序运行时间
print(f"Total time: {end_time - start_time} seconds")def load_data(filename):
# 从文件中读取数据,可以根据具体的数据格式进行修改
data = []
with open(filename, 'r') as f:
for line in f:
data.append(line.strip())
return data
def plot_data(data, title, x_axis, y_axis):
# 绘制数据的图形
import matplotlib.pyplot as plt
plt.plot(x_axis, y_axis, label='Data')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title(title)
plt.legend()
plt.show()
def run_script():
# 初始化进程池
pool = multiprocessing.Pool(processes=4)
# 并行读取数据,可以使用循环进行处理
for filename in os.listdir('/Users/XXX/data/temp/'):
if filename.endswith('.txt'):
data = load_data(filename)
pool.apply_async(plot_data, args=(data, 'Data', 'X-axis', 'Y-axis'))
# 关闭进程池
pool.close()
pool.join()
# 输出程序运行时间
print('Script finished in {} seconds'.format(time.time() - start_time))
if __name__ == '__main__':
start_time = time.time()
run_script()
简评:
- process_file 函数中的 start_time 未定义
- 整体格式很好,用pool.map 也是我最开始想的比较方便的操作
结果
把一些条目列出来整合比较一下
如果让我排个序,排名是这样的:
Open Assistant 的拉胯我是没想到的,可能和我用中文提问有关?但在具体使用时肯定中文方便。
印象笔记的牛我是万万没有想到的!我之前用他试过很多生成介绍、段落概述啥的,感觉能力一般,现在我对他好感可是特别高~
其他几家国产大模型还有不少有待提高的地方……至少在代码生成这方面,单次提供复杂提示,目前给出的结果不尽人意……
-----广告赞助商-----
声明:欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7675)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。
欢迎加入气象学家交流群
请备注:姓名/昵称-单位/学校-研究方向