亚马逊AWS官方博客

准确率从 19% 提升至 95%!文本审核模型优化的三个阶段实践(上)

一、引言

在当今数字时代,内容审核系统是维护平台健康生态的关键防线。然而,过于严苛的审核机制可能会误杀大量合法内容,不仅影响用户体验,还会对平台的运营效率造成负面影响。本文将分享一个真实案例,详细介绍如何通过数据分析、提示词工程和模型微调,将一个审核准确率仅 10% 的文本审核系统优化至接近 95% 的准确度。

该项目服务于一家经营海外聊天软件的公司,其用户注册审核环节存在严重的误判问题。我们通过三个阶段的系统性优化,成功解决了这一难题,并在实践过程中探索了不同技术路径的优劣,为类似场景提供了极具价值的参考方案。本文将重点聚焦前两个优化阶段,后续还会专门推出文章介绍第三阶段的模型微调方案。

二、项目概览

本项目的核心任务是解决客户应用在用户注册审核环节的高误判率问题。整个项目分为三个阶段,每个阶段运用不同的技术方法,逐步提升审核准确率:

  1. 问题识别:项目启动时,系统误判率高达 9%,这意味着绝大多数合法用户的注册信息被错误拦截。
  2. 第一阶段:数据分析与初步优化:通过数据分析挖掘系统误判的主要原因,并进行针对性的初步优化。
  3. 第二阶段:误判分类与提示词工程:采用更系统化、数据驱动的方法,进一步降低误判率。
  4. 第三阶段:模型微调方法:通过模型微调,将准确率提升至 95%。

经过三个阶段的不懈努力,我们成功将误判率降至接近 5%,为客户构建了一个更简洁、高效的长期解决方案。

三、问题背景

该应用的用户注册审核系统采用了串行的三步审核流程,每一步都调用 Claude 3.5 大语言模型进行判断。如下图所示:

(1)联系方式检测(contact_prompt):检查用户资料是否包含联系方式或详细地址

(2)文本有效性检测(valid_prompt):检查文本是否有效,不是随机字符或无意义内容

(3)在线关系和内容销售检测(onlineSell_prompt):检查是否为纯线上关系或销售内容

这种串行审核机制采用”一票否决致大量合法用户被错误拒绝,严重”原则,只有当三个检查全部通过时,用户资料才会被批准。然而,系统的误判率高达 81.9%,严重响了用户体验和平台的用户增长。如下表所示:

数据总量 AI_result=True 总数 AI_result=False 总数 误判占数据总量百分比
1072 194 878 81.90%

四、第一阶段工作:数据分析与初步优化

第一阶段的工作重点是通过数据分析找出系统误判的主要原因,并进行针对性的初步优化。

1. 定量分析方法与结果

在分析过程中,我们运用了一系列定量分析方法。首先是数据收集,从系统日志中提取了最近 30 天的审核记录,总样本量为 1072 条用户注册资料,其中误判样本达 878 条,误判率为 81.9% 。随后,进行分步审核结果分析,对每一步审核结果独立统计,计算各步骤误判率,以识别主要误判来源。最后,通过交叉验证,利用人工审核对系统判断结果进行核验,计算整体精确率和召回率,并评估各步骤误判严重程度。下表展示了初始系统的误判分布情况:

数据总量 AI_result=False 总数 误判占数据总量百分比 1-llm=False 总数 1-llm 列值为布尔值 false 的行的总数占 badcase 数量的比例 2-llm 列值为布尔值 false 的行的总数 2-llm 列值为布尔值 false 的行的总数占 badcase 数的比例 3-llm 列值为布尔值 false 的行的总数 3-llm 列值为布尔值 false 的行的总数占 badcase 总行数的比例
1072 878 81.90% 452 51.48% 725 82.57% 759 86.45%

从以上图、表中数据清晰地显示,第三步(onlineSell_prompt)的误判率最高,是主要瓶颈。同时,我们注意到所有步骤的召回率都是 100%,意味着系统没有漏掉任何应该拒绝的内容,但精确率极低,导致大量误判。

通过对拒绝案例展开初步剖析,我们洞察到以下几类关键问题:

(1)在审核系统架构方面,当下采用 “一票否决” 机制,致使只要任意一步检查出现失败,便会致使整体审核被拒绝。并且,三步串行审核模式进一步放大了单步误判所产生的影响,累积误差效应极为显著。同时,该系统还存在审核结果可解释性缺失的状况,这使得定位具体问题困难重重。

(2)提示词设计存在诸多漏洞。一方面,提示词定义模糊不清,缺少明确的判断标准以及量化指标;另一方面,规则表述不够精准,使得 Claude 3.5 在面对边界情况时,判断结果缺乏一致性。此外,示例数量不足且缺乏代表性,难以全面覆盖多样化的用户输入场景,决策流程也不够清晰,未明确设置优先级与权重。

(3)文化与语言适配层面,缺乏针对多语言内容的妥善处理策略。未充分考量不同文化背景下表达方式所存在的差异,对特定领域术语以及隐晦表达的理解存在欠缺,并且没有制定针对边界案例的处理指南。

上述这些问题相互交织,综合作用,最终导致系统表现过度保守,在面对存疑内容时倾向于直接拒绝,进而引发较高的误判率。尤其是在处理含糊表达、具有文化特定性的表述以及非标准语言时,系统性能表现更是差强人意。

2. 定性分析方法与发现

为确保样本的全面性与代表性,我们从每个审核步骤里,通过随机抽样的方式选取 5 组误判案例。在抽样过程中,着重保证样本能够涵盖不同类型的内容,囊括丰富多样的表达方式,同时兼顾不同语言以及文化背景下的用户资料,以此获取多元且具典型性的分析样本。

2.1 在线关系和内容销售检测的误判原因

作为主要误判来源,我们对第三步审核环节进行深度剖析,发现以下关键问题:

(1)线上关系规则误判

系统在识别特定线上属性关系时,采用了过于机械的判定逻辑。仅依据部分特征词汇触发判断,未结合用户表达的完整意图,导致无法区分否定语境或潜在的线下关联需求。本质上是由于系统缺乏对语义和场景的综合理解能力,单纯依赖表层关键词匹配。

(2)内容销售判定失准

在识别内容销售行为时,系统存在概念交叉混淆的问题。将具有经济互动特征的非销售场景误判为销售行为,同时对特定领域术语过度敏感,甚至将提及多媒体内容的普通交流一概归为销售行为。这反映出判断标准缺乏明确边界,未能有效区分不同经济关系和内容属性。

(3)语义理解局限性

系统过度依赖预设敏感词库,却忽略了上下文语境和用户真实意图。例如,将情感表达、兴趣描述错误关联到商业意图,对特殊符号或隐晦表达缺乏理解能力。这种 “重形式、轻语义” 的判断模式,暴露出在自然语言理解和意图识别层面的短板。

2.2 优化策略解读

基于前期分析结论,我们围绕核心审核环节制定了系统化优化方案,具体策略如下:

(1)强化判定标准。通过引入更严格的判定关键词与限定条件,提高违规认定门槛。只有当表述满足多重明确条件时,才触发违规判定,避免因模糊语义导致的误判,使规则更具精准性和严谨性。

(2)细化分类定义。针对特定业务概念,进一步明确判断边界。例如,精准界定涉及交易的数字内容类型,通过典型案例区分不同业务场景下的行为性质,增加核心判定标准,有效提升系统对复杂业务关系的识别准确性。

(3)扩展可接受范围。重新梳理并扩充可接受表述的类型,明确区分合规与违规的业务关系描述。通过新增典型示例,清晰界定可接受场景的边界,为系统判断提供更全面的参考依据。

(4)优化审核流程。构建分步骤的决策指引机制,明确不满足违规条件即视为通过的审核原则,并针对特殊场景制定处理规范,确保审核流程的标准化与可操作性。

以类似定性分析方法,对第一步骤审核、第二步骤审核 Badcase 进行分析,并调整提示词。得到以下初步优化结果:

数据总量 AI_result=False 总数 误判占数据总量百分比 1-llm=False 总数 1-llm 列值为布尔值 false 的行的总数占 badcase 数量的比例 2-llm 列值为布尔值 false 的行的总数 2-llm 列值为布尔值 false 的行的总数占 badcase 数的比例 3-llm 列值为布尔值 false 的行的总数 3-llm 列值为布尔值 false 的行的总数占 badcase 总行数的比例
1072 123 11.47% 106 86.18% 7 5.69% 53 43.09%

这一结果显示出显著改善,误判率从 81.9% 下降到 11.47%,减少了 70.43 个百分点。特别是第三步审核(在线关系和内容销售检测)的误判率从 86.45% 降至 3.09%,改善最为明显。

尽管如此,11.47% 的误判率仍有进一进步优化的空间,这促使我们进入第二阶段的系统化。

五、第二阶段:误判分类与提示词工程

在第一阶段取得初步成功后,我们在第二阶段采用了更系统化、数据驱动的方法来进一步优化审核系统,目标是将误判率降至最低。

1. 系统化处理流程设计

我们设计了一套完整的工作流程:首先分析文本审核结果,找出拒绝原因;然后利用 Claude 模型探究每种误判类型的特性与模式,制定专属改进策略和规则;最后将策略转化为审核指南和提示词,生成分析报告并部署新提示词。

  • 第一步分析文本审核结果,找出拒绝原因。再利用 Claude 模型探究每种误判类型的特性与模式,制定专属改进策略和规则,最后将策略转化为审核指南和提示词,生成分析报告,部署新提示词。
  • 之后进入分析工作与策略拟定阶段。利用 Claude 模型深入探究每种误判类型的共同特性与规律模式,进而针对不同类型的误判量身定制专属的改进策略与规则。
  • 最后开展内容生成与策略施行。将拟定的改进策略转化为详尽的审核指南及提示词,产出结构化的分析报告与优化后的提示词,并在审核系统中部署新生成的提示词。

2. 技术实现

为实现这一流程,我们开发了三个主要的 Python 脚本:

  • analyze_text_review.py:分析文本审核结果,找出拒绝原因。
  • categorize_and_improve.py:对拒绝原因进行分类,并生成改进的提示词。
  • rerun_with_improved_prompts.py:使用改进的提示词重新进行文本审核。

(1)analyze_text_review.py:分析文本审核结果,找出拒绝原因

def analyze_rejection_reason(text, prompt_type):
    if prompt_type == 1:
        prompt = contact_prompt2
    elif prompt_type == 2:
        prompt = valid_prompt2
    elif prompt_type == 3:
        prompt = onlineSell_prompt2
    else:
        return "Unknown prompt type"
    response = call_llm(prompt, text)
    
    try:
        response_json = json.loads(response)
        reason = response_json.get("reason", "No reason provided")
        return reason
    except json.JSONDecodeError:
        return "Failed to parse response: " + response[:100]

(2)categorize_and_improve.py:对拒绝原因进行分类,并生成改进的提示词

def analyze_type1_patterns (content):
     """使用 Claude 分析联系方式检测的误判模式"""
     prompt = """
     你是一位专业的文本分析专家。以下是一些被联系方式检测算法错误拒绝的文本内容。
     请分析这些文本,找出可能导致误判的共同模式或特征。
     特别关注:
     1. 这些文本中可能被误认为是联系方式的内容
     2. 这些文本的共同特点
     3. 与真正的联系方式(如完整电话号码、电子邮件地址等)的区别

     请列出 5 - 10 个最主要的误判模式,并按重要性排序。
     """

