【TextIn大模型加速器 + 火山引擎】 实战复盘:打造内容审核“防火墙”

AI解决方案扣子专业版Agent
实战复盘:快手被黑之后,我们如何用 Coze + TextIn xParse 打造内容审核“防火墙”

picture.image

当快手被黑,海量违规内容短时间涌出,我才意识到传统的关键词过滤,在今天的互联网黑产面前有多脆弱。

近期,快手遭遇了一次大规模的黑客攻击。攻击者利用平台漏洞,短时间内注入了大量含有隐晦引流信息的垃圾内容。这些内容里没有直接的违规词,而是充斥着“+V看内部福利”、“佳Q咨询”这类暗语和变体。

为应对复杂的互联网环境,甲方客户提出了一个紧急需求:必须快速构建一个能实时识别、拦截这类新型互联网暗语的内容预审系统,并且要能覆盖直播弹幕、评论区、用户上传图片、文档审查等多个场景。

时间紧,任务重。传统的做法是让安全团队连夜写正则、更新词库,但大家都清楚,这治标不治本。攻击者稍微换个写法,比如把“V”换成“薇”,把“Q”换成“球”,规则就又失效了。我们急需一种能理解意图、而非简单匹配关键词的解决方案。 picture.image 最终,我们选择基于 火山引擎的Coze平台TextIn的xParse解析引擎,快速搭建了一个“智能预审Agent”。令人惊讶的是,从构思到第一个可运行版本上线,我们只用了不到48小时。下面,我就来复盘这个项目的核心思路与实战细节。

一、 核心设计:从“单点过滤”到“上下文感知”的转变

我们抛弃了“关键词列表+正则表达式”的老路,转向了基于大语言模型(LLM)的意图理解。但这里有一个关键前提:LLM需要清晰、准确的输入

互联网暗语之所以难防,是因为它们常常“藏”在复杂的环境里:

  1. 藏在图片里:一张正常的商品图,角落可能有一行“+V”的水印。
  2. 藏在复杂版式里:用户上传的“兼职招募”PDF,联系方式可能混在一大段正常文字中。
  3. 藏在变体和上下文里:“私我”可能是违规引流,“我的隐私”则是正常表达。

因此,我们整个系统的核心流程可以概括为:“把一切非结构化内容,精准地转换成LLM能理解的结构化文本,再交给LLM基于风控知识做判断”。整个Agent的工作流,用一张图可以清晰地展示:

flowchart TB
    subgraph Input[数据输入层]
        direction LR
        I1[直播弹幕/评论] --> I2[用户上传图片、文档] --> I3[视频帧/字幕]
    end
    
    Input --> Gateway{统一接入网关}
    
    subgraph Agent[智能预审Agent]
        direction LR
        P1[解析模块<br>调用xParse API] --> 
        P2[风控知识库查询] --> 
        P3[LLM研判模块] --> 
        P4[处置执行模块]
    end
    
    Gateway --> Agent
    
    subgraph Output[处置输出层]
        direction LR
        O1[实时拦截/限流] <--> O2[打标送审] <--> O3[运营告警]
    end
    
    P4 --> Output

这个流程回答了三个关键问题:

  • 内容从哪来?直播弹幕、用户图片、视频帧,所有可能藏匿暗语的地方。
  • Agent在哪介入?内容发布后毫秒级触发,在抵达广大用户前完成拦截。
  • 结果到哪去?直接联动内容系统进行处置,并同步给审核后台和风控大盘。

二、 技术实现:三个关键模块的落地细节

picture.image

1. 解析模块:用xParse“照亮”所有阴暗角落

这是整个系统的基石。我们调研过多个OCR方案,最终选择TextIn的 xParse(通用文档解析)API,原因有三:

  • 精度高:对截图、模糊图片中的小字号文字识别准确,这对捕捉角落水印至关重要。
  • 保持结构:它能将识别结果按阅读顺序输出为Markdown,并附带每个文字块的坐标(bbox)。这意味着我们不仅能拿到文字,还知道它出现在图片的哪个区域(比如右下角的水印区),这个位置信息本身就是一个重要的风险特征。
  • 一站式:无论是PNG、JPG还是PDF,一个接口搞定,简化了工程架构。

在Coze里的具体配置: 在Coze的插件市场,我们创建了一个自定义插件,核心就是调用xParse的API。

