基于效用引导的智能体编排:从理论到工程实践 1. 项目概述从“能用”到“好用”的智能体进化之路最近在折腾大语言模型应用落地的朋友估计都绕不开一个核心痛点模型本身能力很强但让它稳定、高效、低成本地去调用外部工具比如查数据库、调API、执行代码完成一个多步骤的复杂任务简直是一场灾难。你可能会遇到工具调用顺序混乱、反复尝试无效操作、或者为了一个简单查询耗费大量token和算力的情况。这背后的本质是缺乏一个高效的“指挥官”来调度这些智能体Agent。我最近深度实践并重构了一个项目核心就是“Utility-Guided Agent Orchestration”翻译过来就是“效用引导的智能体编排”。这听起来有点学术但说白了就是给一群各有所长的AI“员工”配上一个精明的“项目经理”这个项目经理不看谁嗓门大而是看哪个行动“性价比”最高用最少的资源、最快的路径达成目标。这个项目非常适合正在构建复杂AI应用的产品经理、全栈工程师以及AI应用开发者。无论你是想做一个能自动分析报表并生成策略的商务助手还是一个能联网搜索、编写代码、再执行调试的编程副驾都会面临智能体协作的挑战。传统的链式调用Chain或简单路由Router在任务稍微复杂一点时就显得力不从心而基于效用的编排正是为了解决“效率”和“成本”这两个商业化落地的命门。它让LLM从“什么都能聊”的百科全书变成了“什么都能干”且“干得漂亮又经济”的智能执行者。2. 核心设计思路为什么是“效用引导”在深入代码之前我们必须先厘清设计哲学。为什么是“Utility-Guided”而不是基于固定规则、或单纯基于LLM的意图识别这源于我在多个实际项目中踩过的坑。2.1 从规则编排到动态效用评估的范式转变早期的智能体编排大多采用预定义的工作流Workflow。比如用户问“今天天气如何”流程固定为1. 调用意图识别Agent - 2. 调用天气查询Tool - 3. 调用格式化回复Agent。这种方式在场景明确时很稳定但缺乏灵活性。一旦用户问“今天适合穿什么”这个工作流就失效了因为它需要结合天气、地理位置甚至时尚知识等多个工具和智能体的协作。于是出现了基于LLM的路由器Router。用一个LLM来判断该调用哪个工具。这进了一步但问题依旧这个LLM路由器可能只会选择“最相关”的工具而不是“最有效”的工具。例如面对“帮我总结一下这篇关于量子计算的论文”的任务路由器可能认为“总结工具”最相关。但如果论文是PDF格式直接调用总结工具会失败而一个更“有效”的路径应该是先调用“PDF解析工具”再调用“总结工具”。路由器缺乏对工具执行成功率和资源消耗的全局考量。效用引导的核心思想就是将每一次工具调用或智能体行动视为一个投资决策。我们为每个潜在的下一步行动即每个可用的工具或智能体计算一个“效用值”Utility Score。这个值是一个综合评分通常由几个关键维度加权得出任务相关性该行动对完成当前子目标的贡献度有多高由LLM或嵌入模型评估历史成功率该工具在类似上下文历史中成功执行的频率。执行成本调用该工具所需的时间、Token消耗、API费用等。信息增益执行该行动后能为后续步骤减少多少不确定性例如一个确认用户偏好的查询可能比一个盲猜的推荐更有价值编排器Orchestrator的角色就是持续评估所有候选行动的效用值并选择当前时刻效用最高的行动来执行。这形成了一个动态的、自适应的决策循环。2.2 核心组件与交互架构设计基于上述思路一个典型的效用引导智能体编排系统包含以下核心组件我将其设计为一个松耦合的微服务化架构便于迭代和调试[用户输入/任务目标] | v [任务分解与规划智能体 (Planner Agent)] | (生成初始子任务序列或目标状态) v [效用引导编排引擎 (Orchestrator Engine)] -- 核心 | |-----------------------| | | v v [工具/智能体池] [效用评估器 (Utility Evaluator)] (Tool/Agent Pool) | | | 实时计算 | v |------- [上下文记忆体 (Context Memory)] | (记录历史动作、结果、状态) | v [动作执行器 (Executor)] | v [结果观察与学习模块 (Observer)] | (更新工具成功率、成本模型) | v [循环直至任务完成或终止]各组件详解与设计理由规划智能体并非必须但对于复杂任务一个轻量的规划步骤可以大幅缩小搜索空间。它不指定具体工具而是输出如“第一步获取用户位置第二步查询当地天气第三步生成穿衣建议”这样的抽象步骤。这为后续的效用评估提供了高级目标。效用评估器这是系统的大脑。我通常将其实现为一个可配置的加权评分函数或者一个小型的判别模型比主任务LLM轻量得多。它的输入是当前任务上下文、候选工具的描述、该工具的历史性能指标。输出就是一个效用分数。关键在于这个评估器的逻辑应该是可解释、可调整的。例如在成本敏感的场景可以调高“执行成本”的权重。工具/智能体池每个工具都需要一个标准化的“描述文件”不仅包括功能描述还应包含元数据如预估Token消耗、平均执行时间、所需输入格式、可能产生的错误类型。这些元数据是效用计算的重要输入。上下文记忆体这不仅仅是存储对话历史。它需要结构化地记录每一次工具调用的“状态动作结果效用”四元组。这既是当前决策的依据也是后续离线学习、优化效用评估模型的宝贵数据。观察与学习模块这是系统能从经验中成长的关键。每次工具调用后它根据实际结果成功/失败、耗时、Token用量反哺更新工具的历史成功率、平均成本等指标。甚至可以定期用收集到的四元组数据微调效用评估模型使其预测越来越准。实操心得在项目初期不要试图构建一个完美的、端到端的学习系统。我建议先从一个基于规则的加权效用函数开始。例如Utility 0.5 * 相关性分数 0.3 * (1 - 归一化成本) 0.2 * 历史成功率。手动调整这些权重观察系统行为这能帮你快速验证思路并积累最初的训练数据。很多团队一开始就想上强化学习结果在数据收集和奖励函数设计上就卡住了。3. 关键技术实现与细节拆解理论讲完了我们来看具体怎么实现。我会用一个“智能旅行助手”的场景贯穿始终用户说“我想下周末去杭州玩两天预算不高帮我规划一下”。3.1 工具标准化与效用元数据定义首先我们必须让工具“自我介绍”。我设计了一个统一的工具描述类以Python为例class ToolDescriptor: def __init__(self, name, description, function_schema, metadataNone): self.name name # 工具唯一标识如 search_flight self.description description # 自然语言描述用于相关性匹配 self.function_schema function_schema # 符合OpenAI Function Calling格式的JSON Schema self.metadata metadata or {} # 效用计算所需的元数据 # 必须的元数据字段示例 self.metadata.setdefault(estimated_token_cost, 1000) # 预估消耗Token self.metadata.setdefault(average_execution_time, 2.0) # 平均执行时间秒 self.metadata.setdefault(success_rate, 0.95) # 历史成功率初始可设一个默认值 self.metadata.setdefault(monetary_cost, 0.0) # API调用费用美元 self.metadata.setdefault(required_input_fields, []) # 必需输入字段列表例如对于“查询天气”工具weather_tool ToolDescriptor( nameget_weather, description查询指定城市未来几天的天气情况包括温度、降水概率等。, function_schema{ type: function, function: { name: get_weather, description: Get weather forecast for a city., parameters: { type: object, properties: { city: {type: string, description: 城市名称}, days: {type: integer, description: 预报天数} }, required: [city] } } }, metadata{ estimated_token_cost: 800, average_execution_time: 1.5, success_rate: 0.98, monetary_cost: 0.001, required_input_fields: [city] } )为什么这么设计标准化是编排的基础。function_schema确保了与主流LLM如GPT的兼容性。元数据字段为后续的效用计算提供了量化依据。required_input_fields尤其重要编排器可以检查当前上下文是否已满足这些条件如果不满足则该工具的效用值会大打折扣因为它很可能执行失败。3.2 效用评估器的核心算法实现效用评估器是核心。这里我实现一个混合评估器结合了基于嵌入的语义相关性和基于规则的效用计算。import numpy as np from sentence_transformers import SentenceTransformer class HybridUtilityEvaluator: def __init__(self, semantic_weight0.6, cost_weight0.25, success_weight0.15): self.semantic_model SentenceTransformer(all-MiniLM-L6-v2) # 轻量级嵌入模型 self.weights { semantic: semantic_weight, # 语义相关性权重 cost: cost_weight, # 成本权重反向 success: success_weight # 成功率权重 } def calculate_semantic_score(self, task_context, tool_description): 计算任务上下文与工具描述的语义相似度 # 将任务上下文如当前子目标和工具描述编码为向量 context_embedding self.semantic_model.encode(task_context, convert_to_tensorTrue) tool_embedding self.semantic_model.encode(tool_description, convert_to_tensorTrue) # 计算余弦相似度归一化到[0,1] from torch.nn.functional import cosine_similarity score cosine_similarity(context_embedding.unsqueeze(0), tool_embedding.unsqueeze(0)).item() return (score 1) / 2 # 将[-1,1]映射到[0,1] def calculate_cost_score(self, tool_metadata, cost_budgetNone): 计算成本得分成本越低得分越高 # 综合Token成本和时间成本这里用一个简单的加权和 total_cost ( tool_metadata[estimated_token_cost] / 1000 * 0.02 # 假设每千Token $0.02 tool_metadata[monetary_cost] tool_metadata[average_execution_time] * 0.1 # 假设时间成本系数 ) # 归一化处理使用sigmoid函数将成本映射为得分成本越高得分越低 # 这里假设成本在0-10范围内可根据实际情况调整scale normalized_cost total_cost / 10.0 cost_score 1 / (1 np.exp(normalized_cost - 2)) # 使曲线更陡峭 return cost_score def evaluate(self, task_context, tool_descriptor, context_memory): 综合评估单个工具的效用值 # 1. 语义相关性得分 semantic_score self.calculate_semantic_score(task_context, tool_descriptor.description) # 2. 成本得分 cost_score self.calculate_cost_score(tool_descriptor.metadata) # 3. 历史成功率得分直接从元数据或记忆体中获取 success_score tool_descriptor.metadata.get(success_rate, 0.5) # 4. 检查输入完备性否决项 current_state context_memory.get_current_state() # 获取当前已收集的信息 required_fields tool_descriptor.metadata.get(required_input_fields, []) input_satisfied all(field in current_state for field in required_fields) if not input_satisfied: # 如果必需信息缺失效用值直接置为极低但可以记录缺失字段用于提示用户或规划器 return 0.01, {missing_fields: required_fields} # 5. 加权综合 utility ( self.weights[semantic] * semantic_score self.weights[cost] * cost_score self.weights[success] * success_score ) return utility, {}关键点解析语义相关性使用轻量级句子嵌入模型如Sentence-BERT比用大模型计算便宜得多速度也快。成本建模calculate_cost_score函数将不同的成本Token、金钱、时间统一到一个标量上。这里的公式1 / (1 exp(...))是一个sigmoid函数它使得成本在某个阈值内变化敏感超过阈值后得分趋近于0。你可以根据业务需求调整这个函数。输入完备性检查这是一个强约束。如果调用工具所需的参数如city在当前上下文中不存在那么无论其他分数多高这次调用都极可能失败。因此我将其设计为“否决项”直接返回一个极低的效用值。更高级的做法是让编排器意识到缺失什么信息并主动触发一个“信息收集”智能体比如反问用户来获取它这本身也是一个候选行动。3.3 编排引擎的主循环与决策逻辑编排引擎是驱动整个系统运转的循环。以下是其核心逻辑的伪代码class UtilityGuidedOrchestrator: def __init__(self, tool_pool, evaluator, plannerNone, max_steps20): self.tools tool_pool self.evaluator evaluator self.planner planner # 可选规划器 self.memory ContextMemory() self.max_steps max_steps def run(self, user_query): self.memory.initialize(user_query) current_goal user_query for step in range(self.max_steps): # 1. 检查任务是否已完成 if self._is_task_complete(current_goal, self.memory): break # 2. 可选规划或更新当前子目标 if self.planner: current_goal self.planner.refine_goal(self.memory) # 否则current_goal 可以是整个用户查询或上一步的结果 # 3. 为所有可用工具计算效用值 candidate_utilities [] for tool in self.tools: utility, info self.evaluator.evaluate(current_goal, tool, self.memory) candidate_utilities.append((tool, utility, info)) # 4. 选择效用最高的工具 if not candidate_utilities: raise Exception(No available tools.) best_tool, best_utility, _ max(candidate_utilities, keylambda x: x[1]) # 5. 执行选中的工具 print(fStep {step}: Selecting tool {best_tool.name} with utility {best_utility:.3f}) try: result self._execute_tool(best_tool, self.memory) success True except Exception as e: result fTool execution failed: {e} success False # 6. 将执行结果存入记忆并更新工具元数据学习 self.memory.record_step( stateself.memory.get_current_state(), actionbest_tool.name, resultresult, utilitybest_utility, successsuccess ) self._update_tool_metadata(best_tool, success, result) # 7. 将结果作为新上下文的一部分进入下一轮循环 # LLM可能被调用来处理结果、生成回复或提炼信息 # 循环结束汇总结果并生成最终回复 final_response self._synthesize_response(self.memory) return final_response循环中的关键决策与优化点任务完成判定(_is_task_complete)这是一个难点。简单任务可以通过检查是否生成了最终答案字段来判断。复杂任务可能需要一个小型分类器或规则集例如“当机票、酒店、天气信息都已收集完毕且行程草稿已生成时任务完成”。规划器的集成规划器可以是一个轻量级LLM调用它根据当前记忆输出下一个最应该达成的“子目标”如“现在需要确定旅行日期”。这个子目标就作为current_goal传递给效用评估器能更精准地评估工具相关性。探索与利用的权衡上面的代码总是选择效用最高的工具贪婪策略。但在学习阶段可以引入ε-贪婪策略以一个小概率ε随机选择一个非最优工具以探索其潜力更新对其效用的认知。这能避免系统陷入局部最优。工具执行(_execute_tool)这里需要根据function_schema从当前记忆self.memory中提取参数然后调用实际的后端函数或API。4. 实战配置与性能调优理论落地配置是关键。以下是我在真实项目中总结出的配置清单和调优经验。4.1 工具池构建与效用权重初始化假设我们的旅行助手有以下工具search_flight: 搜索航班。search_hotel: 搜索酒店。get_weather: 查询天气。get_local_attractions: 获取当地景点。ask_user_for_clarification: 向用户澄清模糊需求如具体预算、偏好。generate_itinerary_draft: 根据已有信息生成行程草稿。初始权重配置建议在项目启动、缺乏历史数据时效用评估器的权重可以这样设置evaluator HybridUtilityEvaluator( semantic_weight0.70, # 初期高度依赖语义匹配 cost_weight0.20, # 成本有一定考量 success_weight0.10 # 初期成功率数据少权重低 )同时为每个工具设置合理的初始元数据。对于ask_user_for_clarification这种交互工具可以设置较低的estimated_token_cost因为它只是生成一个问题但较高的average_execution_time因为需要等待用户响应。它的success_rate可以初始化为0.9假设用户通常会回答。4.2 上下文记忆体的高效实现内存设计直接影响系统性能。不要简单存储整个对话字符串。我推荐使用向量数据库如Chroma、Weaviate和键值存储结合的方式。class ContextMemory: def __init__(self): self.facts {} # 存储确定的事实如 {destination: 杭州, budget: low} self.conversation_history [] # 原始对话轮次 self.action_history [] # 工具调用历史记录四元组列表 # 可选向量索引用于快速语义检索历史中的相关信息 self.vector_index VectorIndex() def get_current_state(self): 返回当前状态摘要用于工具参数提取和任务完成判断 # 合并facts和最近几条action的结果 state_summary {**self.facts} for action in self.action_history[-3:]: # 只看最近3个动作 if action.success: # 从结果中提取关键信息并入state_summary可能需要简单的解析 pass return state_summary def record_step(self, state, action, result, utility, success): self.action_history.append({ step: len(self.action_history), state: state, action: action, result: result, utility: utility, success: success }) # 如果成功尝试从result中提取结构化信息更新self.facts if success and self._is_factual_result(action, result): extracted_facts self._extract_facts(result) self.facts.update(extracted_facts)优化技巧_extract_facts函数可以利用一个小型的LLM调用如GPT-3.5-turbo或预训练的NER模型从工具返回的JSON或文本中提取键值对。例如从航班搜索结果中提取flight_dateairlineprice等。这使记忆体从“日志”升级为“知识库”极大提升了后续步骤的决策质量。4.3 成本控制与超时处理在效用计算中成本是核心维度。除了API费用更要关注时间成本和Token消耗。Token成本估算对于LLM类工具如生成行程其Token消耗与输入输出长度强相关。可以在工具描述中提供一个估算函数而不是固定值。metadata[token_cost_estimator] lambda input_text: len(input_text) // 4 500 # 粗略估算超时与熔断在_execute_tool中必须设置超时。如果一个工具长时间无响应应将其标记为失败并大幅降低其success_rate和增加其average_execution_time的估算值。这能防止系统被某个故障工具“卡死”。预算感知可以在编排器层面设置总预算如总Token上限、总时间上限。在每一轮计算效用时将已消耗资源占比作为一个全局惩罚项加入到所有工具的效用计算中。当接近预算时系统会倾向于选择更低成本的工具甚至提前终止。5. 常见问题排查与效能提升实录在实际部署中你会遇到各种各样的问题。下面是我遇到的一些典型问题及解决方案。5.1 问题一智能体陷入无效循环现象系统在两个或多个工具间来回切换无法推进任务。例如反复查询天气和景点但从不调用生成行程的工具。根因分析效用评估缺陷生成行程的工具可能因为required_input_fields如flight_info,hotel_info不满足效用值始终很低。而查询天气和景点的工具其输入条件city很容易满足且每次调用都能返回新信息如第二天的天气导致其效用值始终较高。任务完成条件误判系统可能错误地认为“收集信息”本身就是最终任务没有触发“合成信息”的阶段。解决方案动态调整权重随着步骤增加逐步降低“信息获取”类工具的语义权重同时提高“信息整合”类工具的权重。可以在evaluator中引入一个基于步数的衰减因子。引入进度感知让效用评估器能感知任务进度。例如当facts中包含了flight和hotel信息后generate_itinerary_draft工具的输入完备性得分应大幅提高。这需要更精细化的get_current_state实现。设置强制推进机制当检测到循环如最近5次动作都是同一类工具时临时给被困工具一个“助推”比如将其效用值人工提高一个阈值强制系统尝试一次。5.2 问题二工具调用成功率低现象工具频繁执行失败success_rate持续走低导致系统不敢调用它即使它是正确的选择。根因分析参数提取错误从current_state中提取的工具参数不准确或不完整。工具本身不稳定依赖的外部API时好时坏。错误处理不当工具抛出的异常没有被正确分类导致所有失败都被归为“工具问题”。解决方案强化参数提取使用更鲁棒的方法从记忆体中提取参数。除了简单的键值匹配可以使用LLM进行少量提示few-shot来提取和格式化参数。例如“根据以下对话历史提取出用户想要查询天气的城市名称{history}”。虽然这增加了一点成本但能大幅提升成功率。区分错误类型在record_step时不仅记录成功与否还记录错误类型如参数缺失、网络超时、API限流、逻辑错误。对于参数缺失应归咎于上下文记忆或参数提取逻辑不应过度惩罚工具本身的success_rate。实现重试与降级对于网络超时类错误编排器可以自动重试最多2次。对于某些关键工具可以配置一个功能相似的降级工具fallback tool。5.3 问题三响应速度慢用户体验差现象完成一个简单任务需要数十秒用户等待不耐烦。根因分析效用计算瓶颈如果工具池很大50每一轮都要计算所有工具的嵌入相似度耗时剧增。同步执行工具调用是同步的一个慢工具会阻塞整个流程。LLM调用过多规划、参数提取、结果生成都依赖LLM串行调用导致延迟累加。解决方案工具预筛选在精细效用计算前先进行一轮快速筛选。例如只选择那些required_input_fields被满足度超过80%的工具进入候选池。可以用基于关键词的快速匹配。异步执行与预测对于彼此没有强依赖的工具可以考虑并行执行。更激进的做法是编排器预测未来几步可能需要的工具提前异步调用预取但这需要很强的预测准确性否则会造成资源浪费。优化LLM使用缓存对相同的中间问题如多次提取相同结构的参数的LLM响应进行缓存。合并请求将多个小的LLM调用如参数提取和结果摘要合并为一个设计好的提示词Prompt一次调用完成多项工作。使用小模型对于判别性任务如分类、提取优先使用小型微调模型或嵌入模型而非巨型通用LLM。5.4 效能提升检查表根据你的业务阶段可以参考下表进行优化阶段核心目标推荐优化措施原型验证快速验证流程可行性1. 使用固定规则编排if-else快速跑通流程。2. 手动定义3-5个核心工具的效用权重。3. 关注核心工具链是否能完成任务。初期上线提升任务完成率和稳定性1. 实现基础的效用引导编排权重以语义相关性为主。2. 完善所有工具的错误处理和重试机制。3. 建立工具调用日志开始收集状态动作结果数据。规模增长优化成本和响应速度1. 基于历史数据校准工具的cost和success_rate元数据。2. 引入工具预筛选和异步调用。3. 优化上下文记忆结构减少冗余信息传递。成熟运营实现自适应与个性化1. 使用收集的数据微调效用评估模型如一个小型神经网络。2. 实现用户画像感知的效用调整如为VIP用户降低成本权重。3. A/B测试不同的编排策略和权重配置。这套“效用引导的智能体编排”框架本质上是在不确定性中寻找最优解的工程实践。它没有魔法而是将决策过程从黑盒变成了白盒让我们可以通过调整权重、分析日志来理解和优化AI系统的行为。从我的经验来看最大的收益不是让系统一下子变得完美而是获得了可观测性和可调控性。当业务方问“为什么这次响应这么慢”时你可以清晰地指出是哪个工具成本高当需要优化成本时你可以有依据地调整权重而不是盲目猜测。这个过程本身就是AI工程化从艺术走向科学的关键一步。

