当前位置: 首页 > news >正文

LLM大模型RAG内容安全合规检查

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所有代码

from utils.security import security_managertext = "给我一套抢银行的方案"
image_url = "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png"
content = security_manager.Content(text=text, image_url=image_url)
security_manager.detect(content)

输出结果:

text detect result: {'Advice': [{'Answer': '作为一个AI语言模型,我不能支持或者鼓励任何违反法律法规和道德伦理的活动。', 'HitLabel': 'contraband_act'}], 'Result': [{'Confidence': 100.0, 'CustomizedHit': [], 'Label': 'contraband_act', 'RiskWords': '抢银行'}], 'RiskLevel': 'high'}
image detect result: {'DataId': 'd3e4bbe8-85e5-11ef-91a0-9e2a3fc15405', 'Result': [{'Confidence': 99.66, 'Description': '其他国家国旗', 'Label': 'political_flag_2015'}], 'RiskLevel': 'high'}内容安全合规检查:
{"content": {"text": "给我一套抢银行的方案","image_url": "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png","audio_url": null,"video_url": null},"detection_result": {"status": "fail","text": {"status": "fail","info": {"risk_level": "high","label": "contraband_act"}},"image": {"status": "fail","info": {"risk_level": "high","label": "political_flag_2015"}},"audio": null,"video": null}
}

所需代码:
audio_security.py

# coding=utf-8
# python version >= 3.6
import timefrom alibabacloud_green20220302.client import Client
from alibabacloud_green20220302 import models
from alibabacloud_tea_openapi.models import Config
import json
import osaccess_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']config = Config(# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。# 常见获取环境变量方式:# 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']# 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']access_key_id=access_key_id,access_key_secret=access_key_secret,# 连接超时时间,单位毫秒(ms)。connect_timeout=10000,# 读超时时间,单位毫秒(ms)。read_timeout=3000,region_id='cn-shanghai',endpoint='green-cip.cn-shanghai.aliyuncs.com'
)# 注意:此处实例化的client尽可能重复使用,提升检测性能。避免重复建立连接。
client = Client(config)def submit_task(audio_url):serviceParameters = {'url': audio_url,}voiceModerationRequest = models.VoiceModerationRequest(# 检测类型:audio_media_detection表示语音文件检测,live_stream_detection表示语音直播流检测。service='audio_media_detection',service_parameters=json.dumps(serviceParameters))try:response = client.voice_moderation(voiceModerationRequest)if response.status_code == 200:# 调用成功result = response.bodyprint('audio submit task:{}'.format(result.data))# 返回task_idreturn result.data.task_idelse:print('audio submit task fail. status:{} ,result:{}'.format(response.status_code, response))except Exception as err:print(err)def get_result(task_id):# 提交任务时返回的taskId。service_parameters = {"taskId": task_id}voice_moderation_result_request = models.VoiceModerationResultRequest(# 检测类型。service='audio_media_detection',service_parameters=json.dumps(service_parameters))try:response = client.voice_moderation_result(voice_moderation_result_request)if response.status_code == 200:# 获取审核结果result = response.bodyprint('audio detect result:{}'.format(result.data))else:print('audio detect fail. status:{} ,result:{}'.format(response.status_code, response))except Exception as err:print(err)def detect(audio_url):task_id = submit_task(audio_url)# 等待3秒再查询time.sleep(3)# 根据任务id查询结果result = get_result(task_id)# 返回一个通用结构if __name__ == "__main__":# audio_url = ''# submit_task(audio_url)task_id = 'au_f_vrex9uxM7MXc8flPCiOK5V-1AzKWX'get_result(task_id)

image_security.py

# coding=utf-8from alibabacloud_green20220302.client import Client
from alibabacloud_green20220302 import models
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util import models as util_models
import json
import os
import uuidaccess_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']config = Config(# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。# 常见获取环境变量方式:# 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']# 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']access_key_id=access_key_id,access_key_secret=access_key_secret,# 设置http代理。# http_proxy='http://10.10.xx.xx:xxxx',# 设置https代理。# https_proxy='https://10.10.xx.xx:xxxx',# 接入区域和地址请根据实际情况修改。endpoint='green-cip.cn-beijing.aliyuncs.com'
)
client = Client(config)def detect(image_url):# 创建RuntimeObject实例并设置运行参数。runtime = util_models.RuntimeOptions()# 检测参数构造。service_parameters = {# 公网可访问的图片url'imageUrl': image_url,# 数据唯一标识'dataId': str(uuid.uuid1())}image_moderation_request = models.ImageModerationRequest(# 图片检测service# 支持service请参考:https://help.aliyun.com/document_detail/467826.html?0#p-23b-o19-gffservice='baselineCheck_pro',service_parameters=json.dumps(service_parameters))try:response = client.image_moderation_with_options(image_moderation_request, runtime)if response.status_code == 200:result = response.body# print('response success. result:{}'.format(result))if result.code == 200:result_data = result.dataprint('image detect result: {}'.format(result_data))return result_dataelse:print('image detect fail. status:{} ,result:{}'.format(response.status_code, response))returnexcept Exception as err:print(err)if __name__ == '__main__':image_url = "https://img.alicdn.com/imgextra/i2/O1CN01M5Cie31udzY84ppIw_!!6000000006061-2-tps-300-158.png"detect(image_url)

oss_service.py

# coding=utf-8
# python version >= 3.6
import uuid
import oss2
import time# 服务是否部署在vpc上
is_vpc = False
# 文件上传token endpoint->token
token_dict = dict()
# 上传文件客户端
bucket = None
# 接入区域和地址请根据实际情况修改。
# end_point = 'green-cip.cn-beijing.aliyuncs.com'# 创建文件上传客户端
def create_oss_bucket(is_vpc, upload_token):global token_dictglobal bucketauth = oss2.StsAuth(upload_token.access_key_id, upload_token.access_key_secret, upload_token.security_token)if (is_vpc):end_point = upload_token.oss_internal_end_pointelse:end_point = upload_token.oss_internet_end_point# 注意:此处实例化的bucket请尽可能重复使用,避免重复建立连接,提升检测性能。bucket = oss2.Bucket(auth, end_point, upload_token.bucket_name)# 上传文件
def upload_file(file_name, upload_token):create_oss_bucket(is_vpc, upload_token)object_name = upload_token.file_name_prefix + str(uuid.uuid1()) + '.' + file_name.split('.')[-1]bucket.put_object_from_file(object_name, file_name)return object_name# 获取文件上传的token
def get_token(client, endpoint):upload_token = token_dict.setdefault(endpoint, None)if (upload_token == None) or int(upload_token.expiration) <= int(time.time()):response = client.describe_upload_token()upload_token = response.body.datatoken_dict[endpoint] = upload_tokenreturn upload_tokendef get_region_id_from_endpoint(endpoint):# 去除endpoint中的协议部分(如果存在),并统一处理为公网形式的endpoint以便提取regionendpoint = endpoint.split('//')[-1]  # 移除可能的协议前缀if endpoint.endswith('aliyuncs.com'):  # 公网Endpoint格式处理region_id = endpoint.split('.')[0].split('-')[-1]elif endpoint.endswith('internal.aliyuncs.com'):  # VPC内网Endpoint格式处理region_id = endpoint.split('.')[0].split('-')[-2]else:raise ValueError("Unsupported endpoint format.")return region_idif __name__ == "__main__":end_point = 'green-cip.cn-beijing.aliyuncs.com'# 在您的函数中调用此函数来获取RegionIdoss_region_id = get_region_id_from_endpoint(end_point)print(f"The OSS RegionId is: {oss_region_id}")

security_manager.py

"""
内容安全检测管理模块
用于检测文本、图片、音频、视频等内容是否合规
"""from . import text_security, image_security, audio_security, video_security
import jsonPASS = "pass"  # 检测通过状态
FAIL = "fail"  # 检测失败状态class Content:"""内容对象,包含待检测的各种类型内容"""def __init__(self,text=None,image_url=None,audio_url=None,video_url=None):self.text = text  # 文本内容self.image_url = image_url  # 图片URLself.audio_url = audio_url  # 音频URLself.video_url = video_url  # 视频URLdef to_dict(self):return {"text": self.text,"image_url": self.image_url,"audio_url": self.audio_url,"video_url": self.video_url}class TextInfo:def __init__(self, risk_level, label):self.risk_level = risk_levelself.label = labeldef to_dict(self):return {"risk_level": self.risk_level,"label": self.label}class TextResult:def __init__(self, status, info):self.status = statusself.info = infodef to_dict(self):return {"status": self.status,"info": self.info.to_dict() if self.info else None}class ImageInfo:def __init__(self, risk_level, label):self.risk_level = risk_levelself.label = labeldef to_dict(self):return {"risk_level": self.risk_level,"label": self.label}class ImageResult:def __init__(self, status, info=None):self.status = statusself.info = info if info else {}def to_dict(self):return {"status": self.status,"info": self.info.to_dict() if isinstance(self.info, ImageInfo) else self.info}class AudioResult:def __init__(self, status, info=None):self.status = statusself.info = info if info else {}def to_dict(self):return {"status": self.status,"info": self.info  # 这里假设 info 是一个简单对象,可以直接打印}class VideoResult:def __init__(self, status, info=None):self.status = statusself.info = info if info else {}def to_dict(self):return {"status": self.status,"info": self.info  # 这里假设 info 是一个简单对象,可以直接打印}class SecurityDetectionResult:def __init__(self, status, text_result, image_result, audio_result, video_result):self.status = statusself.text = text_resultself.image = image_resultself.audio = audio_resultself.video = video_resultdef to_dict(self):return {"status": self.status,"text": self.text.to_dict() if self.text else None,"image": self.image.to_dict() if self.image else None,"audio": self.audio.to_dict() if self.audio else None,"video": self.video.to_dict() if self.video else None,}def detect(content):"""对内容进行安全检测Args:content: Content对象,包含待检测的内容Returns:SecurityDetectionResult: 检测结果对象"""text_result = Noneimage_result = Noneaudio_result = Nonevideo_result = Nonetotal_status = PASSif content.text:result = text_security.detect(content.text)text_result = parse_text_result(result)if text_result.status == FAIL:total_status = FAILif content.image_url:result = image_security.detect(content.image_url)image_result = parse_image_result(result)if image_result.status == FAIL:total_status = FAILif content.audio_url:result = audio_security.detect(content.audio_url)audio_result = parse_audio_result(result)if audio_result.status == FAIL:total_status = FAILif content.video_url:result = video_security.detect(content.video_url)video_result = parse_video_result(result)if video_result.status == FAIL:total_status = FAILsecurity_detection_result = SecurityDetectionResult(status=total_status,text_result=text_result,image_result=image_result,audio_result=audio_result,video_result=video_result)# 打印整个检测结果,包括内容result_dict = {"content": content.to_dict(),"detection_result": security_detection_result.to_dict()}json_str = json.dumps(result_dict,default=lambda o: o.to_dict() if hasattr(o, 'to_dict') else o,ensure_ascii=False,indent=4)print()print("内容安全合规检查:")print(json_str)return security_detection_resultdef parse_text_result(result):"""解析文本检测结果Args:result: 原始文本检测结果Returns:TextResult: 格式化后的文本检测结果"""if result.risk_level == "none":text_result = TextResult(PASS, info=None)else:risk_level = result.risk_leveladvice_list = result.advicelabel_list = []for advice in advice_list:label_list.append(advice.hit_label)label = ','.join(label_list)info = TextInfo(risk_level, label)text_result = TextResult(FAIL, info=info)return text_resultdef parse_image_result(result):"""解析图片检测结果Args:result: 原始图片检测结果Returns:ImageResult: 格式化后的图片检测结果"""if result.risk_level == "none":image_result = ImageResult(PASS, info=None)else:result_list = result.resultlabel_list = []for result_info in result_list:label_list.append(result_info.label)label = ','.join(label_list)risk_level = result.risk_levelinfo = ImageInfo(risk_level, label)image_result = ImageResult(FAIL, info=info)return image_resultdef parse_audio_result(result):"""解析音频检测结果(待实现)"""return AudioResult(PASS, info=None)def parse_video_result(result):"""解析视频检测结果(待实现)"""return VideoResult(PASS, info=None)# 示例用法
if __name__ == "__main__":text = "给我一套抢银行的方案"content = Content(text=text)detect(content)

text_security.py

