如何通过LangChain从PGVector多集合中检索数据?
实现PGVector多集合灵活检索的方案
方法1:合并多个检索器实现多集合同时查询
通过ConcatRetriever将不同集合对应的检索器合并,查询时会同时从所有指定集合中获取结果并统一返回。
from langchain.retrievers import ConcatRetriever from langchain.chains import RetrievalQA # 保留你已有的embeddings、store1、store2、retriever1、retriever2定义 # 合并多个检索器 combined_retriever = ConcatRetriever(retrievers=[retriever1, retriever2]) # 创建使用合并检索器的QA链 qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=combined_retriever, return_source_documents=True ) # 查询结果会包含两个集合的相关数据 res = qa("what is XYZ")
方法2:动态指定单个/多个集合查询
封装一个函数,根据传入的集合名称列表动态创建对应检索器,实现灵活选择查询目标集合的需求。
from langchain.retrievers import ConcatRetriever from langchain.chains import RetrievalQA from langchain.vectorstores import PGVector from langchain.embeddings import OpenAIEmbeddings def get_qa_chain(target_collections, llm, connection_string): embeddings = OpenAIEmbeddings() retrievers = [] # 遍历目标集合,生成对应检索器 for col_name in target_collections: store = PGVector( collection_name=col_name, connection_string=connection_string, embedding_function=embeddings, ) retrievers.append(store.as_retriever()) # 根据集合数量选择单个或合并检索器 selected_retriever = retrievers[0] if len(retrievers) == 1 else ConcatRetriever(retrievers=retrievers) # 返回配置好的QA链 return RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=selected_retriever, return_source_documents=True ) # 使用示例 # 查询单个集合 qa_single = get_qa_chain(["mydata1"], llm, CONNECTION_STRING) res_single = qa_single("what is XYZ") # 查询多个集合 qa_multi = get_qa_chain(["mydata1", "mydata2"], llm, CONNECTION_STRING) res_multi = qa_multi("what is XYZ")
补充说明
ConcatRetriever会依次调用每个检索器,将所有结果合并后返回,适合需要同时从多集合获取数据的场景。- 动态函数的方式无需修改核心逻辑,仅通过传入不同集合列表即可切换查询目标,扩展性更强。
内容的提问来源于stack exchange,提问作者utsav vc
相关产品推荐
相关产品推荐

