121 lines
4.2 KiB
JavaScript
121 lines
4.2 KiB
JavaScript
|
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,
|
||
|
});
|
||
|
}
|
||
|
}
|