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

