مهم
طبقة التخزين المؤقت لـ 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 ، يجب أن يكون المرء قادرًا على تنفيذها بسهولة.