mirror of
https://github.com/wassname/prob_jsonformer.git
synced 2026-08-20 12:40:20 +08:00
23 KiB
23 KiB
In [1]:
# autoreload your package
%load_ext autoreload
%autoreload 2In [2]:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
print("Loading model and tokenizer...")
model_name = "databricks/dolly-v2-3b"
model = AutoModelForCausalLM.from_pretrained(
model_name,
use_cache=True,
torch_dtype=torch.float16,
attn_implementation="eager",
).to("cuda:0")
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True, use_cache=True)
print("Loaded model and tokenizer")Loading model and tokenizer... Loaded model and tokenizer
In [3]:
from prob_jsonformer.format import highlight_values
from prob_jsonformer.main import Jsonformer
ecomm = {
"type": "object",
"properties": {
"store": {
"type": "object",
"properties": {
"name": {"type": "string"},
"location": {"type": "string"},
"p_enum": {
"type": "p_enum",
"enum": ["ski", "snowboard", "walk", "pretend"],
},
"inventory": {
"type": "array",
"items": {
"type": "object",
"properties": {
"productId": {"type": "string"},
"name": {"type": "string"},
"description": {"type": "string"},
"category": {"type": "string"},
"price": {"type": "number"},
"inStock": {"type": "boolean"},
"rating": {"type": "number"},
"images": {"type": "array", "items": {"type": "string"}},
},
},
},
},
}
},
}
builder = Jsonformer(
model=model,
tokenizer=tokenizer,
json_schema=ecomm,
prompt="write a description about mike's ski shop which sells premium skis and snowboards",
max_string_token_length=20,
)
print("Generating...")
output = builder()
highlight_values(output)The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Generating...
[0;31m---------------------------------------------------------------------------[0m
[0;31mKeyError[0m Traceback (most recent call last)
Cell [0;32mIn[3], line 47[0m
[1;32m 38[0m builder [38;5;241m=[39m Jsonformer(
[1;32m 39[0m model[38;5;241m=[39mmodel,
[1;32m 40[0m tokenizer[38;5;241m=[39mtokenizer,
[0;32m (...)[0m
[1;32m 43[0m max_string_token_length[38;5;241m=[39m[38;5;241m20[39m,
[1;32m 44[0m )
[1;32m 46[0m [38;5;28mprint[39m([38;5;124m"[39m[38;5;124mGenerating...[39m[38;5;124m"[39m)
[0;32m---> 47[0m output [38;5;241m=[39m [43mbuilder[49m[43m([49m[43m)[49m
[1;32m 49[0m highlight_values(output)
File [0;32m/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/prob_jsonformer/main.py:439[0m, in [0;36mJsonformer.__call__[0;34m(self)[0m
[1;32m 437[0m [38;5;28;01mdef[39;00m[38;5;250m [39m[38;5;21m__call__[39m([38;5;28mself[39m) [38;5;241m-[39m[38;5;241m>[39m Dict[[38;5;28mstr[39m, Any]:
[1;32m 438[0m [38;5;28mself[39m[38;5;241m.[39mvalue [38;5;241m=[39m {}
[0;32m--> 439[0m generated_data [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mgenerate_object[49m[43m([49m
[1;32m 440[0m [43m [49m[38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mjson_schema[49m[43m[[49m[38;5;124;43m"[39;49m[38;5;124;43mproperties[39;49m[38;5;124;43m"[39;49m[43m][49m[43m,[49m[43m [49m[38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mvalue[49m
[1;32m 441[0m [43m [49m[43m)[49m
[1;32m 442[0m [38;5;28;01mreturn[39;00m generated_data
File [0;32m/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/prob_jsonformer/main.py:274[0m, in [0;36mJsonformer.generate_object[0;34m(self, properties, obj)[0m
[1;32m 272[0m [38;5;28;01mfor[39;00m key, schema [38;5;129;01min[39;00m properties[38;5;241m.[39mitems():
[1;32m 273[0m [38;5;28mself[39m[38;5;241m.[39mdebug([38;5;124m"[39m[38;5;124m[generate_object] generating value for[39m[38;5;124m"[39m, key)
[0;32m--> 274[0m obj[key] [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mgenerate_value[49m[43m([49m[43mschema[49m[43m,[49m[43m [49m[43mobj[49m[43m,[49m[43m [49m[43mkey[49m[43m)[49m
[1;32m 275[0m [38;5;28;01mreturn[39;00m obj
File [0;32m/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/prob_jsonformer/main.py:376[0m, in [0;36mJsonformer.generate_value[0;34m(self, schema, obj, key)[0m
[1;32m 374[0m [38;5;28;01melse[39;00m:
[1;32m 375[0m obj[38;5;241m.[39mappend(new_obj)
[0;32m--> 376[0m [38;5;28;01mreturn[39;00m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mgenerate_object[49m[43m([49m[43mschema[49m[43m[[49m[38;5;124;43m"[39;49m[38;5;124;43mproperties[39;49m[38;5;124;43m"[39;49m[43m][49m[43m,[49m[43m [49m[43mnew_obj[49m[43m)[49m
[1;32m 377[0m [38;5;28;01melif[39;00m schema_type [38;5;241m==[39m [38;5;124m"[39m[38;5;124mnull[39m[38;5;124m"[39m:
[1;32m 378[0m [38;5;28;01mreturn[39;00m [38;5;28;01mNone[39;00m
File [0;32m/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/prob_jsonformer/main.py:274[0m, in [0;36mJsonformer.generate_object[0;34m(self, properties, obj)[0m
[1;32m 272[0m [38;5;28;01mfor[39;00m key, schema [38;5;129;01min[39;00m properties[38;5;241m.[39mitems():
[1;32m 273[0m [38;5;28mself[39m[38;5;241m.[39mdebug([38;5;124m"[39m[38;5;124m[generate_object] generating value for[39m[38;5;124m"[39m, key)
[0;32m--> 274[0m obj[key] [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43mgenerate_value[49m[43m([49m[43mschema[49m[43m,[49m[43m [49m[43mobj[49m[43m,[49m[43m [49m[43mkey[49m[43m)[49m
[1;32m 275[0m [38;5;28;01mreturn[39;00m obj
File [0;32m/media/wassname/SGIronWolf/projects5/2024/prob_jsonformer/prob_jsonformer/main.py:351[0m, in [0;36mJsonformer.generate_value[0;34m(self, schema, obj, key)[0m
[1;32m 349[0m [38;5;28;01melse[39;00m:
[1;32m 350[0m obj[38;5;241m.[39mappend([38;5;28mself[39m[38;5;241m.[39mgeneration_marker)
[0;32m--> 351[0m [38;5;28;01mreturn[39;00m [38;5;28mself[39m[38;5;241m.[39mgenerate_p_enum([43mschema[49m[43m[[49m[38;5;124;43m"[39;49m[38;5;124;43mvalues[39;49m[38;5;124;43m"[39;49m[43m][49m, [38;5;28mround[39m[38;5;241m=[39mschema[38;5;241m.[39mget([38;5;124m"[39m[38;5;124mround[39m[38;5;124m"[39m, [38;5;241m3[39m))
[1;32m 352[0m [38;5;28;01melif[39;00m schema_type [38;5;241m==[39m [38;5;124m"[39m[38;5;124mp_integer[39m[38;5;124m"[39m:
[1;32m 353[0m [38;5;28;01mif[39;00m key:
[0;31mKeyError[0m: 'values'In [ ]:
car = {
"type": "object",
"properties": {
"make": {"type": "string"},
"model": {"type": "p_enum", "enum": ["Mazda", "Kea"]},
"new": {"type": "p_enum", "enum": ["true", "false"]},
"rating": {"type": "p_enum", "enum": ["1", "2", "3", "4"]},
"year": {"type": "number"},
"colors_available": {
"type": "array",
"items": {"type": "string"},
},
},
}
builder = Jsonformer(
model=model,
tokenizer=tokenizer,
json_schema=car,
prompt="generate an example car",
)
print("Generating...")
output = builder()
highlight_values(output)In [ ]:
complex_car = {
"type": "object",
"properties": {
"car": {
"type": "object",
"properties": {
"make": {"type": "string"},
"model": {"type": "string"},
"year": {"type": "number"},
"colors": {
"type": "p_enum",
"enum": ["red", "green", "blue", "black", "white"],
},
"as_new": {"type": "p_enum", "enum": ["true", "false"]},
"rating": {"type": "p_enum", "enum": ["1", "2", "3", "4"]},
"features": {
"type": "object",
"properties": {
"audio": {
"type": "object",
"properties": {
"brand": {"type": "string"},
"speakers": {"type": "number"},
"hasBluetooth": {"type": "boolean"},
},
},
"safety": {
"type": "object",
"properties": {
"airbags": {"type": "number"},
"parkingSensors": {"type": "boolean"},
"laneAssist": {"type": "boolean"},
},
},
"performance": {
"type": "object",
"properties": {
"engine": {"type": "string"},
"horsepower": {"type": "number"},
"topSpeed": {"type": "number"},
},
},
},
},
},
},
"owner": {
"type": "object",
"properties": {
"firstName": {"type": "string"},
"lastName": {"type": "string"},
"age": {"type": "number"},
},
},
},
}
builder = Jsonformer(
model=model,
tokenizer=tokenizer,
json_schema=complex_car,
prompt="generate an example Rolls Royce Phantom",
)
print("Generating...")
output = builder()
highlight_values(output)In [ ]:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "databricks/dolly-v2-3b"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)In [ ]:
from prob_jsonformer import Jsonformer
json_schema = {
"type": "object",
"properties": {
# we can return the probability of each choice, even if they are multiple tokens
"age_probs": {"type": "p_enum", "values": [str(s) for s in range(10, 20)]},
# we can return the probabilistic weighted mean of a range
"age_wmean": {"type": "p_integer", "minimum": 10, "maximum": 20},
# the prob of true and false
"is_student_probs": {"type": "p_enum", "values": ["true", "false"]},
"is_student": {"type": "boolean"},
# we've merged patches for enum, integer, null, union - currently mising from jsonformer
"name": {"type": "string", "maxLength": 4},
"age": {"type": "integer"},
"unit_time": {"type": "number"},
"courses": {"type": "array", "items": {"type": "string"}},
"trim": {"type": ["string", "null"]},
"color": {
"type": "enum",
"values": ["red", "green", "blue", "brown", "white", "black"],
},
},
}
prompt = "Generate a young person's information based on the following schema:"
jsonformer = Jsonformer(model, tokenizer, json_schema, prompt)
generated_data = jsonformer()
generated_data{'age_probs': [{'prob': 0.62353515625, 'choice': '10'},
{'prob': 0.349609375, 'choice': '12'},
{'prob': 0.01123809814453125, 'choice': '11'},
{'prob': 0.00760650634765625, 'choice': '16'},
{'prob': 0.0025482177734375, 'choice': '13'},
{'prob': 0.0025081634521484375, 'choice': '15'},
{'prob': 0.0018062591552734375, 'choice': '14'},
{'prob': 0.00104522705078125, 'choice': '18'},
{'prob': 0.00011551380157470703, 'choice': '17'},
{'prob': 5.042552947998047e-05, 'choice': '19'}],
'age_wmean': 15.544570922851562,
'is_student_probs': [{'prob': 0.962890625, 'choice': 'true'},
{'prob': 0.037322998046875, 'choice': 'false'}],
'is_student': False,
'name': 'John',
'age': 17,
'unit_time': 0.5,
'courses': ['C++'],
'trim': None,
'color': 'green'}In [ ]: