74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
|
|||
|
|
"""
|
|||
|
|
内容审核模块
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import logging
|
|||
|
|
import json
|
|||
|
|
from json_repair import loads as json_repair_loads
|
|||
|
|
from typing import Dict, Any
|
|||
|
|
|
|||
|
|
from core.ai import AIAgent
|
|||
|
|
# We'll need a specific config for the judger
|
|||
|
|
# from core.config import ContentJudgerConfig
|
|||
|
|
from utils.prompts import JudgerPromptBuilder
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ContentJudger:
|
|||
|
|
"""内容审核类,使用AI评估和修正内容"""
|
|||
|
|
|
|||
|
|
def __init__(self, ai_agent: AIAgent, system_prompt_path: str):
|
|||
|
|
"""
|
|||
|
|
初始化内容审核器
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
ai_agent: AIAgent实例
|
|||
|
|
system_prompt_path: 审核系统提示的文件路径
|
|||
|
|
"""
|
|||
|
|
self.ai_agent = ai_agent
|
|||
|
|
self.prompt_builder = JudgerPromptBuilder(system_prompt_path)
|
|||
|
|
|
|||
|
|
def judge(self, product_info: str, generated_content: str) -> Dict[str, Any]:
|
|||
|
|
"""
|
|||
|
|
审核内容,返回一个包含分析和修正后内容的字典
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
product_info: 用作参考的产品资料
|
|||
|
|
generated_content: 需要审核的原始生成内容
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
一个包含审核结果的字典,可能包括 "analysis", "title", "content"
|
|||
|
|
"""
|
|||
|
|
logger.info("开始内容审核...")
|
|||
|
|
|
|||
|
|
# 1. 构建提示
|
|||
|
|
prompts = self.prompt_builder.build_prompts(product_info, generated_content)
|
|||
|
|
|
|||
|
|
# 2. 调用AI
|
|||
|
|
try:
|
|||
|
|
raw_result, _, _, _ = self.ai_agent.work(
|
|||
|
|
system_prompt=prompts["system"],
|
|||
|
|
user_prompt=prompts["user"]
|
|||
|
|
)
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.critical(f"内容审核时AI调用失败: {e}", exc_info=True)
|
|||
|
|
return {"judge_success": False, "error": str(e)}
|
|||
|
|
|
|||
|
|
# 3. 解析结果
|
|||
|
|
try:
|
|||
|
|
# 假设结果是一个JSON字符串
|
|||
|
|
judged_data = json_repair_loads(raw_result)
|
|||
|
|
if isinstance(judged_data, dict) and "title" in judged_data and "content" in judged_data:
|
|||
|
|
judged_data["judge_success"] = True
|
|||
|
|
logger.info("内容审核成功完成。")
|
|||
|
|
return judged_data
|
|||
|
|
else:
|
|||
|
|
logger.warning(f"审核响应JSON格式不正确或缺少键: {judged_data}")
|
|||
|
|
return {"judge_success": False, "error": "Invalid JSON response", "raw_response": raw_result}
|
|||
|
|
except (json.JSONDecodeError, ValueError) as e:
|
|||
|
|
logger.error(f"解析审核响应JSON失败: {e}")
|
|||
|
|
return {"judge_success": False, "error": "JSONDecodeError", "raw_response": raw_result}
|