Penting
Lapisan caching untuk LLMS yang mengeksploitasi Elasticsearch, sepenuhnya kompatibel dengan caching langchain, baik untuk model obrolan dan embeddings.
pip install llm-elasticsearch-cacheCache Langchain dapat digunakan serupa dengan integrasi cache lainnya.
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" }
)
) Parameter es_index juga dapat mengambil alias. Hal ini memungkinkan untuk menggunakan ILM: mengelola siklus hidup indeks yang kami sarankan untuk dipertimbangkan untuk mengelola retensi dan mengendalikan pertumbuhan cache.
Lihatlah DocString kelas untuk semua parameter.
Data yang di -cache tidak akan dapat dicari secara default. Pengembang dapat menyesuaikan pembangunan dokumen Elasticsearch untuk menambahkan bidang teks yang diindeks, di mana harus menempatkan, misalnya, teks yang dihasilkan oleh LLM.
Ini dapat dilakukan dengan subklassing metode utama. Kelas cache baru dapat diterapkan juga ke indeks cache yang sudah ada sebelumnya:
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" ))Caching Embeddings diperoleh dengan menggunakan cachebackedembeddings, dengan cara yang sedikit berbeda dari dokumentasi resmi.
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
) Demikian pula dengan cache obrolan, orang dapat subkelas ElasticsearchStore untuk mengindeks vektor untuk pencarian.
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 Ketahuilah bahwa CacheBackedEmbeddings saat ini tidak mendukung pertanyaan caching, ini berarti bahwa kueri teks, untuk pencarian vektor, tidak akan di -cache. Namun, dengan mengesampingkan metode embed_query , seseorang harus dapat dengan mudah mengimplementasikannya.