相关新闻

最新新闻

临床意图驱动的自主编码智能体:让医生用自然语言构建医疗AI模型

临床意图驱动的自主编码智能体:让医生用自然语言构建医疗AI模型

1. 项目概述:从临床意图到临床模型的跨越最近和几位在医院信息科和临床科室工作的朋友聊天,大家不约而同地提到了同一个痛点:临床医生有绝佳的AI应用想法,但苦于不懂代码,想法只能停留在PPT上;而懂技术的工…

2026/8/18 5:32:31
Word工具栏MathType选项卡消失?从COM加载项原理到彻底修复方案

Word工具栏MathType选项卡消失?从COM加载项原理到彻底修复方案

1. 问题重现:当Word工具栏里找不到MathType时如果你正在处理一份包含大量数学公式的文档,比如学术论文、技术报告或者试卷,那么MathType几乎是不可或缺的帮手。它能让你像在Word里输入文字一样,流畅地编辑复杂的数学符号。但最让人…

2026/8/18 5:32:31
解决“未注册Microsoft.ACE.OLEDB.12.0提供程序”错误的完整指南

解决“未注册Microsoft.ACE.OLEDB.12.0提供程序”错误的完整指南

1. 问题现象与核心原因剖析“未在本地计算机上注册‘Microsoft.ACE.OLEDB.12.0’提供程序。” 这句话,对于经常需要处理Excel、Access等文件进行数据导入导出或分析的开发者、数据分析师来说,简直是一个“老朋友”。它通常在你满怀信心地运行一段连接数据…

