Skip to main content

LLM 缓存集成

本文介绍如何使用不同的缓存来缓存单个 LLM 调用的结果。

from langchain.globals import set_llm_cache
from langchain_openai import OpenAI
# 为了更明显地展示缓存效果,让我们使用一个速度较慢的模型。
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", n=2, best_of=2)

内存 缓存​

from langchain_community.cache import InMemoryCache
set_llm_cache(InMemoryCache())
%%time
# 第一次调用时,尚未缓存,所以需要更长的时间
llm("Tell me a joke")
CPU times: user 52.2 ms, sys: 15.2 ms, total: 67.4 ms
Wall time: 1.19 s
"\n\n为什么自行车不能自己站起来?因为它...太累了!"
%%time
# 第二次调用时,已经缓存,所以速度更快
llm("Tell me a joke")
CPU times: user 191 µs, sys: 11 µs, total: 202 µs
Wall time: 205 µs
"\n\n为什么自行车不能自己站起来?因为它...太累了!"

SQLite 缓存​

!rm .langchain.db
# 我们可以使用 SQLite 缓存做同样的事情
from langchain_community.cache import SQLiteCache
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
%%time
# 第一次调用时,尚未缓存,所以需要更长的时间
llm("Tell me a joke")
CPU times: user 33.2 ms, sys: 18.1 ms, total: 51.2 ms
Wall time: 667 ms
'\n\n为什么鸡要过马路?\n\n为了到达对面。'
%%time
# 第二次调用时,已经缓存,所以速度更快
llm("Tell me a joke")
CPU times: user 4.86 ms, sys: 1.97 ms, total: 6.83 ms
Wall time: 5.79 ms
'\n\n为什么鸡要过马路?\n\n为了到达对面。'

Upstash Redis 缓存​

标准缓存​

使用 Upstash Redis 来缓存提示和响应,使用无服务器 HTTP API。

import langchain
from langchain_community.cache import UpstashRedisCache
from upstash_redis import Redis
URL = "<UPSTASH_REDIS_REST_URL>"
TOKEN = "<UPSTASH_REDIS_REST_TOKEN>"
langchain.llm_cache = UpstashRedisCache(redis_=Redis(url=URL, token=TOKEN))
%%time
# 第一次调用时,尚未缓存,所以需要更长的时间
llm("Tell me a joke")
CPU times: user 7.56 ms, sys: 2.98 ms, total: 10.5 ms
Wall time: 1.14 s
'\n\n为什么鸡要过马路?\n\n为了到达对面!'
%%time
# 第二次调用时,已经缓存,所以速度更快
llm("Tell me a joke")
CPU times: user 2.78 ms, sys: 1.95 ms, total: 4.73 ms
Wall time: 82.9 ms
'\n\n为什么鸡要过马路?\n\n为了到达对面!'

Redis 缓存​

标准缓存​

使用 Redis 来缓存提示和响应。

# 我们可以使用 Redis 缓存做同样的事情
# (在运行此示例之前,请确保您的本地 Redis 实例正在运行)
from langchain_community.cache import RedisCache
from redis import Redis
set_llm_cache(RedisCache(redis_=Redis()))
%%time
# 第一次调用时,尚未缓存,所以需要更长的时间
llm("Tell me a joke")
CPU times: user 6.88 ms, sys: 8.75 ms, total: 15.6 ms
Wall time: 1.04 s
'\n\n为什么鸡要过马路?\n\n为了到达对面!'
%%time
# 第二次调用时,已经缓存,所以速度更快
llm("Tell me a joke")
CPU times: user 1.59 ms, sys: 610 µs, total: 2.2 ms
Wall time: 5.58 ms
'\n\n为什么鸡要过马路?\n\n为了到达对面!'

语义缓存​

使用 Redis 缓存提示和响应,并根据语义相似性评估命中情况。

from langchain_community.cache import RedisSemanticCache
from langchain_openai import OpenAIEmbeddings
set_llm_cache(
RedisSemanticCache(redis_url="redis://localhost:6379", embedding=OpenAIEmbeddings())
)
%%time
# 第一次调用时,尚未缓存,所以需要更长的时间
llm("Tell me a joke")
CPU times: user 351 ms, sys: 156 ms, total: 507 ms
Wall time: 3.37 s
"\n\n为什么科学家不相信原子?\n因为它们构成了一切。"
%%time
# 第二次调用时,虽然不是直接命中,但问题在语义上与原始问题相似,
# 因此使用了缓存的结果!
llm("Tell me one joke")
CPU times: user 6.25 ms, sys: 2.72 ms, total: 8.97 ms
Wall time: 262 ms
"\n\n为什么科学家不相信原子?\n因为它们构成了一切。"

