1. 项目概述:当智能体学会“思考”与“探索”

最近在视频检索领域,一个名为 ADEPT 的智能体框架引起了我的注意。它的全称是“An Entropy-Driven Dual-Strategy Agent for Interactive Video Retrieval”,翻译过来就是“一个由熵驱动的双策略智能体,用于交互式视频检索”。这个标题信息量很大,直接点明了它的核心: 一个会自己“思考”并“探索”的智能体 。简单来说,它试图解决一个我们日常都会遇到的痛点:在海量视频里,如何更精准、更人性化地找到你想要的那一段?

传统的视频检索,无论是基于关键词搜索,还是基于内容的相似度匹配,都像是一个“一锤子买卖”。你输入一个查询(比如“一只猫跳上沙发”),系统返回一个排序列表,然后就没有然后了。如果结果不理想,你只能换个关键词再搜一次,整个过程是单向、静态的。而 交互式视频检索 则不同,它模拟了人类与专家(比如一个熟悉所有视频的图书管理员)的对话过程。你可以通过多轮对话,逐步细化你的需求。比如,你先说“找一个有趣的宠物视频”,系统返回一些结果;你看了之后说“不,我要那种猫被吓到的瞬间”,系统就能基于你之前的查询和反馈,在新的方向上继续搜索。这个过程是动态的、迭代的。

ADEPT 的创新之处在于,它让驱动这个对话过程的智能体拥有了 “策略选择” 的能力。它内置了两种核心策略: “思考” 和 “探索” 。这听起来很抽象,但理解它对设计任何交互式系统都至关重要。更重要的是,它引入了一个叫 “熵” 的概念作为策略切换的“裁判”。熵在信息论中衡量的是不确定性或混乱程度。在这里,ADEPT 用它来衡量智能体对用户真实意图的“困惑”程度。当智能体很“困惑”(熵值高)时,它倾向于选择“探索”策略,去广泛地尝试不同的搜索方向;当它比较“确信”(熵值低)时,则选择“思考”策略,深入分析当前最有可能的线索。这种动态的、数据驱动的策略调度机制,正是 ADEPT 区别于以往固定策略或启发式规则方法的核心。

2. 核心设计思路:为什么是“熵”与“双策略”?

要理解 ADEPT,我们必须先拆解它面对的根本问题。在交互式视频检索中,智能体每轮都需要做一个决策: 基于当前的对话历史和已有的搜索结果,下一步该问用户什么?或者该朝哪个方向继续搜索? 这是一个典型的序贯决策问题。早期的解决方案要么是预设一些固定的提问模板(比如“您想要更具体的场景吗?”),要么是用一个单一的模型去预测下一个动作。这些方法往往不够灵活,无法适应千变万化的用户意图和复杂的视频内容。

2.1 双策略的直觉:模仿人类专家的两种工作模式

ADEPT 设计双策略的灵感,很大程度上来源于人类专家的行为模式。当我们向一位专家咨询时,专家的大脑里通常有两种工作状态在切换:

  1. 深度思考与分析 :当专家掌握了比较明确的线索时,他会进入深度思考模式。比如,你告诉图书管理员“我要找一本蓝色封面的、关于海洋生物的科幻小说”,他会立刻在“科幻小说”这个大类下,结合“蓝色封面”和“海洋生物”这两个强约束条件,进行快速筛选和推理。这个过程是 收敛的、聚焦的 ,目标是在已知的、可能性较高的路径上找到最优解。在 ADEPT 中,这对应着 “思考”策略 。该策略通常由一个精炼的、参数化的模型(如一个小型神经网络)来执行,它擅长利用已有的强信号进行精准的推理和排序。

  2. 主动探索与试探 :当线索非常模糊或矛盾时,专家会采取探索策略。比如,你只说“我想看点有意思的东西”,这个需求太宽泛了。专家可能会试探性地问你:“您对历史纪录片感兴趣吗?还是更喜欢轻松的喜剧短片?”或者,他可能会先给你看几种完全不同类型的“有意思”的视频样本,观察你的反应。这个过程是 发散的、试探性的 ,目标是收集信息、降低不确定性,从而发现潜在的、之前未考虑到的正确方向。在 ADEPT 中,这对应着 “探索”策略 。该策略可能采用一些多样性更高的方法,例如基于聚类的采样、不确定性采样,或者直接调用一个覆盖范围更广但精度稍逊的检索模型。

