引言:当前 AI 范畴的现状

2022.11.30,也就是大概半年前,OpenAI 发布文章 Introducing ChatGPT,标志着正式迈入大模型时代,经过半年时刻的发酵,ChatGPT 现已被大家熟知,其传播速度超越国内的 QQ 和微信

今年2月,ChatGPT 也逐步被国内所知,国内各个公司也开始布局言语模型赛道,如百度的文心一言、阿里的通义千问、复旦大学的Moss、科大讯飞的星火等。

在调查近两个月的 GitHub Trending 榜,能够发现根本上每天都有关于 GPT 项目,如前段时刻的 LangChain、llama_index、Auto-GPT 等,GPTCache 也连续上榜四天,AI 范畴的论文也有许多。

现在能够看出的,关于 ChatGPT 相关的开发,大概能够分为以下几种:

  1. ChatGPT 模型平替,如 LLama、Dolly、Moss 等
  2. 模型 FineTune,如 LawGPT、BioGPT、Huatuo-Llama-Med-Chinese 等
  3. GPT 运用开发,包含桌面运用、反向代理在线 LLM 模型、依据 GPT 才能处理日常问题
  4. GPT 才能增强,如 LLM 流程编列、token 约束突破、给 ChatGPT 供给外部数据源等

GPTCache介绍

项目地址:github.com/zilliztech/…

GPTCache 由来

公司内部在进行 OSSChat 项目开发过程中,发现 ChatGPT 可能会成为阻止 OSSChat 提升功能的瓶颈。一,不稳定的 ChatGPT 服务会拉低 OSSChat 呼应速度;二,每次调用 ChatGPT 接口,都会产生新的费用,这导致 OSSChat 的运用本钱不断拉升。

GPTCache 是什么

ChatGPT 和其他大言语模型,能够被广泛运用于各种开发场景中。跟着运用处理恳求的添加,在固定资源的情况下将添加恳求延时,或许为了确保恳求延时满意用户需求,则需求添加计算资源,也将直接添加运用开发本钱。假如运用类似 ChatGPT 的在线服务,也会有恳求速率约束,一起恳求数量的添加也必定导致本钱的添加。

GPTCache 则是为了处理上述问题诞生的,主要是为 LLM 相关运用构建类似语义缓存,类似的问题恳求屡次,直接从缓存中获取,这样将削减恳求呼应时刻,一起也下降了 LLM 的运用本钱。

社区关于GPTCache反应怎么?

现在GPTCache现已在Github近一个月,也取得一个不错的热度。取得超越 3.2k star, 200 个 fork 数量,统计的被引用数量,近 300 个。

PyPi 累计发布25个版本:0.1.1~0.1.25,pip 累计下载数量:超 15w

GPTCache:大模型时代的应用缓存

为什么要用GPTCache

GPTCache 效果是什么?

  1. 下降LLM运用费用;现在大多数LLM服务均经过恳求token数进行计费,当恳求运用缓存成果,自然下降恳求次数,则削减了LLM运用本钱;
  2. 功能优化;比较于大模型的推理时刻,从缓存数据中获取时刻将下降一个数量级;
  3. 兼容性强,多种运用场景:GPTCache 供给多种 LLM 的镜像接口,只需修正 import 路径,即可模型 LLM 恳求;
  4. 改善LLM服务的可扩展性和可用性;现在LLM服务都有恳求速率约束,到达这一约束则服务无法进行呼应。假如关于类似的问题运用缓存答案,将有用缓解服务无法呼应这一问题。

GPTCache 效果于哪些场景比较适宜?

  1. 某一笔直范畴的 LLM 相关运用,如法令、生物、医学等;
  2. 固定的 LLM 相关运用,如某公司内部或个人运用的 ChatBot;
  3. 开发的 LLM 运用在某些时刻内的恳求具有高度类似性,如节日祝福语模版等;
  4. 具有大用户集体的 LLM 运用,假如给用户集体进行分类,类似用户用同一缓存

项目结构

项目现在包含了七个核心组件,分别为:

  1. LLM Adapter
  2. Pre-Processor
  3. Embedding
  4. Cache Manager
  5. Similarity Evaluation
  6. Post-Processor
  7. GPTCache Server

GPTCache:大模型时代的应用缓存

LLM Adapter

LLM适配器旨在经过一致API和恳求协议来集成不同的LLM模型。GPTCache为此供给了标准化的接口,确保用户以最低的本钱、风险最小的方式接入 GPTCache。

Text-to-Text

  1. OpenAI
  2. Llama
  3. Dolly
  4. LangChain

MultiModel

  1. StableDiffusion
  2. Stability
  3. Replicate
  4. MiniGPT4 (VQA)

API

  1. put
  2. get
  3. init_similar_cache
  4. init_similar_cache_from_config

示例代码

from gptcache.adapter import openai
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "what's github"}],
)

更多比如:gptcache.readthedocs.io/en/latest/r…

Pre-Processor

预处理,处理 LLM 恳求的输入,如对输入信息进行删减,也可进行增加,或许进行信息修正等,处理后的成果将会交由 Embedding 组件转换为向量。

根底内置完成

  1. last_content
  2. last_content_without_prompt
  3. all_content
  4. nop

Context预处理

  1. ContextProcess Interface
  2. SummarizationContextProces
  3. SelectiveContextProcess

示例代码

from gptcache import cache
from gptcache.processor.pre import last_content
cache.init(pre_embedding_func=last_content)
from gptcache.processor.context.summarization_context import SummarizationContextProcess
context_process = SummarizationContextProcess()
cache.init(pre_embedding_func=context_process.pre_process)

更多比如:gptcache.readthedocs.io/en/latest/r…

Embedding

Embedding,为了从恳求中提取包含语义信息的向量以进行类似性搜索而创建的。GPTCache供给了一个通用接口,支撑多种嵌入式API,并供给了多种可供选择的处理方案。

文本 Embedding

  1. Onnx
  2. OpenAI
  3. Cohere
  4. SBERT
  5. FastText

图片 Embedding

  1. Timm
  2. ViT

音频 Embedding

  1. Data2VecAudio

第三方 Embedding

  1. Huggingface
  2. LangChain

示例代码

from gptcache import cache
from gptcache.embedding import Huggingface
huggingface = Huggingface(model="uer/albert-base-chinese-cluecorpussmall")
cache.init(
    embedding_func=huggingface.to_embeddings,
)

更多比如:gptcache.readthedocs.io/en/latest/r…

注意事项

  1. 不同的言语有些模型是不适用的
  2. 更改模型后,需求将之前的缓存文件删除
  3. Embedding模型的维度注意与向量数据库进行关联

Cache Manager

办理缓存数据,包含了存储、搜索、整理。运用传统数据库存储结构化数据,即字符串、数字等;运用向量数据库存储非结构化数据,主要是文本、图片、音频等经过 Embedding 模型得到的向量;运用目标存储存储文件类型数据,即图片、音频等。

传统数据库

  1. SQLite
  2. DuckDB
  3. PostgreSQL
  4. MySQL
  5. MariaDB
  6. SQL Server
  7. Oracle

向量数据库

  1. Milvus
  2. Zilliz Cloud
  3. Faiss
  4. Hnswlib
  5. PGVector
  6. Chroma
  7. DocArray

目标存储

  1. Local Storage
  2. S3

示例代码

from gptcache import cache
from gptcache.embedding import Huggingface
from gptcache.manager import manager_factory
huggingface = Huggingface(model="uer/albert-base-chinese-cluecorpussmall")
m = manager_factory(
    "sqlite,faiss,local",
    data_dir="gptcache",
    vector_params={"dimension": huggingface.dimension},
)
cache.init(
    pre_embedding_func=huggingface.to_embeddings,
    data_manager=m,
)

更多比如:gptcache.readthedocs.io/en/latest/r…

Similarity Evaluation

评价类似成果是否到达预期,将用户输入与从 cache 中类似搜索得到的成果进行类似评价,得到一个数值,然后与用户设定的类似阈值进行比较。这样能够有用确保缓存成果质量,以满意响运用户恳求的要求。

内置完成

  1. SearchDistanceEvaluation
  2. ExactMatchEvaluation
  3. NumpyNormEvaluation
  4. OnnxModelEvaluation
  5. KReciprocalEvaluation

代码示例

