To tackle this problem, we first need to break down the natural language description into a symbolic representation. This involves defining variables and formulating the objective function and constraints using these variables.

Let's define:
- \(x_1\) as the number of large packages of ramen.
- \(x_2\) as the number of small packages of ramen.

The objective is to maximize profit. Given that the profit per large package is $3 and the profit per small package is $0.50, the objective function can be written as:
\[ \text{Maximize:} \quad 3x_1 + 0.5x_2 \]

Now, let's consider the constraints:

1. **Budget Constraint**: The store has a budget of $2000. Each large package costs $3 and each small package costs $1.
\[ 3x_1 + x_2 \leq 2000 \]

2. **Shelf Space Constraint**: The store has available 400 units of shelf space. Each large package takes 3 units, and each small package takes 1 unit.
\[ 3x_1 + x_2 \leq 400 \]

3. **Small Packages Percentage Constraint**: At least 70% of all stock should be small packages.
\[ x_2 \geq 0.7(x_1 + x_2) \]
This can be rearranged as:
\[ 0.3x_2 \geq 0.7x_1 \]
Or more appropriately for our purposes:
\[ 0.7x_1 \leq 0.3x_2 \]
Which simplifies further to:
\[ 7x_1 \leq 3x_2 \]

4. **Non-Negativity Constraints**: Both \(x_1\) and \(x_2\) must be non-negative since they represent quantities of packages.
\[ x_1 \geq 0, x_2 \geq 0 \]

Given this breakdown, the symbolic representation of our problem in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of large packages'), ('x2', 'number of small packages')],
    'objective_function': '3*x1 + 0.5*x2',
    'constraints': [
        '3*x1 + x2 <= 2000',
        '3*x1 + x2 <= 400',
        '7*x1 <= 3*x2',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

Now, let's implement this problem using Gurobi in Python:

```python
from gurobipy import *

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

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

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

# Add constraints
m.addConstr(3*x1 + x2 <= 2000, "budget")
m.addConstr(3*x1 + x2 <= 400, "shelf_space")
m.addConstr(7*x1 <= 3*x2, "small_packages_percentage")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Large Packages: {x1.x}")
    print(f"Small Packages: {x2.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```