如何在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
相关产品推荐
相关产品推荐

