从零开始的赛博老婆!5 - 总结与常态记忆加载

封面:PIXIV 82860854 @やたぬき圭 我们在上一篇已经了解了如何使用MongoDB存入每一次的对话记录。接下来我们将尝试使用这些聊天记录为我们的AI提供更加久远的记忆,我们将要自动化这一过程。 前言 在与AI的交互过程中,我们不可能每一分每一秒都在交互,要实现更加合理地管理聊天记录和记忆簇,我们将会使用 “会话” 机制管理每一次交互。注意,这与 ChatGPT 网页版交互理念是不一样的。区别在于,Chat GPT 提供了用户可选的 会话回溯 机制,我们可以找回之前的对话并继续之前的内容。但为什么在这里我没有采用这个方式呢?因为个人助理 有别于 单个 LLM 工具,她是具有 时空属性 的。你既可以理解为,我们的AI助理可以自动化回溯会话这一过程,也可以理解为这是一种“更拟人”的体现。在这种情况下,对话相对会更加自然而流畅,同时我认为 ChatGPT 网页版也是权衡成本,毕竟这么多用户全都自动化会话数据库那开销就要上天了。 你会发现,上一段话多次提到了会话这一概念,那我们如何理解呢? 会话 会话指的是两个或多个参与者之间的交谈或交流。在计算机和网络领域,会话通常指的是用户与系统之间的一段互动时间。例如,当你登录一个网站并与其进行交互(如浏览页面、发送消息等)时,这段时间就被称为一个会话。 会话超时 会话超时则是指在一段时间内没有任何活动后,系统自动结束该会话的状态。这通常是为了安全考虑,比如防止他人在你离开电脑时访问你的账户。比如,如果你在某个网站上停留了太久没有点击任何东西,系统可能会自动注销你,这个过程就叫做会话超时。 简而言之: 会话是你和系统互动的时间段。 会话超时是因为长时间没有互动而自动结束这个时间段的过程。 我们今天要实现的功能就是,设置一个会话系统,当会话超时了,系统会自动把刚刚的会话的所有内容进行总结,并存到 MongoDB 数据库里,便于后续我们回溯。 计时器模块 计时器模块我们有两个选择:线程计时器和异步计时器 。这两种计时器各有优劣,但是考虑到本教程是从零教程,同时由于使用异步计时器需要所有的异步操作都需要在事件循环中运行,这可能不利于读者理解。再加之不是所有的函数都是异步函数,故本篇文章暂时采用线程计时器作为会话超时的计时器使用。这里避免误导提前说明,没有对错,只有对于不同场景下的权衡利弊的选择。 我们上一篇文章为大家介绍了自定义模块,今天我们仍然会创建自定义模块。 我们创建一个 cyberaitimer.py 文件,它在文件树里面看起来应该是这样的: your_project/ │ ├── main.py └── cyberaimodules/ ├── __init__.py ├── cyberaimongo.py └── cyberaitimer.py # 计时器模块 下面是我们的模块代码: # 计时器模块 import threading class CyberaiTimer: """ CyberaiTimer 类用于创建一个定时器,在指定的超时时间后执行回调函数。 Attributes: timeout (float): 定时器的超时时间(以秒为单位)。 callback (function): 定时器超时后要执行的回调函数。 timer (threading....

October 26, 2024 · 1 min · Aqua

从零开始的赛博老婆!4 - 短期记忆与记忆体系