注意 :这里的“思考”和“探索”并不是指智能体具有意识,而是对两种不同计算范式的拟人化比喻。“思考”策略侧重于 利用 现有信息进行优化,“探索”策略侧重于 探索 新的信息空间。

2.2 熵作为决策的“晴雨表”

那么,智能体如何知道什么时候该“思考”,什么时候该“探索”呢?这就是 “熵驱动” 的精髓所在。ADEPT 使用信息熵来量化智能体当前状态的不确定性。

具体来说,在每一轮交互后,智能体内部会维护一个对用户意图的 概率分布 。例如,经过几轮对话,智能体可能认为用户有60%的概率在找“猫的视频”,30%的概率在找“搞笑失误集锦”,10%的概率是其他。这个分布的不确定性就可以用熵来计算。 熵值越高,表示概率分布越均匀,智能体越“困惑”,不知道用户到底想要什么;熵值越低,表示概率分布越集中(比如某个意图的概率高达90%),智能体越“确信”。

ADEPT 会设定一个或多个熵阈值。例如:

  • 当熵值 高于阈值H_high 时,说明不确定性很大,智能体应切换到 “探索”策略 ,主动提出一些差异性强的问题或返回多样化的结果,以快速获取信息,降低熵值。
  • 当熵值 低于阈值L_low 时,说明意图已经比较明确,智能体应切换到 “思考”策略 ,进行精准推理,给出最贴合当前高概率意图的检索结果。
  • 当熵值在中间区间时,可以维持当前策略,或引入更复杂的调度机制(如基于强化学习)。

这种基于熵的调度,使策略切换从基于规则的“硬切换”变成了基于数据的“软切换”,更加自适应和鲁棒。

2.3 整体架构与工作流程

基于以上思路,ADEPT 的典型工作流程可以概括如下:

  1. 初始化 :用户输入初始查询(文本或可能结合示例图像/视频)。
  2. 意图状态更新 :智能体根据当前查询和对话历史,更新其内部维护的用户意图概率分布,并计算当前状态的熵值。
  3. 策略选择 :根据计算出的熵值,选择执行“思考”策略或“探索”策略。
  4. 策略执行 :
    • 若选择“思考”:调用精炼推理模型,对视频库进行深度排序,返回Top-K个最相关的结果。
    • 若选择“探索”:调用探索性模块,可能生成一个澄清性问题(如“您更关注动物的动作还是场景的风景?”),或者返回几组在特征空间上差异较大的视频结果供用户选择。
  5. 用户反馈 :用户对返回的结果进行反馈(如点击相关视频、标记不相关、或直接回答智能体提出的问题)。
  6. 循环迭代 :将用户反馈作为新的输入,回到步骤2,开始下一轮交互。如此循环,直至用户满意或达到轮次上限。

这个流程的核心闭环就是 “评估不确定性(熵) -> 选择策略 -> 执行动作 -> 获取反馈 -> 更新认知” ,形成了一个非常符合人类认知习惯的交互循环。

3. 核心模块深度解析与实现要点

理解了设计思路,我们深入到ADEPT的几个核心模块,看看具体是如何实现的,以及在实际构建中需要注意哪些坑。

3.1 意图表示与概率分布建模

这是整个系统的基石。如何将模糊的用户意图表示成一个可计算的概率分布?

常见方法 :

  • 基于分类的方法 :预先定义一个意图类别集合(如 {“物体识别”, “动作识别”, “场景查找”, “情感检索”...} )。每一轮,模型预测用户意图属于各个类别的概率。这种方法直观,但受限于预设的类别,难以处理开放域、复合型意图。
  • 基于嵌入空间的方法 :这是更主流和灵活的方式。将用户的查询(文本)和视频都映射到一个共享的深度特征嵌入空间。用户的“意图”可以表示为这个空间中的一个 分布 ,而不是一个点。例如,可以用一个多元高斯分布来表示,其均值向量代表最可能的意图方向,协方差矩阵代表意图的不确定性(协方差越大,熵越高)。

