跳至主要内容

如何编写自定义检索器类

先决条件

本指南假定您熟悉以下概念

要创建您自己的检索器,您需要扩展 BaseRetriever 类并实现一个 _getRelevantDocuments 方法,该方法将 string 作为其第一个参数(以及可选的 runManager 用于跟踪)。该方法应该返回从某些来源获取的 Document 数组。此过程可能涉及调用数据库、使用 fetch 调用网络或任何其他来源。请注意 _getRelevantDocuments() 之前的下划线。基类包装了没有前缀的版本,以便自动处理对原始调用的跟踪。

以下是返回静态文档的自定义检索器的示例

import {
BaseRetriever,
type BaseRetrieverInput,
} from "@langchain/core/retrievers";
import type { CallbackManagerForRetrieverRun } from "@langchain/core/callbacks/manager";
import { Document } from "@langchain/core/documents";

export interface CustomRetrieverInput extends BaseRetrieverInput {}

export class CustomRetriever extends BaseRetriever {
lc_namespace = ["langchain", "retrievers"];

constructor(fields?: CustomRetrieverInput) {
super(fields);
}

async _getRelevantDocuments(
query: string,
runManager?: CallbackManagerForRetrieverRun
): Promise<Document[]> {
// Pass `runManager?.getChild()` when invoking internal runnables to enable tracing
// const additionalDocs = await someOtherRunnable.invoke(params, runManager?.getChild());
return [
// ...additionalDocs,
new Document({
pageContent: `Some document pertaining to ${query}`,
metadata: {},
}),
new Document({
pageContent: `Some other document pertaining to ${query}`,
metadata: {},
}),
];
}
}

然后,您可以按如下方式调用 .invoke()

const retriever = new CustomRetriever({});

await retriever.invoke("LangChain docs");
[
Document {
pageContent: 'Some document pertaining to LangChain docs',
metadata: {}
},
Document {
pageContent: 'Some other document pertaining to LangChain docs',
metadata: {}
}
]

后续步骤

现在,您已经看到了实现您自己的自定义检索器的示例。

接下来,查看各个部分以深入了解特定检索器,或查看 关于 RAG 的更广泛教程


此页面是否有帮助?


您也可以在 GitHub 上留下详细反馈 GitHub.