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

如何在Langchain的RetrievalQA链中实现过滤并获取来源?

在Langchain RetrievalQA中实现价格区间过滤并获取来源的方案

核心思路

要实现类似SQL的价格区间过滤,关键是利用Langchain向量库的元数据过滤能力,同时在RetrievalQA链中配置返回检索到的文档元数据(包含来源信息)。

具体实现步骤

1. 为产品文档添加元数据

确保每个产品文档的元数据中包含price(价格数值)和source(来源标识,比如文件名、数据库ID等)字段。示例代码:

from langchain.docstore.document import Document

# 模拟产品数据,每个文档对应一个产品
product_docs = [
    Document(
        page_content="产品A:XX品牌手机,6.7英寸屏幕,128GB存储",
        metadata={"price": 3999, "source": "product_catalog_2024.pdf"}
    ),
    Document(
        page_content="产品B:XX品牌平板,10.9英寸屏幕,256GB存储",
        metadata={"price": 2499, "source": "product_catalog_2024.pdf"}
    ),
    Document(
        page_content="产品C:XX品牌笔记本,14英寸屏幕,512GB SSD",
        metadata={"price": 5999, "source": "laptop_series_2024.md"}
    )
]

2. 创建带过滤能力的向量检索器

基于你的向量存储(比如FAISS、Pinecone等),创建检索器时传入价格区间的过滤条件。以FAISS为例:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import AzureChatOpenAI

# 初始化Azure OpenAI模型和嵌入
llm = AzureChatOpenAI(
    azure_endpoint="你的Azure端点",
    openai_api_key="你的API密钥",
    openai_api_version="2023-05-15",
    deployment_name="你的部署名称"
)
embeddings = OpenAIEmbeddings(
    azure_endpoint="你的Azure端点",
    openai_api_key="你的API密钥",
    openai_api_version="2023-05-15",
    deployment="你的嵌入部署名称"
)

# 创建向量库并生成检索器
vector_store = FAISS.from_documents(product_docs, embeddings)
# 定义价格区间过滤函数(比如2000-4000元)
def price_filter(metadata):
    return 2000 <= metadata["price"] <= 4000

# 创建带过滤的检索器
filtered_retriever = vector_store.as_retriever(search_kwargs={"filter": price_filter})

3. 配置RetrievalQA链返回来源信息

初始化RetrievalQA时,设置return_source_documents=True,这样链会返回检索到的原始文档(包含元数据中的source):

from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=filtered_retriever,
    return_source_documents=True  # 开启返回来源文档
)

4. 调用链并提取结果与来源

调用链后,从返回结果中提取回答内容和对应的来源:

# 发起查询(这里可以是任意用户问题,检索器会先过滤价格区间内的产品)
result = qa_chain({"query": "推荐价格适中的电子产品"})

# 提取回答
print("回答内容:", result["result"])

# 提取关联来源
print("\n关联来源:")
for doc in result["source_documents"]:
    print(f"- 产品价格: {doc.metadata['price']} 元,来源: {doc.metadata['source']}")

关键说明

  • 如果使用的是云向量存储(比如Pinecone),过滤条件的语法可能略有不同,需要对应调整search_kwargs["filter"]的格式(例如Pinecone使用字典格式的过滤条件)。
  • 若需要动态根据用户问题中的价格区间生成过滤条件,可以结合Langchain的LLMChain先解析用户问题中的价格范围,再传递给检索器。

内容的提问来源于stack exchange,提问作者AndCh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:33:20