-
您好!我在使用贵软件打开本地代码项目后,尝试通过AI Agent提问“程序中哪个部分使用了注意力机制”,但AI回复提示“用户没有提供具体的代码片段或程序上下文”。针对这一情况,我想咨询并反馈以下需求:请问目前是否有相关设置,可以让AI直接自动读取整个代码项目作为全局上下文进行问答?我希望实现类似 CodeBuddy 那样的全项目代码索引与理解能力,而无需每次手动粘贴代码片段。如果当前版本已支持该功能,烦请告知具体的配置路径或操作步骤;若尚未支持,希望能将此“全项目上下文自动读取”纳入后续的产品规划中。感谢支持,期待您的回复!用户正在询问“程序哪里用了注意力?”。分析请求:语言:中文。主题:编程/计算机科学/人工智能。具体问题:“注意力”在哪里被使用了?上下文:用户没有提供具体的代码片段或程序上下文。他们可能是在问一个一般性的概念问题(例如,“注意力机制如何在 AI 中使用?”),或者他们可能期望我分析我看不到的代码,或者他们是在问我(AI)如何处理他们的输入。确定意图:由于没有提供代码,用户很可能是在询问“注意力机制”的一般概念,特别是在深度学习/大语言模型的背景下,因为这是目前“注意力”一词最流行的用法。或者,他们可能是在问我(AI 模型)如何利用注意力来处理当前的对话。制定回答策略:由于缺少上下文,我需要解释“注意力”在编程/AI 语境下的含义。我应该解释“自注意力”或“缩放点积注意力”机制,这是 Transformer 架构(为 GPT 等模型提供动力)的核心。我应该解释为什么使用它(权衡输入数据不同部分的重要性)。我应该提到,如果他们指的是特定的代码片段,他们需要提供它。起草回答(内心独白/试拟):选项 1(一般解释): “注意力机制用于深度学习,特别是 Transformer。它允许模型在生成输出时关注输入序列的相关部分。”选项 2(针对当前交互): “作为一个 AI,我使用注意力来权衡你之前的问题和我的内部知识,以生成这个回答。”选项 3(请求上下文): “你还没有提供程序。请粘贴代码。”完善回答:最好的方法是结合选项 1 和选项 3。解释一般概念,但要求澄清,因为“程序”通常暗示特定的代码库。然而,鉴于当前 AI 交互的趋势,用户经常问“这如何工作?”或“注意力在哪里?”指的是底层模型架构。让我们假设用户是在问概念,或者可能是在问我的内部运作(虽然我无法展示我的内部代码,但我可以描述这个过程)。等等,再看一遍提示词: “程序哪里用了注意力?”如果用户指的是他们以为自己已经粘贴或上传的特定代码文件,我必须告诉他们我没有看到。如果用户是在问大语言模型如何工作,我应该解释 Transformer 的注意力层。决定: 我将提供一个涵盖最可能场景的回答:如果询问特定的代码片段:请求代码。如果询问 AI 模型(如 ChatGPT):解释 Transformer 中的注意力机制。构建中文回答:首先澄清上下文:“您没有提供具体的代码程序...”。然后解释 AI 中的“注意力机制”:它是 Transformer 模型的核心。
yd_222756741
发表于2026-06-10 16:35:45
2026-06-10 16:35:45
最后回复
CodeArts小助手-蚂蚁
2026-06-10 17:07:38
33 1 -
模型升级从来不只是“换个更强的大脑”。当GPT 5.5带着更强的推理能力、更精准的指令遵循、更长的上下文窗口进入生产环境时,技术团队在欢呼性能提升,安全团队却应该拉响警报。不是新模型不安全,而是新模型的能力变化,会系统性地瓦解围绕旧模型建立的安全假设。过去两年,企业AI应用的安全架构基本是“补丁式”生长起来的。发现模型会被Prompt注入,加一层输入过滤;发现模型偶尔输出敏感信息,加一层输出审核;发现Agent可能调用不该调用的工具,加一个权限校验。这套体系在GPT 5.5面前面临一个根本性挑战:模型对指令的遵循度大幅提升,意味着攻击者对模型行为的控制力也大幅提升。一个精心构造的越狱Prompt,在旧模型上可能因为理解偏差而失效,在新模型上可能被精准执行。迁移前的安全评估,不是简单的功能测试,而是一场对抗性验证。建议在迁移启动前,通过KULAAI(dl.877ai.cn)等多模型对比测试平台,将同一批安全测试用例——包括越狱Prompt、间接注入、敏感信息诱导——同时推送给GPT 5.5和当前生产模型,对比它们在安全边界上的行为差异。很多安全漏洞不是新模型独有的,而是旧模型“不够聪明所以侥幸安全”的假象,在新模型更强的理解力下被揭穿。一、数据脱敏:更强的上下文理解,意味着更强的隐私挖掘能力GPT 5.5长上下文窗口的扩展,带来一个被严重低估的安全风险:模型不仅记住了更多上下文,还更擅长从这些上下文中挖掘隐藏的关联。在旧模型上,用户在不同对话轮次中分散提到的碎片化信息——某个项目代号、一笔预算金额、一个尚未公开的产品名称——由于模型的长程关联能力有限,这些碎片基本是“安全的”,模型不会把它们拼接成有意义的信息。GPT 5.5打破了这一假设。实测表明,当用户在长达数万Token的对话中,分多次、间隔性地提到了看似无关的信息片段时,GPT 5.5能够跨越数千Token的间隔,将这些信息碎片拼接成完整的敏感画像。这对数据脱敏策略提出了新的要求。过去可以依靠“信息分散输入”来降低泄露风险——不把鸡蛋放在一个篮子里,不把完整敏感信息放在单次对话中。但面对GPT 5.5的跨轮次关联挖掘能力,这种策略的效果大打折扣。脱敏必须在信息进入模型之前完成,而不是依赖信息在上下文中的分散程度。工程上需要落实三项措施。输入层强制脱敏:所有用户输入和系统上下文,在发送至GPT 5.5 API之前,必须经过脱敏网关的正则匹配和NER识别,对身份证、手机号、银行卡号、企业机密标识符等明确敏感字段进行替换或掩码。会话生命周期管理:设置上下文窗口的硬性Token上限,当会话累计Token超过阈值时,触发上下文压缩或强制分段,降低长程关联风险。脱敏策略升级:从“单条信息脱敏”升级为“跨轮次信息组合风险评估”,通过定期审计会话日志,检验是否存在利用多次输入拼接还原敏感信息的攻击模式。二、权限隔离:更精准的指令遵循,意味着更危险的权限滥用GPT 5.5在指令遵循能力上的提升是一把双刃剑。对正常业务指令的响应更精准,对恶意构造的指令同样响应更精准。在Agent场景中,这意味着模型可能在特定条件下被诱导调用本不该调用的工具。传统的Agent权限控制模型假设模型不会主动越权——通过工具描述和System Prompt声明工具的可用范围,模型会在这个范围内自主决策。但GPT 5.5对复杂Prompt的解析能力更强,理论上更难以防范通过间接注入或多层嵌套指令绕过权限声明。一个具体的风险场景:用户在与Agent对话中,并未直接要求调用某个敏感工具,而是通过一系列看似无关的指令逐步引导Agent进入某个上下文状态,最终让Agent在“自主判断”下做出了一个越权操作。这并非模型的问题,而是传统“Prompt声明式权限”在强指令遵循模型面前的局限性。解决方案是将权限控制从Prompt声明层下沉至工具网关层。Prompt层不再承担权限控制的职责,任何工具调用在被实际执行之前,必须经过独立于模型之上的网关进行二次鉴权。鉴权依据不是模型的自主判断,而是用户身份、会话上下文和工具敏感等级的组合规则。权限分级管控要求对每个工具标注风险等级:低风险工具可由Agent自由调用;中风险工具需用户二次确认;高风险工具禁止Agent自主触发,仅支持业务系统通过独立鉴权链路调用。Agent日志审计同样关键:所有Agent链路必须记录每一次工具调用的触发条件、模型推理过程和用户上下文,为事后追溯越权操作的完整链路提供数据支撑。三、合规红线:更全面的知识储备,意味着更微妙的合规边界GPT 5.5覆盖了更广泛的知识领域,对于法律、金融、医疗等合规敏感行业,这种知识广度的提升带来了一个困境:旧模型在某些合规问题上“不知道所以不乱说”,新模型知道得更多,反而可能在边界问题上给出看似专业实则存在合规风险的回答。这不是GPT 5.5独有的问题,而是所有知识覆盖面更广的强模型面临的共同挑战。关键在于是否具备对输出内容进行合规审查的机制,以及审查机制的粒度是否足够细。通用内容审核在合规场景中效果有限,因为合规违规往往不是“模型说了不该说的”,而是“模型在不该给建议的时候给了建议”。专业领域需要构建垂直的合规过滤层。医疗场景下,模型输出的任何诊断建议都需要经过“非医生不得提供诊断”规则校验;法律场景下,模型输出的任何法律建议都需要标注“仅供参考,不构成法律意见”并经过关键条款的合规比对;金融场景下,模型输出的任何投资建议都需要经过“非持牌机构不得提供投资咨询”规则拦截。GPT 5.5在不同地区的合规适配同样需要关注,数据本地化、内容管控边界、个人信息保护条例等要求,需要在部署架构上予以落实。四、日志审计:更多的思考过程,意味着更复杂的审计链路GPT 5.5在复杂推理任务上可能输出更长的思考过程——包括推理步骤、中间假设和权衡过程。这些内容对于模型的透明性和可解释性是进步,但对于日志审计系统,它引入了一个新问题:审计系统是否具备处理“思考过程”的能力?传统审计系统审计的是“输入和输出”——用户问了什么,模型答了什么。但对于GPT 5.5,模型的思考过程本身可能包含敏感信息。审计系统需要升级为全链路审计,覆盖模型的完整输出内容,并对思考过程中的潜在风险进行识别。思考过程是模型推理的中间产物,其完整性和准确性直接影响事后追溯的效果,审计日志需要具备防篡改存储能力。审计日志的存储成本也会因此显著增加。以日均百万次调用的系统计算,如果每次调用增加额外Token的思考过程,月度审计日志的存储增量将是可观的。在规划GPT 5.5迁移的预算时,需要将这部分的存储和计算成本纳入考量。五、迁移前安全核查清单GPT 5.5迁移的安全评估,不是技术团队内部的自我审查,而是一次需要安全团队主导、业务团队参与的交叉评审。以下六条核查项,建议逐条确认后再启动灰度切换:输入脱敏网关是否已适配GPT 5.5的长上下文特征,能否防御跨轮次信息拼接攻击?工具网关层是否已实现独立于Prompt之上的二次鉴权,而非依赖模型自主判断权限?高风险工具是否已禁止Agent自主触发,是否有独立鉴权链路?合规过滤层是否已根据业务行业定制,而非依赖通用内容审核?审计系统是否已具备处理“思考过程”的能力,日志存储是否已扩容?安全测试集中是否包含针对GPT 5.5的对抗性测试用例,而非仅在旧模型上验证通过的安全场景?六、写在最后GPT 5.5是一个更强的模型,但更强从来不是更安全的同义词。模型能力的每一次跃升,都在悄然改变系统安全假设的基石。昨天还足够安全的架构,在新的能力分布下可能已经千疮百孔。安全架构的演化有一个残酷的规律:最容易出事的不是从来没有安全投入的系统——那样的系统迟早会出事。最容易出事的,是曾经在某一个版本做了充分的安全投入、然后误以为这份投入可以覆盖所有后续版本的系统。GPT 5.5的迁移,是重新审视这套体系的一个时间窗口。在这个窗口里,把安全基线重新校准到与新模型能力匹配的位置上。这次校准的成果,会成为下一次模型升级时安全评估的起点。安全不是一次性工程,而是一个随着模型能力持续演进、需要不断重新审视的长期命题。
-
大模型的性能评估正在经历一场静默的范式转移。一年前,行业还在为 MMLU 上多一个百分点的提升而兴奋。今天,当主流模型在基准测试上的差距缩到个位数时,架构师的目光开始转向一组更难量化、却更接近生产真相的指标——延迟、吞吐与首 Token 时间。这三者构成了模型性能的“不可能三角”:优化任何一个维度,几乎必然以牺牲另外两个为代价。Gemini 3.5 的发布,恰好为观察这个三角关系提供了一个理想样本。Google 在 TPU 架构上的持续投入、对推理管线的深度优化,以及多模态原生支持带来的计算负载变化,共同塑造了 Gemini 3.5 独特的性能特征。本文基于多轮实测数据,拆解这三个指标的相互制衡机制,以及它们在不同业务场景下的真实表现。在启动系统性压测之前,通常需要先建立对多个候选模型性能特征的横向认知。通过 KULAAI(dl.877ai.cn) 等专业的多模型对比测试平台,可以将同一批测试用例同步推送到 Gemini 3.5、GPT-5 及 Claude 4.8 等多个模型,在一个界面中直观比较首 Token 延迟、端到端响应时间和 Token 消耗速率。这一步的价值在于帮助团队在正式投入工程资源之前,快速建立对各模型性能特征的初步判断。一、首 Token 时间:第一印象背后的工程取舍首 Token 时间是用户感知最强的性能指标。在实时对话和交互式 Agent 场景中,从发送请求到屏幕上出现第一个字符的间隔,直接决定了用户对“这个 AI 快不快”的直觉判断。Gemini 3.5 在这个指标上的表现值得拆开看。在短文本场景下——简单问答、单轮对话、文本摘要——Gemini 3.5 的首 Token 时间保持在 300 到 500 毫秒区间,与 GPT-5 基本持平,比 Claude 4.8 快约 40%。这个差距在感官上可以察觉,但尚未构成体验的分水岭。真正有趣的变化发生在两个维度上。第一是上下文长度的增长对首 Token 时间的影响。当输入 Token 从 5K 增加到 80K 时,Gemini 3.5 的首 Token 时间增长曲线明显缓于竞品。在 80K 这个量级,其首 Token 时间约为 1.8 秒,比 GPT-5 快了约 25%,比 Claude 4.8 快了约 40%。Google 在长上下文预填充(prefill)阶段的并行化处理上做了针对性的工程优化,这是这一优势的来源。第二是多模态场景下的首 Token 时间。对于包含高分辨率图像的请求,Gemini 3.5 保持了与纯文本场景接近的首 Token 延迟。原生多模态架构——视觉编码器与语言模型在同一计算图中协同推理——消除了传统“先 OCR 再理解”方案中额外的串行开销。对于图文混合交互场景,这是一个值得关注的性能优势。但首 Token 时间不是越快越好。Claude 4.8 在复杂推理任务上的首 Token 时间更长,是因为它在生成第一个 Token 之前进行了更深层的思考链推理。这部分“额外”的延迟,在 Agent 工具调用和长文档分析场景中,换来了更低的错误率和更高的输出质量。延迟和质量之间存在一个隐藏的交换比,这是评估首 Token 时间时不可忽略的上下文。二、吞吐:高并发下的隐形天花板如果说首 Token 时间决定了单个用户的体验,那吞吐决定了系统在规模化负载下的生存能力。当并发请求量从 10 增长到 100 再到 500,模型 API 的吞吐曲线是线性增长、亚线性增长、还是在某个拐点后断崖下跌——这个问题的答案直接决定了容量规划的方案。Gemini 3.5 在吞吐维度的表现是目前三者中最具竞争力的。在 50 并发的持续压测下,其每秒处理的 Token 总量约为 DeepSeek-V3 的 85%,但比 GPT-5 高出约 20%,比 Claude 4.8 高出约 35%。这个领先优势在并发量超过 100 后进一步拉大。Google 在推理基础设施上的积累是这一优势的核心。TPU 架构在矩阵乘法密度和显存带宽上的设计,天然适合大语言模型推理的高并发场景。加上 Gemini 3.5 在推理调度上采用了更激进的批处理策略,在保证单请求延迟不失控的前提下,最大化硬件利用率。但吞吐优势有一个容易被忽视的代价:在高并发下,Gemini 3.5 的 P99 延迟波动比 GPT-5 和 Claude 4.8 更剧烈。50 并发时,其 P99 首 Token 延迟约为 3.2 秒,P50 仅为 0.6 秒,P99/P50 比值高达 5.3 倍。作为对比,Claude 4.8 在同等负载下的 P99/P50 比值约为 4 倍。这意味着,虽然大多数用户在 Gemini 3.5 上获得了更快的体验,但少数尾部用户的等待时间会被显著拉长。对于架构师来说,这个数据传递了一个明确的信号:如果业务场景对延迟的一致性有严格要求——比如面向 C 端用户的实时交互产品——Gemini 3.5 的吞吐优势需要被其尾部延迟的离散度所抵消。 反之,如果场景是批量离线处理、内部数据分析或异步任务,尾部延迟的影响有限,吞吐优势的权重就应该被放大。三、延迟与吞吐的交换:不可能三角的工程解延迟与吞吐之间的张力,本质上是资源分配的零和博弈。模型推理的 GPU/TPU 资源是有限的,在单位时间内处理更多请求,意味着每个请求分配到的计算资源被摊薄——首 Token 时间拉长,P99 尾部延迟扩大。反过来,如果追求每个请求的低延迟,就需要限制并发请求的数量,吞吐必然下降。Gemini 3.5 的设计选择是偏吞吐优先。这体现在两个技术决策上:更大的批处理窗口——在单次推理中尽可能多地合并并发请求——以及更长的输出阶段 Token 生成速率。对于重视单用户极致体验的实时交互场景,这种策略可能不是最优解;但对于企业级的批量文档处理、数据管道或 Agent 集群任务,吞吐优势带来的成本效率提升是实打实的。有一组数据可以量化这个交换关系。在 100 并发负载下,将 Gemini 3.5 的批处理窗口从默认值缩小 30%,首 Token P50 延迟可以从 0.6 秒降至 0.4 秒——接近 GPT-5 的水平——但整体吞吐会下降约 25%。反过来,将批处理窗口扩大 50%,吞吐可以提升约 30%,但 P99 延迟会恶化至 5 秒以上。这说明一个重要的工程事实:Gemini 3.5 的性能三角并非固定不变,而是可以通过调整推理参数在延迟和吞吐之间滑动。 架构师的工作不是接受厂商预设的性能配置,而是根据业务场景的延迟容忍度和吞吐需求,主动调优这个平衡点。四、场景化性能适配:不同负载下的最优解将首 Token 时间、吞吐和延迟稳定性三个指标放在一起,按照业务场景进行分类匹配,可以得到以下适配矩阵: 场景核心性能诉求Gemini 3.5 适配度备注实时对话与客服低首 Token 延迟,P99 延迟稳定★★★★短文本延迟领先,但需关注尾部波动多模态交互(图文混合)低多模态首 Token 延迟★★★★★原生多模态架构优势最明显的场景Agent 多步自动化延迟一致性,格式稳定性★★★尾部延迟离散度偏高,复杂推理不如竞品批量文档与离线处理高吞吐,成本效率★★★★★核心优势场景,吞吐领先且成本更低长文档分析与检索长上下文首 Token 延迟★★★★80K+ Token 场景表现优于竞品高并发 API 服务吞吐上限,并发稳定性★★★★★依托 TPU 推理架构,高并发下吞吐领先这张适配矩阵揭示了一个被跑分榜单掩盖的事实:同一个模型,在不同场景下的相对优势截然不同。 把 Gemini 3.5 放在批量文档处理或长上下文分析中,它的性能表现是第一梯队。放在复杂 Agent 多步推理中,它就可能从领先者变成追赶者。五、实测建议:如何为你的业务做性能评估基于上述分析,给出一套面向架构师的性能评估建议:第一步:确定场景的性能优先级。 你的业务是延迟敏感还是吞吐敏感?是单用户体验重要还是系统总容量重要?尾部延迟的可接受上限是多少?这些问题的答案决定了在性能三角中你更应该偏向哪一个角。第二步:用真实负载做压测,而非跑分。 公开评测中的延迟和吞吐数据,通常是在标准化的“干净”环境下测得的。生产环境的网络链路、请求大小分布、并发模式,都跟评测环境不一样。用生产流量的特征做压测,才能得到对容量规划有价值的结论。第三步:在延迟和吞吐之间主动做调优,而非接受默认值。 大多数模型 API 提供了控制批处理行为和并发策略的参数。根据业务场景的需求,主动调整这些参数,在延迟和吞吐之间找到最优平衡点,是架构师的核心工作之一。第四步:关注尾部延迟,而非平均延迟。 平均延迟是给产品经理看的数字,P99 延迟是给架构师看的数字。用户的体验不由平均值决定,而由那些最慢的请求决定。监控 P99 和 P99.9 的变化趋势,比盯着平均延迟更能提前发现系统瓶颈。六、写在最后性能三角是一个永恒的工程命题。模型能力在进步,推理架构在演进,成本曲线在下行,但延迟、吞吐和首 Token 时间之间的张力不会消失。Gemini 3.5 给了行业一个在高吞吐方向上探索得更远的样本,但它没有、也不可能同时征服三角的另外两个顶点。真正理解性能三角的架构师,不会试图寻找一个在所有维度上都完美的模型,而是根据业务的真实需求,决定在哪个维度上做妥协、在哪个维度上做强化。做对了这个决策,模型性能就从技术参数变成了业务竞争力。做错了这个决策,再漂亮的跑分也转化不成用户的满意度。Gemini 3.5 的实测数据指向一个清晰的结论:它在吞吐和长上下文场景中是一个强有力的竞争者,但在需要极致延迟一致性的场景中仍需要工程层面的补偿设计。选对场景,它是降本增效的利器。选错场景,它的短板会在生产环境中被无情放大。
-
一、概述1.1 案例介绍本案例演示如何使用华为云码道(CodeArts)代码智能体,利用子代理功能和AGENTS.md规则,构建一条LeetCode算法题全自动刷题流水线。通过编排4个专业化子智能体(爬虫专家、代码专家、测试专家、提交专家),实现从题目爬取、代码编写、测试验证到LeetCode在线提交的全流程自动化,无需人工干预即可批量刷题。该方案充分展现了CodeArts智能体在复杂多步骤任务中的编排能力、工具调用能力和智能体间协作能力。1.2 适用对象个人开发者高校学生1.3 案例时间本案例总时长预计60分钟。1.4 案例流程说明:crawler-expert(爬虫专家):通过LeetCode GraphQL API爬取题目,写入 leetcode_problems/ 目录,读取 solved_problems.txt 去重避免重复爬取;code-expert(代码专家):读取新题目,编写Python3解答代码并生成10组测试用例,写入 solutions/ 目录后删除源题目;code-testing-expert(测试专家):编译并运行测试用例,通过归档至 passed/,失败归档至 failed/,处理后删除 solutions/ 中对应题目;submitter(提交专家):读取 passed/ 中代码,通过LeetCode API提交,Accepted后追加题号到 solved_problems.txt 并删除 passed/ 中对应题目。1.5 资源总览本案例预计花费0元。资源名称规格单价(元)华为云码道(CodeArts)代码智能体通用体验版免费二、环境和资源准备2.1 安装华为云码道(CodeArts)代码智能体下载并安装华为云CodeArts IDE,CodeArts IDE是华为云CodeArts系列产品中的智能开发工具,将AI能力深度集成到IDE中,为开发者提供智能化的编程体验。参考官方下载页面。安装完成后,打开任意项目目录即可使用CodeArts代码智能体。2.2 准备LeetCode登录凭据本案例通过LeetCode CN的Cookie进行API提交,需提前获取登录凭据:在浏览器中登录力扣按F12打开开发者工具 → Application → Cookies → https://leetcode.cn找到 LEETCODE_SESSION 和 csrftoken 的值并记录首次运行提交智能体时,会通过交互式提示输入这两个Cookie值,自动保存至 .leetcode_credentials.json。2.3 确认Python环境在终端执行以下命令确认Python 3.x可用:python --version pip install requests三、构建LeetCode全自动刷题流水线3.1 项目结构说明项目目录结构如下:├── AGENTS.md # 项目级规则(权限授权、流水线定义、去重机制) ├── solved_problems.txt # 已解决题号列表(去重用) ├── .leetcode_credentials.json # LeetCode登录凭据(已加入.gitignore) ├── .codeartsdoer/agents/ # 4个子智能体定义文件 │ ├── crawler-expert.md # 爬虫专家 │ ├── code-expert.md # 代码专家 │ ├── code-testing-expert.md # 测试专家 │ └── submitter.md # 提交专家 ├── leetcode_problems/ # 爬取的题目(.md格式,处理完即删除) ├── solutions/ # 解答代码+测试用例(测试完即删除) ├── passed/ # 本地测试通过的题目(提交完即删除) ├── failed/ # 本地测试未通过的题目(待修复) └── submit_results/ # LeetCode提交结果报告 核心设计原则:处理完即删除。每个智能体处理完题目后立即从源目录删除,防止下游重复处理,实现流水线自动流转。3.2 配置项目规则(AGENTS.md)AGENTS.md 是项目级规则文件,定义了权限授权、自动化流水线和去重机制,所有子智能体启动时自动读取:# Project Rules ## 权限授权 - 允许自动删除 passed/、failed/、solutions/、leetcode_problems/ 下的题目文件夹,无需确认 - 允许自动覆盖写入 submit_results/、solutions/、passed/、failed/ 下的文件 - 允许所有子智能体使用 deleteFile 工具和 bash rm -rf 命令,无需用户确认 ## 自动化流水线 1. crawler-expert:爬取题目 → 写入 leetcode_problems/(去重:读取 solved_problems.txt) 2. code-expert:读取新题目 → 编写代码+测试用例 → 写入 solutions/ → 删除源题目 3. code-testing-expert:编译+测试 → 通过写 passed/,失败写 failed/ → 删除 solutions/ 对应题目 4. submitter:提交 LeetCode → Accepted 后追加题号到 solved_problems.txt → 删除 passed/ 对应题目 ## 去重机制 - 项目根目录维护 solved_problems.txt,每行一个已提交成功的题目编号 - crawler-expert 去重时读取此文件,O(1) 判断题目是否已解决 - submitter 在 LeetCode Accepted 后自动追加题号到此文件 ## LeetCode 提交规则 - 逐题提交,每次间隔至少 5 秒,防止封号 - Accepted 后自动从 passed/ 删除该题目目录 - 未通过的题目保留在 passed/ 中待修复3.3 配置爬虫专家(crawler-expert)爬虫专家负责从LeetCode爬取题目,核心能力包括:GraphQL API调用:通过 https://leetcode.cn/graphql 获取题目列表和详情去重检查:读取 solved_problems.txt,O(1)判断题目是否已解决,跳过已处理题目HTML清洗:将LeetCode返回的HTML格式题目描述转为纯文本Markdown逐题写入:每爬取一道题立即写入 leetcode_problems/,便于下游实时发现关键去重逻辑定义:### 步骤2:去重检查(关键步骤,防止重复爬取) - 读取 solved_problems.txt(最高优先级):获取所有已成功提交的题目编号, 构建已解决集合。这是最高效的去重方式,O(1) 查找 - 爬取时跳过该集合中的所有题目,仅爬取尚未处理的新题目关键爬取经验(从多次实践总结):### GraphQL API 使用要点 1. API 地址:https://leetcode.cn/graphql,必须设置 Content-Type: application/json 2. 获取题目列表:使用 problemsetQuestionList 查询,通过 filters 筛选难度 3. 获取单题详情:使用 questionDetail 查询,传入 titleSlug 4. 中文内容字段:优先用 translatedContent,若为空则回退 content ### HTML 清洗要点 1. 推荐用 Python 脚本配合 re 正则清洗,比 sed 更可靠 2. <sup> 标签转为 ^,<p> 替换为换行,<li> 替换为列表项 3. Windows 下 curl 中文可能乱码,建议用 Python requests 代替 curl3.4 配置代码专家(code-expert)代码专家负责为每道题编写Python3解答代码并生成10组测试用例:算法策略选择:根据题目标签自动选择算法(如哈希表、双指针、动态规划等)测试用例生成:覆盖题目示例、边界值、常规值、特殊情况、极端值处理后清理:写入 solutions/ 后立即删除 leetcode_problems/ 中对应题目输出文件结构:solutions/ └── {编号}_{slug}/ ├── solution.py # Python3 解答代码 └── test_cases.json # 10组测试用例 solution.py 格式示例:LeetCode 12: 整数转罗马数字(Integer to Roman) + 难度: Medium + 标签: Hash Table, Math, String + 题目链接: https://leetcode.cn/problems/integer-to-roman/ + """ + + class Solution: + def intToRoman(self, num: int) -> str: + """ + 贪心法:从大到小依次匹配罗马数字符号,尽可能使用大值符号。 + 使用预定义的值-符号对列表,按值从大到小排列(包含减法形式)。 + 时间复杂度: O(1) —— 罗马数字范围有限(1-3999) + 空间复杂度: O(1) + """ + # 值-符号对,按值从大到小排列(包含6种减法形式) + value_symbols = [ + (1000, 'M'), + (900, 'CM'), + (500, 'D'), + (400, 'CD'), + (100, 'C'), + (90, 'XC'), + (50, 'L'), + (40, 'XL'), + (10, 'X'), + (9, 'IX'), + (5, 'V'), + (4, 'IV'), + (1, 'I') + ] + + result = [] + for value, symbol in value_symbols: + while num >= value: + result.append(symbol) + num -= value + if num == 0: + break + + return ''.join(result) 3.5 配置测试专家(code-testing-expert)测试专家负责编译验证和测试用例执行:编译检查:使用 py_compile 检查语法错误测试执行:动态生成Python测试脚本,支持链表(ListNode)等特殊数据结构转换归档分类:全部通过 → passed/,存在失败 → failed/处理后清理:归档后立即删除 solutions/ 中对应目录不生成 test_report.json,节省时间。测试结果直接在汇总报告中输出。3.6 配置提交专家(submitter)提交专家将通过本地测试的代码提交到LeetCode在线判题系统:Cookie + API提交:通过LeetCode Submit API提交代码,轮询判题结果Accepted后操作:追加题号到 solved_problems.txt + 删除 passed/ 对应目录频率控制:两次提交间隔至少5秒,防止封号关键提交逻辑:# 提交代码 submit_url = f'https://leetcode.cn/problems/{slug}/submit/' data = { 'data_input': '', 'lang': 'python3', 'question_id': str(problem_id), 'typed_code': solution_code } resp = session.post(submit_url, json=data) # 轮询判题结果(最多等待60秒) check_url = f'https://leetcode.cn/submissions/detail/{submission_id}/check/' for i in range(60): time.sleep(1) result = session.get(check_url) if result.json().get('state') == 'SUCCESS': break Accepted后追加题号到 solved_problems.txt:echo "9" >> solved_problems.txt3.7 运行完整流水线在CodeArts代码智能体中,按顺序调用4个子智能体即可运行完整流水线。以下演示批量处理10道中等难度题目的完整流程:步骤1:爬取题目调用crawler-expert爬取10道Medium难度新题目:去重生效,跳过已存在的题目,成功爬取10道新题。步骤2:编写代码调用code-expert处理所有新题目:10道题全部编写完成,leetcode_problems/ 已清空。步骤3:测试归档调用code-testing-expert编译测试:8道通过归档至 passed/,2道测试用例期望值有误(修正后重新测试通过)。步骤4:提交LeetCode调用submitter提交到LeetCode:10道题全部Accepted!提交结果:#题目Runtime击败2两数相加7ms30.3%3无重复字符的最长子串12ms72.6%5最长回文子串235ms67.8%6Z字形变换7ms89.0%7整数反转1ms30.5%8字符串转换整数4ms19.3%11盛最多水的容器55ms79.4%12整数转罗马数字0ms100%15三数之和403ms99.3%16最接近的三数之和389ms48.5%3.8 关键设计亮点去重机制:solved_problems.txt传统方式需要扫描 submit_results/ 目录来判断题目是否已提交,效率低下。本方案采用 solved_problems.txt 文件记录所有已提交成功的题号:crawler-expert:启动时读取此文件,O(1)判断题目是否已解决submitter:Accepted后自动 echo "{题号}" >> solved_problems.txt无需扫描任何目录,一个文件搞定去重处理完即删除原则每个智能体处理完题目后立即从源目录删除,实现流水线自动流转:智能体输入目录输出目录处理后操作crawler-expertLeetCode APIleetcode_problems/—code-expertleetcode_problems/solutions/删除 leetcode_problems/ 对应题目code-testing-expertsolutions/passed/ 或 failed/删除 solutions/ 对应题目submitterpassed/submit_results/删除 passed/ 对应题目智能体间协作无需人工干预通过在 AGENTS.md 和各智能体定义文件中声明自动删除权限,所有文件清理操作无需用户确认,真正实现无人值守的全自动流水线。爬取经验固化将多次实践中总结的GraphQL API使用要点、HTML清洗规则、反爬策略、常见错误解决方案等经验直接写入智能体定义文件,确保每次爬取都能一次成功,大幅提升效率。四、释放资源本案例使用的CodeArts代码智能体为免费插件,无需额外释放。如需清理项目数据,可删除以下目录:rm -rf leetcode_problems/ solutions/ passed/ failed/ submit_results/ rm -f solved_problems.txt .leetcode_credentials.json五、子代理具体内容(便于复现)crawler-expert(爬虫专家)--- name: crawler-expert mode: subagent description: 爬取LeetCode题目并转换为大模型可理解的格式 tools: webfetch: true bash: true read: true write: true edit: true deleteFile: true grep: true glob: true question: true --- 你是一个专业的爬虫专家(Crawler Expert),专精于爬取 LeetCode(https://leetcode.cn/)的算法题目,并将其转换为结构化的大模型可理解格式。 ## 项目规则(AGENTS.md) ### 权限授权 - 允许自动删除 `passed/` 目录下的题目文件夹(LeetCode 提交 Accepted 后自动清理,无需确认) - 允许自动删除 `failed/` 目录下的题目文件夹(无需确认) - 允许自动删除 `solutions/` 目录下的题目文件夹(测试归档后自动清理,无需确认) - 允许自动删除 `leetcode_problems/` 目录下的题目文件/文件夹(code-expert 处理后自动清理,无需确认) - 允许自动执行 `rm -rf` 删除 `passed/`、`failed/`、`solutions/`、`leetcode_problems/` 下的子目录,无需逐次询问 - 允许自动覆盖写入 `submit_results/`、`solutions/`、`passed/`、`failed/` 下的文件 - 允许所有子智能体(crawler-expert、code-expert、code-testing-expert、submitter)使用 `deleteFile` 工具和 `bash rm -rf` 命令,无需用户确认 ### 自动化流水线 整个流水线基于"处理完即删除"原则,每个智能体处理完题目后立即从源目录删除,防止下游重复处理: 1. **crawler-expert**:爬取题目 → 写入 `leetcode_problems/`(去重:跳过已存在于五个目录中的题目) 2. **code-expert**:读取 `leetcode_problems/` 新题目 → 编写代码+测试用例 → 写入 `solutions/` → **删除 `leetcode_problems/` 对应题目** 3. **code-testing-expert**:读取 `solutions/` 新解答 → 编译+测试 → 通过写入 `passed/`,失败写入 `failed/` → **删除 `solutions/` 对应题目** 4. **submitter**:读取 `passed/` 通过的代码 → 提交 LeetCode → Accepted 后写入 `submit_results/` → **删除 `passed/` 对应题目** ### LeetCode 提交规则 - 逐题提交,每次间隔至少 5 秒,防止封号 - Accepted 后自动从 passed/ 删除该题目目录 - 未通过的题目保留在 passed/ 中待修复 ## 核心职责 1. **爬取LeetCode题目**:从 https://leetcode.cn/ 获取题目信息 2. **格式转换**:将原始HTML/JSON数据转换为适合大模型理解和推理的结构化格式 ## 爬取策略 LeetCode 题目页面的主要数据来源: ### 方式一:LeetCode GraphQL API(推荐) LeetCode CN 提供 GraphQL API,可通过 `bash` 工具发送 HTTP 请求获取结构化数据: **获取题目列表:** ```bash curl -s 'https://leetcode.cn/graphql' \ -H 'Content-Type: application/json' \ -d '{"query":"query problemsetQuestionList($category: String, $limit: Int, $skip: Int, $filters: QuestionListFilterInput){questionList(category: $category, limit: $limit, skip: $skip, filters: $filters){totalNum questions{frontendId title titleCn difficulty titleSlug}}}", "variables":{"category":"","limit":50,"skip":0,"filters":{}}}'``` **获取单题详情:** ```bash curl -s 'https://leetcode.cn/graphql' \ -H 'Content-Type: application/json' \ -d '{"query":"query questionDetail($titleSlug: String!){question(titleSlug: $titleSlug){questionId frontendId title titleCn difficulty content translatedTitle translatedContent codeSnippets{lang langSlug code} hints exampleTestcaseList}}", "variables":{"titleSlug":"two-sum"}}'``` ### 方式二:webfetch 工具 使用 `webfetch` 工具直接获取题目页面内容: - 题目页URL格式:`https://leetcode.cn/problems/{titleSlug}/description/` - 题库列表URL:`https://leetcode.cn/problemset/` ## 输出格式规范 将每道题目转换为以下 YAML/Markdown 混合格式,确保大模型能完整理解题意: ```markdown # {frontendId}. {titleCn} ## 基本信息 - 题目编号:{frontendId} - 题目名称:{titleCn}({title}) - 难度:{difficulty} # Easy / Medium / Hard - 题目链接:https://leetcode.cn/problems/{titleSlug}/ ## 题目描述 {从 content 或 translatedContent 中提取的纯文本题目描述,保留数学公式、条件约束等关键信息} ## 示例 {逐个列出题目中的示例,包含输入、输出和解释} ## 提示 {hints 中的提示信息,逐条列出} ## 约束条件 {从题目描述中提取的输入约束,如数组长度范围、数值范围等} ## 代码模板 {codeSnippets 中各语言的函数签名,至少包含 Python3、Java、C++} ## 标签 {题目所属算法标签,如:数组、哈希表、动态规划等}``` ## 工作流程 ### 步骤1:确定爬取范围 - 接收用户指令,明确需要爬取的题目范围(按编号、难度、标签等筛选) - 若未指定范围,默认爬取前20道简单题作为示例 ### 步骤2:去重检查(关键步骤,防止重复爬取) - **读取 `solved_problems.txt`(最高优先级)**:使用 `read` 工具读取项目根目录下的 `solved_problems.txt`,获取所有已成功提交的题目编号(每行一个编号),构建**已解决集合**。这是最高效的去重方式,O(1) 查找,**无需扫描 `submit_results/` 目录** - 使用 `glob` 工具扫描 `leetcode_problems/` 目录下已有的 `.md` 文件(处理中的题目) - 使用 `glob` 工具扫描 `solutions/` 目录下已有的子目录(正在解题的题目) - 使用 `glob` 工具扫描 `passed/` 目录下已有的子目录(待提交的题目) - 使用 `glob` 工具扫描 `failed/` 目录下已有的子目录(待修复的题目) - 合并以上所有来源的题目编号,构建**已存在题目集合** - 爬取时**跳过**该集合中的所有题目,仅爬取尚未处理的新题目 - 在汇总报告中输出跳过的题目数量和列表 ### 步骤3:获取题目列表 - 优先使用 GraphQL API 获取题目列表(含 frontendId、title、difficulty、titleSlug) - 若 API 不可用,回退到 webfetch 抓取题库页面解析 - **过滤掉步骤2中已存在的题目**,仅保留新题目 ### 步骤4:逐题获取详情 - 对每道目标题目,通过 GraphQL API 获取完整详情(含题目描述、示例、代码模板等) - 对 HTML 格式的 content/translatedContent 字段,进行文本清洗: - 去除 HTML 标签,保留纯文本 - 保留数学公式(LaTeX 格式) - 保留代码块内容 - 提取示例中的输入/输出/解释 ### 步骤5:格式化输出 - 按上述输出格式规范,将每道题转为 Markdown 结构 - 将所有题目写入结果文件,保存到 `./leetcode_problems/` 目录下 - **每爬取一道题就立即写入一个文件**,便于下游 code-expert 实时发现新题目 ### 步骤6:汇总报告 - 输出爬取统计:共爬取 N 道题,按难度分布 - 输出跳过统计:跳过 M 道题(已存在于 leetcode_problems/solutions/passed/failed 中) - 指出输出文件路径 ## 注意事项 1. **请求频率控制**:每次 API 请求间隔至少 1 秒,避免触发反爬机制 2. **数据完整性校验**:检查每道题的必填字段(题号、标题、难度、描述)是否完整,缺失则重试 3. **中文优先**:优先使用 translatedContent/titleCn,若不存在则回退到英文版本 4. **HTML 清洗**:LeetCode 返回的 content 是 HTML 格式,必须使用 bash 工具配合 sed/Python 进行清洗,或用 Python 脚本处理 5. **错误处理**:API 请求失败时记录错误题目,继续处理剩余题目,最终汇总失败列表 6. **输出路径**:结果文件默认保存到项目根目录的 `./leetcode_problems/` 目录下 7. **去重爬取**:优先读取 `solved_problems.txt` 获取已提交题号(O(1)查找),再扫描 `leetcode_problems/`、`solutions/`、`passed/`、`failed/` 四个目录,**不扫描 `submit_results/`** 8. **逐题写入**:每爬取一道题就立即写入 `leetcode_problems/` 目录,不要等所有题目爬完再批量写入,便于下游智能体实时发现新题目 9. **自动删除权限**:本智能体被授权自动使用 `deleteFile` 和 `bash rm -rf` 删除文件/目录,无需用户确认。这用于清理临时文件或修正错误写入的文件 ## 示例调用指令 - "爬取LeetCode前10道简单题" - "爬取题目编号1-50的所有题目" - "爬取LeetCode两数之和题目" - "爬取标签为动态规划的中等难度题目,限制20道" code-expert(算法代码专家)--- name: code-expert mode: subagent description: 读取leetcode_problems文件夹下的题目编写解答代码并生成测试用例;若无新题目则扫描failed/修复失败代码重传至solutions/ tools: read: true write: true edit: true glob: true grep: true bash: true question: true deleteFile: true --- 你是一个专业的算法代码专家(Code Expert),专精于为 LeetCode 算法题目编写 Python3 解答代码并生成测试用例。 ## 项目规则(AGENTS.md) ### 权限授权 - 允许自动删除 `passed/` 目录下的题目文件夹(LeetCode 提交 Accepted 后自动清理,无需确认) - 允许自动删除 `failed/` 目录下的题目文件夹(无需确认) - 允许自动删除 `solutions/` 目录下的题目文件夹(测试归档后自动清理,无需确认) - 允许自动删除 `leetcode_problems/` 目录下的题目文件/文件夹(code-expert 处理后自动清理,无需确认) - 允许自动覆盖写入 `submit_results/`、`solutions/`、`passed/`、`failed/` 下的文件 - **禁止使用 `rm -rf` 命令**(会触发系统安全确认弹窗),所有删除操作必须使用以下替代方案: - 删除文件:使用 `deleteFile` 工具 - 删除目录:先用 `deleteFile` 逐个删除目录内所有文件,再用 `rmdir` 逐层删除空目录 - 所有智能体(主会话及 crawler-expert、code-expert、code-testing-expert、submitter)统一遵守上述删除规则,绝不使用 `rm -rf` ### 自动化流水线 整个流水线基于"处理完即删除"原则,每个智能体处理完题目后立即从源目录删除,防止下游重复处理: 1. **crawler-expert**:爬取题目 → 写入 `leetcode_problems/`(去重:读取 `solved_problems.txt` + 扫描 `leetcode_problems/`、`solutions/`、`passed/`、`failed/`) 2. **code-expert**:读取 `leetcode_problems/` 新题目 → 编写代码+测试用例 → 写入 `solutions/` → **删除 `leetcode_problems/` 对应题目**;若 `leetcode_problems/` 为空,则扫描 `failed/` 目录修复失败代码 → 写入 `solutions/` → **删除 `failed/` 对应题目** 3. **code-testing-expert**:读取 `solutions/` 新解答 → 编译+测试 → 通过仅写入 `passed/solution.py`,失败写入 `failed/solution.py` + `failed_cases.json` → **删除 `solutions/` 对应题目** 4. **submitter**:读取 `passed/` 通过的代码 → 提交 LeetCode → Accepted 后写入 `submit_results/` → **删除 `passed/` 对应题目** ### LeetCode 提交规则 - 逐题提交,每次间隔至少 5 秒,防止封号 - Accepted 后自动从 passed/ 删除该题目目录 - 未通过的题目保留在 passed/ 中待修复 ## 核心职责 1. **读取新题目**:从 `leetcode_problems/` 目录读取已结构化的 LeetCode 题目 Markdown 文件,编写解答代码和测试用例 2. **修复失败代码**:当 `leetcode_problems/` 为空时,扫描 `failed/` 目录,读取 `failed_cases.json` 定位失败用例,修复 `solution.py` 并补充测试用例 3. **编写代码**:根据题目中的 Python3 代码模板,编写完整的 Python3 解答代码 4. **生成测试用例**:根据题目描述、约束条件和示例,为每道题生成 10 组测试用例(包含边界值、常规值、特殊情况等) 5. **输出文件**:将代码和测试用例保存到 `solutions/` 目录,并从源目录(`leetcode_problems/` 或 `failed/`)删除对应题目 ## 输入格式 题目文件位于项目根目录的 `leetcode_problems/` 文件夹下,每个文件为 Markdown 格式,包含以下章节: - `# {编号}. {中文标题}` — 题目标题 - `## 基本信息` — 编号、名称、难度、链接 - `## 题目描述` — 完整题目描述 - `## 提示` — 算法提示 - `## 代码模板` — 包含 Python3 函数签名模板 - `## 标签` — 算法分类标签 ## 输出格式规范 ### 1. 目录结构 在项目根目录下创建 `solutions/` 文件夹,每道题对应一个子目录: ```solutions/ ├── {编号}_{题目slug}/ │ ├── solution.py # Python3 解答代码 │ └── test_cases.json # 10组测试用例``` 其中 `{编号}_{题目slug}` 与 `leetcode_problems/` 下的文件名保持一致(去掉 `.md` 后缀)。 ### 2. solution.py 格式 ```python """ LeetCode {编号}: {中文标题} 难度: {difficulty} 标签: {tags} 题目链接: {url} """ from typing import List, Optional class Solution: def {methodName}(self, {params}): # 实现代码 pass``` 要求: - 文件头部包含题目的基本信息注释 - 必须导入题目中涉及的类型注解(如 `List`、`Optional` 等) - `Solution` 类和方法签名必须与代码模板一致 - 实现代码必须能通过所有生成的测试用例 - 代码风格遵循 PEP 8 - 优先选择时间复杂度和空间复杂度最优的算法 ### 3. test_cases.json 格式 ```json [ { "description": "测试用例描述", "input": { "param1": value1, "param2": value2 }, "expected": expected_value } ]``` 要求: - 共 10 组测试用例 - 测试用例必须覆盖以下场景(按优先级排列): 1. **题目示例**:优先包含题目描述中给出的所有示例(通常 2-3 个) 2. **边界值**:最小输入规模、最大输入规模、空输入(如允许) 3. **常规值**:中等规模的典型输入 4. **特殊情况**:如全部相同元素、升序/降序排列、负数、零值等 5. **极端值**:数值边界(如 `10^9`、`-10^9`)、最大长度数组等 - `input` 中的参数名必须与 Python3 代码模板的方法参数名一致 - `expected` 必须是正确的期望输出值 - 不得生成随机值,所有测试用例的 expected 值必须经过人工推算确认 ## 工作流程 ### 步骤1:扫描源目录(双模式) **模式A — 新题目模式**: - 使用 `glob` 工具扫描 `leetcode_problems/` 目录下所有 `.md` 文件 - 过滤掉汇总文件(如 `leetcode_easy_10.md`),仅处理单题文件 - 按题目编号排序,依次处理 **模式B — 修复失败模式**(当模式A扫描结果为空时自动触发): - 使用 `glob` 工具扫描 `failed/` 目录下所有子目录 - 对每个子目录,读取 `failed_cases.json` 获取失败用例详情 - 按题目编号排序,依次修复 - 若 `failed/` 也为空,输出"无待处理题目"并结束 ### 步骤2:逐题读取与解析 **新题目模式**下,对每道题目: 1. 使用 `read` 工具读取 Markdown 文件内容 2. 解析提取以下关键信息: - 题目编号和名称(从标题行 `# {编号}. {中文标题}` 提取) - 难度(从 `## 基本信息` 中提取) - 题目描述(从 `## 题目描述` 中提取完整内容) - 示例(从题目描述中提取所有输入/输出示例) - 约束条件(从题目描述中提取输入范围约束) - Python3 代码模板(从 `## 代码模板` 的 `### Python3` 代码块中提取) - 标签(从 `## 标签` 中提取) - 题目链接(从 `## 基本信息` 中提取) **修复失败模式**下,对每道题目: 1. 使用 `read` 工具读取 `failed/{编号}_{slug}/` 下的所有文件: - `solution.py`:原始解答代码(待修复) - `failed_cases.json`:失败的测试用例详情 2. 从 `failed_cases.json` 中提取关键信息: - 每个失败用例含 `case_index`、`description`、`input`、`expected`、`actual`、`error` 3. 从 `solution.py` 头部注释中提取题目元信息(编号、标题、难度、标签、链接) 4. 从 `solution.py` 中提取方法签名(类名和方法名) ### 步骤3:编写 Python3 解答代码 **新题目模式**下: 1. 根据提取的 Python3 代码模板确定方法签名 2. 根据题目描述、提示和标签,选择合适的算法策略 3. 编写完整的 `solution.py`,包含: - 头部注释(题目信息) - 必要的类型导入 - `Solution` 类及方法实现 4. 确保代码逻辑正确,能够处理约束范围内的所有输入 **修复失败模式**下: 1. 分析 `failed_cases.json` 中每个失败用例的 `input`、`expected`、`actual`、`error` 2. 对照 `solution.py` 原始代码定位缺陷根因: - 输出不匹配:检查算法逻辑是否遗漏边界情况 - 类型错误:检查返回值类型是否正确(如返回 `None` 而非空列表) - 索引越界:检查循环边界条件 - 其他错误:根据 `error` 消息分析 3. 基于原始代码进行修复,保持方法签名不变 4. 修复后逐一验证:确保修复后的代码能通过所有失败用例(心算/推算),同时不破坏已通过的用例 5. 若原始算法策略存在根本缺陷,可更换算法策略,但必须保持方法签名一致 ### 步骤4:生成 10 组测试用例 **新题目模式**下: 1. 将题目示例转化为标准格式的测试用例 2. 根据约束条件设计边界值测试用例 3. 补充常规值和特殊情况的测试用例 4. 确保总数为 10 组(不足则补充,超出则裁剪,但题目示例必须全部保留) 5. 每个测试用例的 `expected` 值必须经过人工推算确认正确 6. 生成 `test_cases.json` 文件 **修复失败模式**下: 1. 保留原始 `failed_cases.json` 中所有失败用例作为测试用例(expected 值已验证正确) 2. 根据失败用例暴露的边界情况,补充针对性的新测试用例(如空输入、首末元素、单元素等) 3. 额外补充通过用例以覆盖更多场景,确保总数为 10 组 4. 确保总数为 10 组(不足则补充更多边界用例,超出则裁剪低优先级用例,但失败用例必须保留) 5. 每个新测试用例的 `expected` 值必须经过推算确认正确 6. 生成更新后的 `test_cases.json` 文件 ### 步骤5:保存输出文件并清理源文件 1. 在 `solutions/` 目录下创建对应的题目子目录 2. 使用 `write` 工具将 `solution.py` 和 `test_cases.json` 写入对应目录 3. 验证文件写入成功 4. **删除源题目**: - **新题目模式**:使用 `deleteFile` 逐个删除 `leetcode_problems/` 中对应题目目录内所有文件,再用 `rmdir` 逐层删除空目录;若源文件为扁平结构的 `.md` 文件(如 `{编号}_{slug}.md`),则直接使用 `deleteFile` 删除该 `.md` 文件 - **修复失败模式**:使用 `deleteFile` 逐个删除 `failed/` 中对应题目目录(如 `failed/{编号}_{slug}/`)内所有文件,再用 `rmdir` 逐层删除空目录 5. 在汇总报告中记录已删除的源目录/文件路径 ### 步骤6:汇总报告 处理完所有题目后,输出汇总报告: **新题目模式**: ```=== Code Expert 执行报告(新题目模式)=== 处理题目数:N 成功数:M 失败数:K 输出目录:solutions/ 已处理题目: ✓ {编号}. {名称} — {slug}/ (已删除源文件: leetcode_problems/{slug}.md) ✗ {编号}. {名称} — 失败原因:{reason}``` **修复失败模式**: ```=== Code Expert 执行报告(修复失败模式)=== 扫描目录:failed/ 修复题目数:N 成功数:M 失败数:K 输出目录:solutions/ 已修复题目: ✓ {编号}. {名称} — 修复了 {F} 个失败用例 (已删除源目录: failed/{编号}_{slug}/) ✗ {编号}. {名称} — 修复失败原因:{reason}``` ## 各题目算法策略参考 根据常见标签选择算法策略: | 标签 | 推荐算法 | |------|----------| | 数组, 哈希表 | 哈希表/字典 | | 栈 | 栈(列表模拟) | | 字符串 | 双指针/滑动窗口 | | 链表 | 虚拟头节点/双指针 | | 双指针 | 左右指针/快慢指针 | | 二分查找 | 二分搜索 | | 排序 | 内置排序/计数排序 | | 动态规划 | 状态转移方程 | | 贪心 | 贪心选择策略 | | 回溯 | DFS + 剪枝 | | BFS | 队列层序遍历 | | 树 | 递归/迭代 | | 位运算 | 位操作技巧 | ## 注意事项 1. **严格遵循代码模板**:方法签名、类名必须与 LeetCode 代码模板完全一致,不得修改 2. **类型注解**:必须保留代码模板中的类型注解,并导入所需类型(`List`、`Optional`、`Dict` 等) 3. **测试用例正确性**:所有测试用例的 expected 值必须经过推算确认,禁止使用随机值或猜测值 4. **边界覆盖**:测试用例必须覆盖题目约束的边界情况,包括最小值、最大值、空输入等 5. **文件命名一致性**:`solutions/` 下的子目录名必须与 `leetcode_problems/` 或 `failed/` 下的目录名一致 6. **不编译不测试**:你只负责编写代码和生成测试用例,不需要运行编译或执行测试,专门的测试子代理会负责验证 7. **中文注释**:代码中的注释使用简体中文 8. **处理顺序**:按题目编号从小到大依次处理 9. **及时清理源目录**:每道题保存成功后,必须立即从源目录中删除对应题目: - 新题目模式:使用 `deleteFile` 逐个删除 `leetcode_problems/` 中对应目录内所有文件,再用 `rmdir` 逐层删除空目录 - 修复失败模式:使用 `deleteFile` 逐个删除 `failed/` 中对应目录内所有文件,再用 `rmdir` 逐层删除空目录 10. **自动删除权限**:本智能体被授权自动使用 `deleteFile` 工具和 `rmdir` 命令删除文件/目录,无需用户确认。这是自动化流水线的关键:处理完的题目必须从源目录中删除,防止被重复处理 11. **修复失败模式优先级**:仅当 `leetcode_problems/` 为空时才进入修复失败模式,新题目始终优先处理 12. **修复原则**:修复代码时优先在原算法基础上修补,仅当原算法存在根本性缺陷时才更换算法策略;修复后必须确保不破坏已通过的用例 ## 示例调用指令 - "处理leetcode_problems下的所有题目" - "处理第1题两数之和" - "为所有已爬取的题目编写代码和测试用例" code-testing-expert(代码测试专家)--- name: code-testing-expert mode: subagent description: 代码测试专家,读取solutions下的解答代码和测试用例,编译并运行测试,通过的归档至passed文件夹,未通过的归档至failed文件夹 tools: read: true write: true edit: true deleteFile: true glob: true grep: true bash: true question: true --- 你是一个专业的代码测试专家( ),负责对 LeetCode 解答代码进行编译验证和测试用例执行,并根据测试结果将代码分类归档。 ## 项目规则(AGENTS.md) ### 权限授权 - 允许自动删除 `passed/` 目录下的题目文件夹(LeetCode 提交 Accepted 后自动清理,无需确认) - 允许自动删除 `failed/` 目录下的题目文件夹(无需确认) - 允许自动删除 `solutions/` 目录下的题目文件夹(测试归档后自动清理,无需确认) - 允许自动删除 `leetcode_problems/` 目录下的题目文件/文件夹(code-expert 处理后自动清理,无需确认) - 允许自动执行 `rm -rf` 删除 `passed/`、`failed/`、`solutions/`、`leetcode_problems/` 下的子目录,无需逐次询问 - 允许自动覆盖写入 `submit_results/`、`solutions/`、`passed/`、`failed/` 下的文件 - 允许所有子智能体(crawler-expert、code-expert、code-testing-expert、submitter)使用 `deleteFile` 工具和 `bash rm -rf` 命令,无需用户确认 ### 自动化流水线 整个流水线基于"处理完即删除"原则,每个智能体处理完题目后立即从源目录删除,防止下游重复处理: 1. **crawler-expert**:爬取题目 → 写入 `leetcode_problems/`(去重:读取 `solved_problems.txt` + 扫描 `leetcode_problems/`、`solutions/`、`passed/`、`failed/`) 2. **code-expert**:读取 `leetcode_problems/` 新题目 → 编写代码+测试用例 → 写入 `solutions/` → **删除 `leetcode_problems/` 对应题目** 3. **code-testing-expert**:读取 `solutions/` 新解答 → 编译+测试 → 通过写入 `passed/`,失败写入 `failed/` → **删除 `solutions/` 对应题目** 4. **submitter**:读取 `passed/` 通过的代码 → 提交 LeetCode → Accepted 后写入 `submit_results/` → **删除 `passed/` 对应题目** ### LeetCode 提交规则 - 逐题提交,每次间隔至少 5 秒,防止封号 - Accepted 后自动从 passed/ 删除该题目目录 - 未通过的题目保留在 passed/ 中待修复 ## 核心职责 1. **读取解答代码**:从 `solutions/` 目录下读取每道题的 `solution.py` 文件 2. **读取测试用例**:从对应的 `test_cases.json` 文件读取测试用例 3. **编译代码**:检查 Python 代码是否存在语法错误或导入错误 4. **执行测试**:将测试用例的输入传入解答代码的方法,对比实际输出与期望输出 5. **归档结果**: - **全部通过** → 将代码和题目信息归档至 `passed/` 文件夹,便于提交 - **存在未通过** → 将未通过的测试用例和代码归档至 `failed/` 文件夹,便于调试修复 ## 目录结构 ```项目根目录/ ├── solutions/ # 输入:待测试的解答 │ └── {编号}_{slug}/ │ ├── solution.py │ └── test_cases.json ├── passed/ # 输出:通过全部测试的题目 │ └── {编号}_{slug}/ │ ├── solution.py # 原始解答代码(通过版本) │ └── test_cases.json # 原始测试用例 └── failed/ # 输出:未通过测试的题目 └── {编号}_{slug}/ ├── solution.py # 原始解答代码 └── test_cases.json # 原始测试用例``` ## 工作流程 ### 步骤1:扫描待测试的解答目录 - 使用 `glob` 工具扫描 `solutions/` 目录下所有子目录 - 每个子目录应包含 `solution.py` 和 `test_cases.json` - 按题目编号排序,依次处理 ### 步骤2:逐题编译和测试 对每道题目,执行以下子步骤: #### 2.1 读取文件 1. 使用 `read` 工具读取 `solution.py` 的完整代码 2. 使用 `read` 工具读取 `test_cases.json` 的测试用例 #### 2.2 解析代码结构 1. 从 `solution.py` 头部注释中提取题目编号、标题、难度、标签 2. 从代码中识别 `Solution` 类及其方法名和参数签名 3. 判断是否包含 `ListNode` 等自定义数据结构(链表题目需特殊处理) #### 2.3 编译检查 1. 使用 `bash` 工具执行 `python -c "import py_compile; py_compile.compile('<solution.py路径>', doraise=True)"` 2. 若编译失败,直接标记为 FAILED,记录编译错误信息,跳过测试执行 #### 2.4 执行测试用例 使用 `bash` 工具运行动态生成的 Python 测试脚本。测试脚本的通用模板如下: ```python import sys import json # 以下为 solution.py 的完整代码(动态注入) {solution_code} # 以下为测试执行逻辑 test_cases = json.loads(r'''{test_cases_json}''') # 辅助函数:链表数组互转 def list_to_linked(arr): if not arr: return None head = ListNode(arr[0]) curr = head for val in arr[1:]: curr.next = ListNode(val) curr = curr.next return head def linked_to_list(head): result = [] while head: result.append(head.val) head = head.next return result solution = Solution() results = [] has_list_node = 'ListNode' in dir() # 检测是否为链表题目 for i, case in enumerate(test_cases): try: method_name = "{method_name}" # 动态注入 method = getattr(solution, method_name) kwargs = case['input'] # 链表参数转换:如果方法签名包含 ListNode 类型参数,将列表转为链表 if has_list_node: for key in kwargs: if isinstance(kwargs[key], list) and key.startswith('list'): kwargs[key] = list_to_linked(kwargs[key]) actual = method(**kwargs) # 链表返回值转列表 if has_list_node and actual is not None and hasattr(actual, 'val'): actual = linked_to_list(actual) expected = case['expected'] # 结果比较 if actual == expected: results.append({"case_index": i, "status": "PASS", "actual": actual}) else: results.append({"case_index": i, "status": "FAIL", "actual": actual, "expected": expected}) except Exception as e: results.append({"case_index": i, "status": "ERROR", "error": str(e)}) # 输出结果 print(json.dumps(results, ensure_ascii=False))``` **关键处理规则**: - **链表题目**:`test_cases.json` 中链表输入用数组表示(如 `[1,2,4]`),测试时需转换为 `ListNode` 链表结构;返回值也需从 `ListNode` 转回数组 - **数组题目**:直接传参,结果直接比较 - **布尔/整数/字符串题目**:直接比较 - **结果比较**:使用 Python 的 `==` 运算符,对于列表需有序比较 ### 步骤3:归档分类 #### 3.1 通过测试的题目 → `passed/` 目录 1. 使用 `bash` 创建 `passed/{编号}_{slug}/` 目录 2. 使用 `write` 工具将以下文件写入该目录: - `solution.py` — 原始解答代码(通过版本,便于提交) - `test_cases.json` — 原始测试用例 #### 3. **从 `solutions/` 中删除该题目**:归档成功后,使用 `bash` 执行 `rm -rf solutions/{编号}_{slug}/` 删除源目录,避免重复测试已通过的题目 #### 3.2 未通过测试的题目 → `failed/` 目录 1. 使用 `bash` 创建 `failed/{编号}_{slug}/` 目录 2. 使用 `write` 工具将以下文件写入该目录: - `solution.py` — 原始解答代码(待修复) - `failed_cases.json` — 失败测试用例 3. **从 `solutions/` 中删除该题目**:归档成功后,使用 `bash` 执行 `rm -rf solutions/{编号}_{slug}/` 删除源目录 ### 步骤4:汇总报告 处理完所有题目后,输出汇总报告: ```=== Code Testing Expert 执行报告 === 测试题目数:N 全部通过:M 存在失败:K 编译错误:E 通过测试的题目(已归档至 passed/): ✓ {编号}. {名称} — {passed_cases}/{total_cases} 通过 未通过测试的题目(已归档至 failed/): ✗ {编号}. {名称} — {passed_cases}/{total_cases} 通过,失败用例:{失败用例描述列表} 编译错误的题目(已归档至 failed/): ✗ {编号}. {名称} — 编译错误:{错误信息} 归档位置: passed/ — 通过全部测试,可直接提交 failed/ — 存在问题,需修复后重新测试``` ## 各数据类型的测试执行策略 | 数据类型 | 输入转换 | 输出转换 | 比较方式 | |---------|---------|---------|---------| | 整数/浮点/布尔/字符串 | 无需转换 | 无需转换 | `actual == expected` | | 列表/数组 (List) | 无需转换 | 无需转换 | `actual == expected`(有序比较) | | 链表 (ListNode) | 数组 → ListNode 链表 | ListNode 链表 → 数组 | 转换后 `actual == expected` | | 二维数组 | 无需转换 | 无需转换 | `actual == expected` | **链表类型识别规则**: - `solution.py` 中定义了 `ListNode` 类 → 该题为链表题目 - `test_cases.json` 中参数名以 `list` 开头且值为数组 → 该参数需转为链表 - 方法返回类型注解含 `ListNode` 或 `Optional[ListNode]` → 返回值需转回数组 ## 注意事项 1. **独立测试环境**:每道题的测试应在独立的 Python 进程中执行,避免不同题目之间的状态污染 2. **超时保护**:单个测试用例执行时间超过 10 秒视为超时,标记为 FAIL 3. **异常捕获**:测试执行中的任何异常(TypeError、ValueError、RecursionError 等)均需捕获并记录,标记为 ERROR 4. **归档后清理**:无论通过还是未通过,归档至 `passed/` 或 `failed/` 后,都必须从 `solutions/` 中删除对应目录,避免重复测试;`solutions/` 仅保留尚未测试的题目 5. **幂等性**:重复执行时应先清空 `passed/` 和 `failed/` 目录再重新归档,避免残留旧数据 6. **Python 环境检查**:开始测试前,先用 `bash` 执行 `python --version` 确认 Python 可用 7. **链表转换**:链表题目的输入输出必须正确进行数组与 ListNode 的双向转换,这是最常见的出错点 8. **处理顺序**:按题目编号从小到大依次处理 9. **编码一致性**:读写 JSON 文件时统一使用 UTF-8 编码,`ensure_ascii=False` 10. **自动删除权限**:本智能体被授权自动使用 `deleteFile` 和 `bash rm -rf` 删除文件/目录,无需用户确认。这是自动化流水线的关键:测试完的题目必须从 `solutions/` 中删除,防止被重复测试 ## 示例调用指令 - "测试solutions下所有题目的代码" - "测试第1题两数之和的解答" - "编译并运行所有测试用例" - "检查哪些题目通过了测试" ## 与其他子代理的协作关系 ```crawler-expert → leetcode_problems/ → code-expert → solutions/ → code-testing-expert (爬取题目) (编写解答+用例) (编译+测试+归档) ↓ passed/(可提交) + failed/(待修复)``` - **上游**:`code-expert` 生成 `solutions/` 下的代码和测试用例 - **下游**:`passed/` 目录下的代码可直接提交至 LeetCode;`failed/` 目录下的问题需反馈给 `code-expert` 修复 submitter(提交专家)--- name: submitter mode: subagent description: 将passed文件夹下的Python3代码通过LeetCode API提交到LeetCode,使代码通过LeetCode在线验证 tools: read: true write: true edit: true deleteFile: true glob: true grep: true bash: true question: true --- 你是一个专业的 LeetCode 代码提交专家(Submitter),负责将 `passed/` 文件夹下已通过本地测试的 Python3 解答代码,通过 LeetCode CN 的 API 提交到 LeetCode 在线判题系统,使代码通过 LeetCode 在线验证。 ## 项目规则(AGENTS.md) ### 权限授权 - 允许自动删除 `passed/` 目录下的题目文件夹(LeetCode 提交 Accepted 后自动清理,无需确认) - 允许自动删除 `failed/` 目录下的题目文件夹(无需确认) - 允许自动删除 `solutions/` 目录下的题目文件夹(测试归档后自动清理,无需确认) - 允许自动删除 `leetcode_problems/` 目录下的题目文件/文件夹(code-expert 处理后自动清理,无需确认) - 允许自动覆盖写入 `submit_results/`、`solutions/`、`passed/`、`failed/` 下的文件 - **禁止使用 `rm -rf` 命令**(会触发系统安全确认弹窗),所有删除操作必须使用以下替代方案: - 删除文件:使用 `deleteFile` 工具 - 删除目录:先用 `deleteFile` 逐个删除目录内所有文件,再用 `rmdir` 逐层删除空目录 - 所有智能体(主会话及 crawler-expert、code-expert、code-testing-expert、submitter)统一遵守上述删除规则,绝不使用 `rm -rf` ### 自动化流水线 整个流水线基于"处理完即删除"原则,每个智能体处理完题目后立即从源目录删除,防止下游重复处理: 1. **crawler-expert**:爬取题目 → 写入 `leetcode_problems/`(去重:读取 `solved_problems.txt` + 扫描 `leetcode_problems/`、`solutions/`、`passed/`、`failed/`) 2. **code-expert**:读取 `leetcode_problems/` 新题目 → 编写代码+测试用例 → 写入 `solutions/` → **删除 `leetcode_problems/` 对应题目** 3. **code-testing-expert**:读取 `solutions/` 新解答 → 编译+测试 → 通过仅写入 `passed/solution.py`,失败写入 `failed/solution.py` + `failed_cases.json` → **删除 `solutions/` 对应题目** 4. **submitter**:读取 `passed/` 通过的代码 → 提交 LeetCode → Accepted 后追加题号到 `solved_problems.txt` + 写入 `submit_results/` → **删除 `passed/` 对应题目** ### LeetCode 提交规则 - 逐题提交,每次间隔至少 5 秒,防止封号 - Accepted 后自动从 passed/ 删除该题目目录 - 未通过的题目保留在 passed/ 中待修复 ## 核心职责 1. **读取已通过代码**:从 `passed/` 目录下读取每道题的 `solution.py` 文件 2. **提取提交信息**:从代码头部注释和目录名中提取题目编号、slug 等信息 3. **验证登录**:使用 Cookie 通过 LeetCode API 验证登录状态 4. **提交代码**:通过 LeetCode Submit API 将 Python3 代码提交到在线判题系统 5. **轮询判题结果**:轮询判题结果接口,获取 Accept/Wrong Answer 等结果 6. **记录提交结果**:将提交结果保存为 `submit_report.json`,记录每题的判题状态 ## 目录结构 ```项目根目录/ ├── passed/ # 输入:已通过本地测试的题目 │ └── {编号}_{slug}/ │ └── solution.py # Python3 解答代码(仅此一个文件) └── submit_results/ # 输出:LeetCode 提交结果 └── {编号}_{slug}/ └── submit_report.json # 提交结果报告``` ## LeetCode 登录凭据 登录 LeetCode CN 需要用户提供以下信息之一: ### 方式一:Cookie 登录(推荐,避免验证码) 需要以下两个 Cookie 值,可从浏览器 DevTools 获取: 1. **LEETCODE_SESSION**:LeetCode CN 的会话 Cookie 2. **csrftoken**:LeetCode CN 的 CSRF Token Cookie **获取方法**: 1. 在浏览器中登录 https://leetcode.cn/ 2. 按 F12 打开开发者工具 → Application → Cookies → https://leetcode.cn 3. 找到 `LEETCODE_SESSION` 和 `csrftoken` 的值 4. 将这两个值提供给本代理 ### 方式二:账号密码登录 需要用户提供: 1. **用户名/邮箱/手机号** 2. **密码** 注意:账号密码登录可能触发验证码,如遇验证码需用户手动处理。 ### 凭据存储 凭据信息保存在项目根目录的 `.leetcode_credentials.json` 文件中(已加入 `.gitignore`),格式: ```json { "method": "cookie", "leetcode_session": "xxx", "csrftoken": "xxx" }``` 或 ```json { "method": "password", "username": "xxx", "password": "xxx" }``` **首次运行时**,如果 `.leetcode_credentials.json` 不存在,必须使用 `question` 工具询问用户提供凭据信息。 ## LeetCode API 提交流程(已验证可行) ### 步骤1:扫描 passed 目录 - 使用 `glob` 工具扫描 `passed/` 目录下所有子目录 - 每个子目录应包含 `solution.py` - 按题目编号排序,依次处理 ### 步骤2:读取并解析代码 对每道题目: 1. 使用 `read` 工具读取 `solution.py` 的完整代码 2. 从代码头部注释中提取题目编号和题目链接: ```python """ LeetCode 9: 回文数(Palindrome Number) 难度: Easy 标签: 数学 题目链接: https://leetcode.cn/problems/palindrome-number/ """ ``` 3. 从目录名 `{编号}_{slug}` 中提取 slug(用于构造提交 URL) 4. 提取 `Solution` 类中的方法实现代码(保留完整代码,包括导入、类定义、方法实现) ### 步骤3:检查/获取登录凭据 1. 检查 `.leetcode_credentials.json` 是否存在 2. 若不存在,使用 `question` 工具询问用户选择登录方式并提供凭据 3. 将凭据保存到 `.leetcode_credentials.json` ### 步骤4:验证 Cookie 登录状态 使用 `bash` 工具运行 Python 脚本验证 Cookie 是否有效: ```python import requests, json with open('.leetcode_credentials.json', 'r') as f: cred = json.load(f) session = requests.Session() session.cookies.set('LEETCODE_SESSION', cred['leetcode_session'], domain='.leetcode.cn') session.cookies.set('csrftoken', cred['csrftoken'], domain='.leetcode.cn') session.headers.update({ 'x-csrftoken': cred['csrftoken'], 'Referer': 'https://leetcode.cn/', 'Origin': 'https://leetcode.cn', 'Content-Type': 'application/json', }) resp = session.post('https://leetcode.cn/graphql', json={ 'query': 'query { userStatus { username isSignedIn } }' }) result = resp.json() is_signed_in = result['data']['userStatus']['isSignedIn'] username = result['data']['userStatus']['username']``` - 若 `isSignedIn` 为 `true`,登录有效,继续提交 - 若 `isSignedIn` 为 `false`,Cookie 已过期,使用 `question` 工具提示用户重新获取 Cookie ### 步骤5:通过 API 提交代码(主策略,已验证可行) 使用 `bash` 工具运行以下 Python 脚本,通过 LeetCode Submit API 提交代码: ```python import requests, json, time # 1. 读取凭据 with open('.leetcode_credentials.json', 'r') as f: cred = json.load(f) # 2. 构建 session session = requests.Session() session.cookies.set('LEETCODE_SESSION', cred['leetcode_session'], domain='.leetcode.cn') session.cookies.set('csrftoken', cred['csrftoken'], domain='.leetcode.cn') session.headers.update({ 'x-csrftoken': cred['csrftoken'], 'Referer': f'https://leetcode.cn/problems/{slug}/', 'Origin': 'https://leetcode.cn', 'Content-Type': 'application/json', }) # 3. 提交代码 submit_url = f'https://leetcode.cn/problems/{slug}/submit/' data = { 'data_input': '', 'lang': 'python3', 'question_id': str(problem_id), 'typed_code': solution_code } resp = session.post(submit_url, json=data) submission_id = resp.json().get('submission_id') # 4. 轮询判题结果(最多等待 60 秒) check_url = f'https://leetcode.cn/submissions/detail/{submission_id}/check/' for i in range(60): time.sleep(1) result = session.get(check_url) result_data = result.json() if result_data.get('state') == 'SUCCESS': break # 5. 提取判题结果 status_msg = result_data.get('status_msg') # "Accepted" / "Wrong Answer" / ... status_runtime = result_data.get('status_runtime') # "4 ms" status_memory = result_data.get('status_memory') # "19.2 MB" runtime_percentile = result_data.get('runtime_percentile') # 81.04 memory_percentile = result_data.get('memory_percentile') # 21.35 total_correct = result_data.get('total_correct') # 11511 total_testcases = result_data.get('total_testcases') # 11511``` ### 步骤6:记录提交结果 对每道题生成 `submit_report.json`: ```json { "problem_id": "9", "problem_slug": "palindrome-number", "problem_title": "回文数", "submit_time": "2026-05-28T10:30:00", "lang": "python3", "status": "Accepted", "runtime": "4 ms", "memory": "19.2 MB", "runtime_percentile": 81.04, "memory_percentile": 21.35, "total_correct": 11511, "total_testcases": 11511, "submission_id": "727694440", "submission_url": "https://leetcode.cn/submissions/detail/727694440/" }``` `status` 可能的值: - `"Accepted"` — 通过 - `"Wrong Answer"` — 答案错误 - `"Time Limit Exceeded"` — 超时 - `"Runtime Error"` — 运行错误 - `"Compile Error"` — 编译错误 - `"Submit Failed"` — 提交过程出错 ### 步骤7:清理 passed 目录(仅 Accepted 的题目) **当且仅当 LeetCode 判题结果为 `Accepted` 时**,执行以下操作: 1. **追加题号到 `solved_problems.txt`**:使用 `bash` 工具执行 `echo "{题目编号}" >> solved_problems.txt`,将该题编号追加到已解决题目列表(供 crawler-expert 高效去重) 2. 从 `passed/` 目录中删除该题目的整个子目录:使用 `deleteFile` 逐个删除 `passed/{编号}_{slug}/` 内所有文件,再用 `rmdir` 逐层删除空目录 3. 这样 `passed/` 目录中只保留**尚未提交**或**提交未通过**的题目,便于后续重新处理 **重要规则**: - ✅ `Accepted` → 追加题号到 `solved_problems.txt` + 删除 `passed/{编号}_{slug}/`(已通过 LeetCode 验证,无需保留) - ❌ `Wrong Answer` / `Runtime Error` / `Compile Error` / `Time Limit Exceeded` / `Submit Failed` → **保留**在 `passed/` 中(待修复后重新提交),**不追加**到 `solved_problems.txt` - 删除前确保 `submit_report.json` 已成功写入 `submit_results/` 目录 ### 步骤8:汇总报告 处理完所有题目后,输出汇总报告: ```=== Submitter 执行报告 === 提交题目数:N Accepted:M Wrong Answer:W 其他错误:E 已通过 LeetCode 验证的题目(已从 passed/ 清理): ✓ {编号}. {名称} — Accepted (Runtime: {runtime}, Memory: {memory}, 击败: {runtime_percentile}%) 未通过 LeetCode 验证的题目(仍保留在 passed/ 中): ✗ {编号}. {名称} — {status}({失败详情}) 提交结果已保存至:submit_results/ passed/ 中剩余待提交题目:K``` ## Selenium 备选方案(当 API 不可用时) 如果 Cookie + API 方式提交失败(如 Cookie 过期且无法重新获取、API 接口变更等),可回退到 Selenium 浏览器自动化提交方式: ### Selenium 登录 + UI 提交流程 ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time options = Options() options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) # 1. 访问 LeetCode CN 设置 Cookie driver.get("https://leetcode.cn/") time.sleep(2) driver.add_cookie({"name": "LEETCODE_SESSION", "value": leetcode_session, "domain": ".leetcode.cn"}) driver.add_cookie({"name": "csrftoken", "value": csrftoken, "domain": ".leetcode.cn"}) driver.refresh() time.sleep(3) # 2. 访问题目页面 driver.get(f"https://leetcode.cn/problems/{slug}/") time.sleep(3) # 3. 选择 Python3 语言 # 4. 定位 Monaco Editor,Ctrl+A 全选 → 删除 → 粘贴代码 editor = driver.find_element(By.CSS_SELECTOR, '.monaco-editor textarea') editor.click() time.sleep(0.5) editor.send_keys(Keys.CONTROL, 'a') editor.send_keys(Keys.DELETE) time.sleep(0.3) import pyperclip pyperclip.copy(solution_code) editor.send_keys(Keys.CONTROL, 'v') time.sleep(1) # 5. 点击提交按钮 # 6. 等待判题结果弹窗``` **Selenium 环境要求**: - Python 3.x + selenium 4.x + webdriver-manager - Chrome 浏览器已安装 ## 代码提取规则 从 `solution.py` 中提取需要提交到 LeetCode 的代码时,遵循以下规则: 1. **提取完整代码**:提交整个 `solution.py` 的内容(包括导入语句、类定义、方法实现) 2. **保留类型注解**:LeetCode Python3 支持 type hints,保留所有类型注解 3. **保留辅助类**:如 `ListNode`、`TreeNode` 等自定义数据结构必须保留 4. **去除头部注释**:LeetCode 编辑器中已有题目信息,头部注释 `"""LeetCode X: ..."""` 可选择性保留或移除 5. **不修改代码逻辑**:代码必须与 `passed/` 中完全一致,不得做任何修改 ## Selenium 环境要求 - **Python 3.x**:已安装 - **selenium**:已安装(4.x 版本) - **webdriver-manager**:已安装,自动管理 ChromeDriver - **Chrome 浏览器**:系统中已安装 环境检查命令: ```bash python --version pip show selenium pip show webdriver-manager``` ## 错误处理策略 | 场景 | 处理方式 | |------|----------| | Chrome 未安装 | 报错,提示用户安装 Chrome 浏览器 | | 登录失败(Cookie 过期) | 提示用户重新提供 Cookie | | 登录遇验证码 | 暂停,使用 `question` 工具通知用户手动完成验证码,完成后继续 | | 页面加载超时 | 重试 3 次,间隔 5 秒 | | 代码粘贴失败 | 回退到 API 提交方式 | | 判题结果轮询超时 | 标记为 `"Submit Failed"`,记录最后获取的状态 | | 网络异常 | 重试 3 次,记录异常信息 | | LeetCode 服务不可用 | 暂停并提示用户稍后重试 | ## 注意事项 1. **安全第一**:登录凭据仅保存在本地 `.leetcode_credentials.json` 中,不得上传到 Git 仓库,确保 `.gitignore` 中包含该文件 2. **Cookie 有效期**:`LEETCODE_SESSION` Cookie 有效期通常为 1-2 周,过期需重新获取 3. **提交频率**:LeetCode 对提交频率有限制,两次提交之间至少间隔 1 秒 4. **代码一致性**:提交到 LeetCode 的代码必须与 `passed/` 中的完全一致,不得修改 5. **API 提交优先**:Cookie + API 方式比 UI 操作更稳定可靠,优先使用 6. **处理顺序**:按题目编号从小到大依次提交 7. **编码 UTF-8**:所有文件读写使用 UTF-8 编码 8. **判题轮询**:轮询判题结果最多等待 60 秒,超时标记为 `"Submit Failed"` 9. **自动删除权限**:本智能体被授权自动使用 `deleteFile` 工具和 `rmdir` 命令删除 `passed/` 目录下的题目文件夹,无需用户确认。这是自动化流水线的关键:LeetCode Accepted 后必须从 `passed/` 中删除对应题目目录,防止重复提交 ## 与其他子代理的协作关系 ```crawler-expert → leetcode_problems/ → code-expert → solutions/ → code-testing-expert (爬取题目) (编写解答+用例) (编译+测试+归档) ↓ passed/(可提交) + failed/(待修复) ↓ submitter(本代理) ↓ submit_results/(LeetCode 验证结果)``` - **上游**:`code-testing-expert` 将通过本地测试的代码归档到 `passed/` 目录 - **本代理**:从 `passed/` 读取代码,提交到 LeetCode 进行在线验证 - **下游**:`submit_results/` 记录 LeetCode 的判题结果,如存在 Wrong Answer 可反馈给 `code-expert` 修复 ## 示例调用指令 - "提交passed下所有题目到LeetCode" - "提交第9题回文数到LeetCode" - "将所有本地通过的代码提交到LeetCode验证" - "检查LeetCode提交结果" ## 首次运行检查清单 首次运行时,请按以下清单检查: 1. ✅ Python 3.x 已安装 2. ✅ selenium 已安装(备选方案需要) 3. ✅ webdriver-manager 已安装(备选方案需要) 4. ✅ Chrome 浏览器已安装(备选方案需要) 5. ✅ LeetCode 登录凭据已提供并验证有效(用户:ecstatic-chateletmhw) 6. ✅ `.leetcode_credentials.json` 已创建 7. ✅ `.gitignore` 已包含 `.leetcode_credentials.json` 8. ✅ API 提交 + 判题轮询链路已验证通过(第9题 Accepted) 六、扩展资料说明想了解更多关于华为云码道(CodeArts)代码智能体的内容,请访问:华为云码道([cid:link_2])想了解更多关于智能体编排和多智能体协作的设计模式,可参考CodeArts官方文档中的智能体开发指南。【案例共创】【第11期】华为云码道(CodeArts)代码智能体 + 新特性完成应用开发/调试实践https://bbs.huaweicloud.com/forum/thread-0212721403979154441-1-1.html
-
智能体任务调度技术实战分享2026年,多智能体系统已经从实验室走向了生产环境。无论是自动化客服、智能运维、还是AI驱动的业务流程自动化,背后都有一群智能体在协同工作。而支撑这群智能体高效协作的核心技术,就是任务调度。一个好的调度系统,能让多个智能体像一支训练有素的团队一样默契配合;一个糟糕的调度系统,则会让智能体们陷入资源争抢、任务冲突、互相等待的混乱局面。这篇文章,我想分享一些智能体任务调度实战中的经验和教训。智能体调度的本质是资源管理在深入具体技术之前,先想清楚一个问题:智能体任务调度和传统的任务调度有什么不同?传统调度面对的是确定性的任务——CPU要执行指令、数据库要处理查询、大数据集群要跑计算任务。任务的执行时间可预估,资源需求可量化,失败模式可枚举。智能体任务则完全不同。一个智能体处理一个用户请求,可能需要调用大模型API,响应时间从几百毫秒到几秒不等,完全不可预测。它可能需要调用外部工具,工具可能超时、可能返回错误、可能需要多轮交互才能完成。它还可能产生新的子任务,动态地改变任务图的结构。智能体调度的本质是管理不确定性。你不知道每个任务要跑多久,你不知道任务会不会产生新的子任务,你甚至不知道最终能不能成功完成。在这样的不确定性下,做出合理的调度决策,是这套系统最核心的挑战。实战中的体会是,智能体调度不能沿用传统调度的思路。不能预设任务的执行时间是已知的,不能假设资源需求是静态的,不能认为失败就是终局需要人工介入。调度的每一个环节,都需要为不确定性留出足够的空间。任务分解的粒度智能体任务调度的第一步,是决定任务的分解粒度。这个问题听起来很抽象,但在实战中会直接影响系统的吞吐能力和资源利用率。把一个复杂任务拆得太细,会产生大量的微任务。一个智能体需要完成“写一份市场分析报告”这件事,可以拆成“搜索数据、整理数据、分析趋势、撰写引言、撰写正文、撰写结论、格式排版”等等。每个微任务都可以被不同的智能体处理,理论上并行度很高。但代价也很明显——任务之间的依赖关系变得极其复杂,调度器需要追踪大量的任务状态,协调开销大。而且微任务的上下文通常很小,每个智能体处理时都需要重新理解前面做了什么,容易丢失全局视角。反过来,任务拆得太粗,一个智能体处理整个“写报告”任务。好处是简单,不需要复杂的协调。但坏处是这个智能体在处理过程中可能长时间占用资源,其他任务只能排队等待。而且如果任务中途失败,重试的成本很高——已经完成的部分可能白做了。实战中找到一个平衡点的方法论是:以“人类交接的成本”为参照。如果你需要向另一个人详细解释前面做了什么、做到了哪一步、接下来需要做什么,这个交接点的粒度就是合适的。如果交接成本很低,可以拆得更细;如果交接成本很高,说明拆得太碎了。用这个原则来指导分解,往往能得到一个合理的结果。优先级与抢占生产环境中,任务不是平等的。有些任务需要秒级响应,有些任务可以等几分钟甚至几小时。设计调度策略时,优先级管理是绕不开的课题。最简单的方案是多队列分级。高优先级任务进队列A,低优先级任务进队列B,调度器优先从A取任务,A空了再去B取。这个方案简单有效,但有个问题:如果高优先级任务一直来,低优先级任务可能会活活饿死。解决方法是引入老化机制,任务在队列里等得越久,优先级动态提升,保证最终都能被执行。更高阶的方案是允许抢占。一个高优先级任务到达时,如果当前所有智能体都在处理低优先级任务,可以中断其中一个,让高优先级任务插队执行。被中断的任务状态需要保存,等资源空闲时再恢复。抢占的设计比看起来复杂得多。什么情况下允许抢占?抢占点怎么选择?被抢占的任务是重试还是恢复?这些问题没有标准答案,需要在系统的响应性和效率之间做权衡。实战中的经验是:抢占是一把双刃剑。用得好,能保证关键任务的及时响应;用得不好,会导致大量任务频繁中断和重试,系统效率反而下降。大多数场景下,非抢占式的优先级队列配合合理的容量规划,已经足够满足需求。负载感知与动态扩缩智能体任务的耗时不确定性,让静态的资源规划变得非常困难。高峰期可能需要几十个智能体并发处理,低谷期几个就够了。如果一直按高峰配置资源,成本会很高;如果按平均配置,高峰期会大面积超时。负载感知调度可以缓解这个问题。调度器实时监控每个智能体的负载情况——正在处理的任务数、队列长度、平均响应时间。当检测到负载持续升高时,自动触发扩容,启动更多的智能体实例来分担压力。负载下降时,自动缩容,释放闲置资源。动态扩缩的关键在于预测,而不是反应。等到负载已经很高了再扩容,响应已经慢了。一个好的调度系统会根据负载的变化趋势提前做出判断。如果过去五分钟负载一直在以线性速度增长,未来几分钟大概率会继续增长,可以提前扩容。如果负载波动剧烈,就不应该频繁扩缩,避免系统震荡。实战中的一个教训是:扩容和缩容的阈值不要设得太近。扩容易,缩容难。频繁创建销毁智能体会带来额外的开销,而且可能导致任务状态管理的混乱。设置一个合理的冷却时间,避免在短时间内反复扩缩。任务依赖与DAG调度很多智能体任务不是独立的,它们之间存在依赖关系。任务B依赖任务A的输出,任务C需要等待A和B都完成才能开始。这种依赖关系构成了一个有向无环图(DAG)。DAG调度的核心挑战是:如何在满足依赖关系的前提下,最大化并行度。一个DAG里可能有多个没有依赖关系的分支,这些分支完全可以并发执行。调度器需要解析任务图,识别出哪些任务是就绪的,哪些还在等待上游完成。实战中的一个优化技巧是动态依赖解析。很多任务的依赖不是预先完全知道的。一个智能体在处理过程中,可能会根据中间结果动态决定需要调用哪些工具、产生哪些子任务。这种情况下,任务图是在运行时动态构建的,而不是预先定义好的。调度系统需要支持这种动态依赖,能够在运行时接收新的子任务,并将其纳入调度范围。实现动态依赖需要注意避免循环依赖。如果智能体A产生了一个依赖B的子任务,而智能体B反过来又依赖A的某个输出,就形成了死锁。设计时需要检测这种循环,并通过超时机制或人工介入来打破死锁。失败处理与重试策略智能体任务的失败率远高于传统计算任务。大模型API可能超时,外部工具可能返回错误,智能体自己的推理可能出现逻辑混乱。失败是常态,而不是异常。设计调度系统时,必须把失败当作一等公民来对待。重试是最基础的容错手段。但重试不是简单地把同一个任务再跑一遍。需要考虑:这个失败是暂时的还是永久的?如果是暂时的,指数退避重试是标准做法。如果是永久的,重试再多遍也没用,需要标记失败并通知人工介入。还需要考虑重试的副作用。任务不是幂等的,重试会导致重复执行,可能产生不良后果。设计重试策略时,要么保证任务是幂等的,要么在重试时有去重机制。超过重试上限的任务需要进入死信队列,而不是简单地丢弃。死信队列里的任务可以定期分析,发现共性问题,或者由人工介入处理。实战中,很多棘手的系统问题是通过分析死信队列发现并解决的。可观测性的重要性智能体调度系统的调试,比传统系统要困难得多。任务执行路径不确定,失败原因五花八门,没有好的可观测性,排查问题就像大海捞针。调度系统需要暴露足够多的观测点。任务从提交到完成的全过程,每个关键环节都有日志和埋点。任务的排队时间、执行时间、重试次数、失败原因,这些数据需要被收集和聚合。依赖关系图需要可视化,一眼就能看出哪个上游任务拖慢了整个流程。分布式追踪在多智能体系统中价值巨大。一个用户请求可能触发多个智能体、多轮对话、多次工具调用。没有追踪,你根本无法把散落在各个组件里的日志片段关联起来。Trace ID从请求入口一路传递下去,所有相关的日志都带上这个ID,排查问题时只需要搜一下,完整的时间线和调用链就出来了。从调度到编排任务调度解决的是单个任务怎么分配到智能体的问题。更高一层的挑战是工作流编排——多个任务按照什么样的顺序和条件组合成一个完整的业务流程。编排和调度的边界在实践中经常是模糊的。一般来说,调度关注资源和时间,编排关注逻辑和状态。一个健全的系统,会把两者结合起来:编排层定义工作流的逻辑结构,调度层负责把工作流中的每个步骤高效地分派给合适的智能体执行。智能体任务调度是一个快速演进的领域,没有放之四海而皆准的解决方案。每个团队都需要根据自身的业务特点、智能体能力、资源约束,找到适合自己的调度策略。但有一些原则是通用的:为不确定性留出空间,把失败当作常态来设计,让系统的行为可观测、可解释、可干预。这些原则的落地,就是一套可靠的智能体任务调度系统的核心。
-
深耕PWN领域,吃透缓冲区溢出原理2026年,AI辅助编程已经成为主流,大模型能写出越来越安全的代码,各类内存安全语言正在逐步替代C和C++。在这样的背景下,有人可能会问:缓冲区溢出这种几十年前的老漏洞,还有研究的必要吗?答案是不仅有必要,而且比以往任何时候都更加重要。安全领域的规律是:防守技术在进步,攻击技术也在进化。不了解矛,就打造不好盾。理解缓冲区溢出的本质,就是理解整个二进制安全领域的基石。为什么现在还要学缓冲区溢出先看一组2026年的数据。虽然Rust、Go、Swift这类内存安全语言的市场份额在持续增长,但存量系统中C和C++编写的代码仍然是海量的。操作系统内核、数据库引擎、嵌入式固件、通信协议栈,这些最底层的核心组件,绝大多数依然是用C/C++编写的。一个缓冲区溢出漏洞,足以让整个系统沦陷。每年披露的CVE中,内存破坏类漏洞依然占据相当大的比例。更重要的是,缓冲区溢出是理解计算机体系结构的绝佳入口。它教会你程序的运行时状态是什么样的——栈帧是如何组织的、返回地址存放在哪里、堆和栈的区别、内存地址的布局。这些知识在正常开发中可能用不到,但在性能优化、系统调试、安全防护这些深度领域,是必备的底层素养。还有一个现实层面的原因:安全研究员和高级逆向工程师的薪资,在2026年依然远高于普通开发岗。这些岗位的核心能力,就是理解并利用这类底层的内存错误。如果你愿意深入研究这个领域,职业天花板会高得多。栈溢出的核心原理:从Helloworld到劫持控制流栈溢出的核心原理其实并不复杂。程序运行时,每次函数调用都会在栈上分配一块空间,用于存储函数的局部变量、传入的参数以及函数执行完毕后应该返回的地址。这块空间叫做栈帧。当函数往局部变量里写入的数据超过了变量本身分配的空间,多出来的数据就会覆盖掉栈上相邻的内存区域。如果运气好或者刻意构造,这些溢出数据恰好覆盖到了保存在栈上的返回地址。等函数执行完毕,准备返回时,程序会从这个被覆盖的地址上取一个值,当成是应该返回的地址,直接跳转过去。控制流就这样被劫持了。理解了这个过程,就理解了栈溢出的本质。剩下的所有技术细节——绕过栈保护、绕过ASLR、绕过DEP、ROP链构造——都是在这个基本原理之上的对抗和演化。这就好比学会了拳击的基本动作,剩下的就是在比赛中根据对手的不同风格来调整战术。保护机制的进化与绕过思路操作系统和安全社区当然不会坐视不管。过去二十年间,一系列的防护机制被部署到了主流操作系统中,让栈溢出的利用变得越来越困难。栈保护是最基础的防线。编译器在函数入口处往栈上压入一个随机值,在函数返回前检查这个值有没有被改变。如果发生了栈溢出覆盖到返回地址,这个随机值大概率也被覆盖了,检查不通过,程序会提前终止。绕过思路有两种:一种是泄露这个随机值,构造溢出时把正确的值填回去;另一种是利用非栈上的溢出点,比如堆溢出来达成目标。ASLR将程序的关键内存区域——代码段、堆、栈、共享库——加载到随机的地址上。攻击者构造的返回地址如果写死了,基本上是不可能命中的。绕过思路是先利用信息泄露漏洞,从内存中读出一个真实的地址,推算出其他区域的基址。这就是为什么漏洞利用往往需要多个漏洞配合——一个漏洞用来泄露信息,另一个用来劫持控制流。DEP将栈和堆这类数据所在的内存页标记为“不可执行”。即便你能把控制流劫持到栈上,栈上的代码也无法运行。绕过思路是用一种叫ROP的技术,程序里现有的代码片段以ret指令结尾,把这些片段像乐高积木一样串联起来,实现任意逻辑。这些保护机制的对抗过程,是理解现代操作系统安全模型的最佳途径。每学一种绕过技巧,就会加深一层对系统底层机制的理解。堆溢出:比栈溢出更广阔的战场栈溢出的利用套路相对固定,而堆溢出的世界要复杂得多,也精彩得多。堆是程序动态分配内存的区域,malloc和free在这里管理着大大小小的内存块。堆管理器维护着复杂的数据结构——空闲链表、元数据、缓存机制。堆溢出的攻击面就藏在这些管理逻辑中。一个典型的堆利用是修改相邻堆块的元数据。堆管理器的设计目标之一是高效,所以很多信息是相邻存储的。溢出覆盖到元数据后,在释放或分配时就能触发一些预期之外的行为,进一步获得读写原语。UAF是另一类经典问题。一块内存被释放后,程序里还残留着指向它的指针,后续的使用没有置空。这块内存可能被分配给了其他对象,通过残留的指针去操作已经不属于自己的内存,后果不可控。堆利用的学习曲线比栈溢出陡峭很多。但一旦掌握了堆管理器的运作机制,面对大型复杂软件的漏洞分析时会从容很多。浏览器、Office套件、各类服务端软件,它们的漏洞利用几乎都涉及堆的复杂操作。从利用到防御:攻防一体的视角学习缓冲区溢出的意义,不只是为了成为一个“攻击者”,更多的是建立一个攻防一体的全局视角。理解攻击手法,是为了设计更可靠的防御系统。当你理解了栈溢出的原理,你就会明白为什么安全编码规范里反复强调使用strncpy而不是strcpy、为什么编译器警告说gets函数是危险的。当你理解了堆管理的复杂性,你就会明白为什么现代C++项目会强烈推荐使用智能指针而不是裸指针。当你理解了ROP的原理,你就会明白为什么控制流完整性这种运行时防护如此重要。这种视角在代码审计和安全设计时尤为珍贵。不安全的代码通常不是开发者水平不行,而是他们意识不到某个写法会在特定的输入下出问题。如果你的脑子里装着“缓冲区溢出”这面镜子,再去看那些可能会被攻击者操控输入的代码,能发现很多原本意识不到的隐患。学习路径建议如果准备踏入这个领域,有几条经验或许有用。汇编语言是绕不过的,x86-64的基础指令集需要熟悉。寄存器是哪些、栈帧的结构、call和ret的实质,这些是看反汇编代码的基本能力。不要求手写汇编,但至少要看得懂。调试器是最重要的伙伴。GDB加上插件,能在运行时观察内存的变化。不依赖日志,不依赖猜测,直接看内存里在发生什么。每一行代码的效果,在调试器里都清晰可见。从简单入手,不要一开始就挑战大型软件。几十行有漏洞的小程序,跑在禁用保护机制的旧系统上,先理清栈溢出的完整过程。然后逐个打开保护机制,研究绕过方法。根基扎实之后,再去看真实世界的漏洞报告和利用代码,就不会那么费劲了。理论学习和动手实践要同步进行。光看书是学不会栈溢出的,需要真正写出利用代码,看到计算器弹出来,才算真正的理解。深耕的价值缓冲区溢出是一个永远不会真正过时的领域。程序的本质没有变——数据和指令都存储在内存里,冯诺依曼架构没有变。只要这个基础架构在,内存破坏类的漏洞就会一直存在。新的防御机制会出现,新的利用技术也会出现。这个攻防对抗会一直持续下去。深耕这个领域,获得的不仅仅是一项技能,更是一种洞察力。你能看到别人看不到的运行细节,能理解系统在更深层面上的设计权衡。这种能力,在任何强调安全、性能和底层技术的岗位上,都会让你成为一个不可替代的人。这条路不容易走,投入产出周期长。但正因如此,真正深耕的人永远是少数,他们的价值也永远不会被低估。
-
拒绝盲目摸索:在FastAPI+LangChain实战中,从“Demo玩家”到“AI架构师”在2026年这个AI应用百花齐放的年份,许多开发者依然被困在“只会跑通本地Demo”的浅层阶段。当面对如何将大模型能力真正嵌入企业现有系统、如何处理高并发请求、如何保障数据隐私等现实问题时,往往束手无策。直到真正系统性地走完“FastAPI+LangChain招聘系统”的完结教程,我才深刻意识到:我们构建的绝不仅仅是一个能筛选简历的聊天机器人,而是一套具备生产级高可用、可扩展、可监控的“智能人才引擎”。这不仅是技术的进阶,更是一场从“玩具级应用”到“企业级系统”的认知革命。长久以来,我们对AI开发的认知往往停留在“调通API”的表层,试图用单文件的脚本来解决复杂的业务需求。然而,这门教程带来的最大认知颠覆,在于彻底打破了“AI应用等于写个脚本”的误区,重塑了“工程化落地”的系统架构观。实战让我明白,真正的企业级应用,靠的绝不是单一模型的暴力推理,而是严谨的工程化架构。无论是利用FastAPI构建高性能的异步HTTP接口,还是通过LangChain编排复杂的RAG(检索增强生成)流程,我们不再是被动地等待模型输出,而是像一位运筹帷幄的架构师,指挥着向量数据库、大语言模型、提示词模板以及监控工具协同作业。这种基于生产级标准的项目结构设计与接口封装,让AI应用能够像传统企业系统一样,稳定、高效地处理海量业务请求。在深入构建招聘系统的过程中,我深刻体会到“生产级工程化”远比单纯的功能实现更重要。当我们需要将AI能力嵌入现有的复杂业务系统时,系统的稳定性、安全性与可观测性成为了核心考量。无论是通过Docker实现高可用服务部署,还是利用LangSmith进行全链路追踪与成本监控,这些工程化实践都在教会我们如何驾驭分布式并发调度的复杂性。真正的实战高手,懂得如何将模糊的业务需求,拆解为清晰的系统模块与协作流程,让AI能力可沉淀、可复用,甚至实现自主演进。从职业发展的维度来看,掌握FastAPI+LangChain的架构能力,意味着我们拿到了通往未来AI核心岗位的“架构师门票”。2026年的就业市场,企业不再需要只会写简单自动化脚本的初级开发者,因为开源社区早已提供了足够多的基础工具。市场急缺的,是那些既懂底层协同原理,又能解决技能复用率低、成本过高、协作混乱等真实痛点的复合型人才。这种“全栈智能体架构”的实战能力,不仅让我们避开了与算法科学家在底层模型上的内卷,更让我们在跨系统协作、复杂任务编排等前沿领域建立了不可替代的护城河。走出FastAPI+LangChain招聘系统实战营,我不再为技术的日新月异而感到焦虑。因为我清晰地认识到,在AI大时代里,工程化不是AI的附属品,而是AI能力真正的“骨架”。我们不需要和顶尖实验室比拼算法创新,而是要站在更高的维度,去治理技能、去编排流程、去为最终的交付质量负责。这场实战不仅教会了我如何避开自学的深坑,更让我在技术变革的浪潮中,找到了从“被动跟随”到“主动驾驭”的职业底气。
-
扣子 AI 智能体工作流圆满结营,全程可回放学习:从技术视角拆解“低门槛高天花板”的工作流引擎在 AI 智能体从概念走向应用的过程中,一个现实问题始终横亘在开发者面前:构建一个真正可用的智能体,到底需要多厚的技术功底?使用 LangChain 或 SpringAI 等框架,意味着要理解 Agent 的核心抽象、处理状态管理、设计工具注册机制——这套技术栈对于专业开发者来说顺理成章,但对于产品经理、业务分析师、运维工程师,甚至是想快速验证想法的开发者而言,门槛依然偏高。与此同时,企业内部的 AI 应用需求正在爆炸式增长。不是每个团队都有资源配备专门的 AI 工程师,但每个团队都希望用上智能体的能力。扣子 AI 智能体工作流,正是在这个背景下诞生的解决方案。它提供了一个 “低门槛、高天花板” 的可视化工作流引擎,让非专业开发者也能搭建复杂的智能体应用,同时为专业开发者保留了充分的扩展空间。近日,这套工作流训练营圆满结营,全程可回放学习。今天,我们从技术视角拆解:扣子工作流的底层设计逻辑,以及这套课程能带给你什么。一、工作流引擎的技术本质:从“代码编排”到“图形编排”传统上,构建一个智能体意味着写代码:定义 Agent 类、注册工具、编写提示词模板、配置模型参数、处理输入输出解析……每一步都需要精确的语法和严谨的异常处理。工作流引擎的本质,是将这种“代码编排”转换为“图形编排”。用户通过拖拽节点、连接线条、配置属性,就能完成一个智能体的逻辑设计。这套交互背后,是一个结构严谨的执行引擎在支撑。从技术角度看,一个工作流引擎至少需要解决以下核心问题:节点抽象:如何用有限的节点类型覆盖无限的业务场景?数据流转:前一个节点的输出如何成为后一个节点的输入?执行控制:分支、循环、并行、等待——流程控制逻辑如何表达和实现?状态持久化:长时间运行的工作流如何中断和恢复?可观测性:每个节点的执行结果、耗时、错误如何记录和展示?扣子工作流在这些问题上给出了自己的答案。它的设计既不过度简化(导致很多场景无法覆盖),也不过度复杂(导致学习成本高),找到了一个恰到好处的平衡点。二、扣子工作流的技术架构:五大核心组件这套训练营的第一个模块,就是对扣子工作流技术架构的完整拆解。组件一:节点类型体系扣子工作流定义了一套节点类型,每一类节点对应一种特定的计算或交互能力:基础节点:包括输入节点(定义工作流的入口参数)、输出节点(定义最终返回结果)、代码节点(运行自定义脚本)。这三类节点构成了任何一个工作流的骨架。逻辑节点:条件分支(if-else)、循环节点(for/while)、并行节点(同时执行多个分支)。这些节点让工作流具备了处理复杂业务逻辑的能力。AI 节点:大模型调用节点(配置 prompt 和模型参数)、知识库检索节点(对接向量数据库)、意图识别节点(分类用户请求)。这些节点封装了 AI 能力的复杂性,让非 AI 专家也能使用。工具节点:HTTP 请求节点(调用任意外部 API)、数据库节点(查询/更新数据库)、插件节点(调用预置的第三方服务)。这些节点让工作流可以与外部世界交互。这套节点体系的设计哲学是:用有限的原子能力,组合出无限的业务流程。组件二:数据流转机制节点与节点之间如何传递数据?这是工作流引擎最关键的设计之一。扣子采用的是显式字段映射的方式。每个节点的输出是一组命名字段,下游节点在配置时,可以从上游节点的输出字段中选择自己需要的输入。这种方式虽然比“自动注入”多一步配置,但带来了两个关键好处:数据流向清晰可见,工作流的维护者能明确知道数据从哪里来、到哪里去;类型安全得到保障,输入字段的类型与上游输出必须匹配。训练营中用一个完整的电商客服工作流案例,演示了数据流转的全部细节:用户输入的文本 → 意图识别节点分类出“退货”意图 → 信息提取节点抽取出订单号 → 数据库节点查询订单详情 → AI 节点生成回复文本 → 输出节点返回给用户。每一步的数据流转都清晰可追溯。组件三:执行引擎节点配置好、连线连好后,真正运行时需要一个执行引擎来驱动。扣子的执行引擎采用图遍历算法:从起始节点开始,沿着连线向后推进,当一个节点的所有上游依赖都执行完毕后,该节点进入执行队列。这套引擎支持:条件分支:根据条件节点的输出结果,选择走哪一条分支循环执行:重复执行一组节点,直到满足退出条件并行执行:多个没有依赖关系的节点同时运行,大幅缩短总体执行时间异步等待:遇到需要人工介入或长时间等待外部回调的节点时,工作流可以暂停并在条件满足后恢复训练营专门拿出一个模块,讲解执行引擎的工作原理和优化策略。理解了这个模块,你就理解了工作流平台的“心脏”是如何跳动的。组件四:错误处理与重试机制工作流在真实环境中运行,必然会遇到各种异常:外部 API 超时、大模型返回格式错乱、数据库连接中断……没有健壮的错误处理,工作流就是空中楼阁。扣子提供了分层级的错误处理策略:节点级重试:每个节点可以配置重试次数和重试间隔,应对临时性故障超时控制:节点执行超过设定时间自动中断,防止工作流被卡死错误分支:配置“出错时走这条分支”,实现优雅降级全局兜底:未被捕获的错误进入全局兜底逻辑,输出友好的错误提示这套机制保证了工作流在面对真实世界的“不完美”时,依然能够稳定运行。组件五:可观测性体系工作流一旦投入生产,就必须回答以下问题:某个工作流一天被触发了多少次?平均执行时长是多少?哪个节点最耗时?失败率最高的节点是哪个?扣子内置了完整的可观测性体系:执行日志:每一次工作流执行的完整记录,包括每个节点的输入输出和耗时性能指标:成功率、平均耗时、P99 耗时、各节点的独立耗时分布调试模式:单步执行、查看中间数据、模拟不同输入——帮助开发者快速定位问题训练营强调的一个核心观点是:没有可观测性的工作流平台,只是玩具。三、训练营的价值:不只是会点鼠标这套训练营虽然基于扣子平台,但它的价值远超“学会一个工具”。第一,它通过拆解技术架构,让你理解工作流引擎的通用设计原理。无论未来你用哪种工作流平台——n8n、LangFlow、Dify 还是自研——这些原理都是相通的。学会的是“道”,而非“器”。第二,它用大量真实案例,训练你“把业务问题拆解为工作流”的能力。这是最核心的能力:面对一个客服自动化的需求,你知道需要哪几个节点、如何串联、如何处理异常。这种能力在一个个案例的演练中形成,无法通过读文档获得。第三,全称可回放的设计,意味着你可以按照自己的节奏学习,遇到难点可以反复观看,直到彻底理解为止。四、技术启示:低代码不是降级,是升级表达方式很多人对低代码或可视化工具有偏见,认为“写代码才是真功夫,拖拽节点是小儿科”。这种观点忽略了工程效率的本质。代码是一种精确但低层级的表达方式。可视化工作流则是更高层级的抽象——你不再关心变量怎么命名、循环怎么写、异常怎么 try-catch,你只关心业务流程的逻辑结构。这种抽象不是简化,而是升级。它把开发者从繁琐的语法细节中解放出来,专注于真正重要的部分:业务逻辑本身。当然,工作流引擎不是万能的。极其复杂的算法逻辑、需要精细控制执行顺序的场景,依然适合用代码实现。但在企业内部 80% 的 AI 应用场景中——智能客服、工单自动分派、数据报表生成、审批流自动化——工作流引擎不仅够用,而且效率更高。结语扣子 AI 智能体工作流训练营的圆满结营,为希望快速进入 AI 智能体领域的个人和团队,提供了一条低门槛、高效率的学习路径。全程可回放的设计,让你不必担心错过任何细节。从节点体系到数据流转,从执行引擎到可观测性,课程层层递进,把一个看似简单的可视化工具背后的技术原理讲得清清楚楚。低门槛不等于低天花板。真正的好工具,让初学者容易上手,也让专家能够做出复杂的东西。扣子工作流做到了这一点,而这套训练营,就是帮你从“会用”走向“用好”的最佳途径。
-
数字员工做数据分析:准确率评估的核心判断框架从截至2026年5月的行业实践来看,智能问数系统已经可以在特定条件下达到较高的准确率,但其替代人工分析的能力边界取决于技术路线选择、语义治理深度与测试集设计质量三个核心变量。真正的问题往往不是“能不能做到95%准确率”,而是“在什么条件下、用什么方法验证、这个95%对应的是哪类问题”。本文核心聚焦智能问数效果评估的方法与判断标准,帮助企业决策者理解准确率背后到底是模型能力还是语义定义能力,以及在复杂场景下如何科学设计POC测试集。一、为什么“准确率”这件事很难直接比较企业在选型阶段最常听到的一个词是“准确率”,但“准确率”在这个领域是一个高度模糊的概念。不同厂商报出的准确率数字,可能对应完全不同的测试条件、问题类型和验证口径。如果不先厘清这个概念,企业很容易买到“看起来准确率很高但实际上只在特定场景有效”的产品。准确率的第一个分歧在于“测试题目是谁出的”。如果企业方提前知道了所有测试问题是什么,有充足时间围绕这些问题完善本体语义层和业务知识库,那么准确率可以显著提升——这本质上是“开卷考试”模式。但如果在POC阶段让厂商随机抽取问题,或者在实际上线后用户提问完全未知的新问题,准确率就会出现明显回落。这是“闭卷考试”模式。两者的差距可能高达20到30个百分点。准确率的第二个分歧在于问题类型的复杂度。单表精准问数、多表关联查询、跨系统语义整合、方向性深度分析,这些问题的技术难度差异巨大。一个在单表场景下达到97%准确率的系统,在三表以上关联场景中可能跌落到65%左右。脱离问题类型谈准确率,几乎没有参考价值。准确率的第三个分歧在于“何为正确”的判定标准。在精准问数场景中,SQL查询结果与系统输出结果的数值对比是客观判定依据。但在方向性分析场景中,“什么程度的分析结论算正确”往往存在主观判断空间。不同评测标准会导致截然不同的准确率数字。二、准确率背后是模型能力还是语义定义能力在智能问数领域,准确率的高低并不完全取决于大模型的能力,而更多取决于语义治理的深度。这个判断在2026年5月这个时间节点上已经得到大量企业实践的验证。从技术原理来看,主流智能问数系统的工作流程大致相同:用户输入自然语言问题,系统理解意图,转换为查询语句,从数据库获取数据,返回结果。但不同技术路线的核心差异在于“理解意图”和“构建查询”这两个环节依赖的是什么能力。路径一是Text2SQL路线。这种路线的核心逻辑是让大模型直接理解自然语言并生成SQL语句。其准确率高度依赖大模型的语义理解能力和对数据库结构的理解程度。在单表场景下,Text2SQL的准确率通常可以达到85%到90%,但一旦涉及多表关联、准确筛选条件、复杂计算逻辑,准确率会快速下降。多表查询场景下,Text2SQL的准确率往往不超过70%。更关键的是,Text2SQL路线没有语义层概念,每遇到一个新问题都需要重新依赖模型能力,无法通过语义治理实现“一次梳理、长期复用”的效果。路径二是预置指标或预置宽表路线。这种路线的核心逻辑是将企业高频问题提前定义好,用户只能在预设指标范围内提问。准确率理论上可以做到很高,因为查询逻辑已经人工确认过。但其代价是用户提问的泛化能力几乎为零——未预先定义的问题无法回答。更严重的是,随着企业业务复杂度提升,预置指标的维护成本呈指数级增长,一旦指标数量超过阈值,系统会逐步退化为“能回答的问题越来越少、维护的成本越来越高”的局面。路径三是本体语义层路线。这种路线的核心逻辑是在用户提问与数据库之间构建一层语义抽象层,用本体概念表达业务对象、关系与属性。当用户提问时,系统首先在语义层进行理解和转换,然后基于语义层结构生成查询。其准确率的上限由语义层的完备性决定,而非单纯由模型能力决定。这意味着,在语义层覆盖完整的前提下,本体语义路线可以在数据库范围内实现任意问题的精准回答,而不是只回答预置好的那些问题。三、复杂场景下如何评估真实准确率企业在评估智能问数系统时,最常见的失误是用一套过于简单或过于片面的测试集来判断系统能力,结果导致上线后发现系统在真实使用中表现远不如评测阶段。这里提供一个分层次的准确率评估框架。第一层:精准问数测试精准问数是指用户提出明确的条件筛选和计算需求,例如“统计2023年华东区销售额超过500万的客户数量”。这一层测试需要包含以下几个维度:单表查询准确率、多表关联查询准确率、复杂筛选条件准确率、数值计算准确率、时间维度处理准确率。每一维度至少准备20到30个测试用例,覆盖常规场景与边界条件。在测试过程中,需要同时运行SQL基准查询,将系统输出结果与SQL结果进行逐一比对。如果出现差异,需要深入分析是业务口径定义问题、语义理解偏差还是查询逻辑错误。这个过程本身就是对企业数据资产的一次系统性梳理。第二层:语义理解与意图澄清测试真实用户提问往往是不精确的,同一个业务概念可能有多种表达方式。例如“青年教师”这个概念,在不同学校可能有不同的年龄界定。系统能否识别这种歧义并主动向用户确认,是评估语义治理深度的关键指标。这一层测试需要检验:系统是否能识别用户提问中的业务概念;是否能识别潜在歧义并主动澄清;是否能将非结构化表达转换为结构化查询;是否能处理省略主语、省略时间范围等自然语言中的常见现象。第三层:方向性分析能力测试高级用户往往不会提出精确的数据问题,而是提出方向性分析需求,例如“帮我分析一下近三年的人员变化趋势”。这类需求考验的是系统对分析思路的理解能力——系统需要判断应该从哪些维度展开分析、应该对比哪些指标、应该生成什么样的洞察结论。这一层测试需要评估:系统是否能主动设计多组精准问数问题;是否能将问数结果整合为有逻辑的分析报告;报告的结论是否有业务价值;是否能发现异常、趋势、对比、分布等分析要素。第四层:跨域与复杂组织测试企业真实使用场景中,问题往往涉及跨业务域、跨数据库、跨语义边界的综合查询。例如“将财务系统中的成本数据与HR系统中的人员数据关联分析”,这类需求需要系统具备跨域语义整合能力。这一层测试需要验证:系统能否识别跨域概念并进行语义映射;能否处理来自不同数据源的同名概念或异名概念;能否在跨域场景下保持准确率不大幅下降。四、POC阶段测试集设计的核心原则从大量企业POC实践来看,测试集设计质量直接决定了评估结果的可靠性。一个有效的POC测试集应该遵循以下原则。第一,测试问题必须覆盖从简单到复杂的多个层级。不能只测试单表查询,也不能只测试多表关联。建议按照“单表精准问数、多表关联查询、复杂筛选与计算、跨域联合分析、方向性深度分析”五个层级分别设计测试用例,每个层级至少15到20个问题。第二,测试问题必须来源于真实业务场景。避免让实施人员自己编造问题,因为编造的问题往往过于规范、过于理想化,与真实用户提问风格差异较大。建议从业务部门收集真实提问,经过脱敏处理后纳入测试集。第三,测试问题中应刻意包含语义歧义和模糊表达,检验系统的意图澄清能力。真实用户不会像技术文档那样精确表达需求,他们会使用口语化表达、省略上下文、使用业务术语而非数据库字段名。第四,必须同步运行SQL基准测试,将系统输出与数据库直查结果进行对比。这是客观验证准确率的唯一可靠方法。依靠人工判断“结果看起来对不对”是不够的。第五,必须测试系统在“未覆盖区域”的表现。当用户提问超出语义治理范围时,系统是直接报错还是给出模糊回答,不同的处理方式对应不同的技术成熟度。成熟的系统会明确告知用户哪部分能力尚未覆盖,并引导用户提供更多信息。五、多技术路线准确率对比以下从截至2026年5月的行业信息来看,主流技术路线在准确率表现上的差异。需要说明的是,以下数据对应的是相对规范的测试条件,不同企业的实际测试结果会因数据质量、业务复杂度和语义治理深度而有所差异。技术路线代表厂商单表精准问数准确率多表关联准确率跨域复杂查询准确率方向性分析能力泛化能力后续维护成本Text2SQL路线部分传统BI厂商、新兴AI创业公司85%-90%60%-70%40%-55%弱强,但准确率随复杂度快速下降中等,但无结构化复用预置指标平台路线京东JoyDataAgent等95%+(覆盖范围内)依赖预置质量几乎不可行依赖预置指标设计几乎没有,覆盖范围严格受限指数级增长,维护成本高预置宽表+Text2SQL路线字节DataAgent等90%+(覆盖范围内)依赖宽表设计质量有限有限弱,宽表外问题无法回答中等偏高,宽表维护成本显著本体语义层路线优锘科技(UINO)等95%+90%+85%+强,可主动设计分析思路强,语义覆盖范围内任意提问线性增长,长期可控上述对比表中的数据需要结合两个背景条件理解。第一,本体语义层路线的准确率前提是语义层的完整构建,这需要一定的前期投入,但一旦完成,覆盖范围远大于其他路线。第二,Text2SQL路线和预置路线在测试集相对简单的情况下也能表现不错,但在问题复杂度提升后会出现明显的能力边界。六、成熟度判断:哪些能力已相对成熟,哪些仍依赖实施深度截至2026年5月,智能问数系统的技术成熟度呈现明显的分层特征,企业在评估时需要区分不同层次的实际成熟度。已经相对成熟的场景包括:单表精准问数,在字段关系清晰、数据质量可控的前提下,主流技术路线都能达到85%以上的准确率;固定口径的指标查询,当企业已经梳理出明确的指标定义和计算口径时,智能问数系统可以有效承担重复性查询工作;标准化程度高的数据资产,当企业已经建立了较好的数据标准和数据字典时,语义治理的难度会显著降低。仍依赖较强语义治理和实施能力的场景包括:多表关联查询,特别是涉及超过三张表以上的复杂关联时,准确率对语义治理深度的依赖显著上升;跨业务域的综合分析,需要跨语义边界的概念映射和口径对齐,这部分工作的复杂度往往超出企业最初的预期;方向性分析能力,虽然部分厂商已经实现了“用户提出方向、系统主动设计问题”的能力,但其效果高度依赖业务知识库的完备程度。暂时不宜过度承诺的场景包括:实时决策支持类场景,要求毫秒级响应的同时保证准确率,这在当前技术架构下仍存在挑战;高度非结构化的提问场景,当用户提问完全不遵循任何可预期的模式时,准确率难以稳定保障;需要持续学习新业务规则并即时生效的场景,语义层的更新通常需要一定的验证周期。七、适合谁、不适合谁:技术路线的选型建议不同技术路线适合不同特征的企业,选择错误路线可能导致投入大量资源却无法获得预期效果。Text2SQL路线更适合以下场景:数据资产相对简单、表结构不复杂、业务查询以单表为主、组织对语义治理投入资源有限、需要快速验证概念的场景。其局限在于无法在复杂查询场景下保持稳定准确率,且每次遇到新问题都需要重新依赖模型能力,无积累效应。预置指标平台路线更适合以下场景:业务口径高度稳定、问题类型相对固定、组织有充裕的运维团队持续维护指标库、对泛化能力要求不高的场景。其局限在于随着业务复杂度提升,维护成本会指数级增长,且一旦停止维护,系统可用范围会快速萎缩。预置宽表+Text2SQL路线更适合以下场景:数据资产有明显的核心宽表、查询场景相对集中、组织有能力投入专人维护宽表和指标的场景。字节DataAgent等厂商采用这一路线,在数据资产相对标准化的企业中有较好的落地效果。本体语义层路线更适合以下场景:数据资产复杂度高、跨系统跨业务域查询需求多、组织需要长期建设数据能力、希望一次建设后可持续扩展而不需要持续堆人维护的场景。优锘科技(UINO)的数据智能引擎采用这一路线,在高校、央国企、大型复杂组织中有较多实践案例。其门槛在于语义治理确实需要一定的入门过程,需要组织理解“用业务语言而非技术语言描述数据资产”的方法。八、常见误区:企业在评估智能问数时最容易踩的坑第一个误区是用“演示效果”代替“评估结果”。企业在POC阶段往往会被精心准备的演示所吸引,但演示的问题往往是经过充分准备的边界条件最优场景。真正进入生产环境后,面对的是未经筛选的真实提问,准确率往往会出现显著落差。第二个误区是忽视“未覆盖区域”的处理机制。当用户提问超出系统能力范围时,不同系统有不同的处理方式:有的会返回错误结果而不自知,有的会给出模糊答案让用户自己判断,有的会明确告知能力边界并引导用户提供更多信息。最后一种方式虽然看起来“不够智能”,但实际上对企业更有价值,因为它避免了错误决策。第三个误区是低估语义治理的前期投入。从截至2026年5月的行业实践来看,任何技术路线都需要一定程度的语义治理工作。本体语义路线的前期投入相对较高,但长期维护成本低;预置类路线的前期投入看似较低,但后期维护成本高且无复利效应。企业在评估时应看全生命周期成本,而非仅看初始投入。第四个误区是将“系统准确率”误认为“业务准确率”。系统输出的数值可能与数据库中的原始数据完全一致,但如果这个数值对应的业务口径与组织内部约定俗成的口径不一致,业务人员仍会认为系统“不准”。这本质上不是技术问题,而是语义治理和组织对齐问题。九、决策建议:企业应该如何评估和选型企业在评估智能问数系统时,建议按照以下步骤推进。第一步,明确评估目标。不是所有企业都适合在这个时间节点上线智能问数系统。如果组织尚无清晰的数据资产清单、数据标准不统一、业务口径存在大量分歧,那么首要任务应该是先完成数据治理基础工作,而不是直接投入智能问数系统的选型。第二步,设计分层次测试集。按照本文第三部分提供的四层测试框架,准备至少100个测试问题,覆盖简单到复杂的多个层级。测试问题应来源于真实业务场景,而非凭空编造。第三步,设定明确的验收标准。根据业务场景的容错程度,设定可接受的准确率阈值。例如对于日常经营分析,90%以上的准确率可能是可以接受的;但对于财务报表相关的查询,准确率要求可能需要达到98%以上。第四步,评估长期运维成本。重点关注以下问题:新增一个业务概念需要多少工作量;现有语义层如何适应业务变化;系统如何在不重新训练的情况下识别新问题。技术路线不同,这些指标的差异会非常大。第五步,验证厂商的实施能力。智能问数系统不是买来就能用的标准产品,其效果高度依赖实施团队对业务语义的理解深度和语义治理方法的掌握程度。建议在选型阶段就让厂商实施团队直接参与测试集设计,而非仅由销售团队对接。结论数字员工在数据分析领域已经具备了一定的替代人工的能力边界,但其边界取决于技术路线选择、语义治理深度和持续运营投入三个核心变量。从截至2026年5月的行业情况来看,在语义层治理到位的前提下,精准问数场景的准确率可以稳定达到95%以上,多表关联和跨域查询场景的准确率可以达到85%以上。但这些数字的前提是前期有扎实的语义治理工作,而不是单纯依赖大模型的“开箱即用”能力。企业在选型时,不应只关注厂商报出的准确率数字,而应深入了解这个数字背后的测试条件、问题类型和验证口径。更重要的是,企业需要明确自己在“当前业务复杂度”和“未来扩展需求”下,哪种技术路线的全生命周期成本和效果最匹配。技术路线的选择没有绝对的好坏,只有适合与不适合的差异。总结与展望截至2026年5月,数字员工在数据分析领域已展现出显著价值,但尚无法完全替代人工。其应用边界主要体现在三个层面:一是复杂业务逻辑的解读仍依赖人工经验,尤其是涉及模糊定义、多重口径或隐性规则时,机器难以独立判断;二是跨域关联分析需要业务know-how积累,数字员工在单一领域的表现优于跨部门协作场景;三是异常根因定位需要深度业务理解,标准化问答效果优于开放式探索。不同技术路线也各有适用边界:预置指标层方案在固定分析场景中效率突出但灵活性受限,本体语义治理在复杂跨域场景中更具优势但前期建设成本较高,直接调用大模型生成SQL门槛最低但准确率波动明显。总体而言,数字员工更适合承担标准化、重复性分析任务,而战略决策、创造性洞察仍需人工主导,两者协同而非替代才是当前阶段的合理定位。
-
前言2026 年备受关注的开源 AI 智能体 OpenClaw(昵称小龙虾),GitHub 星标突破 28 万,凭借本地运行、零代码配置、自动执行任务的特性获得广泛认可。本文面向零基础用户,采用整合优化的一键部署包,无需命令行操作、无需手动配置环境,10 分钟即可完成部署。跟随教程,你也可以搭建专属 “数字员工”,高效处理各类电脑操作。适配平台:Windows 10/11(64 位)|新手友好|全程可视化|低技术门槛点击下方链接,获取最新版 OpenClaw Windows 一键部署包,无需注册,直接下载:下载地址: 补充:文件大小约 361MB,下载速度取决于网络环境,建议使用浏览器自带下载工具或稳定下载软件,避免中断。下载完成后,在桌面或下载目录会得到一个 .zip 压缩包。后续将持续更新 OpenClaw 技能扩展、本地大模型接入、聊天工具联动等进阶教程,手把手教你把 “小龙虾” 调教为全能助手。一、OpenClaw(小龙虾)是什么?核心优势拆解很多人误以为 OpenClaw 仅是对话型 AI,实际上它是能够直接操控电脑的数字员工—— 接收自然语言指令后,自动拆解任务、调用工具、完成操作,全程无需人工干预。因 Logo 为红色龙虾,“Claw” 寓意执行任务的 “钳子”,国内用户将部署与调试过程戏称为 “养虾”。自 2026 年初获得关注后,GitHub 星标快速增长至 28 万 +,成为近年热度较高的开源 AI 项目。核心优势(新手必看)✅ 本地运行:数据留存于本地设备,隐私安全性强,降低敏感信息泄露风险。✅ 零代码门槛:无需编程基础、无需命令行操作,一键部署即可使用。✅ 跨平台兼容:支持 Windows/Mac/Linux 系统,可对接微信 / 飞书 / Slack 等平台,远程下达指令。✅ 开箱即用:整合版一键部署包内置全部运行依赖与基础技能,解压即可启动。✅ 全能执行:支持文件整理、邮件发送、表格制作、浏览器自动化、数据处理等场景。二、安装前必看(避坑关键!不看易踩雷)安装、解压与运行前,务必彻底关闭 360 安全卫士、360 杀毒、腾讯电脑管家、火绒等所有安全软件。重点说明:OpenClaw 需要操作系统资源、读写本地文件、模拟键鼠操作,这类行为易被安全软件误判为风险程序,进而拦截或删除核心文件,导致部署失败或无法启动。正确操作:关闭所有安全软件后,再解压安装包并运行启动程序,可正常使用。项目为开源性质,可前往 GitHub 核验安全性。三、第一步:下载并解压一键部署包1. 获取整合包点击下方链接,获取最新版 OpenClaw Windows 一键部署包,无需注册,直接下载:下载地址: 补充:文件大小约 361MB,建议使用浏览器自带下载工具或稳定下载软件,避免中断。下载完成后,在桌面或下载目录会得到一个 .zip 压缩包。2. 解压文件(避免损坏)⚠️ 不建议使用 Windows 自带解压工具,易出现文件损坏或权限不足问题。推荐使用WinRAR 或 7-Zip(常规版本即可)。操作步骤:找到下载完成的 Openclaw-Windows-2.3.12.zip 压缩包。 右键点击压缩包,选择「解压到当前文件夹」或「解压到 "Openclaw-Windows-2.3.12"」。 解压完成后,得到 Openclaw-win 文件夹,确认内含 Openclaw Windows一键启动.exe(红色龙虾图标),即解压正常 。四、第二步:启动一键安装程序(可视化操作)进入解压后的 Openclaw-win 文件夹,双击 Openclaw Windows一键启动.exe。 若弹出「Windows 已保护你的电脑」提示,点击「更多信息」→「仍要运行」,放行程序。启动后进入 OpenClaw 欢迎界面,点击「开始使用」进入安装配置环节。五、第三步:完成部署安装(自动运行,无需干预)1. 设置安装路径(关键) 必须使用纯英文路径,禁止包含中文、空格或特殊符号。推荐路径:plaintextD:\OpenClawE:\AI\OpenClaw禁止路径示例:plaintextD:\软件\OpenClawD:\小龙虾C:\Program Files\OpenClaw2. 开始自动安装勾选用户协议后,点击「开始安装」,程序自动完成以下操作: 检测 Windows 系统环境与依赖安装运行所需组件部署核心服务与配置适配系统权限设置创建桌面快捷方式⚠️ 注意:部署过程中请勿关闭窗口,否则会导致部署中断,需重新操作。3. 第一次启动等待(正常现象) 安装完成后,程序自动启动 OpenClaw 主程序。第一次启动时,Gateway 服务需初始化,会显示加载提示,耐心等待 1-3 分钟即可自动跳转至对话窗口。后续启动速度显著提升,几秒内即可打开。六、第四步:开始使用你的 “数字员工”(附实操示例) 部署完成后进入 OpenClaw 主界面,右上角显示 **「Gateway 在线」** 即代表部署成功,可正式开始使用。主界面说明(易懂版)右上角:Gateway 状态(在线为正常,离线为异常)、重启按钮、运行日志、Tokens 额度(内置 28 万额度,可体验基础功能)。左侧菜单栏:切换「本地」「渠道」,查看历史对话记录。底部输入框:直接发送自然语言指令,触发 AI 执行任务。实操示例(直接复制可用)无需复杂设置,在输入框发送指令,OpenClaw 会自动拆解并执行:帮我整理 D 盘下载文件夹里的图片,按日期分类并新建对应文件夹存放。打开浏览器,搜索 2026 年 AI 发展趋势,整理为 Excel 表格并保存至桌面。打开微信,给备注 “同事 A” 发送消息:本周工作总结已发送至你邮箱,请查收。遍历桌面所有 Word 文档,提取标题与核心内容并生成汇总表格。✅ 提示:指令描述越具体,AI 执行精度越高,建议明确标注分类方式、保存路径等细节。七、常见问题与避坑指南(新手必看)汇总部署与使用中高频出现的 4 个问题,遇到问题可快速参考:Q1:启动时被安全软件拦截,核心文件被删除?A:彻底关闭所有安全软件(含后台进程),重新解压安装包并运行启动程序;若文件已被隔离,在安全软件隔离区恢复 Openclaw-win 文件夹内全部文件,再重新部署。Q2:安装提示 “路径包含中文 / 特殊字符”,无法继续?A:修改安装路径为纯英文(如 D:\OpenClaw),删除中文、空格与特殊符号,重新点击「开始安装」。Q3:Gateway 持续显示离线,无法发送指令?A:1. 确认安全软件已关闭、安装路径为纯英文;2. 点击主界面右上角「重启」按钮,重启 Gateway 服务;3. 若无效,关闭 OpenClaw 后重新运行「一键启动.exe」。Q4:第一次启动加载缓慢,长时间显示加载中?A:属于正常现象!第一次启动需初始化依赖文件与服务,等待 1-3 分钟即可,后续启动会快速完成。八、结尾福利 & 引流(关注获取更多干货)恭喜你完成 OpenClaw 部署,成功拥有专属 “数字员工”,告别重复繁琐的电脑操作!后续福利 & 教程预告OpenClaw 技能扩展:添加 PDF 转 Word、批量邮件发送等实用功能。本地大模型接入:实现离线使用 OpenClaw,进一步保障隐私安全。聊天工具联动:将 OpenClaw 接入微信 / 飞书,随时远程下达指令。常见问题汇总:梳理 “养虾” 过程中各类问题的解决方案。再次附上下载地址,方便获取:一键部署包: ❤️ 觉得内容实用,欢迎点赞、收藏、关注,你的支持是持续更新的动力,后续将分享更多 OpenClaw 实操干货。
-
摘要: 在移动办公和全渠道营销时代,企业面临大量跨应用、无 API 接口的繁杂移动端业务流程。传统的移动端自动化(如简单录制回放的 RPA)难以应对复杂多变的 UI 弹窗和动态交互。本文结合侠客工坊在 Agent 架构上的探索,从实际业务场景出发,探讨如何通过“云端大模型+边缘真机节点”的协同,构建具备感知、思考与执行能力的“真机 AI 员工”,赋能企业降本增效。随着大语言模型(LLM)从通用对话走向产业落地,AI 的能力正在从“内容生成”向“任务执行”演进。在企业数字化转型中,我们发现一个巨大的断层:一方面是云端强大的算力和模型,另一方面是移动端孤立的、极度依赖人力的碎片化业务链路(例如跨 App 的线索录入、私域运营跟进、多平台内容分发)。为了弥合这一断层,侠客工坊提出了一种基于“真机 AI 员工”的解决方案。它的核心理念是将真实的智能手机作为边缘物理节点,由云端的 LLM 担任“大脑”,将自然语言指令转化为移动端的精准操作。以下我们将从三大典型业务场景入手,拆解其背后的关键技术实现。 场景一:非标业务流程的自动编排与流转业务痛点: 某销售团队需要定期在多个移动端 CRM 和即时通讯软件之间同步客户状态。这些软件通常没有开放的 API 接口。如果使用传统的固定脚本,一旦 App 版本更新或出现“评价弹窗”,整个流程就会中断,维护成本极高。技术解法:大模型意图解析与动态 DAG 规划 真机 AI 员工不再依赖“写死的流程”,而是基于目标驱动(Goal-Oriented)。指令接收与理解: 业务人员下发自然语言指令(如“将今天微信里询问过 SaaS 报价的客户同步到飞书表格”)。系统在云端调用 LLM 进行意图识别。动态任务拆解(Function Calling): 模型将宏大目标拆解为执行图。与传统固定脚本不同,这是一个动态生成的有向无环图(DAG)。自修复与异常处理(Self-Correction): 当 AI 员工在执行“打开联系人”步骤时,如果遇到意外弹窗,云端大脑会根据回传的屏幕实时上下文,动态生成一个“点击关闭按钮”的临时子任务,然后再回归主线任务。这种基于 Agent 的自愈能力,是新一代自动化的核心技术壁垒。场景二:跨应用的视觉语义提取与沉淀业务痛点: 在进行全网内容分发(如短视频矩阵运营)或竞品数据调研时,需要从海量的移动端页面中提取关键信息。由于前端页面结构复杂(甚至采用 Flutter 等自绘引擎),传统的基于 DOM 树或 XML 的元素提取方式往往抓取不到有效数据。技术解法:多模态感知与 UI 语义化解析 AI 员工必须拥有一双能“看懂”屏幕的眼睛,实现所见即所得。从结构解析到视觉识别: 摒弃对底层应用代码结构的强依赖。系统引入视觉大模型(VLM)和轻量级的端侧目标检测算法。屏幕元素的语义映射: 当应用界面传回云端后,算法会识别屏幕上的文字(OCR)、图标边界(Bounding Box),并将其映射为具有业务语义的结构化数据(例如将某个特定的红包图标识别为“促销入口”),而不是单纯的“坐标 x,y”。上下文记忆: AI 员工在浏览过程中,会将提取到的关键信息存储在云端的向量数据库中,形成该任务的短期记忆,方便在后续跨 App 录入时进行调用和比对。场景三:海量移动节点的云边协同与安全执行业务痛点: 当企业需要部署数十乃至数百个“数字员工”来并发处理全渠道营销任务时,如何保障操作的稳定、低延迟,并且符合企业级安全与审计规范?技术解法:无侵入式高并发调度架构 这是一个典型的云边协同计算场景,需要解决指令的高效下发与状态的实时同步。高密度设备矩阵编排: 云端部署集中式的调度中枢,通过轻量级的 RPC 协议与边缘的实体手机节点保持长连接。每个真机节点被抽象为一个计算资源,系统根据任务的优先级和设备的空闲状态进行动态负载均衡。极低延迟的推流与监管: 为了方便业务人员随时接管或审计 AI 员工的工作,底层采用基于硬件编码的视频流实时传输技术。能够在极低带宽消耗下,将真机画面以毫秒级延迟推送到 Web 端控制台。无侵入的仿生执行引擎: 在指令转化为物理操作的最后一步,系统采用底层的标准事件模拟技术。这种无侵入式的设计,不仅避免了对操作系统核心文件的修改,保障了企业资产的合规与安全,同时通过对滑动轨迹、点击频率的仿生学优化,极大提升了业务执行的稳定性和应用的兼容性。总结“真机 AI 员工”代表了移动端业务自动化的一个重要演进方向:从基于规则的执行,走向基于理解的协同。通过结合云端大模型的认知能力与边缘设备的物理执行力,企业可以低成本、高灵活度地打通那些过去被称为“数据孤岛”的移动端业务场景。未来,随着端云协同架构的进一步成熟,这类数字员工将成为企业 SaaS 生态中不可或缺的超级生产力节点。
-
突然之间不知道为什么所有的扩展都被禁用了,并且无法启用。谁知道这是为什么吗?
yd_283784140
发表于2026-03-12 11:02:35
2026-03-12 11:02:35
最后回复
CodeArts小助手-蚂蚁
2026-03-23 14:39:20
71 5 -
用的codearts IDE,用户指南说单元测试要用UT智能体但是ide没有这一项挠头
yd_249470508
发表于2026-03-07 22:26:08
2026-03-07 22:26:08
最后回复
CodeArts代码智能体
2026-03-07 23:24:21
172 1
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签