yaml_utils.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # !/usr/bin/ python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. @Project : lq-agent-api
  5. @File :yaml_utils.py
  6. @IDE :PyCharm
  7. @Author :
  8. @Date :2025/7/10 17:32
  9. '''
  10. import os
  11. import yaml
  12. from logger.loggering import server_logger
  13. import os
  14. from dotenv import load_dotenv
  15. from enums.common_enums import BusinessSceneEnum, ErrorCodeEnum
  16. from functools import wraps
  17. from logger.loggering import server_logger
  18. from utils.common import handler_err
  19. from base.config import config_handler
  20. # 获取当前文件的目录
  21. current_dir = os.path.dirname(__file__)
  22. # 构建到 .env 的相对路径
  23. conf_file_path = os.path.join(current_dir , '../', '.env')
  24. #server_logger.info(f"当前目录: {conf_file_path}")
  25. def get_fixed_problem_answer() -> dict:
  26. """
  27. 固定问题回答
  28. """
  29. # 构建文件路径 判断文件是否存在
  30. yaml_file = get_yaml_file_path("fixed_problem_answer.yaml")
  31. try:
  32. with open(yaml_file, 'r', encoding='utf-8') as f:
  33. prompt_config = yaml.safe_load(f)
  34. # 验证必需字段
  35. #validate_prompt_config(prompt_config, prompt_name)
  36. server_logger.info(f"成功加载[固定问题]回答系统配置.fixed_problem_answer: {prompt_config["fixed_problem_answer"]}")
  37. return prompt_config
  38. except Exception as e:
  39. server_logger.error(f"加载[固定问题]回答fixed_problem_answer文件失败: {yaml_file}, 错误: {str(e)}")
  40. raise
  41. def get_intent_prompt() -> dict:
  42. """
  43. 获取意图识别 系统提示语
  44. """
  45. # 构建文件路径 判断文件是否存在
  46. yaml_file = get_yaml_file_path("intent_prompt.yaml")
  47. try:
  48. with open(yaml_file, 'r', encoding='utf-8') as f:
  49. prompt_config = yaml.safe_load(f)
  50. # 验证必需字段
  51. #validate_prompt_config(prompt_config, prompt_name)
  52. server_logger.info(f"成功加载[意图识别]系统.system_prompt配置: {prompt_config["system_prompt"]}")
  53. server_logger.info(f"成功加载[意图识别]系统配置.examples: {prompt_config["intent_examples"]}")
  54. return prompt_config
  55. except Exception as e:
  56. server_logger.error(f"加载意图识别intent_prompt文件失败: {yaml_file}, 错误: {str(e)}")
  57. raise
  58. def get_fixed_question_intent_prompt() -> dict:
  59. """
  60. 获取 固定问题意图识别 系统提示语
  61. """
  62. # 构建文件路径 判断文件是否存在
  63. yaml_file = get_yaml_file_path("fixed_intent_prompt.yaml")
  64. try:
  65. with open(yaml_file, 'r', encoding='utf-8') as f:
  66. prompt_config = yaml.safe_load(f)
  67. # 验证必需字段
  68. #validate_prompt_config(prompt_config, prompt_name)
  69. server_logger.info(f"成功加载[固定问题意图识别]系统.system_prompt配置: {prompt_config["system_prompt"]}")
  70. server_logger.info(f"成功加载[固定问题意图识别]系统配置.examples: {prompt_config["fixed_problem_answer"]}")
  71. return prompt_config
  72. except Exception as e:
  73. server_logger.error(f"加载意图识别fixed_intent_prompt文件失败: {yaml_file}, 错误: {str(e)}")
  74. raise
  75. def get_system_prompt() -> dict:
  76. """
  77. 获取系统提示语
  78. """
  79. # 构建文件路径 判断文件是否存在
  80. yaml_file = get_yaml_file_path("system_prompt.yaml")
  81. try:
  82. with open(yaml_file, 'r', encoding='utf-8') as f:
  83. prompt_config = yaml.safe_load(f)
  84. # 验证必需字段
  85. #validate_prompt_config(prompt_config, prompt_name)
  86. server_logger.info(f"成功加载系统system_prompt配置: {prompt_config["system_prompt"]}")
  87. return prompt_config
  88. except Exception as e:
  89. server_logger.error(f"加载system_prompt文件失败: {yaml_file}, 错误: {str(e)}")
  90. raise
  91. def get_business_scene_prompt(trace_id, business_scene) -> tuple[BusinessSceneEnum , dict]:
  92. """
  93. 获取业务场景的提示语
  94. """
  95. # 默认公共查询提示语
  96. business_scene_enum = BusinessSceneEnum.COMMON_MODEL_QUERY
  97. prompt_file = business_scene_enum.prompt_file
  98. if not business_scene is None:
  99. # 2025-07-25 修改 如果未找到 返回默认值通用场景
  100. business_scene_enum = BusinessSceneEnum.get_item_by_code_def_val(business_scene , BusinessSceneEnum.CATTLE_FARM_COMMMON)
  101. if not business_scene_enum:
  102. raise ValueError("未找到枚举值")
  103. if business_scene_enum.prompt_file is None:
  104. raise ValueError("业务场景不存在")
  105. prompt_file = business_scene_enum.prompt_file
  106. # 构建文件路径 判断文件是否存在
  107. yaml_file = get_yaml_file_path(prompt_file)
  108. try:
  109. with open(yaml_file, 'r', encoding='utf-8') as f:
  110. prompt_config = yaml.safe_load(f)
  111. server_logger.info(trace_id=trace_id , msg=f"business_scene_enum:{business_scene_enum.code} Get prompt successfully.")
  112. return business_scene_enum , prompt_config
  113. except Exception as e:
  114. handler_err(server_logger, e, trace_id=trace_id, err_name="get_business_scene_prompt")
  115. server_logger.error(trace_id=trace_id , msg=f"获取业务场景任务提示语失败: {e}")
  116. raise e
  117. def get_yaml_file_path(file_name: str) -> str:
  118. """
  119. 获取yaml文件路径
  120. :param file_name:
  121. :return:
  122. """
  123. yaml_file = os.path.join(current_dir , '../', 'config', 'prompt' , file_name)
  124. if not os.path.exists(yaml_file):
  125. raise FileNotFoundError(f"Prompt文件不存在: {file_name}")
  126. return yaml_file
  127. #获取系统提示语
  128. system_prompt_config = get_system_prompt()