分类 大观园 下的文章

1. 开启udp端口

通过ssh输入下方命令,端口是和上面的配置文件一致:

firewall-cmd --zone=public --add-port=6900/udp --permanent
firewall-cmd --zone=public --add-port=6443/udp --permanent
firewall-cmd --zone=public --add-port=5443/udp --permanent
firewall-cmd --zone=public --add-port=808/udp --permanent
firewall-cmd --zone=public --add-port=909/udp --permanent
firewall-cmd --reload

2. 编辑并清空frps.ini文件

# https://www.eyuyun.com/214.html
[common]
bind_addr = 0.0.0.0
bind_port = 5443
kcp_bind_port = 5443
dashboard_port = 6443

#认证超时时间,默认900秒
authentication_timeout = 900

#服务端面板的登录用户名,自行设置,后面有用。
dashboard_user = YourUsername

#服务端面板的登录密码,自行设置,后面有用。
dashboard_pwd = YourPassword

#http端口,不要设置80,否则和宝塔面板端口号冲突
vhost_http_port = 808

#https端口,不要设置443,否则和宝塔面板端口号冲突
vhost_https_port = 909

#相当于客户端连接服务端的通关密码,随便设置,后面有用。
token = YourToken

max_pool_count = 50
tcp_mux = true

#你绑定域名的一级域名,假如你给远程桌面绑定frp.baidu.com,这里就填baidu.com。以后你就可以通过frp.baidu.com连接远程桌面了。还不懂?不急,后面一步步来,先照做就行了。

3. 加入后台启动

# 后台启动
nohup /root/frp/frps -c /root/frp/frps.ini &

4. 结束frp服务端命令

cd /root/frp
pkill frps

5. FRPC 配置

# frpc configuration
[common]
# Frps(Frp服务端)的IP地址
server_addr = nas.xxx.com
# Frps(Frp服务端)设置的端口
server_port = 5443
# Frps(Frp服务端)设置令牌
token = YourToken
log_file = /dev/null
log_level = info
log_max_days = 3
tcp_mux = true
protocol = tcp
login_fail_exit = false
user = YourUsername

# 名称唯一即可
[web]
# 转发本地http服务
type = tcp
# 本地服务器ip
local_ip = 192.168.50.1
# 本地要转发的端口(群晖默认5000为http,5001为https)
local_port = 80
remote_port = 3300
use_encryption = true
use_compression = true
# custom_domains = nas.tenlonstudio.com  //绑定的域名(这里直接填服务器IP也没有问题)

[nas]
type = tcp
local_ip = 192.168.50.235
local_port = 5000
remote_port = 5000
use_encryption = true
use_compression = true
[drive]
type = tcp
local_ip = 192.168.50.235
local_port = 6690
remote_port = 6690
use_encryption = true
use_compression = true

[人人美剧]
type = tcp
local_ip = 192.168.50.235
local_port = 3001
remote_port = 3001
use_encryption = true
use_compression = true

[aria2下载]
type = tcp
local_ip = 192.168.50.235
local_port = 3080
remote_port = 3080
use_encryption = true
use_compression = true


git archive -o E:/MyWork/WorkDoc/软件项目/云管家-芳子/fangzi_62c58952_f3a7ee2f.zip f3a7ee2f $(git diff --name-only 62c58952 f3a7ee2f)


查看id

首先你得知道版本之间的commit id

git log –pretty=oneline


 $ git log --pretty=oneline

1



差异文件并打包

git diff这个命令能比较两个提交之间的差异,使用–name-only参数可以只显示文件名。由于commit id 太长 一般复制前面7位 就可以了 例如:


$ git diff 61d2112 f3c0f99 --name-only

//后续打包太麻烦 不采用

1

2


git diff列出两个提交之间差异的文件


这个输出结果非常有意思,就是差异文件的相对地址,不正好是压缩命令的参数吗?于是立马使用压缩命令


$ zip update.zip 所有的文件…

