Dynamic "search_kwargs" during RetrievalQAWithSourcesChain call
Labels: name: area: vector store, name: auto:improvement

### Feature request

When using `RetrievalQAWithSourcesChain`, the chain call can't accept `search_kwargs` to pass then to the retriever like this:

```python
response = chain({"question": query ,'search_kwargs': search_kwargs})
``` 

In particular, I tried with `Milvus` and `MilvusRetriever` and natively could't find a way.


### Motivation

Instead to create the same chain but with different `search_kwargs` to be sended to the retriever, it would be usefull to allow [optionally] the search_kwargs sendeed dynamically in the call. 

### Your contribution

I could allow this behaevoir with the following modification:

Adding a `search_kwargs_key` to take `search_kwargs`  that then will be sended to self.retriever.get_relevant_documents( ..., `**search_kwargs`,...).

```python
class customRetrievalQAWithSourcesChain(RetrievalQAWithSourcesChain):

    search_kwargs_key:str = "search_kwargs"

    def _get_docs(
        self, inputs: Dict[str, Any], *, run_manager: CallbackManagerForChainRun
    ) -> List[Document]:
        question = inputs[self.question_key]
        search_kwargs = inputs[self.search_kwargs_key]
        docs = self.retriever.get_relevant_documents(
            question, **search_kwargs, callbacks=run_manager.get_child()
        )
        return self._reduce_tokens_below_limit(docs)

    async def _aget_docs(
        self, inputs: Dict[str, Any], *, run_manager: AsyncCallbackManagerForChainRun
    ) -> List[Document]:
        question = inputs[self.question_key]
        search_kwargs = inputs[self.search_kwargs_key]        
        docs = await self.retriever.aget_relevant_documents(
            question,**search_kwargs, callbacks=run_manager.get_child()
        )
        return self._reduce_tokens_below_limit(docs)
```

And finally allowing to VectorStoreRetriever take  `**search_kwargs` instead of `self.search_kwargs`

```python
class customRetriever(VectorStoreRetriever):

    def _get_relevant_documents(
        self, query: str, *, run_manager: CallbackManagerForRetrieverRun, **search_kwargs: Any,
    ) -> List[Document]:
        if self.search_type == "similarity":
            docs = self.vectorstore.similarity_search(query, **search_kwargs)
        elif self.search_type == "similarity_score_threshold":
            docs_and_similarities = (
                self.vectorstore.similarity_search_with_relevance_scores(
                    query, **search_kwargs
                )
            )
            docs = [doc for doc, _ in docs_and_similarities]
        elif self.search_type == "mmr":
            docs = self.vectorstore.max_marginal_relevance_search(
                query, **search_kwargs
            )
        else:
            raise ValueError(f"search_type of {self.search_type} not allowed.")
        return docs

    async def _aget_relevant_documents(
        self, query: str, *, run_manager: AsyncCallbackManagerForRetrieverRun,  **search_kwargs: Any,
    ) -> List[Document]:
        if self.search_type == "similarity":
            docs = await self.vectorstore.asimilarity_search(
                query, **search_kwargs
            )
        elif self.search_type == "similarity_score_threshold":
            docs_and_similarities = (
                await self.vectorstore.asimilarity_search_with_relevance_scores(
                    query, **search_kwargs
                )
            )
            docs = [doc for doc, _ in docs_and_similarities]
        elif self.search_type == "mmr":
            docs = await self.vectorstore.amax_marginal_relevance_search(
                query, **search_kwargs
            )
        else:
            raise ValueError(f"search_type of {self.search_type} not allowed.")
        return docs 
```

If you consider this usefull I could open a PR (confirm please). I not, maybe someone can find this usefull.

Best regards,