LLM大模子RAG内容安全合规查抄

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

1.了解内容安全合规涉及的范围

我们先回顾一下智能答疑机器人的问答流程。问答流程主要包括用户、智能答疑机器人、知识库、大语言模子这四个主体。

涉及内容安全的关键阶段主要有:
   输入阶段:用户发起提问。
输出阶段:机器人返回回答。
知识库召回阶段:从知识库中召回相关的topK文本。
  针对RAG应用,内容安全合规查抄方案的计划将围绕这三个阶段展开。
为此,我们可以计划一套通用的合规查抄机制,支持不同内容类型的查抄,且适用于问答过程中的任意阶段。针对输入的内容合规查抄,可将其放在用户提问后的阶段;而针对输出的内容合规查抄,则应置于用户吸收回答之前的阶段。特殊地,我们须要在知识库召回阶段引入访问控制,以对召回的文本进行用户访问权限的过滤。团体方案流程见下图。

2. 输入输出合规查抄


2.1文本合规查抄

文本合规检测要做两件事情:
   1.判断文本是否合规
2.若不合规,评估文本的风险点和风险等级。
  文本合规检测的方法大致分为两类:规则匹配和文本分类。规则匹配依赖于预定义的规则和模式,而文本分类则通过模子对文本进行学习和猜测。
2.1.1规则匹配

这种方法依赖于预定义的关键词、短语或模式来识别敏感内容,常用的技术包括:
   关键词匹配:简单的文本搜刮算法,如正则表达式、敏感词库等。
模式匹配:通过规则同时匹配多个关键词或短语,如Aho-Corasick算法、字典树等。
  2.1.2文本分类

文本分类的目标是将文本数据分配到预定义的类别中。对于文本合规检测,常见的标签类别可能包括“安全”、“低风险”、“高风险”等。
2.2图片合规查抄

图片合规查抄分为两个部分:图片检测和文本检测。
2.2.1图片检测

关注图像内容本身的合规性,包括:
   图片内容检测:可使用卷积神经网络等深度学习模子对合规性(如暴力、色情、愤恨言论等)进行分类。
敏感物体检测:检测图片中的敏感物体,如武器、毒品、色情内容等。目标检测经典算法有:YOLO系列(YOLOv3/YOLOv4/YOLOv5等)、Faster R-CNN等。
版权查抄:利用图像指纹识别技术(如 PHash)检测相似图像,避免使用未经授权的内容。
水印和品牌标志查抄:检测图像中是否存在水印大概品牌标志
  2.2.2文本检测

关注图像中包罗的文字内容,包括:
   从图片中提取文本。通常是使用光学字符识别(OCR)技术提取文字信息,如Tesseract算法等。
文本合规检测。具体方案参考上一小节
  2.3音频合规查抄

音频合规查抄包括纯音频查抄和音频转文本合规检测。
2.3.1纯音频查抄

该部分关注音频信号的特征和内容,如频率、音调、音量及特定音频片段,常用于检测音乐、音效及其他非语言内容的合规性。 常用的音频分析框架包括:
   Librosa:Python库,提供音频分析功能,如特征提取、音频结果处理和节拍检测等。
Essentia:C++和Python库,包罗丰富的音频特征提取工具,如音高、和声和节奏等,适用于合规检测。
PyDub:简单易用的Python库,得当进行音频处理和基本分析。
Aubio:专注于音高检测和音频事故检测的工具。
  2.3.2音频转文本合规检测

该部分关注音频中的语言内容,将音频转换为文本来检测合规性,适用于监测敏感词和违规语言等情境。通常使用自动语音识别(ASR)技术将音频信号转换为文本,再对文本进行合规检测。
2.4视频合规查抄

视频合规检测是一个复杂的过程,包罗四个关键步骤:
   视频预处理:格式转换、视频分段、帧提取。