def generate_improved_contact_prompt (patterns):
    """基于分析的模式生成改进的联系方式检测提示词"""
    if claude_available:
       prompt = f"""
       你是一位专业的提示词工程师。请基于以下误判模式,改进联系方式检测提示词。

       原始提示词的问题是过于严格,导致许多不含完整联系信息的内容被错误拒绝。

      误判模式:
      {format_patterns_as_markdown (patterns)}

      请生成一个改进的提示词,使其:
      1. 更严格的拒绝标准:只有在内容包含完整且明确的联系方式时才拒绝
      2. 更宽松的通过标准:允许通过部分或模糊的联系信息

     提示词应包含以下部分:
      Role (角色)
      Guidelines (指南)
      Examples (例子)
      Decision Process (决策流程)
      Output Format (输出格式)

     请直接返回完整的提示词,不要包含任何其他解释或说明。
     """

(3)rerun_with_improved_prompts.py:使用改进的提示词重新进行文本审核

model_kwargs = {
    "max_tokens": 800,
    "temperature": 0.0,
    "top_k": 3,
    "top_p": 1,
    "stop_sequences": ["\n\nHuman:", "\n\nAssistant"],
    "anthropic_version": "bedrock-2023-05-31"
}

llm = BedrockChat(
    credentials_profile_name="default",
    model_id=model_id,
    model_kwargs=model_kwargs,
    region_name="us-west-2"
)

def call_llm(system_prompt, query):
    system_message = SystemMessage(content=system_prompt)
    human_message = HumanMessage(content=query.strip())
    r = llm.invoke([system_message, human_message])
    content = r.content
    return content

def load_improved_prompts():
    improved_prompts = {}
    for check_type in [1, 2, 3]:
        try:
            with open(f'improved_prompt_{check_type}.txt', 'r', encoding='utf-8') as f:
                improved_prompts[check_type] = f.read()
            print(f"Loaded improved prompt for check type {check_type}")
        except FileNotFoundError:
            print(f"Warning: improved_prompt_{check_type}.txt not found. Will use original prompt.")
            # Load the original prompt from Prompt.txt
            with open('Prompt.txt', 'r', encoding='utf-8') as f:
                prompt_text = f.read()
            
            import re
            if check_type == 1:
                improved_prompts[check_type] = re.search(r'contact_prompt2="""(.*?)"""', prompt_text, re.DOTALL).group(1)
            elif check_type == 2:
                improved_prompts[check_type] = re.search(r'valid_prompt2="""(.*?)"""', prompt_text, re.DOTALL).group(1)
            elif check_type == 3:
                improved_prompts[check_type] = re.search(r'onlineSell_prompt2="""(.*?)"""', prompt_text, re.DOTALL).group(1)
    
    return improved_prompts

3. 优化后的提示词设计与结构

基于详细的误判模式分析,我们对三个审核步骤的提示词进行了全面优化。我们采用了结构化的提示词设计方法,确保每个提示词都包含明确的角色定义、详细指南、丰富示例和清晰的决策流程。

提示词结构设计

我们为所有提示词设计了统一的结构框架:

##R - Role:角色定义,明确审核者身份和任务
##C - Guidelines:详细的审核指南,包含明确的接受和拒绝标准
##E - Examples:丰富的正反例,特别包含边界案例
##D - Decision Process:明确的决策流程和优先级

这种结构确保了提示词的完整性和一致性,同时便于后续维护和更新。

(1)联系方式检测提示词优化

核心优化点:

  • 更严格的拒绝标准:只有在内容包含完整且明确的联系方式时才拒绝。
  • 更宽松的通过标准:允许提及位置、通信意图或方法但没有具体联系方式的内容。
  • 明确区分数字用途:区分联系方式数字与描述性数字(年龄、身高等)。
  • 增加边界案例处理指南:如何处理模糊不清的情况。

(2)文本有效性检测提示词优化

核心优化点:

  • 更宽松的通过标准:任何有可辨别含义或意图的内容,即使有拼写或语法错误。
  • 更严格的拒绝标准:只有完全随机的键盘输入或无法理解的文本才拒绝。
  • 互惠关系处理:明确区分互惠关系描述与内容销售。
  • 经济支持表述:接受经济支持、礼物等描述,只要不是明确销售数字内容。

