199 lines
23 KiB
JSON
199 lines
23 KiB
JSON
{
|
||
"file_path": "tweet/content_judger.py",
|
||
"file_size": 8024,
|
||
"line_count": 211,
|
||
"functions": [
|
||
{
|
||
"name": "__init__",
|
||
"line_start": 23,
|
||
"line_end": 37,
|
||
"args": [
|
||
{
|
||
"name": "self"
|
||
},
|
||
{
|
||
"name": "ai_agent",
|
||
"type_hint": "AIAgent"
|
||
},
|
||
{
|
||
"name": "config_manager",
|
||
"type_hint": "ConfigManager"
|
||
},
|
||
{
|
||
"name": "output_manager"
|
||
}
|
||
],
|
||
"return_type": null,
|
||
"docstring": "初始化内容审核器\n\nArgs:\n ai_agent: AIAgent实例\n config_manager: 配置管理器\n output_manager: 输出管理器,用于保存提示词和响应",
|
||
"is_async": false,
|
||
"decorators": [],
|
||
"code": " def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager=None):\n \"\"\"\n 初始化内容审核器\n\n Args:\n ai_agent: AIAgent实例\n config_manager: 配置管理器\n output_manager: 输出管理器,用于保存提示词和响应\n \"\"\"\n self.ai_agent = ai_agent\n self.config_manager = config_manager\n self.topic_config = config_manager.get_config('topic_gen', GenerateTopicConfig)\n self.content_config = config_manager.get_config('content_gen', GenerateContentConfig)\n self.prompt_builder = JudgerPromptBuilder(config_manager)\n self.output_manager = output_manager",
|
||
"code_hash": "7452a534246bbda133b4ac1ed07ff7e0"
|
||
}
|
||
],
|
||
"classes": [
|
||
{
|
||
"name": "ContentJudger",
|
||
"line_start": 20,
|
||
"line_end": 212,
|
||
"bases": [],
|
||
"methods": [
|
||
{
|
||
"name": "__init__",
|
||
"line_start": 23,
|
||
"line_end": 37,
|
||
"args": [
|
||
{
|
||
"name": "self"
|
||
},
|
||
{
|
||
"name": "ai_agent",
|
||
"type_hint": "AIAgent"
|
||
},
|
||
{
|
||
"name": "config_manager",
|
||
"type_hint": "ConfigManager"
|
||
},
|
||
{
|
||
"name": "output_manager"
|
||
}
|
||
],
|
||
"return_type": null,
|
||
"docstring": "初始化内容审核器\n\nArgs:\n ai_agent: AIAgent实例\n config_manager: 配置管理器\n output_manager: 输出管理器,用于保存提示词和响应",
|
||
"is_async": false,
|
||
"decorators": [],
|
||
"code": " def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager=None):\n \"\"\"\n 初始化内容审核器\n\n Args:\n ai_agent: AIAgent实例\n config_manager: 配置管理器\n output_manager: 输出管理器,用于保存提示词和响应\n \"\"\"\n self.ai_agent = ai_agent\n self.config_manager = config_manager\n self.topic_config = config_manager.get_config('topic_gen', GenerateTopicConfig)\n self.content_config = config_manager.get_config('content_gen', GenerateContentConfig)\n self.prompt_builder = JudgerPromptBuilder(config_manager)\n self.output_manager = output_manager",
|
||
"code_hash": "7452a534246bbda133b4ac1ed07ff7e0"
|
||
},
|
||
{
|
||
"name": "judge_content",
|
||
"line_start": 39,
|
||
"line_end": 130,
|
||
"args": [
|
||
{
|
||
"name": "self"
|
||
},
|
||
{
|
||
"name": "generated_content",
|
||
"type_hint": "Union[str, Dict[str, Any]]"
|
||
},
|
||
{
|
||
"name": "topic",
|
||
"type_hint": "Dict[str, Any]"
|
||
}
|
||
],
|
||
"return_type": "Dict[str, Any]",
|
||
"docstring": "调用AI审核生成的内容\n\nArgs:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n\nReturns:\n 一个包含审核结果的字典",
|
||
"is_async": true,
|
||
"decorators": [],
|
||
"code": " async def judge_content(self, generated_content: Union[str, Dict[str, Any]], topic: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 调用AI审核生成的内容\n\n Args:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n\n Returns:\n 一个包含审核结果的字典\n \"\"\"\n logger.info(\"开始审核生成的内容...\")\n \n # 获取主题索引,用于保存文件\n topic_index = topic.get('index', 'unknown')\n topic_dir = f\"topic_{topic_index}\"\n \n # 从原始内容中提取tag\n original_tag = []\n original_content = process_llm_json_text(generated_content)\n if original_content and isinstance(original_content, dict) and \"tag\" in original_content:\n original_tag = original_content.get(\"tag\", [])\n logger.info(f\"从原始内容中提取到标签: {original_tag}\")\n else:\n logger.warning(\"从原始内容提取标签失败\")\n \n # 将字典转换为JSON字符串,以便在提示中使用\n if isinstance(generated_content, dict):\n generated_content_str = json.dumps(generated_content, ensure_ascii=False, indent=2)\n else:\n generated_content_str = str(generated_content)\n \n # 1. 构建提示\n system_prompt = self.prompt_builder.get_system_prompt()\n user_prompt = self.prompt_builder.build_user_prompt(\n generated_content=generated_content_str,\n topic=topic\n )\n \n # 保存提示词\n if self.output_manager:\n self.output_manager.save_text(system_prompt, f\"{topic_dir}/judger_system_prompt.txt\")\n self.output_manager.save_text(user_prompt, f\"{topic_dir}/judger_user_prompt.txt\")\n\n # 获取模型参数\n model_params = {}\n if hasattr(self.content_config, 'judger_model') and isinstance(self.content_config.judger_model, dict):\n model_params = {\n 'temperature': self.content_config.judger_model.get('temperature'),\n 'top_p': self.content_config.judger_model.get('top_p'),\n 'presence_penalty': self.content_config.judger_model.get('presence_penalty')\n }\n # 移除None值\n model_params = {k: v for k, v in model_params.items() if v is not None}\n\n # 2. 调用AI进行审核\n try:\n raw_result, _, _, _ = await self.ai_agent.generate_text(\n system_prompt=system_prompt,\n user_prompt=user_prompt,\n use_stream=True,\n stage=\"内容审核\",\n **model_params\n )\n \n # 保存原始响应\n if self.output_manager:\n self.output_manager.save_text(raw_result, f\"{topic_dir}/judger_raw_response.txt\")\n \n except Exception as e:\n logger.critical(f\"内容审核时AI调用失败: {e}\", exc_info=True)\n return {\"judge_success\": False, \"error\": str(e)}\n\n # 3. 解析结果\n judged_data = process_llm_json_text(raw_result)\n if judged_data and isinstance(judged_data, dict) and \"title\" in judged_data and \"content\" in judged_data:\n judged_data[\"judge_success\"] = True\n \n # 直接使用原始内容中的标签\n if original_tag:\n judged_data[\"tag\"] = original_tag\n # 如果原始内容中没有标签,则使用默认标签\n logger.info(f\"内容审核成功完成,使用标签: {judged_data.get('tag', [])}\")\n \n # 保存审核后的内容\n if self.output_manager:\n self.output_manager.save_json(judged_data, f\"{topic_dir}/article_judged.json\")\n \n return judged_data\n else:\n logger.warning(f\"审核响应JSON格式不正确或缺少键\")\n return {\"judge_success\": False, \"error\": \"Invalid JSON response\", \"raw_response\": raw_result} ",
|
||
"code_hash": "29539b6c961e1d7208cde94f4d8b1894"
|
||
},
|
||
{
|
||
"name": "judge_content_with_prompt",
|
||
"line_start": 132,
|
||
"line_end": 212,
|
||
"args": [
|
||
{
|
||
"name": "self"
|
||
},
|
||
{
|
||
"name": "generated_content",
|
||
"type_hint": "Union[str, Dict[str, Any]]"
|
||
},
|
||
{
|
||
"name": "topic",
|
||
"type_hint": "Dict[str, Any]"
|
||
},
|
||
{
|
||
"name": "system_prompt",
|
||
"type_hint": "str"
|
||
},
|
||
{
|
||
"name": "user_prompt",
|
||
"type_hint": "str"
|
||
}
|
||
],
|
||
"return_type": "Dict[str, Any]",
|
||
"docstring": "使用预构建的提示词审核生成的内容\n\nArgs:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n system_prompt: 系统提示词\n user_prompt: 用户提示词\n\nReturns:\n 一个包含审核结果的字典",
|
||
"is_async": true,
|
||
"decorators": [],
|
||
"code": " async def judge_content_with_prompt(self, generated_content: Union[str, Dict[str, Any]], topic: Dict[str, Any], system_prompt: str, user_prompt: str) -> Dict[str, Any]:\n \"\"\"\n 使用预构建的提示词审核生成的内容\n\n Args:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n system_prompt: 系统提示词\n user_prompt: 用户提示词\n\n Returns:\n 一个包含审核结果的字典\n \"\"\"\n logger.info(\"开始使用预构建提示词审核生成的内容...\")\n \n # 获取主题索引,用于保存文件\n topic_index = topic.get('index', 'unknown')\n topic_dir = f\"topic_{topic_index}\"\n \n # 从原始内容中提取tag\n original_tag = []\n original_content = process_llm_json_text(generated_content)\n if original_content and isinstance(original_content, dict) and \"tag\" in original_content:\n original_tag = original_content.get(\"tag\", [])\n logger.info(f\"从原始内容中提取到标签: {original_tag}\")\n else:\n logger.warning(\"从原始内容提取标签失败\")\n \n # 保存提示词\n if self.output_manager:\n self.output_manager.save_text(system_prompt, f\"{topic_dir}/judger_system_prompt.txt\")\n self.output_manager.save_text(user_prompt, f\"{topic_dir}/judger_user_prompt.txt\")\n\n # 获取模型参数\n model_params = {}\n if hasattr(self.content_config, 'judger_model') and isinstance(self.content_config.judger_model, dict):\n model_params = {\n 'temperature': self.content_config.judger_model.get('temperature'),\n 'top_p': self.content_config.judger_model.get('top_p'),\n 'presence_penalty': self.content_config.judger_model.get('presence_penalty')\n }\n # 移除None值\n model_params = {k: v for k, v in model_params.items() if v is not None}\n\n # 2. 调用AI进行审核\n try:\n raw_result, _, _, _ = await self.ai_agent.generate_text(\n system_prompt=system_prompt,\n user_prompt=user_prompt,\n use_stream=True,\n stage=\"内容审核\",\n **model_params\n )\n \n # 保存原始响应\n if self.output_manager:\n self.output_manager.save_text(raw_result, f\"{topic_dir}/judger_raw_response.txt\")\n \n except Exception as e:\n logger.critical(f\"内容审核时AI调用失败: {e}\", exc_info=True)\n return {\"judge_success\": False, \"error\": str(e)}\n\n # 3. 解析结果\n judged_data = process_llm_json_text(raw_result)\n if judged_data and isinstance(judged_data, dict) and \"title\" in judged_data and \"content\" in judged_data:\n judged_data[\"judge_success\"] = True\n judged_data.pop(\"analysis\")\n # 直接使用原始内容中的标签\n if original_tag:\n judged_data[\"tag\"] = original_tag\n # 如果原始内容中没有标签,则使用默认标签\n logger.info(f\"内容审核成功完成,使用标签: {judged_data.get('tag', [])}\")\n \n # 保存审核后的内容\n if self.output_manager:\n self.output_manager.save_json(judged_data, f\"{topic_dir}/article_judged.json\")\n \n return judged_data\n else:\n logger.warning(f\"审核响应JSON格式不正确或缺少键\")\n return {\"judge_success\": False, \"error\": \"Invalid JSON response\", \"raw_response\": raw_result} ",
|
||
"code_hash": "84d9167a9c2859ce737caa26341c85eb"
|
||
}
|
||
],
|
||
"docstring": "内容审核类,使用AI评估和修正内容",
|
||
"decorators": [],
|
||
"code": "class ContentJudger:\n \"\"\"内容审核类,使用AI评估和修正内容\"\"\"\n\n def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager=None):\n \"\"\"\n 初始化内容审核器\n\n Args:\n ai_agent: AIAgent实例\n config_manager: 配置管理器\n output_manager: 输出管理器,用于保存提示词和响应\n \"\"\"\n self.ai_agent = ai_agent\n self.config_manager = config_manager\n self.topic_config = config_manager.get_config('topic_gen', GenerateTopicConfig)\n self.content_config = config_manager.get_config('content_gen', GenerateContentConfig)\n self.prompt_builder = JudgerPromptBuilder(config_manager)\n self.output_manager = output_manager\n\n async def judge_content(self, generated_content: Union[str, Dict[str, Any]], topic: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 调用AI审核生成的内容\n\n Args:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n\n Returns:\n 一个包含审核结果的字典\n \"\"\"\n logger.info(\"开始审核生成的内容...\")\n \n # 获取主题索引,用于保存文件\n topic_index = topic.get('index', 'unknown')\n topic_dir = f\"topic_{topic_index}\"\n \n # 从原始内容中提取tag\n original_tag = []\n original_content = process_llm_json_text(generated_content)\n if original_content and isinstance(original_content, dict) and \"tag\" in original_content:\n original_tag = original_content.get(\"tag\", [])\n logger.info(f\"从原始内容中提取到标签: {original_tag}\")\n else:\n logger.warning(\"从原始内容提取标签失败\")\n \n # 将字典转换为JSON字符串,以便在提示中使用\n if isinstance(generated_content, dict):\n generated_content_str = json.dumps(generated_content, ensure_ascii=False, indent=2)\n else:\n generated_content_str = str(generated_content)\n \n # 1. 构建提示\n system_prompt = self.prompt_builder.get_system_prompt()\n user_prompt = self.prompt_builder.build_user_prompt(\n generated_content=generated_content_str,\n topic=topic\n )\n \n # 保存提示词\n if self.output_manager:\n self.output_manager.save_text(system_prompt, f\"{topic_dir}/judger_system_prompt.txt\")\n self.output_manager.save_text(user_prompt, f\"{topic_dir}/judger_user_prompt.txt\")\n\n # 获取模型参数\n model_params = {}\n if hasattr(self.content_config, 'judger_model') and isinstance(self.content_config.judger_model, dict):\n model_params = {\n 'temperature': self.content_config.judger_model.get('temperature'),\n 'top_p': self.content_config.judger_model.get('top_p'),\n 'presence_penalty': self.content_config.judger_model.get('presence_penalty')\n }\n # 移除None值\n model_params = {k: v for k, v in model_params.items() if v is not None}\n\n # 2. 调用AI进行审核\n try:\n raw_result, _, _, _ = await self.ai_agent.generate_text(\n system_prompt=system_prompt,\n user_prompt=user_prompt,\n use_stream=True,\n stage=\"内容审核\",\n **model_params\n )\n \n # 保存原始响应\n if self.output_manager:\n self.output_manager.save_text(raw_result, f\"{topic_dir}/judger_raw_response.txt\")\n \n except Exception as e:\n logger.critical(f\"内容审核时AI调用失败: {e}\", exc_info=True)\n return {\"judge_success\": False, \"error\": str(e)}\n\n # 3. 解析结果\n judged_data = process_llm_json_text(raw_result)\n if judged_data and isinstance(judged_data, dict) and \"title\" in judged_data and \"content\" in judged_data:\n judged_data[\"judge_success\"] = True\n \n # 直接使用原始内容中的标签\n if original_tag:\n judged_data[\"tag\"] = original_tag\n # 如果原始内容中没有标签,则使用默认标签\n logger.info(f\"内容审核成功完成,使用标签: {judged_data.get('tag', [])}\")\n \n # 保存审核后的内容\n if self.output_manager:\n self.output_manager.save_json(judged_data, f\"{topic_dir}/article_judged.json\")\n \n return judged_data\n else:\n logger.warning(f\"审核响应JSON格式不正确或缺少键\")\n return {\"judge_success\": False, \"error\": \"Invalid JSON response\", \"raw_response\": raw_result} \n\n async def judge_content_with_prompt(self, generated_content: Union[str, Dict[str, Any]], topic: Dict[str, Any], system_prompt: str, user_prompt: str) -> Dict[str, Any]:\n \"\"\"\n 使用预构建的提示词审核生成的内容\n\n Args:\n generated_content: 已生成的原始内容(JSON字符串或字典对象)\n topic: 与内容相关的原始选题字典\n system_prompt: 系统提示词\n user_prompt: 用户提示词\n\n Returns:\n 一个包含审核结果的字典\n \"\"\"\n logger.info(\"开始使用预构建提示词审核生成的内容...\")\n \n # 获取主题索引,用于保存文件\n topic_index = topic.get('index', 'unknown')\n topic_dir = f\"topic_{topic_index}\"\n \n # 从原始内容中提取tag\n original_tag = []\n original_content = process_llm_json_text(generated_content)\n if original_content and isinstance(original_content, dict) and \"tag\" in original_content:\n original_tag = original_content.get(\"tag\", [])\n logger.info(f\"从原始内容中提取到标签: {original_tag}\")\n else:\n logger.warning(\"从原始内容提取标签失败\")\n \n # 保存提示词\n if self.output_manager:\n self.output_manager.save_text(system_prompt, f\"{topic_dir}/judger_system_prompt.txt\")\n self.output_manager.save_text(user_prompt, f\"{topic_dir}/judger_user_prompt.txt\")\n\n # 获取模型参数\n model_params = {}\n if hasattr(self.content_config, 'judger_model') and isinstance(self.content_config.judger_model, dict):\n model_params = {\n 'temperature': self.content_config.judger_model.get('temperature'),\n 'top_p': self.content_config.judger_model.get('top_p'),\n 'presence_penalty': self.content_config.judger_model.get('presence_penalty')\n }\n # 移除None值\n model_params = {k: v for k, v in model_params.items() if v is not None}\n\n # 2. 调用AI进行审核\n try:\n raw_result, _, _, _ = await self.ai_agent.generate_text(\n system_prompt=system_prompt,\n user_prompt=user_prompt,\n use_stream=True,\n stage=\"内容审核\",\n **model_params\n )\n \n # 保存原始响应\n if self.output_manager:\n self.output_manager.save_text(raw_result, f\"{topic_dir}/judger_raw_response.txt\")\n \n except Exception as e:\n logger.critical(f\"内容审核时AI调用失败: {e}\", exc_info=True)\n return {\"judge_success\": False, \"error\": str(e)}\n\n # 3. 解析结果\n judged_data = process_llm_json_text(raw_result)\n if judged_data and isinstance(judged_data, dict) and \"title\" in judged_data and \"content\" in judged_data:\n judged_data[\"judge_success\"] = True\n judged_data.pop(\"analysis\")\n # 直接使用原始内容中的标签\n if original_tag:\n judged_data[\"tag\"] = original_tag\n # 如果原始内容中没有标签,则使用默认标签\n logger.info(f\"内容审核成功完成,使用标签: {judged_data.get('tag', [])}\")\n \n # 保存审核后的内容\n if self.output_manager:\n self.output_manager.save_json(judged_data, f\"{topic_dir}/article_judged.json\")\n \n return judged_data\n else:\n logger.warning(f\"审核响应JSON格式不正确或缺少键\")\n return {\"judge_success\": False, \"error\": \"Invalid JSON response\", \"raw_response\": raw_result} ",
|
||
"code_hash": "02df686b3c132a67902f8ad4907e307d"
|
||
}
|
||
],
|
||
"imports": [
|
||
{
|
||
"type": "import",
|
||
"modules": [
|
||
"logging"
|
||
],
|
||
"aliases": []
|
||
},
|
||
{
|
||
"type": "import",
|
||
"modules": [
|
||
"json"
|
||
],
|
||
"aliases": []
|
||
},
|
||
{
|
||
"type": "from_import",
|
||
"module": "typing",
|
||
"names": [
|
||
"Dict",
|
||
"Any",
|
||
"Union"
|
||
],
|
||
"aliases": [],
|
||
"level": 0
|
||
},
|
||
{
|
||
"type": "from_import",
|
||
"module": "core.ai",
|
||
"names": [
|
||
"AIAgent"
|
||
],
|
||
"aliases": [],
|
||
"level": 0
|
||
},
|
||
{
|
||
"type": "from_import",
|
||
"module": "core.config",
|
||
"names": [
|
||
"ConfigManager",
|
||
"GenerateTopicConfig",
|
||
"GenerateContentConfig"
|
||
],
|
||
"aliases": [],
|
||
"level": 0
|
||
},
|
||
{
|
||
"type": "from_import",
|
||
"module": "utils.prompts",
|
||
"names": [
|
||
"JudgerPromptBuilder"
|
||
],
|
||
"aliases": [],
|
||
"level": 0
|
||
},
|
||
{
|
||
"type": "from_import",
|
||
"module": "utils.file_io",
|
||
"names": [
|
||
"process_llm_json_text"
|
||
],
|
||
"aliases": [],
|
||
"level": 0
|
||
}
|
||
],
|
||
"constants": [],
|
||
"docstring": "内容审核模块",
|
||
"content_hash": "dc0c5f1d7cf5b54904429cfee768d48f"
|
||
} |