To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints based on the given information.

Let's denote:
- $x_1$ as the number of bottles of Alpha to be made,
- $x_2$ as the number of bottles of Beta to be made.

The objective is to maximize profit. Given that one bottle of Alpha is sold for a profit of $4 and one bottle of Beta is sold at a profit of $6, the objective function can be written as:
\[ \text{Maximize:} \quad 4x_1 + 6x_2 \]

The constraints are based on the availability of the rare plant extract and the demand requirements:
1. **Extract Availability Constraint**: Since one bottle of Alpha contains 15 grams of extract and one bottle of Beta contains 25 grams, and there are 2000 grams available, we have:
\[ 15x_1 + 25x_2 \leq 2000 \]
2. **Demand Requirement Constraint**: At least three times as many Alpha bottles are needed than Beta bottles:
\[ x_1 \geq 3x_2 \]
3. **Minimum Production of Beta Constraint**: A minimum of 10 bottles of Beta need to be made:
\[ x_2 \geq 10 \]

All variables $x_1$ and $x_2$ should be non-negative since they represent quantities of drugs.

Thus, the symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'Number of bottles of Alpha'), ('x2', 'Number of bottles of Beta')],
    'objective_function': '4*x1 + 6*x2',
    'constraints': ['15*x1 + 25*x2 <= 2000', 'x1 >= 3*x2', 'x2 >= 10']
}
```

Now, let's write the Gurobi code in Python to solve this linear programming problem:

```python
from gurobipy import *

# Create a new model
m = Model("Natural_Pharmacy")

# Add variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="Alpha_Bottles")
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="Beta_Bottles")

# Set the objective function
m.setObjective(4*x1 + 6*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(15*x1 + 25*x2 <= 2000, "Extract_Availability")
m.addConstr(x1 >= 3*x2, "Demand_Requirement")
m.addConstr(x2 >= 10, "Minimum_Beta_Production")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal Solution Found:")
    print(f"Number of Alpha bottles: {x1.x}")
    print(f"Number of Beta bottles: {x2.x}")
else:
    print("No optimal solution found")
```