Важный
Уровень кэширования для LLMS, который использует Elasticsearch, полностью совместимый с кэшированием Langchain, как для моделей чата, так и для моделей внедрения.
pip install llm-elasticsearch-cacheКэш Langchain может использоваться аналогично другим интеграциям кэша.
from langchain . globals import set_llm_cache
from llmescache . langchain import ElasticsearchCache
from elasticsearch import Elasticsearch
es_client = Elasticsearch ( hosts = "http://localhost:9200" )
set_llm_cache (
ElasticsearchCache (
es_client = es_client ,
es_index = "llm-chat-cache" ,
metadata = { "project" : "my_chatgpt_project" }
)
) Параметр es_index также может принимать псевдонимы. Это позволяет использовать ILM: управлять жизненным циклом индекса, который мы предлагаем рассмотреть для управления удержанием и контролем роста кэша.
Посмотрите на класс Docstring для всех параметров.
Кэшированные данные не будут доступны для поиска по умолчанию. Разработчик может настроить построение документа Elasticsearch, чтобы добавить индексированные текстовые поля, куда поместить, например, текст, сгенерированный LLM.
Это может быть сделано путем подклассионного конец методов переоценки. Новый класс кэша может быть применен также к ранее существовавшим индексу кэша:
from llmescache . langchain import ElasticsearchCache
from elasticsearch import Elasticsearch
from langchain_core . caches import RETURN_VAL_TYPE
from typing import Any , Dict , List
from langchain . globals import set_llm_cache
import json
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_client = es_client , es_index = "llm-chat-cache" ))Кэширование встраиваний получается с помощью Cachebackedembeddings, немного иначе, чем официальная документация.
from llmescache . langchain import ElasticsearchStore
from elasticsearch import Elasticsearch
from langchain . embeddings import CacheBackedEmbeddings
from langchain_openai import OpenAIEmbeddings
es_client = Elasticsearch ( hosts = "http://localhost:9200" )
underlying_embeddings = OpenAIEmbeddings ( model = "text-embedding-3-small" )
store = ElasticsearchStore (
es_client = es_client ,
es_index = "llm-embeddings-cache" ,
namespace = underlying_embeddings . model ,
metadata = { "project" : "my_llm_project" }
)
cached_embeddings = CacheBackedEmbeddings (
underlying_embeddings ,
store
) Подобно кешу чата, можно подкласс ElasticsearchStore , чтобы индексировать векторы для поиска.
from llmescache . langchain import ElasticsearchStore
from typing import Any , Dict , List
class SearchableElasticsearchStore ( ElasticsearchStore ):
@ property
def mapping ( self ) -> Dict [ str , Any ]:
mapping = super (). mapping
mapping [ "mappings" ][ "properties" ][ "vector" ] = { "type" : "dense_vector" , "dims" : 1536 , "index" : True , "similarity" : "dot_product" }
return mapping
def build_document ( self , llm_input : str , vector : List [ float ]) -> Dict [ str , Any ]:
body = super (). build_document ( llm_input , vector )
body [ "vector" ] = vector
return body Имейте в виду, что CacheBackedEmbeddings в настоящее время не поддерживает кэширование запросов, это означает, что текстовые запросы для векторных поисков не будут кэшированы. Однако, переопределив метод embed_query , нужно легко его реализовать.