GPTCache​

我们可以使用 GPTCache 来进行精确匹配缓存,或者基于语义相似性缓存结果。

让我们首先从一个精确匹配的示例开始。

import hashlib
from gptcache import Cache
from gptcache.manager.factory import manager_factory
from gptcache.processor.pre import get_prompt
from langchain_community.cache import GPTCache
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)
cache_obj.init(
pre_embedding_func=get_prompt,
data_manager=manager_factory(manager="map", data_dir=f"map_cache_{hashed_llm}"),
)
set_llm_cache(GPTCache(init_gptcache))
%%time
# 第一次运行,尚未缓存,所以耗时较长
llm("Tell me a joke")
CPU times: user 21.5 ms, sys: 21.3 ms, total: 42.8 ms
Wall time: 6.2 s
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'
%%time
# 第二次运行,已经缓存,所以速度更快
llm("Tell me a joke")
CPU times: user 571 µs, sys: 43 µs, total: 614 µs
Wall time: 635 µs
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'

现在让我们展示一个语义相似性缓存的示例。

import hashlib
from gptcache import Cache
from gptcache.adapter.api import init_similar_cache
from langchain_community.cache import GPTCache
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}")
set_llm_cache(GPTCache(init_gptcache))
%%time
# 第一次运行,尚未缓存,所以耗时较长
llm("Tell me a joke")
CPU times: user 1.42 s, sys: 279 ms, total: 1.7 s
Wall time: 8.44 s
'\n\n为什么小鸡要过马路?\n\n为了到达对面。'
%%time
# 这是一个精确匹配,因此在缓存中找到
llm("Tell me a joke")
CPU times: user 866 ms, sys: 20 ms, total: 886 ms
Wall time: 226 ms
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'
%%time
# 这不是一个精确匹配,但在语义上相似,因此也能命中缓存
llm("Tell me joke")
CPU times: user 853 ms, sys: 14.8 ms, total: 868 ms
Wall time: 224 ms
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'

Momento 缓存​

使用 Momento 缓存提示和响应。

需要使用 Momento,取消下面的注释以安装:

%pip install --upgrade --quiet  momento

您需要获取一个 Momento 授权令牌才能使用这个类。这可以通过将其传递给 MomentoChatMessageHistory.from_client_params 的命名参数 auth_token,或者将其设置为环境变量 MOMENTO_AUTH_TOKEN。

from datetime import timedelta
from langchain_community.cache import MomentoCache
cache_name = "langchain"
ttl = timedelta(days=1)
set_llm_cache(MomentoCache.from_client_params(cache_name, ttl))
%%time
# 第一次运行,尚未缓存,所以耗时较长
llm("Tell me a joke")
CPU times: user 40.7 ms, sys: 16.5 ms, total: 57.2 ms
Wall time: 1.73 s
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'
%%time
# 第二次运行,已经缓存,所以速度更快
# 在与缓存相同区域运行时,延迟为个位数毫秒
llm("Tell me a joke")
CPU times: user 3.16 ms, sys: 2.98 ms, total: 6.14 ms
Wall time: 57.9 ms
'\n\n为什么小鸡要过马路?\n\n为了到达对面!'

SQLAlchemy 缓存​

您可以使用 SQLAlchemyCache 与 SQLAlchemy 支持的任何 SQL 数据库进行缓存。

# from langchain.cache import SQLAlchemyCache
# from sqlalchemy import create_engine
# engine = create_engine("postgresql://postgres:postgres@localhost:5432/postgres")
# set_llm_cache(SQLAlchemyCache(engine))

自定义 SQLAlchemy 模式​

您可以定义自己的声明性 SQLAlchemyCache 子类来自定义用于缓存的模式。例如,为了支持在 Postgres 中使用高速全文提示索引,可以使用以下方法:

from langchain_community.cache import SQLAlchemyCache
from sqlalchemy import Column, Computed, Index, Integer, Sequence, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils import TSVectorType
Base = declarative_base()
class FulltextLLMCache(Base):
"""用于全文索引的 Postgres 表 LLM 缓存"""
__tablename__ = "llm_cache_fulltext"
id = Column(Integer, Sequence("cache_id"), primary_key=True)
prompt = Column(String, nullable=False)
llm = Column(String, nullable=False)
idx = Column(Integer)
response = Column(String)
prompt_tsv = Column(
TSVectorType(),
Computed("to_tsvector('english', llm || ' ' || prompt)", persisted=True),
)
__table_args__ = (
Index("idx_fulltext_prompt_tsv", prompt_tsv, postgresql_using="gin"),
)
engine = create_engine("postgresql://postgres:postgres@localhost:5432/postgres")
set_llm_cache(SQLAlchemyCache(engine, FulltextLLMCache))

Cassandra 缓存​

Apache Cassandra® 是一种 NoSQL、面向行的、高度可扩展且高度可用的数据库。从版本 5.0 开始,该数据库具备 矢量搜索功能。

您可以使用 Cassandra 缓存 LLM 响应,可以选择精确匹配的 CassandraCache 或(基于向量相似性的)CassandraSemanticCache。

让我们看看两者的运作方式。接下来的单元格将引导您完成(少量)必需的设置,接着的单元格展示了两种可用的缓存类。

必需的依赖项​

%pip install --upgrade --quiet "cassio>=0.1.4"

连接到数据库​

本页面展示的 Cassandra 缓存可用于 Cassandra 以及其他派生数据库,比如使用 CQL(Cassandra 查询语言)协议的 Astra DB。

DataStax Astra DB 是建立在 Cassandra 基础上的托管式无服务器数据库,提供相同的接口和优势。

根据您是连接到 Cassandra 集群还是通过 CQL 连接到 Astra DB,实例化缓存时会提供不同的参数(通过初始化 CassIO 连接)。

连接到 Cassandra 集群​

您首先需要创建一个 cassandra.cluster.Session 对象,如 Cassandra 驱动程序文档 中所述。细节会有所不同(例如网络设置和身份验证),但大致如下:

from cassandra.cluster import Cluster
cluster = Cluster(["127.0.0.1"])
session = cluster.connect()

现在,您可以将会话与所需的 keyspace 名称一起设置为全局 CassIO 参数:

import cassio
CASSANDRA_KEYSPACE = input("CASSANDRA_KEYSPACE = ")
cassio.init(session=session, keyspace=CASSANDRA_KEYSPACE)
CASSANDRA_KEYSPACE =  demo_keyspace

通过 CQL 连接到 Astra DB​

在这种情况下,您可以使用以下连接参数初始化 CassIO:

  • 数据库 ID,例如 01234567-89ab-cdef-0123-456789abcdef

  • 令牌,例如 AstraCS:6gBhNmsk135....(必须是“数据库管理员”令牌)

  • 可选的 Keyspace 名称(如果省略,将使用数据库的默认 Keyspace)

import getpass
ASTRA_DB_ID = input("ASTRA_DB_ID = ")
ASTRA_DB_APPLICATION_TOKEN = getpass.getpass("ASTRA_DB_APPLICATION_TOKEN = ")
desired_keyspace = input("ASTRA_DB_KEYSPACE(可选,可以留空) = ")
if desired_keyspace:
ASTRA_DB_KEYSPACE = desired_keyspace
else:
ASTRA_DB_KEYSPACE = None
ASTRA_DB_ID =  01234567-89ab-cdef-0123-456789abcdef
ASTRA_DB_APPLICATION_TOKEN = ········
ASTRA_DB_KEYSPACE(可选,可以留空) = my_keyspace
import cassio
cassio.init(
database_id=ASTRA_DB_ID,
token=ASTRA_DB_APPLICATION_TOKEN,
keyspace=ASTRA_DB_KEYSPACE,
)

Cassandra:精确缓存​

当提供的提示与已经遇到的内容 完全 相同时,这将避免调用 LLM:

from langchain_community.cache import CassandraCache
from langchain_core.globals import set_llm_cache
set_llm_cache(CassandraCache())
%%time
print(llm.invoke("为什么月球总是展示同一面?"))
月球与地球之间存在潮汐锁定,这意味着月球自转的轴与绕地球的轨道同步。这导致月球总是向地球展示同一面。这是因为地球和月球之间的引力作用导致月球的自转随时间减慢,直到达到一个点,月球绕自身轴旋转所需的时间与绕地球轨道所需的时间相同。这种现象在围绕母行星运行的卫星中很常见,被称为潮汐锁定。
CPU times: user 92.5 ms, sys: 8.89 ms, total: 101 ms
Wall time: 1.98 s
%%time
print(llm.invoke("为什么月球总是展示同一面?"))
月球与地球之间存在潮汐锁定,这意味着月球自转的轴与绕地球的轨道同步。这导致月球总是向地球展示同一面。这是因为地球和月球之间的引力作用导致月球的自转随时间减慢,直到达到一个点,月球绕自身轴旋转所需的时间与绕地球轨道所需的时间相同。这种现象在围绕母行星运行的卫星中很常见,被称为潮汐锁定。```

CPU 时间:用户 5.51 毫秒,系统:0 毫秒,总计:5.51 毫秒

墙上时间:5.78 毫秒

卡桑德拉:语义缓存​

该缓存将进行语义相似性搜索,并在找到足够相似的缓存条目时返回命中。为此,您需要提供您选择的 Embeddings 实例。

from langchain_openai import OpenAIEmbeddings
embedding = OpenAIEmbeddings()
from langchain_community.cache import CassandraSemanticCache
from langchain_core.globals import set_llm_cache
set_llm_cache(
CassandraSemanticCache(
embedding=embedding,
table_name="my_semantic_cache",
)
)
%%time
print(llm.invoke("为什么月球总是展示同一面?"))

月球之所以总是展示同一面,是因为一种称为同步自转的现象。这意味着月球绕其轴线旋转的速度与绕地球轨道运行的速度相同,大约需要27.3天。这导致月球的同一面始终面向地球。这是由地球和月球之间的引力所致,这些引力导致月球的自转逐渐减慢并与其轨道同步。这在我们太阳系的许多卫星中是一种常见现象。

CPU 时间:用户 49.5 毫秒,系统:7.38 毫秒,总计:56.9 毫秒

墙上时间:2.55 秒

%%time
print(llm.invoke("为什么我们总是看到月球的一面?"))

月球之所以总是展示同一面,是因为一种称为同步自转的现象。这意味着月球绕其轴线旋转的速度与绕地球轨道运行的速度相同,大约需要27.3天。这导致月球的同一面始终面向地球。这是由地球和月球之间的引力所致,这些引力导致月球的自转逐渐减慢并与其轨道同步。这在我们太阳系的许多卫星中是一种常见现象。

CPU 时间:用户 21.2 毫秒,系统:3.38 毫秒,总计:24.6 毫秒

墙上时间:532 毫秒

归属声明​

Apache Cassandra、Cassandra 和 Apache 分别是 Apache Software Foundation 在美国和/或其他国家的注册商标或商标。

Astra DB 缓存​

您可以轻松地将 Astra DB 用作 LLM 缓存,可以选择“exact”或“基于语义”的缓存。 确保您有一个正在运行的数据库(必须是启用矢量的数据库才能使用语义缓存),并在 Astra 仪表板上获取所需的凭据:

  • API 端点类似于 https://01234567-89ab-cdef-0123-456789abcdef-us-east1.apps.astra.datastax.com
  • 令牌类似于 AstraCS:6gBhNmsk135....
import getpass
ASTRA_DB_API_ENDPOINT = input("ASTRA_DB_API_ENDPOINT = ")
ASTRA_DB_APPLICATION_TOKEN = getpass.getpass("ASTRA_DB_APPLICATION_TOKEN = ")

ASTRA_DB_API_ENDPOINT = https://01234567-89ab-cdef-0123-456789abcdef-us-east1.apps.astra.datastax.com

ASTRA_DB_APPLICATION_TOKEN = ········

### Astra DB 精确 LLM 缓存
当提供的提示与已经遇到的提示“完全”相同时,这将避免调用 LLM:
```python
from langchain.globals import set_llm_cache
from langchain_astradb import AstraDBCache
set_llm_cache(
AstraDBCache(
api_endpoint=ASTRA_DB_API_ENDPOINT,
token=ASTRA_DB_APPLICATION_TOKEN,
)
)
%%time
print(llm.invoke("真正的伪造与虚假的真相相同吗?"))

