From 0bf298e890089e0ba277fbb1edca548aa7b3de15 Mon Sep 17 00:00:00 2001 From: Anush008 <46051506+Anush008@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:20:29 +0530 Subject: [PATCH 1/2] feat: filter qdrant existing --- .../Qdrant_Existing/Qdrant_Existing.ts | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts index 16f83b08..58ef6df5 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts @@ -3,6 +3,9 @@ import { QdrantClient } from '@qdrant/js-client-rest' import { QdrantVectorStore, QdrantLibArgs } from 'langchain/vectorstores/qdrant' import { Embeddings } from 'langchain/embeddings/base' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { VectorStoreRetrieverInput } from 'langchain/vectorstores/base' + +type RetrieverConfig = Partial> class Qdrant_Existing_VectorStores implements INode { label: string @@ -53,7 +56,7 @@ class Qdrant_Existing_VectorStores implements INode { }, { label: 'Qdrant Collection Cofiguration', - name: 'qdrantCollectionCofiguration', + name: 'qdrantCollectionConfiguration', type: 'json', optional: true, additionalParams: true @@ -66,6 +69,14 @@ class Qdrant_Existing_VectorStores implements INode { type: 'number', additionalParams: true, optional: true + }, + { + label: 'Qdrant Search Filter', + name: 'qdrantFilter', + description: 'Only return points which satisfy the conditions', + type: 'json', + additionalParams: true, + optional: true } ] this.outputs = [ @@ -85,10 +96,12 @@ class Qdrant_Existing_VectorStores implements INode { async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const qdrantServerUrl = nodeData.inputs?.qdrantServerUrl as string const collectionName = nodeData.inputs?.qdrantCollection as string - let qdrantCollectionCofiguration = nodeData.inputs?.qdrantCollectionCofiguration + let qdrantCollectionConfiguration = nodeData.inputs?.qdrantCollectionConfiguration const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string + let queryFilter = nodeData.inputs?.queryFilter + const k = topK ? parseFloat(topK) : 4 const credentialData = await getCredentialData(nodeData.credential ?? '', options) @@ -104,16 +117,26 @@ class Qdrant_Existing_VectorStores implements INode { collectionName } - if (qdrantCollectionCofiguration) { - qdrantCollectionCofiguration = - typeof qdrantCollectionCofiguration === 'object' ? qdrantCollectionCofiguration : JSON.parse(qdrantCollectionCofiguration) - dbConfig.collectionConfig = qdrantCollectionCofiguration + const retrieverConfig: RetrieverConfig = { + k + } + + if (qdrantCollectionConfiguration) { + qdrantCollectionConfiguration = + typeof qdrantCollectionConfiguration === 'object' + ? qdrantCollectionConfiguration + : JSON.parse(qdrantCollectionConfiguration) + dbConfig.collectionConfig = qdrantCollectionConfiguration + } + + if (queryFilter) { + retrieverConfig.filter = typeof queryFilter === 'object' ? queryFilter : JSON.parse(queryFilter) } const vectorStore = await QdrantVectorStore.fromExistingCollection(embeddings, dbConfig) if (output === 'retriever') { - const retriever = vectorStore.asRetriever(k) + const retriever = vectorStore.asRetriever(retrieverConfig) return retriever } else if (output === 'vectorStore') { ;(vectorStore as any).k = k From 73d7d4ecbc39db84a348de5fa05733abd0dbaa21 Mon Sep 17 00:00:00 2001 From: Anush008 <46051506+Anush008@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:22:03 +0530 Subject: [PATCH 2/2] feat: filter qdrant upsert --- .../Qdrant_Upsert/Qdrant_Upsert.ts | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts index dcc3099d..6f3773ff 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts @@ -5,6 +5,9 @@ import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { flatten } from 'lodash' +import { VectorStoreRetrieverInput } from 'langchain/vectorstores/base' + +type RetrieverConfig = Partial> class QdrantUpsert_VectorStores implements INode { label: string @@ -67,6 +70,14 @@ class QdrantUpsert_VectorStores implements INode { type: 'number', additionalParams: true, optional: true + }, + { + label: 'Qdrant Search Filter', + name: 'qdrantFilter', + description: 'Only return points which satisfy the conditions', + type: 'json', + additionalParams: true, + optional: true } ] this.outputs = [ @@ -91,6 +102,7 @@ class QdrantUpsert_VectorStores implements INode { const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string const k = topK ? parseFloat(topK) : 4 + let queryFilter = nodeData.inputs?.qdrantFilter const credentialData = await getCredentialData(nodeData.credential ?? '', options) const qdrantApiKey = getCredentialParam('qdrantApiKey', credentialData, nodeData) @@ -111,10 +123,19 @@ class QdrantUpsert_VectorStores implements INode { url: qdrantServerUrl, collectionName } + + const retrieverConfig: RetrieverConfig = { + k + } + + if (queryFilter) { + retrieverConfig.filter = typeof queryFilter === 'object' ? queryFilter : JSON.parse(queryFilter) + } + const vectorStore = await QdrantVectorStore.fromDocuments(finalDocs, embeddings, dbConfig) if (output === 'retriever') { - const retriever = vectorStore.asRetriever(k) + const retriever = vectorStore.asRetriever(retrieverConfig) return retriever } else if (output === 'vectorStore') { ;(vectorStore as any).k = k