实操要点与心得 :

  • 特征提取器的选择至关重要 :无论是用于文本的BERT、CLIP文本编码器,还是用于视频的SlowFast、TimeSformer等视频编码器,必须确保它们在同一个语义空间中对齐良好。 CLIP模型及其变体 是当前的首选,因为它在大规模图文-视频对数据上进行了预训练,天然具备了跨模态对齐能力。
  • 分布初始化 :第一轮查询时,意图分布通常具有较大的方差(高不确定性)。可以用查询文本嵌入作为均值,一个较大的固定对角矩阵作为初始协方差。
  • 分布更新 :获得用户反馈(如正例视频 V+ 和负例视频 V- )后,需要更新意图分布。这可以看作是一个贝叶斯更新过程。一种简化但有效的方法是:将正例视频的特征向量作为新的观测数据,通过在线学习算法(如贝叶斯线性回归的在线版本)来更新高斯分布的参数。负例视频则可以用来“收缩”分布,远离不希望的方向。
  • 计算熵 :对于多元高斯分布 N(μ, Σ) ,其微分熵有一个解析解: H = 0.5 * ln((2πe)^k * |Σ|) ,其中 k 是嵌入空间的维度, |Σ| 是协方差矩阵的行列式。 实操中发现,直接使用 ln(|Σ|) 作为熵的替代度量往往更稳定 ,因为它与微分熵单调相关,且避免了常数项计算。

3.2 “思考”策略的实现:精炼推理与排序

当熵值较低,需要执行“思考”策略时,目标是实现精准打击。

核心任务 :在当前的意图分布下,对视频库中的所有候选视频计算一个“相关度分数”,并排序。

实现方法 :

  • 确定性排序 :如果意图分布非常集中(协方差很小),可以近似用均值向量 μ 作为意图的确定表示。相关度分数即为视频特征向量 v 与 μ 的余弦相似度或点积。
  • 概率性排序(更优) :考虑意图的不确定性,计算视频 v 与整个意图分布的期望相似度。对于高斯分布,这等价于计算 v 与 μ 的相似度,但 相似度函数本身可能需要根据分布进行调整 。一种更严谨的方法是计算视频特征 v 属于“相关”类别的概率,这可以通过一个概率模型(如Probit或Logit模型)将相似度转换为概率。
  • 模型微调 :“思考”策略可以配备一个轻量级的排序模型(如一个双塔结构的神经网络,输入是意图表示和视频特征,输出相关分数)。这个模型可以在交互过程中,利用用户反馈(正负样本对)进行 在线微调 ,从而快速适应用户的独特偏好。

注意事项 :

  • 冷启动问题 :在最初几轮,即使熵值低,由于数据少,排序模型可能也不准。因此,前期可以给“思考”策略的结果混合一些基于流行度或多样性的结果,作为保底。
  • 计算效率 :对大规模视频库进行实时深度神经网络推理成本高昂。通常需要借助 近似最近邻搜索 (如FAISS、HNSWlib)先进行粗排,再用精排模型对粗排的Top-N结果进行精细打分。

3.3 “探索”策略的实现:多样化探索与主动询问

当熵值较高时,“探索”策略的目标是高效地获取信息,降低不确定性。

主要有两种实现路径 :

路径一:结果多样化探索 不直接询问用户,而是返回一组刻意保持多样性的结果,观察用户对其中哪些感兴趣。

  • 方法 :在特征空间中对候选视频进行聚类(如K-Means),然后从不同类簇中分别选取最靠近簇中心的视频,或者选取与当前意图均值 μ 相似度适中但彼此之间差异大的视频。这可以通过 最大边界相关 算法来实现。
  • 优点 :用户交互负担小,体验更自然(像是在浏览推荐)。
  • 缺点 :信息获取效率可能低于直接提问,需要多轮才能明确意图。

路径二:主动生成澄清问题 直接向用户提问,这是获取信息最高效的方式。

  • 问题生成方法 :
    1. 基于属性 :如果视频标注了丰富的属性(物体、动作、场景、颜色等),可以找出当前意图分布下,不确定性最高的属性进行提问。例如,系统不确定用户是想找“狗”还是“猫”,可以问“您想找的动物是猫吗?”
    2. 基于示例 :找出一个“信息量最大”的视频,询问用户是否相关。如何定义“信息量最大”?一个经典标准是 不确定性采样 :选择那个模型最难判断是否相关的视频(即模型预测的相关概率最接近0.5的视频)。另一个标准是 基于池的主动学习 ,选择能最大程度减少预期未来不确定性的视频。
    3. 基于自然语言生成 :利用大语言模型,根据对话历史和当前意图分布,生成一个自然、流畅的澄清问题。例如:“刚才您提到了动物和户外,您更想看到动物在玩耍,还是它们在休息的画面?” 这需要将视频的语义信息(通过标签或描述生成)和对话历史一起输入给LLM。

实操心得 :

  • 混合使用 :在实际系统中,往往混合使用两种路径。例如,首轮返回多样化结果,如果用户没有明确点击,第二轮再主动生成一个问题。
  • 问题生成的质量控制 :自动生成的问题必须清晰、无歧义、且易于用户回答(最好是二选一或是否问题)。需要设计过滤规则,避免生成奇怪或令人困惑的问题。 对生成的问题进行人工评估和规则过滤是上线前必不可少的步骤。
  • 探索的“度” :探索不能太激进,否则会让用户感到烦躁。需要设计一个 探索预算 ,例如连续探索轮次不超过2轮,或者当用户对探索性结果表现出明显负面反馈(如快速跳过)时,应提前终止探索,切换回思考。

3.4 熵阈值的设定与策略调度器

策略调度器是ADEPT的大脑,它根据熵值做决策。如何设定阈值 H_high 和 L_low ?

  • 静态阈值 :通过在一个有标注的交互数据集上进行实验,观察熵值变化与最佳策略的对应关系,人工确定一组固定的阈值。这是最简单的方法,但可能无法适应所有用户和查询。
  • 动态阈值/自适应调度 :更高级的方法是让调度本身成为一个学习问题。可以将调度器建模为一个 强化学习智能体 ,其状态是当前的意图分布和熵值,动作是选择“思考”或“探索”,奖励是用户的正反馈(如点击相关视频)的累积。通过训练,智能体可以学会在何种熵值状态下选择何种策略能获得长期的最大奖励。这种方法更灵活,但需要大量的交互数据来训练。

实现建议 : 对于大多数实际项目, 从静态阈值开始 是稳妥的选择。可以先设定一个较宽的探索区间(较高的 H_high ),确保系统在初期有足够的探索性。然后通过A/B测试,根据用户满意度指标(如任务完成率、交互轮次、点击率)来逐步调整阈值。

4. 系统搭建与核心环节实现

假设我们要为一个短视频平台搭建一个基于ADEPT理念的交互式检索原型系统。以下是关键环节的实现步骤。

4.1 环境准备与数据预处理

技术栈选择 :

  • 深度学习框架 :PyTorch(研究友好,动态图灵活)。
  • 跨模态模型 :使用 OpenAI CLIP 的预训练模型(如 ViT-B/32 )或其开源变种(如 OpenCLIP)。对于视频,可以采用均匀采样多帧,分别通过CLIP图像编码器,然后对帧特征进行平均或时序聚合(如简单平均或使用一个轻量Transformer)。
  • 向量数据库 : FAISS ,用于高效存储和检索视频特征向量。
  • 后端服务 :FastAPI,提供RESTful API。
  • 前端交互 :简单的Web界面(React/Vue)用于展示视频和收集反馈。

数据预处理流程 :

  1. 视频特征提取 :
    import torch
    import clip
    from PIL import Image
    import decord # 高效视频读取库
    
    device = "cuda" if torch.cuda.is_available() else "cpu"
    model, preprocess = clip.load("ViT-B/32", device=device)
    
    def extract_video_feature(video_path, num_frames=8):
        vr = decord.VideoReader(video_path)
        frame_indices = np.linspace(0, len(vr)-1, num=num_frames, dtype=int)
        frames = vr.get_batch(frame_indices).asnumpy() # 获取帧数据
    
        frame_features = []
        for frame in frames:
            image = Image.fromarray(frame)
            image_input = preprocess(image).unsqueeze(0).to(device)
            with torch.no_grad():
                image_features = model.encode_image(image_input)
                image_features /= image_features.norm(dim=-1, keepdim=True) # L2归一化
                frame_features.append(image_features.cpu().numpy())
        # 聚合帧特征:简单平均
        video_feature = np.mean(frame_features, axis=0).squeeze()
        return video_feature.astype('float32')
    
  2. 构建向量索引 :将所有视频的特征向量存入FAISS的 IndexFlatIP (内积索引,等价于余弦相似度,因为向量已归一化)或 IndexIVFFlat (用于十亿级别的大规模库)。
  3. 意图状态管理器 :实现一个类,用于维护和更新高斯分布参数( mu , sigma )以及计算熵。

4.2 核心交互循环的实现

以下是系统核心循环的简化伪代码逻辑:

class ADEPTAgent:
    def __init__(self, faiss_index, clip_model, text_processor):
        self.index = faiss_index
        self.model = clip_model
        self.text_process = text_processor
        # 初始化意图分布:均值mu为初始查询向量,协方差sigma为一个较大的单位阵
        self.mu, self.sigma = self._init_intent_distribution(initial_query)
        self.entropy_threshold_high = 5.0 # 示例高熵阈值
        self.entropy_threshold_low = 1.0  # 示例低熵阈值

    def _compute_entropy(self):
        # 计算当前高斯分布的对数行列式作为熵的度量
        sign, logdet = np.linalg.slogdet(self.sigma)
        return 0.5 * logdet # 忽略常数项

    def _update_intent_distribution(self, positive_feedback_vecs, negative_feedback_vecs):
        # 贝叶斯更新近似:用正反馈向量更新mu,使其靠近正例;用负反馈缩小sigma或调整mu方向
        # 这里是一个简化的加权平均更新示例
        if positive_feedback_vecs:
            new_mu = np.mean(positive_feedback_vecs, axis=0)
            self.mu = 0.7 * self.mu + 0.3 * new_mu # 平滑更新
        # 简化更新sigma:随着反馈增加,逐渐减小不确定性
        self.sigma = self.sigma * 0.9 # 每次更新后收缩一些

    def _thinking_strategy(self, top_k=10):
        # 精排:计算与当前意图mu最相似的视频
        D, I = self.index.search(self.mu.reshape(1, -1), top_k*3) # 先多搜一些
        # 可以引入一个精排模型对I中的结果进行重新打分
        # reranked_scores = rerank_model.predict(self.mu, candidate_features[I])
        # final_indices = I[top_k_indices_based_on_reranked_scores]
        final_indices = I[0][:top_k] # 简化处理,直接取前top_k
        return final_indices, D[0][:top_k]

    def _exploration_strategy(self, top_k=6):
        # 探索:返回多样化的结果
        # 方法1:聚类采样
        candidate_num = 100
        D, I = self.index.search(self.mu.reshape(1, -1), candidate_num)
        candidate_features = self.index.reconstruct_batch(I[0])
        # 对候选特征进行聚类,例如分成3簇
        from sklearn.cluster import KMeans
        kmeans = KMeans(n_clusters=3, random_state=0).fit(candidate_features)
        cluster_labels = kmeans.labels_
        selected_indices = []
        for cluster_id in range(3):
            cluster_member_indices = I[0][cluster_labels == cluster_id]
            if len(cluster_member_indices) > 0:
                # 选取每簇中与簇中心最接近的一个
                selected_idx = cluster_member_indices[0] # 简化,实际应计算距离
                selected_indices.append(selected_idx)
        # 如果聚类结果不够,用最相似的结果补足
        while len(selected_indices) < top_k:
            for idx in I[0]:
                if idx not in selected_indices:
                    selected_indices.append(idx)
                if len(selected_indices) == top_k:
                    break
        return selected_indices[:top_k]

    def interact(self, user_feedback):
        # 1. 更新意图分布
        pos_vecs = self._get_feature_vectors(user_feedback.positive_video_ids)
        neg_vecs = self._get_feature_vectors(user_feedback.negative_video_ids)
        self._update_intent_distribution(pos_vecs, neg_vecs)

        # 2. 计算当前熵
        current_entropy = self._compute_entropy()

        # 3. 策略选择
        if current_entropy > self.entropy_threshold_high:
            strategy = "explore"
            result_video_ids = self._exploration_strategy()
            # 可以结合生成一个问题
            question = self._generate_clarifying_question()
        elif current_entropy < self.entropy_threshold_low:
            strategy = "think"
            result_video_ids, scores = self._thinking_strategy()
            question = None
        else:
            # 熵值在中间区间,可以维持上一轮策略,这里简化为使用思考策略
            strategy = "think (default)"
            result_video_ids, scores = self._thinking_strategy()
            question = None

        return {
            "strategy": strategy,
            "video_ids": result_video_ids,
            "clarifying_question": question,
            "current_entropy": current_entropy
        }

