跟AI合作校验AI助手的相关配置
2025-04-10
问:
我现在需要做企业级校验,配置如下:
-- 14. {
-- "enabled": true,
-- "request_interval_sec": 60,
-- "token_limit": 100000,
-- "token_used": 4300,
-- "access_start_time": "2025-03-01 00:00:00",
-- "access_end_time": "2025-12-31 23:59:59",
-- "memory": {
-- "enabled": true,
-- "depth": 1,
-- "cross_session": false
-- },
-- "sensitive_fuzzy_match": true,
-- "suggested_keywords_enabled": true,
-- "max_active_users": 100,
-- "same_question_answer": true,
-- "pre_defined_answer": true,
-- "ai_answer_timeout": 24*60*60,
-- }
这些配置意思如下:
* [
* 'enabled' => bool, // 是否启用 AI 功能
* 'request_interval_sec' => int, // 每次请求之间的最小时间间隔(单位:秒)
* 'token_limit' => int, // 账号允许使用的总 token 数限制
* 'token_used' => int, // 当前已使用的 token 数量
* 'access_start_time' => string, // 开始允许访问的时间(格式:Y-m-d H:i:s)
* 'access_end_time' => string, // 结束访问权限的时间(格式:Y-m-d H:i:s)
* 'memory' => [ // AI 记忆功能配置
* 'enabled' => bool, // 是否开启记忆功能
* 'depth' => int, // 记忆深度(轮数)
* 'cross_session' => bool // 是否开启跨会话记忆
* ],
* 'sensitive_fuzzy_match' => bool, // 是否启用敏感词模糊匹配
* 'suggested_keywords_enabled' => bool, // 是否启用关键词推荐功能
* 'max_active_users' => int, // 同时允许活跃的最大用户数
* 'same_question_answer' => bool, // 是否对相同问题返回相同答案
* 'pre_defined_answer' => bool, // 是否启用预设回答
* 'ai_answer_timeout' => int // AI 回答超时时间(单位:秒,例:86400 = 24 小时)
* ]
所有的配置将从HeadOfficeCapacityModel这个模型里读取,字段是ai_config,用json存在里面,然后读取的时候模型自动转成php数组,你直接读取即可。
现在请你封装成一个读取方法,然后存储到Yii::$app->params里面,方面后续读取,我觉得可以在beforeAction里面读取完成,然后在其他需要校验的地方用,当然所有接口如果都要校验,就在beforeAction里调用,你灵活决定。
另外我把之前设计的数据流也贴给你,你帮我把方法实现,并告诉我在什么地方调用,有不不清楚的就问我。
* [
* 'enabled' => bool, // 是否启用 AI 功能
* 'request_interval_sec' => int, // 每次请求之间的最小时间间隔(单位:秒)
* 'token_limit' => int, // 账号允许使用的总 token 数限制
* 'token_used' => int, // 当前已使用的 token 数量
* 'access_start_time' => string, // 开始允许访问的时间(格式:Y-m-d H:i:s)
* 'access_end_time' => string, // 结束访问权限的时间(格式:Y-m-d H:i:s)
* 'memory' => [ // AI 记忆功能配置
* 'enabled' => bool, // 是否开启记忆功能
* 'depth' => int, // 记忆深度(轮数)
* 'cross_session' => bool // 是否开启跨会话记忆
* ],
* 'sensitive_fuzzy_match' => bool, // 是否启用敏感词模糊匹配
* 'suggested_keywords_enabled' => bool, // 是否启用关键词推荐功能
* 'max_active_users' => int, // 同时允许活跃的最大用户数
* 'same_question_answer' => bool, // 是否对相同问题返回相同答案
* 'pre_defined_answer' => bool, // 是否启用预设回答
* 'ai_answer_timeout' => int // AI 回答超时时间(单位:秒,例:86400 = 24 小时)
* ]
答:
明白了,你的目标是:
从
HeadOfficeCapacityModel的ai_config字段读取企业级 AI 功能配置(已自动转为 PHP 数组);把配置存入
Yii::$app->params['ai_config'],供全局调用;在合适时机(如
beforeAction())中进行读取;后续各处可直接访问
Yii::$app->params['ai_config']进行校验逻辑处理。
我来帮你:
✅ 第一步:封装读取配置的方法(推荐放在 components/AIHelper.php 或模型类中)
class AIHelper
{
/**
* 根据当前用户所属企业ID,加载 AI 配置并缓存至 Yii::$app->params['ai_config']
* @param int $orgId 企业ID
* @return array 返回完整配置数组
*/
public static function loadOrgAIConfig(int $orgId): array
{
$record = HeadOfficeCapacityModel::find()
->where(['org_id' => $orgId])
->one();
$config = $record->ai_config ?? [];
// 缓存到全局参数,供后续使用
Yii::$app->params['ai_config'] = $config;
return $config;
}
}✅ 第二步:在控制器基类中统一加载配置(如 BaseController 的 beforeAction())
你可以统一在你的所有控制器的基类(如 BaseController)中覆盖 beforeAction,例如:
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
// 企业ID从登录上下文中获取,或你的系统中定义的位置
$orgId = $this->headOfficeUid ?? null;
if ($orgId) {
AIHelper::loadOrgAIConfig($orgId);
}
return true;
}✅ 好处:只要继承了这个
BaseController的控制器,都会自动加载并注册该企业的 AI 能力配置,后续只需读取Yii::$app->params['ai_config']即可。
✅ 第三步:使用方式示例(在任意逻辑中校验)
$config = Yii::$app->params['ai_config'] ?? [];
// 示例:检查是否开启 AI 功能
if (empty($config['enabled'])) {
return ErrorCode::wordReturnData('该企业未开通AI服务', 0);
}
// 示例:检查访问时间是否有效
$now = date('Y-m-d H:i:s');
if ($now < $config['access_start_time'] || $now > $config['access_end_time']) {
return ErrorCode::wordReturnData('当前不在可访问时间范围内', 0);
}
// 示例:检查token用量
if (($config['token_used'] ?? 0) >= ($config['token_limit'] ?? PHP_INT_MAX)) {
return ErrorCode::wordReturnData('AI服务配额已用尽', 0);
}✅ 第四步:你的校验点建议
| 校验位置 | 校验逻辑 |
|---|---|
| 所有控制器统一加载 | beforeAction() 中加载配置 |
| 消息发送前 | 校验时间窗口、配额、是否开启 |
| 生成 AI 回答 | 判断是否启用 same_question_answer、pre_defined_answer |
| 对话记忆 | 读取 memory.enabled 和 memory.depth |
| 敏感词检测 | 判断是否启用 sensitive_fuzzy_match |
| 推荐关键词 | 读取 suggested_keywords_enabled |
✅ 如果你需要支持按不同请求上下文(如管理后台 vs 用户前台)读取不同配置,也可以加个参数:
AIHelper::loadOrgAIConfig($orgId, $context = 'frontend');
如需我再封装一组 AIConfig::get($key, $default) 方法用于便捷读取配置值,我也可以帮你整好一整套 getter,要不要加?
发表评论: