我按照 firebase 文档创建了一个复合索引
gcloud alpha firestore indexes composite create \--project=[Insert Project Name Here]--collection-group=elements --query-scope=COLLECTION \--field-config=vector-config='{"dimension":"1536","flat": "{}"}',field-path=embedding
这个操作正常进行,我可以在 gcloud firestore indexes composite describe [Insert Index Name Here]
下清楚地看到它
然后我尝试使用一个 onCall 函数来查询数据库。
export const vectorSearch = functions.https.onCall(async (data, context) => { const { query, quantity } = data; if (!query) { throw new functions.https.HttpsError('failed-precondition', 'query is required'); } if (!quantity) { throw new functions.https.HttpsError('failed-precondition', 'quantity is required'); } try { console.log(`Creating embedding for ${query}`) const embeddingResponse = await openai.embeddings.create({ model: "text-embedding-3-small", input: query, encoding_format: "float", }); const embedding = embeddingResponse.data[0].embedding; console.log(`Embedding:`, embedding) const vectorQuery: VectorQuery = firestore.collection('elements').findNearest('embedding', FieldValue.vector(embedding), { limit: quantity, distanceMeasure: 'COSINE' }); const snapshot: VectorQuerySnapshot = await vectorQuery.get(); console.log(`Snapshot:`, snapshot) const formattedData: any = {}; snapshot.docs.forEach((doc) => { formattedData[doc.id] = doc.data(); }); return { docs: formattedData }; } catch (error) { console.error('Error querying database:', error); throw new functions.https.HttpsError('internal', 'Error querying database'); }});
问题
当我调用这个函数时,尽管相关集合下有文档,我却没有得到任何条目。我没有收到任何错误 – 只是响应中没有出现任何文档。然而,我应该能看到我在 quantity
字段中指定的文档数量。这是为什么呢?
回答:
我在 Firestore 数据库中将每个嵌入字段存储为数组。
[0.1, 0.2, 0.3]
我应该将每个嵌入存储为 vector
类型。
FieldValue.vector([0.1, 0.2, 0.3])
Firebase 忽略了不是向量类型的字段,因此搜索的索引为空,所以没有返回任何文档。