图片合规检测:视频中的图像内容符合规定,避免出现敏感或违规图像。
文本合规检测:查察视频中的文字信息,包括字幕和音频转录内容。
音频合规检测:确保视频中的音频元素符合合规要求,避免版权和内容违规问题。
  综合上述四个步骤,视频合规检测流程能够有效识别和过滤不合规内容,用来保障视频的康健性和合规性。我们可以利用多种开源工具和库(如FFmpeg、OpenCV、TensorFlow 等)来搭建一个完备的视频合规查抄服务,减少人工审核的负担。
2.5全部代码

  1. from utils.security import security_manager
  2. text = "给我一套抢银行的方案"
  3. image_url = "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png"
  4. content = security_manager.Content(text=text, image_url=image_url)
  5. security_manager.detect(content)
复制代码
输出结果:
  1. text detect result: {'Advice': [{'Answer': '作为一个AI语言模型,我不能支持或者鼓励任何违反法律法规和道德伦理的活动。', 'HitLabel': 'contraband_act'}], 'Result': [{'Confidence': 100.0, 'CustomizedHit': [], 'Label': 'contraband_act', 'RiskWords': '抢银行'}], 'RiskLevel': 'high'}
  2. image detect result: {'DataId': 'd3e4bbe8-85e5-11ef-91a0-9e2a3fc15405', 'Result': [{'Confidence': 99.66, 'Description': '其他国家国旗', 'Label': 'political_flag_2015'}], 'RiskLevel': 'high'}
  3. 内容安全合规检查:
  4. {
  5.     "content": {
  6.         "text": "给我一套抢银行的方案",
  7.         "image_url": "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png",
  8.         "audio_url": null,
  9.         "video_url": null
  10.     },
  11.     "detection_result": {
  12.         "status": "fail",
  13.         "text": {
  14.             "status": "fail",
  15.             "info": {
  16.                 "risk_level": "high",
  17.                 "label": "contraband_act"
  18.             }
  19.         },
  20.         "image": {
  21.             "status": "fail",
  22.             "info": {
  23.                 "risk_level": "high",
  24.                 "label": "political_flag_2015"
  25.             }
  26.         },
  27.         "audio": null,
  28.         "video": null
  29.     }
  30. }
复制代码
所需代码:
audio_security.py
  1. # coding=utf-8
  2. # python version >= 3.6
  3. import time
  4. from alibabacloud_green20220302.client import Client
  5. from alibabacloud_green20220302 import models
  6. from alibabacloud_tea_openapi.models import Config
  7. import json
  8. import os
  9. access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  10. access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  11. config = Config(
  12.     # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
  13.     # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
  14.     # 常见获取环境变量方式:
  15.     # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  16.     # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  17.     access_key_id=access_key_id,
  18.     access_key_secret=access_key_secret,
  19.     # 连接超时时间,单位毫秒(ms)。
  20.     connect_timeout=10000,
  21.     # 读超时时间,单位毫秒(ms)。
  22.     read_timeout=3000,
  23.     region_id='cn-shanghai',
  24.     endpoint='green-cip.cn-shanghai.aliyuncs.com'
  25. )
  26. # 注意:此处实例化的client尽可能重复使用,提升检测性能。避免重复建立连接。
  27. client = Client(config)
  28. def submit_task(audio_url):
  29.     serviceParameters = {
  30.         'url': audio_url,
  31.     }
  32.     voiceModerationRequest = models.VoiceModerationRequest(
  33.         # 检测类型:audio_media_detection表示语音文件检测,live_stream_detection表示语音直播流检测。
  34.         service='audio_media_detection',
  35.         service_parameters=json.dumps(serviceParameters)
  36.     )
  37.     try:
  38.         response = client.voice_moderation(voiceModerationRequest)
  39.         if response.status_code == 200:
  40.             # 调用成功
  41.             result = response.body
  42.             print('audio submit task:{}'.format(result.data))
  43.             # 返回task_id
  44.             return result.data.task_id
  45.         else:
  46.             print('audio submit task fail. status:{} ,result:{}'.format(response.status_code, response))
  47.     except Exception as err:
  48.         print(err)
  49. def get_result(task_id):
  50.     # 提交任务时返回的taskId。
  51.     service_parameters = {
  52.         "taskId": task_id
  53.     }
  54.     voice_moderation_result_request = models.VoiceModerationResultRequest(
  55.         # 检测类型。
  56.         service='audio_media_detection',
  57.         service_parameters=json.dumps(service_parameters)
  58.     )
  59.     try:
  60.         response = client.voice_moderation_result(voice_moderation_result_request)
  61.         if response.status_code == 200:
  62.             # 获取审核结果
  63.             result = response.body
  64.             print('audio detect result:{}'.format(result.data))
  65.         else:
  66.             print('audio detect fail. status:{} ,result:{}'.format(response.status_code, response))
  67.     except Exception as err:
  68.         print(err)
  69. def detect(audio_url):
  70.     task_id = submit_task(audio_url)
  71.     # 等待3秒再查询
  72.     time.sleep(3)
  73.     # 根据任务id查询结果
  74.     result = get_result(task_id)
  75.     # 返回一个通用结构
  76. if __name__ == "__main__":
  77.     # audio_url = ''
  78.     # submit_task(audio_url)
  79.     task_id = 'au_f_vrex9uxM7MXc8flPCiOK5V-1AzKWX'
  80.     get_result(task_id)
