Skip to content

Commit 01375ef

Browse files
dschenkelmandschenkelmanbracesproul
authored
langchain[minor]: Support storing and retrieving Document id field in MemoryVectorStore (#6572)
Co-authored-by: dschenkelman <[email protected]> Co-authored-by: Brace Sproul <[email protected]>
1 parent d71ce68 commit 01375ef

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

langchain/src/vectorstores/memory.ts

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface MemoryVector {
1717
embedding: number[];
1818
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1919
metadata: Record<string, any>;
20+
id?: string;
2021
}
2122

2223
/**
@@ -186,6 +187,7 @@ export class MemoryVectorStore extends VectorStore {
186187
content: documents[idx].pageContent,
187188
embedding,
188189
metadata: documents[idx].metadata,
190+
id: documents[idx].id,
189191
}));
190192

191193
this.memoryVectors = this.memoryVectors.concat(memoryVectors);
@@ -204,6 +206,7 @@ export class MemoryVectorStore extends VectorStore {
204206
const doc = new Document({
205207
metadata: memoryVector.metadata,
206208
pageContent: memoryVector.content,
209+
id: memoryVector.id,
207210
});
208211
return filter(doc);
209212
};
@@ -215,6 +218,7 @@ export class MemoryVectorStore extends VectorStore {
215218
metadata: vector.metadata,
216219
content: vector.content,
217220
embedding: vector.embedding,
221+
id: vector.id,
218222
}))
219223
.sort((a, b) => (a.similarity > b.similarity ? -1 : 0))
220224
.slice(0, k);
@@ -240,6 +244,7 @@ export class MemoryVectorStore extends VectorStore {
240244
new Document({
241245
metadata: search.metadata,
242246
pageContent: search.content,
247+
id: search.id,
243248
}),
244249
search.similarity,
245250
]);
@@ -273,6 +278,7 @@ export class MemoryVectorStore extends VectorStore {
273278
new Document({
274279
metadata: searches[idx].metadata,
275280
pageContent: searches[idx].content,
281+
id: searches[idx].id,
276282
})
277283
);
278284
}

langchain/src/vectorstores/tests/memory.test.ts

+38
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,44 @@ test("MemoryVectorStore with external ids", async () => {
3030
]);
3131
});
3232

33+
test("MemoryVectorStore stores and retrieves document IDs", async () => {
34+
const embeddings = new SyntheticEmbeddings({
35+
vectorSize: 1536,
36+
});
37+
const store = new MemoryVectorStore(embeddings);
38+
39+
const filterFunc = (doc: DocumentInterface): boolean => {
40+
const { metadata } = doc;
41+
if (metadata.namespace <= 2) {
42+
return true;
43+
}
44+
return false;
45+
};
46+
47+
const retriever = store.asRetriever({
48+
k: 2,
49+
filter: filterFunc,
50+
});
51+
52+
expect(retriever).toBeDefined();
53+
54+
await retriever.addDocuments([
55+
{ pageContent: "hello", metadata: { namespace: 1 }, id: "1" },
56+
{ pageContent: "hello", metadata: { namespace: 2 }, id: "2" },
57+
{ pageContent: "hello", metadata: { namespace: 3 }, id: "3" },
58+
{ pageContent: "hello", metadata: { namespace: 4 }, id: "4" },
59+
]);
60+
61+
const results = await retriever.getRelevantDocuments("hello");
62+
63+
expect(results).toHaveLength(2);
64+
65+
expect(results).toEqual([
66+
new Document({ metadata: { namespace: 1 }, pageContent: "hello", id: "1" }),
67+
new Document({ metadata: { namespace: 2 }, pageContent: "hello", id: "2" }),
68+
]);
69+
});
70+
3371
test("MemoryVectorStore as retriever can filter metadata", async () => {
3472
const embeddings = new SyntheticEmbeddings({
3573
vectorSize: 1536,

0 commit comments

Comments
 (0)