"""
.. 警告::
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()