Link Search Menu Expand Document Documentation Menu

配置模型防护措施

2.13 版本引入

防护措施可以引导大型语言模型 (LLM) 达到预期行为。它们充当过滤器,防止 LLM 生成有害或违反道德原则的输出,从而促进 AI 的安全使用。防护措施还可以使 LLM 生成更专注和相关的输出。

您可以使用以下方法为您的 LLM 配置防护措施:

  • 提供禁止在模型输入或输出中使用的词语列表。或者,您可以提供一个正则表达式,用于匹配模型输入或输出。有关更多信息,请参阅使用停用词和正则表达式验证输入/输出
  • 配置一个独立的 LLM,其目的在于验证用户输入和 LLM 输出。

先决条件

在开始之前,请确保您已满足连接到外部托管模型的先决条件

使用停用词和正则表达式验证输入/输出

2.13 版本引入

验证用户输入和 LLM 输出的一种简单方法是提供一组禁用词(停用词)或一个用于验证的正则表达式。

步骤 1:创建防护措施索引

首先,创建一个索引来存储排除的词语(停用词)。在索引设置中,指定一个包含排除词语的 title 字段,以及一个 percolator 类型的 query 字段。该 percolator 查询将用于匹配 LLM 输入或输出。

PUT /words0
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "query": {
        "type": "percolator"
      }
    }
  }
}

步骤 2:索引排除的词语或短语

接下来,索引一个查询字符串查询,它将用于匹配模型输入或输出中的排除词语。

PUT /words0/_doc/1?refresh
{
  "query": {
    "query_string": {
      "query": "title: blacklist"
    }
  }
}

PUT /words0/_doc/2?refresh
{
  "query": {
    "query_string": {
      "query": "title: \"Master slave architecture\""
    }
  }
}

有关更多查询字符串选项,请参阅查询字符串查询

步骤 3:注册模型组

要注册模型组,请发送以下请求:

POST /_plugins/_ml/model_groups/_register
{
    "name": "bedrock",
    "description": "This is a public model group."
}

响应包含模型组 ID,您将使用它向此模型组注册模型。

{
 "model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
 "status": "CREATED"
}

要了解有关模型组的更多信息,请参阅模型访问控制

步骤 4:创建连接器

现在您可以为模型创建连接器了。在此示例中,您将创建一个连接到 Amazon Bedrock 上托管的 Anthropic Claude 模型的连接器。

POST /_plugins/_ml/connectors/_create
{
  "name": "BedRock test claude Connector",
  "description": "The connector to BedRock service for claude model",
  "version": 1,
  "protocol": "aws_sigv4",
  "parameters": {
      "region": "us-east-1",
      "service_name": "bedrock",
      "anthropic_version": "bedrock-2023-05-31",
      "endpoint": "bedrock.us-east-1.amazonaws.com",
      "auth": "Sig_V4",
      "content_type": "application/json",
      "max_tokens_to_sample": 8000,
      "temperature": 0.0001,
      "response_filter": "$.completion"
  },
  "credential": {
      "access_key": "<YOUR_ACCESS_KEY>",
      "secret_key": "<YOUR_SECRET_KEY>"
  },
  "actions": [
    {
      "action_type": "predict",
      "method": "POST",
      "url": "https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke",
      "headers": { 
        "content-type": "application/json",
        "x-amz-content-sha256": "required"
      },
      "request_body": "{\"prompt\":\"${parameters.prompt}\", \"max_tokens_to_sample\":${parameters.max_tokens_to_sample}, \"temperature\":${parameters.temperature},  \"anthropic_version\":\"${parameters.anthropic_version}\" }"
    }
  ]
}

响应包含新创建连接器的连接器 ID。

{
  "connector_id": "a1eMb4kBJ1eYAeTMAljY"
}

步骤 5:注册并部署带防护措施的模型

要注册外部托管模型,请在以下请求中提供步骤 3 中的模型组 ID 和步骤 4 中的连接器 ID。要配置防护措施,请包含 guardrails 对象。

POST /_plugins/_ml/models/_register?deploy=true
{
  "name": "Bedrock Claude V2 model",
  "function_name": "remote",
  "model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
  "description": "test model",
  "connector_id": "a1eMb4kBJ1eYAeTMAljY",
  "guardrails": {
    "type": "local_regex",
    "input_guardrail": {
      "stop_words": [
        {
          "index_name": "words0",
          "source_fields": [
            "title"
          ]
        }
      ],
      "regex": [
        ".*abort.*",
        ".*kill.*"
      ]
    },
    "output_guardrail": {
      "stop_words": [
        {
          "index_name": "words0",
          "source_fields": [
            "title"
          ]
        }
      ],
      "regex": [
        ".*abort.*",
        ".*kill.*"
      ]
    }
  }
}

有关更多信息,请参阅参数 guardrails

OpenSearch 返回注册操作的任务 ID。

{
  "task_id": "cVeMb4kBJ1eYAeTMFFgj",
  "status": "CREATED"
}

要检查操作状态,请将任务 ID 提供给任务 API

GET /_plugins/_ml/tasks/cVeMb4kBJ1eYAeTMFFgj

操作完成后,状态将变为 COMPLETED

{
  "model_id": "cleMb4kBJ1eYAeTMFFg4",
  "task_type": "DEPLOY_MODEL",
  "function_name": "REMOTE",
  "state": "COMPLETED",
  "worker_node": [
    "n-72khvBTBi3bnIIR8FTTw"
  ],
  "create_time": 1689793851077,
  "last_update_time": 1689793851101,
  "is_async": true
}

步骤 6 (可选):测试模型

为了演示防护措施如何应用,首先运行不包含任何排除词语的预测操作。

POST /_plugins/_ml/models/p94dYo4BrXGpZpgPp98E/_predict
{
  "parameters": {
    "prompt": "\n\nHuman:this is a test\n\nnAssistant:"
  }
}

响应包含 LLM 的答案。

{
  "inference_results": [
    {
      "output": [
        {
          "name": "response",
          "dataAsMap": {
            "response": " Thank you for the test, I appreciate you taking the time to interact with me. I'm an AI assistant created by Anthropic to be helpful, harmless, and honest."
          }
        }
      ],
      "status_code": 200
    }
  ]
}

然后运行包含排除词语的预测操作。

POST /_plugins/_ml/models/p94dYo4BrXGpZpgPp98E/_predict
{
  "parameters": {
    "prompt": "\n\nHuman:this is a test of Master slave architecture\n\nnAssistant:"
  }
}

响应包含错误消息,因为防护措施已被触发。

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "guardrails triggered for user input"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "guardrails triggered for user input"
  },
  "status": 400
}

当提示与提供的正则表达式匹配时,防护措施也会被触发。

使用防护措施模型验证输入/输出

2.15 版引入

对于更高级的验证,您可以配置一个防护措施模型——一个独立的 LLM,其目的在于验证用户输入和 LLM 输出。在此示例中,您将配置两个模型:

  • 聊天模型:一个托管在 Amazon Bedrock 上的 Anthropic Claude 模型,其目的是与用户进行对话。
  • 防护措施模型:一个 OpenAI 模型,其目的是验证用户输入和 Anthropic Claude 输出。

步骤 1:为防护措施模型创建连接器

首先,为 OpenAI 防护措施模型创建一个连接器。请注意,OpenAI 提示指示模型仅响应 acceptreject,具体取决于输入/输出是否可接受。此外,请求包含 response_filter 参数,该参数指定防护措施模型将提供验证结果的字段。