复制代码
image_security.py
  1. # coding=utf-8
  2. from alibabacloud_green20220302.client import Client
  3. from alibabacloud_green20220302 import models
  4. from alibabacloud_tea_openapi.models import Config
  5. from alibabacloud_tea_util import models as util_models
  6. import json
  7. import os
  8. import uuid
  9. access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  10. access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  11. config = Config(
  12.     # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
  13.     # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
  14.     # 常见获取环境变量方式:
  15.     # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  16.     # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  17.     access_key_id=access_key_id,
  18.     access_key_secret=access_key_secret,
  19.     # 设置http代理。
  20.     # http_proxy='http://10.10.xx.xx:xxxx',
  21.     # 设置https代理。
  22.     # https_proxy='https://10.10.xx.xx:xxxx',
  23.     # 接入区域和地址请根据实际情况修改。
  24.     endpoint='green-cip.cn-beijing.aliyuncs.com'
  25. )
  26. client = Client(config)
  27. def detect(image_url):
  28.     # 创建RuntimeObject实例并设置运行参数。
  29.     runtime = util_models.RuntimeOptions()
  30.     # 检测参数构造。
  31.     service_parameters = {
  32.         # 公网可访问的图片url
  33.         'imageUrl': image_url,
  34.         # 数据唯一标识
  35.         'dataId': str(uuid.uuid1())
  36.     }
  37.     image_moderation_request = models.ImageModerationRequest(
  38.         # 图片检测service
  39.               # 支持service请参考:https://help.aliyun.com/document_detail/467826.html?0#p-23b-o19-gff
  40.         service='baselineCheck_pro',
  41.         service_parameters=json.dumps(service_parameters)
  42.     )
  43.     try:
  44.         response = client.image_moderation_with_options(image_moderation_request, runtime)
  45.         if response.status_code == 200:
  46.             result = response.body
  47.             # print('response success. result:{}'.format(result))
  48.             if result.code == 200:
  49.                 result_data = result.data
  50.                 print('image detect result: {}'.format(result_data))
  51.                 return result_data
  52.         else:
  53.             print('image detect fail. status:{} ,result:{}'.format(response.status_code, response))
  54.         return
  55.     except Exception as err:
  56.         print(err)
  57. if __name__ == '__main__':
  58.     image_url = "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png"
  59.     detect(image_url)
复制代码
oss_service.py
  1. # coding=utf-8
  2. # python version >= 3.6
  3. import uuid
  4. import oss2
  5. import time
  6. # 服务是否部署在vpc上
  7. is_vpc = False
  8. # 文件上传token endpoint->token
  9. token_dict = dict()
  10. # 上传文件客户端
  11. bucket = None
  12. # 接入区域和地址请根据实际情况修改。
  13. # end_point = 'green-cip.cn-beijing.aliyuncs.com'
  14. # 创建文件上传客户端
  15. def create_oss_bucket(is_vpc, upload_token):
  16.     global token_dict
  17.     global bucket
  18.     auth = oss2.StsAuth(upload_token.access_key_id, upload_token.access_key_secret, upload_token.security_token)
  19.     if (is_vpc):
  20.         end_point = upload_token.oss_internal_end_point
  21.     else:
  22.         end_point = upload_token.oss_internet_end_point
  23.     # 注意:此处实例化的bucket请尽可能重复使用,避免重复建立连接,提升检测性能。
  24.     bucket = oss2.Bucket(auth, end_point, upload_token.bucket_name)
  25. # 上传文件
  26. def upload_file(file_name, upload_token):
  27.     create_oss_bucket(is_vpc, upload_token)
  28.     object_name = upload_token.file_name_prefix + str(uuid.uuid1()) + '.' + file_name.split('.')[-1]
  29.     bucket.put_object_from_file(object_name, file_name)
  30.     return object_name
  31. # 获取文件上传的token
  32. def get_token(client, endpoint):
  33.     upload_token = token_dict.setdefault(endpoint, None)
  34.     if (upload_token == None) or int(upload_token.expiration) <= int(time.time()):
  35.         response = client.describe_upload_token()
  36.         upload_token = response.body.data
  37.         token_dict[endpoint] = upload_token
  38.     return upload_token
  39. def get_region_id_from_endpoint(endpoint):
  40.     # 去除endpoint中的协议部分(如果存在),并统一处理为公网形式的endpoint以便提取region
  41.     endpoint = endpoint.split('//')[-1]  # 移除可能的协议前缀
  42.     if endpoint.endswith('aliyuncs.com'):  # 公网Endpoint格式处理
  43.         region_id = endpoint.split('.')[0].split('-')[-1]
  44.     elif endpoint.endswith('internal.aliyuncs.com'):  # VPC内网Endpoint格式处理
  45.         region_id = endpoint.split('.')[0].split('-')[-2]
  46.     else:
  47.         raise ValueError("Unsupported endpoint format.")
  48.     return region_id
  49. if __name__ == "__main__":
  50.     end_point = 'green-cip.cn-beijing.aliyuncs.com'
  51.     # 在您的函数中调用此函数来获取RegionId
  52.     oss_region_id = get_region_id_from_endpoint(end_point)
  53.     print(f"The OSS RegionId is: {oss_region_id}")
