Skip to content

Commit

Permalink
fix: generate uuid when inserting to Qdrant (run-llama#1301)
Browse files Browse the repository at this point in the history
  • Loading branch information
thucpn authored Oct 7, 2024
1 parent cf3320a commit ee697fb
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 1 deletion.
6 changes: 6 additions & 0 deletions .changeset/tame-carrots-drop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@llamaindex/core": patch
"llamaindex": patch
---

fix: generate uuid when inserting to Qdrant
1 change: 1 addition & 0 deletions packages/core/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,4 @@ export {
} from "./llms";

export { objectEntries } from "./object-entries";
export { UUIDFromString } from "./uuid";
22 changes: 22 additions & 0 deletions packages/core/src/utils/uuid.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { createSHA256 } from "@llamaindex/env";

export function UUIDFromString(input: string) {
const hashFunction = createSHA256();
hashFunction.update(input);
const base64Hash = hashFunction.digest();

// Convert base64 to hex
const hexHash = Buffer.from(base64Hash, "base64").toString("hex");

// Format the hash to resemble a UUID (version 5 style)
const uuid = [
hexHash.substring(0, 8),
hexHash.substring(8, 12),
"5" + hexHash.substring(12, 15), // Set the version to 5 (name-based)
((parseInt(hexHash.substring(15, 17), 16) & 0x3f) | 0x80).toString(16) +
hexHash.substring(17, 19), // Set the variant
hexHash.substring(19, 31),
].join("-");

return uuid;
}
37 changes: 37 additions & 0 deletions packages/core/tests/utils/uuid.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { UUIDFromString } from "@llamaindex/core/utils";
import { describe, expect, it } from "vitest";

const UUID_REGEX =
/^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

describe("UUIDFromString", () => {
it("should convert string to UUID", () => {
const string = "document_id_1";
const result = UUIDFromString(string);
expect(result).toBeDefined();
expect(result).toMatch(UUID_REGEX);
});

it("should return the same UUID for the same input string", () => {
const string = "document_id_1";
const result1 = UUIDFromString(string);
const result2 = UUIDFromString(string);
expect(result1).toEqual(result2);
});

it("should return the different UUID for different input strings", () => {
const string1 = "document_id_1";
const string2 = "document_id_2";
const result1 = UUIDFromString(string1);
const result2 = UUIDFromString(string2);
expect(result1).not.toEqual(result2);
});

it("should handle case-sensitive input strings", () => {
const string1 = "document_id_1";
const string2 = "Document_Id_1";
const result1 = UUIDFromString(string1);
const result2 = UUIDFromString(string2);
expect(result1).not.toEqual(result2);
});
});
3 changes: 2 additions & 1 deletion packages/llamaindex/src/vector-store/QdrantVectorStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
type VectorStoreQueryResult,
} from "./types.js";

import { UUIDFromString } from "@llamaindex/core/utils";
import type { QdrantClientParams, Schemas } from "@qdrant/js-client-rest";
import { QdrantClient } from "@qdrant/js-client-rest";
import { metadataDictToNode, nodeToMetadata } from "./utils.js";
Expand Down Expand Up @@ -170,7 +171,7 @@ export class QdrantVectorStore

for (let k = 0; k < nodeIds.length; k++) {
const point: PointStruct = {
id: nodeIds[k]!.id_,
id: UUIDFromString(nodeIds[k]!.id_),
payload: payloads[k]!,
vector: vectors[k]!,
};
Expand Down

0 comments on commit ee697fb

Please sign in to comment.