就能成功打包了。只是这样的话也太麻烦了吧,幸好linux有提供一个命令xargs能将前一个命令的输出转成另外一个命令的参数,按照这个思路就非常简单了。


$ git diff 61d2112 f3c0f99 --name-only | xargs zip update.zip

1



补充zip 打包解压命令

linux zip命令的基本用法是:

zip [参数] [打包后的文件名] [打包的目录路径]


linux zip命令参数列表:

-a 将文件转成ASCII模式

-F 尝试修复损坏的压缩文件

-h 显示帮助界面

-m 将文件压缩之后,删除源文件

-n 特定字符串 不压缩具有特定字尾字符串的文件

-o 将压缩文件内的所有文件的最新变动时间设为压缩时候的时间

-q 安静模式,在压缩的时候不显示指令的执行过程

-r 将指定的目录下的所有子目录以及文件一起处理

-S 包含系统文件和隐含文件(S是大写)

-t 日期 把压缩文件的最后修改日期设为指定的日期,日期格式为mmddyyyy


举例:说个最常用的吧,打包/opt/abc目录到/opt/abc.zip


# zip -r /opt/abc.zip /opt/abc/    //参数一般只要有-r

1

unzip命令的基本语法是:unzip [参数] zip文件

简单例子:

把本目录下的test.zip文件解压:


unzip test.zip

1

参数列表:

-l 列出压缩文件所包含的内容

-v 显示详细的执行过程

————————————————

版权声明:本文为CSDN博主「bobby1994」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/bestkilly/article/details/52413772


sql查询数据库中所有表的记录条数,以及占用磁盘空间大小。


SELECT TableName = obj.name, TotalRows = prt.rows, [SpaceUsed(KB)] = SUM(alloc.used_pages)*8 
FROM sys.objects obj JOIN sys.indexes idx on obj.object_id = idx.object_id JOIN sys.partitions prt on obj.object_id = prt.object_id 
JOIN sys.allocation_units alloc on alloc.container_id = prt.partition_id 
WHERE obj.type = 'U' AND idx.index_id IN (0, 1)GROUP BY obj.name, prt.rows ORDER BY TotalRows DESC



1、查看某个数据库,直接执行存储过程sp_spaceused即可

exec sp_spaceused;

2、查看某个表,在存储过程后面加上表名即可

EXEC sp_spaceused 'T_XXXXX';


3、查看该数据库中的所有表,可以写一个存储过程,然后执行即可

存储过程如下:


SET ANSI_NULLS ON


GO


SET QUOTED_IDENTIFIER ON


GO


-- =============================================


-- 说明:更新查询数据库中各表的大小,结果存储到数据表中


-- =============================================


CREATE PROCEDURE [dbo].[P_UpdateTableSpaceInfo]


AS


BEGIN


--查询是否存在结果存储表


IF NOT EXISTS (SELECT * FROM sysobjects where id = OBJECT_ID(N'temp_tableSpaceInfo')


AND OBJECTPROPERTY(id, N'IsUserTable') = 1)


BEGIN


--不存在则创建


CREATE TABLE temp_tableSpaceInfo


(name NVARCHAR(128),


rows char(11),


reserved VARCHAR(18),


data VARCHAR(18),


index_size VARCHAR(18),


unused VARCHAR(18))


END


--清空数据表


DELETE FROM temp_tableSpaceInfo


--定义临时变量在遍历时存储表名称


DECLARE @tablename VARCHAR(255)


--使用游标读取数据库内所有表表名


DECLARE table_list_cursor CURSOR FOR


SELECT name FROM sysobjects


WHERE OBJECTPROPERTY(id, N'IsTable') = 1 AND name NOT LIKE N'#%%' ORDER BY name


--打开游标


OPEN table_list_cursor


--读取第一条数据


FETCH NEXT FROM table_list_cursor INTO @tablename


--遍历查询到的表名


WHILE @@FETCH_STATUS = 0


