!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())

[Skip to main content](#__docusaurus_skipToContent_fallback)

LangChain v0.2 is coming soon! Preview the new docs [here](/v0.2/docs/introduction/).

[

![🦜️🔗 Langchain](/v0.1/img/brand/wordmark.png)![🦜️🔗 Langchain](/v0.1/img/brand/wordmark-dark.png)

](/v0.1/)[Docs](/v0.1/docs/get_started/introduction/)[Use cases](/v0.1/docs/use_cases/)[Integrations](/v0.1/docs/integrations/platforms/)[API Reference](https://api.js.langchain.com)

[More](#)

*   [People](/v0.1/docs/people/)
*   [Community](/v0.1/docs/community/)
*   [Tutorials](/v0.1/docs/additional_resources/tutorials/)
*   [Contributing](/v0.1/docs/contributing/)

[v0.1](#)

*   [v0.2](https://js.langchain.com/v0.2/docs/introduction)
*   [v0.1](/v0.1/docs/get_started/introduction/)

[🦜🔗](#)

*   [LangSmith](https://smith.langchain.com)
*   [LangSmith Docs](https://docs.smith.langchain.com)
*   [LangChain Hub](https://smith.langchain.com/hub)
*   [LangServe](https://github.com/langchain-ai/langserve)
*   [Python Docs](https://python.langchain.com/)

[Chat](https://chatjs.langchain.com)[](https://github.com/langchain-ai/langchainjs)

Search

*   [Get started](/v0.1/docs/get_started/)
    
    *   [Introduction](/v0.1/docs/get_started/introduction/)
    *   [Installation](/v0.1/docs/get_started/installation/)
    *   [Quickstart](/v0.1/docs/get_started/quickstart/)
*   [LangChain Expression Language](/v0.1/docs/expression_language/)
    
    *   [Get started](/v0.1/docs/expression_language/get_started/)
    *   [Why use LCEL?](/v0.1/docs/expression_language/why/)
    *   [Interface](/v0.1/docs/expression_language/interface/)
    *   [Streaming](/v0.1/docs/expression_language/streaming/)
    *   [How to](/v0.1/docs/expression_language/how_to/routing/)
        
    *   [Cookbook](/v0.1/docs/expression_language/cookbook/)
        
    *   [LangChain Expression Language (LCEL)](/v0.1/docs/expression_language/)
*   [Modules](/v0.1/docs/modules/)
    
    *   [Model I/O](/v0.1/docs/modules/model_io/)
        
    *   [Retrieval](/v0.1/docs/modules/data_connection/)
        
        *   [Document loaders](/v0.1/docs/modules/data_connection/document_loaders/)
            
        *   [Text Splitters](/v0.1/docs/modules/data_connection/document_transformers/)
            
        *   [Retrievers](/v0.1/docs/modules/data_connection/retrievers/)
            
        *   [Retrieval](/v0.1/docs/modules/data_connection/)
        *   [Text embedding models](/v0.1/docs/modules/data_connection/text_embedding/)
            
            *   [Dealing with API errors](/v0.1/docs/modules/data_connection/text_embedding/api_errors/)
            *   [Caching](/v0.1/docs/modules/data_connection/text_embedding/caching_embeddings/)
            *   [Dealing with rate limits](/v0.1/docs/modules/data_connection/text_embedding/rate_limits/)
            *   [Adding a timeout](/v0.1/docs/modules/data_connection/text_embedding/timeouts/)
        *   [Vector stores](/v0.1/docs/modules/data_connection/vectorstores/)
            
        *   [Indexing](/v0.1/docs/modules/data_connection/indexing/)
        *   [Experimental](/v0.1/docs/modules/data_connection/experimental/multimodal_embeddings/google_vertex_ai/)
            
    *   [Chains](/v0.1/docs/modules/chains/)
    *   [Agents](/v0.1/docs/modules/agents/)
        
    *   [More](/v0.1/docs/modules/memory/)
        
*   [Security](/v0.1/docs/security/)
*   [Guides](/v0.1/docs/guides/)
    
*   [Ecosystem](/v0.1/docs/ecosystem/)
    
*   [LangGraph](/v0.1/docs/langgraph/)
*   * * *
    

*   [](/v0.1/)
*   [Modules](/v0.1/docs/modules/)
*   [Retrieval](/v0.1/docs/modules/data_connection/)
*   [Text embedding models](/v0.1/docs/modules/data_connection/text_embedding/)
*   Caching

On this page

Caching
=======

Embeddings can be stored or temporarily cached to avoid needing to recompute them.

Caching embeddings can be done using a `CacheBackedEmbeddings` instance.

The cache backed embedder is a wrapper around an embedder that caches embeddings in a key-value store.

The text is hashed and the hash is used as the key in the cache.

The main supported way to initialized a `CacheBackedEmbeddings` is the `fromBytesStore` static method. This takes in the following parameters:

*   `underlying_embedder`: The embedder to use for embedding.
*   `document_embedding_cache`: The cache to use for storing document embeddings.
*   `namespace`: (optional, defaults to "") The namespace to use for document cache. This namespace is used to avoid collisions with other caches. For example, set it to the name of the embedding model used.

**Attention:** Be sure to set the namespace parameter to avoid collisions of the same text embedded using different embeddings models.

Usage, in-memory[​](#usage-in-memory "Direct link to Usage, in-memory")
-----------------------------------------------------------------------

tip

See [this section for general instructions on installing integration packages](/v0.1/docs/get_started/installation/#installing-integration-packages).

*   npm
*   Yarn
*   pnpm

    npm install @langchain/openai @langchain/community

    yarn add @langchain/openai @langchain/community

    pnpm add @langchain/openai @langchain/community

Here's a basic test example with an in memory cache. This type of cache is primarily useful for unit tests or prototyping. Do not use this cache if you need to actually store the embeddings for an extended period of time:

    import { OpenAIEmbeddings } from "@langchain/openai";import { CacheBackedEmbeddings } from "langchain/embeddings/cache_backed";import { InMemoryStore } from "langchain/storage/in_memory";import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";import { FaissStore } from "@langchain/community/vectorstores/faiss";import { TextLoader } from "langchain/document_loaders/fs/text";const underlyingEmbeddings = new OpenAIEmbeddings();const inMemoryStore = new InMemoryStore();const cacheBackedEmbeddings = CacheBackedEmbeddings.fromBytesStore(  underlyingEmbeddings,  inMemoryStore,  {    namespace: underlyingEmbeddings.modelName,  });const loader = new TextLoader("./state_of_the_union.txt");const rawDocuments = await loader.load();const splitter = new RecursiveCharacterTextSplitter({  chunkSize: 1000,  chunkOverlap: 0,});const documents = await splitter.splitDocuments(rawDocuments);// No keys logged yet since the cache is emptyfor await (const key of inMemoryStore.yieldKeys()) {  console.log(key);}let time = Date.now();const vectorstore = await FaissStore.fromDocuments(  documents,  cacheBackedEmbeddings);console.log(`Initial creation time: ${Date.now() - time}ms`);/*  Initial creation time: 1905ms*/// The second time is much faster since the embeddings for the input docs have already been added to the cachetime = Date.now();const vectorstore2 = await FaissStore.fromDocuments(  documents,  cacheBackedEmbeddings);console.log(`Cached creation time: ${Date.now() - time}ms`);/*  Cached creation time: 8ms*/// Many keys logged with hashed valuesconst keys = [];for await (const key of inMemoryStore.yieldKeys()) {  keys.push(key);}console.log(keys.slice(0, 5));/*  [    'text-embedding-ada-002ea9b59e760e64bec6ee9097b5a06b0d91cb3ab64',    'text-embedding-ada-0023b424f5ed1271a6f5601add17c1b58b7c992772e',    'text-embedding-ada-002fec5d021611e1527297c5e8f485876ea82dcb111',    'text-embedding-ada-00262f72e0c2d711c6b861714ee624b28af639fdb13',    'text-embedding-ada-00262d58882330038a4e6e25ea69a938f4391541874'  ]*/

#### API Reference:

*   [OpenAIEmbeddings](https://api.js.langchain.com/classes/langchain_openai.OpenAIEmbeddings.html) from `@langchain/openai`
*   [CacheBackedEmbeddings](https://api.js.langchain.com/classes/langchain_embeddings_cache_backed.CacheBackedEmbeddings.html) from `langchain/embeddings/cache_backed`
*   [InMemoryStore](https://api.js.langchain.com/classes/langchain_core_stores.InMemoryStore.html) from `langchain/storage/in_memory`
*   [RecursiveCharacterTextSplitter](https://api.js.langchain.com/classes/langchain_textsplitters.RecursiveCharacterTextSplitter.html) from `langchain/text_splitter`
*   [FaissStore](https://api.js.langchain.com/classes/langchain_community_vectorstores_faiss.FaissStore.html) from `@langchain/community/vectorstores/faiss`
*   [TextLoader](https://api.js.langchain.com/classes/langchain_document_loaders_fs_text.TextLoader.html) from `langchain/document_loaders/fs/text`

Usage, Convex[​](#usage-convex "Direct link to Usage, Convex")
--------------------------------------------------------------

Here's an example with a [Convex](https://convex.dev/) as a cache.

### Create project[​](#create-project "Direct link to Create project")

Get a working [Convex](https://docs.convex.dev/) project set up, for example by using:

    npm create convex@latest

### Add database accessors[​](#add-database-accessors "Direct link to Add database accessors")

Add query and mutation helpers to `convex/langchain/db.ts`:

convex/langchain/db.ts

    export * from "langchain/util/convex";

### Configure your schema[​](#configure-your-schema "Direct link to Configure your schema")

Set up your schema (for indexing):

convex/schema.ts

    import { defineSchema, defineTable } from "convex/server";import { v } from "convex/values";export default defineSchema({  cache: defineTable({    key: v.string(),    value: v.any(),  }).index("byKey", ["key"]),});

### Example[​](#example "Direct link to Example")

    "use node";import { TextLoader } from "langchain/document_loaders/fs/text";import { CacheBackedEmbeddings } from "langchain/embeddings/cache_backed";import { OpenAIEmbeddings } from "@langchain/openai";import { ConvexKVStore } from "@langchain/community/storage/convex";import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";import { ConvexVectorStore } from "@langchain/community/vectorstores/convex";import { action } from "./_generated/server.js";export const ask = action({  args: {},  handler: async (ctx) => {    const underlyingEmbeddings = new OpenAIEmbeddings();    const cacheBackedEmbeddings = CacheBackedEmbeddings.fromBytesStore(      underlyingEmbeddings,      new ConvexKVStore({ ctx }),      {        namespace: underlyingEmbeddings.modelName,      }    );    const loader = new TextLoader("./state_of_the_union.txt");    const rawDocuments = await loader.load();    const splitter = new RecursiveCharacterTextSplitter({      chunkSize: 1000,      chunkOverlap: 0,    });    const documents = await splitter.splitDocuments(rawDocuments);    let time = Date.now();    const vectorstore = await ConvexVectorStore.fromDocuments(      documents,      cacheBackedEmbeddings,      { ctx }    );    console.log(`Initial creation time: ${Date.now() - time}ms`);    /*      Initial creation time: 1808ms    */    // The second time is much faster since the embeddings for the input docs have already been added to the cache    time = Date.now();    const vectorstore2 = await ConvexVectorStore.fromDocuments(      documents,      cacheBackedEmbeddings,      { ctx }    );    console.log(`Cached creation time: ${Date.now() - time}ms`);    /*      Cached creation time: 33ms    */  },});

#### API Reference:

*   [TextLoader](https://api.js.langchain.com/classes/langchain_document_loaders_fs_text.TextLoader.html) from `langchain/document_loaders/fs/text`
*   [CacheBackedEmbeddings](https://api.js.langchain.com/classes/langchain_embeddings_cache_backed.CacheBackedEmbeddings.html) from `langchain/embeddings/cache_backed`
*   [OpenAIEmbeddings](https://api.js.langchain.com/classes/langchain_openai.OpenAIEmbeddings.html) from `@langchain/openai`
*   [ConvexKVStore](https://api.js.langchain.com/classes/langchain_community_storage_convex.ConvexKVStore.html) from `@langchain/community/storage/convex`
*   [RecursiveCharacterTextSplitter](https://api.js.langchain.com/classes/langchain_textsplitters.RecursiveCharacterTextSplitter.html) from `langchain/text_splitter`
*   [ConvexVectorStore](https://api.js.langchain.com/classes/langchain_community_vectorstores_convex.ConvexVectorStore.html) from `@langchain/community/vectorstores/convex`

Usage, Redis[​](#usage-redis "Direct link to Usage, Redis")
-----------------------------------------------------------

Here's an example with a Redis cache.

You'll first need to install `ioredis` as a peer dependency and pass in an initialized client:

*   npm
*   Yarn
*   pnpm

    npm install ioredis

    yarn add ioredis

    pnpm add ioredis

    import { Redis } from "ioredis";import { OpenAIEmbeddings } from "@langchain/openai";import { CacheBackedEmbeddings } from "langchain/embeddings/cache_backed";import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";import { FaissStore } from "@langchain/community/vectorstores/faiss";import { TextLoader } from "langchain/document_loaders/fs/text";import { RedisByteStore } from "@langchain/community/storage/ioredis";const underlyingEmbeddings = new OpenAIEmbeddings();// Requires a Redis instance running at http://localhost:6379.// See https://github.com/redis/ioredis for full config options.const redisClient = new Redis();const redisStore = new RedisByteStore({  client: redisClient,});const cacheBackedEmbeddings = CacheBackedEmbeddings.fromBytesStore(  underlyingEmbeddings,  redisStore,  {    namespace: underlyingEmbeddings.modelName,  });const loader = new TextLoader("./state_of_the_union.txt");const rawDocuments = await loader.load();const splitter = new RecursiveCharacterTextSplitter({  chunkSize: 1000,  chunkOverlap: 0,});const documents = await splitter.splitDocuments(rawDocuments);let time = Date.now();const vectorstore = await FaissStore.fromDocuments(  documents,  cacheBackedEmbeddings);console.log(`Initial creation time: ${Date.now() - time}ms`);/*  Initial creation time: 1808ms*/// The second time is much faster since the embeddings for the input docs have already been added to the cachetime = Date.now();const vectorstore2 = await FaissStore.fromDocuments(  documents,  cacheBackedEmbeddings);console.log(`Cached creation time: ${Date.now() - time}ms`);/*  Cached creation time: 33ms*/// Many keys logged with hashed valuesconst keys = [];for await (const key of redisStore.yieldKeys()) {  keys.push(key);}console.log(keys.slice(0, 5));/*  [    'text-embedding-ada-002fa9ac80e1bf226b7b4dfc03ea743289a65a727b2',    'text-embedding-ada-0027dbf9c4b36e12fe1768300f145f4640342daaf22',    'text-embedding-ada-002ea9b59e760e64bec6ee9097b5a06b0d91cb3ab64',    'text-embedding-ada-002fec5d021611e1527297c5e8f485876ea82dcb111',    'text-embedding-ada-002c00f818c345da13fed9f2697b4b689338143c8c7'  ]*/

#### API Reference:

*   [OpenAIEmbeddings](https://api.js.langchain.com/classes/langchain_openai.OpenAIEmbeddings.html) from `@langchain/openai`
*   [CacheBackedEmbeddings](https://api.js.langchain.com/classes/langchain_embeddings_cache_backed.CacheBackedEmbeddings.html) from `langchain/embeddings/cache_backed`
*   [RecursiveCharacterTextSplitter](https://api.js.langchain.com/classes/langchain_textsplitters.RecursiveCharacterTextSplitter.html) from `langchain/text_splitter`
*   [FaissStore](https://api.js.langchain.com/classes/langchain_community_vectorstores_faiss.FaissStore.html) from `@langchain/community/vectorstores/faiss`
*   [TextLoader](https://api.js.langchain.com/classes/langchain_document_loaders_fs_text.TextLoader.html) from `langchain/document_loaders/fs/text`
*   [RedisByteStore](https://api.js.langchain.com/classes/langchain_community_storage_ioredis.RedisByteStore.html) from `@langchain/community/storage/ioredis`

* * *

#### Help us out by providing feedback on this documentation page:

[

Previous

Dealing with API errors

](/v0.1/docs/modules/data_connection/text_embedding/api_errors/)[

Next

Dealing with rate limits

](/v0.1/docs/modules/data_connection/text_embedding/rate_limits/)

*   [Usage, in-memory](#usage-in-memory)
*   [Usage, Convex](#usage-convex)
    *   [Create project](#create-project)
    *   [Add database accessors](#add-database-accessors)
    *   [Configure your schema](#configure-your-schema)
    *   [Example](#example)
*   [Usage, Redis](#usage-redis)

Community

*   [Discord](https://discord.gg/cU2adEyC7w)
*   [Twitter](https://twitter.com/LangChainAI)

GitHub

*   [Python](https://github.com/langchain-ai/langchain)
*   [JS/TS](https://github.com/langchain-ai/langchainjs)

More

*   [Homepage](https://langchain.com)
*   [Blog](https://blog.langchain.dev)

Copyright © 2024 LangChain, Inc.