diff --git a/.changeset/slow-adults-nail.md b/.changeset/slow-adults-nail.md
new file mode 100644
index 0000000000000000000000000000000000000000..b48f661eb1be00343ff5a9922c4f97403ae1b665
--- /dev/null
+++ b/.changeset/slow-adults-nail.md
@@ -0,0 +1,5 @@
+---
+"llamaindex": patch
+---
+
+feat: add top k to `asQueryEngine`
diff --git a/packages/core/src/indices/vectorStore/index.ts b/packages/core/src/indices/vectorStore/index.ts
index 7450c233d2dc70a4a1c100b468b55f3669302bf5..b81d897afc09637321f5865187a200c16dd02050 100644
--- a/packages/core/src/indices/vectorStore/index.ts
+++ b/packages/core/src/indices/vectorStore/index.ts
@@ -279,18 +279,29 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
     return new VectorIndexRetriever({ index: this, ...options });
   }
 
+  /**
+   * Create a RetrieverQueryEngine.
+   * similarityTopK is only used if no existing retriever is provided.
+   */
   asQueryEngine(options?: {
     retriever?: BaseRetriever;
     responseSynthesizer?: BaseSynthesizer;
     preFilters?: MetadataFilters;
     nodePostprocessors?: BaseNodePostprocessor[];
+    similarityTopK?: number;
   }): QueryEngine & RetrieverQueryEngine {
-    const { retriever, responseSynthesizer } = options ?? {};
+    const {
+      retriever,
+      responseSynthesizer,
+      preFilters,
+      nodePostprocessors,
+      similarityTopK,
+    } = options ?? {};
     return new RetrieverQueryEngine(
-      retriever ?? this.asRetriever(),
+      retriever ?? this.asRetriever({ similarityTopK }),
       responseSynthesizer,
-      options?.preFilters,
-      options?.nodePostprocessors,
+      preFilters,
+      nodePostprocessors,
     );
   }