专栏 | AI 研习社
微信公众号 | 远远Faraway
记忆力不好的人,通常注意力也不咋地,记忆力和注意力有没有什么关系?如何才能记得更加高效?人为什么没有三岁前的记忆?
如果你了解过记忆的一些研究,应该会接触过一种叫记忆曲线的图,随着时间的推移人们会遗忘记忆中的知识和事实。有句老话叫时间会淡化一切,说的就是这个道理。
知道了记忆曲线这个概念,有规律地去回顾那些记忆项,就能把记忆保留得更久。同时,我们仍然需要了解记忆的本质。
记忆的本质是什么?我们从大模型词嵌入过程和人脑神经元链接的强化过程可以初见端倪。大脑是没有固定的记忆脑区的,没有办法切下某个部分说这个地方存着记忆,把记忆提取出来。
同时我们注意到大模型对于语义的理解也不是记忆的方式,而是一种多维向量,但这种方式展现出来的词义理解就好像模型记住了词的意思。
会不会有一种可能,记忆力的本质实际上就是注意力。我们就用注意力来对记忆进行解释。这就好像复习某些知识点或者回顾某些事实,当我们注意力比较集中时,就好像调用注意力机制在给模型做微调,而词向量权重矩阵就像神经元间的连接,词向量间权重越高相当于神经元间的连接越强。
人们而每一次对知识或事实的回顾会强化那些特定的连接,其背定的工作原理,就是人的注意力机制在起作用。
是否可以说记忆力的本质就是注意力?
不管注意力是否是记忆力的本质,但我们知道了注意力在记忆过程的重要作用,那我们就应该使用这一特点进行对知识的学习和对重要事实的记忆。
改天不如今天,择日不如撞日,我们来设计一个小脚本吧,一种用来帮助记忆的系统,我称其为记忆管理系统MOS,我们需要一种叫记忆项的文件,以文本json的形式存储一个记忆项的id、记忆等级、问题、答案、遗忘时间。
如果当前系统时间已经过了记忆项的遗忘时间,说明该记忆项已经被遗忘了,就应当显示为红色,如果系过时间没过记忆项的遗忘时间,则显示为绿色。
让chatgpt来帮忙写这个代码吧,使用最小可行性方案就行,我们就用windows里的powershell命令行来执行这个脚本吧,需要有管理记忆项的功能,增加记忆项、删除记忆项、查看记忆项。
查看记忆项就像查看整个文件列表,同时需要根据判断是否遗忘确定显示红色还是绿色。
同时,我们需要一个复习的功能和一个更新记忆等级和遗忘时间的算法。就可以完成这个记忆管理系统的构建了。
把需求交给chatgpt吧,经过一个调整和Bug修复,我们得到了一个两百多行的脚本。
我们将这份代码拆开来看,分别有主函数、创建记忆项函数、查看记忆项列表函数、复习记忆项函数、删除记忆项函数。
主函数首先会进行使用提示,显示脚本的使用方法,代码如下:
# 主程序逻辑
do {
Clear-Host
Show-MemoryNodes
Write-Host "Yuanda>" -NoNewline
$input = Read-Host
if ($input -eq 'exit') {
break
} elseif ($input -eq 'cn') {
Create-MemoryNode
} elseif ($input -eq 'h') {
help
} elseif ($input -eq 'ct') {
Create-TestNode
}elseif ($input -eq 'dt') {
Show-MemoryNodesDetails
} elseif ($input -eq 'dn') {
Write-Host "Enter the node number to delete:"
$nodeIndex = [int](Read-Host)
Delete-MemoryNode -nodeIndex $nodeIndex
} elseif ($input -eq 'file') {
Open-Folder
} elseif ($input -match '^\d+$') {
# Convert $input to integer
$nodeIndex = [int]$input
Review-MemoryNode -nodeIndex $nodeIndex
} else {
Show-MemoryNodesDetails
}
} while ($true)
记忆节点列表页
然后会自动运行记忆项列表查看功能,也就是说一旦运行脚本就会看到使用方法和查看列表,代码如下:
# 显示记忆节点
function Get-ColoredText {
param (
[string]$text,
[string]$color
)
return "$([char]27)[0;3${color}m$text$([char]27)[0m"
}
function Show-MemoryNodes {
$currentTime = Get-CurrentUnixTimestamp
$files = Get-ChildItem -Path $memoryNodesPath
$index = 1
$count = 0
$lines = ""
foreach ($file in $files) {
$count = $count + 1
$content = Get-Content -Path $file.FullName | ConvertFrom-Json
$forgetTime = $content.ForgettingTime
$status = if ($currentTime -gt $forgetTime) { 'Expired' } else { 'Active' }
if ($status -eq 'Expired') {
$lines += "$(Get-ColoredText "($index)`t" '1')"
} else {
$lines += "$(Get-ColoredText "($index)`t " '2')"
}
if ($count % 25 -eq 0) { $lines += "`n"}
if ($count % 237 -eq 0) {Clear-Host; Write-Host "Memories List:"; Write-host "加载中:$count"}
# Print space between nodes for readability
$index++
}
# Move to the next line after displaying all nodes
Clear-Host
$readtime = Convert-TimestampToDateTime -timestamp $currentTime
Write-Host "currentTime:$readtime"
Write-Host "Memories List:"
Write-Host
Write-Host $lines
Write-Host
}
创建记忆项函数代码如下:
# 创建新的记忆节点
function Create-MemoryNode {
Clear-Host
Write-Host "Enter the question:"
$question = Read-Host
Write-Host "Enter the answer:"
$answer = Read-Host
$content = @{
Question = $question
Answer = $answer
Level = 1
ForgettingTime = (Get-CurrentUnixTimestamp) + 86400 # 24 hours in seconds
}
$fileName = "{0:D4}.json" -f ((Get-ChildItem -Path $memoryNodesPath).Count + 1)
$filePath = Join-Path -Path $memoryNodesPath -ChildPath $fileName
$content | ConvertTo-Json | Set-Content -Path $filePath
Write-Host "New memory node created."
}
如果想列出节点的详细信息,可以调用如下函数:
详细展示记忆节点列表
# 列出所有节点的详细信息
function Show-MemoryNodesDetails {
Clear-Host
$currentTime = Get-CurrentUnixTimestamp
$readtime = Convert-TimestampToDateTime -timestamp $currentTime
Write-Host "currentTime:$readtime"
Write-Host "Detailed Memories List:"
Write-Host
$files = Get-ChildItem -Path $memoryNodesPath
$index = 1
$lines=''
foreach ($file in $files) {
$content = Get-Content -Path $file.FullName | ConvertFrom-Json
$forgetTime = $content.ForgettingTime
$level = $content.Level
$question = $content.Question
$forgetTimeReadable = Convert-TimestampToDateTime -timestamp $forgetTime
$status = if ($currentTime -gt $forgetTime) { 'Expired' } else { 'Active' }
if ($status -eq 'Expired') {
$lines += "$(Get-ColoredText "($index) $question " '1')"
} else {
$lines += "$(Get-ColoredText "($index) $question " '2')"
}
# Print space between nodes for readability
$index++
}
# Move to the next line after displaying all nodes
Write-Host $lines
Write-Host
Write-Host "Yuanda>" -NoNewline
$input = Read-Host
if ($input -eq 'exit') {
break
} elseif ($input -eq 'cn') {
Create-MemoryNode
} elseif ($input -eq 'h') {
help
} elseif ($input -eq 'ct') {
Create-TestNode
}elseif ($input -eq 'dt') {
Show-MemoryNodesDetails
} elseif ($input -eq 'dn') {
Write-Host "Enter the node number to delete:"
$nodeIndex = [int](Read-Host)
Delete-MemoryNode -nodeIndex $nodeIndex
} elseif ($input -eq 'file') {
Open-Folder
} elseif ($input -match '^\d+$') {
# Convert $input to integer
$nodeIndex = [int]$input
Review-MemoryNode -nodeIndex $nodeIndex
} else {
}
}
输入记忆节点序号
记忆节点复习,回车显示答案
# 复习记忆节点
function Review-MemoryNode {
param([int]$nodeIndex)
$files = Get-ChildItem -Path $memoryNodesPath
if ($nodeIndex -lt 1 -or $nodeIndex -gt $files.Count) {
Write-Host "Invalid node index."
return
}
$file = $files[$nodeIndex - 1]
$content = Get-Content -Path $file.FullName | ConvertFrom-Json
Clear-Host
Write-Host "Question:"
Write-Host " $($content.Question)"
Write-Host
Write-Host "Press Enter to see the answer..." -ForegroundColor Blue
Read-Host
Clear-Host
Write-Host "Question:"
Write-Host " $($content.Question)"
Write-Host
Write-Host "Answer:"
Write-Host " $($content.Answer)"
Write-Host
Write-Host "Did you remember it? (y/n)>" -ForegroundColor Blue -NoNewline
$response = Read-Host
$currentTime = Get-CurrentUnixTimestamp
$status = if ($currentTime -gt $content.ForgettingTime) { 'Expired' } else { 'Active' }
if ($status -eq 'Expired') {
if ([string]::IsNullOrWhiteSpace($response)) {
Write-Host "No input provided. Assuming 'n' (no)."
$response = 'y'
}
if ($response -eq 'y') {
$newLevel = $content.Level + 1
$forgetTime = $currentTime + ($newLevel * $newLevel * 86400) # Level squared hours converted to seconds
$content.Level = $newLevel
$content.ForgettingTime = $forgetTime
} else {
$content.Level = 1
$forgetTime = $currentTime
}
} else {
if ([string]::IsNullOrWhiteSpace($response)) {
Write-Host "No input provided. Assuming 'n' (no)."
$response = 'y'
}
if ($response -eq 'n') {
$content.Level = 0
$content.ForgettingTime = $currentTime -10
}
}
$content | ConvertTo-Json | Set-Content -Path $file.FullName
}
别忘了记忆项是以json格式存储在指定文件夹中,你需要进入脚本把文件夹路径修改为你的本地存在的路径。
记忆节点目录
# 打开记忆节点目录
function Open-Folder {
Start-Process explorer.exe -ArgumentList $memoryNodesPath
}
删除记忆项:
# 删除记忆节点
function Delete-MemoryNode {
param([int]$nodeIndex)
$files = Get-ChildItem -Path $memoryNodesPath
if ($nodeIndex -lt 1 -or $nodeIndex -gt $files.Count) {
Write-Host "Invalid node index."
return
}
$file = $files[$nodeIndex - 1]
$content = Get-Content -Path $file.FullName | ConvertFrom-Json
Clear-Host
Write-Host "问题:"
Write-Host " $($content.Question)"
Write-Host "答案:"
Write-Host " $($content.Answer)"
Write-Host
Write-Host "确定删除吗? (y/n)" -ForegroundColor Red
$response = Read-Host
if ($response -eq 'y') {
Remove-Item -Path $file.FullName
Write-Host "Memory node deleted."
} else {
Write-Host "Memory node deletion canceled."
}
}
此外,还有一些细节,比如初始化、帮助界面、时间格式转换、检测目录是否存在、获取当前时间、测试等。