BEGIN


--检查当前表是否为用户表


IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(@tablename)


AND OBJECTPROPERTY(id, N'IsUserTable') = 1)


BEGIN


--当前表则读取其信息插入到表格中


EXECUTE sp_executesql N'INSERT INTO temp_tableSpaceInfo


EXEC sp_spaceused @tbname', N'@tbname varchar(255)', @tbname = @tablename


END


--读取下一条数据


FETCH NEXT FROM table_list_cursor INTO @tablename


END


--释放游标


CLOSE table_list_cursor


DEALLOCATE table_list_cursor


END


GO


执行,查看:


EXEC P_UpdateTableSpaceInfo


SELECT * FROM temp_tableSpaceInfo;



————————————————

版权声明:本文为CSDN博主「西伯利亚天狼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/grh_168/article/details/110479604


一、数据库查询常用表

--查询数据表
select * from

(

select convert(varchar(4000),t1.FKERNELXML.query('//TableName')) as  'Item',t1.FKERNELXML,t2.FNAME, t1.*

from T_META_OBJECTTYPE t1

left join T_META_OBJECTTYPE_L t2 on t1.FID=t2.FID

--where t1.fid='SAL_SaleOrder'

) t

where Item<>'' and FNAME like '%收料通知单%'

 

 通过表T_META_OBJECTTYPE的FKERNNELXML字段进行xml查找

 库存状态列表

select t1.FSTOCKSTATUSID,t1.FNUMBER,t2.FNAME from T_BD_STOCKSTATUS t1
left join  T_BD_STOCKSTATUS_L t2 on t1.FSTOCKSTATUSID=t2.FSTOCKSTATUSID

单据类型

select t1.FBILLTYPEID,t1.FNUMBER,t2.FNAME from T_BAS_BILLTYPE t1
left join T_BAS_BILLTYPE_L t2 on t1.FBILLTYPEID=t2.FBILLTYPEID
 where t1.FBILLFORMID='QM_InspectBill'  --单据类型--检验单

 

基础资料

T_ORG_ORGANIZATIONS  组织表

T_ORG_ORGANIZATIONS_L   组织表

T_BAS_ASSISTANTDATA_L 辅助资料分类

T_BAS_ASSISTANTDATAENTRY  辅助资料列表

T_BAS_ASSISTANTDATAENTRY_L  辅助资料列表

t_bd_accountbook_l(账簿多语言)

t_bd_accountbook(账簿)

t_bd_material(物料)

t_bd_material_l(物料多语言)

T_BD_OPERATOR(业务员) 
T_BD_OPERATOR_L(业务员多语言)

T_BD_STAFF(员工表)

t_BD_Stock(仓库)

t_bd_supplier(供应商)

 财务

t_AP_payable(应付单表头) 
T_AP_PAYBILL(付款单) 
t_AR_receivable(应收单表头) 
t_AR_receivable(应收单表头) 
t_gl_voucher(凭证) 
T_IV_PURCHASEIC(采购发票) 
T_IV_SALESIC(销售发票)

供应链

T_PUR_POORDER(采购订单) 
T_PUR_PRICELIST (价目表) 
T_PUR_RECEIVE(采购收料单) 
T_PUR_REQUISITION(采购申请) 
T_SAL_DELIVERYNOTICE(销售发货通知单)
T_SAL_ORDER(销售订单) 
T_SAL_OUTSTOCK(销售出库单) 
T_SAL_RETURNSTOCK(销售退货单) 
T_STK_INSTOCK(入库单) 
T_STK_InvBal(库存余额表) 
T_STK_INVENTORY(即时库存表)

 4.制造

