queryAll method

  1. @override
Future<VectorSpaceResult> queryAll(
  1. List<String> queries, {
  2. int maxResults = 100,
  3. int compactQueriesTo = 10,
  4. int maxTokens = 50000,
})
override

Implementation

@override
Future<VectorSpaceResult> queryAll(
  List<String> queries, {
  int maxResults = 100,
  int compactQueriesTo = 10,
  int maxTokens = 50000,
}) async {
  if (queries.isEmpty || await getCollection() == null) {
    return const VectorSpaceResult(results: []);
  }

  queries = mergeQueries(queries.toList(), compactQueriesTo);
  List<DenseVector> openAiVectors = await onEmbed(queries);
  int mre = max((maxTokens / queries.length).floor(), 1);
  QueryBatchResponse r = await points.queryBatch(
    buildQueryBatch(maxResultsEach: mre, openAiVectors: openAiVectors),
  );
  List<VectorResult> results = [];
  List<List<ScoredPoint>> sc = r.result.map((i) => i.result).toList();
  mre = sc.isEmpty ? 0 : sc.map((i) => i.length).max();
  int cc = (chunkSize * 0.6).ceil();
  Map<String, double> selectedScores = {};
  List<PointId> pointRequests = [];
  int ttc = 0;
  splade:
  for (int i = 0; i < mre; i++) {
    for (int j = 0; j < sc.length; j++) {
      if (i >= sc[j].length) {
        continue;
      }

      final sp = sc[j][i];
      if (selectedScores.containsKey(sp.id.uuid)) {
        continue;
      }
      selectedScores[sp.id.uuid] = sp.score;
      pointRequests.add(sp.id);
      ttc += cc;

      if (pointRequests.length >= maxResults || ttc > maxTokens) {
        break splade;
      }
    }
  }

  if (pointRequests.isEmpty) {
    return const VectorSpaceResult(results: []);
  }

  for (final batch in pointRequests.chunked(32)) {
    final response = await points.get(
      GetPoints(
        collectionName: namespace,
        withPayload: WithPayloadSelector(
          include: PayloadIncludeSelector(
            fields: ["id", "text", "record", "entry", "metadata"],
          ),
        ),
        ids: batch,
      ),
    );

    results.addAll(
      await Future.wait(
        response.result.map(
          (point) => _toVectorResult(
            point.id,
            point.payload,
            score: selectedScores[point.id.uuid] ?? 0,
          ),
        ),
      ),
    );
  }

  VectorSpaceResult rx = VectorSpaceResult(results: results);
  rx = rx.baked(maxResults: maxResults, maxTokens: maxTokens);
  return rx;
}