我已经根据 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 忽略了不是向量的字段,因此搜索索引为空,因此没有返回任何文档。