from gptcache import cache
from gptcache.similarity_evaluation.distance import SearchDistanceEvaluation
evaluation = SearchDistanceEvaluation()
cache.init(
    similarity_evaluation=evaluation,
)

更多比如:gptcache.readthedocs.io/en/latest/r…

Post-Processor

对符合类似阈值的成果列表进行处理,假如想确保cache并不是每次都一样,则能够这个组件进行二次开发。

内置根底完成

  1. first
  2. random_one
  3. temperature_softmax
  4. nop

示例代码

from gptcache import cache
from gptcache.processor.post import first
cache.init(post_process_messages_func=first)

更多比如:gptcache.readthedocs.io/en/latest/r…

更多

GPTCache Server

Server发动

假如经过python现已安装了GPTCache库,能够直接履行以下指令发动服务:

gptcache_server

也可经过docker imager发动服务:

docker pull zilliz/gptcache:latest
docker run -p 8000:8000 -it zilliz/gptcache:latest

服务访问

curl -X PUT -d "receive a hello message" "http://localhost:8000?prompt=hello"
curl -X GET  "http://localhost:8000?prompt=hello"

具体运用:github.com/zilliztech/…

Cache 初始化配置

  1. similarity_threshold
  2. log_time_func
  3. prompts

示例代码

from gptcache import Config, cache
config = Config(similarity_threshold=0.6)
cache.init(config=config)

更多比如:gptcache.readthedocs.io/en/latest/r…

Cache 恳求参数

  1. cache_obj
  2. cache_context
  3. cache_skip
  4. session
  5. temperature

运用比如

from gptcache import Cache
from gptcache.adapter import openai
one_cache = Cache()
one_cache.init()
openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": question}],
    cache_obj=one_cache,
)

更多比如:gptcache.readthedocs.io/en/latest/u…

GPTCache根本运用

GPTCache 与内置集成 LLM 模型

运用 GPTCache,初始化后即可体会,其初始化过程中涉及到的各个组件可依据自身要求进行拼装,接入 LLM 则只需求直接替换包名即可,更多LLM比如

示例代码

from gptcache.adapter import openai
from gptcache.adapter.api import init_similar_cache
from gptcache.processor.pre import last_content
init_similar_cache(pre_func=last_content)
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": question}],
)

更具体运用,参阅:github.com/zilliztech/…

GPTCache 与自定义 LLM 模型

关于现在没有集成至 GPTCache 的大模型,能够经过 api 运用 GPTCache 的才能

示例代码

from gptcache.adapter.api import put, get, init_similar_cache
init_similar_cache()
put("hello", "foo")
print(get("hello"))

更多比如:gptcache.readthedocs.io/en/latest/r…

GPTCache 与 LangChain

LangChain 是旨在协助开发人员将大型言语模型与其他计算或常识源结合运用,具有强壮构建功能的 Python 库。供给了一套工具和资源,用于构建问答、聊天机器人和代理等 LLM 运用程序。

LangChain 供给了一个大局的 LLM_cache 目标,所以只需求将这个目标赋值成 GPTCache 目标即可,就能够运用 GPTCache 相关功能。

示例代码

from gptcache import Cache
from gptcache.adapter.api import init_similar_cache
from langchain.cache import GPTCache
import hashlib
def get_hashed_name(name):
    return hashlib.sha256(name.encode()).hexdigest()
def init_gptcache(cache_obj: Cache, llm: str):
    hashed_llm = get_hashed_name(llm)
    init_similar_cache(cache_obj=cache_obj, data_dir=f"similar_cache_{hashed_llm}")
langchain.llm_cache = GPTCache(init_gptcache)

更多比如:python.langchain.com/en/latest/m…

GPTCache 与 LlamaIndex

LlamaIndex 是一种数据索引工具,用于将私有数据与预先练习好的 LLM 模型相结合,完成在特定上下文中学习。它供给数据连接器、索引和查询接口等工具,以便高效地将非结构化和结构化数据与 LLM 相结合,完成常识增强。

示例代码

from gptcache import Cache
from gptcache.adapter.api import init_similar_cache
from langchain.cache import GPTCache
from gpt_index.llm_predictor.structured import LLMPredictorfrom gpt_index.prompts.default_prompts import DEFAULT_SIMPLE_INPUT_PROMPT
def init_gptcache(cache_obj: Cache, llm str):
    init_similar_cache(cache_obj=cache_obj, data_dir=f"similar_cache_{llm}")