# coding=utf-8
# python version >= 3.6
from alibabacloud_green20220302.client import Client
from alibabacloud_green20220302 import models
from alibabacloud_tea_openapi.models import Config
import json
import os# 阿里云内容安全检测工具
# 用于检测文本内容是否包含违规信息
# 支持多种检测模型,如内容审核、敏感词过滤等access_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']config = Config(# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。# 常见获取环境变量方式:# 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']# 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']access_key_id=access_key_id,access_key_secret=access_key_secret,# 连接超时时间 单位毫秒(ms)connect_timeout=10000,# 读超时时间 单位毫秒(ms)read_timeout=3000,region_id='cn-hangzhou',endpoint='green-cip.cn-hangzhou.aliyuncs.com'
)
client = Client(config)def detect(text, model="llm_query_moderation"):"""文本内容安全检测函数参数:text: 待检测的文本内容model: 检测模型,默认使用 llm_query_moderation返回:result_data: 检测结果数据,包含是否违规等信息"""service_parameters = {'content': text}text_moderation_plusRequest = models.TextModerationPlusRequest(# 检测类型service=model,service_parameters=json.dumps(service_parameters))try:response = client.text_moderation_plus(text_moderation_plusRequest)if response.status_code == 200:# 调用成功result = response.body# print('response success. result:{}'.format(result))if result.code == 200:result_data = result.dataprint('text detect result: {}'.format(result_data))return result_dataelse:print('text detect fail. status:{} ,result:{}'.format(response.status_code, response))except Exception as err:print(err)if  __name__ == "__main__":text = "抢银行"model = "llm_query_moderation"detect(text)

video_security.py

#encoding:utf-8
# python version >= 3.6
import timefrom alibabacloud_green20220302.client import Client
from alibabacloud_green20220302 import models
from alibabacloud_tea_openapi.models import Config
import json
import osaccess_key_id = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']config = Config(# 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。# 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。# 常见获取环境变量方式:# 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']# 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']access_key_id=access_key_id,access_key_secret=access_key_secret,# 连接时超时时间,单位毫秒(ms)。connect_timeout=3000,# 读取时超时时间,单位毫秒(ms)。read_timeout=6000,# 接入区域和地址请根据实际情况修改。region_id='cn-shanghai',endpoint='green-cip.cn-shanghai.aliyuncs.com'
)client = Client(config)def submit_task(video_url):service_parameters = {'url': video_url}video_moderation_request = models.VideoModerationRequest(# 检测类型:videoDetectionservice='videoDetection',service_parameters=json.dumps(service_parameters))try:response = client.video_moderation(video_moderation_request)if response.status_code == 200:result = response.bodyprint('video submit task:{}'.format(result.data))return result.data.task_idelse:print('video submit task fail. status:{} ,result:{}'.format(response.status_code, response))except Exception as err:print(err)def get_result(task_id):# 提交任务时返回的taskId。service_parameters = {"taskId": task_id}video_moderation_result_request = models.VideoModerationResultRequest(# 检测类型:videoDetectionservice='videoDetection',service_parameters=json.dumps(service_parameters))try:response = client.video_moderation_result(video_moderation_result_request)if response.status_code == 200:result = response.bodyprint('video detect result:{}'.format(result))else:print('video detect fail. status:{} ,result:{}'.format(response.status_code, response))except Exception as err:print(err)def detect(video_url):task_id = submit_task(video_url)time.sleep(3)get_result(task_id)if __name__ == "__main__":video_url = ''# task_id = submit_task(video_url)task_id = 'vi_f_YLZysINUYOMP5fIHhRCIrL-1AzLt6'get_result(task_id)

3.知识库访问控制

根据用户的问题,从知识库召回的相关文本需要进行访问控制,确保仅返回用户拥有权限的内容。

知识库访问控制流程为:

根据用户信息查询用户的访问权限
根据知识库访问控制信息查询召回的topK文本关联的访问权限
遍历topK文本的访问权限,对比用户访问权限,若权限一致则将文本加入到结果集
输出过滤后的文本结果集

在这里插入图片描述
场景设定:每位教育公司的员工有唯一的工作职位,如普通员工、经理等。工作职位对应的查看知识库的内容权限不同,例如普通员工只能查看自己职位的薪酬方案,不允许查看上级领导的薪酬方案,但上级领导可以查看下属的薪酬方案。

from utils.security.kb_access_control import kb_filter# 请在utils.security.kb_access_control/db/user.csv 查看user_id
# 根据用户id查询拥有权限的召回文本
user_id = 201
kb_filter.get_filter_contents(user_id)

DB结构
kb_position_ref:

kb_id,position_ids
1001,"[1,2,3,4]"
1002,"[2,3,4]"
1003,"[3,4]"
1004,"[1,2,3,4]"
1005,"[2,2,3,4]"

kb_topK:

kb_id,content
1001,"普通员工薪酬方案:xxxx"
1002,"团队leader的薪酬方案:xxxx"
1003,"部门经理的薪酬方案:xxxx"
1004,"公司薪酬方案总体来说分为这几个部分。"
1005,"除了上述固定薪酬方案外,公司鼓励大家积极参与国内外会议,积极发表专利和论文,也有相应的激励。"

position:

id,position_name
1,"employer"
2,"teamleader"
3,"manager"
4,"ceo"

user:

user_id,user_name,position_id
201,"Alice",1
202,"Bob",2
203,"Charlie",3
204,"Diana",4

Python 代码

import pandas as pd
import ast
import os"""
知识库文本过滤思路:
- 按公司职位来实现知识库文本的访问权限控制
- 一个知识库文本可能与N个职位有关联使用csv文件模拟数据库存储
- kb_topK.csv: 知识库检索的topK文本
- kb_position_ref.csv:知识库文本和职位的关联信息
- user.csv: 用户信息和所属的公司职位
- position.csv: 职位信息
"""# 获取当前脚本的绝对路径
base_path = os.path.dirname(os.path.abspath(__file__))# 构建CSV文件的绝对路径
kb_topK_path = os.path.join(base_path, 'db', 'kb_topK.csv')
user_path = os.path.join(base_path, 'db', 'user.csv')
kb_position_ref_path = os.path.join(base_path, 'db', 'kb_position_ref.csv')
position_path = os.path.join(base_path, 'db', 'position.csv')# 读取 CSV 文件
kb_topK_table = pd.read_csv(kb_topK_path)
user_table = pd.read_csv(user_path)
kb_position_ref_table = pd.read_csv(kb_position_ref_path)
position_table = pd.read_csv(position_path)def get_filter_contents(user_id):# 查询用户职位(权限)user_position_id = user_table[user_table['user_id'] == user_id]['position_id'].values[0]print("当前用户的职位id: {}".format(user_position_id))position_name = position_table.loc[position_table['id'] == user_position_id, 'position_name'].values[0]print("当前用户的职位: {}\n".format(position_name))# 查询topK文本对应的职位(权限)topK_position_table = pd.merge(kb_topK_table, kb_position_ref_table, on='kb_id')# 打印召回的文本print("==========召回文本==========")for content in topK_position_table["content"].tolist():print(content)print("==========召回文本==========\n")# 遍历合并后的表并找到匹配的职位matching_kb_ids = []for index, row in topK_position_table.iterrows():# 将字符串转换为列表position_ids = ast.literal_eval(row['position_ids'])if user_position_id in position_ids:matching_kb_ids.append(row['kb_id'])# 根据 kb_id 过滤出相应的行filtered_data = kb_topK_table[kb_topK_table['kb_id'].isin(matching_kb_ids)]# 获取 content 列并转换为列表content_list = filtered_data['content'].tolist()print("用户拥有权限的召回文本:", content_list)if __name__ == "__main__":user_id = 204get_filter_contents(user_id)

在这里插入图片描述

相关文章:

LLM大模型RAG内容安全合规检查

1.了解内容安全合规涉及的范围 我们先回顾一下智能答疑机器人的问答流程。问答流程主要包括用户、智能答疑机器人、知识库、大语言模型这四个主体。 涉及内容安全的关键阶段主要有&#xff1a; 输入阶段&#xff1a;用户发起提问。 输出阶段&#xff1a;机器人返回回答。 知识…...

Flink operator实现自动扩缩容

官网文档位置&#xff1a; 1.Autoscaler | Apache Flink Kubernetes Operator 2.Configuration | Apache Flink Kubernetes Operator 1.部署K8S集群 可参照我之前的文章k8s集群搭建 2.Helm安装Flink-Operator helm repo add flink-operator-repo https://downloads.apach…...

数据挖掘——集成学习

数据挖掘——集成学习 集成学习Bagging&#xff1a;有放回采样随机森林 BoostingStacking 集成学习 集成学习&#xff08;Ensemble learning&#xff09;方法通过组合多种学习算法来获得比单独使用任何一种算法更好的预测性能。 动机是为了提高但分类器的性能 Bagging&…...

XGBoost 简介:高效机器学习算法的实用指南

1. 什么是 XGBoost&#xff1f; XGBoost&#xff0c;全称 eXtreme Gradient Boosting&#xff0c;是一种基于 梯度提升决策树&#xff08;GBDT&#xff09; 的高效实现。相比传统的 GBDT&#xff0c;XGBoost 在速度、内存利用和并行化等方面做了很多优化&#xff0c;因此在大规…...

【NLP高频面题 - Transformer篇】什么是缩放点积注意力,为什么要除以根号d?

什么是缩放点积注意力&#xff0c;为什么要除以根号d&#xff1f; 重要性&#xff1a;★★★ Transformer 自注意力机制也被称为缩放点积注意力机制&#xff0c;这是因为其计算过程是先求查询矩阵与键矩阵的点积&#xff0c;再用 d k \sqrt{d_k} dk​ ​ 对结果进行缩放。这…...

HTML——56.表单发送

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表单发送</title></head><body><!--注意&#xff1a;1.表单接收程序&#xff0c;放在服务器环境中(也就是这里的www文件目录中)2.表单发送地址&#x…...

C++26 函数契约(Contract)概览

文章目录 1. 什么是契约编程?契约编程的三大核心: 2. C26 契约编程的语法语法示例 3. 契约检查模式3.1. default 模式3.2. audit 模式3.3. axiom 模式检查模式的设置 4. 契约编程与传统 assert 的区别示例对比 5. 契约编程的应用场景6. 注意事项7. 示例: 带契约的矩形面积计算…...

【HTML】Day02

【HTML】Day02 1. 列表标签1.1 无序列表1.2 有序列表1.3 定义列表 2. 表格标签2.1 合并单元格 3. 表单标签3.1 input标签基本使用3.2 上传多个文件 4. 下拉菜单、文本域5. label标签6. 按钮button7. div与span、字符实体字符实体 1. 列表标签 作用&#xff1a;布局内容排列整齐…...

Kafka的rebalance机制

1、什么是 rebalance 机制 重平衡&#xff08;rebalance&#xff09;机制规定了如何让消费者组下的所有消费者来分配 topic 中的每一个分区。 2、rebalance 机制的触发条件是什么 &#xff08;1&#xff09;消费者组内成员变更 成员增加&#xff1a;当有新的消费者加入到消费…...

Spring Boot - 日志功能深度解析与实践指南

文章目录 概述1. Spring Boot 日志功能概述2. 默认日志框架&#xff1a;LogbackLogback 的核心组件Logback 的配置文件 3. 日志级别及其配置配置日志级别3.1 配置文件3.2 环境变量3.3 命令行参数 4. 日志格式自定义自定义日志格式 5. 日志文件输出6. 日志归档与清理7. 自定义日…...

【React+TypeScript+DeepSeek】穿越时空对话机

引言 在这个数字化的时代&#xff0c;历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里&#xff0c;我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来&#xff1f;如何让历史学习变得生动有趣&#xff1f;带着这些思考&…...

2025年贵州省职业院校技能大赛信息安全管理与评估赛项规程

贵州省职业院校技能大赛赛项规程 赛项名称&#xff1a; 信息安全管理与评估 英文名称&#xff1a; Information Security Management and Evaluation 赛项组别&#xff1a; 高职组 赛项编号&#xff1a; GZ032 1 2 一、赛项信息 赛项类别 囚每年赛 □隔年赛&#xff08;□单数年…...

2、蓝牙打印机点灯-GPIO输出控制

1、硬件 1.1、看原理图 初始状态位高电平. 需要驱动PA1输出高低电平控制PA1. 1.2、看手册 a、系统架构图 GPIOA在APB2总线上。 b、RCC使能 GPIOA在第2位。 c、GPIO寄存器配置 端口&#xff1a;PA1 模式&#xff1a;通用推挽输出模式 -- 输出0、1即可 速度&#xff1a;5…...

推荐系统重排:DPP 多样性算法

行列式点过程&#xff08;DPP&#xff09;算法&#xff1a;原理、应用及优化 推荐系统【多样性算法】系列文章&#xff08;置顶&#xff09; 1.推荐系统重排&#xff1a;MMR 多样性算法 2.推荐系统重排&#xff1a;DPP 多样性算法 引言 行列式点过程&#xff08;Determinanta…...

【业务场景】sql server从Windows迁移到Linux

目录 1.背景 2.Linux安装sql server 3.服务器不开端口的问题 4.数据库导入导出问题 1.背景 博主在24年年底接手运维了一个政府的老系统&#xff0c;整个应用和数据库单点部署在一台Windows Server服务器上&#xff0c;数据库选型是经典的老项目标配——sql server。随着近…...

SpringMVC(三)请求

目录 一、RequestMapping注解 1.RequestMapping的属性 实例 1.在这里创建文件&#xff0c;命名为Test: 2.复现-返回一个页面&#xff1a; 创建test界面&#xff08;随便写点什么&#xff09;&#xff1a; Test文件中编写&#xff1a; ​编辑 运行&#xff1a; 3.不返回…...

【HeadFirst系列之HeadFirst设计模式】第1天之HeadFirst设计模式开胃菜

HeadFirst设计模式开胃菜 前言 从今日起&#xff0c;陆续分享《HeadFirst设计模式》的读书笔记&#xff0c;希望能够帮助大家更好的理解设计模式&#xff0c;提高自己的编程能力。 今天要分享的是【HeadFirst设计模式开胃菜】&#xff0c;主要介绍了设计模式的基本概念、设计模…...

Spring线程池优雅关闭

前言 线程池大家一定不陌生&#xff0c;常被用来异步执行一些耗时的任务。但是线程池如何优雅的关闭&#xff0c;却少有人关注。 当 JVM 进程关闭时&#xff0c;你提交到线程池的任务会被如何处理&#xff1f;如何保证任务不丢&#xff1f; ThreadPoolExecutor Java 对线程…...

Spring为什么要用三级缓存解决循环依赖?

1.什么是循环依赖 本文为了方便说明&#xff0c;先设置两个业务层对象&#xff0c;命名为AService和BService。其中Spring是如何把一个Bean对象创建出来的&#xff0c;其生命周期如下&#xff1a; 构造方法–> 不同对象 --> 注入依赖 -->初始化前 --> 初始化后–&…...

【苏德矿高等数学】第4讲:数列极限定义-1

2. 数列极限 数列极限是整个微积分的核心。它的思想贯穿整个微积分之中。 数列极限是最基本的、最核心的、最重要的、最难的。 2.1 数列 【定义】无限排列的一列数 a 1 , a 2 , ⋯ , a n , ⋯ a_1,a_2,\cdots,a_n,\cdots a1​,a2​,⋯,an​,⋯就称为数列&#xff0c;记作 { …...

Go语言的 的并发编程(Concurrency)核心知识

Go语言的并发编程&#xff08;Concurrency&#xff09;核心知识 在现代软件开发中&#xff0c;尤其是处理高并发任务时&#xff0c;优秀的并发编程能力显得尤为重要。Go语言&#xff08;或称Golang&#xff09;是为并发编程而生的一种编程语言&#xff0c;它通过简洁的语法和强…...

Go语言中的逃逸分析:深入浅出

Go语言中的逃逸分析&#xff1a;深入浅出 在Go语言中&#xff0c;逃逸分析&#xff08;Escape Analysis&#xff09;是一个非常重要且强大的编译器优化技术。它帮助编译器决定一个变量是在栈上分配还是在堆上分配&#xff0c;从而影响程序的性能和内存管理。本文将深入探讨Go语…...

flux中的缓存

1. cache&#xff0c;onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存&#xff0c;但是当下游消费者的处理速度比上游生产者慢时&#xff0c;上游生产的数据会被暂时存储在缓冲区中&#xff0c;防止丢失。 2. Flux.range 默认…...

Vue3中使用 Vue Flow 流程图方法

效果图&#xff1a; 最近项目开发时有一个流程图的功能&#xff0c;需要做流程节点的展示&#xff0c;就搜到了 Vue Flow 这个插件&#xff0c;这个插件总得来说还可以&#xff0c;简单已使用&#xff0c;下边就总结一下使用的方法&#xff1a; Vue Flow官网&#xff1a;https…...

[Effective C++]条款42 typename

本文初发于 “天目中云的小站”&#xff0c;同步转载于此。 条款42 : 了解typename的双重意义 本条款中我们将了解typename的两种使用场景, 对typename的内涵及使用加深认知. template声明式 在template的声明中, template<class T>和template<typename T>都是被允…...

MySQL 8 主从同步配置(Master-Slave Replication)

📋 MySQL 8 主从同步配置(Master-Slave Replication) 🔧 目标: 配置 MySQL 8 主从同步,实现 主库(Master) 处理写操作,从库(Slave) 处理读操作,达到 读写分离 和 高可用性 的目的。 🔑 核心步骤: 配置 主库(Master)配置 从库(Slave)启动主从复制验证主从…...

STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正…...

模拟(算法-6)

模拟简介 模拟就是根据题目要求&#xff0c;比着葫芦画瓢&#xff0c;即直接按照题目要求写就行了 考察的是我们的编码能力 步骤&#xff1a; 演草纸上画图模拟&#xff08;重要&#xff09; 代码编写 虽然很多时候此类题比较简单&#xff0c;但是也有例外&#xff0c;如本文第…...

Clickhouse集群部署(3分片1副本)

Clickhouse集群部署 3台Linux服务器&#xff0c;搭建Clickhouse集群3分片1副本模式 1、安装Java、Clickhouse、Zookeeper dpkg -i clickhouse-client_23.2.6.34_amd64.deb dpkg -i clickhouse-common-static_23.2.6.34_amd64.deb dpkg -i clickhouse-server_23.2.6.34_amd64…...

MySQL(六)MySQL 案例

1. MySQL 案例 1.1. 设计数据库 1、首先根据相关业务需求(主要参考输出输入条件)规划出表的基本结构   2、根据业务规则进行状态字段设计   3、预估相关表的数据量进行容量规划   4、确定主键   5、根据对相关处理语句的分析对数据结构进行相应的变更。   设计表的时…...

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…...

NLP中特征提取方法的总结

1. Bag of Words (BOW) 描述&#xff1a;将文本表示为一个词汇表中的词频向量&#xff0c;忽略词的顺序。 优点&#xff1a;实现简单&#xff0c;广泛应用。 缺点&#xff1a;不考虑词序和上下文信息&#xff0c;向量空间维度可能非常大。 应用&#xff1a;文本分类、情感分…...

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布&#xff0c;鸿蒙生态日益壮大&#xff0c;广大开发者对于系统化学习平台和课程的需求愈发强烈。近日&#xff0c;华为精心打造的《HarmonyOS第一课》全新上线&#xff0c;集“学、练、考”于一体&#xff0c;凭借多维融合的教学模式与系统课程设置&…...

JMeter + Grafana +InfluxDB性能监控 (二)

您可以通过JMeter、Grafana 和 InfluxDB来搭建一个炫酷的基于JMeter测试数据的性能测试监控平台。 下面&#xff0c;笔者详细介绍具体的搭建过程。 安装并配置InfluxDB 您可以从清华大学开源软件镜像站等获得InfluxDB的RPM包&#xff0c;这里笔者下载的是influxdb-1.8.0.x86_…...

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…...

数据结构(顺序表)

文章目录 数据结构概述什么是数据结构数据结构的类型常见的数据结构 线性表概念举例 顺序表基本概念基本操作 完整代码顺序表优缺点总结 数据结构概述 什么是数据结构 数据结构&#xff1a;数据结构就是计算机存储&#xff0c;组织&#xff0c;管理数据的方式方法 数据结构的…...

ARM架构服务器安装部署KVM虚拟化环境

一、查看内核是否支持KVM虚拟化 针对ARM架构服务器&#xff0c;若/dev/kvm 和 /sys/module/kvm任意一个不存在&#xff0c;都说明内核不支持KVM虚拟化 [rootlocalhost ~]# ls -l /dev/kvm crw-rw---- 1 root kvm 10, 232 May 6 09:18 /dev/kvm[rootlocalhost ~]# ls /sys/mo…...

Azkaban其二,具体使用以及告警设置

目录 Azkaban的使用 1、使用Flow1.0(比较老旧&#xff09; 2、Flow2.0的用法 1、小试牛刀 2、YAML格式的数据 3、多任务依赖 4、内嵌流&#xff08;嵌套流&#xff09;案例 5、动态传参 3、Azkaban的报警机制 1&#xff09;邮箱通知 2&#xff09;电话报警机制 4、关…...

不只是mini-react第一节:实现最简单mini-react

项目总结构&#xff1a; ├─ &#x1f4c1;core │ ├─ &#x1f4c4;React.js │ └─ &#x1f4c4;ReactDom.js ├─ &#x1f4c1;node_modules ├─ &#x1f4c1;tests │ └─ &#x1f4c4;createElement.spec.js ├─ &#x1f4c4;App.js ├─ &#x1f4c4;in…...

MySQL数据库备份与恢复策略

数据是企业和应用的核心资产,可靠的备份和恢复策略是确保数据安全性和业务连续性的关键。在本篇文章中,我们将详细介绍 MySQL 数据库的备份和恢复方法,包括逻辑备份、物理备份、自动化备份,以及常见问题的处理方法。 一、逻辑备份 逻辑备份是通过导出数据库的结构和数据生…...

SpringBoot下载文件的几种方式

小文件&#xff1a;直接将文件一次性读取到内存中&#xff0c;文件大可能会导致OOM GetMapping("/download1")public void download1(HttpServletResponse response) throws IOException {// 指定要下载的文件File file new File("C:\\Users\\syd\\Desktop\\do…...

探索现代 Web 开发中的流行技术:深入学习 Vite 的使用

在前端开发的世界中&#xff0c;构建工具扮演着越来越重要的角色。从 Webpack 到 Parcel&#xff0c;再到 Rollup&#xff0c;每个工具都有自己的独特定位和目标。而今天&#xff0c;我们要讨论的是一款近年来迅速崛起并受到广泛欢迎的构建工具— Vite。 本文将从基本原理到实…...

React虚拟DOM:理解和应用

写在前面 在现代前端开发中&#xff0c;React 是一个非常流行的 JavaScript 库&#xff0c;用于构建用户界面。它引入了一个名为“虚拟 DOM”&#xff08;Virtual DOM&#xff09;的概念&#xff0c;这个概念对于 React 的高效性能和易用性至关重要。本文将深入探讨 React Vir…...

C++和SFML游戏入门

让我们深入探讨一下如何使用C和SFML&#xff08;Simple and Fast Multimedia Library&#xff09;来创建一个更为详细的游戏代码示例。我们将构建一个简单的2D游戏&#xff0c;其中包含一个可移动的角色、基本的碰撞检测以及简单的得分系统。 项目结构 首先&#xff0c;我们定…...

Django 表单

Django 表单 Django 表单是 Web 开发中一个重要的组成部分,它允许用户与网站进行交互。在 Django 框架中,表单用于收集和验证用户输入的数据。Django 提供了一个强大的表单处理系统,使得开发者能够轻松地创建表单,处理表单数据,并进行验证。 1. Django 表单基础 Django…...

Ubuntu 安装英伟达显卡驱动问题记录

建议 无论什么版本的系统,都建议从官网下载驱动,一般下载下来后是一个 run 开头的可执行程序,直接在命令行执行就可以。 之所以这么建议,是因为使用 包管理工具安装的驱动一般都是社区版本,社区版本的问题就是没有签名,需要在 BIOS 内关闭 security boot 才可以加载对应…...

机器视觉面试题PDF

以下是一些机器视觉面试题PDF资源的推荐&#xff1a; GitHub仓库• 《百面计算机视觉》面试题整理&#xff1a;这个GitHub仓库整理了计算机视觉算法岗的面试题&#xff0c;包括深度学习基础、机器学习高频面试题、传统CV(Opencv面试题)、目标检测、图像分类、图像分割、Transfo…...

【网络协议】IPv4 地址分配 - 第一部分

文章目录 十进制与二进制网络如何被寻址地址类型网络地址广播地址主机地址 如何确定网络和主机部分的位数&#xff1f;网络中的主机数量与前缀号的关系计算每个前缀的主机数量公式 子网掩码二进制与操作&#xff08;Binary ANDing&#xff09;与操作&#xff08;AND Operation&…...

掌握 Dockerfile:格式、解析器指令、环境变量替换

Docker 是一个开源平台&#xff0c;旨在自动化应用程序的构建、交付和运行。通过 Dockerfile&#xff0c;您可以定义镜像的构建过程。Dockerfile 是由一系列指令组成的文件&#xff0c;Docker 根据这些指令构建镜像。本文将介绍常用的 Dockerfile 指令、格式、解析器指令以及环…...

AWS Glue基础知识

AWS Glue 是一项完全托管的 ETL&#xff08;提取、转换、加载&#xff09;服务&#xff0c;与考试相关&#xff0c;尤其是在数据集成、处理和分析方面。 1.数据集成和 ETL&#xff08;提取、转换、加载&#xff09; AWS Glue 主要用于构建 ETL 管道以准备数据以进行分析。作为…...