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

Let's define:
- $x_1$ as the number of gourmet truffles.
- $x_2$ as the number of chocolate bars.

The objective is to maximize profit. Given that each gourmet truffle sells for a profit of $7 and each chocolate bar sells for a profit of $3, the objective function can be represented as:
\[ \text{Maximize:} \quad 7x_1 + 3x_2 \]

Now, let's formulate the constraints based on the given information:
1. **Cocoa Availability Constraint:** Each gourmet truffle weighs 700 grams, and each chocolate bar weighs 300 grams. Cacaotier has 30,000 grams of cocoa available.
\[ 700x_1 + 300x_2 \leq 30,000 \]
2. **Minimum Gourmet Truffles Constraint:** There needs to be at least 10 gourmet truffles made.
\[ x_1 \geq 10 \]
3. **Chocolate Bars vs. Gourmet Truffles Ratio Constraint:** At least twice the amount of chocolate bars are needed than gourmet truffles.
\[ x_2 \geq 2x_1 \]
4. **Non-Negativity Constraints:** Both $x_1$ and $x_2$ must be non-negative since they represent quantities of products.
\[ x_1, x_2 \geq 0 \]

Given these constraints and the objective function, we have a linear programming problem.

Here is the symbolic representation in JSON format:
```json
{
    'sym_variables': [('x1', 'number of gourmet truffles'), ('x2', 'number of chocolate bars')],
    'objective_function': '7*x1 + 3*x2',
    'constraints': ['700*x1 + 300*x2 <= 30000', 'x1 >= 10', 'x2 >= 2*x1', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this in Gurobi using Python:
```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="gourmet_truffles")
x2 = m.addVar(vtype=GRB.INTEGER, name="chocolate_bars")

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

# Add constraints
m.addConstr(700*x1 + 300*x2 <= 30000, "cocoa_availability")
m.addConstr(x1 >= 10, "min_gourmet_truffles")
m.addConstr(x2 >= 2*x1, "chocolate_bars_ratio")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of gourmet truffles: {x1.x}")
    print(f"Number of chocolate bars: {x2.x}")
    print(f"Maximum profit: ${7*x1.x + 3*x2.x}")
else:
    print("No optimal solution found")
```