// 插件请求体配置示例
{
  "url": "https://server.XXX.XXX/XXXX/XXX",
  "method": "POST",
  "headers": {
    "x-ti-app-id": "你的AppKey",
    "x-ti-secret-code": "你的Secret"
  },
  "body": {
    "file": "{{image_url}}", // Coze会自动替换为传入的图片URL
    "pdf_parse_type": "normal",
    "ocr_engine": "auto"
  }
}
// 响应处理中,我们主要提取 `result.markdown` 和 `result.bboxes` 字段

2. 风控知识库:让Agent具备“行业记忆”

试运行阶段中,我们意识到,不能把所有规则都硬编码到LLM的Prompt里。我们在Coze中创建了一个 “动态风控知识库”

知识库节点其核心设计思路是为LLM提供精准决策支持并实现风控策略的快速迭代。我们摒弃了传统的关键词列表,转而构建包含“真实上下文案例”和“抽象违规模式”的高密度知识片段库。

为实现策略的敏捷响应,我们建立了闭环学习机制。系统将每日人工审核确认的新违规样本,自动处理后通过API注入知识库。在检索时,采用多路召回策略:一方面召回语义相似的案例,另一方面召回核心违规模式的描述。这种设计确保了系统能紧跟黑产话术的变化,新变体从发现到被系统识别的时间从过去的“按天计算”缩短至“小时级”。

  • Collection名称risk_phrase_lib
  • 核心内容
    1. 已知暗语模式:如“+[A-Za-z]”、“有偿[带|代|岱]”等及其数百个变体案例(如“+V”、“佳V”、“维新”)。
    2. 违规案例片段:从历史审核数据中,清洗出的典型违规文本片段。
    3. 正常语境案例:用于帮助LLM区分边界,例如“我的QQ号” vs “+Q领取”。
  • 使用方式:在Agent工作流中,会先将xParse解析出的文本,与这个知识库进行向量相似度检索,召回最相关的正面和负面案例,一并交给LLM作为判断参考。

知识库与工作流的协同是关键。在Coze工作流中,该节点的作用并非直接给出答案,而是在LLM研判前,为其精准“预加载”最相关的背景信息。这些检索出的知识片段作为“参考附录”与原始文本一同提交给LLM。这种设计实现了信息的最优组织——原始文本是“考题”,知识库提供“参考资料”,LLM则是综合分析的“考官”,从而在保持判断灵活性的同时,大幅提升决策的准确性与一致性。 我们参考了官方提供的案例文档,迅速实现了风控数据库的兼容。

class TextInMarkdownConverter:
    """
    封装 TextIn OCR 的 PDF 转 Markdown 功能
    """
    
    def __init__(self, app_id, app_secret):
        self._app_id = app_id
        self._app_secret = app_secret
        self.api_url = 'https://api.textin.com'
    
    def convert_pdf_to_markdown(self, file_path, options, is_url=False):
        """
        将本地或远程 PDF 文件转换为 Markdown 文本
        
        :param file_path: 本地文件路径或远程 URL
        :param options: 请求参数(如 DPI、页码范围等)
        :param is_url: 是否为远程 URL 模式
        :return: requests.Response 对象
        """
        url = self.api_url + '/ai/service/v1/pdf_to_markdown'
        headers = {
            'x-ti-app-id': self._app_id,
            'x-ti-secret-code': self._app_secret
        }
        
        if is_url:
            headers['Content-Type'] = 'text/plain'
            data = file_path
        else:
            headers['Content-Type'] = 'application/octet-stream'
            with open(file_path, 'rb') as f:
                data = f.read()
        
        return requests.post(url, headers=headers, data=data, params=options)


class CozeUploader:
    """
    将分段内容上传至 Coze 知识库
    """
    
    def __init__(self, server_ip, api_key, dataset_id):
        self.server_ip = server_ip
        self.api_key = api_key
        self.dataset_id = dataset_id
        self.document_id = None
    
    def upload_document(self, title, file_base64):
        """
        上传文档到 Coze 知识库
        
        :param title: 文档标题
        :param file_base64: 文件的 Base64 编码字符串
        :return: requests.Response 对象
        """
        url = f'{self.server_ip}/open_api/knowledge/document/create'
        
        headers = {
            'Authorization': f'Bearer {self.api_key}',
            'Content-Type': 'application/json',
            'Agw-Js-Conv': 'str'
        }
        
        data = {
            "dataset_id": self.dataset_id,
            "document_bases": [
                {
                    "name": title,
                    "source_info": {
                        "file_base64": file_base64
                    }
                }
            ],
            "format_type": 0,
            "chunk_strategy": {
                "chunk_type": 0
            }
        }
        
        response = requests.post(url, headers=headers, json=data)
        print(response.text)
        return response

3. Agent工作流:在Coze画布上“搭积木”

如果说整个智能预审系统是一个精密的自动化工厂,那么在Coze平台上搭建的Agent工作流,就是这个工厂的中央控制室与流水线。我们不需要编写复杂的代码,而是通过拖拽和连接不同功能节点,就可以清晰地编排出一条从内容接入到最终处置的完整逻辑链。

整个工作流始于一个Webhook触发器,它实时接收来自直播平台或内容系统的审核请求,为流程注入数据原料。

流程的核心是一个基于大语言模型的研判节点。在此之前,系统会通过条件分支,将图片类内容送至xParse插件节点转换为结构化文本,并将所有文本与动态风控知识库进行匹配检索。研判节点在接收到待审文本和知识库提供的案例参考后,会像一个资深审核员一样,依据预设的规则框架进行分析,并输出带有风险等级和处置建议的结构化结论。

最后,系统根据研判结果自动执行分支决策:高风险内容触发API调用实时拦截,中风险内容打标后优先送审,低风险内容则直接放行,形成一个从感知、分析到执行的完整自动化闭环。

picture.image

LLM研判的Prompt设计精髓: 我们并没有让LLM“从零开始”学习风控,而是给了它明确的角色和判断框架:

你是一个资深互联网内容安全审核员。请严格根据以下规则分析用户输入:

## 分析步骤
1.  **提取联系意图**:检查内容是否明显试图将用户引导至微信、QQ等第三方平台。核心关注点包括但不限于:“+V”、“+Q”、“私聊”、“联系”、“客服”等词汇及其**一切常见变体**(如薇、胃、威;球、扣、秋)。
2.  **结合上下文**:判断该意图是“提供违规服务”还是“正常社交”。例如,“有技术问题可以+Q群讨论”是合规的,“+V看簧片”是违规的。
3.  **参考知识库案例**:以下是历史上类似的违规/合规案例,供你参考:{{knowledge_snippets}}

## 输出要求
你必须输出严格的JSON格式:
{
  "risk_level": "high|medium|low", // 风险等级
  "reason": "具体的判断依据,指出触发了哪种模式", // 便于审核员复查
  "action": "block|review|pass" // 建议动作:拦截、送审、通过
}

## 用户输入
{{parsed_content}} // 由xParse解析或直接输入的文本

这个Prompt的设计,将LLM从一个“黑盒”变成了一个可引导、可解释的决策引擎

三、 上线效果与反思

picture.image 灰度上线一周后的核心数据

  • 处理速度:对于纯文本弹幕,从触发到给出处置建议,平均耗时 < 1秒。对于图片,包含xParse解析时间在内,平均耗时 < 3秒。完全满足直播场景的实时性要求。文档处理耗时 < 3.89秒(P99)
  • 准确率:在测试集上,对“+V/Q类”暗语的召回率达到了99.2%,误杀率(将正常内容判为违规)控制在 1.5% 以内。作为对比,旧的关键词系统召回率约为70%,误杀率却高达8%。
  • 成本与效率:最让我们惊喜的是迭代速度。当黑产又出现“加微杏”这种新变体时,我们只需将该案例作为一条负面样本添加到 risk_phrase_lib 知识库中,系统在下次检索时就能辅助LLM进行泛化识别。整个流程从发现新变体到上线策略,从过去的按“天”计算缩短到了按“小时”计算

反思与展望: 这次“战役”让我们深刻体会到,现代内容风控不再是“猫鼠游戏”,而是“算法对抗”。Coze+xParse的组合,为我们提供了一套 “快速感知、快速决策、快速迭代” 的武器。

  • xParse 解决了“看不清”(多种格式)和“找不准”(文字位置)的输入问题。
  • Coze 解决了“动作慢”(开发部署周期长)和“不灵活”(策略调整难)的流程问题。

未来,我们计划将这个Agent的能力扩展到更多的场景,比如识别短视频标题党、评论区诈骗话术等。这条路还很长,但至少开局,我们找到了一条更聪明的路径。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论