make the rag module optional
diff --git a/metagpt/environment/__init__.py b/metagpt/environment/__init__.py
index 692672fa7..28981f2f8 100644
--- a/metagpt/environment/__init__.py
+++ b/metagpt/environment/__init__.py
@@ -4,10 +4,9 @@
 
 from metagpt.environment.base_env import Environment
 from metagpt.environment.android_env.android_env import AndroidEnv
-from metagpt.environment.mincraft_env.mincraft_env import MincraftExtEnv
 from metagpt.environment.werewolf_env.werewolf_env import WerewolfEnv
 from metagpt.environment.stanford_town_env.stanford_town_env import StanfordTownEnv
 from metagpt.environment.software_env.software_env import SoftwareEnv
 
 
-__all__ = ["AndroidEnv", "MincraftExtEnv", "WerewolfEnv", "StanfordTownEnv", "SoftwareEnv", "Environment"]
+__all__ = ["AndroidEnv", "WerewolfEnv", "StanfordTownEnv", "SoftwareEnv", "Environment"]
diff --git a/metagpt/roles/__init__.py b/metagpt/roles/__init__.py
index f033a5dfa..08a0406b3 100644
--- a/metagpt/roles/__init__.py
+++ b/metagpt/roles/__init__.py
@@ -14,7 +14,6 @@
 from metagpt.roles.qa_engineer import QaEngineer
 from metagpt.roles.searcher import Searcher
 from metagpt.roles.sales import Sales
-from metagpt.roles.customer_service import CustomerService
 
 
 __all__ = [
@@ -26,5 +25,4 @@
     "QaEngineer",
     "Searcher",
     "Sales",
-    "CustomerService",
 ]
diff --git a/requirements.txt b/requirements.txt
index 83565278b..a447eef13 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,14 +10,6 @@ typer==0.9.0
 # godot==0.1.1
 # google_api_python_client==2.93.0  # Used by search_engine.py
 lancedb==0.4.0
-llama-index-core==0.10.15
-llama-index-embeddings-azure-openai==0.1.6
-llama-index-embeddings-openai==0.1.5
-llama-index-llms-azure-openai==0.1.4
-llama-index-readers-file==0.1.4
-llama-index-retrievers-bm25==0.1.3
-llama-index-vector-stores-faiss==0.1.1
-chromadb==0.4.23
 loguru==0.6.0
 meilisearch==0.21.0
 numpy==1.24.3
diff --git a/setup.py b/setup.py
index df9bedc9b..f834b4c44 100644
--- a/setup.py
+++ b/setup.py
@@ -28,6 +28,16 @@ def run(self):
     "search-google": ["google-api-python-client==2.94.0"],
     "search-ddg": ["duckduckgo-search~=4.1.1"],
     "ocr": ["paddlepaddle==2.4.2", "paddleocr>=2.0.1", "tabulate==0.9.0"],
+    "rag": [
+        "llama-index-core==0.10.15",
+        "llama-index-embeddings-azure-openai==0.1.6",
+        "llama-index-embeddings-openai==0.1.5",
+        "llama-index-llms-azure-openai==0.1.4",
+        "llama-index-readers-file==0.1.4",
+        "llama-index-retrievers-bm25==0.1.3",
+        "llama-index-vector-stores-faiss==0.1.1",
+        "chromadb==0.4.23",
+    ],
 }
 
 extras_require["test"] = [
@@ -42,7 +52,6 @@ def run(self):
     "connexion[uvicorn]~=3.0.5",
     "azure-cognitiveservices-speech~=1.31.0",
     "aioboto3~=11.3.0",
-    "chromadb==0.4.23",
     "gradio==3.0.0",
     "grpcio-status==1.48.2",
     "pylint==3.0.3",

**Features**
<!-- Clear and direct description of the submit features. -->
<!-- If it's a bug fix, please also paste the issue link. -->

- Make the rag module optional.
    
**Feature Docs**
<!-- The RFC, tutorial, or use cases about the feature if it's a pretty big update. If not, there is no need to fill. -->

**Influence**
<!-- Tell me the impact of the new feature and I'll focus on it.  -->

**Result**
<!-- The screenshot/log of unittest/running result -->
```
2024-03-22 11:11:24.273 | INFO     | metagpt.const:get_metagpt_package_root:29 - Package root set to /data/hjt/MetaGPT
2024-03-22 11:11:26.816 | INFO     | metagpt.team:invest:90 - Investment: $3.0.
2024-03-22 11:11:26.818 | INFO     | metagpt.roles.role:_act:391 - Alice(Product Manager): to do PrepareDocuments(PrepareDocuments)
2024-03-22 11:11:26.848 | INFO     | metagpt.utils.file_repository:save:57 - save to: /data/hjt/MetaGPT/workspace/20240322111126/docs/requirement.txt
2024-03-22 11:11:26.850 | INFO     | metagpt.roles.role:_act:391 - Alice(Product Manager): to do WritePRD(WritePRD)
2024-03-22 11:11:26.851 | INFO     | metagpt.actions.write_prd:run:86 - New requirement detected: write a 2048 game
[CONTENT]
{
    "Language": "English",
    "Programming Language": "Python",
    "Original Requirements": "write a 2048 game",
    "Project Name": "game_2048",
    "Product Goals": [
        "Create an engaging user experience",
        "Improve accessibility, be responsive",
        "More beautiful UI"
    ],
    "User Stories": [
        "As a player, I want to be able to choose difficulty levels",
        "As a player, I want to see my score after each game",
        "As a player, I want to get restart button when I lose",
        "As a player, I want to see beautiful UI that make me feel good",
        "As a player, I want to play game via mobile phone"
...
```
```
...
## Code Review Result
LGTM
Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0125.
2024-03-22 11:12:29.107 | INFO     | metagpt.utils.cost_manager:update_cost:57 - Total running cost: $0.021 | Max budget: $3.000 | Current cost: $0.002, prompt_tokens: 1383, completion_tokens: 84
2024-03-22 11:12:29.111 | INFO     | metagpt.utils.file_repository:save:57 - save to: /data/hjt/MetaGPT/workspace/game_2048/game_2048/main.py
2024-03-22 11:12:29.113 | INFO     | metagpt.utils.file_repository:save:62 - update dependency: /data/hjt/MetaGPT/workspace/game_2048/game_2048/main.py:['docs/task/20240322111143.json', 'docs/system_design/20240322111143.json']
2024-03-22 11:12:29.124 | INFO     | metagpt.utils.git_repository:archive:168 - Archive: ['.dependencies.json', 'docs/prd/20240322111143.json', 'docs/requirement.txt', 'docs/system_design/20240322111143.json', 'docs/task/20240322111143.json', 'game_2048/game.py', 'game_2048/main.py', 'requirements.txt', 'resources/competitive_analysis/20240322111143.mmd', 'resources/data_api_design/20240322111143.mmd', 'resources/prd/20240322111143.md', 'resources/seq_flow/20240322111143.mmd', 'resources/system_design/20240322111143.md']
```
**Other**
<!-- Something else about this PR. -->