自定义FilteredRetriever接入RetrievalQA触发ValidationError问题求助
问题排查与修复方案
核心问题分析
你的代码出现ValidationError有两个关键原因:
- 自定义
FilteredRetriever未继承LangChain的BaseRetriever抽象类,导致RetrievalQA无法识别它为合法的检索器 - 错误地通过
doc['title']访问文档标题,LangChain的Document对象的元数据存储在metadata属性中,应使用doc.metadata['title'] - 调用
as_retriever时参数名错误,应为search_kwargs而非kwargs
修正后的完整代码
from langchain.schema import BaseRetriever, Document from langchain.chains import RetrievalQA from langchain.chat_models import AzureChatOpenAI class FilteredRetriever(BaseRetriever): retriever: BaseRetriever title_prefix: str def _get_relevant_documents(self, query: str, **kwargs) -> list[Document]: # 调用底层检索器获取相关文档 relevant_docs = self.retriever.get_relevant_documents(query, **kwargs) # 过滤标题前缀匹配的文档 return [ doc for doc in relevant_docs if doc.metadata.get('title', '').startswith(self.title_prefix) ] # 初始化过滤检索器 filtered_retriever = FilteredRetriever( retriever=vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 3}), title_prefix='25_1_0.pdf' ) # 初始化LLM llm = AzureChatOpenAI( azure_deployment="chat", openai_api_version="2023-05-15", ) # 创建检索问答链 chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=filtered_retriever, return_source_documents=True ) # 执行查询 result = chain({"query": 'Can Colleagues contact their managers??'}) # 打印源文档标题 for res in result['source_documents']: print(res.metadata['title'])
关键修复点说明
- 继承BaseRetriever:确保自定义检索器符合LangChain的接口规范,通过
RetrievalQA的验证 - 实现_get_relevant_documents:这是
BaseRetriever要求的核心方法,负责获取并过滤相关文档 - 修正元数据访问:使用
doc.metadata.get('title', '')避免因文档缺失标题字段导致的KeyError - 修复参数名:将
kwargs改为search_kwargs,符合as_retriever方法的参数要求
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

