Memory And Embeddings
@socialagi/memory
provides a simple way to store and retrieve memories based on a relevancy score. The relevancy score was influenced by the Stanford Simulation paper and scores recency, importance, and relevance (based on vector similarity) of a memory when ranking.
This library is a work in progress and currently only supports non-persistent, in-memory storage.
npm install @socialagi/memory
MemoryStream
The MemoryStream
class is used to store and retrieve memories. Here's a basic example of how to use it:
import { MemoryStream } from "@socialagi/memory"
// Create a new instance of MemoryStream
const memoryStream = new MemoryStream()
// Store a memory
await memoryStream.store({
id: "hi",
content: "Hello, world!"
})
// Retrieve a memory
const memory = await memoryStream.get("hi")
// Search for memories relevant to a text
const returnedMemories = await memoryStream.search("hi said the canine")
Memories are saved using the Memory
interface.
- id: A unique identifier for the memory.
- content: The content of the memory.
- embedding: a vector returned from an embedding function
- createdAt: The date and time when the memory was created.
- updatedAt: The date and time when the memory was last updated.
- metadata: A record of any additional data associated with the memory.
Only context is required.
const memory: Memory = {
id: "unique-id",
content: "This is a memory.",
embedding: [0.1, 0.2, 0.3, 0.4],
createdAt: new Date(),
updatedAt: new Date(),
metadata: {
author: "John Doe",
location: "New York"
}
}
Embeddings
Embeddings are a way to represent text data in a numerical format that can be processed by machine learning algorithms. In @socialagi/memory
, we use the Embedder interface and its various implementations to create these embeddings.
Here's an example of how to use the default embedder:
import { getDefaultEmbedder } from "@socialagi/memory"
// Get the default embedder
const embedder = getDefaultEmbedder()
// Create an embedding
const embedding = await embedder.createEmbedding("Hello, world!")
The Embedder interface has a single method, createEmbedding(content: string), which takes a string and returns a Promise that resolves to an Embedding, which is an array of numbers.
We have two implementations of Embedder.
The defaultEmbeddder is a HuggingFaceEmbedder
using the "Supabase/gte-small" model (which performs better )
- HuggingFaceEmbedder: This uses the Hugging Face Transformers library to create embeddings. It uses a model specified at instantiation (default is "Supabase/gte-small") and creates embeddings asynchronously.
import { HuggingFaceEmbedder } from "@socialagi/memory"
// Create a new instance of HuggingFaceEmbedder
const embedder = new HuggingFaceEmbedder()
// Create an embedding
const embedding = await embedder.createEmbedding("Hello, world!")
- nullEmbedder: This is a simple implementation that always returns an empty array. It's useful when you only want to store and retrieve recent memories, and don't need to search for memories.
import { nullEmbedder } from "@socialagi/memory"
const stream = new MemoryStream(nullEmbedder)