跟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,要不要加?
发表评论: