赞
踩
前些日子我用ChatGPT和OpenAI提供的GPT-3 API做了一些实验。在实验的过程中我注意到,虽然ChatGPT可以记忆之前的对话内容,但其机制十分简单直白:
在发送一个新的prompt的时候,程序会将之前的所有的对话打包起来,然后添加到prompt之前。
这将导致单次prompt会随着对话的进行而变得越来越长,直至极限。即使没有极限,成本也会越来越大,直至难以接受。
也就是说,以目前的记忆方式,AI只能进行短期记忆,而无法进行长期记忆。于是我设计了一个可以让AI低成本地进行长期记忆的方法。
不难看出,单次prompt可以被视作“背景条件”和“当前对话”两个部分。既然单次prompt的容量是有限的,那么只要让“背景条件”的部分尽可能和“当前对话”有关即可。
因此,我需要设计一个模型,使得AI会遗忘与“当前对话”无关的内容,并回忆起与“当前对话”有关的内容。
保存永久出现在prompt中的记忆。该容器包含了AI的语气、人设等信息,因为会一直占着“背景条件”的一部分容量,所以要尽可能精简。
保存目前出现在prompt中的记忆。若该容器中某内容与当前对话无关,需将其转移到长期记忆容器中。
保存还未出现在prompt中的记忆。若该容器中某内容与当前对话有关,需将其转移到短期记忆容器中。
保存此回合即将被遗忘的短期记忆。属于短期记忆过渡到长期记忆的中间容器。
此外,所有短期记忆与长期记忆组合起来称为所有记忆。
当判断两个句子是否相关时,我第一反应想到的是两句是否包含相同的关键字词,于是可以得到:当两个句子相同的字词越多时,这两句就越相关。
然而,一句句子中,常见的虚词、代词所占的比重可能会比关键词所占的比重大很多,而且这类常见字词可能在几乎所有句子里都有出现,所以在定义R值时,需要将这些字词的比重降低。
同时,我们不知道关键字词有多少字,但先不妨假设这个关键字词只有一个字,那么我们可以先得出一个简单的公式:
B
句对于
A
句的相关性
R
=
∑
对
A
句的每个字
f
(
B
句是否有这个字
)
g
(
该字在所有句子中的出现率
)
B句对于A句的相关性R=\sum_{对A句的每个字}{f(B句是否有这个字)\over g(该字在所有句子中的出现率)}
B句对于A句的相关性R=对A句的每个字∑g(该字在所有句子中的出现率)f(B句是否有这个字)
可以看到,当A中的某个字在所有句子中的出现率过大时,这个字对两句相关性的影响力将会减弱。
接着,利用上述公式计算某记忆与当前对话的相关值,并将值映射到
(
0
,
1
)
(0, 1)
(0,1)区间。记:某记忆
M
x
=
{
c
1
,
c
2
,
.
.
.
,
c
m
}
M_x=\lbrace c_1, c_2, ..., c_m\rbrace
Mx={c1,c2,...,cm},当前对话
P
=
{
p
1
,
p
2
,
.
.
.
,
p
n
}
P=\lbrace p_1, p_2, ..., p_n\rbrace
P={p1,p2,...,pn},所有记忆
S
=
{
M
1
,
M
2
,
.
.
.
,
M
s
}
S=\lbrace M_1, M_2, ..., M_s\rbrace
S={M1,M2,...,Ms},且
M
x
∈
S
M_x\in S
Mx∈S。于是可得:
R
(
P
,
M
x
,
S
)
=
s
i
g
m
o
i
d
[
r
(
P
,
M
x
,
S
)
]
R(P, M_x, S) = sigmoid[r(P, M_x, S)]
R(P,Mx,S)=sigmoid[r(P,Mx,S)]
其中:
r
(
P
,
M
x
,
S
)
=
∑
i
=
1
n
s
i
g
n
(
p
i
,
M
x
)
×
(
m
∑
j
=
1
s
s
i
g
n
(
p
i
,
M
j
)
−
1
)
s
i
g
n
(
p
i
,
M
x
)
=
{
1
,
i
f
p
i
i
n
M
x
0
,
i
f
p
i
n
o
t
i
n
M
x
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
r(P, M_x, S) = \sum_{i=1}^n{sign(p_i, M_x)\times({m\over{\sum_{j=1}^s{sign(p_i, M_j)}}}-1)} \\\\ sign(p_i, M_x) =
然而,普遍情况下关键字词一般都由2、3个字组成,且通常来看,如果A句和B句拥有相同的多字词语,而A句和C句仅仅拥有相同的单字,那么显然B句相比于C句,与A句的相关性更大。因此,需要对上面的公式进行稍微的修改,降低拥有相同单字时的比重,同时加大拥有相同多字时的比重,且字数越多,比重越大。
记:最大关键词字数为
A
A
A,当前对话
P
=
{
p
1
,
p
2
,
.
.
.
,
p
n
}
=
p
1
p
n
^
P=\lbrace p_1, p_2, ..., p_n\rbrace=\widehat{p_1p_n}
P={p1,p2,...,pn}=p1pn
,例如:“你吃了吗”中,
p
2
p
3
^
=
\widehat{p_2p_3}=
p2p3
=“吃了”。可得:
R
(
P
,
M
x
,
S
,
A
)
=
s
i
g
m
o
i
d
[
r
(
P
,
M
x
,
S
,
A
)
]
r
(
P
,
M
x
,
S
,
A
)
=
∑
a
=
1
A
−
1
[
∑
i
=
a
n
s
i
g
n
(
p
i
−
a
p
i
^
,
M
x
)
×
(
m
[
∑
j
=
1
s
s
i
g
n
(
p
i
−
a
p
i
^
,
M
j
)
]
A
−
a
−
1
)
]
R(P, M_x, S, A) = sigmoid[r(P, M_x, S, A)] \\\\ r(P, M_x, S, A) = \sum_{a=1}^{A-1}[{\sum_{i=a}^n{sign(\widehat{p_{i-a}p_i}, M_x)\times({m\over{[\sum_{j=1}^s{sign(\widehat{p_{i-a}p_i}, M_j)}}]^{A-a}}-1)}}]
R(P,Mx,S,A)=sigmoid[r(P,Mx,S,A)]r(P,Mx,S,A)=a=1∑A−1[i=a∑nsign(pi−api
,Mx)×([∑j=1ssign(pi−api
,Mj)]A−am−1)]
在短期记忆容器中,每条记忆都会有一个遗忘值,并且在每一轮对话结束时更新。当遗忘值超过临界时,记忆将会被转移到长期记忆中。
遗忘值的更新基于该记忆与当前对话的相关值,若相关值大于某一标准,则遗忘值将减小,反之则增大。
记
R
R
R为当前记忆与当前对话的相关值,
R
^
\widehat R
R
为标准,则第n次对话时,当前记忆的遗忘值为:
F
n
(
R
)
=
∑
i
=
1
n
Δ
F
i
(
R
)
F_n(R)=\sum_{i=1}^n\Delta F_i(R)
Fn(R)=i=1∑nΔFi(R)
其中:
Δ
F
n
(
R
)
=
t
a
n
h
(
R
^
−
R
)
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\Delta F_n(R)=tanh(\widehat R-R) \\\\ tanh(x)={e^x-e^{-x}\over e^x+e^{-x}}
ΔFn(R)=tanh(R
−R)tanh(x)=ex+e−xex−e−x
当某一话题重复多次后,未来回忆起该话题的可能性将会被降低。解决这个问题可能需要对长期记忆容器进行调整,减少记忆中相同、重复的话题数量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。