agsamantha/node_modules/langchain/dist/chains/vector_db_qa.js

121 lines
4.2 KiB
JavaScript
Raw Normal View History

2024-10-02 15:15:21 -05:00
import { BaseChain } from "./base.js";
import { loadQAStuffChain } from "./question_answering/load.js";
/**
* Class that represents a VectorDBQAChain. It extends the `BaseChain`
* class and implements the `VectorDBQAChainInput` interface. It performs
* a similarity search using a vector store and combines the search
* results using a specified combine documents chain.
*
* @deprecated
* Switch to {@link https://js.langchain.com/docs/modules/chains/ | createRetrievalChain}
* Will be removed in 0.2.0
*/
export class VectorDBQAChain extends BaseChain {
static lc_name() {
return "VectorDBQAChain";
}
get inputKeys() {
return [this.inputKey];
}
get outputKeys() {
return this.combineDocumentsChain.outputKeys.concat(this.returnSourceDocuments ? ["sourceDocuments"] : []);
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "k", {
enumerable: true,
configurable: true,
writable: true,
value: 4
});
Object.defineProperty(this, "inputKey", {
enumerable: true,
configurable: true,
writable: true,
value: "query"
});
Object.defineProperty(this, "vectorstore", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "combineDocumentsChain", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "returnSourceDocuments", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
this.vectorstore = fields.vectorstore;
this.combineDocumentsChain = fields.combineDocumentsChain;
this.inputKey = fields.inputKey ?? this.inputKey;
this.k = fields.k ?? this.k;
this.returnSourceDocuments =
fields.returnSourceDocuments ?? this.returnSourceDocuments;
}
/** @ignore */
async _call(values, runManager) {
if (!(this.inputKey in values)) {
throw new Error(`Question key ${this.inputKey} not found.`);
}
const question = values[this.inputKey];
const docs = await this.vectorstore.similaritySearch(question, this.k, values.filter, runManager?.getChild("vectorstore"));
const inputs = { question, input_documents: docs };
const result = await this.combineDocumentsChain.call(inputs, runManager?.getChild("combine_documents"));
if (this.returnSourceDocuments) {
return {
...result,
sourceDocuments: docs,
};
}
return result;
}
_chainType() {
return "vector_db_qa";
}
static async deserialize(data, values) {
if (!("vectorstore" in values)) {
throw new Error(`Need to pass in a vectorstore to deserialize VectorDBQAChain`);
}
const { vectorstore } = values;
if (!data.combine_documents_chain) {
throw new Error(`VectorDBQAChain must have combine_documents_chain in serialized data`);
}
return new VectorDBQAChain({
combineDocumentsChain: await BaseChain.deserialize(data.combine_documents_chain),
k: data.k,
vectorstore,
});
}
serialize() {
return {
_type: this._chainType(),
combine_documents_chain: this.combineDocumentsChain.serialize(),
k: this.k,
};
}
/**
* Static method that creates a VectorDBQAChain instance from a
* BaseLanguageModel and a vector store. It also accepts optional options
* to customize the chain.
* @param llm The BaseLanguageModel instance.
* @param vectorstore The vector store used for similarity search.
* @param options Optional options to customize the chain.
* @returns A new instance of VectorDBQAChain.
*/
static fromLLM(llm, vectorstore, options) {
const qaChain = loadQAStuffChain(llm);
return new this({
vectorstore,
combineDocumentsChain: qaChain,
...options,
});
}
}