对于这个问题没有明确的答案,因为它取决于“真正的伪造”和“虚假的真相”这两个术语的解释。然而,一个可能的解释是,真正的伪造是一种旨在欺骗的伪造品或模仿品,而虚假的真相是一种被呈现为真实的虚假陈述。

CPU 时间:用户 70.8 毫秒,系统:4.13 毫秒,总计:74.9 毫秒

墙上时间:2.06 秒

%%time
print(llm.invoke("真正的伪造与虚假的真相相同吗?"))

对于这个问题没有明确的答案,因为它取决于“真正的伪造”和“虚假的真相”这两个术语的解释。然而,一个可能的解释是,真正的伪造是一种旨在欺骗的伪造品或模仿品,而虚假的真相是一种被呈现为真实的虚假陈述。

CPU 时间:用户 15.1 毫秒,系统:3.7 毫秒,总计:18.8 毫秒

墙上时间:531 毫秒

Astra DB 语义缓存​

该缓存将进行语义相似性搜索,并在找到足够相似的缓存条目时返回命中。为此,您需要提供您选择的 Embeddings 实例。

from langchain_openai import OpenAIEmbeddings
embedding = OpenAIEmbeddings()
from langchain_astradb import AstraDBSemanticCache
set_llm_cache(
```python
from langchain_community.cache import AzureCosmosDBSemanticCache
from langchain_community.vectorstores.azure_cosmos_db import (
CosmosDBSimilarityType,
CosmosDBVectorSearchType,
)
from langchain_openai import OpenAIEmbeddings
# 从 Azure Cosmos DB 语义缓存中调用 AstraDBSemanticCache
set_llm_cache(
AzureCosmosDBSemanticCache(
cosmosdb_connection_string=CONNECTION_STRING,
cosmosdb_client=None,
embedding=OpenAIEmbeddings(),
database_name=DB_NAME,
collection_name=COLLECTION_NAME,
num_lists=num_lists,
similarity=similarity_algorithm,
kind=kind,
dimensions=dimensions,
m=m,
ef_construction=ef_construction,
ef_search=ef_search,
score_threshold=score_threshold,
application_name=application_name,
)
)
%%time
# 第一次调用时,由于尚未缓存,所以需要更长时间
llm("Tell me a joke")
CPU times: user 45.6 ms, sys: 19.7 ms, total: 65.3 ms
Wall time: 2.29 s
'\n\nWhy was the math book sad? Because it had too many problems.'
%%time
# 第一次调用时,由于尚未缓存,所以需要更长时间
llm("Tell me a joke")
CPU times: user 9.61 ms, sys: 3.42 ms, total: 13 ms
Wall time: 474 ms

Elasticsearch 缓存​

这是一个使用 Elasticsearch 的 LLM 缓存层。

首先安装 LangChain 与 Elasticsearch 的集成。

%pip install -U langchain-elasticsearch

使用 ElasticsearchCache 类。

简单示例:

from elasticsearch import Elasticsearch
from langchain.globals import set_llm_cache
from langchain_elasticsearch import ElasticsearchCache
es_client = Elasticsearch(hosts="http://localhost:9200")
set_llm_cache(
ElasticsearchCache(
es_connection=es_client,
index_name="llm-chat-cache",
metadata={"project": "my_chatgpt_project"},
)
)

index_name 参数也可以接受别名。这允许使用我们建议考虑用于管理保留和控制缓存增长的 ILM: 管理索引生命周期。

查看类的文档字符串以获取所有参数。

对生成的文本建立索引​

默认情况下,缓存数据是无法搜索的。开发人员可以自定义构建 Elasticsearch 文档的方式,以添加索引文本字段,例如将由 LLM 生成的文本放入其中。

可以通过子类化并重写方法来实现此目的。新的缓存类也可以应用于现有的缓存索引:

import json
from typing import Any, Dict, List
from elasticsearch import Elasticsearch
from langchain.globals import set_llm_cache
from langchain_core.caches import RETURN_VAL_TYPE
from langchain_elasticsearch import ElasticsearchCache
class SearchableElasticsearchCache(ElasticsearchCache):
@property
def mapping(self) -> Dict[str, Any]:
mapping = super().mapping
mapping["mappings"]["properties"]["parsed_llm_output"] = {
"type": "text",
"analyzer": "english",
}
return mapping
def build_document(
self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE
) -> Dict[str, Any]:
body = super().build_document(prompt, llm_string, return_val)
body["parsed_llm_output"] = self._parse_output(body["llm_output"])
return body
@staticmethod
def _parse_output(data: List[str]) -> List[str]:
return [
json.loads(output)["kwargs"]["message"]["kwargs"]["content"]
for output in data
]
es_client = Elasticsearch(hosts="http://localhost:9200")
set_llm_cache(
SearchableElasticsearchCache(es_connection=es_client, index_name="llm-chat-cache")
)

在覆盖映射和文档构建时,请仅进行增量修改,保持基本映射不变。

可选缓存​

您还可以选择关闭特定 LLM 的缓存。在下面的示例中,即使全局缓存已启用,我们也会关闭特定 LLM 的缓存。

llm = OpenAI(model_name="gpt-3.5-turbo-instruct", n=2, best_of=2, cache=False)
%%time
llm("Tell me a joke")
CPU times: user 5.8 ms, sys: 2.71 ms, total: 8.51 ms
Wall time: 745 ms
'\n\n为什么小鸡要过马路?\n\n为了到达另一边!'
%%time
llm("Tell me a joke")
CPU times: user 4.91 ms, sys: 2.64 ms, total: 7.55 ms
Wall time: 623 ms
'\n\n两个人偷了一个日历。他们各自获得了六个月。'

链中的可选缓存​

您还可以为链中的特定节点关闭缓存。请注意,由于某些接口的原因,通常更容易先构建链,然后再编辑 LLM。

作为示例,我们将加载一个总结器映射-减少链。我们将为映射步骤缓存结果,但在合并步骤中不冻结它。

llm = OpenAI(model_name="gpt-3.5-turbo-instruct")
no_cache_llm = OpenAI(model_name="gpt-3.5-turbo-instruct", cache=False)
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter()
with open("../../how_to/state_of_the_union.txt") as f:
state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)
from langchain_core.documents import Document
docs = [Document(page_content=t) for t in texts[:3]]
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce", reduce_llm=no_cache_llm)
%%time
chain.run(docs)
CPU times: user 452 ms, sys: 60.3 ms, total: 512 ms
Wall time: 5.09 s
'\n\n拜登总统正在讨论美国拯救计划和两党基础设施法案,这将创造就业机会并帮助美国人。他还谈到了他对美国的愿景,其中包括投资于教育和基础设施。针对俄罗斯在乌克兰的侵略,美国正在与欧洲盟友一起实施制裁并孤立俄罗斯。美国部队正在动员起来,以保护北约国家,以防普京决定继续向西推进。乌克兰人正在勇敢地反击,但接下来的几周对他们来说将是艰难的。普京最终将为他的行动付出高昂的代价。美国人不应感到惊慌,因为美国正在采取行动保护自己的利益和盟友。'

再次运行时,我们看到它运行速度大大加快,但最终答案不同。这是由于在映射步骤进行缓存,但在减少步骤不进行缓存。

%%time
chain.run(docs)
CPU times: user 11.5 ms, sys: 4.33 ms, total: 15.8 ms
Wall time: 1.04 s
'\n\n拜登总统正在讨论美国拯救计划和两党基础设施法案,这将创造就业机会并帮助美国人。他还谈到了他对美国的愿景,其中包括投资于教育和基础设施。'
!rm .langchain.db sqlite.db

OpenSearch 语义缓存​

使用 OpenSearch 作为语义缓存,缓存提示和响应,并根据语义相似性评估命中。

```python
from langchain_openai import OpenAIEmbeddings
set_llm_cache(
OpenSearchSemanticCache(
opensearch_url="http://localhost:9200", embedding=OpenAIEmbeddings()
)
)
%%time
# 第一次调用,因为还未缓存,所以需要更长的时间
llm("告诉我一个笑话")

CPU times: user 39.4 ms, sys: 11.8 ms, total: 51.2 ms

Wall time: 1.55 s


"\n\n为什么科学家不相信原子?\n\n因为它们组成了一切。"

%%time
# 第二次调用,虽然不是直接命中,但问题在语义上与原始问题相似,
# 所以它使用了缓存结果!
llm("告诉我一个笑话")

CPU times: user 4.66 ms, sys: 1.1 ms, total: 5.76 ms

Wall time: 113 ms


"\n\n为什么科学家不相信原子?\n\n因为它们组成了一切。"



Was this page helpful?


You can leave detailed feedback on GitHub.