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

如何在Gen App Builder中实现Firestore子集合的自定义检索器

解决方法

1. 固定组织ID的检索器配置

如果你的检索器只针对某个固定组织的rags子集合,直接指定子集合的完整路径即可:

const retrieverConfig = defineFirestoreRetriever({
  name: 'organization-rags-retriever',
  firestore: firestore,
  // 填写子集合完整路径:organizations/{你的组织ID}/rags
  collection: 'organizations/xxx-org-id/rags',
  embedder: textEmbeddingGecko,
  // 指定存储向量的字段(假设你的向量存在`embedding`字段中)
  vectorField: 'embedding',
  // 可选:设置返回结果数量、相似度阈值
  maxResults: 10,
  similarityThreshold: 0.7
})

2. 动态指定组织ID的自定义检索器

如果需要根据不同组织ID动态查询,自己封装一个检索函数,结合Firestore的向量查询逻辑即可:

async function getRelevantRagDocs(orgId, queryText) {
  // 为查询文本生成向量嵌入
  const embedding = await textEmbeddingGecko.embedQuery(queryText);

  // 定位到目标组织的`rags`子集合
  const ragsCollection = firestore.collection(`organizations/${orgId}/rags`);

  // 执行向量相似度查询
  const snapshot = await ragsCollection
    .orderBy('embedding', 'desc')
    .where('embedding', 'array-contains-any', embedding)
    .limit(10)
    .get();

  // 整理返回结果
  return snapshot.docs.map(doc => ({
    id: doc.id,
    ...doc.data(),
    // 可选:自行计算相似度得分
    similarity: calculateSimilarity(embedding, doc.data().embedding)
  }));
}

// 辅助函数:计算向量余弦相似度
function calculateSimilarity(vec1, vec2) {
  const dotProduct = vec1.reduce((sum, val, idx) => sum + val * vec2[idx], 0);
  const mag1 = Math.sqrt(vec1.reduce((sum, val) => sum + val ** 2, 0));
  const mag2 = Math.sqrt(vec2.reduce((sum, val) => sum + val ** 2, 0));
  return dotProduct / (mag1 * mag2);
}

关键注意事项

  • 必须为rags子集合的embedding字段创建向量索引,否则向量查询无法正常执行。
  • 如果使用Firebase官方的Firestore Vector Search功能,需确保项目已开通该服务,并改用对应的findNearest方法替代上述查询逻辑。
  • 动态查询场景下要做好权限控制,确保当前用户有权访问目标组织的rags子集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:43:12