add fix for illegal invocation

This commit is contained in:
Henry 2023-10-13 21:33:32 +01:00
parent d4269d0b82
commit 76f689cb93
5 changed files with 97 additions and 3 deletions

View File

@ -2,9 +2,10 @@ import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/I
import { OpenSearchVectorStore } from 'langchain/vectorstores/opensearch'
import { Embeddings } from 'langchain/embeddings/base'
import { Document } from 'langchain/document'
import { Client } from '@opensearch-project/opensearch'
import { Client, RequestParams } from '@opensearch-project/opensearch'
import { flatten } from 'lodash'
import { getBaseClasses } from '../../../src/utils'
import { buildMetadataTerms } from './core'
class OpenSearchUpsert_VectorStores implements INode {
label: string
@ -95,9 +96,44 @@ class OpenSearchUpsert_VectorStores implements INode {
const vectorStore = await OpenSearchVectorStore.fromDocuments(finalDocs, embeddings, {
client,
indexName: indexName
indexName
})
vectorStore.similaritySearchVectorWithScore = async (
query: number[],
k: number,
filter?: object | undefined
): Promise<[Document, number][]> => {
const search: RequestParams.Search = {
index: indexName,
body: {
query: {
bool: {
filter: { bool: { must: buildMetadataTerms(filter) } },
must: [
{
knn: {
embedding: { vector: query, k }
}
}
]
}
},
size: k
}
}
const { body } = await client.search(search)
return body.hits.hits.map((hit: any) => [
new Document({
pageContent: hit._source.text,
metadata: hit._source.metadata
}),
hit._score
])
}
if (output === 'retriever') {
const retriever = vectorStore.asRetriever(k)
return retriever

View File

@ -1,8 +1,10 @@
import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface'
import { OpenSearchVectorStore } from 'langchain/vectorstores/opensearch'
import { Embeddings } from 'langchain/embeddings/base'
import { Client } from '@opensearch-project/opensearch'
import { Document } from 'langchain/document'
import { Client, RequestParams } from '@opensearch-project/opensearch'
import { getBaseClasses } from '../../../src/utils'
import { buildMetadataTerms } from './core'
class OpenSearch_Existing_VectorStores implements INode {
label: string
@ -42,6 +44,13 @@ class OpenSearch_Existing_VectorStores implements INode {
name: 'indexName',
type: 'string'
},
{
label: 'OpenSearch Metadata Filter',
name: 'openSearchMetadataFilter',
type: 'json',
optional: true,
additionalParams: true
},
{
label: 'Top K',
name: 'topK',
@ -73,6 +82,7 @@ class OpenSearch_Existing_VectorStores implements INode {
const output = nodeData.outputs?.output as string
const topK = nodeData.inputs?.topK as string
const k = topK ? parseFloat(topK) : 4
const openSearchMetadataFilter = nodeData.inputs?.openSearchMetadataFilter
const client = new Client({
nodes: [opensearchURL]
@ -83,6 +93,46 @@ class OpenSearch_Existing_VectorStores implements INode {
indexName
})
vectorStore.similaritySearchVectorWithScore = async (
query: number[],
k: number,
filter?: object | undefined
): Promise<[Document, number][]> => {
if (openSearchMetadataFilter) {
const metadatafilter =
typeof openSearchMetadataFilter === 'object' ? openSearchMetadataFilter : JSON.parse(openSearchMetadataFilter)
filter = metadatafilter
}
const search: RequestParams.Search = {
index: indexName,
body: {
query: {
bool: {
filter: { bool: { must: buildMetadataTerms(filter) } },
must: [
{
knn: {
embedding: { vector: query, k }
}
}
]
}
},
size: k
}
}
const { body } = await client.search(search)
return body.hits.hits.map((hit: any) => [
new Document({
pageContent: hit._source.text,
metadata: hit._source.metadata
}),
hit._score
])
}
if (output === 'retriever') {
const retriever = vectorStore.asRetriever(k)
return retriever

View File

@ -0,0 +1,8 @@
export const buildMetadataTerms = (filter?: object): { term: Record<string, unknown> }[] => {
if (filter == null) return []
const result = []
for (const [key, value] of Object.entries(filter)) {
result.push({ term: { [`metadata.${key}`]: value } })
}
return result
}

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB