Source code for langchain_core.caches

"""
.. 警告::
  Beta 功能!

**Cache**  为LLMs提供了一个可选的缓存层。

Cache 有两个用处:

- 如果你经常多次请求相同的完成,它可以通过减少你向LLM提供商发出的API调用来为你节省金钱。
- 通过减少你向LLM提供商发出的API调用,它可以加快你的应用程序速度。

Cache 直接与Memory竞争。请参阅文档了解优缺点。

**类层次结构:** 

.. code-block::

    BaseCache --> <name>Cache  # 例如:InMemoryCache, RedisCache, GPTCache
"""
from __future__ import annotations

from abc import ABC, abstractmethod
from typing import Any, Dict, Optional, Sequence, Tuple

from langchain_core.outputs import Generation
from langchain_core.runnables import run_in_executor

RETURN_VAL_TYPE = Sequence[Generation]


[docs]class BaseCache(ABC): """这个接口为LLMs和Chat模型提供了一个缓存层。 缓存接口包括以下方法: - lookup: 根据提示和llm_string查找值。 - update: 根据提示和llm_string更新缓存。 - clear: 清除缓存。 此外,缓存接口还提供了每个方法的异步版本。 异步方法的默认实现是在执行器中运行同步方法。建议重写异步方法并提供异步实现,以避免不必要的开销。 """
[docs] @abstractmethod def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """根据提示和llm_string进行查找。 期望缓存实现从提示和llm_string的2元组中生成一个键(例如,通过使用分隔符将它们连接起来)。 参数: prompt:提示的字符串表示。 对于Chat模型,提示是将提示序列化为语言模型的非平凡表示。 llm_string:LLM配置的字符串表示。 这用于捕获LLM的调用参数 (例如,模型名称、温度、停止标记、最大标记等)。 这些调用参数被序列化为字符串表示。 返回: 在缓存未命中时,返回None。在缓存命中时,返回缓存的值。 缓存的值是Generations(或子类)的列表。 """
[docs] @abstractmethod def update(self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE) -> None: """根据提示和llm_string更新缓存。 提示和llm_string用于生成缓存的键。 键应该与查找方法的键匹配。 参数: prompt:提示的字符串表示。 对于Chat模型,提示是将提示序列化为语言模型的非平凡表示。 llm_string:LLM配置的字符串表示。 这用于捕获LLM的调用参数 (例如,模型名称、温度、停止标记、最大标记等)。 这些调用参数被序列化为字符串表示。 return_val:要缓存的值。该值是Generations的列表(或子类)。 """
[docs] @abstractmethod def clear(self, **kwargs: Any) -> None: """清除可以接受额外关键字参数的缓存。"""
[docs] async def alookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """根据提示和llm_string进行查找。 期望缓存实现从提示和llm_string的2元组中生成一个键(例如,通过使用分隔符将它们连接起来)。 参数: prompt:提示的字符串表示。 对于Chat模型,提示是将提示序列化为语言模型的非平凡表示。 llm_string:LLM配置的字符串表示。 这用于捕获LLM的调用参数 (例如,模型名称、温度、停止标记、最大标记等)。 这些调用参数被序列化为字符串表示。 返回: 在缓存未命中时,返回None。在缓存命中时,返回缓存的值。 缓存的值是Generations(或子类)的列表。 """ return await run_in_executor(None, self.lookup, prompt, llm_string)
[docs] async def aupdate( self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE ) -> None: """根据提示和llm_string更新缓存。 提示和llm_string用于生成缓存的键。 键应该与查找方法的键匹配。 参数: prompt:提示的字符串表示。 对于Chat模型,提示是将提示序列化为语言模型的非平凡表示。 llm_string:LLM配置的字符串表示。 这用于捕获LLM的调用参数 (例如,模型名称、温度、停止标记、最大标记等)。 这些调用参数被序列化为字符串表示。 return_val:要缓存的值。该值是Generations的列表(或子类)。 """ return await run_in_executor(None, self.update, prompt, llm_string, return_val)
[docs] async def aclear(self, **kwargs: Any) -> None: """清除可以接受额外关键字参数的缓存。""" return await run_in_executor(None, self.clear, **kwargs)
[docs]class InMemoryCache(BaseCache): """在内存中存储东西的缓存。"""
[docs] def __init__(self) -> None: """使用空缓存进行初始化。""" self._cache: Dict[Tuple[str, str], RETURN_VAL_TYPE] = {}
[docs] def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """根据提示和llm_string进行查找。""" return self._cache.get((prompt, llm_string), None)
[docs] def update(self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE) -> None: """根据提示和llm_string更新缓存。""" self._cache[(prompt, llm_string)] = return_val
[docs] def clear(self, **kwargs: Any) -> None: """清除缓存。""" self._cache = {}
[docs] async def alookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """根据提示和llm_string进行查找。""" return self.lookup(prompt, llm_string)
[docs] async def aupdate( self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE ) -> None: """根据提示和llm_string更新缓存。""" self.update(prompt, llm_string, return_val)
[docs] async def aclear(self, **kwargs: Any) -> None: """清除缓存。""" self.clear()