multiQuery method
Future<List<MultiDocsQuerySegment> >
multiQuery(
- List<
String> collectionNameList, - String queryText,
- LLMSettings llmSettings, {
- int nResults = 2,
- 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;
}