|
import os |
|
from pydantic import BaseModel |
|
from openai import OpenAI |
|
|
|
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) |
|
|
|
class EvaluationResult(BaseModel): |
|
result: str |
|
feedback: str |
|
|
|
def router_llm(user_input): |
|
messages = [ |
|
{"role": "system", "content": ( |
|
"You are a router. Decide which task the following input is for:\n" |
|
"- Math: If it's a math question.\n" |
|
"- Translate: If it's a translation request.\n" |
|
"- Summarize: If it's a request to summarize text.\n" |
|
"Reply with only one word: Math, Translate, or Summarize." |
|
)}, |
|
{"role": "user", "content": user_input} |
|
] |
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=messages, |
|
temperature=0 |
|
) |
|
return response.choices[0].message.content.strip().lower() |
|
|
|
def math_llm(user_input): |
|
messages = [ |
|
{"role": "system", "content": "You are a helpful math assistant."}, |
|
{"role": "user", "content": f"Solve the following math problem: {user_input}"} |
|
] |
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=messages, |
|
temperature=0 |
|
) |
|
return response.choices[0].message.content.strip() |
|
|
|
def translate_llm(user_input): |
|
messages = [ |
|
{"role": "system", "content": "You are a helpful translator from English to French."}, |
|
{"role": "user", "content": f"Translate this to French: {user_input}"} |
|
] |
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=messages, |
|
temperature=0 |
|
) |
|
return response.choices[0].message.content.strip() |
|
|
|
def summarize_llm(user_input): |
|
messages = [ |
|
{"role": "system", "content": "You are a helpful summarizer."}, |
|
{"role": "user", "content": f"Summarize this: {user_input}"} |
|
] |
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=messages, |
|
temperature=0 |
|
) |
|
return response.choices[0].message.content.strip() |
|
|
|
def evaluator_llm(task, user_input, solution): |
|
""" |
|
Evaluates the solution. Returns (result: bool, feedback: str) |
|
""" |
|
messages = [ |
|
{"role": "system", "content": ( |
|
f"You are an expert evaluator for the task: {task}.\n" |
|
"Given the user's request and the solution, decide if the solution is correct and helpful.\n" |
|
"Please evaluate the response, replying with whether it is right or wrong and your feedback for improvement." |
|
)}, |
|
{"role": "user", "content": f"User request: {user_input}\nSolution: {solution}"} |
|
] |
|
response = client.beta.chat.completions.parse( |
|
model="gpt-4o-2024-08-06", |
|
messages=messages, |
|
response_format=EvaluationResult |
|
) |
|
return response.choices[0].message.parsed |
|
|
|
def generate_solution(task, user_input, feedback=None): |
|
""" |
|
Calls the appropriate generator LLM, optionally with feedback. |
|
""" |
|
if feedback: |
|
user_input = f"{user_input}\n[Evaluator feedback: {feedback}]" |
|
if "math" in task: |
|
return math_llm(user_input) |
|
elif "translate" in task: |
|
return translate_llm(user_input) |
|
elif "summarize" in task: |
|
return summarize_llm(user_input) |
|
else: |
|
return "Sorry, I couldn't determine the task." |
|
|
|
def main(): |
|
user_input = input("Enter your request: ") |
|
task = router_llm(user_input) |
|
max_attempts = 3 |
|
feedback = None |
|
|
|
for attempt in range(max_attempts): |
|
solution = generate_solution(task, user_input, feedback) |
|
response = evaluator_llm(task, user_input, solution) |
|
if response.result.lower() == "right": |
|
print(f"Result (accepted on attempt {attempt+1}):\n{solution}") |
|
break |
|
else: |
|
print(f"Attempt {attempt+1} rejected. Feedback: {response.feedback}") |
|
else: |
|
print("Failed to generate an accepted solution after several attempts.") |
|
print(f"Last attempt:\n{solution}") |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|