4.3 用户反馈接口设计

用户反馈是系统学习的源泉,设计得好坏直接影响效率。

  • 显式反馈 :
    • 二元反馈 :对每个返回的视频,提供“相关”/“不相关”按钮。信息明确,但交互成本高。
    • 排序反馈 :让用户拖动视频进行排序,表达相对偏好。信息量更大,但操作更复杂。
    • 主动问答 :直接回答系统提出的澄清问题。
  • 隐式反馈 :
    • 点击/播放时长 :用户点击观看某个视频,并观看了较长时间,可视为正反馈。
    • 跳过/快速关闭 :可视为弱负反馈。
    • 搜索词修改 :用户直接修改搜索框中的文本,这是最强的意图修正信号。

建议 :在原型系统中,优先实现 显式的二元反馈 ,因为它干净、易于建模。在实际产品中,则需要结合多种隐式反馈信号,通过多任务学习来综合判断用户意图。

5. 常见问题、调试技巧与效果优化

在实际开发和实验ADEPT这类系统时,会遇到一系列典型问题。以下是我从实践中总结的一些排查思路和优化技巧。

5.1 意图分布发散或不收敛

问题现象 :交互多轮后,熵值始终很高,意图分布的均值 mu 飘忽不定,系统似乎一直很“困惑”,在探索和思考间摇摆,无法给出稳定准确的结果。

可能原因与排查 :

  1. 反馈信号噪声大 :用户可能误点了不相关的视频,或者隐式反馈(如播放时长)被错误解读。
    • 排查 :检查反馈数据。对于显式反馈,增加确认机制(如“您确定这个不相关吗?”二次弹窗)。对于隐式反馈,需要仔细设计信号权重,例如,播放完成度超过80%才算强正反馈,低于10%算弱负反馈。
  2. 特征空间对齐差 :文本编码器和视频编码器产生的特征不在一个语义空间,导致“意图”和“视频”无法正确匹配。
    • 排查 :计算一些已知配对(如视频标题与视频本身)的相似度。如果相似度普遍很低或没有区分度,说明对齐有问题。
    • 解决 :使用更好的预训练跨模态模型(如更大的CLIP模型)。如果领域特殊(如医疗、专业体育),必须在领域数据上进行 微调 。
  3. 分布更新算法过于敏感或迟钝 :更新 mu 和 sigma 的公式中,学习率参数设置不当。
    • 解决 :引入 自适应学习率 。例如,当熵值高时,使用较大的学习率快速吸收新信息;当熵值低时,使用较小的学习率进行微调,防止被个别噪声反馈带偏。
  4. 探索策略过于激进 :探索策略返回的结果与当前意图完全无关,导致用户给出的反馈(通常是负面的)无法有效更新意图分布。
    • 解决 :为探索策略增加“锚定”约束。即使是在探索,返回的视频也应该与当前意图 mu 有一定的相关性(比如相似度高于某个最低阈值),确保探索是在相关领域内进行多样化尝试,而不是完全随机游走。

