building-agents/llma/parameters.py

128 lines
3.6 KiB
Python
Raw Permalink Normal View History

2024-11-22 10:03:31 +08:00
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