通过这种结构化、系统化的提示词优化方法,我们确保了每个审核步骤都有明确的判断标准和决策流程,大大减少了误判的可能性。

4. 第二阶段结果与评估

通过系统化的误判分类和提示词工程,我们在第二阶段取得了显著成果:

数据总量 AI_result=False 总数 误判占数据总量百分比 1-llm=False 总数 1-llm 列值为布尔值 false 的行的总数占 badcase 数量的比例 2-llm 列值为布尔值 false 的行的总数 2-llm 列值为布尔值 false 的行的总数占 badcase 数的比例 3-llm 列值为布尔值 false 的行的总数 3-llm 列值为布尔值 false 的行的总数占 badcase 总行数的比例
1072 0 0 0 0 0 0 0 0

5. 挑战与局限性

通过系统化误判分类和提示词工程,第二阶段成果还不错,实现了 100% 准确率。但这种基于规则和提示词的方法也面临挑战。系统复杂性高,三个审核步骤提示词总长度超 5000 字,包含 30 多条业务规则,维护和更新成本大。扩展性差,添加新规则可能影响现有规则效果,规则间易冲突,系统复杂度随规则增多呈指数级增长。资源消耗大,三步串行调用 Claude,API 调用成本高,处理高并发请求时性能瓶颈明显。这些问题促使我们探索第三阶段的模型微调方法。

六、结论与建议

在前两个阶段的优化实践中,我们成功大幅降低了审核系统的误判率,取得了阶段性的显著成果。第一阶段通过深入的数据分析和针对性的提示词优化,有效验证了提示词工程在提升审核系统性能方面的可行性和有效性,为后续的优化工作奠定了坚实基础。第二阶段则在此基础上,通过精细化的提示词设计,进一步挖掘和解决了潜在的误判问题,使得审核系统的准确率得到了更为显著的提升。然而,我们也认识到当前所采用的方法在取得成果的同时,也暴露出一些不可忽视的问题。随着提示词的不断细化和业务规则的增多,系统的复杂性急剧上升。此外,该方法的扩展性较差,每增加一条新规则,都可能对现有规则的效果产生影响,使得系统复杂度随着规则数量的增加呈指数级增长。同时,三步串行调用 Claude 模型进行审核的方式,不仅造成了较高的 API 调用成本,在面对高并发请求时,系统性能也会出现明显的瓶颈,难以满足大规模业务场景下的高效审核需求。

在下一篇技术博客中,我们将详细介绍第三阶段采用模型微调方案所带来的更优审核效果。通过深入研究和实践,我们期望能够为文本审核系统的优化提供更具创新性和实用性的解决方案,为用户体验的提升提供更有力的保障。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者

延诤

亚马逊云科技生成式 AI 实验室资深架构师。曾经在联想、58 同城、京东等知名企业担任产研负责人,积累了深厚的行业经验与前沿视野。自加入亚马逊云科技后,致力于生成式 AI 技术领域,专注于推动 AI 在国内及全球企业客户中的实际应用、高效落地与广泛推广。

王庆忠

亚马逊云科技应用科学家,专注于多模态大模型研发,主攻自然语言处理与计算机视觉核心算法创新及工程落地。深度参与亚马逊云科技人工智能应用实验室项目,推动生成式 AI 技术在云计算场景的实际应用。

唐清原

亚马逊云科技高级解决方案架构师,负责 Data Analytic & AIML 产品服务架构设计以及解决方案。10+数据领域研发及架构设计经验,历任 IBM 咨询顾问,Oracle 高级咨询顾问,澳新银行数据部领域架构师职务。在大数据 BI,数据湖,推荐系统,MLOps 等平台项目有丰富实战经验。

姬军翔

亚马逊云科技资深解决方案架构师,在快速原型团队负责创新场景的端到端设计与实现。