跳转至

个人身份信息管理

3.6 版本新特性

现在,你可以仅通过 Kafka 事件代理流式传输日志和事件中的个人身份信息 (PII) 数据。继续阅读以了解如何启用 PII 数据的匿名化。

功能尚未兼容 CALM

此功能目前与 CALM 不兼容。我们正在努力确保未来的集成和兼容性。

管理对话机器人收集的敏感客户数据是遵守法规、安全管理数据并使其可供分析的关键要求。Rasa Pro 3.6 引入了匿名化日志和通过 Kafka 事件代理传输的事件中的 PII 数据的功能。

请注意,追踪器存储会继续存储未匿名的对话数据。这是必需的,以便我们保留原始数据的真实来源,以实现不可否认的目的。了解如何使用 Vault 密钥管理器保护你的追踪器存储,以使用轮换凭据保护真实来源。

此外,由于追踪器存储数据在推理时对对话机器人的对话管理起着至关重要的作用,因此在传输过程中匿名化数据可能会对对话机器人的对话管理行动预测产生不良后果。

架构概述

Rasa 事件的匿名化在对话管理动作预测和执行结束时通过匿名化管道运行。请注意,匿名化管道完成的处理被安排为后台任务,不会影响对话机器人的响应时间。

匿名化步骤如下:

  1. Rasa 代理在处理每个用户消息时调用匿名化管道。
  2. 匿名化管道运行一系列应用于新事件的匿名化规则。
  3. 管道将匿名化事件发布到映射到 endpoints.yml 中的匿名化规则列表的 Kafka 主题。
  4. 追踪器存储保存未匿名化的原始事件。

支持的 Rasa 事件

匿名化的 Rasa 事件包括以下内容:

  • user
  • bot
  • slot
  • entities

支持的 PII 实体类型

匿名化管道使用 Microsoft Presidio 作为实体识别器和匿名器。Presidio 是一个开源库,支持各种实体类型和匿名化方法。

你可以在匿名化规则中指定任何现成的 Presidio 受支持的实体类型。请注意,目前无法为 Rasa Pro 匿名化管道添加自定义实体类型。

如何编写匿名化规则

你现在可以在 endpoints.yml 中编写匿名化规则,以明确声明哪些 Presidio 实体应该匿名化。匿名化管道可通过 endpoints.yml 文件中的 anonymization 部分进行配置。此部分必须具有以下示例中给出的结构:

anonymization:
  metadata:
    language: en
    model_name: en_core_web_lg
    model_provider: spacy
  rule_lists:
    - id: rules_1
      rules:
        - entity: PERSON
          substitution: text
          value: John Doe
        - entity: LOCATION
          substitution: faker
        - entity: CREDIT_CARD
          substitution: faker
        - entity: IBAN_CODE
          substitution: faker
    - id: rules_2
      rules:
        - entity: CREDIT_CARD
          substitution: mask
        - entity: IBAN_CODE
          substitution: mask

如何填充元数据部分

元数据部分包含以下字段:languagemodel_namemodel_provider

language 字段指定要匿名化的文本的语言代码。请注意,每个匿名化管道只能指定一种语言,因此该功能目前无法处理最终用户的语言切换。

model_namemodel_provider 字段指定用于匿名化的 Presidio 模型的名称和提供者。可用的模型提供者是 spacystanzatransformers

如果你想使用 spacy,我们强烈建议使用可用的大型模型,例如 en_core_web_lges_core_news_lg。这是为了确保更准确的实体识别。

注意

当使用大型模型时,你必须确保 Rasa Pro 环境有足够的内存来加载模型。

如果你选择使用 transformers 模型提供程序,则必须在 model_name 字段中指定两个模型名称:HuggingFace 模型名称和 spaCy 模型名称,其中 spaCy 模型将包装 transformers NER 模型。例如:

anonymization:
  metadata:
    language: en
    model_name:
      spacy: en_core_web_lg
      transformers: dslim/bert-base-NER
    model_provider: transformers

如何安装语言模型

你必须在 Rasa Pro 环境中安装你在 model_name 字段中声明的模型。例如,如果你声明 model_name: en_core_web_lg,则必须在 Rasa Pro 环境中安装 spaCy en_core_web_lg 模型。你可以按照 Presidio 官方文档中 spaCy 和 stanza 模型的模型安装说明进行操作。

对于 transformers 模型提供程序,你必须在 Rasa Pro 环境中安装你在 model_name 字段中声明的两个模型。例如,如果你在 endpoints.yml 中声明 transformers: dslim/bert-base-NER,则必须在 Rasa Pro 环境中安装 dslim/bert-base-NER 模型。你可以在 Presidio 官方文档中找到 HuggingFace 的模型下载说明。

注意

并非所有语言都有预训练的语言模型。如果你想使用没有预训练语言模型的语言,你必须训练自己的 spaCystanzahuggingface 模型并将其安装在你的 Rasa Pro 环境中。

如何填充 rule_lists 部分

rule_lists 部分包含匿名化规则列表列表。每个规则列表必须具有字符串类型的唯一 idrules 列表。每个规则必须具有 entity 字段和 substitution 字段。entity 字段指定要匿名化的 Presidio 实体类型,并且必须大写。请注意,目前不支持使用正则表达式来识别实体。

substitution 字段指定要使用的匿名化方法。目前,支持以下匿名化方法:textmaskfaker

  • text 匿名化方法将原始实体值替换为 value 字段中指定的值。在以下示例中,PERSON 实体值将替换为 John Doe

    anonymization:
      metadata:
          language: en
          model_name: en_core_web_lg
          model_provider: spacy
      rule_lists:
          - id: rules_1
          rules:
              - entity: PERSON
              substitution: text
              value: John Doe
    
  • mask 匿名化方法是将原始实体值替换为使用字符 * 的等长掩码,例如原始实体值为 John Doe,则匿名化后的值将为 ********

    anonymization:
      metadata:
        language: en
        model_name: en_core_web_lg
        model_provider: spacy
      rule_lists:
        - id: rules_1
          rules:
            - entity: PERSON
              substitution: mask
    
  • faker 匿名化方法将原始实体值替换为 Faker 库生成的假值。例如,如果原始实体值为 John Doe,则匿名化后的值将被替换为 Faker 库生成的假名称。

    anonymization:
      metadata:
        language: en
        model_name: en_core_web_lg
        model_provider: spacy
      rule_lists:
        - id: rules_1
          rules:
            - entity: PERSON
              substitution: faker
    

如果未指定替换方法,则默认替换方法为 mask

value 字段仅对于文本匿名化方法才是必需的。它指定要用作匿名值的文本。如果未指定 value 字段,则要匿名化的原始实体值将替换为括号之间的实体类型名称。例如,如果未为 PERSON 实体类型指定 value 字段,则匿名值将为 <PERSON>

faker 匿名化方法使用 Faker 库来生成虚假数据。默认情况下,faker 匿名化方法将生成英文虚假数据,除非使用本地化的 Presidio 实体类型。例如,如果你对 ES_NIF 实体类型使用 faker 替换方法,则生成的虚假数据将与西班牙语 NIF 的格式匹配。

faker 替换方法不支持以下 Presidio 实体类型:

  • CRYPTONRPMEDICAL_LICENSE
  • US_BANK_NUMBERUS_DRIVER_LICENSE
  • UK_NHS
  • IT_FISCAL_CODEIT_DRIVER_LICENSEIT_PASSPORTIT_IDENTITY_CARD
  • SG_NRIC_FIN
  • AU_ABNAU_ACNAU_TFNAU_MEDICARE

如果上述任何实体与 faker 替换方法一起使用,则匿名化管道将默认使用 mask 替换方法。

如何更新 Kafka 事件代理配置

匿名化管道使用 Kafka 将匿名化事件发布到映射到匿名化规则列表的 Kafka 主题。你可以在 endpoints.yml 文件中配置 Kafka 事件代理。Kafka 事件代理必须包含 anonymization_topics 部分,该部分必须具有以下结构:

event_broker:
  type: kafka
  partition_by_sender: True
  security_protocol: PLAINTEXT
  url: localhost
  anonymization_topics:
    - name: topic_1
      anonymization_rules: rules_1
    - name: topic_2
      anonymization_rules: rules_2
  client_id: kafka-python-rasa

anonymization_topics 部分包含将发布匿名事件的 Kafka 主题列表。每个 Kafka 主题必须有一个 name 字段和一个 anonymization_rules 字段。name 字段指定 Kafka 主题的名称。anonymization_rules 字段指定要用于 Kafka 主题的匿名规则列表的 id

使用 Kafka 将匿名事件流式传输到 Rasa X/Enterprise

仅 Rasa X/Enterprise 1.3.0 及以上版本支持将匿名事件流式传输到 Rasa X/Enterprise。此外,你必须使用 Kafka 事件代理,不支持其他事件代理类型。

你可以通过将 rasa_x_consumer: true 键值对添加到 anonymization_topics` 部分,通过 Kafka 将匿名事件流式传输到 Rasa X/Enterprise:

event_broker:
  type: kafka
  partition_by_sender: True
  url: localhost
  anonymization_topics:
    - name: topic_1
      anonymization_rules: rules_1
      rasa_x_consumer: true
    - name: topic_2
      anonymization_rules: rules_2

如果多个 Kafka 匿名化主题包含 rasa_x_consumer 键值对,则匿名化事件将流式传输到映射到 anonymization_topics 列表中第一个包含 rasa_x_consumer 键值对的主题的 Kafka 主题。

请注意,rasa_x_consumer 键值对是可选的。如果未指定,则匿名化事件将发布到 Kafka 主题,但不会流式传输到 Rasa X/Enterprise。

如何在日志中启用 PII 匿名化

你可以通过填写 endpoints.yml 文件中的 logger 部分来启用日志中的 PII 匿名化。logger 部分必须具有以下结构:

logger:
  formatter:
    anonymization_rules: rules_1

anonymization_rules 字段指定用于日志的匿名规则列表的 id

注意

我们强烈建议在生产环境中以 INFO 日志级别运行。以 DEBUG 日志级别运行会因为处理延迟而增加对话机器人的响应延迟。

请注意,使用 Kafka 事件代理在调试模式下运行 rasa shell 可能会导致与事件发布相关的日志在机器人消息之后打印到控制台。此行为是预期的,因为事件匿名化和发布是作为后台任务异步完成的,因此它将在对话机器人已经预测并执行对话机器人响应后完成。