From 749b43a3b17ad1703a292dd4249e0aa6183f5b69 Mon Sep 17 00:00:00 2001 From: Alex Yang <himself65@outlook.com> Date: Mon, 16 Sep 2024 15:51:24 -0700 Subject: [PATCH] fix: multi model embedding (#1215) --- .changeset/sour-snakes-fry.md | 6 ++ packages/core/src/embeddings/base.ts | 45 ++++++---- packages/core/src/embeddings/index.ts | 1 + packages/core/src/embeddings/muti-model.ts | 81 ++++++++++++++++++ .../e2e/fixtures/img/llamaindex-white.png | Bin 0 -> 51654 bytes .../llamaindex/e2e/node/embedding/clip.e2e.ts | 30 +++++++ .../src/embeddings/ClipEmbedding.ts | 6 +- .../embeddings/CloudflareWorkerEmbedding.ts | 5 +- .../src/embeddings/JinaAIEmbedding.ts | 2 +- .../src/embeddings/MultiModalEmbedding.ts | 71 --------------- packages/llamaindex/src/embeddings/index.ts | 1 - 11 files changed, 156 insertions(+), 92 deletions(-) create mode 100644 .changeset/sour-snakes-fry.md create mode 100644 packages/core/src/embeddings/muti-model.ts create mode 100644 packages/llamaindex/e2e/fixtures/img/llamaindex-white.png create mode 100644 packages/llamaindex/e2e/node/embedding/clip.e2e.ts delete mode 100644 packages/llamaindex/src/embeddings/MultiModalEmbedding.ts diff --git a/.changeset/sour-snakes-fry.md b/.changeset/sour-snakes-fry.md new file mode 100644 index 000000000..98808fd73 --- /dev/null +++ b/.changeset/sour-snakes-fry.md @@ -0,0 +1,6 @@ +--- +"llamaindex": patch +"@llamaindex/core": patch +--- + +fix: clip embedding transform function diff --git a/packages/core/src/embeddings/base.ts b/packages/core/src/embeddings/base.ts index d8f66d215..1d1e972a5 100644 --- a/packages/core/src/embeddings/base.ts +++ b/packages/core/src/embeddings/base.ts @@ -23,23 +23,34 @@ export abstract class BaseEmbedding extends TransformComponent { embedBatchSize = DEFAULT_EMBED_BATCH_SIZE; embedInfo?: EmbeddingInfo; - constructor() { - super( - async ( - nodes: BaseNode[], - options?: BaseEmbeddingOptions, - ): Promise<BaseNode[]> => { - const texts = nodes.map((node) => node.getContent(MetadataMode.EMBED)); - - const embeddings = await this.getTextEmbeddingsBatch(texts, options); - - for (let i = 0; i < nodes.length; i++) { - nodes[i]!.embedding = embeddings[i]; - } - - return nodes; - }, - ); + protected constructor( + transformFn?: ( + nodes: BaseNode[], + options?: BaseEmbeddingOptions, + ) => Promise<BaseNode[]>, + ) { + if (transformFn) { + super(transformFn); + } else { + super( + async ( + nodes: BaseNode[], + options?: BaseEmbeddingOptions, + ): Promise<BaseNode[]> => { + const texts = nodes.map((node) => + node.getContent(MetadataMode.EMBED), + ); + + const embeddings = await this.getTextEmbeddingsBatch(texts, options); + + for (let i = 0; i < nodes.length; i++) { + nodes[i]!.embedding = embeddings[i]; + } + + return nodes; + }, + ); + } } similarity( diff --git a/packages/core/src/embeddings/index.ts b/packages/core/src/embeddings/index.ts index 7d6c4aac1..5e96ef5b1 100644 --- a/packages/core/src/embeddings/index.ts +++ b/packages/core/src/embeddings/index.ts @@ -1,4 +1,5 @@ export { BaseEmbedding, batchEmbeddings } from "./base"; export type { BaseEmbeddingOptions, EmbeddingInfo } from "./base"; +export { MultiModalEmbedding } from "./muti-model"; export { truncateMaxTokens } from "./tokenizer"; export { DEFAULT_SIMILARITY_TOP_K, SimilarityType, similarity } from "./utils"; diff --git a/packages/core/src/embeddings/muti-model.ts b/packages/core/src/embeddings/muti-model.ts new file mode 100644 index 000000000..bf150c95a --- /dev/null +++ b/packages/core/src/embeddings/muti-model.ts @@ -0,0 +1,81 @@ +import type { MessageContentDetail } from "../llms"; +import { + ImageNode, + MetadataMode, + ModalityType, + splitNodesByType, + type BaseNode, + type ImageType, +} from "../schema"; +import { extractImage, extractSingleText } from "../utils"; +import { + BaseEmbedding, + batchEmbeddings, + type BaseEmbeddingOptions, +} from "./base"; + +/* + * Base class for Multi Modal embeddings. + */ +export abstract class MultiModalEmbedding extends BaseEmbedding { + abstract getImageEmbedding(images: ImageType): Promise<number[]>; + + protected constructor() { + super( + async ( + nodes: BaseNode[], + options?: BaseEmbeddingOptions, + ): Promise<BaseNode[]> => { + const nodeMap = splitNodesByType(nodes); + const imageNodes = nodeMap[ModalityType.IMAGE] ?? []; + const textNodes = nodeMap[ModalityType.TEXT] ?? []; + + const embeddings = await batchEmbeddings( + textNodes.map((node) => node.getContent(MetadataMode.EMBED)), + this.getTextEmbeddings.bind(this), + this.embedBatchSize, + options, + ); + for (let i = 0; i < textNodes.length; i++) { + textNodes[i]!.embedding = embeddings[i]; + } + + const imageEmbeddings = await batchEmbeddings( + imageNodes.map((n) => (n as ImageNode).image), + this.getImageEmbeddings.bind(this), + this.embedBatchSize, + options, + ); + for (let i = 0; i < imageNodes.length; i++) { + imageNodes[i]!.embedding = imageEmbeddings[i]; + } + + return nodes; + }, + ); + } + + /** + * Optionally override this method to retrieve multiple image embeddings in a single request + * @param images + */ + async getImageEmbeddings(images: ImageType[]): Promise<number[][]> { + return Promise.all( + images.map((imgFilePath) => this.getImageEmbedding(imgFilePath)), + ); + } + + async getQueryEmbedding( + query: MessageContentDetail, + ): Promise<number[] | null> { + const image = extractImage(query); + if (image) { + return await this.getImageEmbedding(image); + } + const text = extractSingleText(query); + if (text) { + return await this.getTextEmbedding(text); + } + return null; + } +} diff --git a/packages/llamaindex/e2e/fixtures/img/llamaindex-white.png b/packages/llamaindex/e2e/fixtures/img/llamaindex-white.png new file mode 100644 index 0000000000000000000000000000000000000000..7f72a5e04dc13a5076d80d71584e195f818e2132 GIT binary patch literal 51654 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%0DII7rWpGt}`PPCTTg2k( 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 literal 0 HcmV?d00001 diff --git a/packages/llamaindex/e2e/node/embedding/clip.e2e.ts b/packages/llamaindex/e2e/node/embedding/clip.e2e.ts new file mode 100644 index 000000000..110afe5f7 --- /dev/null +++ b/packages/llamaindex/e2e/node/embedding/clip.e2e.ts @@ -0,0 +1,30 @@ +import { ClipEmbedding, ImageNode } from "llamaindex"; +import assert from "node:assert"; +import { test } from "node:test"; + +await test("clip embedding", async (t) => { + await t.test("init & get image embedding", async () => { + const clipEmbedding = new ClipEmbedding(); + const imgUrl = new URL( + "../../fixtures/img/llamaindex-white.png", + import.meta.url, + ); + const vec = await clipEmbedding.getImageEmbedding(imgUrl); + assert.ok(vec); + }); + + await t.test("load image document", async () => { + const nodes = [ + new ImageNode({ + image: new URL( + "../../fixtures/img/llamaindex-white.png", + import.meta.url, + ), + }), + ]; + const clipEmbedding = new ClipEmbedding(); + const result = await clipEmbedding(nodes); + assert.strictEqual(result.length, 1); + assert.ok(result[0]!.embedding); + }); +}); diff --git a/packages/llamaindex/src/embeddings/ClipEmbedding.ts b/packages/llamaindex/src/embeddings/ClipEmbedding.ts index c613d0d15..d52d47cd9 100644 --- a/packages/llamaindex/src/embeddings/ClipEmbedding.ts +++ b/packages/llamaindex/src/embeddings/ClipEmbedding.ts @@ -1,7 +1,7 @@ +import { MultiModalEmbedding } from "@llamaindex/core/embeddings"; import type { ImageType } from "@llamaindex/core/schema"; import _ from "lodash"; import { lazyLoadTransformers } from "../internal/deps/transformers.js"; -import { MultiModalEmbedding } from "./MultiModalEmbedding.js"; // only import type, to avoid bundling error import type { CLIPTextModelWithProjection, @@ -35,6 +35,10 @@ export class ClipEmbedding extends MultiModalEmbedding { private visionModel: CLIPVisionModelWithProjection | null = null; private textModel: CLIPTextModelWithProjection | null = null; + constructor() { + super(); + } + async getTokenizer() { const { AutoTokenizer } = await lazyLoadTransformers(); if (!this.tokenizer) { diff --git a/packages/llamaindex/src/embeddings/CloudflareWorkerEmbedding.ts b/packages/llamaindex/src/embeddings/CloudflareWorkerEmbedding.ts index 2034cc41e..76c0fec6f 100644 --- a/packages/llamaindex/src/embeddings/CloudflareWorkerEmbedding.ts +++ b/packages/llamaindex/src/embeddings/CloudflareWorkerEmbedding.ts @@ -1,10 +1,13 @@ +import { MultiModalEmbedding } from "@llamaindex/core/embeddings"; import type { ImageType } from "@llamaindex/core/schema"; -import { MultiModalEmbedding } from "./MultiModalEmbedding.js"; /** * Cloudflare worker doesn't support image embeddings for now */ export class CloudflareWorkerMultiModalEmbedding extends MultiModalEmbedding { + constructor() { + super(); + } getImageEmbedding(images: ImageType): Promise<number[]> { throw new Error("Method not implemented."); } diff --git a/packages/llamaindex/src/embeddings/JinaAIEmbedding.ts b/packages/llamaindex/src/embeddings/JinaAIEmbedding.ts index b0514b998..00188dc00 100644 --- a/packages/llamaindex/src/embeddings/JinaAIEmbedding.ts +++ b/packages/llamaindex/src/embeddings/JinaAIEmbedding.ts @@ -1,7 +1,7 @@ +import { MultiModalEmbedding } from "@llamaindex/core/embeddings"; import { getEnv } from "@llamaindex/env"; import { imageToDataUrl } from "../internal/utils.js"; import type { ImageType } from "../Node.js"; -import { MultiModalEmbedding } from "./MultiModalEmbedding.js"; function isLocal(url: ImageType): boolean { if (url instanceof Blob) return true; diff --git a/packages/llamaindex/src/embeddings/MultiModalEmbedding.ts b/packages/llamaindex/src/embeddings/MultiModalEmbedding.ts deleted file mode 100644 index 6d2ed5bb2..000000000 --- a/packages/llamaindex/src/embeddings/MultiModalEmbedding.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { BaseEmbedding, batchEmbeddings } from "@llamaindex/core/embeddings"; -import type { MessageContentDetail } from "@llamaindex/core/llms"; -import { - ImageNode, - MetadataMode, - ModalityType, - splitNodesByType, - type BaseNode, - type ImageType, -} from "@llamaindex/core/schema"; -import { extractImage, extractSingleText } from "@llamaindex/core/utils"; - -/* - * Base class for Multi Modal embeddings. - */ - -export abstract class MultiModalEmbedding extends BaseEmbedding { - abstract getImageEmbedding(images: ImageType): Promise<number[]>; - - /** - * Optionally override this method to retrieve multiple image embeddings in a single request - * @param images - */ - async getImageEmbeddings(images: ImageType[]): Promise<number[][]> { - return Promise.all( - images.map((imgFilePath) => this.getImageEmbedding(imgFilePath)), - ); - } - - async transform(nodes: BaseNode[], _options?: any): Promise<BaseNode[]> { - const nodeMap = splitNodesByType(nodes); - const imageNodes = nodeMap[ModalityType.IMAGE] ?? []; - const textNodes = nodeMap[ModalityType.TEXT] ?? []; - - const embeddings = await batchEmbeddings( - textNodes.map((node) => node.getContent(MetadataMode.EMBED)), - this.getTextEmbeddings.bind(this), - this.embedBatchSize, - _options, - ); - for (let i = 0; i < textNodes.length; i++) { - textNodes[i]!.embedding = embeddings[i]; - } - - const imageEmbeddings = await batchEmbeddings( - imageNodes.map((n) => (n as ImageNode).image), - this.getImageEmbeddings.bind(this), - this.embedBatchSize, - _options, - ); - for (let i = 0; i < imageNodes.length; i++) { - imageNodes[i]!.embedding = imageEmbeddings[i]; - } - - return nodes; - } - - async getQueryEmbedding( - query: MessageContentDetail, - ): Promise<number[] | null> { - const image = extractImage(query); - if (image) { - return await this.getImageEmbedding(image); - } - const text = extractSingleText(query); - if (text) { - return await this.getTextEmbedding(text); - } - return null; - } -} diff --git a/packages/llamaindex/src/embeddings/index.ts b/packages/llamaindex/src/embeddings/index.ts index 7d23905f1..a93a1d378 100644 --- a/packages/llamaindex/src/embeddings/index.ts +++ b/packages/llamaindex/src/embeddings/index.ts @@ -6,7 +6,6 @@ export { HuggingFaceInferenceAPIEmbedding } from "./HuggingFaceEmbedding.js"; export * from "./JinaAIEmbedding.js"; export * from "./MistralAIEmbedding.js"; export * from "./MixedbreadAIEmbeddings.js"; -export * from "./MultiModalEmbedding.js"; export { OllamaEmbedding } from "./OllamaEmbedding.js"; export * from "./OpenAIEmbedding.js"; export { TogetherEmbedding } from "./together.js"; -- GitLab