无尘阁日记

无尘阁日记

跟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 小时)

 * ]

答:

明白了,你的目标是:

  • HeadOfficeCapacityModelai_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;
    }
}

✅ 第二步:在控制器基类中统一加载配置(如 BaseControllerbeforeAction()

你可以统一在你的所有控制器的基类(如 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_answerpre_defined_answer
对话记忆读取 memory.enabledmemory.depth
敏感词检测判断是否启用 sensitive_fuzzy_match
推荐关键词读取 suggested_keywords_enabled

✅ 如果你需要支持按不同请求上下文(如管理后台 vs 用户前台)读取不同配置,也可以加个参数:

AIHelper::loadOrgAIConfig($orgId, $context = 'frontend');

如需我再封装一组 AIConfig::get($key, $default) 方法用于便捷读取配置值,我也可以帮你整好一整套 getter,要不要加?