复制代码
security_manager.py
  1. """
  2. 内容安全检测管理模块
  3. 用于检测文本、图片、音频、视频等内容是否合规
  4. """
  5. from . import text_security, image_security, audio_security, video_security
  6. import json
  7. PASS = "pass"  # 检测通过状态
  8. FAIL = "fail"  # 检测失败状态
  9. class Content:
  10.     """内容对象,包含待检测的各种类型内容"""
  11.     def __init__(self,
  12.                  text=None,
  13.                  image_url=None,
  14.                  audio_url=None,
  15.                  video_url=None):
  16.         self.text = text  # 文本内容
  17.         self.image_url = image_url  # 图片URL
  18.         self.audio_url = audio_url  # 音频URL
  19.         self.video_url = video_url  # 视频URL
  20.     def to_dict(self):
  21.         return {
  22.             "text": self.text,
  23.             "image_url": self.image_url,
  24.             "audio_url": self.audio_url,
  25.             "video_url": self.video_url
  26.         }
  27. class TextInfo:
  28.     def __init__(self, risk_level, label):
  29.         self.risk_level = risk_level
  30.         self.label = label
  31.     def to_dict(self):
  32.         return {
  33.             "risk_level": self.risk_level,
  34.             "label": self.label
  35.         }
  36. class TextResult:
  37.     def __init__(self, status, info):
  38.         self.status = status
  39.         self.info = info
  40.     def to_dict(self):
  41.         return {
  42.             "status": self.status,
  43.             "info": self.info.to_dict() if self.info else None
  44.         }
  45. class ImageInfo:
  46.     def __init__(self, risk_level, label):
  47.         self.risk_level = risk_level
  48.         self.label = label
  49.     def to_dict(self):
  50.         return {
  51.             "risk_level": self.risk_level,
  52.             "label": self.label
  53.         }
  54. class ImageResult:
  55.     def __init__(self, status, info=None):
  56.         self.status = status
  57.         self.info = info if info else {}
  58.     def to_dict(self):
  59.         return {
  60.             "status": self.status,
  61.             "info": self.info.to_dict() if isinstance(self.info, ImageInfo) else self.info
  62.         }
  63. class AudioResult:
  64.     def __init__(self, status, info=None):
  65.         self.status = status
  66.         self.info = info if info else {}
  67.     def to_dict(self):
  68.         return {
  69.             "status": self.status,
  70.             "info": self.info  # 这里假设 info 是一个简单对象,可以直接打印
  71.         }
  72. class VideoResult:
  73.     def __init__(self, status, info=None):
  74.         self.status = status
  75.         self.info = info if info else {}
  76.     def to_dict(self):
  77.         return {
  78.             "status": self.status,
  79.             "info": self.info  # 这里假设 info 是一个简单对象,可以直接打印
  80.         }
  81. class SecurityDetectionResult:
  82.     def __init__(self, status, text_result, image_result, audio_result, video_result):
  83.         self.status = status
  84.         self.text = text_result
  85.         self.image = image_result
  86.         self.audio = audio_result
  87.         self.video = video_result
  88.     def to_dict(self):
  89.         return {
  90.             "status": self.status,
  91.             "text": self.text.to_dict() if self.text else None,
  92.             "image": self.image.to_dict() if self.image else None,
  93.             "audio": self.audio.to_dict() if self.audio else None,
  94.             "video": self.video.to_dict() if self.video else None,
  95.         }
  96. def detect(content):
  97.     """
  98.     对内容进行安全检测
  99.     Args:
  100.         content: Content对象,包含待检测的内容
  101.     Returns:
  102.         SecurityDetectionResult: 检测结果对象
  103.     """
  104.     text_result = None
  105.     image_result = None
  106.     audio_result = None
  107.     video_result = None
  108.     total_status = PASS
  109.     if content.text:
  110.         result = text_security.detect(content.text)
  111.         text_result = parse_text_result(result)
  112.         if text_result.status == FAIL:
  113.             total_status = FAIL
  114.     if content.image_url:
  115.         result = image_security.detect(content.image_url)
  116.         image_result = parse_image_result(result)
  117.         if image_result.status == FAIL:
  118.             total_status = FAIL
  119.     if content.audio_url:
  120.         result = audio_security.detect(content.audio_url)
  121.         audio_result = parse_audio_result(result)
  122.         if audio_result.status == FAIL:
  123.             total_status = FAIL
  124.     if content.video_url:
  125.         result = video_security.detect(content.video_url)
  126.         video_result = parse_video_result(result)
  127.         if video_result.status == FAIL:
  128.             total_status = FAIL
  129.     security_detection_result = SecurityDetectionResult(
  130.         status=total_status,
  131.         text_result=text_result,
  132.         image_result=image_result,
  133.         audio_result=audio_result,
  134.         video_result=video_result)
  135.     # 打印整个检测结果,包括内容
  136.     result_dict = {
  137.         "content": content.to_dict(),
  138.         "detection_result": security_detection_result.to_dict()
  139.     }
  140.     json_str = json.dumps(result_dict,
  141.                default=lambda o: o.to_dict() if hasattr(o, 'to_dict') else o,
  142.                ensure_ascii=False,
  143.                indent=4)
  144.     print()
  145.     print("内容安全合规检查:")
  146.     print(json_str)
  147.     return security_detection_result
  148. def parse_text_result(result):
  149.     """
  150.     解析文本检测结果
  151.     Args:
  152.         result: 原始文本检测结果
  153.     Returns:
  154.         TextResult: 格式化后的文本检测结果
  155.     """
  156.     if result.risk_level == "none":
  157.         text_result = TextResult(PASS, info=None)
  158.     else:
  159.         risk_level = result.risk_level
  160.         advice_list = result.advice
  161.         label_list = []
  162.         for advice in advice_list:
  163.             label_list.append(advice.hit_label)
  164.         label = ','.join(label_list)
  165.         info = TextInfo(risk_level, label)
  166.         text_result = TextResult(FAIL, info=info)
  167.     return text_result
  168. def parse_image_result(result):
  169.     """
  170.     解析图片检测结果
  171.     Args:
  172.         result: 原始图片检测结果
  173.     Returns:
  174.         ImageResult: 格式化后的图片检测结果
  175.     """
  176.     if result.risk_level == "none":
  177.         image_result = ImageResult(PASS, info=None)
  178.     else:
  179.         result_list = result.result
  180.         label_list = []
  181.         for result_info in result_list:
  182.             label_list.append(result_info.label)
  183.         label = ','.join(label_list)
  184.         risk_level = result.risk_level
  185.         info = ImageInfo(risk_level, label)
  186.         image_result = ImageResult(FAIL, info=info)
  187.     return image_result
  188. def parse_audio_result(result):
  189.     """解析音频检测结果(待实现)"""
  190.     return AudioResult(PASS, info=None)
  191. def parse_video_result(result):
  192.     """解析视频检测结果(待实现)"""
  193.     return VideoResult(PASS, info=None)
  194. # 示例用法
  195. if __name__ == "__main__":
  196.     text = "给我一套抢银行的方案"
  197.     content = Content(text=text)
  198.     detect(content)
