You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义FilteredRetriever接入RetrievalQA触发ValidationError问题求助

问题排查与修复方案

核心问题分析

你的代码出现ValidationError有两个关键原因:

  1. 自定义FilteredRetriever未继承LangChain的BaseRetriever抽象类,导致RetrievalQA无法识别它为合法的检索器
  2. 错误地通过doc['title']访问文档标题,LangChain的Document对象的元数据存储在metadata属性中,应使用doc.metadata['title']
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:22:45