如何在LangChain JS中实现Qdrant多租户的分区与检索?
如何用LangChain JS实现Qdrant的Payload分区存储与检索
一、存储时添加分区标识
LangChain的QdrantVectorStore会自动将文档的metadata作为Qdrant向量点的Payload存储。只需给每个来自目标PDF的文档添加唯一分区标识(比如pdf_id)到metadata中,即可实现Payload分区:
// 为目标PDF生成唯一标识,可根据业务逻辑自定义(如文件哈希、UUID等) const targetPdfId = "pdf_20240520_abc123"; // 给所有当前PDF的文档添加分区标识 const docsWithPartition = docs.map(doc => { return doc.addMetadata({ pdf_id: targetPdfId }); }); // 创建向量存储,所有文档的Payload会自动带上pdf_id字段 const vectorStore = await QdrantVectorStore.fromDocuments( docsWithPartition, new OpenAIEmbeddings(), { url: process.env.QDRANT_URL, collectionName: "unified_pdf_collection", // 单个集合存储所有PDF向量 } );
二、检索时指定分区过滤
检索时通过similaritySearch或similaritySearchWithScore方法的第三个参数传入Qdrant过滤条件,即可只搜索对应分区的向量:
1. 单个PDF对话检索
指定对应PDF的pdf_id,仅返回该分区的相关文档:
// 构造过滤条件:匹配指定pdf_id const singlePdfFilter = { must: [ { key: "pdf_id", match: { value: "pdf_20240520_abc123" } } ] }; // 执行检索,返回前5条相关结果 const relevantDocs = await vectorStore.similaritySearch( "请解释这份PDF中的核心概念", 5, singlePdfFilter );
2. 多PDF对话检索
若需要同时检索多个PDF的内容,可构造多值匹配的过滤条件:
// 构造过滤条件:匹配多个pdf_id中的任意一个 const multiPdfFilter = { should: [ { key: "pdf_id", match: { value: "pdf_20240520_abc123" } }, { key: "pdf_id", match: { value: "pdf_20240521_def456" } } ], minimum_should_match: 1 // 至少匹配其中一个分区 }; // 执行多PDF检索 const multiPdfRelevantDocs = await vectorStore.similaritySearch( "对比这两份PDF中的方案差异", 5, multiPdfFilter );
关键说明
- 分区标识(如
pdf_id)需保证唯一性,可根据业务场景选择文件哈希、用户+文件ID组合等方式生成; - 过滤条件遵循Qdrant官方定义的过滤语法,可灵活扩展复杂逻辑(如按用户ID、文件类型等多维度分区)。
内容的提问来源于stack exchange,提问作者SANJAY DUTT
相关产品推荐
相关产品推荐

