你们懂得会计吗?
如果懂一点,以下内容应该很容易理解。
我来做一个业务:公司收到从张三得来的货款1000元,已存到银行存款中去。
会计是如何记录这句话呢?
银行存款:借方 1000元
张三:贷方 1000元
会计是将这句话简化成张三,银行存款,1000元。这三个要素。
那么,借贷是什么呢?记录这个钱的流动方向呀。
正方向为借,反方向为贷。于是从xxx,到xxx,就表示这个钱的流动方向了。会计中,复式记账法比较先进的地方是可以记录流动方向,将一维信息转化成二维。
我将其转化成python代码:
#自定义函数会计分录
class AccountEntry:
def __init__(self, account, amount):
self.account = account #账户名称
self.amount = amount #金额
def is_debit(self):
return self.amount >= 0 #判断是否大于零
def __str__(self):#如果是正数,为借方,负数为贷方
entry_type = "借方" if self.is_debit() else "贷方"
return f"{self.account}: {entry_type} {abs(self.amount)}"
# 创建会计分录
entry1 = AccountEntry("银行存款", 1000)
entry2 = AccountEntry("应收账款(张三)", -1000)
# 输出会计分录
print("会计分录:")
print(entry1)
print(entry2)
运行后:
会计分录: 银行存款: 借方 1000 应收账款(张三): 贷方 1000
但问题是谁会一个一个的将分录敲到代码中呀,又要自己判断这个正负,这不是浪费时间吗?
于是我们可以设计一个输入方式:
input_text = "收到从应收账款(张三)得来的1000元货款,汇到银行存款中去。"
只要我们按从XXX,到XXX中去这个格式的时候登记业务,那么配合正则表达式,就可以自动生成会计分录。
import re
class AccountEntry:
def __init__(self, account, amount, debit=True):
self.account = account
self.amount = amount
self.debit = debit
def __str__(self):
entry_type = "借" if self.debit else "贷"
return f"{self.account}: {entry_type} {abs(self.amount)}"
# 输入文本
input_text = "收到从应收账款(张三)得来的1000元货款,汇到银行存款中去。"
# 正则表达式匹配关键信息
pattern = r"从(.*?)得来的(.*?)元.*?到(.*?)中去"
match = re.search(pattern, input_text)
if match:
payer = match.group(1)
amount = float(match.group(2))
receiver = match.group(3)
entry1 = AccountEntry(receiver, amount)
entry2 = AccountEntry(payer, amount, debit=False)
print("会计分录:")
print(entry1)
print(entry2)
else:
print("输入文本不符合格式要求")
运行后的结果是:
会计分录:
银行存款: 借 1000.0
应收账款(张三): 贷 1000.0
当然,不单纯的收钱的业务,付款的业务我们也要的,例如当我们输入:从银行存款得来到5000元,汇入到其他应收款(老板)的私人户中去。
运行以上代码:
import re
class AccountEntry:
def __init__(self, account, amount, debit=True):
self.account = account
self.amount = amount
self.debit = debit
def __str__(self):
entry_type = "借" if self.debit else "贷"
return f"{self.account}: {entry_type} {abs(self.amount)}"
# 输入文本
input_text = "从银行存款得来的5000元,交到其他应收款(老板私人户)中去。"
# 正则表达式匹配关键信息
pattern = r"从(.*?)得来的(.*?)元.*?到(.*?)中去"
match = re.search(pattern, input_text)
if match:
payer = match.group(1)
amount = float(match.group(2))
receiver = match.group(3)
entry1 = AccountEntry(receiver, amount)
entry2 = AccountEntry(payer, amount, debit=False)
print("会计分录:")
print(entry1)
print(entry2)
else:
print("输入文本不符合格式要求")
运行后的结果是:
会计分录:
其他应收款(老板私人户): 借 5000.0
银行存款: 贷 5000.0
是不是很神奇呢?不过,如果这个钱不是单纯的直线流动,而是流到两个方向呢?如我销售一笔存货,"销售收到从存货得来的1000元,增加到应收账款中去。"
按以上代码,运行后的结果是
会计分录:
应收账款: 借 1000.0
存货: 贷 1000.0
但实际工作中,销售是要交增值税的。即
应收账款:借 1130
存货:贷 1000
应交税金:贷 130
所以你就需要将一笔业务分成两个以上的正则表达式,这个才麻烦的地方。不过现在有人工智能大模型,如果不介意准确率的话,LLM是可以解决的。
由于专利的限制,即使我是发明人也不能将代码公开,只能大概写一下原理。
由于怕自卖自夸,我就不详细介绍了。具体的原理是: 指定生成文本的长度、格式给模型,然后再调用大模型的生成方法来生成能匹配正则表达式的文本。
由于互联网的制度,我只能用清华的ChatGLM3来代替一下,不是ChatGTP3,效果是不错的。不过由于没有配套的ERP,只能放在公司的主页上供别人试用。
我可以肯定地说,记账这些事情,自动化是未来的趋势,十年,可能不出十年,自动化入账就是一件很平常的事,会计分录估计在未来是不用学的,交给人工智能就可以了,你只要将某件事写给人工智能,它就可以为你生成会计分录,而且符合会计准则的要求。
三十年前的会计要懂得如何用算盘,二十年前的会计要懂得计算机,估计未来十年的会计们,要懂得人工智能了。