public final class VectorStoreDocumentRetriever implements DocumentRetriever {

private final VectorStore vectorStore;

private final Double similarityThreshold;

private final Integer topK;

private final Supplier<Filter.Expression> filterExpression;

@Override
public List<Document> retrieve(Query query) {
    Assert.notNull(query, "query cannot be null");
    var searchRequest = SearchRequest.builder()
        .query(query.text())
        .filterExpression(this.filterExpression.get())
        .similarityThreshold(this.similarityThreshold)
        .topK(this.topK)
        .build();
    return this.vectorStore.similaritySearch(searchRequest);
}

}

I think that similarityThreshold\topK\filterExpression should be carried by Query. It can make VectorStoreDocumentRetriever be a singleton Object.