{"version":3,"file":"retrieval_qa.cjs","names":["BaseChain","loadQAStuffChain"],"sources":["../../src/chains/retrieval_qa.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain, ChainInputs } from \"./base.js\";\nimport { SerializedVectorDBQAChain } from \"./serde.js\";\nimport {\n  StuffQAChainParams,\n  loadQAStuffChain,\n} from \"./question_answering/load.js\";\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport type LoadValues = Record<string, any>;\n\n/**\n * Interface for the input parameters of the RetrievalQAChain class.\n */\nexport interface RetrievalQAChainInput extends Omit<ChainInputs, \"memory\"> {\n  retriever: BaseRetrieverInterface;\n  combineDocumentsChain: BaseChain;\n  inputKey?: string;\n  returnSourceDocuments?: boolean;\n}\n\n/**\n * Class representing a chain for performing question-answering tasks with\n * a retrieval component.\n * @example\n * ```typescript\n * import { createStuffDocumentsChain } from \"@langchain/classic/chains/combine_documents\";\n * import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n * import { createRetrievalChain } from \"@langchain/classic/chains/retrieval\";\n * import { MemoryVectorStore } from \"@langchain/classic/vectorstores/memory\";\n *\n * const documents = [...your documents here];\n * const embeddings = ...your embeddings model;\n * const llm = ...your LLM model;\n *\n * const vectorstore = await MemoryVectorStore.fromDocuments(\n *   documents,\n *   embeddings\n * );\n * const prompt = ChatPromptTemplate.fromTemplate(`Answer the user's question: {input} based on the following context {context}`);\n *\n * const combineDocsChain = await createStuffDocumentsChain({\n *   llm,\n *   prompt,\n * });\n * const retriever = vectorstore.asRetriever();\n *\n * const retrievalChain = await createRetrievalChain({\n *   combineDocsChain,\n *   retriever,\n * });\n * ```\n */\nexport class RetrievalQAChain\n  extends BaseChain\n  implements RetrievalQAChainInput\n{\n  static lc_name() {\n    return \"RetrievalQAChain\";\n  }\n\n  inputKey = \"query\";\n\n  get inputKeys() {\n    return [this.inputKey];\n  }\n\n  get outputKeys() {\n    return this.combineDocumentsChain.outputKeys.concat(\n      this.returnSourceDocuments ? [\"sourceDocuments\"] : []\n    );\n  }\n\n  retriever: BaseRetrieverInterface;\n\n  combineDocumentsChain: BaseChain;\n\n  returnSourceDocuments = false;\n\n  constructor(fields: RetrievalQAChainInput) {\n    super(fields);\n    this.retriever = fields.retriever;\n    this.combineDocumentsChain = fields.combineDocumentsChain;\n    this.inputKey = fields.inputKey ?? this.inputKey;\n    this.returnSourceDocuments =\n      fields.returnSourceDocuments ?? this.returnSourceDocuments;\n  }\n\n  /** @ignore */\n  async _call(\n    values: ChainValues,\n    runManager?: CallbackManagerForChainRun\n  ): Promise<ChainValues> {\n    if (!(this.inputKey in values)) {\n      throw new Error(`Question key \"${this.inputKey}\" not found.`);\n    }\n    const question: string = values[this.inputKey];\n    const docs = await this.retriever.invoke(\n      question,\n      runManager?.getChild(\"retriever\")\n    );\n    const inputs = { question, input_documents: docs, ...values };\n    const result = await this.combineDocumentsChain.call(\n      inputs,\n      runManager?.getChild(\"combine_documents\")\n    );\n    if (this.returnSourceDocuments) {\n      return {\n        ...result,\n        sourceDocuments: docs,\n      };\n    }\n    return result;\n  }\n\n  _chainType() {\n    return \"retrieval_qa\" as const;\n  }\n\n  static async deserialize(\n    _data: SerializedVectorDBQAChain,\n    _values: LoadValues\n  ): Promise<RetrievalQAChain> {\n    throw new Error(\"Not implemented\");\n  }\n\n  serialize(): SerializedVectorDBQAChain {\n    throw new Error(\"Not implemented\");\n  }\n\n  /**\n   * Creates a new instance of RetrievalQAChain using a BaseLanguageModel\n   * and a BaseRetriever.\n   * @param llm The BaseLanguageModel used to generate a new question.\n   * @param retriever The BaseRetriever used to retrieve relevant documents.\n   * @param options Optional parameters for the RetrievalQAChain.\n   * @returns A new instance of RetrievalQAChain.\n   */\n  static fromLLM(\n    llm: BaseLanguageModelInterface,\n    retriever: BaseRetrieverInterface,\n    options?: Partial<\n      Omit<\n        RetrievalQAChainInput,\n        \"retriever\" | \"combineDocumentsChain\" | \"index\"\n      >\n    > &\n      StuffQAChainParams\n  ): RetrievalQAChain {\n    const qaChain = loadQAStuffChain(llm, {\n      prompt: options?.prompt,\n    });\n    return new this({\n      ...options,\n      retriever,\n      combineDocumentsChain: qaChain,\n    });\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,IAAa,mBAAb,cACUA,aAAAA,UAEV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,WAAW;CAEX,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,KAAK,sBAAsB,WAAW,OAC3C,KAAK,wBAAwB,CAAC,kBAAkB,GAAG,EAAE,CACtD;;CAGH;CAEA;CAEA,wBAAwB;CAExB,YAAY,QAA+B;AACzC,QAAM,OAAO;AACb,OAAK,YAAY,OAAO;AACxB,OAAK,wBAAwB,OAAO;AACpC,OAAK,WAAW,OAAO,YAAY,KAAK;AACxC,OAAK,wBACH,OAAO,yBAAyB,KAAK;;;CAIzC,MAAM,MACJ,QACA,YACsB;AACtB,MAAI,EAAE,KAAK,YAAY,QACrB,OAAM,IAAI,MAAM,iBAAiB,KAAK,SAAS,cAAc;EAE/D,MAAM,WAAmB,OAAO,KAAK;EACrC,MAAM,OAAO,MAAM,KAAK,UAAU,OAChC,UACA,YAAY,SAAS,YAAY,CAClC;EACD,MAAM,SAAS;GAAE;GAAU,iBAAiB;GAAM,GAAG;GAAQ;EAC7D,MAAM,SAAS,MAAM,KAAK,sBAAsB,KAC9C,QACA,YAAY,SAAS,oBAAoB,CAC1C;AACD,MAAI,KAAK,sBACP,QAAO;GACL,GAAG;GACH,iBAAiB;GAClB;AAEH,SAAO;;CAGT,aAAa;AACX,SAAO;;CAGT,aAAa,YACX,OACA,SAC2B;AAC3B,QAAM,IAAI,MAAM,kBAAkB;;CAGpC,YAAuC;AACrC,QAAM,IAAI,MAAM,kBAAkB;;;;;;;;;;CAWpC,OAAO,QACL,KACA,WACA,SAOkB;EAClB,MAAM,UAAUC,aAAAA,iBAAiB,KAAK,EACpC,QAAQ,SAAS,QAClB,CAAC;AACF,SAAO,IAAI,KAAK;GACd,GAAG;GACH;GACA,uBAAuB;GACxB,CAAC"}