Merge pull request #1079 from jmorganca/mattw/jsonexample
Add example using JSON format output
This commit is contained in:
commit
db5ef3004c
4 changed files with 97 additions and 0 deletions
31
examples/python-json-datagenerator/predefinedschema.py
Normal file
31
examples/python-json-datagenerator/predefinedschema.py
Normal file
|
@ -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))
|
31
examples/python-json-datagenerator/randomaddresses.py
Normal file
31
examples/python-json-datagenerator/randomaddresses.py
Normal file
|
@ -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))
|
34
examples/python-json-datagenerator/readme.md
Normal file
34
examples/python-json-datagenerator/readme.md
Normal file
|
@ -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))
|
||||||
|
```
|
1
examples/python-json-datagenerator/requirements.txt
Normal file
1
examples/python-json-datagenerator/requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Requests==2.31.0
|
Loading…
Reference in a new issue