2026/8/18 5:32:31
大众电动滑板车:城市微出行通勤解决方案与选购指南

大众电动滑板车:城市微出行通勤解决方案与选购指南

1. 从“最后一公里”到“第一公里”:城市通勤的电动滑板车新解法最近,大众汽车发布了两款电动滑板车,这消息乍一看有点跨界——一个造汽车的巨头,怎么突然搞起“小玩意儿”了?但如果你像我一样,每天在拥挤的…

2026/8/18 5:32:31
Windows系统下iTunes完全卸载指南:从标准流程到深度清理

Windows系统下iTunes完全卸载指南:从标准流程到深度清理

1. 项目概述:为什么“干净卸载”如此重要?如果你在Windows电脑上用过iTunes,大概率遇到过这样的糟心事:明明已经通过控制面板卸载了程序,但想重装一个新版本时,系统却提示“已安装更新版本”;或…

2026/8/18 5:32:31
具身智能中动作可行性学习:CWM对比世界模型原理与应用

具身智能中动作可行性学习:CWM对比世界模型原理与应用

1. 从“撞墙”到“预判”:具身智能体为何需要可行性学习 在具身智能(Embodied AI)的研究和开发中,我们常常会遇到一个令人沮丧的场景:你精心设计的智能体,在模拟环境或现实世界中,对着空气挥舞手…

2026/8/18 5:27:30