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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:07:36