predictor = LLMPredictor(llm, False, GPTCache(init_gptcache))
prompt = DEFAULT_SIMPLE_INPUT_PROMPT
llm_prediction, formatted_output = predictor.predict(
        prompt, query_str="hello world"
    )

完整实例:github.com/zilliztech/…

GPTCache运用场景

私有化模型

为什么需求私有化模型布置?

  1. 安全

虽然 ChatGPT 的效果很好,但是运用 ChatGPT 时,数据将会被发送给 OpenAI 公司,这些数据可能会被模型用于答复其他用户的问题,从而导致数据泄漏。这种情况 OpenAI 无法完全杜绝,因而为了确保数据安全,许多 LLM 运用者开始考虑运用开源大模型进行私有化布置。

  1. 本钱

现在各个在线 LLM 模型根本上都是经过 token 数进行收费,长时刻以往,关于个人和企业也将是额定一笔开支,假如进行私有化布置,也将必定程度下降运用本钱。

  1. 质量

现在 ChatGPT 其问题答复质量并不稳定,这与其练习数据相关,例如练习数据都是与日子,让其答复宇宙相关的问题,得到的答案则很有可能会胡乱伪造的。关于这部分,GitHub 上也有很多相关某一笔直范畴资源,如医学相关的华驼、法令相关的 LawGPT 等,当然也能够搭建本地常识库,如公司内问答人、客服机器人、文档帮手等。

为什么要运用GPTCache?

  1. 接入本钱极低。运用内置模型只需两步:初始化和替换模型 SDK 的 import。
  2. 下降 LLM 运用本钱。经过运用缓存获取类似问题的答案,能够削减 LLM 恳求次数,从而下降服务器资源压力。
  3. 削减呼应时延。类似问题的呼应时延只需毫秒级别。假如关于缓存返回的成果不满意,支撑绕过缓存重新生成。
  4. 高度定制化。能够依据业务场景拼装适宜的缓存,例如关于小数据量,只需求运用本地存储模型,例如SQLite + Faiss;关于大数据量场景,能够运用 MySQL/Oracle + Zilliz Cloud/Milvus。除了存储方面,其他模块也能够依据需求进行调整,例如预处理、Embedding、类似度评价和后处理等。

引荐Github资源

  • privateGPT
  • 开源模型列表

GPT运用

跟着 ChatGPT 的呈现,依据其 API 进行桌面运用、浏览器插件、服务代理等的开发也逐步增多,这些运用能够下降用户运用门槛,一起也提高了 ChatGPT的运用体会,例如经过定制化 UI、prompt 办理、数据导出等。

GPTCache 也适用于这种场景,它给个人用户带来的最直接优点是本钱下降和加快。假如缓存每次问答的成果,并到达必定的数据量,则能够离线处理使命。此外,关于运用服务供给者,依据用户画像对缓存数据进行精细化办理,能够使服务突破 LLM 模型的功能瓶颈,进一步改善服务的稳定性。

引荐资源列表

  • awesome-chatgpt-zh
  • awesome-open-gpt

多模态场景

跟着 ChatGPT 技术的不断遍及和运用拓展,AIGC(内容生成)成为了其间一个重要的方向,包含文本生成、图片生成和语音生成等多个范畴,这些技术的发展将进一步促进人工智能在各个范畴的运用。

最新版的 GPTCache 现已能够支撑多模态场景,包含了文本生成文本、文本生成图片、图文问答、文本生成语音等,更多比如参阅 Bootcamp。

将 GPTCache 运用于这一场景中,最具吸引力的是它能够显著下降时延。但是,这种方法也存在一些问题。例如,有时候即使输入类似,也不必定需求相同的答案。为了处理这个问题,能够越过缓存偏重新生成模型,或许在获取缓存答案后,运用小模型进行微调。与重新生成模型比较,小模型微调也能够有用下降呼应时刻。因而,在实践运用场景中,需求依据具体情况来判断 GPTCache 是否会带来收益,并决议怎么组合 GPTCache 的组件。