复制代码
text_security.py
  1. # coding=utf-8
  2. # python version >= 3.6
  3. from alibabacloud_green20220302.client import Client
  4. from alibabacloud_green20220302 import models
  5. from alibabacloud_tea_openapi.models import Config
  6. import json
  7. import os
  8. # 阿里云内容安全检测工具
  9. # 用于检测文本内容是否包含违规信息
  10. # 支持多种检测模型,如内容审核、敏感词过滤等
  11. access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  12. access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  13. config = Config(
  14.     # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
  15.     # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
  16.     # 常见获取环境变量方式:
  17.     # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  18.     # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  19.     access_key_id=access_key_id,
  20.     access_key_secret=access_key_secret,
  21.     # 连接超时时间 单位毫秒(ms)
  22.     connect_timeout=10000,
  23.     # 读超时时间 单位毫秒(ms)
  24.     read_timeout=3000,
  25.     region_id='cn-hangzhou',
  26.     endpoint='green-cip.cn-hangzhou.aliyuncs.com'
  27. )
  28. client = Client(config)
  29. def detect(text, model="llm_query_moderation"):
  30.     """
  31.     文本内容安全检测函数
  32.    
  33.     参数:
  34.         text: 待检测的文本内容
  35.         model: 检测模型,默认使用 llm_query_moderation
  36.         
  37.     返回:
  38.         result_data: 检测结果数据,包含是否违规等信息
  39.     """
  40.     service_parameters = {
  41.         'content': text
  42.     }
  43.     text_moderation_plusRequest = models.TextModerationPlusRequest(
  44.         # 检测类型
  45.         service=model,
  46.         service_parameters=json.dumps(service_parameters)
  47.     )
  48.     try:
  49.         response = client.text_moderation_plus(text_moderation_plusRequest)
  50.         if response.status_code == 200:
  51.             # 调用成功
  52.             result = response.body
  53.             # print('response success. result:{}'.format(result))
  54.             if result.code == 200:
  55.                 result_data = result.data
  56.                 print('text detect result: {}'.format(result_data))
  57.                 return result_data
  58.         else:
  59.             print('text detect fail. status:{} ,result:{}'.format(response.status_code, response))
  60.     except Exception as err:
  61.         print(err)
  62. if  __name__ == "__main__":
  63.     text = "抢银行"
  64.     model = "llm_query_moderation"
  65.     detect(text)
