Repository: ollama/ollama
Pull request: Add example using JSON format output


Changed files:
filename: examples/python-json-datagenerator/predefinedschema.py
patch: @@ -0,0 +1,31 @@
+import requests
+import json
+import random
+
+model = "llama2"
+template = {
+  "firstName": "", 
+  "lastName": "", 
+  "address": {
+    "street": "", 
+    "city": "", 
+    "state": "", 
+    "zipCode": ""
+  }, 
+  "phoneNumber": ""
+}
+
+prompt = f"generate one realistically believable sample data set of a persons first name, last name, address in the US, and  phone number. \nUse the following template: {json.dumps(template)}."
+
+data = {
+    "prompt": prompt,
+    "model": model,
+    "format": "json",
+    "stream": False,
+    "options": {"temperature": 2.5, "top_p": 0.99, "top_k": 100},
+}
+
+print(f"Generating a sample user")
+response = requests.post("http://localhost:11434/api/generate", json=data, stream=False)
+json_data = json.loads(response.text)
+print(json.dumps(json.loads(json_data["response"]), indent=2))

filename: examples/python-json-datagenerator/randomaddresses.py
patch: @@ -0,0 +1,31 @@
+import requests
+import json
+import random
+
+countries = [
+    "United States",
+    "United Kingdom",
+    "the Netherlands",
+    "Germany",
+    "Mexico",
+    "Canada",
+    "France",
+]
+country = random.choice(countries)
+model = "llama2"
+
+prompt = f"generate one realistically believable sample data set of a persons first name, last name, address in {country}, and phone number. Do not use common names. Respond using JSON. Key names should have no backslashes, values should use plain ascii with no special characters."
+
+data = {
+    "prompt": prompt,
+    "model": model,
+    "format": "json",
+    "stream": False,
+    "options": {"temperature": 2.5, "top_p": 0.99, "top_k": 100},
+}
+
+print(f"Generating a sample user in {country}")
+response = requests.post("http://localhost:11434/api/generate", json=data, stream=False)
+json_data = json.loads(response.text)
+
+print(json.dumps(json.loads(json_data["response"]), indent=2))

filename: examples/python-json-datagenerator/readme.md
patch: @@ -0,0 +1,34 @@
+# JSON Output Example
+
+![llmjson 2023-11-10 15_31_31](https://github.com/jmorganca/ollama/assets/633681/e599d986-9b4a-4118-81a4-4cfe7e22da25)
+
+There are two python scripts in this example. `randomaddresses.py` generates random addresses from different countries. `predefinedschema.py` sets a template for the model to fill in.
+
+## Review the Code
+
+Both programs are basically the same, with a different prompt for each, demonstrating two different ideas. The key part of getting JSON out of a model is to state in the prompt or system prompt that it should respond using JSON, and specifying the `format` as `json` in the data body.
+
+```python
+prompt = f"generate one realistically believable sample data set of a persons first name, last name, address in {country}, and  phone number. Do not use common names. Respond using JSON. Key names should with no backslashes, values should use plain ascii with no special characters."
+
+data = {
+    "prompt": prompt,
+    "model": model,
+    "format": "json",
+    "stream": False,
+    "options": {"temperature": 2.5, "top_p": 0.99, "top_k": 100},
+}
+```
+
+When running `randomaddresses.py` you will see that the schema changes and adapts to the chosen country.
+
+In `predefinedschema.py`, a template has been specified in the prompt as well. It's been defined as JSON and then dumped into the prompt string to make it easier to work with.
+
+Both examples turn streaming off so that we end up with the completed JSON all at once. We need to convert the `response.text` to JSON so that when we output it as a string we can set the indent spacing to make the output easy to read.
+
+```python
+response = requests.post("http://localhost:11434/api/generate", json=data, stream=False)
+json_data = json.loads(response.text)
+
+print(json.dumps(json.loads(json_data["response"]), indent=2))
+```

filename: examples/python-json-datagenerator/requirements.txt
patch: @@ -0,0 +1 @@
+Requests==2.31.0