strategy_parse.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: yq
  4. @time: 2024/12/18
  5. @desc: 策略流节点解析
  6. """
  7. import json
  8. import re
  9. import time
  10. from tqdm import tqdm
  11. import pandas as pd
  12. from PIL import Image
  13. from openpyxl import load_workbook
  14. from commom import f_get_save_path, call_llm, f_file_upload, GeneralException
  15. from enums import ResultCodesEnum
  16. from prompt import f_get_prompt_parse_node, f_get_prompt_parse_flow
  17. def _f_parse_flow(ws, node_list: list):
  18. image = ws._images[0]
  19. img = Image.open(image.ref).convert("RGB")
  20. save_path = f_get_save_path("流程图.png")
  21. img.save(save_path)
  22. time.sleep(1)
  23. file_id = f_file_upload(save_path)
  24. prompt = f_get_prompt_parse_flow(node_list)
  25. print(prompt)
  26. prompt = [
  27. {
  28. "type": "text",
  29. "text": prompt
  30. },
  31. {
  32. "type": "image",
  33. "file_id": file_id
  34. }
  35. ]
  36. prompt = json.dumps(prompt, ensure_ascii=False)
  37. llm_answer = call_llm(prompt, "object_string")
  38. print(llm_answer)
  39. code = re.findall(r"```python\n(.*)\n```", llm_answer, flags=re.DOTALL)[0]
  40. save_path = f_get_save_path("flow.py")
  41. with open(save_path, mode="w", encoding="utf8") as f:
  42. f.write(code)
  43. save_path = f_get_save_path("__init__.py")
  44. with open(save_path, mode="w", encoding="utf8") as f:
  45. f.write("")
  46. def _f_parse_node(df: pd.DataFrame, node_name):
  47. rules = ""
  48. for idx, row in df.iterrows():
  49. var_name = row["变量"]
  50. var_name = var_name.replace("\n", " ")
  51. rule_content = row["逻辑"]
  52. rule_out = row["输出"]
  53. rules = f"{rules}规则{idx + 1}: 变量:{var_name} 逻辑:{rule_content} 输出:{rule_out}\n"
  54. prompt = f_get_prompt_parse_node(node_name, rules)
  55. print(prompt)
  56. llm_answer = call_llm(prompt)
  57. code = re.findall(r"```python\n(.*)\n```", llm_answer, flags=re.DOTALL)[0]
  58. func_name = re.findall(r"def (.*)\(data", code)[0]
  59. save_path = f_get_save_path(f"{func_name}.py")
  60. print(code)
  61. with open(save_path, mode="w", encoding="utf8") as f:
  62. f.write(code)
  63. return func_name, code
  64. def f_parse_strategy(file_path):
  65. wb = load_workbook(file_path)
  66. excel = pd.ExcelFile(file_path)
  67. sheet_names = excel.sheet_names
  68. if "流程图" not in sheet_names:
  69. GeneralException(ResultCodesEnum.NOT_FOUND, message=f"sheet【流程图】不存在")
  70. node_list = []
  71. for node_name in tqdm(sheet_names):
  72. if node_name == "流程图":
  73. continue
  74. df = excel.parse(sheet_name=node_name)
  75. func_name, code = _f_parse_node(df, node_name)
  76. node_list.append((node_name, func_name, code))
  77. _f_parse_flow(wb["流程图"], node_list)
  78. wb.close()
  79. excel.close()
  80. if __name__ == "__main__":
  81. f_parse_strategy("./cache/策略节点配置demo.xlsx")