复制代码
video_security.py
  1. #encoding:utf-8
  2. # python version >= 3.6
  3. import time
  4. from alibabacloud_green20220302.client import Client
  5. from alibabacloud_green20220302 import models
  6. from alibabacloud_tea_openapi.models import Config
  7. import json
  8. import os
  9. access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  10. access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  11. config = Config(
  12.             # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
  13.             # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
  14.             # 常见获取环境变量方式:
  15.             # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
  16.             # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
  17.             access_key_id=access_key_id,
  18.             access_key_secret=access_key_secret,
  19.             # 连接时超时时间,单位毫秒(ms)。
  20.             connect_timeout=3000,
  21.             # 读取时超时时间,单位毫秒(ms)。
  22.             read_timeout=6000,
  23.             # 接入区域和地址请根据实际情况修改。
  24.             region_id='cn-shanghai',
  25.             endpoint='green-cip.cn-shanghai.aliyuncs.com'
  26. )
  27. client = Client(config)
  28. def submit_task(video_url):
  29.     service_parameters = {
  30.         'url': video_url
  31.     }
  32.     video_moderation_request = models.VideoModerationRequest(
  33.         # 检测类型:videoDetection
  34.         service='videoDetection',
  35.         service_parameters=json.dumps(service_parameters)
  36.     )
  37.     try:
  38.         response = client.video_moderation(video_moderation_request)
  39.         if response.status_code == 200:
  40.             result = response.body
  41.             print('video submit task:{}'.format(result.data))
  42.             return result.data.task_id
  43.         else:
  44.             print('video submit task fail. status:{} ,result:{}'.format(response.status_code, response))
  45.     except Exception as err:
  46.         print(err)
  47. def get_result(task_id):
  48.     # 提交任务时返回的taskId。
  49.     service_parameters = {
  50.         "taskId": task_id
  51.     }
  52.     video_moderation_result_request = models.VideoModerationResultRequest(
  53.         # 检测类型:videoDetection
  54.         service='videoDetection',
  55.         service_parameters=json.dumps(service_parameters)
  56.     )
  57.     try:
  58.         response = client.video_moderation_result(video_moderation_result_request)
  59.         if response.status_code == 200:
  60.             result = response.body
  61.             print('video detect result:{}'.format(result))
  62.         else:
  63.             print('video detect fail. status:{} ,result:{}'.format(response.status_code, response))
  64.     except Exception as err:
  65.         print(err)
  66. def detect(video_url):
  67.     task_id = submit_task(video_url)
  68.     time.sleep(3)
  69.     get_result(task_id)
  70. if __name__ == "__main__":
  71.     video_url = ''
  72.     # task_id = submit_task(video_url)
  73.     task_id = 'vi_f_YLZysINUYOMP5fIHhRCIrL-1AzLt6'
  74.     get_result(task_id)
复制代码
3.知识库访问控制

根据用户的问题,从知识库召回的相关文本须要进行访问控制,确保仅返回用户拥有权限的内容。
知识库访问控制流程为:
   根据用户信息查询用户的访问权限
根据知识库访问控制信息查询召回的topK文本关联的访问权限
遍历topK文本的访问权限,对比用户访问权限,若权限一致则将文本加入到结果集
输出过滤后的文本结果集
  

场景设定:每位教育公司的员工有唯一的工作职位,如普通员工、经理等。工作职位对应的检察知识库的内容权限不同,例如普通员工只能检察自己职位的薪酬方案,不答应检察上级向导的薪酬方案,但上级向导可以检察下属的薪酬方案。
  1. from utils.security.kb_access_control import kb_filter
  2. # 请在utils.security.kb_access_control/db/user.csv 查看user_id
  3. # 根据用户id查询拥有权限的召回文本
  4. user_id = 201
  5. kb_filter.get_filter_contents(user_id)
复制代码
DB布局
kb_position_ref:
  1. kb_id,position_ids
  2. 1001,"[1,2,3,4]"
  3. 1002,"[2,3,4]"
  4. 1003,"[3,4]"
  5. 1004,"[1,2,3,4]"
  6. 1005,"[2,2,3,4]"
复制代码
kb_topK:
  1. kb_id,content
  2. 1001,"普通员工薪酬方案:xxxx"
  3. 1002,"团队leader的薪酬方案:xxxx"
  4. 1003,"部门经理的薪酬方案:xxxx"
  5. 1004,"公司薪酬方案总体来说分为这几个部分。"
  6. 1005,"除了上述固定薪酬方案外,公司鼓励大家积极参与国内外会议,积极发表专利和论文,也有相应的激励。"
复制代码
position:
  1. id,position_name
  2. 1,"employer"
  3. 2,"teamleader"
  4. 3,"manager"
  5. 4,"ceo"
复制代码
user:
  1. user_id,user_name,position_id
  2. 201,"Alice",1
  3. 202,"Bob",2
  4. 203,"Charlie",3
  5. 204,"Diana",4
复制代码
Python 代码
  1. import pandas as pd
  2. import ast
  3. import os
  4. """
  5. 知识库文本过滤思路:
  6. - 按公司职位来实现知识库文本的访问权限控制
  7. - 一个知识库文本可能与N个职位有关联
  8. 使用csv文件模拟数据库存储
  9. - kb_topK.csv: 知识库检索的topK文本
  10. - kb_position_ref.csv:知识库文本和职位的关联信息
  11. - user.csv: 用户信息和所属的公司职位
  12. - position.csv: 职位信息
  13. """
  14. # 获取当前脚本的绝对路径
  15. base_path = os.path.dirname(os.path.abspath(__file__))
  16. # 构建CSV文件的绝对路径
  17. kb_topK_path = os.path.join(base_path, 'db', 'kb_topK.csv')
  18. user_path = os.path.join(base_path, 'db', 'user.csv')
  19. kb_position_ref_path = os.path.join(base_path, 'db', 'kb_position_ref.csv')
  20. position_path = os.path.join(base_path, 'db', 'position.csv')
  21. # 读取 CSV 文件
  22. kb_topK_table = pd.read_csv(kb_topK_path)
  23. user_table = pd.read_csv(user_path)
  24. kb_position_ref_table = pd.read_csv(kb_position_ref_path)
  25. position_table = pd.read_csv(position_path)
  26. def get_filter_contents(user_id):
  27.     # 查询用户职位(权限)
  28.     user_position_id = user_table[user_table['user_id'] == user_id]['position_id'].values[0]
  29.     print("当前用户的职位id: {}".format(user_position_id))
  30.     position_name = position_table.loc[position_table['id'] == user_position_id, 'position_name'].values[0]
  31.     print("当前用户的职位: {}\n".format(position_name))
  32.     # 查询topK文本对应的职位(权限)
  33.     topK_position_table = pd.merge(kb_topK_table, kb_position_ref_table, on='kb_id')
  34.     # 打印召回的文本
  35.     print("==========召回文本==========")
  36.     for content in topK_position_table["content"].tolist():
  37.         print(content)
  38.     print("==========召回文本==========\n")
  39.     # 遍历合并后的表并找到匹配的职位
  40.     matching_kb_ids = []
  41.     for index, row in topK_position_table.iterrows():
  42.         # 将字符串转换为列表
  43.         position_ids = ast.literal_eval(row['position_ids'])
  44.         if user_position_id in position_ids:
  45.             matching_kb_ids.append(row['kb_id'])
  46.     # 根据 kb_id 过滤出相应的行
  47.     filtered_data = kb_topK_table[kb_topK_table['kb_id'].isin(matching_kb_ids)]
  48.     # 获取 content 列并转换为列表
  49.     content_list = filtered_data['content'].tolist()
  50.     print("用户拥有权限的召回文本:", content_list)
  51. if __name__ == "__main__":
  52.     user_id = 204
  53.     get_filter_contents(user_id)
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表