| """ |
| Simple example of a code evaluator that executes the generated code and checks if it produces the |
| correct output. Very unsafe, use with caution. Only for demonstration purposes. |
| """ |
|
|
| from lynxkite_core import ops |
| from lynxkite_graph_analytics.core import ( |
| Bundle, |
| ENV, |
| ) |
| from lynxkite_llm_training.llm_evaluation import LLMEvaluator |
|
|
| from tqdm import tqdm |
| import pandas as pd |
|
|
| op = ops.op_registration(ENV, "LLM Training", "Evaluation") |
|
|
|
|
| class CodeEvaluator(LLMEvaluator): |
| def __init__(self): |
| pass |
|
|
| def evaluation( |
| self, |
| prompts: list[str], |
| completions: list[str] | list[list[dict]], |
| ground_truths: list[dict], |
| dataset: list[dict] | None = None, |
| path: str = "", |
| ) -> dict[str, float] | pd.DataFrame: |
| assert dataset is not None, "dataset is required for CodeEvaluator" |
| results = [] |
| for prompt, completion, ground_truth, data in tqdm( |
| zip(prompts, completions, ground_truths, dataset), total=len(prompts) |
| ): |
| code = completion |
| code_env = {} |
| is_correct = False |
| if ground_truth == code: |
| is_correct = True |
| continue |
|
|
| exec(ground_truth, code_env) |
| try: |
| |
| if "test_execution" in code_env: |
| code_env["test_execution"](code) |
| is_correct = True |
| else: |
| is_correct = False |
| except Exception as e: |
| is_correct = False |
| exception_message = str(e) |
| finally: |
| results.append( |
| { |
| "prompt": prompt, |
| "completion": completion, |
| "reference": data["reference_code"], |
| "is_correct": is_correct, |
| "exception": exception_message if not is_correct else None, |
| } |
| ) |
|
|
| results = pd.DataFrame(results) |
| print(f"Accuracy: {results.is_correct.mean()}") |
| return results |
|
|
|
|
| @op("Define code evaluator") |
| def define_code_evaluator_op( |
| bundle: Bundle, |
| *, |
| save_as: str = "code_evaluator", |
| ) -> Bundle: |
| b = bundle.copy() |
| evaluator = CodeEvaluator() |
| b.other[save_as] = evaluator |
| return b |
|
|
|
|
| @op("Filter out data") |
| def filter_out_data_op( |
| bundle: Bundle, |
| *, |
| dataset_name: str = "training_dataset", |
| save_as: str = "filtered_dataset", |
| ) -> Bundle: |
| b = bundle.copy() |
| dataset_df: pd.DataFrame = b.dfs[dataset_name] |
| |
| filtered_df = dataset_df[ |
| dataset_df["metadata"].apply(lambda x: x.get("library") != "Tensorflow") |
| ] |
| b.dfs[save_as] = filtered_df.reset_index(drop=True) |
|
|
| return b |
|
|