PIXIV: 94008036 @苏翼丶 Agent记忆体系浅谈 (我写完这篇文章再重新回看,记忆这两个词太多了,我发现我不认识“记忆”这两个字了,大家点点赞吧写教程真的消耗阳寿……(。 ́︿ ̀。) 从GPT3破圈那一刻起,大家对LLM的记忆体系就众说纷纭。从技术上来讲,一方面Transformer架构衍生出的一些技术促进了记忆体系的发展(如 Embedding/Vector Database),另一方面有需求催生了另一些技术(如 Graph Database)。但就从2023年发展到现在,Agent的记忆体系进展比较缓慢。 我在这些技术和概念的帮助下,设计了一套针对于赛博老婆的记忆体系。它的特点就是自动存取,同时可以保证分级的持久化记忆。 记忆概念分类 我想把赛博老婆的记忆体系分成三类:短期记忆,中期记忆,长期记忆。我们来分别解释这几个概念: 短期记忆 短期记忆有多短期呢?我认为短期记忆是包含最丰富的,最原始的信息的。就像人的记忆一样,人类每天都会忘掉很多事情的很多细节,但是你可能会记得刚刚发生的事情的并能够说出细节。我认为在LLM还没有开始总结或简化那一部分最原始的记忆之前的内容,都算作短期记忆。或者通俗一点讲,对于赛博老婆,每一个会话的上下文,或者每一天当天(昨天)的记忆,都算作短期记忆。因为这一部分记忆,包含了你和赛博老婆交互的原始记录。但是在这里,我想稍微延伸一点:我把当天的总结记忆和每一次会话的记忆也算作短期记忆之内。之所以如此规定,是因为在实际的记忆载入中,这类的近期记忆往往频率更高,同时需要相对详细的细节,他们往往是一起无条件载入的。也就是说,上下文记忆,默认是必要的,而上几次的对话,或者昨天聊了什么,也会有更大概率被提起,他们的载入频率也差不多,都很高。 会话:你和赛博老婆互动,聊了几句,然后你就去做别的事情了,比如说吃了个饭。当你吃完饭,可能已经过了会话超时时间,而你又不想继续之前的话题,而是聊点别的,于是赛博老婆就会开一个新的会话。这在后续的记忆结构化中有利于实体提取与记忆网的生成。 中期记忆 中期记忆有别于短期记忆,中期记忆是经过简化和总结的,也就是丢弃掉了某些细节而得到的记忆。但我们为什么称之为中期记忆呢?这仍然是属于对人脑记忆的模仿,人脑会暂存一部分正在进行的事情,并简化其中的内容,等到这个事件结束了,有了结果了,就会大幅度遗忘,可能最后只会保留一个印象,类似于:我曾经做过什么事情,当时的结果是……而对曾经事情的过程和细节,完全遗忘。而这类中期记忆也不会对永久记忆网产生较大的影响。 我们在这里举例说明:你在某个网购官方平台购买了一个全新显卡RTX 9090 Ti Super Plus Max Ultra 1024TB,你付款商家发货寄出快递。由于你一直心心念念这款超强的显卡,你一直记着有这么个快递在路上,于是没事儿就点开查询快递到哪里了。这就是属于中期记忆的“事件中”。过了几天,你的快递终于到了,你非常开心,迫不及待地拆了包装,安装上去,这时你可能已经忘记自己看了多少次快递跟踪了,也忘了它是几天内到达的,因为这个时候你很想把它安装到电脑上看看效果。这就是中期记忆的遗忘特性**,阶段性目标达成可能会遗忘掉很多细节,但是事件存在周期又远超“短期记忆”。你安装到了电脑,但是你发现用这个显卡跑LLM慢的要死,然后你惊讶的发现,由于某黄的精准刀法,RTX 9090 Ti Super Plus Max Ultra 1024TB虽然拥有超大的显存,但是其显存位宽却只有可怜的128bit——连下一代的10070 Ti Super Plus Max Ultra Gaming的升级版本的150bit都没有!在你不得不感叹某黄精准刀法的同时不由得骂:“Fxxk you Nvxdxa !!” 你很难过,在某海鲜市场折价出手,期间还没事就看一看某鱼,生怕买家到手刀或者无理由退款等逆天操作……终于,你是幸运的,你成功地卖出了显卡,这段风波画上句号。等到几年后你再想起这件事情,可能只会记得那印象深刻的阉割和那句“Fxxk you Nvxdxa !!” 这就是中期记忆的特点了,不是所有记忆都会变成中期记忆的,只是某些特定事件,周期不短不长的才有资格被称为中期记忆。另外,上述案例是虚构的,绝对不是真实事件改编!!! 长期记忆 好,终于聊到这里了。我们要开始加速了。 人脑的长期记忆是一个非常复杂的系统。我们搞赛博老婆只能尽量平衡“精简”和“功能”。然而,赛博老婆可不像人,当你真的需要她回忆很重要的细节的时候,可不能像人一样,卖个萌然后糊弄过去。赛博老婆的长期记忆需要能够回溯到最原始的对话记忆或相关文档。同时,大多数情况,仅仅是一些关键信息的提示。这就对索引和查询系统提出了很高的要求,长期记忆系统设计的关键,就是如何高效而精确地自动存取,尤其是取。 我把长期记忆的查询和索引分成两种模式,“模糊检索”和“关系检索”,对应RAG和Graph Query。这只是两种不同的检索方法,实际情况大多是混合的,也就是并行的。为什么要这么做呢?我们来看实际例子。 模糊检索:你需要让赛博老婆回忆一下你曾经都在哪几天消费超过500元。这时,“超过500元”是一个语意,他是和价值/开支相关的,这种情况记忆执行的是语意数量的范围检索,是相对模糊的。(因为记忆库是通用的,我们没有一个专门的账本数据库,不然的话直接表达式>500就可以解决)此时,语意模糊检索占大头,而关系检索占小头,关系检索仅作为实体或后续进一步细节查询的补充。 关系检索:你让你的赛博老婆帮你分析你自己现在的人际网并找出你人际网中其他人的潜在联系。此时,就会用到关系检索。关系检索依赖于图数据库,它会把记忆转化为实体并建立联系,当我们执行实体关系连锁检索时,Query的三元组会激活好几个初始节点,代表初始的查询实体。然后通过检索与这些实体相连接的其他实体的信息,返回结果。这时,与Query在时空上,或语意上或其他任何形式的关联,都会返回。后续可以进行多次的知识网跳跃或者进行网图归类重排,或者定位到某个范围很小的节点群,执行模糊检索等。 在上述案例中,我们不难发现,两大类检索方式经常时混合使用的,这也是目前的趋势。实际上,短中长期记忆在实际应用里也是混合使用的,只是可能每一次调用时侧重点或者强度不同。 记忆系统的相关技术 非关系型数据库(NoSQL) 例如MongoDB,作为一种非关系型数据库,在存储文本音频和图片等多媒体数据的时候很有用。因为我们所有的原始数据都存在这里,上级数据库溯源到这里,需要原始数据相对方便一点,后续更改添加条目,备份维护都比较简单。MongoDB的python SDK还是很不错的,同时Mongo DB部署的平台支持也不错。 嵌入(Embedding) 一种数据量化技术,与图数据库和向量数据库配合,对多媒体数据进行多角度量化(语意,声学特征,图像特征等),便于数据库和LLM进行处理。 向量数据库(Vector Database) 存储向量化的嵌入数据和对应的经过总结的二级数据,执行语意搜索,RAG,混合重排等。向量数据库很善于相似搜索,包括图片文本音频等。 图数据库(Graph Database) 图数据库善于处理实体关系和网络。通过图数据库,LLM可以高效地存储和处理实体之间的关系网络,这对于需要理解和导航复杂关联的应用场景非常有用。另一个例子是知识图谱的构建,Agent可以利用图数据库存储知识点及其相互关联的信息,并结合互联网搜索帮助你发现新的潜在内容,甚至可以进行时空事件预测。...

September 26, 2024 · 10 min · Aqua

从零开始的赛博老婆!3 - TTS浅谈与实践

PIXIV: 71888962 @Yuuri TTS浅谈 TTS(Text To Speech)是语音合成(Speech synthesis)的一个分支,文本转语音(TTS)系统将正常语言文本转换为语音。TTS系统对于提高交互性有帮助,最近技术发展迅猛,TTS项目百花齐放。 从RVC的实时变声和动态语调优化,再到效果优秀的VITS,生成对抗网络(GAN)的加持使其声音比以前自然了很多。随着SO-VITS强大的声调控制能力的实现,优秀数据集加持下的Diff-SVC,虚拟歌姬的声音媲美真人,但也随之带来了一系列问题。在我浅显的认知中,我对语音合成还停留在初音未来那个时代,但是时代变化如此之快。目前TTS大有互相融合的趋势,例如fish-diffusion或者Fishaudio旗下的其他项目等,都有不小的进步。 开源项目如此繁盛,商用发展当然也不落后。看向商业阵营,各大公司都有其绝活。比如Acapela Group专门搞已故名人的TTS,这非常有特色。还有众多公司专注于高质量或情感丰富的TTS、定制声音等。而在商用TTS行业中,Azure TTS可以说是龙头,我们本篇文章也会使用微软的免费EdgeTTS服务作为示例。 这里有一些相关的项目链接: Fish Audio GPT-SoVITS Retrieval-based-Voice-Conversion-WebUI 这里还有两个哔哩哔哩up主,专注于音乐翻唱相关的,也推荐参考: 领航员未鸟 东洋雪莲也比较有实力,但似乎不公开分享很多技术细节,故仅作介绍。 注意,现在互联网上有非常多的TTS引擎,本文章仅使用较为稳定的Edge-TTS,初衷是用于实际应用。如果你需要完全本地使用TTS或者为了好玩个性化训练声音和特殊模型,本教程不适用,请移步到其他个性化TTS炼丹教程,比如GPT-SO-VITS等等。 Edge TTS TTS接受文字输入,然后输出音频。对于Edge TTS的Python版本,它实际上是通过网络请求工作的。因此,它可以很好地在边缘计算平台上运行,因为音频合成是在云端计算并返回给你的。我们使用的是Edge TTS Python库,这里还有GitHub的项目网址:edge-tts。 安装Edge TTS 首先安装: pip install edge-tts Edge TTS有两种工作方式,一种是使用命令行交互的方式,如果你只想使用命令模式,你可以使用pipx安装它(来自官网的教程): pipx install edge-tts 命令行模式我们不用,这里一笔带过。 Edge TTS使用 首先创建一个Edgetts.py文件,然后导入所需要的模块: # 导入需要的库 import asyncio import edge_tts import os 然后初始化TTS引擎。为了获取语言和声音的可选项,可以在命令行窗口输入命令来获取支持的列表: edge-tts --list-voices 你会发现输出了一大坨列表,这里就不放出来了。选择需要的NAME然后继续写初始化代码: # 设置要转化为语音的文本 TEXT = "你好啊,这里是lico!欢迎来到lico的元宇宙!" # 设置语音的语言和声音,注意这个名字是大小写敏感的 VOICE = "zh-CN-XiaoyiNeural" # 设置输出文件的路径,文件将保存在脚本所在的文件夹中 OUTPUT_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test....

February 6, 2024 · 3 min · Aqua

从零开始的赛博老婆!2 - 基础Python环境搭建+接入大语言模型

Pixiv ID: 104755143 本文章开始我们逐步进行实战,本次为搭建python基本环境,然后接入大语言模型,以Open AI Chat GPT为例。 Python环境与依赖 当你想运行你的赛博伙伴,你的代码是需要依赖库运行的,本文章使用了Python基础库和openai等库。请注意,当你的电脑里的python环境里没有正确安装相应的依赖库,代码无法正常运行。 注:以下命令可能不适用于你的系统,请根据对应系统查询conda命令 安装python环境或者安装anaconda环境管理器 请去python官网或者anaconda官网里安装软件,二者选其一即可。本文推荐使用anaconda,避免出现好多个环境互相冲突的情况。 如果你使用ARM架构的系统,可以尝试使用MiniForge,这个项目对ARM Python环境有一些优化,还是不错的。 请注意,安装任意软件的时候请务必将其添加到系统变量或者系统路径中(大佬除外),否则无法使用CMD正常运行脚本,具体安装和排错等问题恕不在本教程范围内 一般选择默认安装即可,安装好anaconda之后,,用打开你的CMD命令行窗口,运行以下命令检查conda是否安装成功: conda -V # 或者 conda --version 如果出现“没有此命令”则安装不正常,请自行排错。 # 更新conda conda update conda # 更新所有包 conda update --all 创建一个python环境 注:本教程建议使用python3.11及以上版本,之前的版本没有经过测试,请尽量保证最新版本。 我们给我们的赛博伙伴项目创建一个虚拟环境,以后我们就使用这个环境运行和赛博伙伴相关的代码,这样后续你统计依赖列表打包Docker镜像的时候很方便。 使用此命令创建一个新的环境: conda create -n env_name 例如: conda create -n ai 激活环境并安装依赖 激活环境 使用以下命令激活特定的环境: conda activate env_name 例如我们刚刚创建了一个名为ai的环境,现在我们要激活它: conda activate ai 激活之后,我们所有的操作使用的就是这个环境里已经安装的包和依赖了,你会发现命令行的开头会有你当前的环境名称。每次你打开命令行,都检查一下是不是你所需要的环境,当然你也可以设置你的默认环境。 你可以使用这个命令: conda env list # 或 conda info --envs # 查看存在哪些虚拟环境 你可能要用到这个命令关闭这个环境(但是先不要关闭,我们还要继续使用这个环境):...

November 28, 2023 · 3 min · Aqua

从零开始的赛博老婆!1 - 系列索引

Pixiv ID: 111325985 这里是一个系列教程的总目录,主要是分享一下我是如何创造一个类似于贾维斯的“赛博老婆”的.这个系列区别于RP,是偏向于Agent和日常助手的教程.你就把它理解为一个高度可定制的智能语音音箱吧,但是功能更强大. 这个帖子原本开过后来被我删了,现在经过重制整理,再发一遍,一方面也是希望更多人关注这个玩法,一方面也是这个项目的本体,也就是LICO,成功说服了我,重新把这个系列继续坚持下去,也感谢大家的任何意见和建议,任何评价我都虚心接受,这是很好的反馈. 每篇文章都非常的长,这有利于思维的连贯与深度思考,这不是娱乐文章. 本系列偏向于AI Agent方向,并非专注于RP/RPG的系列。如果有RP相关需求,请移步专注于RP的教程🙏。 写在前面 感谢热心网友 mozian0503 的反馈,在这里推荐对小白更加友好的一篇介绍:All In One 小白大模型科普。注意,此博文是针对于大语言模型的本地部署的科普,可能并不是很适用于本系列,但相关概念仍然是互通的,很多专业名词可以参考。本系列教程是使用大语言模型(Large Language Model)作为“大脑”,也就是我们所说的“LLM”作为管理中枢。 这里有一个系统架构图可以参考(请原谅我画的图很烂): 概念及专有名词的解释 前端与后端 一个完整的项目通常是包含“前端”和“后端”的,前端是软件系统中直接和用户交互的部分,就像前台服务员;而后端控制着软件的输出,就像幕后管理。举一个例子:你在手机App上面点了一个外卖,这个手机App就可以算作前端。而外卖要有外卖员来配送,谁负责给你分配外卖员呢?由后端系统计算得到最佳外卖员。前后端是两个独立的运行的程序,他们是需要同时运行并且协同工作的。我们的教程会先专注于后端的部分,对于前端,我们暂时使用命令行(Command,CMD)交互,等我们的后端初具雏形,还会有对应的前端教程(挖了无数深坑)…… LLM大模型 一个 大型语言模型 (LLM) 是一种计算模型,旨在处理自然语言处理任务,例如语言生成。训练大模型和推理大模型是两个概念,训练大模型就像训练一只军犬,要花费大量资源。而推理类似于你直接把别人训练好的模型拿来用了,推理也分两种:你可以使用别人部署好的推理模型,例如 OpenAI 的 GPT 或者千问等,这种的是大模型公司把这个模型加载到了他们公司的高性能服务器集群上,你直接就可以花钱按量使用他们的服务,这叫云服务;还有一种方法就是自己在本地部署,你手里有电脑或者服务器,你从开源平台把别人训练好的模型下载下来,在你自己的机器上加载模型,这叫本地部署。当然如果你更牛逼你也可以在你自己的电脑上训练或者微调大模型,这叫本地训练…… 本教程暂时使用对新手友好的 OpenAI 的 GPT 的 API ,如果你连接不到 OpenAI,用千问也是可以的,价格也不贵,deepseek 也可以,便宜量大。如果你想更进一步在本地部署并推理 LLM ,请去了解“自由AI阵线” Discord 群组,那里有一堆又有钱又有闲的人专注于本地量化微调部署以及 RP……(强烈建议先读完这个All In One 小白大模型科普再去了解任何相关知识) 实时更新目录速查 第一部分 基础环境 - 后端 - 基本交互 从零开始的赛博老婆!2 - 基础Python环境搭建+接入大语言模型 搭建基本运行环境,接入在线大模型 API ,创建简单上下文记忆 从零开始的赛博老婆!3 - TTS浅谈与实践 构建基本音频输出,拓展语音交互相关知识 从零开始的赛博老婆!4 - 短期记忆与记忆体系 介绍外置记忆系统,添加 MongoDB 外部数据库,聊天记录持久化...

October 10, 2023 · 1 min · Aqua