5.2 策略切换振荡

问题现象 :系统频繁在“思考”和“探索”模式间切换,用户体验割裂。

可能原因与排查 :

  1. 熵阈值设置不合理 : H_high 和 L_low 太接近,导致熵值在阈值附近微小波动就引发策略切换。
    • 解决 :在阈值之间设置一个 迟滞区间 。例如,当从探索切换到思考时,需要熵值低于 L_low (如1.0);而当从思考切换到探索时,需要熵值高于一个更高的阈值 H_high_new (如5.5)。这样可以避免在边界处的抖动。
  2. 熵值计算不稳定 :协方差矩阵 Σ 在某些情况下可能出现数值不稳定,导致熵值剧烈变化。
    • 排查 :记录每一轮的熵值、 Σ 的行列式值。检查是否有异常跳变。
    • 解决 :对 Σ 进行正则化,如添加一个小的单位矩阵 λI ,确保其正定性。 Σ' = Σ + λI 。

5.3 系统响应速度慢

问题现象 :每轮交互的延迟很高,影响用户体验。

瓶颈分析与优化 :

  1. 视频特征检索 :如果每次“思考”都需计算所有视频与 mu 的相似度,耗时无法接受。
    • 优化 :必须使用 近似最近邻搜索 。FAISS的 IndexIVFFlat 或 IndexHNSWFlat 索引在速度和精度间取得了很好平衡。建立索引后,检索耗时在毫秒级。
  2. 意图分布更新 :如果使用复杂的在线贝叶斯更新,计算协方差矩阵的逆可能较慢。
    • 优化 :采用对角协方差矩阵假设,即假设各维度独立。这样协方差矩阵就是一个对角阵,求逆和行列式计算都是O(n)复杂度,大大加快。虽然损失了相关性信息,但在实践中往往足够有效。
  3. 探索策略的聚类计算 :在线进行K-Means聚类开销大。
    • 优化 :可以预先对视频特征进行聚类,并为每个类簇保存一个代表向量(质心)。探索时,只需计算意图 mu 与各个簇质心的相似度,然后从最不相似的几个簇中各选一个视频即可,无需实时聚类。

5.4 效果评估与A/B测试指标

如何衡量ADEPT系统是否比传统检索更好?

离线评估 :

  • 模拟用户实验 :构建一个测试集,其中每个查询有理想的相关视频列表。编写一个模拟用户脚本,按照一定规则(如点击排序第一的相关视频)进行多轮交互。计算 任务成功率 (在N轮内找到相关视频的比例)和 平均交互轮次 。与基线系统(如单轮检索)对比。
  • 指标 :除了成功率,还可以用 累计折扣增益 来衡量每一轮返回列表的质量。

在线A/B测试 :

  • 核心指标 :
    • 任务完成率 :用户主动结束搜索(如点击“完成”按钮)的会话占比。
    • 平均会话时长/轮次 :完成任务的会话的平均交互轮次。理想情况是轮次减少。
    • 相关视频点击率 :用户点击被系统标记为“相关”的视频的比例。
    • 用户满意度调查 :在会话结束后弹出简短的评分问卷。
  • 实验设计 :将用户流量随机分为对照组(传统检索)和实验组(ADEPT交互式检索),对比上述指标。需要运行足够长时间以获取统计显著性结论。

构建一个像ADEPT这样的交互式检索智能体,是一个将信息论、机器学习和人机交互结合起来的系统工程。从简单的基于熵的规则调度开始,逐步迭代到基于强化学习的自适应调度,从显式反馈扩展到融合多源隐式反馈,这个框架提供了强大的灵活性和优化空间。最关键的是,它迫使我们去思考如何让机器更像一个“合作伙伴”,通过动态的对话来理解我们模糊而复杂的需求,而不仅仅是一个被动的工具。在实际落地时,务必从小处着手,先验证核心逻辑(双策略切换)的有效性,再逐步完善各个模块,并始终把用户体验放在首位进行权衡和优化。

Logo

邀请您加入社区

更多推荐