Bugfix/Missing Filter for VectorStore to Document (#2285)
add filter for vector store to document
This commit is contained in:
parent
c4eb75ddde
commit
2b1273ca31
|
|
@ -70,12 +70,19 @@ class VectorStoreToDocument_DocumentLoaders implements INode {
|
||||||
const output = nodeData.outputs?.output as string
|
const output = nodeData.outputs?.output as string
|
||||||
|
|
||||||
const topK = (vectorStore as any)?.k ?? 4
|
const topK = (vectorStore as any)?.k ?? 4
|
||||||
|
const _filter = (vectorStore as any)?.filter
|
||||||
|
|
||||||
const docs = await vectorStore.similaritySearchWithScore(query ?? input, topK)
|
// If it is already pre-defined in lc_kwargs, then don't pass it again
|
||||||
|
const filter = vectorStore.lc_kwargs.filter ? undefined : _filter
|
||||||
|
if (vectorStore.lc_kwargs.filter) {
|
||||||
|
;(vectorStore as any).filter = vectorStore.lc_kwargs.filter
|
||||||
|
}
|
||||||
|
|
||||||
|
const docs = await vectorStore.similaritySearchWithScore(query ?? input, topK, filter)
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log('\x1b[94m\x1b[1m\n*****VectorStore Documents*****\n\x1b[0m\x1b[0m')
|
console.log('\x1b[94m\x1b[1m\n*****VectorStore Documents*****\n\x1b[0m\x1b[0m')
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(docs)
|
console.log(JSON.stringify(docs, null, 2))
|
||||||
|
|
||||||
if (output === 'document') {
|
if (output === 'document') {
|
||||||
let finaldocs = []
|
let finaldocs = []
|
||||||
|
|
|
||||||
|
|
@ -187,6 +187,9 @@ class Chroma_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (chromaMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = obj.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,9 @@ class Chroma_Existing_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (chromaMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = obj.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -199,6 +199,9 @@ class Milvus_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (milvusFilter) {
|
||||||
|
;(vectorStore as any).filter = milvusFilter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,9 @@ class Milvus_Existing_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (milvusFilter) {
|
||||||
|
;(vectorStore as any).filter = milvusFilter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,7 @@ class Pinecone_VectorStores implements INode {
|
||||||
|
|
||||||
const vectorStore = await PineconeStore.fromExistingIndex(embeddings, obj)
|
const vectorStore = await PineconeStore.fromExistingIndex(embeddings, obj)
|
||||||
|
|
||||||
return resolveVectorStoreOrRetriever(nodeData, vectorStore)
|
return resolveVectorStoreOrRetriever(nodeData, vectorStore, obj.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -354,6 +354,9 @@ class Qdrant_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (queryFilter) {
|
||||||
|
;(vectorStore as any).filter = retrieverConfig.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,9 @@ class Qdrant_Existing_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (queryFilter) {
|
||||||
|
;(vectorStore as any).filter = retrieverConfig.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ class Supabase_VectorStores implements INode {
|
||||||
|
|
||||||
const vectorStore = await SupabaseVectorStore.fromExistingIndex(embeddings, obj)
|
const vectorStore = await SupabaseVectorStore.fromExistingIndex(embeddings, obj)
|
||||||
|
|
||||||
return resolveVectorStoreOrRetriever(nodeData, vectorStore)
|
return resolveVectorStoreOrRetriever(nodeData, vectorStore, obj.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,9 @@ class Supabase_Existing_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (supabaseMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = obj.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -272,6 +272,9 @@ class Vectara_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (vectaraMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = vectaraFilter.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,9 @@ class VectaraExisting_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (vectaraMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = vectaraFilter.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,19 @@
|
||||||
import { INodeData } from '../../src'
|
import { INodeData } from '../../src'
|
||||||
|
import { VectorStore } from '@langchain/core/vectorstores'
|
||||||
|
|
||||||
export const resolveVectorStoreOrRetriever = (nodeData: INodeData, vectorStore: any) => {
|
export const resolveVectorStoreOrRetriever = (
|
||||||
|
nodeData: INodeData,
|
||||||
|
vectorStore: VectorStore,
|
||||||
|
metadataFilter?: string | object | undefined
|
||||||
|
) => {
|
||||||
const output = nodeData.outputs?.output as string
|
const output = nodeData.outputs?.output as string
|
||||||
const searchType = nodeData.outputs?.searchType as string
|
const searchType = nodeData.outputs?.searchType as string
|
||||||
const topK = nodeData.inputs?.topK as string
|
const topK = nodeData.inputs?.topK as string
|
||||||
const k = topK ? parseFloat(topK) : 4
|
const k = topK ? parseFloat(topK) : 4
|
||||||
|
|
||||||
|
// If it is already pre-defined in lc_kwargs, then don't pass it again
|
||||||
|
const filter = vectorStore?.lc_kwargs?.filter ? undefined : metadataFilter
|
||||||
|
|
||||||
if (output === 'retriever') {
|
if (output === 'retriever') {
|
||||||
if ('mmr' === searchType) {
|
if ('mmr' === searchType) {
|
||||||
const fetchK = nodeData.inputs?.fetchK as string
|
const fetchK = nodeData.inputs?.fetchK as string
|
||||||
|
|
@ -15,6 +23,7 @@ export const resolveVectorStoreOrRetriever = (nodeData: INodeData, vectorStore:
|
||||||
return vectorStore.asRetriever({
|
return vectorStore.asRetriever({
|
||||||
searchType: 'mmr',
|
searchType: 'mmr',
|
||||||
k: k,
|
k: k,
|
||||||
|
filter,
|
||||||
searchKwargs: {
|
searchKwargs: {
|
||||||
fetchK: f,
|
fetchK: f,
|
||||||
lambda: l
|
lambda: l
|
||||||
|
|
@ -22,10 +31,11 @@ export const resolveVectorStoreOrRetriever = (nodeData: INodeData, vectorStore:
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// "searchType" is "similarity"
|
// "searchType" is "similarity"
|
||||||
return vectorStore.asRetriever(k)
|
return vectorStore.asRetriever(k, filter)
|
||||||
}
|
}
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
;(vectorStore as any).filter = filter
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,13 @@ class Weaviate_VectorStores implements INode {
|
||||||
type: 'number',
|
type: 'number',
|
||||||
additionalParams: true,
|
additionalParams: true,
|
||||||
optional: true
|
optional: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Weaviate Search Filter',
|
||||||
|
name: 'weaviateFilter',
|
||||||
|
type: 'json',
|
||||||
|
additionalParams: true,
|
||||||
|
optional: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
addMMRInputParams(this.inputs)
|
addMMRInputParams(this.inputs)
|
||||||
|
|
@ -203,6 +210,7 @@ class Weaviate_VectorStores implements INode {
|
||||||
const weaviateTextKey = nodeData.inputs?.weaviateTextKey as string
|
const weaviateTextKey = nodeData.inputs?.weaviateTextKey as string
|
||||||
const weaviateMetadataKeys = nodeData.inputs?.weaviateMetadataKeys as string
|
const weaviateMetadataKeys = nodeData.inputs?.weaviateMetadataKeys as string
|
||||||
const embeddings = nodeData.inputs?.embeddings as Embeddings
|
const embeddings = nodeData.inputs?.embeddings as Embeddings
|
||||||
|
let weaviateFilter = nodeData.inputs?.weaviateFilter
|
||||||
|
|
||||||
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
|
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
|
||||||
const weaviateApiKey = getCredentialParam('weaviateApiKey', credentialData, nodeData)
|
const weaviateApiKey = getCredentialParam('weaviateApiKey', credentialData, nodeData)
|
||||||
|
|
@ -223,10 +231,13 @@ class Weaviate_VectorStores implements INode {
|
||||||
|
|
||||||
if (weaviateTextKey) obj.textKey = weaviateTextKey
|
if (weaviateTextKey) obj.textKey = weaviateTextKey
|
||||||
if (weaviateMetadataKeys) obj.metadataKeys = JSON.parse(weaviateMetadataKeys.replace(/\s/g, ''))
|
if (weaviateMetadataKeys) obj.metadataKeys = JSON.parse(weaviateMetadataKeys.replace(/\s/g, ''))
|
||||||
|
if (weaviateFilter) {
|
||||||
|
weaviateFilter = typeof weaviateFilter === 'object' ? weaviateFilter : JSON.parse(weaviateFilter)
|
||||||
|
}
|
||||||
|
|
||||||
const vectorStore = await WeaviateStore.fromExistingIndex(embeddings, obj)
|
const vectorStore = await WeaviateStore.fromExistingIndex(embeddings, obj)
|
||||||
|
|
||||||
return resolveVectorStoreOrRetriever(nodeData, vectorStore)
|
return resolveVectorStoreOrRetriever(nodeData, vectorStore, weaviateFilter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,7 @@ class Zep_VectorStores implements INode {
|
||||||
|
|
||||||
const vectorStore = await ZepExistingVS.fromExistingIndex(embeddings, zepConfig)
|
const vectorStore = await ZepExistingVS.fromExistingIndex(embeddings, zepConfig)
|
||||||
|
|
||||||
return resolveVectorStoreOrRetriever(nodeData, vectorStore)
|
return resolveVectorStoreOrRetriever(nodeData, vectorStore, zepConfig.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,9 @@ class Zep_Existing_VectorStores implements INode {
|
||||||
return retriever
|
return retriever
|
||||||
} else if (output === 'vectorStore') {
|
} else if (output === 'vectorStore') {
|
||||||
;(vectorStore as any).k = k
|
;(vectorStore as any).k = k
|
||||||
|
if (zepMetadataFilter) {
|
||||||
|
;(vectorStore as any).filter = zepConfig.filter
|
||||||
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
}
|
}
|
||||||
return vectorStore
|
return vectorStore
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ class Zep_CloudVectorStores implements INode {
|
||||||
}
|
}
|
||||||
zepConfig.client = await ZepClient.init(zepConfig.apiKey)
|
zepConfig.client = await ZepClient.init(zepConfig.apiKey)
|
||||||
const vectorStore = await ZepExistingVS.init(zepConfig)
|
const vectorStore = await ZepExistingVS.init(zepConfig)
|
||||||
return resolveVectorStoreOrRetriever(nodeData, vectorStore)
|
return resolveVectorStoreOrRetriever(nodeData, vectorStore, zepConfig.filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue