multiQuery method

Future<List<MultiDocsQuerySegment>> multiQuery(
  1. List<String> collectionNameList,
  2. String queryText,
  3. LLMSettings llmSettings, {
  4. int nResults = 2,
  5. bool removeDuplicates = true,
})
override

Implementation

Future<List<MultiDocsQuerySegment>> multiQuery(List<String> collectionNameList, String queryText, LLMSettings llmSettings, { int nResults = 2, bool removeDuplicates = true}) async {
  EmbeddingFunction embeddingFunction = OpenAIEmbeddingFunction(llmConfig: llmSettings.llmConfig, listen: llmSettings.listenToken);
  List<List<double>> queryEmbeddings = await embeddingFunction.generate([Embeddable.document(queryText)]);
  List<MultiDocsQuerySegment> multiDocsQuerySegmentList = [];
  for(String collectionName in collectionNameList) {
    try {
      Collection collection = await client.getCollection(name: collectionName);
      QueryResponse queryResponse = await collection.query(
          queryEmbeddings: queryEmbeddings, nResults: nResults);
      for (int i = 0; i < queryResponse.ids[0].length; i++) {
        QuerySegmentResult querySegmentResult = QuerySegmentResult(
            id: queryResponse.ids[0][i],
            text: queryResponse.documents![0][i]!,
            metadata: queryResponse.metadatas?[0][i] == null
                ? {}
                : _convertToFlatMetadata(queryResponse.metadatas![0][i]!),
            distance: queryResponse.distances![0][i]
        );
        MultiDocsQuerySegment multiDocsQuerySegment = MultiDocsQuerySegment(docsId: collectionName, querySegmentResult: querySegmentResult);
        multiDocsQuerySegmentList.add(multiDocsQuerySegment);
      }
    } on ChromaApiClientException catch(e) {
      VectorDatabaseException vdbException = VectorDatabaseException(
          code: e.code??500,
          message: e.message + ": " + (e.body is String ? (e.body as String) : e.body.toString())
      );
      throw vdbException;
    }
  }

  if(removeDuplicates) {
    Set<String> distanceSet = {};
    multiDocsQuerySegmentList.retainWhere((multiDocsQuerySegment) => distanceSet.add(multiDocsQuerySegment.querySegmentResult.text));
  }

  multiDocsQuerySegmentList.sort((a, b) => a.querySegmentResult.distance.compareTo(b.querySegmentResult.distance));
  if(multiDocsQuerySegmentList.length > nResults) {
    multiDocsQuerySegmentList.length = nResults;
  }

  return multiDocsQuerySegmentList;
}