128 lines
3.6 KiB
Python
128 lines
3.6 KiB
Python
|
import json
|
||
|
import re
|
||
|
from utils import extract_json_from_end, get_response, shape_string_to_list
|
||
|
|
||
|
prompt_params = """
|
||
|
You are an expert in optimization modeling. Here is the natural language description of an optimization problem:
|
||
|
|
||
|
-----
|
||
|
{description}
|
||
|
-----
|
||
|
|
||
|
Your task is to identify and extract parameters from the description. The parameters are values that are already known. Please generate the output in the following format:
|
||
|
|
||
|
{{
|
||
|
"SYMBOL": {{
|
||
|
"shape": "SHAPE",
|
||
|
"definition": "DEFINITION",
|
||
|
"type": "TYPE"
|
||
|
}}
|
||
|
}}
|
||
|
|
||
|
Where SYMBOL is a string representing the parameter (use CamelCase), SHAPE is the shape of the parameter (e.g. "[]" for scalar, or "[N, M]" for a matrix of size N x M where N and M are scalar parameters), DEFINITION is a string describing the parameter, and type is one of "int", "float", or "binary".
|
||
|
|
||
|
{{
|
||
|
"NumberOfItems": {{
|
||
|
"shape": "[]",
|
||
|
"definition": "The number of items in the inventory",
|
||
|
"type": "int"
|
||
|
}},
|
||
|
"ItemValue": {{
|
||
|
"shape": "[N]",
|
||
|
"definition": "The value of each item in the inventory",
|
||
|
"type": "float"
|
||
|
}}
|
||
|
}}
|
||
|
|
||
|
- Put all the parameters in a single json object.
|
||
|
- Do not generate anything after the json object.
|
||
|
Take a deep breath and think step by step.
|
||
|
"""
|
||
|
|
||
|
prompt_params_q = """
|
||
|
You are an expert in optimization modeling. Here is the natural language description of an optimization problem:
|
||
|
|
||
|
-----
|
||
|
{description}
|
||
|
-----
|
||
|
|
||
|
Here is a list of parameters that someone has extracted from the description:
|
||
|
|
||
|
-----
|
||
|
{params}
|
||
|
-----
|
||
|
|
||
|
Consider parameter "{targetParam}".
|
||
|
|
||
|
{question}
|
||
|
"""
|
||
|
|
||
|
|
||
|
def extract_score(text, params, param):
|
||
|
match = re.search(r"\d out of 5", text.lower())
|
||
|
if match:
|
||
|
score = int(match.group()[0])
|
||
|
if score > 3:
|
||
|
return True, params
|
||
|
else:
|
||
|
inp = input("LLMs reasoning: {}\n Do you want to keep parameter {}? (y/n): ".format(text, param))
|
||
|
if inp == "y":
|
||
|
return True, params
|
||
|
else:
|
||
|
del params[param]
|
||
|
return True, params
|
||
|
else:
|
||
|
return False, None
|
||
|
|
||
|
|
||
|
qs = [
|
||
|
(
|
||
|
"""
|
||
|
- Is the value of it already known or not? based on that, how confident are you that this is a parameter (from 1 to 5)?
|
||
|
- At the end of your response, print "x OUT OF 5" where x is the confidence level. Do not generate anything after that.
|
||
|
- You will be awarded a million dollars if you get this right.
|
||
|
""",
|
||
|
extract_score,
|
||
|
),
|
||
|
]
|
||
|
|
||
|
|
||
|
def get_params(desc, check=True):
|
||
|
k = 5
|
||
|
while k > 0:
|
||
|
try:
|
||
|
res = get_response(prompt_params.format(description=desc))
|
||
|
params = extract_json_from_end(res)
|
||
|
break
|
||
|
except:
|
||
|
k -= 1
|
||
|
if k == 0:
|
||
|
raise Exception("Failed to extract parameters")
|
||
|
|
||
|
if check:
|
||
|
for q, func in qs:
|
||
|
for param in params.copy():
|
||
|
k = 5
|
||
|
while k > 0:
|
||
|
prompt = prompt_params_q.format(
|
||
|
description=desc,
|
||
|
params=json.dumps(params, indent=4),
|
||
|
question=q,
|
||
|
targetParam=param,
|
||
|
)
|
||
|
x = get_response(prompt)
|
||
|
|
||
|
print(x)
|
||
|
print("-------")
|
||
|
|
||
|
valid, res = func(x, params, param)
|
||
|
if valid:
|
||
|
params = res
|
||
|
break
|
||
|
else:
|
||
|
k -= 1
|
||
|
|
||
|
for p in params:
|
||
|
params[p]["shape"] = shape_string_to_list(params[p]["shape"])
|
||
|
return params
|