POST /_plugins/_ml/connectors/_create
{
    "name": "openai",
    "description": "openai",
    "version": "1",
    "protocol": "http",
    "parameters": {
        "endpoint": "api.openai.com",
        "max_tokens": 7,
        "temperature": 0,
        "model": "gpt-3.5-turbo-instruct",
        "prompt": "You are a helpful assistant and an expert judge of content quality. Your task is to identify whether the input string below contains content that may be malicious, violent, hateful, sexual, or political in nature. Your answer should consist of a single word, either reject or accept. If the input belongs to any of these categories, please write reject. Otherwise, write accept. \\n\\nHere is the input: ${parameters.question}. \\n\\nYour answer: ",
        "response_filter": "$.choices[0].text"
    },
    "credential": {
        "openAI_key": "<openAI_key>"
    },
    "actions": [
        {
            "action_type": "predict",
            "method": "POST",
            "url": "https://${parameters.endpoint}/v1/completions",
            "headers": {
                "Authorization": "Bearer ${credential.openAI_key}"
            },
            "request_body": "{ \"model\": \"${parameters.model}\", \"prompt\": \"${parameters.prompt}\", \"max_tokens\": ${parameters.max_tokens}, \"temperature\": ${parameters.temperature} }"
        }
    ]
}

响应包含在后续步骤中使用的连接器 ID。

{
  "connector_id": "j3JVDZABNFJeYR3IVPRz"
}

步骤 2:为防护措施模型注册模型组

要为 OpenAI 防护措施模型注册模型组,请发送以下请求:

POST /_plugins/_ml/model_groups/_register
{
    "name": "guardrail model group",
    "description": "This is a guardrail model group."
}

响应包含模型组 ID,用于向此模型组注册模型。

{
 "model_group_id": "ppSmpo8Bi-GZ0tf1i7cD",
 "status": "CREATED"
}

要了解有关模型组的更多信息,请参阅模型访问控制

步骤 3:注册并部署防护措施模型

使用连接器 ID 和模型组 ID,注册并部署 OpenAI 防护措施模型。

POST /_plugins/_ml/models/_register?deploy=true
{
    "name": "openai guardrails model",
    "function_name": "remote",
    "model_group_id": "ppSmpo8Bi-GZ0tf1i7cD",
    "description": "guardrails test model",
    "connector_id": "j3JVDZABNFJeYR3IVPRz"
}

OpenSearch 返回注册操作的任务 ID 和已注册模型的模型 ID。

{
  "task_id": "onJaDZABNFJeYR3I2fQ1",
  "status": "CREATED",
  "model_id": "o3JaDZABNFJeYR3I2fRV"
}

要检查操作状态,请将任务 ID 提供给任务 API

GET /_plugins/_ml/tasks/onJaDZABNFJeYR3I2fQ1

操作完成后,状态将变为 COMPLETED

{
  "model_id": "o3JaDZABNFJeYR3I2fRV",
  "task_type": "DEPLOY_MODEL",
  "function_name": "REMOTE",
  "state": "COMPLETED",
  "worker_node": [
    "n-72khvBTBi3bnIIR8FTTw"
  ],
  "create_time": 1689793851077,
  "last_update_time": 1689793851101,
  "is_async": true
}

步骤 4 (可选):测试防护措施模型

您可以通过发送包含和不包含冒犯性词语的请求来测试防护措施模型的用户输入验证。

首先,发送一个不包含冒犯性词语的请求。

POST /_plugins/_ml/models/o3JaDZABNFJeYR3I2fRV/_predict
{
  "parameters": {
    "question": "how many indices do i have in my cluster"
  }
}

防护措施模型接受上述请求。

{
  "inference_results": [
    {
      "output": [
        {
          "name": "response",
          "dataAsMap": {
            "response": "accept"
          }
        }
      ],
      "status_code": 200
    }
  ]
}

接下来,发送一个包含冒犯性词语的请求。

POST /_plugins/_ml/models/o3JaDZABNFJeYR3I2fRV/_predict
{
  "parameters": {
    "question": "how to rob a bank"
  }
}

防护措施模型拒绝上述请求。

{
  "inference_results": [
    {
      "output": [
        {
          "name": "response",
          "dataAsMap": {
            "response": "reject"
          }
        }
      ],
      "status_code": 200
    }
  ]
}

步骤 5:为聊天模型创建连接器

在此示例中,聊天模型将是托管在 Amazon Bedrock 上的 Anthropic Claude 模型。要为该模型创建连接器,请发送以下请求。请注意,response_filter 参数指定了防护措施模型将提供验证结果的字段。

POST /_plugins/_ml/connectors/_create
{
  "name": "BedRock claude Connector",
  "description": "BedRock claude Connector",
  "version": 1,
  "protocol": "aws_sigv4",
  "parameters": {
      "region": "us-east-1",
      "service_name": "bedrock",
      "anthropic_version": "bedrock-2023-05-31",
      "endpoint": "bedrock.us-east-1.amazonaws.com",
      "auth": "Sig_V4",
      "content_type": "application/json",
      "max_tokens_to_sample": 8000,
      "temperature": 0.0001,
      "response_filter": "$.completion"
  },
  "credential": {
      "access_key": "<access_key>",
      "secret_key": "<secret_key>"
  },
  "actions": [
    {
      "action_type": "predict",
      "method": "POST",
      "url": "https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke",
      "headers": { 
        "content-type": "application/json",
        "x-amz-content-sha256": "required"
      },
      "request_body": "{\"prompt\":\"${parameters.prompt}\", \"max_tokens_to_sample\":${parameters.max_tokens_to_sample}, \"temperature\":${parameters.temperature},  \"anthropic_version\":\"${parameters.anthropic_version}\" }"
    }
  ]
}

响应包含在后续步骤中使用的连接器 ID。

{
  "connector_id": "xnJjDZABNFJeYR3IPvTO"
}

步骤 6:注册并部署带防护措施的聊天模型

要注册并部署 Anthropic Claude 聊天模型,请发送以下请求。请注意,guardrails 对象包含一个 response_validation_regex 参数,该参数指定只有当防护措施模型响应 accept 的变体时,才将输入/输出视为有效。

POST /_plugins/_ml/models/_register?deploy=true
{
    "name": "Bedrock Claude V2 model with openai guardrails model",
    "function_name": "remote",
    "model_group_id": "ppSmpo8Bi-GZ0tf1i7cD",
    "description": "Bedrock Claude V2 model with openai guardrails model",
    "connector_id": "xnJjDZABNFJeYR3IPvTO",
    "guardrails": {
        "input_guardrail": {
            "model_id": "o3JaDZABNFJeYR3I2fRV",
            "response_validation_regex": "^\\s*\"[Aa]ccept\"\\s*$"
        },
        "output_guardrail": {
            "model_id": "o3JaDZABNFJeYR3I2fRV",
            "response_validation_regex": "^\\s*\"[Aa]ccept\"\\s*$"
        },
        "type": "model"
    }
}

OpenSearch 返回注册操作的任务 ID 和已注册模型的模型 ID。

{
  "task_id": "1nJnDZABNFJeYR3IvfRL",
  "status": "CREATED",
  "model_id": "43JqDZABNFJeYR3IQPQH"
}

步骤 7 (可选):测试带防护措施的聊天模型

您可以通过发送包含和不包含冒犯性词语的预测请求来测试带防护措施的 Anthropic Claude 聊天模型。

首先,发送一个不包含冒犯性词语的请求。

POST /_plugins/_ml/models/43JqDZABNFJeYR3IQPQH/_predict
{
  "parameters": {
    "prompt": "\n\nHuman:${parameters.question}\n\nnAssistant:",
    "question": "hello"
  }
}

OpenSearch 返回 LLM 的答案。

{
  "inference_results": [
    {
      "output": [
        {
          "name": "response",
          "dataAsMap": {
            "response": " Hello!"
          }
        }
      ],
      "status_code": 200
    }
  ]
}

接下来,发送一个包含冒犯性词语的请求。

POST /_plugins/_ml/models/43JqDZABNFJeYR3IQPQH/_predict
{
  "parameters": {
    "prompt": "\n\nHuman:${parameters.question}\n\nnAssistant:",
    "question": "how to rob a bank"
  }
}

OpenSearch 返回错误。

后续步骤