From 829d2b15970a776cbcee464c229ce9bbfec1bc70 Mon Sep 17 00:00:00 2001 From: Gene Ruebsamen Date: Thu, 13 Mar 2025 14:30:24 +0100 Subject: [PATCH] Weaviate - expose Hybrid Search (#4127) Hybrid Search for Weaviate --- .../nodes/vectorstores/VectorStoreUtils.ts | 12 +++++++++++- .../nodes/vectorstores/Weaviate/Weaviate.ts | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/components/nodes/vectorstores/VectorStoreUtils.ts b/packages/components/nodes/vectorstores/VectorStoreUtils.ts index c5bc941b..5c646749 100644 --- a/packages/components/nodes/vectorstores/VectorStoreUtils.ts +++ b/packages/components/nodes/vectorstores/VectorStoreUtils.ts @@ -10,11 +10,16 @@ export const resolveVectorStoreOrRetriever = ( const searchType = nodeData.outputs?.searchType as string const topK = nodeData.inputs?.topK as string const k = topK ? parseFloat(topK) : 4 + const alpha = nodeData.inputs?.alpha // 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') { + const searchKwargs: Record = {} + if (alpha !== undefined) { + searchKwargs.alpha = parseFloat(alpha) + } if ('mmr' === searchType) { const fetchK = nodeData.inputs?.fetchK as string const lambda = nodeData.inputs?.lambda as string @@ -25,13 +30,18 @@ export const resolveVectorStoreOrRetriever = ( k: k, filter, searchKwargs: { + //...searchKwargs, fetchK: f, lambda: l } }) } else { // "searchType" is "similarity" - return vectorStore.asRetriever(k, filter) + return vectorStore.asRetriever({ + k: k, + filter: filter, + searchKwargs: Object.keys(searchKwargs).length > 0 ? searchKwargs : undefined + }) } } else if (output === 'vectorStore') { ;(vectorStore as any).k = k diff --git a/packages/components/nodes/vectorstores/Weaviate/Weaviate.ts b/packages/components/nodes/vectorstores/Weaviate/Weaviate.ts index 85e66fb4..ae2c0164 100644 --- a/packages/components/nodes/vectorstores/Weaviate/Weaviate.ts +++ b/packages/components/nodes/vectorstores/Weaviate/Weaviate.ts @@ -26,7 +26,7 @@ class Weaviate_VectorStores implements INode { constructor() { this.label = 'Weaviate' this.name = 'weaviate' - this.version = 3.0 + this.version = 4.0 this.type = 'Weaviate' this.icon = 'weaviate.png' this.category = 'Vector Stores' @@ -124,6 +124,16 @@ class Weaviate_VectorStores implements INode { } ] addMMRInputParams(this.inputs) + this.inputs.push({ + label: 'Alpha (for Hybrid Search)', + name: 'alpha', + description: + 'Number between 0 and 1 that determines the weighting of keyword (BM25) portion of the hybrid search. A value of 1 is a pure vector search, while 0 is a pure keyword search.', + placeholder: '1', + type: 'number', + additionalParams: true, + optional: true + }) this.outputs = [ { label: 'Weaviate Retriever',