T_ENG_BOM(物料清单) 
T_PRD_INSTOCK(生产入库单) 
T_PRD_MO(生产订单) 
T_PRD_MORPT(生产汇报单) 
T_PRD_PICKMTRL(生产领料单) 
T_PRD_PPBOM(生产用料清单) 
T_PRD_PREPAREMTRL(生产备料单据头) 
T_PRD_RETURNMTRL(生产退料单) 
T_SUB_FEEDMTRL(委外补料单) 
T_SUB_PICKMTRL(委外领料单) 
T_SUB_PPBOM(委外用料清单) 
T_SUB_REQORDER(委外订单) 
T_SUB_RETURNMTRL(委外退料单)

 

--物料名称
select m.fmaterialid,m.fmasterid, fname,m.fnumber from t_bd_material m join t_bd_material_l l on 
l.fmaterialid=m.fmaterialid
where 1=1
--and m.fmaterialid=147002
and m.fnumber='XACPWM0067'
--and l.fname like '%扯面%'
order by m.fmaterialid desc 


--组织
select V_SCM_OWNERORG_L.FNAME,* from V_SCM_OWNERORG left join V_SCM_OWNERORG_L on 
V_SCM_OWNERORG.FORGID=V_SCM_OWNERORG_L.FORGID   

select l.FNAME,* from T_ORG_ORGANIZATIONS o  join T_ORG_ORGANIZATIONS_L l  on l.FORGID=o.FORGID



--元数据
select * from t_meta_objecttype_l ml,t_meta_objecttype m where fname like '%工序汇报%' and ml.fid=m.fid


--部门
select b.FNAME,* from T_BD_DEPARTMENT a join T_BD_DEPARTMENT_L b on a.FDEPTID=b.FDEPTID


--单据转换
select * from T_META_CONVERTRULE where fid='PlanOrder_PPBom'


--通过元数据唯一id查询菜单
select * from T_META_CONSOLEDETAIL where FOBJECTID like '%stk_%'


--反写规则
select rl.FNAME, * from T_BF_WRITEBACKRULE r
left join T_BF_WRITEBACKRULE_L rl on rl.FID=r.FID and rl.FLOCALEID=2052
left join T_BF_WRITEBACKRULECUST rc on r.FID=rc.FID
where (rl.FNAME like '%生产线生产%' or rl.FID like '%sfc_%') and rc.FFORBIDSTATUS='A'


--转换规则
select * from T_META_CONVERTRULE where FID like '%rem_%'

select * from T_META_CONVERTRULE_L


--反写规则
select * from T_BF_WRITEBACKRULE where fsourceformid like '%SFC_%' and ftargetformid like '%SFC_%'


--参数
select * from t_bas_sysparameter


--枚举值
select * from T_META_FORMENUM e
join T_META_FORMENUM_L el on el.FID=e.FID
where FNAME like '%生产线领料单%'


--单据类型
select * from T_BAS_BILLTYPE where FBILLFORMID like '%REM_INSTOCK%'


--菜单操作对应类名
select * from T_MDL_FORMOPERATIONTYPE


--操作里面的服务
select * from T_MDL_FORMBUSINESS_L where FDESC like '%更新即时库存%'
select * from T_MDL_FORMBUSINESS where FACTIONID=45


--保存界面布局
select * from T_BAS_FormParameter
where FPARAOBJID like '%SFC_OperationPlanning%'


--用户
select * from T_SEC_USER 


--用户参数
select * FROM T_BAS_UserParameter where FPARAMETEROBJID like '%rem_%'


--IDE函数
select fl.FNAME,f.FAPPEARANCECLASS,f.FELEMENTCLASS, * from T_MDL_ELEMENTTYPE f join T_MDL_ELEMENTTYPE_L fl on f.FID=fl.FID
where FELEMENTCLASS like '%OPERATIONSTATUS%' or FAPPEARANCECLASS like '%OPERATIONSTATUS%'


--枚举
select * from T_META_FORMENUM_L where fname ='REM_业务类型'
select * from t_Meta_Formenumitem where fid='c4a9508f-7af8-4edb-bb2f-fc21c866ee41'


--权限对象,权限项
select * from T_SEC_PERMISSIONOBJECT
select * from T_SEC_PERMISSIONOBJECTENTRY


--通过菜单查找元数据对象,查找表名(在xml中搜t_)
select * from T_META_OBJECTTYPE h join T_META_OBJECTTYPE_L l on l.FID=h.FID where FNAME like '%运算日志%'


--单位
select l.FNAME, * from T_BD_UNIT h join T_BD_UNIT_L l on h.FUNITID=l.FUNITID where l.FNAME like '%千克%' 

 

--单据转换、业务流程、反写规则
SELECT * FROM T_BF_DEFVERSION
SELECT * FROM T_BF_DEFVERSION_L
SELECT * FROM T_BF_DEFVERSIONLOOKUP
SELECT * FROM T_BF_INSTANCE
SELECT * FROM T_BF_INSTANCEAMOUNT
SELECT * FROM T_BF_INSTANCEAMOUNTHIS
SELECT * FROM T_BF_INSTANCEENTRY
SELECT * FROM T_BF_INSTANCEENTRYHIS
SELECT * FROM T_BF_INSTANCEHIS
SELECT * FROM T_BF_INSTANCESNAP
SELECT * FROM T_BF_INSTANCESNAPHIS
SELECT * FROM T_BF_INSTANCETRACK
SELECT * FROM T_BF_MYFAVOURITE
SELECT * FROM T_BF_PROCDEF
SELECT * FROM T_BF_PROCDEF_L
SELECT * FROM T_BF_PROCESSTYPE
SELECT * FROM T_BF_PROCESSTYPE_L
SELECT * FROM T_BF_PUBLISH
SELECT * FROM T_BF_PUBLISH_L
SELECT * FROM T_BF_PUBLISHENTRY
SELECT * FROM T_BF_TABLEDEFINE
SELECT * FROM T_BF_TRACKBACKUPLOG
SELECT * FROM T_BF_WRITEBACKRULE
SELECT * FROM T_BF_WRITEBACKRULE_L
SELECT * FROM T_BF_WRITEBACKRULECUST
SELECT * FROM T_META_CONVERTRULE
SELECT * FROM T_META_CONVERTRULE_L
--SQL SERVER单据转换、业务流程、反写规则
CREATE TABLE TMP_COSTCALTABLE 
(FTABLENAME VARCHAR(30));</P>
<P>INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_DEFVERSION');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_DEFVERSION_L');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_DEFVERSIONLOOKUP');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCEAMOUNT');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCEAMOUNTHIS');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCEENTRY');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCEENTRYHIS');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCEHIS');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCESNAP');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCESNAPHIS');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_INSTANCETRACK');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_MYFAVOURITE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PROCDEF');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PROCDEF_L');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PROCESSTYPE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PROCESSTYPE_L');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PUBLISH');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PUBLISH_L');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_PUBLISHENTRY');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_TABLEDEFINE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_TRACKBACKUPLOG');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_WRITEBACKRULE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_WRITEBACKRULE_L');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_BF_WRITEBACKRULECUST');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_META_CONVERTRULE');
INSERT INTO TMP_COSTCALTABLE(FTABLENAME) VALUES('T_META_CONVERTRULE_L'
SELECT * FROM TMP_COSTCALTABLE
--查看系统所有表占用的空间情况
create table tmpspace (Fname varchar(50),
Frows int,
Freserved varchar(50),
Fdata varchar(50),
Findex_size varchar(50),
Funused varchar(50));
--插入所有表数据大小
insert into tmpspace (Fname,Frows,Freserved, Fdata,Findex_size,Funused) 
exec sp_msforeachTable @Command1="sp_spaceused '?'
--查询
WITH FCBCOSTSPACE AS (
select CONVERT(DECIMAL,replace(sp.fdata,'KB',''))/1024 SPACE_MB,sp.* from tmpspace sp
inner join TMP_COSTCALTABLE cb on cb.FTABLENAME=sp.Fname)
SELECT * FROM FCBCOSTSPACE
ORDER BY SPACE_MB DESC
--临时表占用的总大小(M)
select SUM(CONVERT(DECIMAL,replace(sp.fdata,'KB','')))/1024 M from tmpspace sp
inner join TMP_COSTCALTABLE cb on cb.FTABLENAME=sp.Fname;
--drop table tmpspace;
--DROP TABLE TMP_COSTCALTABLE;</P>


DeepMind 是 AI 研究实验室,它引入了一种深度学习模型,可以生成具有显著效果的软件源代码。该模型名为 AIphaCode,是基于 Transformers,OpenAI 在其代码生成模型中使用的架构相同。



编程是深度学习和大型语言模型的有前景的应用之一。对编程人才日益增长的需求刺激了创造工具的竞赛,这些工具可以提高开发人员的工作效率,并为非开发人员提供工具来创建软件。



而在这方面,AIphaCode 确实给人留下了深刻的印象。它成功地解决了复杂的编程挑战,这些挑战通常需要数小时的规划、编码和测试。它可能会成为将问题描述转化为工作代码的好工具。



但它不等同于任何级别的人类程序员。这是一种完全不同的软件创建方法,如果没有人类的思考和直觉,这种方法是不完整的。



编码竞赛



编码挑战描述的示例。图片来自 DeepMind



AIphaCode 并不是唯一的,但它完成了一项非常复杂的任务。其他类似的系统专注于生成简短的代码片段,例如执行小任务的函数或代码块(例如,设置 Web 服务器,从 API 系统中提取信息)。虽然令人印象深刻,但当语言模型暴露于足够大的源代码语料库时,这些任务就变得微不足道。



另一方面,AIphaCode 旨在解决竞争性编程问题。编码挑战的参与者必须阅读挑战描述,理解问题,将其转化为算法解决方案,以通用语言实现,并针对一组有限的测试用例进行评估。最后,他们的结果是根据在实施过程中不可用的隐藏测试的性能进行评估的。编码挑战也可以有其他条件,例如时间和内存限制。



基本上,参与编码挑战的机器学习模型必须生成一个完整的程序,用来解决它前所未有的问题。



编码挑战解决方案的示例。图片来自 DeepMind



Transformer 和大型语言模型的力量



AlphaCode 是大型语言模型在解决复杂问题方面取得进展的又一个例子。AlphaCode 是大型语言模型在解决复杂问题方面取得进展的又一个例子。这种深度学习系统通常被称为序列到序列模型 (Seq2seq)。Seq2seq 算法将一系列值(字母、像素、数字等)作为输入,并生成另一个值序列。这是机器翻译、文本生成和语音识别等许多自然语言任务中使用的方法。



根据 DeepMind 的论文,AlphaCode 使用了一种编码器-解码器 Transformer 架构。近年来,Transformer 变得特别流行,因为它们可以处理大量数据序列,并且比其前身循环神经网络 (RNN) 和长短期记忆网络 (LSTM) 所需的内存和计算需求少得多。



Transformer 网络的结构



AlphaCode 的编码器部分为问题的自然语言描述创建了一个数字表示。解码器部分获取编码器产生的嵌入向量,并尝试生成解决方案的源代码。



事实证明,Transformer 模型擅长此类任务,尤其是在为它们提供足够的训练数据和计算能力的情况下。但在研究者看来,AlphaCode 的真正出色之处不仅仅是将原始数据投入到超大型神经网络中的强大功能,更多地在于 DeepMind 的科学家们在设计训练过程以及生成和过滤它的算法方面的独创性有关。



无监督和监督学习



为了创建 AlphaCode,DeepMind 的科学家结合了无监督预训练和监督微调。通常被称为自我监督学习,这种方法在没有足够标记数据或数据注释昂贵且耗时的应用程序中变得流行。



在预训练阶段,AlphaCode 对从 GitHub 提取的 715GB 数据进行了无监督学习。通过尝试预测语言或代码片段的缺失部分来训练模型。这种方法的优点是它不需要任何类型的注释,并且通过接触越来越多的样本,ML 模型在为文本和源代码的结构创建数字表示方面变得更好。



训练和应用AlphaCode的算法。图片来自 DeepMind



然后在 CodeContests(DeepMind 团队创建的带注释数据集)上对预训练模型进行微调。该数据集包含问题陈述、正确和错误的提交以及从各种来源收集的测试用例,包括 Codeforces、Description2Code 和 IBM 的 CodeNet。该模型经过训练,可以将挑战的文本描述转换为生成的源代码。它的结果通过测试用例进行评估,并与正确的提交进行比较。



在创建数据集时,研究人员特别注意避免训练、验证和测试集之间的历史重叠。这确保了 ML 模型在面临编码挑战时不会产生记忆结果。



代码生成和过滤



一旦 AlphaCode 接受了训练,它就会针对以前从未遇到过的问题进行测试。当 AlphaCode 处理一个新问题时,它会产生很多解决方案。然后,它使用过滤算法选择最佳 10 名候选人并将其提交给比赛。如果其中至少有一个是正确的,则认为该问题已解决。



根据 DeepMind 的论文,AlphaCode 可以为每个问题生成数百万个样本,尽管它通常会生成数以千个解决方案。然后对样本进行过滤,只包括那些通过问题陈述中包含的测试的样本。据该论文称,这会删除大约 99% 的生成样本,但仍然留下了数千个有效样本。



为了优化样本选择过程,使用聚类算法将解决方案分组。据研究人员称,聚类过程倾向于将工作解决方案组合在一起。这使得找到一小部分可能通过竞争隐藏测试的候选人变得更加容易。



根据 DeepMind 的说法,在流行的 Codeforces 平台上的实际编程比赛中进行测试时,AlphaCode 平均排名前 54%,考虑到编码挑战的难度,这非常令人印象深刻。



AI VS 人类



DeepMind 的博客正确地指出,AlphaCode 是第一个“在编程竞赛中达到具有竞争力的性能水平”的 AI 代码生成系统。



然而,却有人将这种说法误认为人工智能编码“和人类程序员一样好”这是谬误的将狭义的人工智能与人类解决问题的一般能力进行比较。



例如,DeepBlue 和 AlphaGo,它们是击败国际象棋和围棋世界冠军的人工智能系统。虽然这两个系统都是计算机科学和人工智能的了不起的成就,但它们只擅长一项任务。他们无法在任何其他需要仔细计划和制定战略的任务上与人类对手竞争,这些都是人类在成为国际象棋和围棋大师之前获得的技能。



关于竞争性编程也可以这样说。一位在编码挑战中达到竞争水平的程序员已经花费了数年的时间学习。他们可以抽象地思考问题,解决更简单的挑战,编写简单的程序,并表现出许多其他在编程比赛中被视为理所当然且未评估的技能。



简而言之,这些比赛是为人类设计的。你可以肯定,一般来说,在竞争性编程中排名靠前的人就是一个优秀的程序员。这就是为什么许多公司利用这些挑战来做出招聘决定的原因。



另一方面,AlphaCode 是竞争性编程的捷径——尽管它非常出色。它创建了新颖的代码,不会从其训练数据中复制粘贴。但它并不等同于普通程序员。



因此,与其让 AlphaCode 与程序员竞争,我们更应该对 AlphaCode 和其他类似的 AI 系统在与人类程序员合作时能做什么更感兴趣。这些工具可以对程序员的生产力产生巨大影响。它们甚至可能改变编程文化,将人类转向制定问题(仍然是人类智能领域的学科)并让人工智能系统生成代码。



但程序员仍将处于控制之中,他们必须学会利用人工智能生成代码的力量和局限性。



参考链接:



https://thenextweb.com/news/deepmind-alphacode-tool-not-replacement-for-human-programmers-syndication