为什么GPTCache是 AutoGPT short-term memory更好的选择

513 阅读6分钟

AutoGPT short-term memory介绍

AutoGPT 是一个自主ai程序,其根据用户输入的目标,不断拆解成一个个小任务,然后不断进行执行,最终达成用户设定目标。对于一个很简单的用户目标,比如说写一个冒泡排序这种,则不需要进行任务才接,直接调用当前的LLM模型即可得到答案。但是对于一个相对复杂的任务,目前LLM模型则不可以一次性得到答案,就好比现实中使用LLM模型一样,我们需要根据LLM的生成结果,进行一些验证(如程序本地执行、Google搜索等),然后将验证结果反馈给LLM,这样不断靠近目标,最终使得程序达到预期效果。为了实现这一点,首要解决的问题则是如何在目前LLM支持的有限token数完成多个步骤的解析,因为每个步骤都有一定的关联性,就跟链条一般,只有将更多的历史信息发送给LLM模型,这样LLM模型才可以进行利用,否则LLM模型将无法得到历史信息,失去目标,因为它不知道上一次执行的结果如何,自然也不知道下一步怎么做才可以更加靠近目标。

short-term memory则是为了解决上述问题提出的。如果直接将每次的历史步骤的执行结果发送给LLM模型,将大大限制这个程序的使用场景,因为如果需要拆分目标许多步骤,那就有极大可能性超过LLM模型的token限制。目前AutoGPT借助向量数据库这一技术,来打破这一限制。其原理为:为了得到上下文,在生成下一指令前,获取最佳10条历史消息,将这些消息进行简单的拼接,并对文本进行Embedding操作,得到向量,并作为输入在向量数据库中进行topk搜索,得到与目前10条历史消息的最相关历史,这便是生成下一指令的上下文。那么向量数据库中的数据来源是什么呢,包括在程序运行前进行导入,和每次指令和其执行的的结果。

向量数据库,其核心作用则是,帮助自主ai程序获取最近历史10条消息的最相似执行记录,这样不仅可以获得生成下一次指令最相关的历史指令,同时也可以很好的信息跨度,因为向量数据的topk搜索对信息进行了浓缩。自然也很大程度上减缓了token上限这一限制,因为每一次生成指令中的上下文,都是历史消息中最相似的。

注: 最新的 Auto GPT 已经使用了Summary方案解决上述问题,但是个人感觉两种方案的优劣需要更多实践可能才能体现。

short-term memory分析

目前AutoGPT在momory模块,主要功能包括了,使用OpenAI的Embedding服务对文本进行Embedding操作和向量数据库的接入。这个模块的功能其实有点不太完整,比如:

  • 缺少对当前模块能力的一层抽象,如用户无法自定义Embedding操作
  • 数据的管理,对于数据的操作目前只涉及了添加和查询,对于数据的删除当前程序并没有涉及
  • 对于topk的搜索结果,无进一步处理,可能会错误引导LLM生成下一指令

其实通过上面介绍,可以得知内存模块的主要功能是检索历史消息和组合上下文信息,或许称之为“缓存”,这与开源GPTCache项目要核心解决问题其实是比较契合的。

为什么GPTCache对AutoGPT是有益的

GPTCache是一个用于语义缓存Python库,用来存储来自LLM查询的响应,更多介绍可访问项目链接进行进一步了解。

GPTCache的接入,将会给AutoGPT带来哪一些功能的增强呢?

  • 所有核心模块均是插件式,不仅所有模块内置了多种常用选择,同时用户也可以根据自己需求进行定制化,比如说如何对输入数据进行Embedding操作
  • 可以很多适配多种不同的应用场景,如针对于单机用户,提供了Onnx小模型Embedding,faiss或milvus-lite单机向量检索;对于具有大数据用户,可以使用Huggingface任意开源模型进行Embdding,使用Milvus作为向量数据库,支持大数据,且是分布式,具有更高的可用性,当然这部分内容也是可以进行业务需要进行自我定制化
  • 更多的存储方式,更加精细的数据管理。将向量数据和标量数据进行分开存储,一方面可以减小向量数据库系统的压力,同时也可以支持更多不同的向量相似搜索库,因为很多相似搜索库不具备数据存储能力,如faiss、hnswlib等。当然针对于向量数据存储和标量数据存储均进行了接口抽象,这样用户可以根据自己需要实现与业务更加匹配的存储方式。除此之外,对数据清理也支持了不同的策略,如LRU、LFU、FIFO等,甚至也可以自定义清理逻辑
  • 支持对缓存内容进行筛选。这部分功能主要有Similarity Evaluation模块进行提供,对于与当前输入向量相似的数据,都需要进过这个模块得到一个相似阈值,与用户的缓存设置阈值进行对比,只有超过这一阈值,缓存结果才会被认为有效,这样就可以有效避免缓存误命中率(指:不应该命中缓存但是命中了)
  • 丰富的请求参数,如可以针对每个llm请求使用的cache进行指定、是否使用cache、是否跳过cache搜索、多级cache、对输入的前处理、对于缓存数据的后处理等等
  • 多模态模型的支持,目前除了对于text-to-text模型有很好的支持,其他模型也正在积极的探索中,如text-to-image、image-to-text、vqa、audio-to-text等

最后

GPTCache可以有效的拓展AutoGPT的数据存储这一部分的能力,当然这不意味着GPTCache是为了给AutoGPT存储能力定制化打造的。其实事实恰恰相关,GPTCache的应用场景非常广泛,它不仅仅适用于AutoGPT这一自主ai程序,应该是可以适用于大部分的自主ai程序的。除了这一部分,对于将大模型使用进行抽象的框架,如LangChain,与GPTCache也可以有比较好的集成。另外,对于大模型的应用,也是GPTCache的一种应用场景,因为GPTCache提供了相应的api接口,不仅可以快速接入,同时通过请求参数,可以更细粒度控制缓存的使用和接收用户的反馈。

GPTCache当前项目正在快速迭代中,如果在使用过程中遇到任何问题或者功能上的建议,可以在Github上进行反馈,我们也将提供尽可能多的帮助处理社区用户问题。