<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Estars的博客</title><description>这条路要走完，才能看到世界的终点，是海纳百川，还是星火燎原。</description><link>https://estars-blog.pages.dev/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.11.0</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>June 12, 2026 at 08:59:16 AM</lastBuildDate><item><title>AI 应用开发实习简历</title><link>https://estars-blog.pages.dev/posts/%E7%AE%80%E5%8E%86%E5%BA%93-%E5%BC%A0%E8%95%8A_%E7%AE%80%E5%8E%86_v6_%E5%86%85%E5%AE%B9%E4%BC%98%E5%8C%96%E7%89%88/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E7%AE%80%E5%8E%86%E5%BA%93-%E5%BC%A0%E8%95%8A_%E7%AE%80%E5%8E%86_v6_%E5%86%85%E5%AE%B9%E4%BC%98%E5%8C%96%E7%89%88/</guid><description>2027 届电子与信息工程硕士，聚焦大模型应用与 AI Agent 开发方向。</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>This article is encrypted. Please visit the website to view it.</content:encoded></item><item><title>AI时代的一些思考与焦虑 - LINUX DO</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-ai%E6%97%B6%E4%BB%A3%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83%E4%B8%8E%E7%84%A6%E8%99%91-linuxdo/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-ai%E6%97%B6%E4%BB%A3%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83%E4%B8%8E%E7%84%A6%E8%99%91-linuxdo/</guid><description>**来源**: https://linux.do/t/topic/2281500/7 **版块**: 搞七捻三 | **标签**: 纯水、快问快答、人工智能</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI时代的一些思考与焦虑 - LINUX DO&lt;a href=&quot;#ai时代的一些思考与焦虑---linux-do&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源&lt;/strong&gt;: &lt;a href=&quot;https://linux.do/t/topic/2281500/7&quot; target=&quot;_blank&quot;&gt;https://linux.do/t/topic/2281500/7&lt;/a&gt;
&lt;strong&gt;版块&lt;/strong&gt;: 搞七捻三 | &lt;strong&gt;标签&lt;/strong&gt;: 纯水、快问快答、人工智能
&lt;strong&gt;统计&lt;/strong&gt;: 422 浏览量 · 91 赞 · 11 用户 · 15 条回复
&lt;strong&gt;爬取时间&lt;/strong&gt;: 2026-06-01 12:39&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;📌 楼主原帖 — Wuuuuu（10小时前）&lt;a href=&quot;#-楼主原帖--wuuuuu10小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI现在如此发达，很多以前需要一整个团队甚至整个公司才能验证实现的idea，现在个人开发者都触手可及。并且御三家模型和国产模型，成本上差距还是很大的，有时候想用本地的Vibe Coding来验证实现一些自己的想法，却发现做出来的产品只是非常简陋的demo，完成度非常的低。所以本人对20刚出头这个年纪，应该把时间或者精力重心放在哪里非常迷茫，希望佬们可以指导一下。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 12&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;💬 回复列表&lt;a href=&quot;#-回复列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;hr /&gt;&lt;section&gt;&lt;h3&gt;1. Histone / 默子（一元复始）· 10小时前&lt;a href=&quot;#1-histone--默子一元复始-10小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;怎么说呢，默子觉得虽然这些 idea 很好验证，但实际很多时候，难点并不在于把东西做出来，而是做出来之后的阶段可能更难。&lt;/p&gt;&lt;p&gt;对于 AI 的使用建议，我觉得现在就是要大量地使用，以此来投资自己，投资使用 AI 的方式。&lt;/p&gt;&lt;p&gt;虽然说”烧 token”是个很抽象的事情，但是随着 token 越烧越多，默子觉得还是会对不同的前沿模型更加了解：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;熟悉它们的风格&lt;/li&gt;
&lt;li&gt;搞清楚它们的底层原理&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我觉得这些（方向）对于现在来说，无论是编程还是日后的发展，都要重要很多。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 5&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Wuuuuu（回复 Histone）· 10小时前&lt;a href=&quot;#2-wuuuuu回复-histone-10小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;哇，非常感谢默老师这么认真的回答。确实难点更多的是在完整的闭环和后续的迭代优化。然后对于要多烧token，非常非常非常认同。&lt;/p&gt;&lt;p&gt;我本身是嵌入式工程师，软硬件都有做，接触编程已经快五年时间了。从最开始只会在web网页和AI对话，然后cv带IDE里，到现在基本上都是自然语言编程。工作流的迭代也给我带来了很多思考和想法。我觉得更多的是当有很好的机会来临的时候，日常的这些思考和积累，在那时候可以拿得出手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 1&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. chancat（浴火重生）· 10小时前&lt;a href=&quot;#3-chancat浴火重生-10小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有这证在手，还会焦虑？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 13&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. sakuraidc · 10小时前&lt;a href=&quot;#4-sakuraidc--10小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;（无具体文字内容）&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. lessmanWith · 9小时前 ⭐深度回复&lt;a href=&quot;#5-lessmanwith--9小时前-深度回复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;鄙人不才，有过几段创业经历，也是深度vibe coding爱好者，佬友的问题我也思考过。以下跟您分享一下，提供一点思路：&lt;/p&gt;&lt;section&gt;&lt;h4&gt;从技术角度讲&lt;a href=&quot;#从技术角度讲&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;AI 让写代码变快了，但并没有让软件工程变简单。&lt;/p&gt;&lt;p&gt;一个产品从想法到真正变成可靠的软件，需要考虑的问题非常多：边界条件、错误处理、并发、资源释放、性能退化、日志、可观测性、兼容性、测试、回滚、部署、长期维护、后续扩展……这些东西 AI 可以写，能力越强的模型写得越好，但它很难代替工程师承担系统设计和工程判断。&lt;/p&gt;&lt;p&gt;您现在的思维，还是技术性思维，而技术永远是服务于产品，产品永远是服务于需求的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;系统化工程能力很重要&lt;a href=&quot;#系统化工程能力很重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;AI 能够快速生成原型，但我们还需要判断：这个架构是不是能扩展？这个模块边界是不是清晰？这个数据结构以后会不会变成负担？这个异常场景有没有兜底，有没有设计冗余？这个功能上线之后出了问题了我怎么定位？&lt;/p&gt;&lt;p&gt;AI时代在技术方向上的积累，最值得花时间的是去培养”把一个东西做完整”的能力。您可以先要求自己做一个小产品，尝试在demo之外，做到：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;能配置、能部署、能升级&lt;/li&gt;
&lt;li&gt;有日志、有错误提示、有测试&lt;/li&gt;
&lt;li&gt;数据不乱丢&lt;/li&gt;
&lt;li&gt;接口有基本设计&lt;/li&gt;
&lt;li&gt;文档能让别人看懂&lt;/li&gt;
&lt;li&gt;出了问题自己知道怎么排查&lt;/li&gt;
&lt;li&gt;下次想加功能，不需要推倒重来&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;技术本身并不是终点&lt;a href=&quot;#技术本身并不是终点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我学生时代曾经深深陷入一个误区：觉得只要技术足够强，产品自然会有人用。但现实往往不是这样。&lt;/p&gt;&lt;p&gt;产品唯一的目的，是满足人的需求。能满足越多人的需求，这个产品才越有价值，越有发展空间。&lt;/p&gt;&lt;p&gt;当 AI 让一个人也能做出以前团队才能做的东西时，真正拉开差距的，反而会变成：您能不能发现真实需求。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;即使满足了需求，也还有落地问题&lt;a href=&quot;#即使满足了需求也还有落地问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;一个产品能做出来，不代表它能活下来。真正落地会涉及到很多非技术问题：合规、隐私、数据安全、支付、客服、运营、推广、用户反馈、版本迭代、社区维护、成本控制。&lt;/p&gt;&lt;p&gt;比如推广，很多人往往发个链接、发篇博客就结束了，然后被动等待自己的产品突然得到曝光，这是不现实的。我们必须要知道目标用户在哪里，他们信任什么渠道。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;给您的建议&lt;a href=&quot;#给您的建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;不要只把自己定位成写代码的人，而是尽早训练自己成为能完成闭环的人。这个闭环包括：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;发现问题，判断需求&lt;/li&gt;
&lt;li&gt;设计方案，快速验证&lt;/li&gt;
&lt;li&gt;借助 AI 提高开发效率&lt;/li&gt;
&lt;li&gt;用工程能力把东西做稳&lt;/li&gt;
&lt;li&gt;上线给真实用户使用&lt;/li&gt;
&lt;li&gt;收集反馈，持续迭代&lt;/li&gt;
&lt;li&gt;考虑合规、运营、成本和增长&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;技术当然还要学，而且要认真学。但技术不要孤立地学，要有工程性思维做支撑，要尽可能找机会走过一个完整的产品闭环。&lt;/p&gt;&lt;p&gt;首先安心学好自己所在的细分领域的专业知识，同时大量使用AI，去尝试、去学习和完善自己使用AI的方式。如果可能，尝试借助AI去独立实现一个软件产品，多踩踩坑，完善一下自己的软件工程思维和能力。之后加入一个有实力的平台，这样您才能取得系统性的进步。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 44&lt;/strong&gt; · &lt;em&gt;回复：完善到可以单开一篇的感觉、学到了、受益匪浅、完全可以开一篇帖子来介绍了、深刻阅读了感谢佬的分享、深刻收藏了、有共鸣有深度、受教了&lt;/em&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. Steve0328 · 8小时前&lt;a href=&quot;#6-steve0328--8小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;个人的一些小看法&lt;a href=&quot;#个人的一些小看法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我目前通过ai制作一些扩展/插件mod(web)，面向海外用户卖订阅。一个月除去ClaudeMax和codexPro的订阅费，净到手六百多刀。好在几乎不需要什么时间工作，每天1-2小时（想休息甚至可以不干）维护就好了。&lt;/p&gt;&lt;p&gt;我是0基础接触ai coding，完全的vibe编码。去年年底从cline开始，到反重力，再到目前的codex和Claude code。给我的感觉是ai越来越强大，学习的门槛也越来越低。&lt;/p&gt;&lt;p&gt;这让我逐渐形成了一个判断——在 AI 时代，“做出产品”的能力将不再像过去那样稀缺；&lt;strong&gt;真正稀缺的，是知道该做什么产品。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用户交互怎么设计、功能如何取舍、痛点在哪里——这些才是核心。创意，发现问题的能力，是最重要的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AI是每个人的沃兹尼亚克，能把你脑子里的东西变成现实。但不是每个人都是乔布斯。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我的方法论其实很朴素：找人聊聊，看看他们在为什么烦恼，然后想怎么解决它。最后打开 Codex、Claude——验证成本几乎为零，最多花一点 token 费用就能初步判断一个方向有没有搞头。&lt;/p&gt;&lt;p&gt;有想法，打开Claude，喝杯咖啡跟它聊聊，做个MVP试试。多试几次你就能得到想要的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 13&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. za30312 / 清清清清 · 4小时前&lt;a href=&quot;#7-za30312--清清清清--4小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;赞同上面几位大佬说的对于软件工程能力的提高。我也提一提我的看法：如果你觉得说的东西可能你都知道，但还是有些虚，可以找几个目标进行相关方面能力的提高——那就是考&lt;strong&gt;软考高级-系统架构师或者分析师&lt;/strong&gt;。通过后我个人认为也是对你软件工程能力的证明。当然如果你有自己更明确的方向和目标就去执行就好。考这个，我是给一些迷茫或者焦虑的人一个建议，找一个好的目标。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 1&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8. Wuuuuu（回复 lessmanWith）· 3小时前&lt;a href=&quot;#8-wuuuuu回复-lessmanwith-3小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;非常感谢佬！确实刚从学校出来，很多时候还停留在”唯技术论”的思维当中。自身也确实有想过转型当产品经理，但碍于现有工作公司规模等属性及技术研发岗位的问题，比较难接触到一个完整的周期短的开发流程，所以对产品闭环能力的重视和锻炼不是太足够。&lt;/p&gt;&lt;p&gt;对于我来说，我觉得能够实操的改变是：虽然idea很多，但是不再想到啥就脑子一热开干，而是斟酌之后筛选出”好的机会”，然后把他耐心磨成产品。&lt;/p&gt;&lt;p&gt;但这又诱发出一个新的顾虑：前文提到楼主非计算机科班出身，对前后端技术知识的熟悉程度大概率是没有科班高的。若在产品打磨的过程中有同样定位的”竞品”比我提早出现，我往往会因此受挫。受挫的本质原因不是他比我做得快，而是从一开始觉得非常好的想法/需求，别人其实也是可以很快速的发现这个需求，最重要的是实现出来的速度比我快很多，那这就陷入了一个恶心循环。会增加下一次项目启动时候的成本，会顾虑会不会和之前一样，我这个想法实行到一半的时候，别人已经做完了，那就继续做下去就没什么意义了，因为没有先发优势了。&lt;/p&gt;&lt;p&gt;如果佬可以针对这个问题解答一下，那将万分感谢！！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 1&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9. Wuuuuu（回复 za30312）· 3小时前&lt;a href=&quot;#9-wuuuuu回复-za30312-3小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;佬也在杭州吗哈哈，高软确实是今年的一个目标。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10. IsaacLiu · 3小时前&lt;a href=&quot;#10-isaacliu--3小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我不是做嵌入式开发的，但是在 AI 的帮助下，做了相关的内容，几乎没有写一行代码。现阶段编程工作，语言和领域的门槛降低了，但是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;判断能力&lt;/strong&gt;：问题的 root cause、solution 的抉择、AI 开发方向的指导&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地能力&lt;/strong&gt;：有人买单（不一定是支付，是真要用）做出来的东西如何实际解决问题且不断优化&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更重要了，跨越了途径而更看重问题本质了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11. cbq / 黑山老妖 · 3小时前&lt;a href=&quot;#11-cbq--黑山老妖--3小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是一个很好的话题，估计现在很多人都有这种焦虑的状态，望更多的佬留下多一些思考和建议，大家共同进步。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;12. Night_Charm（文化宣导员）· 2小时前&lt;a href=&quot;#12-night_charm文化宣导员-2小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;额，怎么说呢，软件开发的门槛被AI踹烂了，但是软件的商业化成本被拉高了。更多的是你的idea 可能实现难度会大幅下降。&lt;/p&gt;&lt;p&gt;举个例子，如果你想搭建一个工具，之前需要画原型、分析功能、分析实现所需要的技术，看这些技术是否会，如果不会需要自己学习。现在不需要了，在不考虑维护的情况下，你跟AI聊一下午就烧的出来这个工具的基础功能。&lt;/p&gt;&lt;p&gt;对应的商业化门槛被无限拉高，也就是会遇到一个谬论：如果AI开发这么简单，那谁还付费购买？自己vb不好么？&lt;/p&gt;&lt;p&gt;以及引出的另一个问题：AI跑出来的 MVP产品，并不是可商业化的产品。后续持续维护的成本会被拉高。毕竟整体使用AI跑出来的话，你对项目的掌控力约等于0，任何的修复都需要依托AI实现，这样的成本又被拉高了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;赞: 1&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;13. zhedream（种子用户）· 1小时前&lt;a href=&quot;#13-zhedream种子用户-1小时前&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;乍一看，以为要开发 IDEA 编辑器，多看下才反应过来。&lt;/p&gt;&lt;p&gt;焦虑是正常的，但不要焦虑，需要内卷。一句话：学习就完了，卷起来，要有专业深度。大家都能用 AI 干活，但一定是专业的人会更专业。&lt;/p&gt;&lt;p&gt;就像：大家都能拍高清的照，这不是有手就行？一个按钮的事情，有什么门槛么？但是为什么女朋友不喜欢。图片、视频都能AI了？但我连光影、布局、分镜基础都不懂，我凭什么比那些专业做的好。&lt;/p&gt;&lt;p&gt;就像学历贬值，是学历不重要了吗？no，恰恰相反，学历更重要了。学历贬值只是利好老板，技术贬值利好老板，AI提效也是利好老板。&lt;/p&gt;&lt;p&gt;AI让入门变得简单了，但入行可能已经是地狱级别的。同样薪资情况下，老板只会要高学历、会古法编程、懂源码、有更多工作经验的。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14. lessmanWith（回复 Wuuuuu）· 5分钟前 ⭐深度回复&lt;a href=&quot;#14-lessmanwith回复-wuuuuu-5分钟前-深度回复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;佬友客气了，这个顾虑非常真实，但这在软件市场其实是十分常见的现象。&lt;/p&gt;&lt;p&gt;我也特别能体会到您提到的”挫败感”，其实不妨换个角度想：一个想法在您做的过程中被别人做出来，这反而说明这个需求是真实存在的。但真正有价值的往往不是 idea 本身，而是对这个需求的理解深度、执行路径、用户触达方式，以及持续迭代能力。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;明确自己的竞争点&lt;a href=&quot;#明确自己的竞争点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;竞品的出现其实是市场反馈的一部分。在放弃之前，不妨思考：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这个竞品解决的是不是和我完全一样的问题？&lt;/li&gt;
&lt;li&gt;它服务的客户群体与我的客户群体有多大的重合？&lt;/li&gt;
&lt;li&gt;它的使用场景是不是和我的产品高度覆盖？&lt;/li&gt;
&lt;li&gt;它有没有明显做得不顺手、不深入、不接地气的地方？&lt;/li&gt;
&lt;li&gt;如果我是用户，我会在什么情况下换成我的产品？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;“功能相似”不是判断竞品关系的强指标，“用户和场景是否相同”才是更值得纳入考量的项。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;关于先发优势&lt;a href=&quot;#关于先发优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;先发优势当然有价值，但很多时候我们会高估它。先发不等于赢家。很多早出来的产品只是先验证了方向，后面真正赢的，往往是更懂用户、更会迭代、更能稳定交付、更会触达市场的人。&lt;/p&gt;&lt;p&gt;先发优势通常只在几种情况下特别强：网络效应很明显、用户迁移成本很高、数据积累形成壁垒、渠道被提前占住、品牌心智已建立。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;更现实的目标：先服务好一小撮具体的人&lt;a href=&quot;#更现实的目标先服务好一小撮具体的人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;比起去做一个”通用 AI 笔记工具”这样的大目标，先去做一个”给某类研究生整理论文阅读记录的 AI 笔记工具”。范围缩小以后，竞争压力自然会下降。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;小成本验证&lt;a href=&quot;#小成本验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;别让一个 idea 一上来就变成一个三个月的大工程。先把它拆成一个一两周内能验证的最小版本。这样您就不会陷入那种”我做到一半，别人做完了，所以我完了”的恶性循环。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;建立健康的项目判断方式&lt;a href=&quot;#建立健康的项目判断方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;不要把”没人做过”当成好机会的标准&lt;/li&gt;
&lt;li&gt;不要把”别人比我快”当成自己失败的证明&lt;/li&gt;
&lt;li&gt;不要把项目的意义完全建立在先发优势上&lt;/li&gt;
&lt;li&gt;要学会小成本验证，而不是大成本豪赌&lt;/li&gt;
&lt;li&gt;要有意识地积累自己的”根据地”&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;关于非科班出身&lt;a href=&quot;#关于非科班出身&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;科班与否决定的是技术起点，不是完整产品能力的起点。随着AI技术的发展，未来很多机会是那些能把需求、技术、交付、反馈串起来的人拿到。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;心态建议&lt;a href=&quot;#心态建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;20刚出头的时候，看到别人做得快、做得好，很容易焦虑。但长期来看，一个人真正的竞争力并不在于”这一次有没有抢在别人前面”，而是几年下来形成的稳定能力结构。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;没必要追求去做第一个发现需求的人，而是努力成为更懂这个需求、更能交付解决方案、更能持续迭代的人。&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;核心金句&lt;/strong&gt;：不要把”没人做过”当成好机会的标准。没人做过，有可能是机会，也有可能是没人需要。有人做过，有可能是红海，也有可能是市场被验证了。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;赞: 1&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;文档由小万自动整理爬取 · 来源: LINUX DO 社区 · 仅供个人参考&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>AI 烧 token 点网页的时代，要被这个 23k star 项目终结了</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-ai%E7%83%A7token%E7%82%B9%E7%BD%91%E9%A1%B5%E7%9A%84%E6%97%B6%E4%BB%A3%E8%A6%81%E8%A2%AB23kstar%E9%A1%B9%E7%9B%AE%E7%BB%88%E7%BB%93%E4%BA%86-opencli/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-ai%E7%83%A7token%E7%82%B9%E7%BD%91%E9%A1%B5%E7%9A%84%E6%97%B6%E4%BB%A3%E8%A6%81%E8%A2%AB23kstar%E9%A1%B9%E7%9B%AE%E7%BB%88%E7%BB%93%E4%BA%86-opencli/</guid><description>**来源：** 微信公众号「AgentFlow」 **作者：** AgentFlow</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI 烧 token 点网页的时代，要被这个 23k star 项目终结了&lt;a href=&quot;#ai-烧-token-点网页的时代要被这个-23k-star-项目终结了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; 微信公众号「AgentFlow」
&lt;strong&gt;作者：&lt;/strong&gt; AgentFlow
&lt;strong&gt;发布时间：&lt;/strong&gt; 2026年6月11日 10:04（新加坡）
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzIwMzc3Njc3Mg==&amp;amp;mid=2247484541&amp;amp;idx=1&amp;amp;sn=e34fbd3cced54ad6ee24e9bf28cccee8&quot; target=&quot;_blank&quot;&gt;mp.weixin.qq.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;一个叫 &lt;strong&gt;OpenCLI&lt;/strong&gt; 的开源项目，&lt;strong&gt;23.5k star&lt;/strong&gt;，核心逻辑只有一句话：把任何网站固化成一条 CLI 命令，之后免费跑一万次。&lt;/p&gt;&lt;p&gt;它不是另一个 Playwright 封装，也不是又一个 MCP 工具。它是一种不同的思路。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;AI 点网页，到底贵在哪&lt;a href=&quot;#ai-点网页到底贵在哪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI agent 操作浏览器，大致经历了三代：&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;代际&lt;/th&gt;&lt;th&gt;方案&lt;/th&gt;&lt;th&gt;特点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;第一代&lt;/td&gt;&lt;td&gt;Selenium/Playwright 脚本&lt;/td&gt;&lt;td&gt;确定性强，但每个网站都要手写，维护成本高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二代&lt;/td&gt;&lt;td&gt;LLM 驱动（browser-use、Playwright MCP）&lt;/td&gt;&lt;td&gt;通用性好，但慢、贵、不稳定&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;成本对比（第三方测试数据）：&lt;/strong&gt;&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路线&lt;/th&gt;&lt;th&gt;Token 消耗&lt;/th&gt;&lt;th&gt;响应时间&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Playwright MCP&lt;/td&gt;&lt;td&gt;≈ 11.4 万 token&lt;/td&gt;&lt;td&gt;10-60 秒&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenCLI（CLI 路线）&lt;/td&gt;&lt;td&gt;≈ 2.7 万 token&lt;/td&gt;&lt;td&gt;数秒&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;更根本的问题是：LLM 驱动方案每次执行都要**「重新理解」**页面——就像雇了个实习生，每次都得现学现卖，没有 SOP。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;OpenCLI 的核心逻辑：智能前置，执行免费&lt;a href=&quot;#opencli-的核心逻辑智能前置执行免费&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;作者 &lt;strong&gt;jackwener&lt;/strong&gt;（Apache Arrow / DataFusion PMC 成员）把数据库的一个基本思想搬了进来：&lt;strong&gt;查询计划编译一次，执行多次&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;对应到 Web 自动化就是：用 AI 探索一次目标网站，把操作逻辑固化成确定性的适配器，之后每次执行都是纯 JS 跑 DOM，&lt;strong&gt;零 LLM 参与&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;「编译时智能 vs 运行时智能」&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;100 次任务：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LLM 驱动方案 → 调 100 次大模型&lt;/li&gt;
&lt;li&gt;OpenCLI 路线 → 生成适配器时调 &lt;strong&gt;1 次&lt;/strong&gt;，之后 99 次零成本执行&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个适配器本质是一个 &lt;strong&gt;TypeScript 模块&lt;/strong&gt;，内含确定性的 CSS 选择器和页面交互逻辑：&lt;strong&gt;导航 → 提取 → 返回结构化 JSON&lt;/strong&gt;。没有 LLM 随机性，跑一万次结果一致。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;登录态问题，它怎么解&lt;a href=&quot;#登录态问题它怎么解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这才是 OpenCLI 真正的差异点，也是国内开发者最该关注的地方。&lt;/p&gt;&lt;p&gt;小红书、知乎、B 站、微博——这些平台的 API 要么没有要么极贵，爬虫又风控严。browser-use 和 Stagehand 需要你手动注入凭证，Playwright 要自己管理 cookie。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenCLI 的答案：直接用你正在用的那个 Chrome。&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;架构&lt;a href=&quot;#架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CLI (Node.js) → 本地 daemon (localhost:19825, WebSocket) → Chrome 扩展 → 页面内执行 JS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;扩展在你已登录会话的页面上下文里执行 JavaScript，&lt;strong&gt;凭证全程不离开浏览器&lt;/strong&gt;，没有任何凭证存储。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;「No competitor can say this.」—— 你的密码从来没离开过你的浏览器，因为它用的就是你的浏览器。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这对国内平台尤其致命：&lt;strong&gt;不用扫码、不用配 token、不触发风控&lt;/strong&gt;，因为从平台的视角看，这就是你本人在用浏览器正常操作。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;安装与使用&lt;a href=&quot;#安装与使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chrome 扩展：&lt;/strong&gt; Chrome Web Store 搜索 OpenCLI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI 端：&lt;/strong&gt; Node.js &amp;gt;= 20&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daemon：&lt;/strong&gt; 首次执行 browser 命令时自动启动，常驻后台&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;现成适配器覆盖 100+ 站点（含大量中文平台）&lt;a href=&quot;#现成适配器覆盖-100-站点含大量中文平台&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;












&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;国内平台&lt;/th&gt;&lt;th&gt;国外平台&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;B站、知乎、小红书、微博、雪球、V2EX、BOSS直聘&lt;/td&gt;&lt;td&gt;Twitter/X、Reddit、HackerNews、YouTube&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;典型体验：&lt;code&gt;opencli twitter search &quot;关键词&quot;&lt;/code&gt;，数秒返回结构化 JSON。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5 种认证策略（适配器自动选用）&lt;a href=&quot;#5-种认证策略适配器自动选用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PUBLIC（无需登录）→ COOKIE → INTERCEPT（拦截API调用）→ UI（模拟操作）→ LOCAL（本地应用）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;用户感知不到这些细节，装好就能跑。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Agent 集成&lt;a href=&quot;#agent-集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;v0.6.0 新增 &lt;code&gt;opencli setup&lt;/code&gt; 交互式 TUI，一键把配置打进 &lt;strong&gt;Claude Code、Gemini CLI、Cursor、Codex&lt;/strong&gt; 等工具。给 Claude Code 装上 &lt;code&gt;opencli-browser skill&lt;/code&gt;，agent 就能直接用你登录中的 Chrome 搜推特、读 Reddit、发小红书，不需要任何 API key。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;局限和边界&lt;a href=&quot;#局限和边界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;适合&lt;/th&gt;&lt;th&gt;不适合&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;高频访问的固定站点&lt;/td&gt;&lt;td&gt;需要随机浏览的陌生页面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;需要定时任务的数据抓取&lt;/td&gt;&lt;td&gt;动态变化的一次性任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent 工作流里的确定性操作&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;通用浏览场景&lt;/strong&gt;，官方建议配合 browser-use/Stagehand 一起用。&lt;/p&gt;&lt;p&gt;还有一个亮点：&lt;strong&gt;7 个桌面应用（Electron）适配器&lt;/strong&gt;，通过 CDP（Chrome DevTools Protocol）驱动 Electron，Obsidian 也能变成 CLI 操作。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;为什么这个范式值得关注&lt;a href=&quot;#为什么这个范式值得关注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;“先用 agent 探索一次，再固化成命令”&lt;/strong&gt;——这个叫 &lt;strong&gt;crystallize&lt;/strong&gt; 的设计哲学，是 OpenCLI 最值得单独拿出来讲的东西。&lt;/p&gt;&lt;p&gt;这不只是一个产品功能，是 agent 工具的一种新范式。过去我们谈 AI agent，默认是「每次执行都让 AI 现场决策」。OpenCLI 在说：&lt;strong&gt;决策应该发生在设计时，不是运行时。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一旦流程跑通，就该把它变成零成本可重复的命令。&lt;/p&gt;&lt;p&gt;这个思路和当前社区趋势高度契合。2025 年底以来，「MCP 吃 token 太狠，agent 工具向 CLI/Skills 迁移」已经是明显趋势。OpenCLI 踩中了这个时间点，几个月从 15.6k 涨到 23.5k star，增速本身就说明了问题。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Claude Code 深度操作指南：从零到专家，把这个 AI 编程助手真正用起来</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-claude-code-%E6%B7%B1%E5%BA%A6%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%93%E5%AE%B6%E6%8A%8A%E8%BF%99%E4%B8%AA-ai-%E7%BC%96%E7%A8%8B%E5%8A%A9%E6%89%8B%E7%9C%9F%E6%AD%A3%E7%94%A8%E8%B5%B7%E6%9D%A5/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-claude-code-%E6%B7%B1%E5%BA%A6%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%93%E5%AE%B6%E6%8A%8A%E8%BF%99%E4%B8%AA-ai-%E7%BC%96%E7%A8%8B%E5%8A%A9%E6%89%8B%E7%9C%9F%E6%AD%A3%E7%94%A8%E8%B5%B7%E6%9D%A5/</guid><description>来源：架构工具栈 发布时间：2026年6月11日 09:23 广东</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Claude Code 深度操作指南：从零到专家，把这个 AI 编程助手真正用起来&lt;a href=&quot;#claude-code-深度操作指南从零到专家把这个-ai-编程助手真正用起来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：架构工具栈&lt;br /&gt;
发布时间：2026年6月11日 09:23 广东&lt;br /&gt;
原文链接：&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzk0MzUyNTMwNA==&amp;amp;mid=2247498809&amp;amp;idx=1&amp;amp;sn=0636cd2d00942576c6417914adeb70c0&quot; target=&quot;_blank&quot;&gt;https://mp.weixin.qq.com/s?__biz=Mzk0MzUyNTMwNA==&amp;amp;mid=2247498809&amp;amp;idx=1&amp;amp;sn=0636cd2d00942576c6417914adeb70c0&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h2&gt;写在前面&lt;a href=&quot;#写在前面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你可能已经知道 Claude Code 怎么用，但它比你想象的更强大。&lt;/p&gt;&lt;p&gt;这篇会把 Claude Code 的两种交互方式、IDE 集成、模型切换、上下文压缩、撤销恢复、图像理解、深度思考、命令历史管理、CLAUDE.md 记忆、SDK 与 MCP、Git Worktree 并行、GitHub Actions 自动化、以及常见故障排查全部串一遍——读完你应该能把它至少多用出 5 倍。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;两种主要的交互方式&lt;a href=&quot;#两种主要的交互方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 提供两种主要的交互方式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;交互模式&lt;/strong&gt;：运行 &lt;code&gt;claude&lt;/code&gt; 启动 REPL 会话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单次模式&lt;/strong&gt;：使用 &lt;code&gt;claude -p &quot;查询&quot;&lt;/code&gt; 进行快速命令&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;可以参考：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动交互模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 以初始查询启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;解释这个项目&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 运行单个命令并退出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;这个函数做什么？&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 处理管道内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs.txt&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;分析这些错误&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;对于 Claude Code Client 的常用参数和功能，可以访问官方文档：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;CLI 使用和控制 - Anthropic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;IDE 集成：直接在编辑器里看到改动&lt;a href=&quot;#ide-集成直接在编辑器里看到改动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 现在支持 VSCode 与 JetBrains：可以直接在 IDE 中看到 Claude Code 的改动，并在 IDE 中与其交互。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Linux / macOS 用户&lt;a href=&quot;#linux--macos-用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VSCode&lt;/strong&gt;：在 VSCode 的内置终端唤起 Claude Code，插件将被自动安装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JetBrains&lt;/strong&gt;：需要通过 JetBrains 应用市场下载 Claude Code [Beta] 插件&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;可能需要手动指定 IDE 或检查 IDE 连接，通过以下命令测试：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/ide&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;VSCode + WSL 用户&lt;a href=&quot;#vscode--wsl-用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;请提前在 VSCode 插件商店安装 WSL 插件。&lt;/p&gt;&lt;p&gt;更多的用法，可以参考 Claude Code 的官方文档：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;IDE integrations - Anthropic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;模型切换：Sonnet vs Opus&lt;a href=&quot;#模型切换sonnet-vs-opus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 支持 Claude Opus 4.8 与 Claude Sonnet 4.6 灵活切换：&lt;/p&gt;






















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;体验&lt;/th&gt;&lt;th&gt;计费倍率&lt;/th&gt;&lt;th&gt;推荐场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;&lt;td&gt;与 Opus 没有明显差别&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1x（默认）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;日常开发、绝大多数任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Claude Opus 4.8&lt;/td&gt;&lt;td&gt;最强推理&lt;/td&gt;&lt;td&gt;&lt;strong&gt;5x&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;复杂调试、深度规划、长线任务&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;强烈推荐&lt;/strong&gt;使用 Claude Sonnet 4.6——使用体验与 Claude Opus 4.8 没有明显差别，但计费倍率仅为 Opus 的 1/5。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在 Claude Code 中使用此命令切换模型：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;上下文压缩：节省 token&lt;a href=&quot;#上下文压缩节省-token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 通常会有长上下文，建议使用以下斜杠命令来压缩以节省点数。较长的上下文往往需要更多点数。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/compact [您的描述]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;恢复上一步修改&lt;a href=&quot;#恢复上一步修改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 支持使用 &lt;code&gt;Ctrl+Z&lt;/code&gt; 或在 Vim 模式下使用 &lt;code&gt;u&lt;/code&gt; 撤销 Claude Code 的上一步修改。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;恢复以前的对话&lt;a href=&quot;#恢复以前的对话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用以下命令可以恢复上次的对话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这会立即恢复最近的对话，无需任何提示。&lt;/p&gt;&lt;p&gt;如果需要在多个历史对话中选择，可以输入此命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--resume&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这会显示一个交互式对话选择器，显示：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;对话开始时间&lt;/li&gt;
&lt;li&gt;初始提示或对话摘要&lt;/li&gt;
&lt;li&gt;消息数量&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;使用箭头键导航并按 Enter 选择对话，可以用这个方法选择上下文。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;图像信息处理&lt;a href=&quot;#图像信息处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Claude Code 可以处理图像信息，可以使用以下任何方法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;将图像拖放到 Claude Code 窗口中（在 macOS 上）&lt;/li&gt;
&lt;li&gt;复制图像并使用 &lt;code&gt;Ctrl+v&lt;/code&gt; 粘贴到 CLI 中（在 macOS 上）&lt;/li&gt;
&lt;li&gt;提供图像路径：&lt;code&gt;分析这个图像：/path/to/your/image.png&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;可以完全使用自然语言要求它进行工作，如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“这是错误的截图。是什么导致了它？”&lt;/li&gt;
&lt;li&gt;“这个图像显示了什么？”&lt;/li&gt;
&lt;li&gt;“描述这个截图中的 UI 元素。”&lt;/li&gt;
&lt;li&gt;“生成 CSS 以匹配这个设计模型。”&lt;/li&gt;
&lt;li&gt;“什么 HTML 结构可以重新创建这个组件？“&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;深入思考（Deep Thinking）&lt;a href=&quot;#深入思考deep-thinking&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;需要通过自然语言要求它进行深入思考：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“我需要使用 OAuth2 为我们的 API 实现一个新的身份验证系统。深入思考在我们的代码库中实现这一点的最佳方法。”&lt;/li&gt;
&lt;li&gt;“思考这种方法中潜在的安全漏洞。”&lt;/li&gt;
&lt;li&gt;“更深入地思考我们应该处理的边缘情况。”&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 推荐在使用复杂问题的时候使用这一功能，这也会消耗大量的额度点数。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;命令历史管理&lt;a href=&quot;#命令历史管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;历史按工作目录存储&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;/clear&lt;/code&gt; 命令清除&lt;/li&gt;
&lt;li&gt;使用上 / 下箭头导航&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;：反向搜索历史（如果终端支持）&lt;/li&gt;
&lt;li&gt;注意：历史扩展（&lt;code&gt;!&lt;/code&gt;）默认禁用&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;CLAUDE.md：存储项目记忆&lt;a href=&quot;#claudemd存储项目记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以使用以下命令设置一个 CLAUDE.md 文件来存储重要的项目信息、约定和常用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;CLAUDE.md 里建议放这些内容：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;常用命令（构建、测试、lint）以避免重复搜索&lt;/li&gt;
&lt;li&gt;代码风格偏好和命名约定&lt;/li&gt;
&lt;li&gt;特定于项目的重要架构模式&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;CLAUDE.md 记忆可用于与团队共享的指令和个人偏好。&lt;/p&gt;&lt;p&gt;更多关于记忆的设置，可以访问此官方文档了解：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;Claude Code 概述 - Anthropic&lt;/a&gt;。常用用法参考：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;管理 Claude 的记忆 - Anthropic&lt;/a&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;SDK 与 MCP&lt;a href=&quot;#sdk-与-mcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Claude Code Python SDK&lt;a href=&quot;#claude-code-python-sdk&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Claude Code 支持 Python SDK，请参考官方文档：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;Claude Code SDK - Anthropic&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;直接访问 Python SDK GitHub 仓库：&lt;a href=&quot;https://github.com/anthropics/claude-code-sdk-python&quot; target=&quot;_blank&quot;&gt;GitHub - anthropics/claude-code-sdk-python&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;MCP 模型上下文协议&lt;a href=&quot;#mcp-模型上下文协议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://modelcontextprotocol.io&quot; target=&quot;_blank&quot;&gt;模型上下文协议（MCP）&lt;/a&gt; 是一个开放协议，使 LLM 能够访问外部工具和数据源。&lt;/p&gt;&lt;p&gt;这是高级功能，可以访问此文档获取更多配置信息：&lt;a href=&quot;https://modelcontextprotocol.io&quot; target=&quot;_blank&quot;&gt;Introduction - Model Context Protocol&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;Claude Code 不仅支持接入 MCP，同样支持作为 MCP 服务器等各类高级功能，可以访问此文档获得更多信息：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;教程 - Anthropic&lt;/a&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Git 中的高级用法&lt;a href=&quot;#git-中的高级用法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;自然语言操作 Git&lt;a href=&quot;#自然语言操作-git&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Claude Code 支持使用自然语言操作 Git，如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“提交我的更改”&lt;/li&gt;
&lt;li&gt;“创建一个 PR”&lt;/li&gt;
&lt;li&gt;“哪个提交在去年十二月添加了 markdown 测试？”&lt;/li&gt;
&lt;li&gt;“在 main 分支上变基并解决任何合并冲突”&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git Worktree：并行隔离的编码环境&lt;a href=&quot;#git-worktree并行隔离的编码环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果需要同时处理多个任务，并在 Claude Code 实例之间完全隔离代码，可以使用 Git Worktree 功能。&lt;/p&gt;&lt;p&gt;Git 工作树允许从同一存储库中检出多个分支到单独的目录。每个工作树都有自己的工作目录，文件是隔离的，同时共享相同的 Git 历史。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建新工作树：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建带有新分支的工作树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worktree&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;../project-feature-a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;feature-a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或使用现有分支创建工作树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worktree&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;../project-bugfix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bugfix-123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这会创建一个包含存储库单独工作副本的新目录。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在每个工作树中运行 Claude Code：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 导航到您的工作树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;../project-feature-a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 在这个隔离环境中运行 Claude Code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;在另一个终端中：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;../project-bugfix&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;管理工作树：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 列出所有工作树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worktree&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 完成后移除工作树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worktree&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;../project-feature-a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Worktree + Claude Code 的优势&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每个工作树都有自己独立的文件状态，非常适合并行 Claude Code 会话&lt;/li&gt;
&lt;li&gt;在一个工作树中所做的更改不会影响其他工作树，防止 Claude 实例相互干扰&lt;/li&gt;
&lt;li&gt;所有工作树共享相同的 Git 历史和远程连接&lt;/li&gt;
&lt;li&gt;对于长时间运行的任务，可以让 Claude 在一个工作树中工作，同时你在另一个工作树中继续开发&lt;/li&gt;
&lt;li&gt;使用描述性目录名称，以便轻松识别每个工作树的任务&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Worktree 环境初始化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;记得根据项目的设置在每个新工作树中初始化开发环境。根据技术栈，这可能包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;JavaScript 项目：运行依赖安装（&lt;code&gt;npm install&lt;/code&gt;、&lt;code&gt;yarn&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Python 项目：设置虚拟环境或使用包管理器安装&lt;/li&gt;
&lt;li&gt;其他语言：遵循项目的标准设置流程&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;GitHub Actions：@claude 触发自动化&lt;a href=&quot;#github-actionsclaude-触发自动化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;此功能仍是 Beta 版本，可访问此链接获取使用：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropics/claude-code-action&quot; target=&quot;_blank&quot;&gt;GitHub - anthropics/claude-code-action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;Claude Code GitHub Actions - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这是一个适用于 GitHub PR 和 issues 的通用 Claude Code 动作，可以回答问题并实现代码更改。此动作会在评论中监听触发词并根据请求激活 Claude 动作。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Claude Code GitHub Actions 为 GitHub 工作流程带来 AI 驱动的自动化。只需在任何 PR 或 issue 中简单地提及 @claude，Claude 就可以分析代码、创建拉取请求、实现功能和修复错误——所有这些都遵循项目的标准。&lt;br /&gt;
——Anthropic&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;通过以下命令部署 Claude Code GitHub App，此命令将引导你完成设置 GitHub 应用和所需的密钥：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/install-github-app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;安装成功后，可用 &lt;code&gt;@&lt;/code&gt; 命令，如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@claude 根据 issue 描述实现此功能&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@claude 我应该如何为此端点实现用户身份验证？&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;其他自然语言功能&lt;a href=&quot;#其他自然语言功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;识别未文档化的代码&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“在 auth 模块中查找没有适当 JSDoc 注释的函数”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;生成文档&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“为 auth.js 中未文档化的函数添加 JSDoc 注释”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;理解陌生代码&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“支付处理系统做什么？&quot;&lt;br /&gt;
&quot;查找用户权限在哪里被检查&quot;&lt;br /&gt;
&quot;解释缓存层是如何工作的”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;智能编辑代码&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“为注册表单添加输入验证&quot;&lt;br /&gt;
&quot;重构日志记录器以使用新的 API&quot;&lt;br /&gt;
&quot;修复工作队列中的竞态条件”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;测试或编辑代码&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“运行 auth 模块的测试并修复失败&quot;&lt;br /&gt;
&quot;查找并修复安全漏洞&quot;&lt;br /&gt;
&quot;解释为什么这个测试失败了”&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常用斜杠命令、CLI 命令、参数与快捷键&lt;a href=&quot;#常用斜杠命令cli-命令参数与快捷键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;参考：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;交互模式 - Anthropic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;其他高级功能&lt;a href=&quot;#其他高级功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类 Unix 工具&lt;/strong&gt;：Claude Code 可以被用作类 Unix 工具——&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;教程 - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义斜杠指令&lt;/strong&gt;：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;教程 - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$ARGUMENTS 添加命令参数&lt;/strong&gt;：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;教程 - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高级设置&lt;/strong&gt;：可以参考此文档——&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;Claude Code 设置 - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全设置&lt;/strong&gt;：请参考此官方文档——&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;管理权限和安全 - Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常见问题排查&lt;a href=&quot;#常见问题排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 如何存储记忆？&lt;/strong&gt;&lt;br /&gt;
A：Claude Code 将记忆存储在 &lt;code&gt;~/.claude&lt;/code&gt; 中，如果没有特殊要求，请不要删除此目录。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 偶尔回复错误的模型名称，这是为什么？&lt;/strong&gt;&lt;br /&gt;
A：这是因为 Claude Code 在使用简单任务时，不会使用 Claude 4 系列模型。可以了解：&lt;a href=&quot;https://docs.anthropic.com&quot; target=&quot;_blank&quot;&gt;Bedrock、Vertex 和代理 - Anthropic&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 执行的命令行参数错误？&lt;/strong&gt;&lt;br /&gt;
A：此类问题在 WSL 上常见，是 Agent 自身的错误。推荐使用 macOS / Ubuntu，这类环境往往问题较少。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 如何彻底清理？&lt;/strong&gt;&lt;br /&gt;
A：可以执行以下命令清理 Claude Code 的登录信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.claude&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 出现 API Error / Tools Error？&lt;/strong&gt;&lt;br /&gt;
A：这通常是网络问题，请退出后使用 &lt;code&gt;claude -c&lt;/code&gt; 重新执行。如果问题依然存在，请联系售后支持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 在登录使用 OAuth 时验证错误？&lt;/strong&gt;&lt;br /&gt;
A：请确保环境变量中没有配置任何代理再进行登录验证。&lt;br /&gt;
如果问题仍然存在，请无视弹出的浏览器并复制终端中的链接并打开，通过验证码方式验证。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 长时间没有响应？&lt;/strong&gt;&lt;br /&gt;
A：建议按下 &lt;code&gt;Ctrl+C&lt;/code&gt; 并重启 Claude Code，这往往是网络问题。&lt;br /&gt;
如果命令行仍然无响应，建议杀死进程并重新进行会话，这将不会影响工作进度。&lt;br /&gt;
可以通过以下命令恢复上次的会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;若问题仍然出现，请寻求售后支持。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;把上面这些功能串起来看，Claude Code 真正的能力远不止”在终端里写代码”——Worktree 并行 + 多 IDE 集成 + @claude GitHub Actions + 自定义 Skills + MCP，组合起来基本就是把一个 AI 工程师塞进了你的开发流程里。&lt;/p&gt;&lt;p&gt;对国内开发者来说，最大的卡点反而不是怎么用，而是怎么稳定连上 Claude Opus 4.8 这种旗舰模型——官方订阅需要海外信用卡、海外网络、还有时不时被封号的风险。如果想直接跳过这些麻烦，可以看看 Code80，真实订阅账号转 API，换个 endpoint 就能在 Claude Code 里直接跑 Opus 4.8、Sonnet 4.6，体验跟官方完全一致。详情可以到官网了解：&lt;a href=&quot;https://code.ai80.vip&quot; target=&quot;_blank&quot;&gt;code.ai80.vip&lt;/a&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常见问题（FAQ）&lt;a href=&quot;#常见问题faq&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：交互模式和单次模式怎么选？&lt;a href=&quot;#q1交互模式和单次模式怎么选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：长任务、要反复迭代用交互模式（&lt;code&gt;claude&lt;/code&gt; 启动 REPL）；一次性问答、脚本调用、管道处理用单次模式（&lt;code&gt;claude -p &quot;...&quot;&lt;/code&gt;）。比如 &lt;code&gt;cat logs.txt | claude -p &quot;分析这些错误&quot;&lt;/code&gt; 这种就是单次模式的典型用法。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：模型默认是 Sonnet，要不要切到 Opus？&lt;a href=&quot;#q2模型默认是-sonnet要不要切到-opus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：绝大多数情况下不用切——Sonnet 4.6 体验和 Opus 4.8 没有明显差别，但点数只用 1/5。只在复杂调试、深度规划、安全审查、长线研究这类真正吃推理的任务上切到 Opus。&lt;code&gt;/model&lt;/code&gt; 命令随时可以换。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：上下文太长导致点数烧得快怎么办？&lt;a href=&quot;#q3上下文太长导致点数烧得快怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：用 &lt;code&gt;/compact [描述]&lt;/code&gt; 压缩上下文。这个命令会让 Claude 把当前会话的关键信息总结成精简版，然后基于压缩后的上下文继续，能显著降低 token 消耗。长会话建议每跑一段就 compact 一次。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：Git Worktree + Claude Code 到底有什么用？&lt;a href=&quot;#q4git-worktree--claude-code-到底有什么用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：可以同时跑多个 Claude Code 实例处理不同任务，彼此互不干扰。比如一个工作树里让 Claude 跑长时间重构，另一个工作树里你自己继续开发新功能。每个工作树文件状态独立，共享同一份 Git 历史。适合”一边让 AI 干活、一边自己也在写”的并行场景。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q5：CLAUDE.md 和 /init 是什么关系？&lt;a href=&quot;#q5claudemd-和-init-是什么关系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：&lt;code&gt;/init&lt;/code&gt; 是一键生成 CLAUDE.md 的命令——它会扫描你的项目，自动生成一份初始的 CLAUDE.md。生成之后你可以再手动补充：常用命令（build/test/lint）、代码风格、架构模式。CLAUDE.md 每次会话开始时 Claude 都会自动读，相当于给它的”项目入门文档”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q6：怎么用 @claude 在 GitHub PR 里触发 Claude Code？&lt;a href=&quot;#q6怎么用-claude-在-github-pr-里触发-claude-code&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：先在仓库里跑 &lt;code&gt;/install-github-app&lt;/code&gt; 配置 GitHub App 和密钥。装好之后，在任何 PR 或 Issue 评论里 &lt;code&gt;@claude 帮我实现这个功能&lt;/code&gt; 就能触发。它会分析代码、创建 PR、实现功能或修复 bug，按项目规范走。这是个 Beta 功能。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q7：Claude Code 总是 API Error 或长时间无响应？&lt;a href=&quot;#q7claude-code-总是-api-error-或长时间无响应&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：大概率是网络问题。先 &lt;code&gt;Ctrl+C&lt;/code&gt; 中断，用 &lt;code&gt;claude -c&lt;/code&gt; 恢复上次会话。如果还不行就杀进程重启——不会丢工作进度，下次还能 &lt;code&gt;claude -c&lt;/code&gt; 续上。OAuth 登录失败的话，确保环境变量里没配代理，或者直接复制终端里的链接手动打开做验证。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q8：国内开发者怎么稳定用上 Claude Opus 4.8？&lt;a href=&quot;#q8国内开发者怎么稳定用上-claude-opus-48&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A：官方 Claude 订阅需要海外信用卡 + 海外稳定网络环境，且有封号风险。可以走 Code80 这种真实订阅账号转 API 的渠道——按拿到的 Base URL 和 Key 配进 Claude Code 或 CC Switch 就能直接跑 Opus 4.8，体验跟官方一致。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;本文整理自「架构工具栈」微信公众号&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Pi Agent 的自举哲学：一个会自己写代码给自己用的 Agent</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-pi-agent%E7%9A%84%E8%87%AA%E4%B8%BE%E5%93%B2%E5%AD%A6%E4%B8%80%E4%B8%AA%E4%BC%9A%E8%87%AA%E5%B7%B1%E5%86%99%E4%BB%A3%E7%A0%81%E7%BB%99%E8%87%AA%E5%B7%B1%E7%94%A8%E7%9A%84agent/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-pi-agent%E7%9A%84%E8%87%AA%E4%B8%BE%E5%93%B2%E5%AD%A6%E4%B8%80%E4%B8%AA%E4%BC%9A%E8%87%AA%E5%B7%B1%E5%86%99%E4%BB%A3%E7%A0%81%E7%BB%99%E8%87%AA%E5%B7%B1%E7%94%A8%E7%9A%84agent/</guid><description>**来源：** 微信公众号「努力的Jerry Plus」 **作者：** 努力的Jerry Plus</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Pi Agent 的自举哲学：一个会自己写代码给自己用的 Agent&lt;a href=&quot;#pi-agent-的自举哲学一个会自己写代码给自己用的-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; 微信公众号「努力的Jerry Plus」
&lt;strong&gt;作者：&lt;/strong&gt; 努力的Jerry Plus
&lt;strong&gt;发布时间：&lt;/strong&gt; 2026年6月5日 19:55（上海）
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://mp.weixin.qq.com/s/euhLBJAW7_dAHM5Jvr1mbw&quot; target=&quot;_blank&quot;&gt;https://mp.weixin.qq.com/s/euhLBJAW7_dAHM5Jvr1mbw&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;引言&lt;a href=&quot;#引言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2026 年的 Agent 框架市场，用一个字形容就是：&lt;strong&gt;卷&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LangChain 团队在给 LangGraph 加 graph state machine&lt;/li&gt;
&lt;li&gt;CrewAI 在推 multi-agent orchestration&lt;/li&gt;
&lt;li&gt;微软在往 AutoGen 里塞 research agent 和 code executor&lt;/li&gt;
&lt;li&gt;Anthropic 都在给 Claude Code 加 MCP 协议生态&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个团队都在做同一件事——往自己的框架里塞更多功能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;接着 Armin Ronacher 发布了一个只有 4 个工具的 Agent 框架。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这就像所有餐厅都在比谁的菜单更长，突然有人开了一家只卖四道菜的店——而且排队的人还不少。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;候选选手对比&lt;a href=&quot;#候选选手对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;选了 4 个有代表性的对手，加上 Pi：&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;框架&lt;/th&gt;&lt;th&gt;背后&lt;/th&gt;&lt;th&gt;核心范式&lt;/th&gt;&lt;th&gt;一句话定位&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;LangGraph&lt;/td&gt;&lt;td&gt;LangChain Inc（风投支撑）&lt;/td&gt;&lt;td&gt;结构化/图状态机&lt;/td&gt;&lt;td&gt;企业级工作流编排引擎&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CrewAI&lt;/td&gt;&lt;td&gt;Joaquin Campero（独立开发者）&lt;/td&gt;&lt;td&gt;角色扮演/多 Agent&lt;/td&gt;&lt;td&gt;给 Agent 分角色协作&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AutoGen&lt;/td&gt;&lt;td&gt;微软研究院&lt;/td&gt;&lt;td&gt;多 Agent 对话/辩论&lt;/td&gt;&lt;td&gt;让多个 Agent 互相讨论&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Armin Ronacher + 社区&lt;/td&gt;&lt;td&gt;&lt;strong&gt;极简/自举&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4 个工具，Agent 自己扩展&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;没有选 Claude Code / Codex CLI，因为它们是产品而不是框架——虽然在实际使用中它们确实是 Pi 最直接的竞品。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;全维度对比&lt;a href=&quot;#全维度对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;










































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;LangGraph&lt;/th&gt;&lt;th&gt;CrewAI&lt;/th&gt;&lt;th&gt;AutoGen&lt;/th&gt;&lt;th&gt;Pi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;核心哲学&lt;/td&gt;&lt;td&gt;图状态机&lt;/td&gt;&lt;td&gt;角色扮演&lt;/td&gt;&lt;td&gt;多Agent对话&lt;/td&gt;&lt;td&gt;&lt;strong&gt;YAGNI+自举&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具数量&lt;/td&gt;&lt;td&gt;20-50+&lt;/td&gt;&lt;td&gt;10-30&lt;/td&gt;&lt;td&gt;内置协议&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;核心代码量&lt;/td&gt;&lt;td&gt;数万行&lt;/td&gt;&lt;td&gt;数千行&lt;/td&gt;&lt;td&gt;数万行&lt;/td&gt;&lt;td&gt;&lt;strong&gt;~418行&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;扩展方式&lt;/td&gt;&lt;td&gt;写Node/Edge&lt;/td&gt;&lt;td&gt;定义Role&lt;/td&gt;&lt;td&gt;定义Agent类&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Agent自写&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Prompt 长度&lt;/td&gt;&lt;td&gt;很长&lt;/td&gt;&lt;td&gt;中等&lt;/td&gt;&lt;td&gt;长&lt;/td&gt;&lt;td&gt;&lt;strong&gt;极短&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;调试体验&lt;/td&gt;&lt;td&gt;LangSmith&lt;/td&gt;&lt;td&gt;任务日志&lt;/td&gt;&lt;td&gt;对话历史&lt;/td&gt;&lt;td&gt;&lt;strong&gt;树Session&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上手门槛&lt;/td&gt;&lt;td&gt;中&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;td&gt;中&lt;/td&gt;&lt;td&gt;高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;适合场景&lt;/td&gt;&lt;td&gt;企业工作流&lt;/td&gt;&lt;td&gt;多角色任务&lt;/td&gt;&lt;td&gt;研究实验&lt;/td&gt;&lt;td&gt;定制编程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GitHub Stars&lt;/td&gt;&lt;td&gt;~80K&lt;/td&gt;&lt;td&gt;~35K&lt;/td&gt;&lt;td&gt;~45K&lt;/td&gt;&lt;td&gt;(含OpenClaw)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;深度分析&lt;a href=&quot;#深度分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;工具数量的悖论&lt;a href=&quot;#工具数量的悖论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是最直观的差异，也是最容易被误解的。&lt;/p&gt;&lt;p&gt;LangGraph 的工具列表可以轻松超过 50 个——文件操作、数据库、搜索引擎、API 客户端、向量存储、记忆管理、JSON Schema 验证……每个都经过精心设计，有完整的类型标注和错误处理。&lt;/p&gt;&lt;p&gt;CrewAI 少一些，但也在 10-30 个之间，按角色分类。&lt;/p&gt;&lt;p&gt;AutoGen 不太强调”工具”概念，但它内置的 Agent 类型协议和通信机制本质上也是一种预置能力。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pi：4 个。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;数字上的差距看起来大得荒谬。但这里有一个反直觉的事实：工具越多，Agent 的决策空间越大，出错概率越高。&lt;/p&gt;&lt;p&gt;想象一下，你让一个 Agent”帮我修这个 bug”。如果它面前有 50 个工具，它需要先判断该用哪一个。这个判断本身就会消耗 token、消耗时间、而且可能判断错。而如果只有 4 个工具，它的选择范围极小——读代码、改代码、跑测试。几乎不会选错工具。&lt;/p&gt;&lt;p&gt;这不是说少一定好。而是说：&lt;strong&gt;工具数量和能力边界是两回事&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;Pi 用 4 个工具通过自举可以达到的能力边界，理论上和其他框架用 50 个工具达到的边界是一样的。区别在于到达的方式不同——一个是预先铺好的高速公路，一个是自己踩出来的小路。前者快但僵化，后者慢但灵活。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;扩展方式的分水岭&lt;a href=&quot;#扩展方式的分水岭&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;这是所有维度中最重要的一个。因为它决定了框架演化的方向。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;传统框架的扩展 = 开发者写代码。&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你想给 LangGraph 加一个新能力？写一个自定义 Node，注册到图里&lt;/li&gt;
&lt;li&gt;想给 CrewAI 加新角色？定义一个新的 Agent 类，写好 role 和 goal，挂进 crew&lt;/li&gt;
&lt;li&gt;想给 AutoGen 加新的对话协议？继承 BaseChatAgent，实现你的消息处理逻辑&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;这些都需要人类开发者动手。每加一个能力，都是人在写代码。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pi 的扩展 = Agent 写代码。&lt;/strong&gt;
Agent 发现自己缺能力 → 自己写脚本补上 → 后续复用。&lt;strong&gt;全程不需要人参与。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这两种模式的差异，不只是”谁写代码”这么简单。它意味着：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;传统框架的能力上限 = 开发团队的交付速度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi 的能力上限 = LLM 的编码能力 × 迭代次数&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;前者受限于人力。后者随着模型能力的提升自动增长。GPT-5 比 GPT-4 更会写代码？那 Pi 的自举能力就自动变强了。不需要等框架作者发新版。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这可能是未来三五年 Agent 框架领域最重要的分岔路。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;System Prompt 的隐藏成本&lt;a href=&quot;#system-prompt-的隐藏成本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个点很少有人提，但被严重低估了。&lt;/p&gt;&lt;p&gt;System Prompt 的长度直接影响两件事：&lt;strong&gt;token 消耗&lt;/strong&gt;和&lt;strong&gt;注意力稀释&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;每次 Agent 开始一个任务，完整的 system prompt 都会被送入 LLM。如果你的 system prompt 有 5000 字符（这在功能丰富的框架里很常见），那每一个任务的每一次思考循环都要消耗这些 token。一天跑 100 个任务呢？一年呢？&lt;/p&gt;&lt;p&gt;更隐蔽的问题是注意力稀释。LLM 的上下文窗口是有限的。当 system prompt 里塞满了 20 个工具的详细描述、参数说明、使用示例时，LLM 分配给”理解用户真实意图”的注意力资源就会减少。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pi 的 system prompt 是所有编程 Agent 中最短的之一。&lt;/strong&gt; 原因无他——工具只有 4 个，没什么好描述的。省下来的 token 和注意力，全部集中在任务本身。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;调试体验：被严重低估的竞争力&lt;a href=&quot;#调试体验被严重低估的竞争力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用过 Agent 框架的人都知道一个痛苦的事实：当 Agent 出问题时，你很难搞清楚它为什么这么做。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LangGraph 有 LangSmith 可视化平台，能看到图的执行路径——这是目前最好的调试体验之一&lt;/li&gt;
&lt;li&gt;CrewAI 有任务日志，能看到每个角色做了什么&lt;/li&gt;
&lt;li&gt;AutoGen 能看到多轮对话记录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;但这些本质上都是扁平的日志。你看到的是”Agent A 说了 X，Agent B 回了 Y”。你看不到的是：“在那一刻，Agent A 为什么选择说 X 而不是 Z？”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pi 的树形 Session 直接回答了这个问题。&lt;/strong&gt; 每个决策分支都被保留，你可以完整回溯推理链路。配合&lt;strong&gt;热重载&lt;/strong&gt;，你甚至可以在观察到问题后立即修改 Agent 的行为，接着在下一个任务里验证修复效果。&lt;/p&gt;&lt;p&gt;这种”观察→诊断→修改→验证”的闭环速度，是目前其他框架难以企及的。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;谁该用什么？&lt;a href=&quot;#谁该用什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情况&lt;/th&gt;&lt;th&gt;推荐框架&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;企业级复杂工作流&lt;/td&gt;&lt;td&gt;&lt;strong&gt;LangGraph&lt;/strong&gt;（最成熟的编排方案）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多角色协作场景&lt;/td&gt;&lt;td&gt;&lt;strong&gt;CrewAI&lt;/strong&gt;（最低上手门槛）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;学术研究/多 Agent 实验&lt;/td&gt;&lt;td&gt;&lt;strong&gt;AutoGen&lt;/strong&gt;（微软背书 + 灵活协议）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;深度定制编程 Agent&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;（自举 + 树形Session + 热重载）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不想碰框架，只想用产品&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Claude Code / Codex&lt;/strong&gt;（开箱即用的编程 Agent）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;没有万能解。Pi 不是要取代谁。它是在回答一个不同的问题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;说句实话&lt;a href=&quot;#说句实话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;写这个对比的时候，作者一直在提醒自己不要变成 Pi 的推销员。&lt;/p&gt;&lt;p&gt;事实是：Pi 在很多客观指标上都处于劣势。工具少、社区小、文档薄、上手门槛高、不适合非技术用户。如果你需要一个开箱即用的方案去解决具体业务问题，Pi 大概率不是最优选。&lt;/p&gt;&lt;p&gt;但 &lt;strong&gt;Pi 的价值从来不在于”更好用”，而在于提出了一个更好的问题&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;当所有人都在问”我的框架还能加什么功能”的时候，Pi 问的是”我的框架能不能&lt;strong&gt;不加功能也能变强&lt;/strong&gt;”。&lt;/p&gt;&lt;p&gt;这两个问题的答案，指向了两条完全不同的路。目前我们还不知道哪条路通向终点。但我们知道的是：如果所有人都走同一条路，那这条路大概率不是最好的那条。&lt;/p&gt;&lt;p&gt;有人愿意走另一条路。这件事本身就值得写一篇文章。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;📌 Pi Agent 系列&lt;a href=&quot;#-pi-agent-系列&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;第 1 篇：&lt;/strong&gt;「当所有 Agent 框架都在堆功能时，有人只写了 4 个工具」&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;第 2 篇：&lt;/strong&gt;「一个会自己写代码给自己用的 Agent：Pi 的自举哲学」（本文）&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;后续文章&lt;/strong&gt;陆续更新中&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11 | 原文链接：&lt;a href=&quot;https://mp.weixin.qq.com/s/euhLBJAW7_dAHM5Jvr1mbw&quot; target=&quot;_blank&quot;&gt;https://mp.weixin.qq.com/s/euhLBJAW7_dAHM5Jvr1mbw&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>一个面试备考 Skill，根据你的简历和全网真实面经自动生成个性化题目，每题带源链接</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E4%B8%80%E4%B8%AA%E9%9D%A2%E8%AF%95%E5%A4%87%E8%80%83skill-interviewradar/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E4%B8%80%E4%B8%AA%E9%9D%A2%E8%AF%95%E5%A4%87%E8%80%83skill-interviewradar/</guid><description>**来源：** 微信公众号「几乎满级」 **作者：** 几乎满级</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;一个面试备考 Skill，根据你的简历和全网真实面经自动生成个性化题目，每题带源链接&lt;a href=&quot;#一个面试备考-skill根据你的简历和全网真实面经自动生成个性化题目每题带源链接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; 微信公众号「几乎满级」
&lt;strong&gt;作者：&lt;/strong&gt; 几乎满级
&lt;strong&gt;发布时间：&lt;/strong&gt; 2026年6月10日 17:00（江苏）
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzkwODQzNzk1OQ==&amp;amp;mid=2247499087&amp;amp;idx=1&amp;amp;sn=0aaf37e80f621538743664edcf1425ed&quot; target=&quot;_blank&quot;&gt;mp.weixin.qq.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;InterviewRadar（面试雷达）&lt;a href=&quot;#interviewradar面试雷达&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;根据你的简历和全网真实面经，自动生成一份个性化的面试备考包。一个可给 Claude Code 或 Codex 使用的面试准备工作流（Agent Skill）。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;解决的问题&lt;a href=&quot;#解决的问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;市面上静态的&lt;strong&gt;八股文题库命中率低&lt;/strong&gt;（可能不到 10%），面试官真正问的往往是根据你简历动态发散的题目；而牛客、小红书上的真实面经虽然多，但靠自己一篇篇筛，既耗时又很难筛出跟简历相关的那些。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;InterviewRadar 的做法&lt;a href=&quot;#interviewradar-的做法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;同时解决这两个问题——它抓取全网真实面经，再结合你的个人简历，生成一份锚定你具体项目的&lt;strong&gt;个性化中文面试备考包&lt;/strong&gt;。&lt;strong&gt;每一道题都带有原始抓取链接&lt;/strong&gt;，拒绝 AI 凭空捏造。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;工作流程（六步）&lt;a href=&quot;#工作流程六步&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整个流程分六步，由&lt;strong&gt;大模型&lt;/strong&gt;和 &lt;strong&gt;Python 脚本&lt;/strong&gt;各司其职：&lt;/p&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;角色&lt;/th&gt;&lt;th&gt;负责内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;大模型&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;推理——处理领域知识、生成搜索种子词、把题目跟你的简历项目做逻辑锚定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Python 脚本&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;”确定性脏活”——HTML 解析、时效过滤、去重排序，以及抓取失败时的降级处理&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&gt;&lt;h3&gt;具体步骤&lt;a href=&quot;#具体步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：你先给它一份简历和一句模糊的岗位方向，比如”AI 应用开发”。简历格式不限，文字 PDF、图片、扫描件都行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全网搜索&lt;/strong&gt;：通过 WebSearch 在全网发现牛客网、公开博客上的真实面经 URL，按域名分配对应的抓取连接器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时效过滤&lt;/strong&gt;：抓回来的内容默认用 &lt;strong&gt;730 天&lt;/strong&gt;（近两年）的时效硬过滤，再按”频次×时效”的权重排序，淘汰掉过时的考点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目挂靠&lt;/strong&gt;：把筛选出来的高频真题一道一道挂靠到你简历里的具体项目上，生成连环追问链。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：一份 &lt;strong&gt;Markdown 中文备考包&lt;/strong&gt;，每道题都带源链接。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;数据源支持&lt;a href=&quot;#数据源支持&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;平台&lt;/th&gt;&lt;th&gt;支持方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;牛客网&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;默认支持，零配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GitHub 面经仓库&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Markdown 题库，零配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;知乎、CSDN 等博客&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;正文抓取，零配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;小红书&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;需配合 MediaCrawler（反爬严格）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;MediaCrawler 模式&lt;a href=&quot;#mediacrawler-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;fast 模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;只抓标题、正文文本、标签和时间&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;deep 模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;下载图片 + OCR 提取图片中的面经文本（小红书上很多面经是截图）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;项目信息&lt;a href=&quot;#项目信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发者：&lt;/strong&gt; KunChen1110&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源协议：&lt;/strong&gt; MIT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stars：&lt;/strong&gt; 136&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/KunChen1110/InterviewRadar&quot; target=&quot;_blank&quot;&gt;https://github.com/KunChen1110/InterviewRadar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>企业落地 Agent 案例讲解——数据分析领域</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E4%BC%81%E4%B8%9A%E8%90%BD%E5%9C%B0agent%E6%A1%88%E4%BE%8B%E8%AE%B2%E8%A7%A3_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E9%A2%86%E5%9F%9F_2366310-linuxdo/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E4%BC%81%E4%B8%9A%E8%90%BD%E5%9C%B0agent%E6%A1%88%E4%BE%8B%E8%AE%B2%E8%A7%A3_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E9%A2%86%E5%9F%9F_2366310-linuxdo/</guid><description>来源：LINUX DO | 作者：gxt | 2026-06-11 原文：[linux.do/t/topic/2366310](https://linux.do/t/topic/2366310)</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;企业落地 Agent 案例讲解——数据分析领域&lt;a href=&quot;#企业落地-agent-案例讲解数据分析领域&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：LINUX DO | 作者：gxt | 2026-06-11
原文：&lt;a href=&quot;https://linux.do/t/topic/2366310&quot; target=&quot;_blank&quot;&gt;linux.do/t/topic/2366310&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;最近一直开会做其他项目，非常忙，现在抽吃饭时间敲一下。老实说纠结了很久，要不要写这篇文章，害怕大家听不明白，思考了两天，终于知道该怎么给大家讲这个项目。&lt;/p&gt;&lt;p&gt;本来想叫”问数机器人”，想了一下不合适，于是让 AI 想了一下名字，于是就出来了——&lt;strong&gt;智能数据管家 Agent&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;事先说明，这个 Agent 真的非常难，涉及非常多的细节，对技术也有一定的要求，并且目前来看不能商用，找我咨询的那家公司也只是内部数据岗人员小部分使用。我只能尽我所能的用大白话告诉大家一些参考的方向，各家公司有各家公司的情况，主要是分享一下思路。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;业务视角&lt;a href=&quot;#业务视角&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假设现在要做一个问数机器人——用自然语言查询数据的机器人。比如你跟 AI 说”查一下昨天的退款后 GMV 是多少”、“查一下某天的库存”，AI 就会快速给你答案。&lt;/p&gt;&lt;p&gt;但事实上这用 BI 数据看板拖拽也能实现，只是提高了一点效率。&lt;strong&gt;业务本身更想要的是&lt;/strong&gt;：某个指标发生了异常，是什么时候发生的？导致这一情况出现的原因是什么？AI 有没有什么建议能给到我？&lt;/p&gt;&lt;p&gt;比如说：昨天退款后 GMV 突然下滑了一百万，AI 会自动推送给我——“昨天某个产品由于价格上涨的问题，导致 GMV 下滑，AI 建议调整定价策略”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Agent 实现的三大功能&lt;a href=&quot;#agent-实现的三大功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 数据驾驶舱&lt;a href=&quot;#1-数据驾驶舱&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将公司核心的指标都呈现，一眼就能知道当前公司的经营状况。比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;当前库存&lt;/li&gt;
&lt;li&gt;当前卖了多少&lt;/li&gt;
&lt;li&gt;目标完成度是多少&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 问数机器人&lt;a href=&quot;#2-问数机器人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;自然语言输入后，AI 输出数据或者 Excel 表格。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 数据预警&lt;a href=&quot;#3-数据预警&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当某个指标发生重大变化时，直接查找原因，并推送到个人或群聊，并给出相关建议。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;实现思路&lt;a href=&quot;#实现思路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;前提：完善的指标体系&lt;a href=&quot;#前提完善的指标体系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;并不一定要求是全公司的，哪怕是某一个部门、某个小子公司或某个中心都可以。这套方向指向性非常强，一定要结合业务场景去做。&lt;/p&gt;&lt;p&gt;指标体系背后必须有&lt;strong&gt;数仓&lt;/strong&gt;和&lt;strong&gt;主数据系统&lt;/strong&gt;支撑。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第一步：梳理核心指标&lt;a href=&quot;#第一步梳理核心指标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把库存货值、目标完成度、老板关心的指标都丢进去，可以的话加上时间筛选器。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：解决两大难关&lt;a href=&quot;#第二步解决两大难关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;难关一：数据安全&lt;a href=&quot;#难关一数据安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果要把数据库直接丢给 AI，是否安全？做法是：采购企业版（Codex / qoder / trae 等），签订安全协议，保证数据不外泄。大部分公司都是这样处理的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;难关二：AI 幻觉（瞎编数据）&lt;a href=&quot;#难关二ai-幻觉瞎编数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;解决方法：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;大宽表 + 维度表 + 指标清单&lt;/strong&gt;：在数仓里针对销售做一个销售大宽表，再做一个库存大宽表。把维度表和指标清单一起给 AI，做好配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不让 AI 直接写 SQL&lt;/strong&gt;：让 AI 以传参的形式——业务人员问什么指标，AI 就传入什么指标，然后去执行取数操作。从数据源阶段就控制死，AI 只能执行聚合汇总操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出必须带来源&lt;/strong&gt;：AI 每次回答要求输出数据时必须带上——查询了哪个表、哪个字段、什么时间段、过滤条件是什么。这样给数据岗使用，即使有问题他们也看得出来，前期也会大量测试校验。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;自然语言 → 数据语言的转化&lt;a href=&quot;#自然语言--数据语言的转化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;做一个&lt;strong&gt;语义库&lt;/strong&gt;，把自然语言翻译为数据语言。整体流程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AI 接收指令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 结合语义库翻译为专业数据提示词&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 提取确认需要的维度和指标&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 传参执行 SQL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ AI 汇总分析并输出数据与结论&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：数据预警与指标拆解&lt;a href=&quot;#第三步数据预警与指标拆解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一步需要业务部门自行去拆解指标。作者协调了业务部负责人一起干的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;指标拆解示例（运营思路）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;退款后 GMV = 流量（访客数）× 转化率（人群）× 客单价 × 退款率&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;假设退款后 GMV 下滑严重 → 逐一排查各因子&lt;/li&gt;
&lt;li&gt;流量、转化率都没问题 → 检查客单价是否过高，是否被竞品狙击&lt;/li&gt;
&lt;li&gt;客单价、访客数也没问题 → 看投流手投的流量是否符合公司人群&lt;/li&gt;
&lt;li&gt;前面都没问题 → 看退款率是否过高，产品本身出了问题&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;核心原则：&lt;/strong&gt; 最终 AI 输出的结论一定是有迹可循的，结合公司场景定制化输出，不让 AI 自己瞎编。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;价值与展望&lt;a href=&quot;#价值与展望&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个 Agent 目前在公司内稳定运行了一段时间，改变了过去的工作方式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;过去：&lt;/strong&gt; 人被动找数据、找问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;现在：&lt;/strong&gt; 数据找人、问题找人&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从传统的工作方式变为交互式的——AI 给结论，人来不断调试。持续运行下去，对整个业务部门来说价值非常大。&lt;/p&gt;&lt;p&gt;作者的判断：&lt;strong&gt;市面上每一家规模起来的公司，一定会做这个。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;传统数据分析、数据开发的工作岗位，一定会在 AI 的冲击下做出改变。过去数据分析里常说做归因分析，AI 出现后就变成了——AI 告诉你原因，你要去想办法去沟通、去协调、去解决。无法适应这个工作方式的同学，可能还会被替代优化。&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;数据：&lt;/strong&gt; 201 浏览量，20 赞，7 用户回复&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>大型项目使用大模型开发的工作流和方案讨论</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BC%80%E5%8F%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%92%8C%E6%96%B9%E6%A1%88%E8%AE%A8%E8%AE%BA_2375814-linuxdo/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BC%80%E5%8F%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%92%8C%E6%96%B9%E6%A1%88%E8%AE%A8%E8%AE%BA_2375814-linuxdo/</guid><description>来源：[LINUX DO - 开发调优](https://linux.do/t/topic/2375814) 作者：bigleo</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;大型项目使用大模型开发的工作流和方案讨论&lt;a href=&quot;#大型项目使用大模型开发的工作流和方案讨论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：&lt;a href=&quot;https://linux.do/t/topic/2375814&quot; target=&quot;_blank&quot;&gt;LINUX DO - 开发调优&lt;/a&gt;
作者：bigleo
浏览量：278 | 赞：19 | 回复：22页 | 参与用户：10人&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;📝 主楼原文&lt;a href=&quot;#-主楼原文&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;bigleo 提出：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;面对大型项目且模块多而复杂的情况，有没有好的 AI 开发方案？如果只给出需求让大模型自己做计划，它可能压根不会参考项目中已有的模块代码，或者开发及查 bug、Code Review 时大模型需要每次现去读取代码，可能存在读取的代码不准确，或读取代码导致上下文越来越大，后续开发更混乱。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;📋 楼主梳理的问题清单&lt;a href=&quot;#-楼主梳理的问题清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 缺乏项目全局认知&lt;a href=&quot;#1-缺乏项目全局认知&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果只是把需求直接丢给大模型，让它自己拆解和制定开发计划，它往往只能基于需求本身进行推理，很难主动理解项目现有架构、模块边界、设计规范以及历史实现方式。结果就是容易重复造轮子，甚至给出与现有架构冲突的方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 无法充分复用已有代码&lt;a href=&quot;#2-无法充分复用已有代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;项目里明明已经有类似功能或公共模块，但大模型未必能发现。开发出来的新代码可能绕开现有能力，导致逻辑重复、维护成本增加。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 上下文窗口限制&lt;a href=&quot;#3-上下文窗口限制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;开发、排查 Bug、Code Review 时，大模型往往需要临时读取相关代码。随着代码、日志、需求文档不断加入上下文，Token 消耗越来越大，后续可能出现上下文污染、遗忘早期信息、分析结果前后不一致等问题。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 代码理解准确性问题&lt;a href=&quot;#4-代码理解准确性问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;即使使用代码检索（RAG）方案，大模型读取到的代码片段也可能不完整。缺少调用链、依赖关系、运行时信息时，容易做出错误判断。有时候分析 Bug 的结论看起来很合理，但实际上是建立在错误代码理解之上的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 开发过程缺乏持续记忆&lt;a href=&quot;#5-开发过程缺乏持续记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;今天分析了某个模块，明天继续开发时可能又要重新让模型学习一遍。对项目约定、业务规则、架构原则缺少长期记忆和沉淀，导致每次会话都在重复做项目认知工作。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. Code Review 效果不稳定&lt;a href=&quot;#6-code-review-效果不稳定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;AI 能发现一些明显问题，但对于复杂业务逻辑、架构设计缺陷、历史兼容性问题，效果参差不齐，很依赖它是否恰好获取到了足够的上下文。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;💬 精彩回复整理&lt;a href=&quot;#-精彩回复整理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;🏆 acrx10Zz（粪池蝶泳总冠军）— 高赞回复&lt;a href=&quot;#-acrx10zz粪池蝶泳总冠军-高赞回复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;这种开发方式的交互入口是跟 AI 协同讨论的 &lt;strong&gt;RFC 文档&lt;/strong&gt; 和 &lt;strong&gt;Plans 执行计划&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RFC&lt;/strong&gt;：和 AI 交互意见过程中产生的意见稿和决策意向&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADR&lt;/strong&gt;：一些敲定的决策规则会沉淀为架构决策记录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plans&lt;/strong&gt;：具体的实施计划，包含这个迭代需要执行的技术细节和验收清单&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些就是和 AI 沟通中需要反复校对的内容。一旦计划敲定，开 Goal 执行，AI 需要向我提供 &lt;strong&gt;Report 报告和相关证据链&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;总结：&lt;/strong&gt; 输入 = 执行计划 Plans，输出 = AI 提供的包含验收清单和证据链的 Report。只对输入和输出的产物负责，中间执行过程由 AI 全权处理。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏆 noshenxian（神仙）&lt;a href=&quot;#-noshenxian神仙&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;如果是在老的框架上改，让它参考，总是多做一些无用的东西出来。但新项目全 AI 开发的，我个人感受来说只能 AI 去改了，人已经改不动了。其实维护是个问题。&lt;/p&gt;&lt;p&gt;做法类似，效果有一些，但还是会不可控，很容易出现偏差。我的原因还是因为懒，后来我就开始&lt;strong&gt;死磕详细设计&lt;/strong&gt;了。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏆 cheviChan（不二之选）— 逐条心得&lt;a href=&quot;#-chevichan不二之选-逐条心得&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;分享下自己的心得，与各位佬一起学习进步：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺乏项目全局认知 &amp;amp; 无法充分复用已有代码&lt;/strong&gt; — 现在的 Agent 已经能很好解决这两个问题了，提示词限制好就行了，或在 &lt;code&gt;claude.md&lt;/code&gt;、&lt;code&gt;rules&lt;/code&gt;、&lt;code&gt;agent.md&lt;/code&gt; 定好规范。注意不要用太差的模型，在 Cursor、Claude Code、Codex 这些 Agent 上，国内御三家也能基本完成任务。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文窗口限制&lt;/strong&gt; — 还是得先拆分好需求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码理解准确性问题&lt;/strong&gt; — 和 Agent 与模型有关，试过同样的问题被 Minimax 忽悠过，重要分析还是 GPT 比较稳。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;开发过程缺乏持续记忆&lt;/strong&gt; — 也在探索中。目前做法：如果某个工作做得很吃力但最终兜兜转完成了，就让它记下来，它会自己总结到项目文件中去。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code Review 效果不稳定&lt;/strong&gt; — 设计大方向和重要节点还是人工 Review，其他就跑单测和后面交给测试人员了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;到实际开发过程中，感觉都不用省 Token 了，能完成任务就好。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏆 coldwater&lt;a href=&quot;#-coldwater&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;推荐使用：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mindfold-ai/Trellis&quot; target=&quot;_blank&quot;&gt;github.com/mindfold-ai/Trellis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coldwateryi/trellis-skills&quot; target=&quot;_blank&quot;&gt;github.com/coldwateryi/trellis-skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;已经在中小型项目验证过，效果可接受。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏆 bigleo（楼主）&lt;a href=&quot;#-bigleo楼主&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;主要是现去搜索，费时间又占用大量的上下文，还不一定理解得正确，Token 其实是小事。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🔗 相关话题&lt;a href=&quot;#-相关话题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;【避坑征集】想征集大家使用AI编程中遇到的问题&lt;/li&gt;
&lt;li&gt;多个大模型开发感受&lt;/li&gt;
&lt;li&gt;现在大模型这么火，大家都讨论的是对于开发的帮助，各位有碰到AI结合项目管理的么&lt;/li&gt;
&lt;li&gt;关于ai编程的Align问题&lt;/li&gt;
&lt;li&gt;一直在古法编程，请问佬友们现在AI Coding已经到哪个阶段了？&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11 | 原始链接：&lt;a href=&quot;https://linux.do/t/topic/2375814&quot; target=&quot;_blank&quot;&gt;https://linux.do/t/topic/2375814&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>微软开源的一键配置工具：把新装的 Windows 系统自动装好全套开发环境</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E5%BE%AE%E8%BD%AF%E5%BC%80%E6%BA%90%E7%9A%84%E4%B8%80%E9%94%AE%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7%E6%8A%8A%E6%96%B0%E8%A3%85%E7%9A%84windows%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E8%A3%85%E5%A5%BD%E5%85%A8%E5%A5%97%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E5%BE%AE%E8%BD%AF%E5%BC%80%E6%BA%90%E7%9A%84%E4%B8%80%E9%94%AE%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7%E6%8A%8A%E6%96%B0%E8%A3%85%E7%9A%84windows%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E8%A3%85%E5%A5%BD%E5%85%A8%E5%A5%97%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</guid><description>**来源：** 微信公众号（南烛推荐） **发布日期：** 2026年6月</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;微软开源的一键配置工具：把新装的 Windows 系统自动装好全套开发环境&lt;a href=&quot;#微软开源的一键配置工具把新装的-windows-系统自动装好全套开发环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; 微信公众号（南烛推荐）
&lt;strong&gt;发布日期：&lt;/strong&gt; 2026年6月
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://github.com/microsoft/WindowsDeveloperConfig&quot; target=&quot;_blank&quot;&gt;https://github.com/microsoft/WindowsDeveloperConfig&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;概述&lt;a href=&quot;#概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;微软开源的 &lt;strong&gt;WindowsDeveloperConfig&lt;/strong&gt;，一条命令把新电脑配成开发机。旨在帮助开发者通过一条命令自动化配置 Windows 开发环境，将刚装好的纯净 Windows 系统变成开箱即用的开发工作站。所有配置均为&lt;strong&gt;声明式、幂等&lt;/strong&gt;（可安全多次运行），而且经过 CI 测试。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三种配置方案&lt;a href=&quot;#三种配置方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1️⃣ 完整的开发工作站（Windows Dev Config）&lt;a href=&quot;#1️⃣-完整的开发工作站windows-dev-config&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最全的一套，非交互式一键跑完，把全新 Windows 11 变成无干扰开发机。自动安装的包括：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类别&lt;/th&gt;&lt;th&gt;工具&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;终端&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;PowerShell 7、Oh My Posh、Cascadia Mono NF 字体&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;版本控制&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Git、GitHub CLI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;编辑器&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;VS Code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;开发框架&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;.NET SDK 10、Python 3.14 + uv、Node.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;系统增强&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;PowerToys&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;子系统&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;WSL + Ubuntu&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;系统层面优化：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;自动开启深色主题、开发者模式、长路径支持&lt;/li&gt;
&lt;li&gt;文件资源管理器优化&lt;/li&gt;
&lt;li&gt;终端默认配成 PowerShell 7 加 Cascadia Mono NF 字体&lt;/li&gt;
&lt;li&gt;WSL 自动配好并装 Ubuntu（启用 WSL 需要重启，脚本会在重启后通过 RunOnce 任务自动继续跑完剩下的配置，无需手动干预）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2️⃣ WSL 命令行环境（WSL Comfort）&lt;a href=&quot;#2️⃣-wsl-命令行环境wsl-comfort&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;专注打磨命令行体验，支持交互式和非交互式两种跑法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;可自选用 &lt;strong&gt;zsh&lt;/strong&gt; 或 &lt;strong&gt;bash&lt;/strong&gt; 作为默认 Shell&lt;/li&gt;
&lt;li&gt;可选装 &lt;strong&gt;Starship&lt;/strong&gt; 提示符、&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;现代 CLI 替代工具：&lt;strong&gt;fzf&lt;/strong&gt;、&lt;strong&gt;rg&lt;/strong&gt;、&lt;strong&gt;bat&lt;/strong&gt;、&lt;strong&gt;eza&lt;/strong&gt;、&lt;strong&gt;zoxide&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Windows 端会配好带 &lt;strong&gt;Cascadia Code Nerd Font&lt;/strong&gt; 字体的美化版 Windows Terminal 配置文件&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3️⃣ 单语言工作负载&lt;a href=&quot;#3️⃣-单语言工作负载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;目前支持以下语言，每种都有对应的 &lt;code&gt;install.ps1&lt;/code&gt; 脚本，跑完自动刷新当前会话的 PATH：&lt;/p&gt;













&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;TypeScript&lt;/th&gt;&lt;th&gt;PHP&lt;/th&gt;&lt;th&gt;.NET&lt;/th&gt;&lt;th&gt;Go&lt;/th&gt;&lt;th&gt;Java&lt;/th&gt;&lt;th&gt;Rust&lt;/th&gt;&lt;th&gt;Python&lt;/th&gt;&lt;th&gt;WinForms&lt;/th&gt;&lt;th&gt;WinUI 3&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;⚠️ 注意事项&lt;a href=&quot;#️-注意事项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;底层依赖 Windows 的包管理器命令 &lt;strong&gt;winget configure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键坑：&lt;/strong&gt; 在非管理员权限下运行，必须提前装好 &lt;strong&gt;Microsoft Visual C++ Redistributable&lt;/strong&gt; 运行库，否则会报内部错误&lt;/li&gt;
&lt;li&gt;WSL 安装如果在虚拟机里跑，需要确认虚拟化支持（&lt;strong&gt;VT-x/AMD-V&lt;/strong&gt; 或嵌套虚拟化）已经开启&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;项目地址&lt;a href=&quot;#项目地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;🔗 &lt;a href=&quot;https://github.com/microsoft/WindowsDeveloperConfig&quot; target=&quot;_blank&quot;&gt;https://github.com/microsoft/WindowsDeveloperConfig&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>总结了几条 AI 编程的关键技巧</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E6%80%BB%E7%BB%93%E4%BA%86%E5%87%A0%E6%9D%A1ai%E7%BC%96%E7%A8%8B%E7%9A%84%E5%85%B3%E9%94%AE%E6%8A%80%E5%B7%A7/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E6%80%BB%E7%BB%93%E4%BA%86%E5%87%A0%E6%9D%A1ai%E7%BC%96%E7%A8%8B%E7%9A%84%E5%85%B3%E9%94%AE%E6%8A%80%E5%B7%A7/</guid><description>**来源：** 微信公众号「雨飞AI笔记」 **发布时间：** 2026年6月7日 19:57（山东）</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;总结了几条 AI 编程的关键技巧&lt;a href=&quot;#总结了几条-ai-编程的关键技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; 微信公众号「雨飞AI笔记」
&lt;strong&gt;发布时间：&lt;/strong&gt; 2026年6月7日 19:57（山东）
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzI1MjU1MjU0NA==&amp;amp;mid=2247492979&amp;amp;idx=1&amp;amp;sn=d71ec42b61b54ff717aea73ed3ddb4f6&quot; target=&quot;_blank&quot;&gt;mp.weixin.qq.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;很多人用 AI 编程，只会选择一个模型，一条路走到黑，浪费了大量的 token 还不一定能出结果。以下几条使用下来非常有价值的技巧，帮你节省 tokens。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;1️⃣ 不要在一个对话中切换模型，重开新的对话&lt;a href=&quot;#1️⃣-不要在一个对话中切换模型重开新的对话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在一个对话中切换模型会导致之前的&lt;strong&gt;缓存机制失效&lt;/strong&gt;，每次切换都需要重新缓存，浪费大量的 token 和算力。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2️⃣ 上下文窗口保持在 60% 以内&lt;a href=&quot;#2️⃣-上下文窗口保持在-60-以内&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;根据实际经验，以 GLM 为例，上下文占用超过 60% 的时候，模型效果会严重崩坏。因此要想省钱就最好明确给 AI 的上下文，必要时可以让 AI 自己压缩历史记录。现在主流的工具比如 CC、Codex 也都有自动压缩功能可以开启。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3️⃣ 规则文件、项目文件不宜过长&lt;a href=&quot;#3️⃣-规则文件项目文件不宜过长&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;太长的项目文件其实 AI 并没有真正理解，一般来说&lt;strong&gt;规则文件在 200 行以内效果最好&lt;/strong&gt;。像 CC、Cursor 他们内置的提示词也基本在 4-6k 的 token，添加太多的规则，反而让低级模型不明白如何处理事情，所有命令都需要依靠顶级模型，费钱费时。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4️⃣ Skills 并非越多越好&lt;a href=&quot;#4️⃣-skills-并非越多越好&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;不管是 CC 还是 Cursor 这种工具，Skills 越多，占据的上下文就越多，也容易引发 Skills 选择错误，造成语义冲突，甚至部分 Skills 根本没有使用过也占据了 token。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;整个项目建议的 Skills &lt;strong&gt;不要超过 20 个&lt;/strong&gt;，以 10 个左右为宜&lt;/li&gt;
&lt;li&gt;如果是 Agent 类工具（如龙虾或 Hermes Agent），单个 Agent Skills 数量建议控制在 &lt;strong&gt;20-50 个以内&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5️⃣ 善用 CLI 命令和脚本&lt;a href=&quot;#5️⃣-善用-cli-命令和脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;并非所有的任务都适合用 AI 进行处理，有的时候 CLI 命令反而可以更稳定地得到结果，也不需要浪费大量交互的 token。&lt;/p&gt;&lt;p&gt;目前主流的通信渠道（飞书、企微等）都提供了 CLI 接口，可以让 AI 调用这些接口去完成任务，效果也会更好。另外，也可以部署 crontab 定时任务，综合各类工具的优势，实现最优解。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;📌 核心原则：奥卡姆剃刀&lt;a href=&quot;#-核心原则奥卡姆剃刀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在机器学习领域有一个著名的&lt;strong&gt;奥卡姆剃刀原理&lt;/strong&gt;，核心就是「如无必要，勿增实体」。AI 编程也是如此，能用精简语言描述的内容，就不要用复杂、冗余的描述。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理于 2026-06-11&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>老哥们 新改了一版简历 这次有啥大毛病吗</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E7%AE%80%E5%8E%86%E4%BC%98%E5%8C%96%E5%BB%BA%E8%AE%AE_l%E7%AB%99%E5%B8%96%E5%AD%902303618/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E7%AE%80%E5%8E%86%E4%BC%98%E5%8C%96%E5%BB%BA%E8%AE%AE_l%E7%AB%99%E5%B8%96%E5%AD%902303618/</guid><description>**来源**：[LINUX DO - 非我莫属](https://linux.do/t/topic/2303618) **发帖时间**：2026-06-04</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;老哥们 新改了一版简历 这次有啥大毛病吗&lt;a href=&quot;#老哥们-新改了一版简历-这次有啥大毛病吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源&lt;/strong&gt;：&lt;a href=&quot;https://linux.do/t/topic/2303618&quot; target=&quot;_blank&quot;&gt;LINUX DO - 非我莫属&lt;/a&gt;
&lt;strong&gt;发帖时间&lt;/strong&gt;：2026-06-04
&lt;strong&gt;发帖人&lt;/strong&gt;：androido
&lt;strong&gt;数据&lt;/strong&gt;：577 浏览 · 26 赞 · 21 条回复 · 标签：纯水, 快问快答&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;帖子原文&lt;a href=&quot;#帖子原文&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;@androido&lt;/strong&gt; (androido) · 2026-06-04 05:51&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;image 702×984 329 KB 上次的已读不回麻了&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;（注：楼主附了一张简历截图，求职者为技术岗，简历内容密集，含个人信息、技术栈、项目经验等）&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;全部评论（20条）&lt;a href=&quot;#全部评论20条&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;#2 @626 (NumPy)&lt;a href=&quot;#2-626-numpy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:52&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;样式上 字太多，“恶心”得一塌糊涂， 还需要在优化优化 内容上不做评价&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#3 @thornLinux (微风放纸鸳)&lt;a href=&quot;#3-thornlinux-微风放纸鸳&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:55&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;来给我说一下,项目中是如何保证数据一致性的; ps:这是我比较喜欢问的&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#4 @LYOUL (LYOUL)&lt;a href=&quot;#4-lyoul-lyoul&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:55&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.codecvcv.com/&quot; target=&quot;_blank&quot;&gt;https://www.codecvcv.com/&lt;/a&gt; 佬友可以用这个网站优化一下排版，选个好看的模板改成自己的&lt;/p&gt;&lt;p&gt;🔗 &lt;a href=&quot;https://www.codecvcv.com/&quot; target=&quot;_blank&quot;&gt;https://www.codecvcv.com/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#5 @Flyingpen (Eevee)&lt;a href=&quot;#5-flyingpen-eevee&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:56&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;可以保留这一份，作为单页的。 但我建议你做一份多页的，至少3页，纯优化排版。 字那么多，甚至还有没写完的部分吧，单从内容上还不够。 所以需要一个多页的，好好排版，技术栈之类的用图标、图表、进度条等，缩减文字含量。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#6 @626 (NumPy)&lt;a href=&quot;#6-626-numpy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:57&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Eevee: 一份多页的 同意这种做法，以附录的形式，感兴趣的人会要过来看的&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#7 @LM_1997 (离者悲名)&lt;a href=&quot;#7-lm_1997-离者悲名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 05:58&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;建议修改下排版，现在最大的问题是排版，用WPS简历，或者其他工具都行，现在这个排版点开确实看不下去内容，就更没有下一步了&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#8 @amufeng&lt;a href=&quot;#8-amufeng&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:01&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;技术佬的简历基本都是这样，密密麻麻全是说的各种技术。选三个重点项目即可，面试的时候可以展开说&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#9 @Flyingpen (Eevee)&lt;a href=&quot;#9-flyingpen-eevee&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:03&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;#精华 比如这里。 善于发现并解决问题，这个基本上99%的简历都有。 但如果多加一句——对数个开源项目提出 github 优化合并请求，均得到认同。 对新技术保持持续关注和学习热情，也是老生常谈。 如果多加一句——使用 rss 并持续关注openai、claude 等国内外尖端技术信息。证明你是落到实处的。 之所以提出这一点，是因为这几句话就在开头第一段。 这是开门印象分。 很重要。 个人建议，可能有不对的地方，请包涵。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#10 @chenxiaopa (陈小爬)&lt;a href=&quot;#10-chenxiaopa-陈小爬&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:05&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;感觉密密麻麻的，颜色也很单调，弄成两页会不会好一些&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#11 @baixb123&lt;a href=&quot;#11-baixb123&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:11&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;找一个自己喜欢的latex模版，直接让ai来优化后自动编译 自己调格式还是挺烦的&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#12 @Nan0623 (Nan)&lt;a href=&quot;#12-nan0623-nan&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:11&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;github上有好多模板的，我前几天刚做了一份简历，佬可以去找一下&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#13 @Sniper_cccc (傻子是心痴)&lt;a href=&quot;#13-sniper_cccc-傻子是心痴&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:13&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;技术栈为啥加粗？ 就项目加粗就好了 做好排版 换行 或者直接markdown搞一份 然后导出成PDF的 文字也有点太多了&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#14 @wlxzz (网络小渣渣)&lt;a href=&quot;#14-wlxzz-网络小渣渣&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-04 06:33&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;没什么太大毛病，只不过互联网的时代已经过去了&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#15 @tgj123 (t3060106756)&lt;a href=&quot;#15-tgj123-t3060106756&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 01:55&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;先办排版问题改美观一些，内容太多读都不想读&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#16 @litj (乡里别)&lt;a href=&quot;#16-litj-乡里别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 01:59&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;其实大差不差的，但是没有突出你的亮点； 没看到你的邮箱不知道是不是被你打马赛克了；如果有linux.do后缀的邮箱写上去的话，你的面试机会、成功率至少增加90%&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#17 @birdfly (饭桶菜鳥)&lt;a href=&quot;#17-birdfly-饭桶菜鳥&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 02:10&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;个人建议，如果英语只有四级的话就不要写了，如果六级没问题可以写六级，不然就是提醒别人我六级没过&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#18 @mqq (Leo)&lt;a href=&quot;#18-mqq-leo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 02:14&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;分条目的字体大小要和内容的字体大小分开&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#19 @leyfung (leyfung)&lt;a href=&quot;#19-leyfung-leyfung&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 02:17&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;用我的项目，优化一下美观度吧，下载安装就能用：jlifeng/JobPilot&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;#20 @androido (androido)&lt;a href=&quot;#20-androido-androido&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;2026-06-05 02:45&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;最新消息 有一个面试了 在山东济南 全栈开发&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;#精华 简历修改建议要点：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 格式与排版&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;字太多、太小，标题和正文不能用同一个字号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应聘岗位、顶部最大（字号层级要分明）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 个人优势&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;放到最后写&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3. 专业技能&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不要写太多，不要用长句，要用短句和短语&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;示例写法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;熟练使用 Claude Code 等 AI 工具&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉 java、html5 等语言&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉 MySQL、Redis 数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉常见的数据结构和算法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉 Linux 系统编程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;说明：只要这些字往那一写，面试官就知道大概干嘛的了，如果他想知道深入的，他会问（虽然一般问这块比较少），还能引出问题：“我看你说熟练使用 Claude Code 等 AI 工具，那你用过哪些 skill，自己写过什么 skill 吗，skill 是怎么发挥作用的，他和 MCP 有什么区别”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;5. 项目内容&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;项目内容太多了，这两个面试官一看标题就知道是网上随便找的玩具项目，抄起来，背背项目知识点、提问点，现在有 AI，速成一个现有项目就是几天的事情。（不是说佬你的一定是抄的，只是这种现象很普遍，而面试官又不可能清楚分辨出哪些是抄的，哪些是写的，只是凭感觉认为）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可能你觉得里面写的很好，真的很有技术点、设计也很好（说实话，毕竟是很多面试商家打磨的，项目本身肯定是不错的，很多人自己写写不出来的），但是事实上，很多面试官根本不会这么想。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;6. 项目功能描述&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;项目不要写太多功能，看个项目标题就大概能猜出功能了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;个人介绍的时候也可以说两句做了什么东西，功能没什么提问点，重点不是你做了什么，而是你怎么做的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;个人项目主要写”有提问点的技术细节”，让面试官一看到这个就想问你&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我当时根本没有什么项目简介、技术栈，就是一行项目日期、标题、类型，下面就是几个”使用 &lt;em&gt;&lt;strong&gt;实现&lt;/strong&gt;&lt;/em&gt; ”、“基于 &lt;strong&gt;实现&lt;/strong&gt; *“，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;“采用基于无锁队列的事件分发模型来减少锁带来的性能消耗”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“采用零拷贝技术进行文件传输”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;就是两个提问率比较高的点”无锁队列实现”和”零拷贝”，经常被问，我也会准备好对应的回答&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;个人项目就找技术提问点就行了，记住目的不是为了”介绍项目”，面试官根本不关系（关心），只关心里面的技术点，你的目的也就是突出这些提问点，引导面试官关注，让他问你&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于实习项目，才会功能和介绍结合，面试官会好奇其他公司在做什么，且是个实际项目，提问率比较高&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;7. GitHub 链接&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果有 github 链接，直接在项目底部贴一个链接，要比其他什么乱七八糟的描述更有说服力，就算面试官不会看也要有&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果面试官真的看了，看到了你的 github 主页、项目仓库 README，完整详细的 commit 记录，这能说明很多东西&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果让我面试一个人，他的 github 小绿点从他大一就开始亮起且频率不错，commit 记录完善，他在我心中就已经是一个比较优秀的形象了，这种人大概率上是不会差的&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;互动数据&lt;/strong&gt;：578 浏览量 | 26 赞 | 1 链接 | 18 用户&lt;/p&gt;&lt;p&gt;&lt;strong&gt;页码&lt;/strong&gt;：21 / 21&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;核心要点总结&lt;a href=&quot;#核心要点总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;要点&lt;/th&gt;&lt;th&gt;具体建议&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;排版是第一优先级&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;密密麻麻的文字直接劝退面试官；使用 WPS 简历、codecvcv.com、GitHub 模板、LaTeX 等工具&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;做多页版本&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;单页 + 多页（至少 3 页）双版本；多页版可用附录形式展示技术细节，技术栈用图标/图表/进度条&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内容精简&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;选 3 个重点项目重点展开，面试时可以深入聊&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;自我评价要具体&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;不要写”善于解决问题&quot;&quot;关注新技术”等空话，必须附带具体事例（如 GitHub PR、RSS 订阅源）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;开门印象分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;第一段是面试官最先看到的，空泛表述会直接降低好感&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;技术栈呈现&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;用图标、图表、进度条等可视化方式，缩减文字含量；不要滥用加粗&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;格式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Markdown 编写 → 导出 PDF，或用 LaTeX 模板 + AI 自动编译&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;英语等级&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;四级不要写（反而暴露没过六级），六级才值得写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;邮箱&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;linux.do 后缀邮箱可能加分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;面试题预备&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;被问”项目中如何保证数据一致性”的概率很高&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;抓取时间：2026-06-05 12:07&lt;/em&gt;
&lt;em&gt;帖子链接：&lt;a href=&quot;https://linux.do/t/topic/2303618&quot; target=&quot;_blank&quot;&gt;https://linux.do/t/topic/2303618&lt;/a&gt;&lt;/em&gt;
&lt;em&gt;原始 JSON 数据：54KB，包含全部帖子 HTML 和元信息&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>重磅！Anthropic内部Skills经验公开了！</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E9%87%8D%E7%A3%85anthropic%E5%86%85%E9%83%A8skills%E7%BB%8F%E9%AA%8C%E5%85%AC%E5%BC%80%E4%BA%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E9%87%8D%E7%A3%85anthropic%E5%86%85%E9%83%A8skills%E7%BB%8F%E9%AA%8C%E5%85%AC%E5%BC%80%E4%BA%86/</guid><description>**来源：** Datawhale（微信公众号） **作者：** Anthropic团队</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;重磅！Anthropic内部Skills经验公开了！&lt;a href=&quot;#重磅anthropic内部skills经验公开了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;来源：&lt;/strong&gt; Datawhale（微信公众号）
&lt;strong&gt;作者：&lt;/strong&gt; Anthropic团队
&lt;strong&gt;发布时间：&lt;/strong&gt; 2026年6月7日 22:03 浙江
&lt;strong&gt;原文链接：&lt;/strong&gt; &lt;a href=&quot;https://claude.com/blog/lessons-from-building-claude-code-how-we-use-skills&quot; target=&quot;_blank&quot;&gt;https://claude.com/blog/lessons-from-building-claude-code-how-we-use-skills&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;Anthropic 自己内部是怎么用 Claude Code Skills 的，这次终于公开了。&lt;/p&gt;&lt;p&gt;他们把内部团队的用法做了一次完整复盘：Skills 分成哪 9 类、哪类最值得花力气、怎么写才真的有用。这些经验之前只在 Anthropic 内部流转，现在一次讲清。&lt;/p&gt;&lt;p&gt;今天把这个经验帖的核心干货给你梳理清楚。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、先把 Skill 理解对&lt;a href=&quot;#一先把-skill-理解对&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Anthropic 先纠正了一个很常见的理解。Skill 不只是几段提示词，它更接近一个&lt;strong&gt;围绕任务组织起来的文件夹&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;这个文件夹里可以放 SKILL.md，也可以放参考文档、脚本、模板、示例、hooks，甚至放会被后续任务继续读取的数据。Claude 调用 Skill 时，拿到的其实是一套完成任务所需的工作材料。&lt;/p&gt;&lt;p&gt;这个定义很重要。因为很多团队真正缺的，从来不是”再补一段提示词”，而是把那些已经验证过的做法、容易错的细节、常用脚本和固定流程，一次整理好，后面反复复用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、Anthropic 把内部 Skills 归成了 9 类&lt;a href=&quot;#二anthropic-把内部-skills-归成了-9-类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Anthropic 盘了一遍内部的 Skills，最后大致分成了 9 类。这 9 类连起来看，其实很像一条完整的软件工作流，从补知识到写代码，再到验证、部署、排障和运维。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;前三类：给模型补知识、补验证、补数据&lt;a href=&quot;#前三类给模型补知识补验证补数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第一类&lt;/strong&gt;是 library 和 API reference，给模型解释某个库、CLI 或 SDK 在团队内部到底该怎么用，把容易用错的规则和 gotchas 写清楚。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二类&lt;/strong&gt;是 product verification，负责判断产出有没有真的工作，比如在无头浏览器里完整跑一遍注册和结账流程。Anthropic 明说这类对输出质量提升最明显，值得让工程师专门花一周打磨。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三类&lt;/strong&gt;是 data fetching and analysis，连着数据仓库和监控系统，把取数方法、字段约定和常见分析路径封装好，模型不用再去猜表结构和字段名。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;中间三类：开始接住团队里的日常流程&lt;a href=&quot;#中间三类开始接住团队里的日常流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第四类&lt;/strong&gt;是 business process and team automation，把重复发生的团队流程压成一个命令就能跑的工作流，比如只输出相对昨天增量的 standup，或固定格式的周报。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第五类&lt;/strong&gt;是 code scaffolding and templates，生成那些有固定骨架、但又带着大量自然语言约束的代码，比如新 service 或迁移文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第六类&lt;/strong&gt;是 code quality and review，让代码尽量符合团队的质量标准。典型例子是拉一个”新鲜视角”subagent 来挑错的 adversarial-review，这类能力还能做成 hook 接进 CI。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;后三类：已经连到生产环境了&lt;a href=&quot;#后三类已经连到生产环境了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第七类&lt;/strong&gt;是 CI/CD and deployment，把代码从开发态推到上线态。比如 babysit-pr 会盯完一个 PR 的全过程，deploy-&amp;lt;service&amp;gt; 会把 build、放量、错误率对比和回滚条件串成一条链路。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第八类&lt;/strong&gt;是 runbooks，入口不是”我要写什么”，而是”现在出了什么症状”。报警、Slack thread、request ID 进来，它负责映射到该用哪些工具、查哪些路径，最后给出结构化结论。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第九类&lt;/strong&gt;是 infrastructure operations，处理资源清理、依赖治理和成本排查这类例行操作。这些动作常带破坏性，所以 Skill 里要写清 guardrail，先通知、再确认，最后才真正执行。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、Anthropic 真正强调的，不只是”会写”，更是”写对”&lt;a href=&quot;#三anthropic-真正强调的不只是会写更是写对&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;好的 Skill，往往都很聚焦&lt;a href=&quot;#好的-skill往往都很聚焦&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Anthropic 说得很直接，最好的 Skill 往往都很聚焦。能清楚落进某一类里的 Skill，通常更稳；试图同时覆盖太多目标的 Skill，反而更容易把模型带乱。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;所有类型里，他们最看重「验证」&lt;a href=&quot;#所有类型里他们最看重验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在所有类型里，Anthropic 特别强调 verification。因为模型最容易给人一种”已经做完了”的错觉，而真正容易掉链子的地方，恰恰是最后那一步验证。&lt;/p&gt;&lt;p&gt;原文甚至建议，值得让工程师单独花一周，把验证类 Skill 做到足够好。&lt;/p&gt;&lt;p&gt;他们还给了两个非常实用的建议：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;让 Claude 录下自己测试过程的视频，这样你能清楚看到它到底测了什么。&lt;/li&gt;
&lt;li&gt;在关键节点加&lt;strong&gt;程序化断言&lt;/strong&gt;。状态有没有变化，事件有没有真正落库，最终页面是不是到了目标状态，都尽量不要只靠”看起来差不多”。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;真正有价值的内容，往往是 gotchas&lt;a href=&quot;#真正有价值的内容往往是-gotchas&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Anthropic 对 Skill 里的内容优先级也讲得很清楚。最有信号量的部分，通常不是通用步骤，而是 &lt;strong&gt;gotchas&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;因为 Claude 本来就会写代码，也会读代码库。那些”默认它也会做”的东西，写进 Skill 里只会增加上下文，不一定增加价值。&lt;/p&gt;&lt;p&gt;真正值得写的，是那些会把模型从默认思路里拽出来的细节：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;subscriptions 表是 append-only，要找最高 version，不能只看最新 created_at。&lt;/li&gt;
&lt;li&gt;同一个字段，在 API gateway 里叫 @request_id，到了 billing 服务里叫 trace_id。&lt;/li&gt;
&lt;li&gt;staging 返回 200，也不代表 Stripe webhook 真处理成功了，还得去看 payment_events 里的真实状态。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、Skill 到底该怎么写&lt;a href=&quot;#四skill-到底该怎么写&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 别把显而易见的话再写一遍&lt;a href=&quot;#1-别把显而易见的话再写一遍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Skill 不是给人看的摘要，它要补的是模型默认拿不到、或者默认容易走偏的信息。Anthropic 提到过一个前端设计 Skill 的例子——它的价值不在于教 Claude 怎么写前端，而在于补充团队通过和客户反复迭代后沉淀下来的”设计品味”和避坑点。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. SKILL.md 更像目录，不该写成大杂烩&lt;a href=&quot;#2-skillmd-更像目录不该写成大杂烩&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;更好的做法是让 SKILL.md 做&lt;strong&gt;目录和路标&lt;/strong&gt;，把具体资料按需分发到别的文件里：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;任务卡住了，再去读 stuck-jobs.md&lt;/li&gt;
&lt;li&gt;API 的函数签名和用法示例，拆进 references/api.md&lt;/li&gt;
&lt;li&gt;模板放进 assets/&lt;/li&gt;
&lt;li&gt;脚本、参考资料、例子分目录放好&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这套做法就是 &lt;strong&gt;progressive disclosure&lt;/strong&gt;——文件系统本身，也是一种上下文工程。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Skill 不要写得太死&lt;a href=&quot;#3-skill-不要写得太死&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;给 Claude 关键规则，但也要给它足够的适应空间，不然 Skill 一复用，就容易在别的具体情境里卡住。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. setup 要提前想好&lt;a href=&quot;#4-setup-要提前想好&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多 Skill 真跑起来时，会缺一些来自用户的上下文。原文建议把这类配置放进 config.json，如果配置还没建好，Claude 就先问用户。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. description 要直接服务触发&lt;a href=&quot;#5-description-要直接服务触发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;description 是写给模型看的，决定 Skill 会不会被触发。它不是摘要，而是&lt;strong&gt;触发条件说明&lt;/strong&gt;。用户可能会说什么关键词、上传什么文件、什么场景下应该激活这个 Skill，都应该直接写进去。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;五、Skill 用深之后，会先长出记忆、脚本和 hooks&lt;a href=&quot;#五skill-用深之后会先长出记忆脚本和-hooks&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;记忆&lt;a href=&quot;#记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;像 standup-post 这种 Skill，可以把每次输出都记进 standups.log，下次运行时先读历史，再判断今天和昨天相比到底变了什么。可以用 append-only 文本或 JSON，也可以用 SQLite。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;脚本&lt;a href=&quot;#脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Anthropic 的判断很明确——能给 Claude 的最强工具之一，其实就是代码本身。预置常用的数据抓取函数、分析函数或操作脚本，Claude 就能把更多回合花在”怎么编排”和”下一步做什么”上。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;on-demand hooks&lt;a href=&quot;#on-demand-hooks&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;它们只在 Skill 被调用时生效，而且只在当前会话里存在。例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/careful&lt;/code&gt;：拦住 rm -rf、DROP TABLE、force-push、kubectl delete 等高风险操作&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/freeze&lt;/code&gt;：阻止对指定目录之外的 Edit 和 Write，适合排障时防止顺手改坏别的地方&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;六、当团队开始大量用 Skill，后面就是分发和治理&lt;a href=&quot;#六当团队开始大量用-skill后面就是分发和治理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;两条主路线&lt;a href=&quot;#两条主路线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;repo 内 check-in&lt;/strong&gt;：把 Skill check in 到 repo 里的 ./.claude/skills，适合规模不大的团队。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插件 marketplace&lt;/strong&gt;：用内部的 Claude Code Plugin marketplace 上传和安装，团队一变大优势更明显。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;治理流程&lt;a href=&quot;#治理流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Anthropic 没有一上来就搞中央审批。更常见的方式是：谁有 Skill 想给大家试，就先传到 GitHub 里的 sandbox 文件夹，再发到 Slack 让其他人试用。等这个 Skill 真有了 traction，再由 Skill owner 提 PR，正式移进 marketplace。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Skills 之间也可以互相组合&lt;a href=&quot;#skills-之间也可以互相组合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;比如一个文件上传 Skill，再有一个 CSV 生成 Skill，后者生成完文件后，再去调用前者完成上传。只要在 Skill 里直接引用另一个 Skill 的名字，模型在安装了它们的前提下，照样能把链路串起来。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;使用度量&lt;a href=&quot;#使用度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Anthropic 会用 PreToolUse hook 记录公司内部的 Skill 使用情况，了解哪些 Skill 热门、哪些触发明显不足。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Anthropic 在文章结尾提到一个细节：&lt;strong&gt;他们内部最好的 Skills，一开始往往只有几行字和一个 gotcha，用得越多，才补得越完整。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这句话基本可以当成上手指南。写 Skill 不用追求一步到位，先把验证方法写清楚，把真正踩过的坑记下来，脚本、记忆、hooks 和分发，等用起来之后再慢慢补。&lt;/p&gt;&lt;p&gt;如果你也在用 Claude Code，不妨从手头最常重复的那个任务开始。先写几行说明，加上一个 gotcha，剩下的交给时间和使用频率。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;本文转载自微信公众号 &lt;strong&gt;Datawhale&lt;/strong&gt;，原标题为”重磅！Anthropic内部Skills经验公开了！“，内容有整理。&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>阿里巴巴开源AI代码审查命令行工具；一键安装AI工具；AI课件转考试复习助手</title><link>https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%BC%80%E6%BA%90ai%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85ai%E5%B7%A5%E5%85%B7ai%E8%AF%BE%E4%BB%B6%E8%BD%AC%E8%80%83%E8%AF%95%E5%A4%8D%E4%B9%A0%E5%8A%A9%E6%89%8B/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%A4%96%E9%83%A8%E7%B2%BE%E9%80%89-%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%BC%80%E6%BA%90ai%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85ai%E5%B7%A5%E5%85%B7ai%E8%AF%BE%E4%BB%B6%E8%BD%AC%E8%80%83%E8%AF%95%E5%A4%8D%E4%B9%A0%E5%8A%A9%E6%89%8B/</guid><description>原创：科技九点半 · 每日AI新工具 2026年6月8日 10:12 福建</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;阿里巴巴开源AI代码审查命令行工具；一键安装AI工具；AI课件转考试复习助手&lt;a href=&quot;#阿里巴巴开源ai代码审查命令行工具一键安装ai工具ai课件转考试复习助手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;原创：科技九点半 · 每日AI新工具&lt;br /&gt;
2026年6月8日 10:12 福建&lt;br /&gt;
关注我，记得标星⭐️不迷路哦～&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h3&gt;✨ 1: Open Code Review —— AI代码审查命令行工具&lt;a href=&quot;#-1-open-code-review--ai代码审查命令行工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Open Code Review 的核心价值在于把”工程确定性”与”AI Agent能力”结合起来做代码审查：它本质上是一个面向 Git 变更的 AI Review CLI，来自阿里巴巴经过大规模真实场景验证的内部能力，强调在大改动场景下依然保持完整覆盖、定位准确和质量稳定；与纯自然语言驱动的通用 Agent 不同，它通过确定性的文件筛选、关联文件打包并发审查、按文件特征精细匹配规则、独立的评论定位与反思模块来保证”不会错”的环节，再让 Agent 专注于动态决策和上下文检索（如读取全文件、跨文件搜索、结合上下文深度分析），从而输出带行级定位的结构化审查意见；在使用形态上，它既可作为本地 CLI 审查工作区/分支/提交，也能以 JSON 结果接入 GitHub Actions/GitLab CI，还能无缝嵌入 Claude Code、Codex、Skills 等智能编码工作流；同时它支持分层优先级的规则体系（命令行/项目级/全局级/系统默认）、可定制 include/exclude 过滤策略与规则模板，兼顾通用性和团队个性化标准，另外提供会话 Viewer、可观测性遥测（OpenTelemetry）及基础安全防护（如 Viewer Host 白名单防 DNS Rebinding），整体上是一个偏工程化、可扩展、可落地到团队协作和自动化流水线的专业 AI 代码审查方案。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/alibaba/open-code-review&quot; target=&quot;_blank&quot;&gt;https://github.com/alibaba/open-code-review&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;✨ 2: EchoBird —— 跨平台AI部署与应用管理平台&lt;a href=&quot;#-2-echobird--跨平台ai部署与应用管理平台&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;EchoBird 的核心价值是把”AI 工具部署难、模型配置碎片化、跨设备环境不一致”这几个痛点打包成一个统一的桌面平台：它围绕一个可复用的模型中枢（Model Nexus）构建，支持 OpenAI、Anthropic、本地 LLM 与 API 路由等多模型源，一次配置即可在全局复用，并提供延迟检测来降低选型成本；在此基础上，项目提供四个互相联动的核心场景——用安装与修复 Agent 通过对话式方式自动安装/排障主流 AI 工具（含本地与远程）、一键启用本地 LLM 运行时（vLLM/SGLang/llama.cpp，选择量化后即可启动）、在”My AI Projects”中托管和管理自建 AI 应用/游戏，以及通过 App Manager 对各类 AI/Agent 应用进行一键启动与统一管理，整体形成”配置一次，到处可用”的工作流闭环；同时它采用 Tauri + Rust 实现并覆盖 Windows/macOS/Linux（x64/arm64）跨平台，定位上不仅是下载渠道仓库，还承担 issue 反馈入口，产品信息主要由官网承载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/edison7009/EchoBird&quot; target=&quot;_blank&quot;&gt;https://github.com/edison7009/EchoBird&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;✨ 3: ExamPass Assistant —— AI课件转考试复习助手&lt;a href=&quot;#-3-exampass-assistant--ai课件转考试复习助手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ExamPass Assistant 的核心价值是把分散的课程资料一键转成”可直接备考”的学习产物：它面向期末复习场景，支持将 PPTX、DOCX、PDF（含图像内容识别）统一解析后，自动生成结构化知识导图式复习讲义与可交互自测题页面，重点在于不仅提炼知识点，还会标注考试优先级、构建概念逻辑链，并提供可点击作答、即时判分、错因解析与易错提醒的练习体验；整体以浏览器即开即用为导向，支持公式渲染与打印导出，既适合学生高效自学，也适合教师快速产出练习与作业，同时通过按章节分组处理、全流程扫描提取分析生成、命令式工作流（章节生成/更新/期末模拟卷）和缓存加速机制，形成了一个实用的课程级 AI 备考生产线。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/WUBING2023/ExamPass-Assistant&quot; target=&quot;_blank&quot;&gt;https://github.com/WUBING2023/ExamPass-Assistant&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;✨ 4: lowfat —— 轻量CLI命令输出压缩工具&lt;a href=&quot;#-4-lowfat--轻量cli命令输出压缩工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;lowfat 是一个面向 AI 编程/命令行场景的轻量级 CLI 压缩工具，核心价值是在命令输出进入智能体前先做”降噪与压缩”，从而减少 token 消耗并尽量保留关键信号；它强调”小而可扩展”的设计理念（单二进制、本地优先、无遥测、可组合管道），内置了对 git、docker、ls、find 等高频命令的分级压缩能力（lite/full/ultra），并支持通过 .lf DSL、Shell、Python 扩展自定义过滤器，适配 Claude Code、OpenCode、Shell、Pi 等多种代理/终端集成方式；同时它不仅提供压缩，还提供可观测性与可运营能力（如 info 查看当前过滤链路、stats/history 统计节省与高价值命令、plugin doctor 做插件健康检查），让用户能围绕自身工作流持续调优压缩强度与插件策略；对比同类工具 rtk，lowfat 的差异在于更少但更聚焦的内置能力、更强的”用户自定义与本地掌控”取向，以及在 README 给出的样例中对 git 类输出表现出更激进的压缩效果，但项目也明确这些数字是场景相关的方向性结果而非统一性能承诺。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/zdk/lowfat&quot; target=&quot;_blank&quot;&gt;https://github.com/zdk/lowfat&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;✨ 5: dots.tts —— 全连续自回归文本转语音系统&lt;a href=&quot;#-5-dotstts--全连续自回归文本转语音系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;dots.tts 的核心定位是一个 20 亿参数、全连续（无离散 token）、端到端自回归的高质量 TTS 系统，主打 48kHz 语音生成、零样本语音克隆与多语言泛化能力；它通过”语义编码器 + 文本 LLM（基于 Qwen2.5-1.5B）+ 自回归 flow-matching 声学头 + 冻结 AudioVAE”的连续建模架构，直接从 BPE 文本到声学潜变量逐步生成，实现稳定、自然且具情感表现力的语音合成，并支持常规整句生成与 1T1A 交错式低延迟流式推理；从 README 给出的多项评测看，该项目在 Seed-TTS-Eval 上达到开源 SOTA 平均水平，在 MiniMax 24 语种上取得最高平均说话人相似度（SCA 版本 83.9），在 CV3-Eval 与 EmergentTTS-Eval 的高难和表现力维度也具竞争优势，说明其在可懂度、音色保持、跨语种克隆与表达能力之间做到了较好的平衡；工程侧同时提供完整推理与微调代码、CLI/Python/Gradio 多入口与多种已发布检查点（预训练/SCA/MeanFlow 蒸馏），便于研究和落地，但项目也明确提示高保真克隆存在滥用风险，且在低资源语言上仍有 WER 短板，当前发布重点仍是语音场景而非歌声或通用声音生成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/rednote-hilab/dots.tts&quot; target=&quot;_blank&quot;&gt;https://github.com/rednote-hilab/dots.tts&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;这就是本期的内容，记得标星⭐️点赞，关注我不迷路哦～&lt;br /&gt;
&lt;em&gt;每日AI新工具&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>尝试用 Pi 理念设计订单系统（MVP 实现）</title><link>https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-%E5%B0%9D%E8%AF%95%E7%94%A8pi%E7%90%86%E5%BF%B5%E8%AE%BE%E8%AE%A1%E8%AE%A2%E5%8D%95%E7%B3%BB%E7%BB%9F/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-%E5%B0%9D%E8%AF%95%E7%94%A8pi%E7%90%86%E5%BF%B5%E8%AE%BE%E8%AE%A1%E8%AE%A2%E5%8D%95%E7%B3%BB%E7%BB%9F/</guid><description>用 Pi（开源终端 coding agent）的设计理念来构建一套批发订单系统——Gateway → Core/Harness → Capabilities 三层架构，Harness 空壳设计，5 种扩展方式，持续质疑复杂度的设计哲学。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;尝试用 Pi 理念设计订单系统（MVP 实现）&lt;a href=&quot;#尝试用-pi-理念设计订单系统mvp-实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书笔记 | OCR 提取整理于 2026-06-11&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;起因&lt;a href=&quot;#起因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;朋友做批发生意，有几百个客户微信群，24 小时随时可能有人下单。&lt;/p&gt;&lt;p&gt;下单的方式五花八门——有人发”10 件”，有人发”跟昨天一样”，有人发”加 3 件”，有人先说 8 件过会儿又说”改成 7 件”。每个群的说话习惯不一样，角色关系不一样（有的群老板先报预估数、实际经营者后来说的才算），规格默认值也不一样。&lt;/p&gt;&lt;p&gt;延迟要求不高（凌晨下单早上配送），但需要人 24 小时盯着群。他雇人盯屏幕手敲 Excel，漏单、错单、重复记是常态。而几百个群的量，人工成本越来越高。&lt;/p&gt;&lt;p&gt;第一版我写了 parser——正则匹配数字、规则引擎判断消息类型。写了 2000 行，发现根本兜不住。“加 3 件”是加单，“3 件”可能是新单也可能是回答”你今天要多少”，“后面为准”意味着之前的数字作废。每个群的规矩不一样，规则越写越多，改一个崩三个。&lt;/p&gt;&lt;p&gt;后来想明白了：这些判断本质上是在理解人在说什么，这正是 LLM 擅长的事。于是推倒重来，用 Agent 架构重写——不写 parser，让 LLM 直接理解消息，调 tool 记录结果。&lt;/p&gt;&lt;p&gt;系统分两期：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当前阶段：&lt;/strong&gt; 订单自动记录 + 复核（LLM 记录，置信度低的标待审查，人工确认）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后续扩展：&lt;/strong&gt; 转账记录、自动对账、库存跟踪、实时微信接入、Web 看板&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;为什么选择 Agent Framework&lt;a href=&quot;#为什么选择-agent-framework&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我日常用 AI 编程助手，从 OpenClaw 到 Hermes，最终一直在用 &lt;strong&gt;Pi&lt;/strong&gt;（一个开源终端 coding agent）。用久了发现它的设计特别好：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能随加随用&lt;/strong&gt;——想加新能力？写个 skill 文件，一行注册，零改动已有代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;极度灵活&lt;/strong&gt;——自定义 tool、自定义 prompt 片段、自定义快捷键，想怎么配怎么配&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Harness 完全不知道自己在干嘛&lt;/strong&gt;——agent loop 就是个简单的 while 循环，发消息给 LLM、调 tool、喂结果。它不知道自己在写代码还是在处理订单，所有业务知识都是注入的。这就是所谓的 &lt;strong&gt;“Harness 是空壳，能力通过注册注入”&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;朋友的订单系统正好需要这种灵活性——几百个群，每个群画像不同，随时可能加新类型的消息处理。如果写死在代码里，每加一个群就要改一次代码。但用 Pi 的理念：每个群一份画像文件，新群 = 新文件，代码不动。&lt;/p&gt;&lt;p&gt;所以这个项目本质上是：&lt;strong&gt;把 Pi 的架构思想，从编程场景搬到了业务数据处理场景。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;架构：三层&lt;a href=&quot;#架构三层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整个系统分三层：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Gateway（入口）→ Core / Harness（引擎）→ Capabilities（业务）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;Gateway&lt;a href=&quot;#gateway&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Gateway 是数据入口，现在读 JSON 文件，以后接微信机器人。它的作用是把原始消息清洗成结构化的 Message 对象。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Core（引擎）&lt;a href=&quot;#core引擎&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Core 是引擎，不知道自己在处理什么业务。它只做一件事：把消息给 LLM → LLM 说调 tool 就调 → 结果喂回去 → 循环。&lt;/p&gt;&lt;p&gt;它不知道”订单”是什么，不知道”件数”是什么。搜遍 core/ 目录，找不到任何业务词汇。这意味着：换一个行业（物流、餐饮、零售），core/ 一行不改。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Capabilities（业务层）&lt;a href=&quot;#capabilities业务层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Capabilities 是业务层，放所有具体的东西——订单模型、数据库、5 个 tool、群画像。加新功能 = 写新文件 + 注册，永远不改已有文件。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;core/ 目录结构&lt;a href=&quot;#core-目录结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;core/                    # 无业务，通用引擎&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── agent.py             # while 循环：发消息～调 tool～喂结果，继续&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── registry.py          # tool 注册表，bootstrap 自动扫描 tools/ 目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── session.py           # 对话上下文管理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── llm.py               # LLM 接口，抹平不同模型的行为差异&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── events.py            # 事件总线&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── types.py             # Message、ToolCall 等基础类型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── config.py            # 配置开关&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;capabilities/            # 纯业务，只有 Python 标准库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── domain/models.py     # 领域模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── store/               # SQLite 存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── tools/               # 5 个 tool：下单、转账、退货、价格变动、查询&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── context/             # 提示词：行业知识 + 角色设定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── memory/groups/       # 群画像 + index.json 路由&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── extensions/          # 扩展插件（消息分段、脱敏、审查、审计）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展性设计&lt;a href=&quot;#扩展性设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;系统的扩展性不是靠复杂的插件框架，而是靠 &lt;strong&gt;一致的注册模式&lt;/strong&gt;。每种扩展方式都是同一个套路：&lt;strong&gt;写文件 + 注册&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;5 种扩展方式&lt;a href=&quot;#5-种扩展方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1. 加新 Tool —— LLM 可调用的能力&lt;a href=&quot;#1-加新-tool--llm-可调用的能力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;启动后 LLM 自动知道有这个 tool 可用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tool 的本质：&lt;/strong&gt; Tool 是 LLM 可以主动调用的能力。LLM 读到消息后自己判断要不要调、调哪个、传什么参数。代码不做这个判断——没有 if/elif 消息分类，没有正则匹配。这也是为什么不需要 Parser——LLM 就是 parser。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 加新群画像 —— per-group 知识注入&lt;a href=&quot;#2-加新群画像--per-group-知识注入&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;capabilities/memory/groups/新客户群.md&lt;/code&gt; → 新画像&lt;/p&gt;&lt;p&gt;系统处理这个群的消息时，自动加载画像注入 prompt。&lt;/p&gt;&lt;p&gt;画像告诉 LLM 这个群的特殊规律——谁说了算、门店叫什么、默认规格是什么。不同群的画像完全独立，互不影响。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 加新 Extension —— 数据管道中的变换环节&lt;a href=&quot;#3-加新-extension--数据管道中的变换环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;capabilities/extensions/sanitizer.py&lt;/code&gt; → 新文件&lt;/p&gt;&lt;p&gt;Extension 是数据管道中的变换环节。它改数据本身——输入一种格式，输出另一种格式。数据必须经过它，它是处理链上的一环。&lt;/p&gt;&lt;p&gt;现在实现了 &lt;code&gt;session_grouper.py&lt;/code&gt;（按天分段），规划的 Extension：&lt;/p&gt;






















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;输入&lt;/th&gt;&lt;th&gt;输出&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;session_grouper&lt;/td&gt;&lt;td&gt;Message 列表&lt;/td&gt;&lt;td&gt;Segment 列表&lt;/td&gt;&lt;td&gt;按天分段，让 LLM 看到完整上下文&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;sanitizer&lt;/td&gt;&lt;td&gt;Message&lt;/td&gt;&lt;td&gt;Message&lt;/td&gt;&lt;td&gt;脱敏（手机号、地址脱敏后继续处理）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Extension 的设计原则：&lt;/strong&gt; 纯函数，零 core 依赖。输入是什么、输出是什么，可以独立测试。不 import core/ 的任何东西。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. 加新 Gateway —— 换数据入口&lt;a href=&quot;#4-加新-gateway--换数据入口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Gateway 只做一件事：把原始数据转成 Message 对象。它不碰 core/，不碰 LLM。在 main.py 里换成新 gateway，整个系统就走新数据源了。&lt;/p&gt;&lt;p&gt;这意味着：从 JSON 文件 → 微信实时消息 → 钉钉 → 飞书，只换 Gateway，其余不动。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;5. 换业务 —— 换 capabilities/ 目录&lt;a href=&quot;#5-换业务--换-capabilities-目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果不用来处理批发订单了，改成处理餐饮外卖、物流调度、客服工单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;domain/models.py&lt;/code&gt; —— 换成新的领域模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/&lt;/code&gt; —— 换成新的 tool&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context/business.md&lt;/code&gt; —— 换成新的行业知识&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory/groups/&lt;/code&gt; —— 换成新的客户画像&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;core/ 不动。8 个文件原封不动。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3 种集成方式（来自 Pi 的设计）&lt;a href=&quot;#3-种集成方式来自-pi-的设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1. Skill —— 领域知识 + 操作流程的封装&lt;a href=&quot;#1-skill--领域知识--操作流程的封装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Skill 是 Pi 的核心扩展机制。一个 Skill 是一个完整的操作指南——什么时候触发、怎么做、注意什么。它不是代码，是一份结构化的 markdown。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;skills/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── order-review/SKILL.md    # &quot;复核订单&quot;技能&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── batch-import/SKILL.md    # &quot;批量导入&quot;技能&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Skill 文件里包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;触发条件&lt;/strong&gt; —— 用户说什么话时加载这个 skill&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作步骤&lt;/strong&gt; —— 第一步做什么、第二步做什么&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识参考&lt;/strong&gt; —— 相关的 business.md 片段、tool 用法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检查清单&lt;/strong&gt; —— 做完后验证什么&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;比如”复核订单”skill 会告诉 LLM：先查今天所有待审查订单 → 逐条跟原始消息比对 → 确认或修正。这些流程如果写在 role.md 里会很长，按 skill 按需加载才合理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Skill 和 Tool 的区别：&lt;/strong&gt; Tool 是一个原子操作（记录一笔订单），Skill 是一个多步骤流程（复核今天所有订单）。Tool 是代码，Skill 是 prompt。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. Context —— 动态 prompt 片段&lt;a href=&quot;#2-context--动态-prompt-片段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Context 是在运行时动态注入的 prompt 内容。比如群画像是 per-group 的 context，每天的订单汇总可以作为当天的 context 注入。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;context/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── business.md       # 静态，行业知识（固定不变）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── role.md           # 静态，角色设定（固定不变）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── [运行时注入]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── 群画像        # 动态：per-group 知识&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 今日汇总      # 动态：per-session 数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这种设计来自 Pi 的 promptSnippet 机制——harness 控制 prompt 的拼接结构（什么放前面、什么放后面），tools/skills/memory 填充具体内容。每个模块只知道自己该贡献什么，不知道最终 prompt 长什么样。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. EventBus —— 模块间松耦合通信&lt;a href=&quot;#3-eventbus--模块间松耦合通信&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;模块之间不直接调用，而是通过事件总线间接通信。Tool A 记录了一笔订单后，发一个 &lt;code&gt;order_recorded&lt;/code&gt; 事件。审查模块、审计模块、通知模块各自订阅这个事件，做自己的事。Tool A 不知道谁在监听，监听者也不知道谁发的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Extension 和 EventBus 的区别：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Extension &lt;strong&gt;改数据&lt;/strong&gt;（消息分段、脱敏），是数据管道的一部分&lt;/li&gt;
&lt;li&gt;EventBus &lt;strong&gt;不改数据&lt;/strong&gt;，是事后通知（“这件事发生了，谁关心谁处理”）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;review_guard&lt;/code&gt; 表面看像 Extension（它要改订单状态），但本质是”收到 order_recorded 事件后执行一段逻辑”，属于 EventBus 订阅者，不是管道环节。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;踩过的模型坑&lt;a href=&quot;#踩过的模型坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;qwen3.6 的 tool calling 死循环&lt;a href=&quot;#qwen36-的-tool-calling-死循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;同一段消息被处理 5 次，DB 里出现大量重复。去 LangSmith（LLM 可观测性平台）看 trace，发现 assistant message 同时带了分析文字和 tool_calls。下一轮 LLM 看到自己写了”需记录”，以为还没处理完，就又调一遍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复一行：&lt;/strong&gt; 有 tool_calls 时丢弃 content。&lt;/p&gt;&lt;p&gt;不同模型对同一 API 的行为不同——有些 content=&quot;&quot; + tool_calls，有些同时返回。做 agent framework 必须在 harness 层统一。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;qwen3.6 的 thinking 模式&lt;a href=&quot;#qwen36-的-thinking-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;默认开启，53% 的 token 花在内部推理上。简单 4 条消息从 9 秒变成 33 秒。加 &lt;code&gt;enable_thinking: False&lt;/code&gt; 解决。&lt;/p&gt;&lt;p&gt;通用规则：thinking 适合复杂推理，但 tool calling 场景不需要。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;max_tokens 截断&lt;a href=&quot;#max_tokens-截断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;max_tokens=2048&lt;/code&gt; 太小，输出被截断，LangSmith 出现幽灵 trace。增大到 4096 解决。不同模型的 token 消耗差异大，宁大勿小。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;持续质疑复杂度&lt;a href=&quot;#持续质疑复杂度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;每加一个抽象层之前问：真的需要吗？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parser 基类？&lt;/strong&gt; —— 不需要，LLM 直接理解&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool 基类？&lt;/strong&gt; —— 不需要，&lt;code&gt;register()&lt;/code&gt; 函数就够了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态机？&lt;/strong&gt; —— 不需要，agent loop 是简单 while 循环&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EventBus hook chain？&lt;/strong&gt; —— 暂时不需要，只有 1 个消费者（YAGNI）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;门店名映射表？&lt;/strong&gt; —— 不需要，群画像里写清楚就行&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;知识分层&lt;a href=&quot;#知识分层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;th&gt;谁来写&lt;/th&gt;&lt;th&gt;变化频率&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;business.md&lt;/td&gt;&lt;td&gt;行业常识：规格表、交易流程&lt;/td&gt;&lt;td&gt;人写，很稳定&lt;/td&gt;&lt;td&gt;低频&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;role.md&lt;/td&gt;&lt;td&gt;角色关系、谁说了算&lt;/td&gt;&lt;td&gt;人写&lt;/td&gt;&lt;td&gt;低频&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;group profile&lt;/td&gt;&lt;td&gt;群画像&lt;/td&gt;&lt;td&gt;分析数据后定&lt;/td&gt;&lt;td&gt;中频&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tool description&lt;/td&gt;&lt;td&gt;什么时候调、历史&lt;/td&gt;&lt;td&gt;写 tool 时一起写&lt;/td&gt;&lt;td&gt;低频&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;role.md&lt;/td&gt;&lt;td&gt;角色设定：你是谁&lt;/td&gt;&lt;td&gt;人写&lt;/td&gt;&lt;td&gt;低频&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;每层各管各的，不交叉：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;群画像里不写 tool 名（tool 怎么用由 tool 自己告诉 LLM）&lt;/li&gt;
&lt;li&gt;tool description 里不写具体人名（避免硬编码）&lt;/li&gt;
&lt;li&gt;business.md 里不写某个群的行为（它是行业通用的）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Prompt 排列顺序的影响&lt;a href=&quot;#prompt-排列顺序的影响&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现在系统给 LLM 的 prompt 按这个顺序排列：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;business.md&lt;/strong&gt;（行业常识，固定不变）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;role.md&lt;/strong&gt;（角色设定，固定不变）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;群画像&lt;/strong&gt;（per-group 知识，半固定）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当天的消息&lt;/strong&gt;（每次不同，变化最大）&lt;/li&gt;
&lt;/ol&gt;&lt;section&gt;&lt;h3&gt;为什么这么排？两个原因。&lt;a href=&quot;#为什么这么排两个原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;注意力 U 型分布&lt;a href=&quot;#注意力-u-型分布&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;斯坦福和 Meta 的论文 “Lost in the Middle” 发现，LLM 对长文本的注意力呈 U 型分布——开头和结尾注意力最高，中间最低。关键信息放中间时，准确率下降 20% 以上。&lt;/p&gt;&lt;p&gt;我们把不变的行业知识放最前面（先建立”这个行业的常识”），变动的消息放最后（LLM 最后读到、马上处理），中间放群画像（它才是理解上下文的关键知识）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;KV Cache 复用&lt;a href=&quot;#kv-cache-复用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;这是个工程优化。LLM 处理每轮对话时，要把所有历史 token 重新算一遍。但前面没变的部分，计算结果可以缓存复用。&lt;/p&gt;&lt;p&gt;排列规则：&lt;strong&gt;越不常变的放越前面。&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;business.md 几乎永远不变，缓存利用率最高&lt;/li&gt;
&lt;li&gt;消息每次都变，放最后&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果倒过来，消息放中间、群画像放最后，每次新消息进来，群画像的缓存就失效了，白白重算。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实际效果：&lt;/strong&gt; 固定前缀（business.md + role.md + 群画像）大约 2500 token，消息平均 500-2000 token。前缀不变时，每轮省掉约一半的计算量。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简单记：不变的放前面，常变的放后面，最重要的放开头和结尾。&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 目前 agent loop 是单轮处理（一段消息一个 session，跑完就结束），所以 KV Cache 复用还没真正生效。等后续改成多轮交互式 gateway（LLM 和人来回对话），这个排列顺序的收益才会体现。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Reviewer Skill —— 用清单约束设计&lt;a href=&quot;#reviewer-skill--用清单约束设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;每次写完一个阶段，跑一遍 10 条审查清单：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;🔗 &lt;strong&gt;解耦&lt;/strong&gt; —— &lt;code&gt;grep &quot;from capabilities&quot; core/&lt;/code&gt; 必须为空&lt;/li&gt;
&lt;li&gt;📌 &lt;strong&gt;SSOT&lt;/strong&gt; —— 每个概念只定义一次&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;扩展性&lt;/strong&gt; —— 加功能只加文件不改已有，bootstrap 自动扫描&lt;/li&gt;
&lt;li&gt;🕳️ &lt;strong&gt;Harness 空壳&lt;/strong&gt; —— core/ 零业务字符串&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;输入信任 LLM&lt;/strong&gt; —— 输入侧不用 enum&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;行业知识纯度&lt;/strong&gt; —— business.md 换个行业内容仍成立&lt;/li&gt;
&lt;li&gt;🏷️ &lt;strong&gt;Tool 意图命名&lt;/strong&gt; —— action+target（&lt;code&gt;record_order&lt;/code&gt; 不是 &lt;code&gt;create_order&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;🚫 &lt;strong&gt;代码不做 LLM 该做的事&lt;/strong&gt; —— handler 里没有正则分类&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;通用性&lt;/strong&gt; —— 换业务只改 capabilities/&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;真实数据验证&lt;/strong&gt; —— 用真实消息验证，不是编测试用例&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;全文约 4554 字 | 阅读需 15 分钟&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>面试十几家 Agent 岗位，整理了面试题～</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-13-%E9%9D%A2%E8%AF%95%E5%8D%81%E5%87%A0%E5%AE%B6agent%E5%B2%97%E4%BD%8D%E9%9D%A2%E8%AF%95%E9%A2%98_linuxdo/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-13-%E9%9D%A2%E8%AF%95%E5%8D%81%E5%87%A0%E5%AE%B6agent%E5%B2%97%E4%BD%8D%E9%9D%A2%E8%AF%95%E9%A2%98_linuxdo/</guid><description>来自 LINUX DO 的 Agent 岗位面试题合集，覆盖 ML、KJ、JR、TK、YC、HJ、FN、XZ、SH、PY、HQ、YU 等 10+ 家公司，包含 Agent 架构、LangChain/RAG、K8s、WebSocket、前端八股、秒杀系统设计等面试题。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;【面试拷打】面试了十几家 Agent 岗位，整理了面试题～&lt;a href=&quot;#面试拷打面试了十几家-agent-岗位整理了面试题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：LINUX DO | 作者：guava_16 | 2026-06-11
原文：&lt;a href=&quot;https://linux.do/t/topic/2365650&quot; target=&quot;_blank&quot;&gt;linux.do/t/topic/2365650&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;上个月公司裁员，开启了前端面试之旅，一路坎坷，转而学习了一些 AI 课程，面试了十几家 agent 岗位（中间可能穿插偏向前端和全栈的岗位），面试过程都录音了，然后让 AI 整理了一下面试官提问的问题，分享给各位佬一起学习学习～&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;ML 公司&lt;a href=&quot;#ml-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;AI XX 系统主要是做什么的？&lt;/li&gt;
&lt;li&gt;LangChain / LangGraph 主要用了什么 AI 技术？&lt;/li&gt;
&lt;li&gt;有没有了解过像 Manus 这种通用 Agent？&lt;/li&gt;
&lt;li&gt;这些通用 Agent 一般分几层功能？&lt;/li&gt;
&lt;li&gt;有没有构建过多智能体（Multi-Agent）架构？&lt;/li&gt;
&lt;li&gt;什么是多 Agent？为什么需要多 Agent？&lt;/li&gt;
&lt;li&gt;什么场景下需要多 Agent 架构？&lt;/li&gt;
&lt;li&gt;单个 Agent 其实也可以分配多个职能，为什么还要多 Agent？&lt;/li&gt;
&lt;li&gt;多 Agent 主要是为了解决什么问题？&lt;/li&gt;
&lt;li&gt;你这个系统之前用户量有多少？日活有多少？&lt;/li&gt;
&lt;li&gt;Agent 的使用量是多少？Token 消耗量大概多少？&lt;/li&gt;
&lt;li&gt;有没有考虑过怎么节约 AI 成本？&lt;/li&gt;
&lt;li&gt;做了哪些成本优化方案？最终降了多少成本？AI 投入前后带来的收益有多少？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;KJ 公司&lt;a href=&quot;#kj-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Claude Code 的多层架构是怎么做的？&lt;/li&gt;
&lt;li&gt;PS 网页版实现方案？Canvas 无限画布是怎么实现的？&lt;/li&gt;
&lt;li&gt;WebAssembly 有了解过吗？&lt;/li&gt;
&lt;li&gt;Docker 和 K8s 的关系？Docker 中容器和镜像的关系？怎么进行挂载的？&lt;/li&gt;
&lt;li&gt;K8s 中多个服务怎么进行通讯？&lt;/li&gt;
&lt;li&gt;怎么进行团队的管理？怎么推动项目进度？&lt;/li&gt;
&lt;li&gt;Express 的底层原理？如果让你设计实现怎么做？&lt;/li&gt;
&lt;li&gt;入职后如何快速上手分配的业务需求？简说思路&lt;/li&gt;
&lt;li&gt;说一说在职业中比较具有挑战性的问题&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;JR 公司&lt;a href=&quot;#jr-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;介绍一下你的 AI 项目的架构情况？&lt;/li&gt;
&lt;li&gt;为啥选择 LangChain、LangGraph？选型的依据是啥？&lt;/li&gt;
&lt;li&gt;抽象通用 AI 能力模块做了什么？&lt;/li&gt;
&lt;li&gt;AI 调用工具失败了怎么解决？&lt;/li&gt;
&lt;li&gt;简单介绍一下 RAG 的流程？&lt;/li&gt;
&lt;li&gt;怎么加速 RAG 的检索过程，有啥策略？&lt;/li&gt;
&lt;li&gt;向量库目前的数据量？向量库使用的是啥？选型依据？&lt;/li&gt;
&lt;li&gt;大模型的选型逻辑？&lt;/li&gt;
&lt;li&gt;（政策文件场景下）怎么确认召回的数据准确性？&lt;/li&gt;
&lt;li&gt;你们上下文压缩的策略是什么？&lt;/li&gt;
&lt;li&gt;追问：上下文压缩时，如果大模型能力问题压缩质量有问题怎么解决？&lt;/li&gt;
&lt;li&gt;有了解之前 Claude Code 泄露的事件？有没有研究过源码？&lt;/li&gt;
&lt;li&gt;Claude Code 的上下文治理是怎么做的？核心循环流程说一下？&lt;/li&gt;
&lt;li&gt;多租户的场景下 K8s 怎么部署的？一个租户一个对应 Pod 吗？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;TK 公司&lt;a href=&quot;#tk-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;企微 H5 登录流程是怎么做的？&lt;/li&gt;
&lt;li&gt;企业微信只能绑定两个域名，多个业务域名怎么处理？&lt;/li&gt;
&lt;li&gt;UI 没空出原型，需要你自己设计页面？没有设计稿时你怎么推进？&lt;/li&gt;
&lt;li&gt;有没有做过 H5 用户打标签？&lt;/li&gt;
&lt;li&gt;用户进入页面后：怎么获取唯一 ID？企微回调里的 ID 同步怎么做？&lt;/li&gt;
&lt;li&gt;有没有做埋点？怎么做的？埋点获取哪些数据？&lt;/li&gt;
&lt;li&gt;RAG 的检索是怎么做的？&lt;/li&gt;
&lt;li&gt;海豚工作流同步数据时：MySQL IO 爆红怎么排查？（场景：三连表、每小时同步、查一个库、插另一个库、插入时报错、IO 爆高）&lt;/li&gt;
&lt;li&gt;MySQL 大表优化怎么做？百万级数据后出现慢插入？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;YC 公司&lt;a href=&quot;#yc-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;怎么保证数据库和缓存之间的数据一致性？&lt;/li&gt;
&lt;li&gt;从 0 到 1 搭建一个项目，怎么设计架构？&lt;/li&gt;
&lt;li&gt;你这个 AI XX 系统，如果从架构角度看，分成哪些层？&lt;/li&gt;
&lt;li&gt;假设现在让你做一个 xxx 门店的 AI 数字化系统，你会怎么设计？&lt;/li&gt;
&lt;li&gt;技术架构：你怎么拆模块？数据怎么流转？技术选型怎么做？&lt;/li&gt;
&lt;li&gt;AI 工具出现后，对传统研发工作流造成了很大冲击。你个人或团队有没有相应的 AI 工作流？&lt;/li&gt;
&lt;li&gt;如何把 AI 融入开发流程的？有 AI 编程规范吗？&lt;/li&gt;
&lt;li&gt;AI 写的代码相对不可控，你们有没有 Code Review 流程？&lt;/li&gt;
&lt;li&gt;SSE 断线续传？由于客户端因素断了（如窗口关闭又打开、刷新页面），需要让他继续接收 SSE 流，你们有没有做过？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;HJ 公司&lt;a href=&quot;#hj-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;个人一个月 Token 使用量大概是多少？&lt;/li&gt;
&lt;li&gt;如果政府项目限制使用国外模型或工具，完全使用国内工具有没有影响？&lt;/li&gt;
&lt;li&gt;有没有做过国内外 AI 工具或模型的对比？&lt;/li&gt;
&lt;li&gt;同一个模型不同工具，或者同一个工具不同模型，效果差异有没有研究？&lt;/li&gt;
&lt;li&gt;没用 AI 和用了 AI 后，你觉得效率提升有多大？按百分比来说，你觉得 AI 能提升多少效率？&lt;/li&gt;
&lt;li&gt;你会用什么 AI 工具来完成项目规划、草图、文档和开发？&lt;/li&gt;
&lt;li&gt;未来全栈开发需要具备一定架构师能力，你搭框架的整体思路是什么？&lt;/li&gt;
&lt;li&gt;传统 XX 业务系统的后端分几层？&lt;/li&gt;
&lt;li&gt;你们产品开发完后，最大用户并发数大概是多少？这个高并发项目部署在哪里？&lt;/li&gt;
&lt;li&gt;有没有做熔断之类的处理？高峰、限流、缓存、异步队列这些有没有做过？&lt;/li&gt;
&lt;li&gt;全栈项目没有测试岗，是怎么测试的？&lt;/li&gt;
&lt;li&gt;有没有做过基于 AI 的界面测试？AI 是否能覆盖前端点击、输入、提交等自动化测试？&lt;/li&gt;
&lt;li&gt;对未来职业规划是怎么想的？你是想跟着公司的战略方向走，还是自己有明确想法并寻找匹配的岗位？&lt;/li&gt;
&lt;li&gt;如果客户是政府单位，要重新定制开发一个软件，包含客户端、APP、小程序，售前已完成调研，项目体量约 50 万，一个月内交付，你如何拆解流程？&lt;/li&gt;
&lt;li&gt;如果是资产管理系统，你会如何利用 AI 完成开发和交付？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;FN 公司&lt;a href=&quot;#fn-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Vue 和 React 核心区别是什么？谁性能上限更高？&lt;/li&gt;
&lt;li&gt;React 和 Vue 最新版本在做什么？&lt;/li&gt;
&lt;li&gt;浏览器发起 HTTP 请求经历什么过程？哪些地方会发生缓存？&lt;/li&gt;
&lt;li&gt;找一个印象最深的项目聊聊&lt;/li&gt;
&lt;li&gt;SSE 和 WebSocket 分别说说？&lt;/li&gt;
&lt;li&gt;AI 时代程序员价值是什么？&lt;/li&gt;
&lt;li&gt;你认为自己在编程优点和缺点？&lt;/li&gt;
&lt;li&gt;最近学什么？职业规划是什么？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;XZ 公司&lt;a href=&quot;#xz-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;你自己的 AI 的开发工作流程是怎么样的？&lt;/li&gt;
&lt;li&gt;有在使用什么 MCP 或者 SKILL？&lt;/li&gt;
&lt;li&gt;接到一个需求后，你会怎么做？&lt;/li&gt;
&lt;li&gt;你的 3~5 年职业规划是怎么样的？&lt;/li&gt;
&lt;li&gt;工作中做过比较深刻的事情？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;SH 公司（太好了是前端八股！）&lt;a href=&quot;#sh-公司太好了是前端八股&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;CSS/动画&lt;a href=&quot;#css动画&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;CSS3 你用得比较多的有哪些？渐变、旋转、缩放、动画这些你了解吗？&lt;/li&gt;
&lt;li&gt;做动画时，CSS 和 JS 分别怎么做？有什么区别？&lt;/li&gt;
&lt;li&gt;Canvas 有没有用过？做过什么场景？&lt;/li&gt;
&lt;li&gt;红包/福袋动画是怎么做的？打开的动作是画出来的，还是直接展示 UI 图？&lt;/li&gt;
&lt;li&gt;动画有没有做过打开、抖动、浮动、阴影、缩放这类效果？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;WebSocket&lt;a href=&quot;#websocket&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;前端连接流程是什么？怎么监听消息？怎么和后端约定事件？&lt;/li&gt;
&lt;li&gt;有没有做心跳/保活？断开后怎么重连？&lt;/li&gt;
&lt;li&gt;有没有遇到连接不上的情况？连接不上时怎么兜底？&lt;/li&gt;
&lt;li&gt;是否会降级成 HTTP 轮询？轮询频率怎么控制？有没有用指数退避？&lt;/li&gt;
&lt;li&gt;弱网情况下怎么提示用户？实时数据不准确时，前端怎么做交互提示？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;ES6&lt;a href=&quot;#es6&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;有哪些常用特性？什么是柯里化函数？&lt;/li&gt;
&lt;li&gt;ES5 和 ES6 构造函数分别怎么写？&lt;/li&gt;
&lt;li&gt;ES6 用什么构造对象？ES5 用什么构造对象？&lt;/li&gt;
&lt;li&gt;Promise、扩展运算符、箭头函数、模板字符串这些是否了解？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;浏览器兼容&lt;a href=&quot;#浏览器兼容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;有做过浏览器兼容吗？需要注意哪些？CSS 兼容怎么处理？JS 兼容怎么处理？&lt;/li&gt;
&lt;li&gt;低版本浏览器下，打包降级有没有遇到问题？&lt;/li&gt;
&lt;li&gt;低版本浏览器里路由变了但页面不跳转，可能是什么原因？浏览器 API 不支持时怎么处理？&lt;/li&gt;
&lt;li&gt;框架 Vue/React 是否已经帮你抹平了一部分兼容性？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Vue&lt;a href=&quot;#vue&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;React 用得多，还是 Vue 用得多？&lt;/li&gt;
&lt;li&gt;Vue 2 和 Vue 3 的区别是什么？&lt;/li&gt;
&lt;li&gt;Vue 2 响应式原理是什么？Vue 3 响应式原理是什么？&lt;/li&gt;
&lt;li&gt;Object.defineProperty 和 Proxy 有什么区别？&lt;/li&gt;
&lt;li&gt;Vue 3 在性能上做了哪些优化？&lt;/li&gt;
&lt;li&gt;Vue 2 里数组/对象变更为什么可能不触发视图更新？如果数据变了，但是视图没变，可能是什么原因？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;PY 公司&lt;a href=&quot;#py-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;如何推动 AI 系统落地的？&lt;/li&gt;
&lt;li&gt;用户问题如何路由到 AI 系统？意图识别是如何实现的？使用了哪些模型？&lt;/li&gt;
&lt;li&gt;如何处理未登录用户的问题查询？&lt;/li&gt;
&lt;li&gt;如何做向量化和知识库检索？文档、PDF、课件是如何切分、入库、人工审核的？&lt;/li&gt;
&lt;li&gt;AI 输出如何保证序列化/结构化？为什么选择 Markdown 而不是 JSON？&lt;/li&gt;
&lt;li&gt;数据库和后端架构是什么？&lt;/li&gt;
&lt;li&gt;有没有做过微服务、数据中台或复杂后端系统？&lt;/li&gt;
&lt;li&gt;花了多久落地？在落地过程中，你之前没有经验时是怎么学习的？&lt;/li&gt;
&lt;li&gt;假设设计一个秒杀系统，你会怎么设计架构？高并发下如何避免超卖？&lt;/li&gt;
&lt;li&gt;MySQL 本身怎么实现库存扣减？Redis 分布式锁或 Lua 脚本如何使用？&lt;/li&gt;
&lt;li&gt;限流、接口削峰、事务和乐观锁如何落地？&lt;/li&gt;
&lt;li&gt;如果不用 Redis，只用 MySQL，要怎么保证安全？&lt;/li&gt;
&lt;li&gt;微信支付接入流程怎么设计？如何保证用户支付后积分/虚拟产品到账？&lt;/li&gt;
&lt;li&gt;支付为什么要使用异步队列？如果队列挂掉，如何保证支付结果和系统状态一致？&lt;/li&gt;
&lt;li&gt;回调验签具体流程是什么？&lt;/li&gt;
&lt;li&gt;MCP、SKILL 或其他工具如何辅助开发？&lt;/li&gt;
&lt;li&gt;产品经理缺失情况下，你们是如何自己出可交互草图和 PRD？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;HQ 公司&lt;a href=&quot;#hq-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;你日常使用 NextJS 多吗？&lt;/li&gt;
&lt;li&gt;你使用 TypeORM，有没有了解过 Prisma？调研时对比过优缺点吗？&lt;/li&gt;
&lt;li&gt;技术选型一般由谁来决定？&lt;/li&gt;
&lt;li&gt;NestJS 的依赖注入中，Provider 默认是单例，还是每次请求新建实例？讲讲单例模式的优点？&lt;/li&gt;
&lt;li&gt;如何给几十上百个接口统一增加操作日志/接口监控？&lt;/li&gt;
&lt;li&gt;说说 Nest 管道（Pipe）的概念、作用和使用场景？&lt;/li&gt;
&lt;li&gt;TypeORM 有哪两种运行模式？查询缓慢时，如何抓取它生成的 SQL 做调优？&lt;/li&gt;
&lt;li&gt;有没有使用过 PostgreSQL？了解 PG 物化视图吗？&lt;/li&gt;
&lt;li&gt;日常做过哪些 MySQL 慢查询、索引、SQL 优化？有没有分库分表、读写分离、数据库深度调优的实战经验？&lt;/li&gt;
&lt;li&gt;使用 Bull Queue 处理视频解析、Embedding 长任务，进程崩溃/K8S 重启后，任务会不会丢失？&lt;/li&gt;
&lt;li&gt;如何保证消息队列任务不丢失、保证任务一致性？&lt;/li&gt;
&lt;li&gt;任务重试会造成重复执行、重复调用大模型，你项目中如何做重复推理优化、降低成本？&lt;/li&gt;
&lt;li&gt;任务中途中断，如何实现断点续跑？前端如何感知后端任务中断、终止、运行状态？&lt;/li&gt;
&lt;li&gt;讲讲 SSE 和 WebSocket 的区别，以及各自适用场景？&lt;/li&gt;
&lt;li&gt;AGUI 协议动态渲染表单/卡片的整体实现流程？后端流式推送协议数据，前端如何实现边接收边流式渲染？&lt;/li&gt;
&lt;li&gt;了解该协议底层 API 设计逻辑吗？&lt;/li&gt;
&lt;li&gt;什么是数据库事务？结合你的项目，举例说明必须使用事务的业务场景？&lt;/li&gt;
&lt;li&gt;LangChain 不同版本/模块的区别？多智能体中动态路由如何根据条件分配任务分支？&lt;/li&gt;
&lt;li&gt;什么是查询改写？作用是什么？&lt;/li&gt;
&lt;li&gt;你们知识库使用什么向量库？Elasticsearch + 向量库怎么做混合检索？整体流程？&lt;/li&gt;
&lt;li&gt;混合检索已经做过分组、排序、去重，为什么还需要再次精排（Re-rank）？&lt;/li&gt;
&lt;li&gt;项目中有使用领域词典吗？&lt;/li&gt;
&lt;li&gt;Vue2 响应式原理，数组方法是如何重写拦截的？Vue2 中哪些数组方法无法被原生拦截？如何处理？&lt;/li&gt;
&lt;li&gt;Vue3 Proxy 相比 Vue2 的优势？Vue3 中的 WeakMap/弱引用作用是什么？&lt;/li&gt;
&lt;li&gt;解释下 Harness 相关概念？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;YU 公司&lt;a href=&quot;#yu-公司&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;你求职过程中，最看重工作的哪些方面？过往工作中，主要承担开发还是管理角色？&lt;/li&gt;
&lt;li&gt;日常使用哪些 AI 开发工具？通过什么渠道使用、费用及账号稳定性如何？&lt;/li&gt;
&lt;li&gt;工作中遇到过哪些棘手难题，如何解决？&lt;/li&gt;
&lt;li&gt;原公司技术部门、运维团队人员规模与架构是怎样的？&lt;/li&gt;
&lt;li&gt;从前端转型全栈，你是如何学习并胜任后端工作的？&lt;/li&gt;
&lt;li&gt;使用 AI 开发时，如何减少代码出错、降低重复劳动？&lt;/li&gt;
&lt;li&gt;借助 AI 开发后，你的工作效率在团队中处于什么水平？&lt;/li&gt;
&lt;li&gt;项目临近交付、出现前期未评估的风险问题，你会如何处理？&lt;/li&gt;
&lt;li&gt;你对未来职业规划如何，偏向纯技术还是技术+管理路线？&lt;/li&gt;
&lt;li&gt;公司前端、后端、算法及 AI 相关技术栈你是否了解？&lt;/li&gt;
&lt;li&gt;仅口头需求、无完整页面设计时，如何借助 AI 输出页面原型与 UI/UX 方案？&lt;/li&gt;
&lt;li&gt;业务方对原型提出新增功能、修改需求，你如何落地处理？&lt;/li&gt;
&lt;li&gt;业务方要求输出多版设计方案，你的执行思路是什么？&lt;/li&gt;
&lt;li&gt;针对当前 AI 生成的页面样式，从专业角度看存在哪些问题、该如何优化？&lt;/li&gt;
&lt;li&gt;重点介绍你过往和 AI、RAG 相关的核心项目与工作内容。&lt;/li&gt;
&lt;li&gt;项目中知识库的数据源来自哪里？&lt;/li&gt;
&lt;li&gt;向量检索使用了哪些工具、模型，如何实现、效果怎样、如何优化？&lt;/li&gt;
&lt;li&gt;项目中是否自主设计过智能体？具体实现方式是什么？&lt;/li&gt;
&lt;li&gt;产品面向哪些用户，整体功能架构是怎样的？&lt;/li&gt;
&lt;li&gt;你认为自身最擅长的工作环节是什么？除前端外还有哪些优势？&lt;/li&gt;
&lt;li&gt;后端相关工作接触深度如何？你在 UI/UX 设计方面的经验如何？结合 AI 落地怎么做？&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;以上是实打实被拷打的问题，通过录音让 AI 整理的，欢迎各位佬一起交流或者分享下你们的面经～&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;数据：&lt;/strong&gt; 2.6k 浏览量，497 赞，81 用户回复&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>归藏技能（Guizang Social Card Skill）小红书卡片制作流程</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-guizang-social-card%E5%B0%8F%E7%BA%A2%E4%B9%A6%E5%8D%A1%E7%89%87%E5%88%B6%E4%BD%9C%E6%B5%81%E7%A8%8B/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-guizang-social-card%E5%B0%8F%E7%BA%A2%E4%B9%A6%E5%8D%A1%E7%89%87%E5%88%B6%E4%BD%9C%E6%B5%81%E7%A8%8B/</guid><description>## 概述 使用 `guizang-social-card-skill`（已安装于 `/workspace/.omnibot/skills/guizang-social-card-skill/`）为文章生成小红书 ## 前置条件 ⚠️ 注意：Pexels 的图片 ID 随机，具体 URL 需从页面元素中提取。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;归藏技能（Guizang Social Card Skill）小红书卡片制作流程&lt;a href=&quot;#归藏技能guizang-social-card-skill小红书卡片制作流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;概述&lt;a href=&quot;#概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用 &lt;code&gt;guizang-social-card-skill&lt;/code&gt;（已安装于 &lt;code&gt;/workspace/.omnibot/skills/guizang-social-card-skill/&lt;/code&gt;）为文章生成小红书 3:4 图文卡片（1080×1440px）。本流程记录以”OpenClaw工作原理解析.md”为素材的完整制作经验。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;前置条件&lt;a href=&quot;#前置条件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;技能已安装：&lt;code&gt;skills_list | grep guizang&lt;/code&gt; 确认存在&lt;/li&gt;
&lt;li&gt;系统已装中文字体：&lt;code&gt;wqy-zenhei&lt;/code&gt;（文泉驿正黑），位于 &lt;code&gt;/usr/share/fonts/wqy-zenhei/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Chromium 浏览器：&lt;code&gt;/usr/bin/chromium-browser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Node.js + Puppeteer 用于渲染输出 PNG&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;完整工作流&lt;a href=&quot;#完整工作流&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Step 1：读取技能参考文件&lt;a href=&quot;#step-1读取技能参考文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 技能 SKILL.md 位于&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/workspace/.omnibot/skills/guizang-social-card-skill/SKILL.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 关键参考文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/style-system.md&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;# 风格系统（Swiss / Editorial 两种模式）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/layout-recipes.md&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 布局食谱&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/theme-presets.md&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 主题色板（Ink Classic / IKB Blue 等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/components.md&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# 组件规范（字体、间距、圆角等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/platform-specs.md&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 平台规格（小红书 1080×1440, 3:4）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;references/production-workflow.md&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 生产工作流&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;assets/template-swiss-card.html&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# Swiss 风格 HTML 模板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;assets/template-editorial-card.html&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 杂志风格 HTML 模板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 2：规划卡片内容与风格&lt;a href=&quot;#step-2规划卡片内容与风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;小红书规格&lt;/strong&gt;：1080×1440px（3:4），导出 PNG&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐风格&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swiss International&lt;/strong&gt;：科技、工程、AI 类文章（IKB Blue 强调色 #002FA7）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editorial Magazine x E-ink&lt;/strong&gt;：文艺、人文、生活类文章&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手绘可爱风（Doodle）&lt;/strong&gt;：需要自定义 CSS，参考本指南的”手绘风改造”部分&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 3：配置素材图片&lt;a href=&quot;#step-3配置素材图片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;三种方案&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;A. 用户自行提供截图/照片（推荐最自然）&lt;/li&gt;
&lt;li&gt;B. 从 Pexels/Unsplash 找免费素材图&lt;/li&gt;
&lt;li&gt;C. AI 生成插画&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;B 方案操作&lt;/strong&gt;（以 Pexels 为例）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 在 Pexels 搜索科技/AI 相关图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 打开图片详情页，通过 find_elements 找到下载链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 用 wget 下载到 assets/ 目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/social-card-openclaw/assets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;robot-hand-blue.jpg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://images.pexels.com/photos/8386437/pexels-photo-8386437.jpeg?cs=srgb&amp;amp;dl=pexels-tara-winstead-8386437.jpg&amp;amp;fm=jpg&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 注意：Pexels 的图片 ID 随机，具体 URL 需从页面元素中提取。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 4：编写 HTML 卡片&lt;a href=&quot;#step-4编写-html-卡片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;项目目录结构&lt;a href=&quot;#项目目录结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;social-card-&amp;lt;slug&amp;gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── index.html       # 所有卡片帧的 HTML&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── render.cjs       # Puppeteer 渲染脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── assets/          # 素材图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── output/          # 输出 PNG&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;HTML 结构要点&lt;a href=&quot;#html-结构要点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;每个卡片帧为一个 &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; 或 &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;，用 &lt;code&gt;id&lt;/code&gt; 区分&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;width: 1080px; height: 1440px;&lt;/code&gt; 匹配小红书规格&lt;/li&gt;
&lt;li&gt;文字和关键内容保持在安全区内（上下左右留 60-90px 边距）&lt;/li&gt;
&lt;li&gt;字体优先使用系统 WenQuanYi Zen Hei，避免 Google Fonts 加载失败&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;字体配置&lt;a href=&quot;#字体配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@font-face&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-family: &lt;/span&gt;&lt;span&gt;&apos;WQ&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;WenQuanYi Zen Hei&apos;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;文泉驿正黑&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-family: &lt;/span&gt;&lt;span&gt;&apos;WQ&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;Noto Sans SC&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sans-serif&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 务必使用 &lt;code&gt;@font-face&lt;/code&gt; 引用本地中文字体，防止 Chromium 脱机渲染时无法加载 Google Fonts 导致乱码或空白。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 5：渲染为 PNG&lt;a href=&quot;#step-5渲染为-png&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;方式 A：Puppeteer（推荐）&lt;a href=&quot;#方式-apuppeteer推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;安装依赖：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;social-card-&amp;lt;slug&amp;gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;puppeteer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;渲染脚本 &lt;code&gt;render.cjs&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;puppeteer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;puppeteer&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;path&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;puppeteer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;launch&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;headless&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;new&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;executablePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;/usr/bin/chromium-browser&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;--no-sandbox&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;--disable-gpu&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;--disable-software-rasterizer&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;newPage&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;setViewport&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1080&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1440&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 关键：添加 cache-busting 参数避免 Chromium 缓存旧文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;file://&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;resolve&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__dirname&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;index.html&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;?_=&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;networkidle0&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;evaluate&lt;/span&gt;&lt;span&gt;(() &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;fonts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ready&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setTimeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;)); &lt;/span&gt;&lt;span&gt;// 等字体和图片加载完成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 截取整个视口或特定元素&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;screenshot&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;output.png&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;png&apos;&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 或截取特定元素&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;.frame&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;screenshot&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;output/result.png&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;png&apos;&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;render.cjs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方式 B：Chromium 命令行截图&lt;a href=&quot;#方式-bchromium-命令行截图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chromium-browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--headless&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--disable-gpu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--screenshot=output.png&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--window-size=1080,1440&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;file://$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)/index.html?_=$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; +%s)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 此方式在 Alpine proot 环境中偶有截图内容为空的 bug，优先使用 Puppeteer。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 6：预览与迭代&lt;a href=&quot;#step-6预览与迭代&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用 &lt;code&gt;file_read&lt;/code&gt; 预览生成的 PNG：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;file_read(&quot;path/to/output.png&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;手绘可爱风格实现（Doodle Style）&lt;a href=&quot;#手绘可爱风格实现doodle-style&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;风格特征&lt;a href=&quot;#风格特征&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;暖色调纸纹背景（#fcf6eb / #faf3e8）&lt;/li&gt;
&lt;li&gt;SVG 手绘装饰元素：云朵、星星、爱心、波浪线&lt;/li&gt;
&lt;li&gt;拟人手绘感边框（虚线、波纹线）&lt;/li&gt;
&lt;li&gt;柔和 pastel 配色：粉色 #ffb5c2、蓝色 #b5d8f7、黄色 #f9d56e&lt;/li&gt;
&lt;li&gt;圆角、松散的手绘图标（纯 SVG 绘制）&lt;/li&gt;
&lt;li&gt;无科技感图片，用 SVG 可爱插画代替&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;手绘装饰 SVG 示例&lt;a href=&quot;#手绘装饰-svg-示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 云朵 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;path d=&quot;M28 62 Q10 50 16 33 Q10 16 28 14 Q32 -2 56 4 Q72 -4 90 8 Q108 0 116 20 Q128 26 120 45 Q126 56 108 62 Q88 68 66 58 Q44 68 28 62Z&quot; fill=&quot;#f0e0c8&quot; stroke=&quot;#d4c4a8&quot; stroke-width=&quot;2.5&quot;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 星星 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;path d=&quot;M16 2 L19 12 L30 12 L21 19 L24 30 L16 23 L8 30 L11 19 L2 12 L13 12Z&quot; fill=&quot;#f9d56e&quot; stroke=&quot;#e8b84a&quot; stroke-width=&quot;2&quot;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 手绘分割线 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;path d=&quot;M10 13 Q40 6 70 12 Q100 18 130 10 Q160 4 190 14 Q220 22 250 9 Q280 2 295 14 Q310 18 320 12&quot; stroke=&quot;#e0b896&quot; stroke-width=&quot;3&quot; fill=&quot;none&quot; stroke-linecap=&quot;round&quot;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;手机阅读字体大小经验值（1080px 画幅）&lt;a href=&quot;#手机阅读字体大小经验值1080px-画幅&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;元素&lt;/th&gt;&lt;th&gt;字号&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;主标题&lt;/td&gt;&lt;td&gt;76-84px&lt;/td&gt;&lt;td&gt;加粗，控制 1-2 行&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;标签/小标题&lt;/td&gt;&lt;td&gt;26-30px&lt;/td&gt;&lt;td&gt;点缀性文字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;步骤标题&lt;/td&gt;&lt;td&gt;36-40px&lt;/td&gt;&lt;td&gt;流程图的每一步&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;步骤描述&lt;/td&gt;&lt;td&gt;30-34px&lt;/td&gt;&lt;td&gt;正文说明文字，行高 1.5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;底部备注&lt;/td&gt;&lt;td&gt;24-26px&lt;/td&gt;&lt;td&gt;装饰性文字&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;流程卡片布局&lt;a href=&quot;#流程卡片布局&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用垂直时间线布局：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[步骤1图标] 步骤1标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;步骤1描述文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;|  (手绘竖线连接)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[步骤2图标] 步骤2标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;步骤2描述文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[步骤3图标] 步骤3标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;步骤3描述文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;每个步骤由 &lt;code&gt;item&lt;/code&gt; 容器实现：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;icn&lt;/code&gt;（固定宽度 76-90px，SVG 图标）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tx&lt;/code&gt;（弹性宽度，&lt;code&gt;tit&lt;/code&gt; + &lt;code&gt;desc&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;竖线用绝对定位 &lt;code&gt;step-line&lt;/code&gt; 或伪元素&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常见问题 &amp;amp; 解决方案&lt;a href=&quot;#常见问题--解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 修改 HTML 后渲染图片无变化&lt;a href=&quot;#1-修改-html-后渲染图片无变化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Chromium 会缓存 &lt;code&gt;file://&lt;/code&gt; URL 的内容，即使文件已更新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：在 URL 后添加随机查询参数（cache-busting）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;file://.../index.html?_=&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;或使用全新的文件名/目录路径，彻底避免缓存。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 汉字渲染为方块或乱码&lt;a href=&quot;#2-汉字渲染为方块或乱码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：系统缺少中文字体，或 Google Fonts 在离线环境无法加载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;使用本地字体：&lt;code&gt;@font-face { src: local(&apos;WenQuanYi Zen Hei&apos;), local(&apos;文泉驿正黑&apos;); }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不要依赖 &lt;code&gt;@import url(https://fonts.googleapis.com/...)&lt;/code&gt; 加载中文字体&lt;/li&gt;
&lt;li&gt;验证字体可用：&lt;code&gt;fc-list :lang=zh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Chromium 截图内容空白&lt;a href=&quot;#3-chromium-截图内容空白&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;可能原因&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--screenshot&lt;/code&gt; 参数与文件路径配合问题&lt;/li&gt;
&lt;li&gt;字体加载超时&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：改用 Puppeteer + &lt;code&gt;waitForSelector&lt;/code&gt; + &lt;code&gt;document.fonts.ready&lt;/code&gt; 确保完整加载。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. Puppeteer 找不到 Chromium&lt;a href=&quot;#4-puppeteer-找不到-chromium&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 指定系统预装的 Chromium&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;executablePath:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;/usr/bin/chromium-browser&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;技术栈速查&lt;a href=&quot;#技术栈速查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;路径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;guizang-social-card-skill&lt;/td&gt;&lt;td&gt;卡片设计规范与模板&lt;/td&gt;&lt;td&gt;&lt;code&gt;/workspace/.omnibot/skills/guizang-social-card-skill/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chromium&lt;/td&gt;&lt;td&gt;无头渲染引擎&lt;/td&gt;&lt;td&gt;&lt;code&gt;/usr/bin/chromium-browser&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Puppeteer&lt;/td&gt;&lt;td&gt;Node.js 截图控制&lt;/td&gt;&lt;td&gt;&lt;code&gt;node_modules/puppeteer&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WenQuanYi&lt;/td&gt;&lt;td&gt;中文字体&lt;/td&gt;&lt;td&gt;&lt;code&gt;/usr/share/fonts/wqy-zenihi/wqy-zenhei.ttc&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Node.js&lt;/td&gt;&lt;td&gt;运行渲染脚本&lt;/td&gt;&lt;td&gt;&lt;code&gt;/usr/bin/node&lt;/code&gt; (v22)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Python HTTP server&lt;/td&gt;&lt;td&gt;本地调试用（可选）&lt;/td&gt;&lt;td&gt;&lt;code&gt;python3 -m http.server&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;本次实践产出&lt;a href=&quot;#本次实践产出&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;最终卡片：&lt;code&gt;/workspace/cute-card/output.png&lt;/code&gt;（1080×1440 可爱手绘风）&lt;/li&gt;
&lt;li&gt;HTML 源码：&lt;code&gt;/workspace/cute-card/index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;渲染脚本：&lt;code&gt;/workspace/cute-card/render.cjs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文章原文：&lt;code&gt;/workspace/小万工作间/工程现场/实战.经验/OpenClaw工作原理解析.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>小红书笔记提取操作指南</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E5%B0%8F%E7%BA%A2%E4%B9%A6%E7%AC%94%E8%AE%B0%E6%8F%90%E5%8F%96%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E5%B0%8F%E7%BA%A2%E4%B9%A6%E7%AC%94%E8%AE%B0%E6%8F%90%E5%8F%96%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97/</guid><description>从小红书链接到结构化文档的完整工作流 ## 概述 从一个小红书(sharing)笔记链接开始，经过 **链接解析 → 笔记数据获取 → 图片下载 → OCR 文字识别 → 清洗整理**，最终得到可编辑、格式清晰的 Markdown 文档。 ⚠️ 注意：不要用 `uv run`（会重编 nuitka，极慢），直接用 venv Python 路径。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;小红书笔记提取操作指南&lt;a href=&quot;#小红书笔记提取操作指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;从小红书链接到结构化文档的完整工作流&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;概述&lt;a href=&quot;#概述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;从一个小红书(sharing)笔记链接开始，经过 &lt;strong&gt;链接解析 → 笔记数据获取 → 图片下载 → OCR 文字识别 → 清洗整理&lt;/strong&gt;，最终得到可编辑、格式清晰的 Markdown 文档。&lt;/p&gt;&lt;p&gt;适用场景：图文笔记（carousel）、普通文字笔记、含多张图片的长文笔记。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;流程图解&lt;a href=&quot;#流程图解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;小红书短链接 (xhslink.com)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;浏览器/API 解析为完整URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;获取笔记元数据（标题、标签、图片列表、描述）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├──纯文字笔记 → 直接提取文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└──图文/图片笔记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;下载全部图片（19张以内）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OCR 识别（中文简体）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;清洗整理 → 保存 Markdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;前置条件&lt;a href=&quot;#前置条件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Alpine 环境中需要安装的工具：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;方式 A：xhs CLI（推荐，适合快速读取）&lt;a href=&quot;#方式-axhs-cli推荐适合快速读取&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;uv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xiaohongshu-cli&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;配置文件路径：&lt;code&gt;~/.xiaohongshu-cli/cookies.json&lt;/code&gt;&lt;/p&gt;&lt;p&gt;需要三个 cookies：&lt;code&gt;a1&lt;/code&gt;、&lt;code&gt;webId&lt;/code&gt;、&lt;code&gt;web_session&lt;/code&gt;。其中 &lt;code&gt;web_session&lt;/code&gt; 通过调用 &lt;code&gt;login_activate()&lt;/code&gt; API 自动获取（HttpOnly cookie，无法手动提取）。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 获取 web_session 的示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; xhs_cli.client &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; XhsClient&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;client &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;XhsClient&lt;/span&gt;&lt;span&gt;(cookies)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;client.&lt;/span&gt;&lt;span&gt;login_activate&lt;/span&gt;&lt;span&gt;()  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 自动获取并保存 web_session&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;常用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;笔记URL&amp;gt;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 读取笔记（支持完整URL）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;关键词&amp;gt;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 按关键词搜索&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hot&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# 热门笔记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;feed&lt;/span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;# 推荐流&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方式 B：XHS-Downloader（适合下载图片和批量操作）&lt;a href=&quot;#方式-bxhs-downloader适合下载图片和批量操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;GitHub：JoeanAmier/XHS-Downloader v2.8&lt;/p&gt;&lt;p&gt;已安装在 &lt;code&gt;/workspace/xhs-downloader&lt;/code&gt;，venv 使用 &lt;code&gt;uv sync&lt;/code&gt; 创建。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动API服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/xhs-downloader&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main.py&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5556&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 调用API获取笔记详情&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://localhost:5556/xhs/detail&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&quot;url&quot;:&quot;&amp;lt;完整URL&amp;gt;&quot;,&quot;download&quot;:false}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 返回数据包含 title、desc、image_list（含所有图片URL）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 注意：不要用 &lt;code&gt;uv run&lt;/code&gt;（会重编 nuitka，极慢），直接用 venv Python 路径。
venv Python 路径示例：&lt;code&gt;/root/.cache/omnibot/uv-project-envs/.../bin/python&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;OCR 工具：Tesseract&lt;a href=&quot;#ocr-工具tesseract&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tesseract-ocr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tesseract-ocr-data-chi_sim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;验证安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tesseract&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--list-langs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输出应包含：chi_sim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准操作流程&lt;a href=&quot;#标准操作流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Step 1：获取完整笔记 URL&lt;a href=&quot;#step-1获取完整笔记-url&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;小红书分享链接是 &lt;code&gt;xhslink.com&lt;/code&gt; 短链，需要先解析。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式一：用浏览器 navigate 解析&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 通过 browser_use 工具的 navigate action&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;browser_use&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;navigate&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;http://xhslink.com/o/xxxxxx&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 结果中 currentUrl 即为完整的笔记 URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方式二：用 xhs CLI 直接读取&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http://xhslink.com/o/xxxxxx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果提示 &quot;No xsec_token — using HTML fallback&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 需要先解析出完整URL再重试&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;完整 URL 格式示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://www.xiaohongshu.com/discovery/item/{note_id}?xsec_token={token}&amp;amp;source=app_share&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 2：获取笔记数据&lt;a href=&quot;#step-2获取笔记数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用 xhs CLI 读取完整笔记数据：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://www.xiaohongshu.com/discovery/item/xxx?...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;返回的 YAML 格式数据包含：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;data.items[].note_card.title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;笔记标题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;data.items[].note_card.desc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;描述文本（含标签）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;data.items[].note_card.type&lt;/code&gt;&lt;/td&gt;&lt;td&gt;笔记类型（normal=图文，video=视频）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;data.items[].note_card.image_list&lt;/code&gt;&lt;/td&gt;&lt;td&gt;图片列表（含 url_default、width、height）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;关键操作：从 &lt;code&gt;image_list&lt;/code&gt; 中提取所有 &lt;code&gt;url_default&lt;/code&gt; 字段，得到图片下载链接。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 3：下载所有图片&lt;a href=&quot;#step-3下载所有图片&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编写 Python 脚本下载图片：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; urllib.request, os&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;urls &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;]  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 从 Step 2 提取的图片URL列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;img_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;/workspace/笔记名称_图片目录&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;os.&lt;/span&gt;&lt;span&gt;makedirs&lt;/span&gt;&lt;span&gt;(img_dir, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;exist_ok&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; i, url &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enumerate&lt;/span&gt;&lt;span&gt;(urls):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fname &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;img_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/page_&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:02d&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.webp&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;urllib.request.&lt;/span&gt;&lt;span&gt;urlretrieve&lt;/span&gt;&lt;span&gt;(url, fname)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;注意事项：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;图片格式为 &lt;code&gt;.webp&lt;/code&gt;，可直接用于 OCR&lt;/li&gt;
&lt;li&gt;图片数量通常 1-19 张&lt;/li&gt;
&lt;li&gt;注意请求频率，可加 &lt;code&gt;time.sleep(0.5)&lt;/code&gt; 避免被限&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 4：OCR 识别&lt;a href=&quot;#step-4ocr-识别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对所有图片执行 Tesseract OCR：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/笔记目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page_*.webp&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;===== &lt;/span&gt;&lt;span&gt;$f&lt;/span&gt;&lt;span&gt; =====&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tesseract&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stdout&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chi_sim&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出会按图片顺序展示识别文字。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 5：文字清洗与整理&lt;a href=&quot;#step-5文字清洗与整理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;OCR 输出存在常见问题需要清洗：&lt;/p&gt;&lt;section&gt;&lt;h4&gt;常见OCR噪声&lt;a href=&quot;#常见ocr噪声&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;噪声类型&lt;/th&gt;&lt;th&gt;示例&lt;/th&gt;&lt;th&gt;修正方法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;中文间多余空格&lt;/td&gt;&lt;td&gt;”尝 试 用”&lt;/td&gt;&lt;td&gt;正则去除汉字间空格&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;符号混淆&lt;/td&gt;&lt;td&gt;”一” 误为 ”-“&lt;/td&gt;&lt;td&gt;替换为正确符号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;英文拼写错误&lt;/td&gt;&lt;td&gt;”LLMI” → “LLM”&lt;/td&gt;&lt;td&gt;上下文精确替换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;标点符号错乱&lt;/td&gt;&lt;td&gt;”`”、”·“&lt;/td&gt;&lt;td&gt;替换为标准标点&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;换行位置错误&lt;/td&gt;&lt;td&gt;行末多余换行&lt;/td&gt;&lt;td&gt;按语义合并段落&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;清洗 Python 示例&lt;a href=&quot;#清洗-python-示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean_ocr_text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 去除中文之间的空格&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;\u4e00-\u9fff&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;\u4e00-\u9fff&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\1\2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, text)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 修正中文标点前的空格&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;\u4e00-\u9fff&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;，。；：？、！&lt;/span&gt;&lt;span&gt;\)\]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\1\2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, text)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 特定错误修正&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;LLMI&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;LLM&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;—&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;—&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; text.&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 6：组织为结构化文档&lt;a href=&quot;#step-6组织为结构化文档&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;按照原文的段落层次组织：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 笔记标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; 来源：小红书笔记 | OCR提取于 YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 一级标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;正文内容...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 二级标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;列表、表格、代码块...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;文档结构建议：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;保留原文的信息层级&lt;/li&gt;
&lt;li&gt;使用 Markdown 表格替代原文中的对比/分类内容&lt;/li&gt;
&lt;li&gt;代码目录结构用树形文本&lt;/li&gt;
&lt;li&gt;重要结论或原则用引用或加粗突出&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常见问题与处理&lt;a href=&quot;#常见问题与处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. xhs CLI 报 “Could not parse &lt;strong&gt;INITIAL_STATE&lt;/strong&gt; from HTML”&lt;a href=&quot;#1-xhs-cli-报-could-not-parse-initial_state-from-html&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 短链接(xhslink.com)未解析，或 xsec_token 缺失。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;先用浏览器 navigate 短链接，获取重定向后的完整 URL&lt;/li&gt;
&lt;li&gt;用完整 URL 重新执行 &lt;code&gt;xhs read&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. xhs CLI 提示 “No xsec_token”&lt;a href=&quot;#2-xhs-cli-提示-no-xsec_token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 缺少必要的安全参数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt; 需要完整 URL（含 xsec_token），而不是短链接。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Tesseract OCR 识别质量差&lt;a href=&quot;#3-tesseract-ocr-识别质量差&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因及对策：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;图片分辨率太低 → 使用原图 URL（非缩略图）&lt;/li&gt;
&lt;li&gt;中文识别率低 → 确保 &lt;code&gt;-l chi_sim&lt;/code&gt; 参数正确&lt;/li&gt;
&lt;li&gt;背景复杂干扰 → 避免保存干扰较大的缩略图版本&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 图片下载失败&lt;a href=&quot;#4-图片下载失败&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 网络问题或 CDN 限流。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;加 &lt;code&gt;time.sleep(1)&lt;/code&gt; 降低请求频率&lt;/li&gt;
&lt;li&gt;尝试切换为 &lt;code&gt;url_pre&lt;/code&gt; 或 &lt;code&gt;url_default&lt;/code&gt; 中的其他域名&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;完整执行示例&lt;a href=&quot;#完整执行示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以下是从链接到文档的完整终端命令序列：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 解析URL并获取笔记数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xhs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://www.xiaohongshu.com/...&quot;&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/note_data.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 提取图片URL并下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; &amp;lt;&amp;lt; &lt;/span&gt;&lt;span&gt;&apos;EOF&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 从YAML输出中提取 url_default 字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载到 /workspace/笔记名称_img/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. OCR识别&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/笔记名称_img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;page_*.webp&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tesseract&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stdout&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chi_sim&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/ocr_output.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 4. 清洗整理为Markdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; &amp;lt;&amp;lt; &lt;/span&gt;&lt;span&gt;&apos;EOF&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 读取OCR输出，清洗，组织为结构化文档&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;目录规范&lt;a href=&quot;#目录规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;笔记最终文档：&lt;code&gt;/workspace/小万工作间/笔记标题_全文.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;图片临时缓存：可放在 &lt;code&gt;/workspace/笔记简称/&lt;/code&gt;，完成清理后可删除&lt;/li&gt;
&lt;li&gt;OCR 原始输出：不需要保留，只保留清洗后的版本&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;参考资料&lt;a href=&quot;#参考资料&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;已安装 xhs CLI（&lt;code&gt;uv tool install xiaohongshu-cli&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;XHS-Downloader：&lt;code&gt;/workspace/xhs-downloader&lt;/code&gt;（GitHub: JoeanAmier/XHS-Downloader v2.8）&lt;/li&gt;
&lt;li&gt;Tesseract 文档：&lt;code&gt;https://github.com/tesseract-ocr/tesseract&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;本指南关联 Skill：&lt;code&gt;rednote-skill&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Codex日常开发工作流</title><link>https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-codex%E6%97%A5%E5%B8%B8%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E6%B5%81/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-codex%E6%97%A5%E5%B8%B8%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E6%B5%81/</guid><description># Codex 日常开发工作流 ## 背景 来源：实习经验分享 时间：2026-06-05 ## 工作流概览 每天到办公室的标准化流程： ### 1. 环境准备 - 打开电脑 - 启动 **4 个 Codex 实例**： - 1 个 VSC</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Codex 日常开发工作流&lt;a href=&quot;#codex-日常开发工作流&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;背景&lt;a href=&quot;#背景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;来源：实习经验分享&lt;br /&gt;
时间：2026-06-05&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;工作流概览&lt;a href=&quot;#工作流概览&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;每天到办公室的标准化流程：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 环境准备&lt;a href=&quot;#1-环境准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;打开电脑&lt;/li&gt;
&lt;li&gt;启动 &lt;strong&gt;4 个 Codex 实例&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;1 个 VSCode 插件&lt;/li&gt;
&lt;li&gt;1 个 Desktop 客户端&lt;/li&gt;
&lt;li&gt;2 个终端（终端 A、终端 B）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 需求对齐与规划（Desktop）&lt;a href=&quot;#2-需求对齐与规划desktop&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在 Desktop 中对齐需求&lt;/li&gt;
&lt;li&gt;进行任务拆解和规划&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;充分讨论&lt;/strong&gt;后，让 Codex 生成一套 prompt&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 执行阶段（终端 A）&lt;a href=&quot;#3-执行阶段终端-a&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用终端 A 开 &lt;strong&gt;plan 模式&lt;/strong&gt;执行&lt;/li&gt;
&lt;li&gt;Codex 的 plan 几乎直接执行，有时甚至不看、不拒绝&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 代码审查（终端 B + VSCode 插件）&lt;a href=&quot;#4-代码审查终端-b--vscode-插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;终端 B&lt;/strong&gt;：使用 &lt;code&gt;/review&lt;/code&gt; 命令进行 review&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VSCode 插件&lt;/strong&gt;：使用针对此次任务的定制 prompt 来 review，追踪代码&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 交付&lt;a href=&quot;#5-交付&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;审查通过后直接 push，创建 PR&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;核心原则&lt;a href=&quot;#核心原则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;代码从不手写&lt;/strong&gt; — 所有代码都由 Codex 生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;所有问题都问 Codex&lt;/strong&gt; — 碰到的任何问题，无一例外&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;充分讨论后再执行&lt;/strong&gt; — 规划阶段花足够时间，执行阶段高效推进&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;工作流图示&lt;a href=&quot;#工作流图示&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Desktop (需求对齐/规划)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓ 生成 prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;终端 A (plan 模式执行)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓ 代码产出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;终端 B (/review) + VSCode 插件 (定制 review)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓ 审查通过&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push → PR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键思考&lt;a href=&quot;#关键思考&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;这样会有提升吗？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这套流程的本质是把 &lt;strong&gt;人的角色从”写代码”转变为”审代码”&lt;/strong&gt;，核心价值在于：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;规划阶段充分思考，减少返工&lt;/li&gt;
&lt;li&gt;多维度 review（终端 + 插件交叉验证）&lt;/li&gt;
&lt;li&gt;所有问题都问 Codex，持续积累 prompt 经验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenClaw 工作原理解析：从消息输入到完整反馈</title><link>https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-openclaw%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-openclaw%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/</guid><description>OpenClaw 工作原理解析，重点梳理从用户消息进入系统到最终反馈输出的完整链路、上下文管理与智能体循环机制。</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OpenClaw 的架构，以及它处理智能体执行、工具调用、浏览器操作等功能的实现逻辑，其中诸多设计思路对 AI 工程师极具借鉴价值。深入了解 Clawd 的底层运行机制，能让我们更清晰地认识这套系统的功能边界，更重要的是，明确它的优势与短板。&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;Clawd 的技术本质&lt;a href=&quot;#clawd-的技术本质&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大家都知道，OpenClaw 是一款个人智能助手，可本地部署或通过大模型 API 调用，甚至在手机上就能轻松操作，但它的技术本质究竟是什么？OpenClaw 的核心是一个基于 TypeScript 开发的命令行应用（CLI），既非 Python 开发、也非基于 Next.js 的网页应用。作为一个独立运行进程，它的核心功能包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在本地设备运行并启动网关服务器，处理全渠道连接（电报、WhatsApp、斯拉克等）；&lt;/li&gt;
&lt;li&gt;调用大语言模型 API（Anthropic、OpenAI、本地模型等）；&lt;/li&gt;
&lt;li&gt;本地执行各类工具指令；&lt;/li&gt;
&lt;li&gt;实现用户对电脑的各类操作需求。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;技术框架&lt;a href=&quot;#技术框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为了更通俗地解释其架构，我们以”向 Clawd 发送消息到获取反馈”的完整流程为例说明。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/uploads/diagrams/openclaw-message-flow-tight.svg&quot; alt=&quot;OpenClaw 从发送消息到完整反馈的彩色手绘流程图&quot; /&gt;&lt;figcaption&gt;OpenClaw 从发送消息到完整反馈的彩色手绘流程图&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;（流程链路：用户消息 → 通道适配器 → 网关服务器 → 会话路由器 → 智能体运行器 → 模型解析器 → 系统提示词构建器 → 历史加载器 → 会话 → 任务通道队列 → 上下文窗口防护机制 → 大语言模型 API → 智能体循环 → 反馈通路 → 通道适配器 → 最终文本）&lt;/p&gt;&lt;p&gt;在即时通讯工具中向 Clawd 发送指令后，会依次触发以下环节：&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;1. 通道适配器&lt;a href=&quot;#1-通道适配器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通道适配器接收用户消息并进行预处理，包括消息标准化、提取附件等。不同的即时通讯工具和输入流，都配有专属的适配器。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;2. 网关服务器&lt;a href=&quot;#2-网关服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;作为任务与会话的协调中枢，网关服务器接收用户消息并将其分发至对应会话，是 Clawd 的核心模块，可处理多个并行的请求。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Clawd 为了防止 AI 在处理多任务时把数据搞乱（竞态条件），放弃了那种看似高级但容易出错的”多线程异步”写法，而是采用了最稳妥的”排队叫号（命令队列）“机制。默认所有任务都乖乖排队（串行），只有明确安全的任务才允许插队同时做（显式并行），从而保证了系统极高的稳定性和可靠性。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么，OpenClaw 怎么保证配置了一个 Agent，当有很多用户同时向他发送消息、让他处理任务的时候，怎么保证这个任务能够稳定执行呢？&lt;/p&gt;&lt;p&gt;我们可以把 OpenClaw 想象成一家 &lt;strong&gt;“只有一个超级大脑（Agent），但拥有完美管理系统的超级咨询公司”&lt;/strong&gt;。当一大群客户（多个用户）同时涌进来提需求时，为了保证这个超级大脑不崩溃、不串台、稳定输出，Clawd 设计了 &lt;strong&gt;五道防线&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;第一道防线：大堂经理精准分流（网关服务器）&lt;a href=&quot;#第一道防线大堂经理精准分流网关服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;当很多消息同时涌来时，第一步绝不能让所有消息直接砸到 Agent 脸上。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：网关服务器就像银行的”大堂经理”。它接收所有消息后，会根据来源（比如 Telegram、WhatsApp）和发送者，把消息精准分发到对应的 &lt;strong&gt;“会话（Session）”&lt;/strong&gt; 中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：确保张三的消息进了张三的档案袋，李四的消息进了李四的档案袋，&lt;strong&gt;物理隔离，绝不混淆&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;第二道防线：VIP 专属排队窗口（任务通道与命令队列）&lt;a href=&quot;#第二道防线vip-专属排队窗口任务通道与命令队列&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;（这里就用到了咱们上一问聊过的核心概念！）&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：网关分发后，&lt;strong&gt;每一个独立的会话，都会分配一个专属的”任务通道”&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;比喻&lt;/strong&gt;：就像银行给每个客户分配了&lt;strong&gt;专属的 VIP 柜台&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;张三在 1 号窗口，他的 5 个任务在 1 号窗口乖乖排队（串行执行）。&lt;/li&gt;
&lt;li&gt;李四在 2 号窗口，他的任务在 2 号窗口排队。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么能保稳定？&lt;/strong&gt; 因为 Agent 在 1 号窗口处理张三的任务时，绝对不会受到 2 号窗口李四任务的干扰。这就彻底消灭了前面提到的”竞态条件”（比如张三的任务和李四的任务同时去修改同一个文件导致崩溃）。&lt;strong&gt;各干各的，互不干扰，系统自然就稳了。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;第三道防线：大脑的”防过载与急救”机制（智能体运行器）&lt;a href=&quot;#第三道防线大脑的防过载与急救机制智能体运行器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;就算任务分开了，Agent 的”大脑（大模型 API）“和”记忆力（上下文窗口）“也是有限度的。Clawd 做了极其聪明的兜底设计：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;API 自动切换（备用大脑）&lt;/strong&gt;：如果当前使用的大模型 API（比如 Claude）突然宕机、限流或者密钥失效，智能体运行器会自动把这个密钥”关小黑屋（冷却）“，并&lt;strong&gt;瞬间切换到备用模型或备用密钥&lt;/strong&gt;。用户根本感觉不到中间出了故障。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文压缩（防脑爆）&lt;/strong&gt;：如果用户一直聊，对话记录太长，快把大模型的”上下文窗口（短期记忆容量）“撑爆了怎么办？系统不会直接崩溃，而是触发 &lt;strong&gt;“上下文防护机制”&lt;/strong&gt;——让大模型把前面的长对话&lt;strong&gt;总结压缩&lt;/strong&gt;成一段摘要，腾出空间继续工作；如果实在压缩不了，就”优雅降级”（体面地停止执行），而不是直接报错死机。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;第四道防线：防死循环的”安全绳”（智能体循环限制）&lt;a href=&quot;#第四道防线防死循环的安全绳智能体循环限制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：Agent 在执行任务时，经常需要调用工具（比如读文件、执行代码、上网搜索），这被称为”智能体循环”。Clawd 给这个循环设置了一个&lt;strong&gt;最大次数限制（默认约 20 次）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么能保稳定？&lt;/strong&gt; 假设 Agent 遇到了一个极其复杂的任务，或者因为理解错误陷入了”死循环”（比如一直在反复读取同一个报错文件）。如果没有安全绳，这个任务就会永远卡在那里，耗尽服务器资源。有了 20 次的限制，一旦达到上限，系统会&lt;strong&gt;强制掐断&lt;/strong&gt;，防止单个任务拖垮整个系统。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;第五道防线：影分身之术（子智能体机制）&lt;a href=&quot;#第五道防线影分身之术子智能体机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：如果某个用户的任务实在太庞大，主 Agent 还可以”生”出一个&lt;strong&gt;子智能体&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;比喻&lt;/strong&gt;：主 Agent 相当于项目经理，他把大任务拆分，派给子智能体（独立会话）去后台慢慢干。主 Agent 自己则腾出手来，继续接待其他新客户，或者通过”轮询”去查看子智能体的进度。这大大提高了系统的吞吐能力。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;3. 智能体运行器&lt;a href=&quot;#3-智能体运行器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是真正承载 AI 能力的模块。该模块会确定待调用的模型、匹配对应的 API 密钥（若密钥失效，会将该配置标记为冷却状态并尝试下一个），若主模型调用失败，会自动切换至备用模型。&lt;/p&gt;&lt;p&gt;智能体运行器会结合可用工具、技能、记忆内容动态生成系统提示词，再加入会话历史（存储于 .jsonl 文件），随后将完整提示词传入上下文窗口防护机制，校验是否有足够的上下文空间。若上下文空间即将耗尽，系统会选择压缩会话内容（对上下文进行总结）或优雅降级终止执行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;4. 大语言模型 API 调用&lt;a href=&quot;#4-大语言模型-api-调用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大模型调用环节会以流式方式返回结果，同时对不同服务商的 API 做了一层抽象封装；若所调用的模型支持深度思考功能，该模块还会触发模型的扩展思考逻辑。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;5. 智能体循环&lt;a href=&quot;#5-智能体循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;若大模型返回工具调用指令，Clawd 会在本地执行该指令，并将执行结果补充至对话中。这一过程会反复执行，直至大模型返回最终文本结果，或达到最大循环次数（默认约 20 次）。正是在这一环节，Clawd 实现了其核心能力——电脑操作功能。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;6. 反馈通路&lt;a href=&quot;#6-反馈通路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一环节的逻辑较为常规：执行结果会通过原消息通道反馈给用户，同时会话数据会以基础的 jsonl 格式持久化存储，文件中每行都是一个 json 对象，记录了用户消息、工具调用指令、执行结果、模型反馈等内容，这也是 Clawd 的记忆实现方式——基于会话的记忆机制。&lt;/p&gt;&lt;p&gt;以上就是 Clawd 的基础架构，接下来我们聊聊其中几个关键的核心模块。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;Clawd 的记忆机制&lt;a href=&quot;#clawd-的记忆机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;没有完善的记忆系统，AI 助手的能力便会大打折扣。Clawd 通过两套系统实现记忆功能：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;以 jsonl 格式存储的会话记录；&lt;/li&gt;
&lt;li&gt;存储为 Markdown 格式的记忆文件，文件位于 MEMORY.md 或 memory/ 文件夹中。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;在检索环节，Clawd 采用了向量检索与关键词匹配相结合的混合检索方式，兼具两种方式的优势。例如检索”认证漏洞（authentication bug）“时，系统既能找到提及”认证问题（auth issues）“的文档（语义匹配），也能精准定位包含该精确短语的内容（关键词匹配）。&lt;/p&gt;&lt;p&gt;其中，向量检索基于 SQLite 实现，关键词检索则借助 SQLite 的扩展模块 FTS5 完成，嵌入向量生成服务商支持自定义配置。这些 Markdown 记忆文件由智能体通过常规的”写入”文件工具生成，无专属的记忆写入 API，智能体只需向 memory/*.md 路径写入内容即可。&lt;/p&gt;&lt;p&gt;当新的对话开始时，系统会提取上一轮的对话内容，并将其总结为 Markdown 格式的文件。&lt;/p&gt;&lt;p&gt;Clawd 的记忆系统设计出乎意料地简洁，无需合并记忆文件，也无需按每月/每周的周期压缩记忆内容。这种简洁性是优势还是缺陷，因人而异，但我始终推崇可解释的简洁设计，而非混乱复杂的架构。&lt;/p&gt;&lt;p&gt;Clawd 的记忆会永久保存，且新老记忆的权重基本一致，不存在记忆衰减曲线。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;Clawd 的核心能力：电脑操作实现&lt;a href=&quot;#clawd-的核心能力电脑操作实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是 Clawd 的核心壁垒之一：可接管本地电脑并实现各类操作。其实现逻辑与大家的直观认知基本一致。&lt;/p&gt;&lt;p&gt;Clawd 会向智能体开放较高权限的电脑操作能力，相关风险由用户自行承担。它通过执行工具（exec tool）在设备上运行 Shell 命令，支持三种运行环境：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;沙箱环境（默认）&lt;/strong&gt;：命令在 Docker 容器中运行；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地宿主机&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远程设备&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;除此之外，Clawd 还配备了各类工具：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文件系统工具（支持读取、写入、编辑）；&lt;/li&gt;
&lt;li&gt;基于 Playwright 实现的浏览器工具，可生成语义快照；&lt;/li&gt;
&lt;li&gt;进程管理工具，用于执行后台长期运行的命令、终止进程等。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;安全机制（或近乎缺失？）&lt;a href=&quot;#安全机制或近乎缺失&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;与 Claude Code 类似，Clawd 为用户设置了命令白名单，用户可对各类命令进行权限审批，支持三种操作：单次允许、始终允许、拒绝，并会向用户弹出审批提示。Clawd 的安全机制与 Claude Code 的设计思路高度相似，核心是在用户允许的范围内，给予智能体最大的自主操作权限。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;浏览器工具：语义快照而非截图&lt;a href=&quot;#浏览器工具语义快照而非截图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Clawd 的浏览器工具并非主要依赖截图，而是采用语义快照——一种基于页面无障碍树（ARIA）的文本化表示形式。&lt;/p&gt;&lt;p&gt;所以 Agent 将看到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- textbox &quot;Email&quot; [ref=2]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- textbox &quot;Password&quot; [ref=3]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- link &quot;Forgot password?&quot; [ref=4]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- heading &quot;Welcome back&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- listitem &quot;Dashboard&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- listitem &quot;Settings&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这透露了四个显著优势。正如你可能已经猜到的，浏览网站并不一定是视觉上的任务。截图大小为 5 MB，语义快照则少于 50 KB，且仅占图像代币成本的一小部分。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;动态系统提示词&lt;a href=&quot;#动态系统提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;与大多数框架不同，Clawd 的系统提示词并非固定不变，而是结合技能、记忆检索结果、用户身份、时区等信息动态构建。其基础系统提示词如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 工具集&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;可用工具（按策略筛选）：工具名称区分大小写，需严格按列出的名称调用。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- read：读取文件内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- exec：运行 Shell 命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- browser：控制网页浏览器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[...仅显示该智能体可访问的工具]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 工具调用风格&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;默认规则：常规、低风险的工具调用无需说明（直接调用即可）；&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;仅在以下场景需补充说明：多步骤操作、复杂问题、敏感操作。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 子智能体/智能体生成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;智能体可以生成子智能体（但子智能体无法再生成下一级智能体）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;子智能体拥有独立会话，父子智能体通过 session_send 实现通信，&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;子智能体的执行结果会反馈给父智能体，&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;父智能体可通过轮询子智能体会话查看执行进度。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;上下文压缩&lt;a href=&quot;#上下文压缩&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当接近上下文长度限制时，智能体会将关键信息保存至记忆中。会话历史会被拆分为多个片段，由大语言模型对片段进行总结，最终合并为连贯的摘要，替换原始消息内容。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>个人AI工具使用盘点</title><link>https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-%E4%B8%AA%E4%BA%BAai%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8%E7%9B%98%E7%82%B9/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E5%B7%A5%E7%A8%8B%E7%8E%B0%E5%9C%BA-%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C-%E4%B8%AA%E4%BA%BAai%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8%E7%9B%98%E7%82%B9/</guid><description>linuxdo 最新AI资讯获取，在这里看其他人分享的开源项目，AI使用经验，踩坑记录等 ominibot手机端智能体，处理word,excel，获取各个网站信息保存为文档整理个人资料库 obsidian md阅读器，整理阅读信息 code</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;linuxdo 最新AI资讯获取，在这里看其他人分享的开源项目，AI使用经验，踩坑记录等
ominibot手机端智能体，处理word,excel，获取各个网站信息保存为文档整理个人资料库
obsidian md阅读器，整理阅读信息
codex,claude code cli搭配grillme,superpower技能实现规范高效率开发&lt;/p&gt;</content:encoded></item><item><title>01 Agent评测四层体系</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-01-agent%E8%AF%84%E6%B5%8B%E5%9B%9B%E5%B1%82%E4%BD%93%E7%B3%BB/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-01-agent%E8%AF%84%E6%B5%8B%E5%9B%9B%E5%B1%82%E4%BD%93%E7%B3%BB/</guid><description># Agent 评测四层体系 ## 第一层：保底 确保系统每次改动后仍能稳定运行，否则无法判断是否“改坏”。 ## 第二层：固定题目 benchmark 使用通过率、耗时和失败原因评估效果，而非凭感觉判断。 ## 第三层：过程记录 记录运行</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent 评测四层体系&lt;a href=&quot;#agent-评测四层体系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;第一层：保底&lt;a href=&quot;#第一层保底&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;确保系统每次改动后仍能稳定运行，否则无法判断是否“改坏”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第二层：固定题目 benchmark&lt;a href=&quot;#第二层固定题目-benchmark&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;使用通过率、耗时和失败原因评估效果，而非凭感觉判断。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第三层：过程记录&lt;a href=&quot;#第三层过程记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;记录运行过程以便复盘，避免只看到最终结果。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;第四层：线上反例回归&lt;a href=&quot;#第四层线上反例回归&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;将真实翻车的 case 放回评测集，使评测体系更贴近真实场景且更具说服力。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试价值&lt;a href=&quot;#面试价值&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;该体系回答了三个问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;指标来源&lt;/strong&gt;：说明指标可量化，并非主观编写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化验证&lt;/strong&gt;：证明优化过程可工程化验证，而非玄学。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统扩展性&lt;/strong&gt;：表明 Agent 评测是持续演进的闭环，而非一次性脚本。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;实践建议&lt;a href=&quot;#实践建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 Agent 项目中补充评测体系，展示可复现、可审计、可扩展的评测机制。这些上线时需考虑的实际细节往往更能打动面试官。&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;内容来源：用户提供的校招项目经验分享，已客观整理。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>02 0417字节Agent开发一面问题及参考回答</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-02-0417%E5%AD%97%E8%8A%82agent%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2%E9%97%AE%E9%A2%98%E5%8F%8A%E5%8F%82%E8%80%83%E5%9B%9E%E7%AD%94/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-02-0417%E5%AD%97%E8%8A%82agent%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2%E9%97%AE%E9%A2%98%E5%8F%8A%E5%8F%82%E8%80%83%E5%9B%9E%E7%AD%94/</guid><description># 0417字节Agent开发一面问题及参考回答 ## 3. 有没有观察过同一个模型在不同 context 长度下的表现差异？ **参考回答**： #精华 观察到随着 context 增长，模型对早期信息的记忆和关联能力显著下降，容易出现重</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;0417字节Agent开发一面问题及参考回答&lt;a href=&quot;#0417字节agent开发一面问题及参考回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;3. 有没有观察过同一个模型在不同 context 长度下的表现差异？&lt;a href=&quot;#3-有没有观察过同一个模型在不同-context-长度下的表现差异&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
#精华 观察到随着 context 增长，模型对早期信息的记忆和关联能力显著下降，容易出现重复操作或偏离初始目标。因此需要在代码中设计合理的上下文压缩和摘要机制，优先保留关键约束和历史决策依据。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;6. 讲一下你项目里面用户在终端发一条指令后，系统是怎么处理的？&lt;a href=&quot;#6-讲一下你项目里面用户在终端发一条指令后系统是怎么处理的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
#精华 用户输入指令后，系统首先会进行解析和上下文组装，然后调用 LLM 进行规划，生成工具调用序列。每一步工具执行的结果都会反馈给模型，模型根据结果决定是否继续调用工具或输出最终答案。整个过程会被记录下来，用于后续的复盘和优化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;7. 怎么减少这个链路里面Agent的幻觉？&lt;a href=&quot;#7-怎么减少这个链路里面agent的幻觉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
#精华 一是通过精细设计工具的 schema 和 description，让模型清楚知道能做什么、不能做什么；二是在上下文中显式注入关键约束和历史信息，减少模型“猜”的概率；三是引入验证环节，对模型输出的代码或操作进行静态检查或执行测试。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;8. Prompt是怎么构建的？&lt;a href=&quot;#8-prompt是怎么构建的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
Prompt 是模块化的，分为系统提示、用户指令、上下文片段、工具描述等部分。我会根据任务类型动态调整 Prompt 内容，比如长任务会加入更多历史摘要，复杂任务会加入 Few-shot 示例。所有 Prompt 的修改都会记录在案，便于复盘。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;17. 平常怎么学习新知识的？&lt;a href=&quot;#17-平常怎么学习新知识的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
主要通过阅读官方文档、复现开源项目、参与技术社区讨论、以及在实际项目中踩坑来学习。遇到问题时，会先查资料，再动手实验，最后总结成笔记或分享给他人，形成闭环。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我的回答：
#精华 乐于下载使用体验github热门的项目如openclaw
了解现在比较流行的ai coding工具如claude code codex opencode 。
加入了waytoagi，datawhale这些AI相关社区参与一些课程学习讨论。
我倾向于先实践边做边学，因为等学完所有知识准备好，可能已经比别人落后很多了。
遇到问题我会通过CSDN，linux do等专业网站以及谷歌搜索，询问chatgpt等寻找解决方案&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;1. 为什么要自己搞一个code agent？这个过程中你觉得哪部分是比较有挑战的？&lt;a href=&quot;#1-为什么要自己搞一个code-agent这个过程中你觉得哪部分是比较有挑战的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么要做code agent&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;第一是&lt;strong&gt;可控性&lt;/strong&gt;：Claude Code 这类产品对用户是黑盒（如 prompt 拼装、上下文组装、工具调用条件），难以判断正确或错误的原因。自己搭建可以把关键环节摊开看清楚。&lt;/li&gt;
&lt;li&gt;第二是&lt;strong&gt;隐私和部署要求&lt;/strong&gt;：实验室项目有保密约束，不适合放在外部闭源服务。项目预留了接开源模型的能力（如实验室部署的 Qwen），保证在保密场景下也能实际使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有挑战的部分&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;上下文工程&lt;/strong&gt;：长仓库任务中，模型在未超窗时利用长历史的质量会下降，出现偏离初始 spec、误用旧信息、重复操作等问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具设计&lt;/strong&gt;：tool description 和 schema 的小改动会显著影响完成率，工具粒度、装载方式的设计都需要仔细考虑。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2. 那你自己用的code agent，用过哪些？体验如何？&lt;a href=&quot;#2-那你自己用的code-agent用过哪些体验如何&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
主要使用过 Claude Code 和 Cursor。Claude Code 在复杂任务上表现较好，但黑盒严重；Cursor 在代码补全和局部修改上很顺手，但全局规划能力稍弱。自己开发主要是为了弥补两者的不足，实现完全可控和可定制。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4. Claude code源码泄漏了你有关注吗？有什么看法？&lt;a href=&quot;#4-claude-code源码泄漏了你有关注吗有什么看法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
关注到了。这提醒我们在使用闭源服务时要警惕“供应商锁定”和潜在的安全风险。这也进一步验证了自己开发可控 agent 的价值——数据和逻辑都在自己掌控范围内，避免敏感信息泄露风险。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5. Harness在你这个项目里面怎么体现的？&lt;a href=&quot;#5-harness在你这个项目里面怎么体现的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
在我的项目里，harness 主要体现在评测体系上。设计了一套四层评测机制，通过固定 benchmark、记录运行过程、回放真实翻车 case 等方式，确保每次改动都能被量化评估，而不是靠感觉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;9. 讲一下你的code agent的memory机制是怎么做的？&lt;a href=&quot;#9-讲一下你的code-agent的memory机制是怎么做的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
memory 机制分为短期和长期。短期 memory 是当前对话的上下文窗口，长期 memory 是将历史任务的关键信息（如代码结构、已完成步骤、用户偏好）进行向量化存储和检索，在需要时动态注入到上下文中。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;10. 任务恢复是什么意思，怎么做的？&lt;a href=&quot;#10-任务恢复是什么意思怎么做的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
任务恢复是指当 Agent 在执行过程中中断（如报错、超时、用户暂停）后，能够从上次状态继续执行。做法是记录每一步的执行状态和上下文快照，中断后读取快照，重新初始化 Agent 状态并继续执行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;11. 突然问了目前项目支不支持使用s…（可能是ssh或selenium等工具）&lt;a href=&quot;#11-突然问了目前项目支不支持使用s可能是ssh或selenium等工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
支持。比如如果需要远程操作服务器，会封装一个 ssh 工具；如果需要自动化测试网页，会封装 selenium 工具。工具的接入都需要定义清晰的 schema 和权限控制。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;12. 现在你这个pico里面有什么工具？&lt;a href=&quot;#12-现在你这个pico里面有什么工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
（pico 可能指项目代号或容器环境）目前集成了代码编辑器、文件读写、命令行执行、Git 操作、浏览器自动化、API 调用等工具，基本覆盖了日常开发的主要场景。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;13. 详细问了下怎么做的评测，怎么验证优化效果？&lt;a href=&quot;#13-详细问了下怎么做的评测怎么验证优化效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
设计了一套四层评测机制：第一层保底，确保系统稳定跑；第二层用固定题目做 benchmark，通过率、耗时、失败原因量化效果；第三层记录运行过程，方便复盘；第四层把线上真实翻车 case 放回评测集。优化后通过对比 benchmark 的通过率和耗时变化来验证效果，确保不是“玄学优化”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;14. 有没有用过claude code的 /btw 功能？&lt;a href=&quot;#14-有没有用过claude-code的-btw-功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
用过。/btw 是 Claude Code 的一个快捷指令，用于快速生成代码修改建议。这个功能很实用，但在项目里更倾向于通过结构化 Prompt 和工具调用来实现类似功能，更可控、更可复用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;15. 整个项目中ai coding的占比，会…（可能是“会占多少时间”或“会如何变化”）&lt;a href=&quot;#15-整个项目中ai-coding的占比会可能是会占多少时间或会如何变化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
AI coding 在项目初期占比很高，主要用于搭建框架和生成样板代码；中后期占比下降，更多用于代码审查、重构建议和复杂逻辑生成。总体来说，AI 是辅助工具，人的决策和架构设计仍是核心。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;16. 你觉得一个好的code agent应该具备哪些特质？&lt;a href=&quot;#16-你觉得一个好的code-agent应该具备哪些特质&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：
我认为一个好的 code agent 应该具备：① 可控性强，关键环节透明；② 工具丰富且设计合理；③ 上下文管理高效，能处理长任务；④ 具备自我验证和恢复能力；⑤ 评测体系完善，能持续迭代优化。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>03 小厂AI应用开发一面问题及参考回答</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-03-%E5%B0%8F%E5%8E%82ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2%E9%97%AE%E9%A2%98%E5%8F%8A%E5%8F%82%E8%80%83%E5%9B%9E%E7%AD%94/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-03-%E5%B0%8F%E5%8E%82ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2%E9%97%AE%E9%A2%98%E5%8F%8A%E5%8F%82%E8%80%83%E5%9B%9E%E7%AD%94/</guid><description># 小厂AI应用开发一面问题及参考回答 ## 4. 讲下skill的运作机制，skill的内容是以什么形式返回给大模型的？ **参考回答**： - **运作机制**：当用户提问或触发条件满足时，系统会从 skill 库中匹配最合适的 ski</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;小厂AI应用开发一面问题及参考回答&lt;a href=&quot;#小厂ai应用开发一面问题及参考回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;4. 讲下skill的运作机制，skill的内容是以什么形式返回给大模型的？&lt;a href=&quot;#4-讲下skill的运作机制skill的内容是以什么形式返回给大模型的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运作机制&lt;/strong&gt;：当用户提问或触发条件满足时，系统会从 skill 库中匹配最合适的 skill，然后将其内容注入到当前的 Prompt 上下文中，交由大模型处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;返回形式&lt;/strong&gt;：通常是以自然语言描述 + 结构化参数（JSON Schema）的形式。例如，先有一段描述该 skill 功能的说明文字，再附带一个定义好输入输出格式的 JSON Schema，让模型知道如何调用。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5. 上下文压缩的时机和方法？&lt;a href=&quot;#5-上下文压缩的时机和方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时机&lt;/strong&gt;：当检测到当前上下文长度接近模型上限（如 80% 阈值），或在多轮对话中历史信息开始冗余、对当前任务贡献度下降时触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;摘要压缩&lt;/strong&gt;：用模型对历史对话或长文本生成摘要，保留核心信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键信息提取&lt;/strong&gt;：抽取实体、动作、意图等关键要素，丢弃次要描述。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;滑动窗口&lt;/strong&gt;：只保留最近的 N 轮对话，丢弃较早的上下文。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;6. #精华 进行完这个agent优化后有什么可量化的效果？&lt;a href=&quot;#6-精华-进行完这个agent优化后有什么可量化的效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;准确率提升&lt;/strong&gt;：如任务完成率从 70% 提升到 85%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应速度加快&lt;/strong&gt;：平均响应时间从 5s 降低到 3s。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token 成本下降&lt;/strong&gt;：通过上下文压缩和缓存，单次请求平均 Token 消耗减少 30%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户满意度提升&lt;/strong&gt;：如 NPS 评分或人工评估得分提高。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;1. skill沉淀怎么处理的？&lt;a href=&quot;#1-skill沉淀怎么处理的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;通常会将业务方或开发者编写的 skill 沉淀到结构化存储中（如数据库、向量数据库或配置文件）。&lt;/li&gt;
&lt;li&gt;沉淀时会包含 skill 的元数据（如名称、描述、触发条件）、核心逻辑（如 Prompt 模板、工具调用 Schema）以及版本信息，以便后续检索、复用和迭代。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2. 对拉取的skill做了缓存，是为了处理什么情况？是怎么考虑何时更新缓存的？&lt;a href=&quot;#2-对拉取的skill做了缓存是为了处理什么情况是怎么考虑何时更新缓存的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：主要是为了提升性能，减少每次请求时重复加载 skill 的延迟；同时降低后端存储或外部服务的压力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新策略&lt;/strong&gt;：通常采用 TTL（Time To Live）+ 主动失效机制。例如，设置缓存过期时间（如1小时），或者在 skill 被编辑/更新时，通过消息队列或钩子函数主动清除对应缓存，确保下次拉取的是最新版本。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3. 如果业务方有人写了过长的skill会导致什么问题？&lt;a href=&quot;#3-如果业务方有人写了过长的skill会导致什么问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文溢出&lt;/strong&gt;：过长的 skill 容易撑爆大模型的上下文窗口，导致关键指令被截断，模型理解偏差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能下降&lt;/strong&gt;：Prompt 过长会增加模型推理时间，提高 Token 消耗成本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;噪音干扰&lt;/strong&gt;：冗余内容可能干扰模型注意力，降低任务执行的准确性和稳定性。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;7. 怎么处理内置和业务自定义skill的冲突问题？&lt;a href=&quot;#7-怎么处理内置和业务自定义skill的冲突问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;命名空间隔离&lt;/strong&gt;：内置 skill 和业务 skill 使用不同的命名前缀或目录结构，避免同名冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先级机制&lt;/strong&gt;：定义明确的优先级规则（如内置 skill 优先级高于业务 skill，或反之），在匹配时按优先级选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冲突检测告警&lt;/strong&gt;：在 skill 注册或更新时，自动检测是否存在同名或功能重叠的 skill，提示人工审核。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;8. 为什么要使用multi-agent架构？&lt;a href=&quot;#8-为什么要使用multi-agent架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责分离&lt;/strong&gt;：不同 agent 专注不同任务（如查询、分析、执行），代码结构更清晰，易于维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能力扩展&lt;/strong&gt;：可独立扩展某个子 agent 的能力（如增加工具、优化 Prompt），不影响整体系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作效率&lt;/strong&gt;：主 agent 负责任务分解和调度，子 agent 并行或串行执行，提升复杂任务的完成效率。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;9. 主agent与子agent如何通信？能否访问对方的memory？&lt;a href=&quot;#9-主agent与子agent如何通信能否访问对方的memory&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通信方式&lt;/strong&gt;：通常通过消息队列（如 Redis、RabbitMQ）或 HTTP/RPC 接口进行异步或同步通信。主 agent 将任务指令发送给子 agent，子 agent 完成后返回结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory 访问&lt;/strong&gt;：一般不直接访问对方的 memory。每个 agent 的 memory 是其内部状态（如对话历史、中间结果），通过通信传递所需数据，保持模块解耦。如需共享状态，可通过共享存储（如数据库）或上下文对象传递。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;10. 这个DAG工作流有没有使用什么已有的AI框架还是自己实现的？&lt;a href=&quot;#10-这个dag工作流有没有使用什么已有的ai框架还是自己实现的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;选择自己实现，因为现有框架（如 LangChain、AutoGen）虽然封装完善，但往往存在过度抽象、黑盒化、扩展性差、性能损耗等问题。自己实现可以更精细地控制每个节点的执行逻辑、错误处理和状态管理，更好地贴合业务需求，也便于后续优化和调试。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;AI Coding环节：实现一个todo辅助agent&lt;a href=&quot;#ai-coding环节实现一个todo辅助agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考思路&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：添加任务、删除任务、标记完成、查看列表、设置提醒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术点&lt;/strong&gt;：使用 Python + Flask/FastAPI 提供 API，或命令行交互；用 SQLite/JSON 存储任务；可接入大模型实现自然语言解析（如“提醒我明天开会” → 解析为任务+时间）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码结构&lt;/strong&gt;：主类 &lt;code&gt;TodoAgent&lt;/code&gt;，包含 &lt;code&gt;add_task&lt;/code&gt;、&lt;code&gt;remove_task&lt;/code&gt;、&lt;code&gt;list_tasks&lt;/code&gt;、&lt;code&gt;complete_task&lt;/code&gt; 等方法，支持命令行或 HTTP 调用。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;反问：进去以后的业务内容方向&lt;a href=&quot;#反问进去以后的业务内容方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考回答（作为候选人提问）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“请问团队目前在 AI Agent 应用方面主要聚焦哪些业务场景？是偏向内部提效工具，还是面向外部用户的商业化产品？”&lt;/li&gt;
&lt;li&gt;“未来半年内，团队在 Agent 架构、多模态能力或工程化落地方面有哪些重点规划？我可以提前做哪些准备？”&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;：以上回答基于行业常见实践整理，实际面试中请根据个人项目经验调整。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>04 分享一些有效的AI Agent项目面试话术</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-04-%E5%88%86%E4%BA%AB%E4%B8%80%E4%BA%9B%E6%9C%89%E6%95%88%E7%9A%84ai-agent%E9%A1%B9%E7%9B%AE%E9%9D%A2%E8%AF%95%E8%AF%9D%E6%9C%AF/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-04-%E5%88%86%E4%BA%AB%E4%B8%80%E4%BA%9B%E6%9C%89%E6%95%88%E7%9A%84ai-agent%E9%A1%B9%E7%9B%AE%E9%9D%A2%E8%AF%95%E8%AF%9D%E6%9C%AF/</guid><description># 分享一些有效的AI Agent项目面试话术 ## 问题背景 大家面试是不是也有这样的经历：明明自己亲手做过项目，但是面试过程中越说越虚，张口就说&quot;我做了RAG、重排序、状态管理&quot;，术语都没错，但面试官只会觉得你只看过方案，根本不像落地做</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;分享一些有效的AI Agent项目面试话术&lt;a href=&quot;#分享一些有效的ai-agent项目面试话术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题背景&lt;a href=&quot;#问题背景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;大家面试是不是也有这样的经历：明明自己亲手做过项目，但是面试过程中越说越虚，张口就说”我做了RAG、重排序、状态管理”，术语都没错，但面试官只会觉得你只看过方案，根本不像落地做过项目。&lt;/p&gt;&lt;p&gt;想让Agent的项目听起来百分百是自己实操落地，核心不是背更多技术名词，而是用&lt;strong&gt;有过程、有细节、有思考的表达&lt;/strong&gt;还原真实项目逻辑。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四个核心优化步骤&lt;a href=&quot;#四个核心优化步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;一、先讲业务场景，不说技术名词&lt;a href=&quot;#一先讲业务场景不说技术名词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误开场&lt;/strong&gt;：千万不要开口就说我做了一套多Agent的系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：先讲清楚你解决的真实问题，明确项目面向的业务场景、用户痛点、核心目标，后面所有技术选型才有落地意义。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例话术&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我做的是&lt;strong&gt;XX场景的智能应用&lt;/strong&gt;，核心解决用户复杂问题无法单次处理、人工操作繁琐低效的痛点。通过任务拆解、实时检索、工具自动执行，降低人工成本，提升任务处理效率。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;二、少讲最终用了什么，多讲方案的迭代过程&lt;a href=&quot;#二少讲最终用了什么多讲方案的迭代过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误做法&lt;/strong&gt;：只说”我们用了多Agent架构”——完全没有说服力。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：真正做过的人一定会讲方案从零到一的迭代逻辑：最初的方案是什么、为什么要推翻、遇到了什么问题才改成最终版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例话术&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我最开始用单Agent完成规划+执行的全流程，最后发现任务链路一旦拉长，任意环节出错就会导致整个任务失败，且问题极难定位排查。因此后续拆分出规划、执行分别优化提示词、管控工具调用，大幅提升系统的稳定性与可维护性。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;三、不说空泛优化，讲具体改动与效果&lt;a href=&quot;#三不说空泛优化讲具体改动与效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误做法&lt;/strong&gt;：“我做了RAG优化，加了重排序，提升效果”——这是空话。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：必须讲明白原来的方案存在的问题、修改了什么、优化后的结果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例话术&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;最初那个模块直接将召回的文本全部塞入上下文，召回条数过多时，模型就极易被无关的噪声干扰，生成内容质量下降。后续我新增重排序模块，将召回的Top 10调整为Top 5，优先保留高相关度的内容，有效过滤噪声，让模型输出更精准稳定。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;四、抛弃抽象术语，多用落地动作描述&lt;a href=&quot;#四抛弃抽象术语多用落地动作描述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误做法&lt;/strong&gt;：“做了状态管理、做了容错处理、做了工程优化”——抽象表达听起来专业，实则毫无实感。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：把抽象名词换成你亲手做了什么具体动作、解决的实际问题，真实感瞬间拉满。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例话术&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;因为Agent要处理多步连贯任务，中间产生的结果后续环节需要复用，所以我单独设计了任务状态持久化存储。单个工具调用超时或者异常时，可以从断点恢复执行，不需要从头重启整个任务链路，减少重复消耗，提升任务成功率。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;万能面试表达公式&lt;a href=&quot;#万能面试表达公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以直接套用的四步表达逻辑：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先讲业务痛点与目标&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再讲初版方案与落地问题&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接着讲踩过的坑与迭代改动&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后讲优化效果与价值&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;核心原则&lt;/strong&gt;：项目从来不怕复杂度低，最怕没有细节、没有迭代、没有独立思考。把这套逻辑讲清楚，面试官会直接认定你是真正落地过项目的人选。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;常用术语对照&lt;a href=&quot;#常用术语对照&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;语音转录原文&lt;/th&gt;&lt;th&gt;实际术语&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;a站 / a镇&lt;/td&gt;&lt;td&gt;Agent&lt;/td&gt;&lt;td&gt;智能体&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多a点&lt;/td&gt;&lt;td&gt;多Agent&lt;/td&gt;&lt;td&gt;多智能体架构&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rap&lt;/td&gt;&lt;td&gt;RAG&lt;/td&gt;&lt;td&gt;检索增强生成&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rick to&lt;/td&gt;&lt;td&gt;RAG&lt;/td&gt;&lt;td&gt;检索增强生成&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;长久处理&lt;/td&gt;&lt;td&gt;任务处理&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;出版方案&lt;/td&gt;&lt;td&gt;初版方案&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;本文档由视频语音转录整理，原始视频：分享一些有效的AI Agent项目面试话术&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>05 Agent项目大厂实习建议 小红书笔记</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-05-agent%E9%A1%B9%E7%9B%AE%E5%A4%A7%E5%8E%82%E5%AE%9E%E4%B9%A0%E5%BB%BA%E8%AE%AE-%E5%B0%8F%E7%BA%A2%E4%B9%A6%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-05-agent%E9%A1%B9%E7%9B%AE%E5%A4%A7%E5%8E%82%E5%AE%9E%E4%B9%A0%E5%BB%BA%E8%AE%AE-%E5%B0%8F%E7%BA%A2%E4%B9%A6%E7%AC%94%E8%AE%B0/</guid><description># Agent 项目冲大厂实习建议（摘自小红书笔记） &gt; 来源：小红书「黄同学h」 &gt; 链接：http://xhslink.com/o/9Nubmmnrl54 &gt; 抓取时间：2026-05-31 --- ## 🚫 简历上太多人做的&quot;过时&quot;项</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent 项目冲大厂实习建议（摘自小红书笔记）&lt;a href=&quot;#agent-项目冲大厂实习建议摘自小红书笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书「黄同学h」&lt;br /&gt;
链接：&lt;a href=&quot;http://xhslink.com/o/9Nubmmnrl54&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/9Nubmmnrl54&lt;/a&gt;&lt;br /&gt;
抓取时间：2026-05-31&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;🚫 简历上太多人做的”过时”项目（容易沉底）&lt;a href=&quot;#-简历上太多人做的过时项目容易沉底&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目类型&lt;/th&gt;&lt;th&gt;问题所在&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;聊天助手&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2024 年还行，现在已经不够看了&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;旅游 Agent&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;缺少包装且太多人做，毫无差异化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;各种 RAG（BM25 + Reranking）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;面试官都背熟了，毫无惊喜&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LoRA 微调 / 爆改模型结构&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;面 Agent 岗却做算法方向，方向不对口&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;✅ 作者认为好的 Agent 项目应具备的要素&lt;a href=&quot;#-作者认为好的-agent-项目应具备的要素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;展示技术 taste（审美）&lt;/strong&gt;&lt;br /&gt;
—— 2026 年了，讲点类似 OpenClaw 或 Claude Code 的架构，面试官才会感兴趣&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;展示技术深度&lt;/strong&gt;&lt;br /&gt;
—— 在 1-2 个模块深入展开，要有方案设计和 trade-off 分析&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;有差异度&lt;/strong&gt;&lt;br /&gt;
—— 别人都是智能客服 / RAG，你掏出 Code Agent，面试就不无聊了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;有合理场景设计&lt;/strong&gt;&lt;br /&gt;
—— 支撑「业务场景 → 方案设计 → 收益」式的项目描写链路&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🎯 作者推荐方向：轻量化 Code Agent&lt;a href=&quot;#-作者推荐方向轻量化-code-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;贴合面试官日常使用场景，面试时有共同话题可聊&lt;/li&gt;
&lt;li&gt;设计克制，不堆砌功能&lt;/li&gt;
&lt;li&gt;附带完整代码、文档和配套笔记&lt;/li&gt;
&lt;li&gt;据称已有同学通过该项目拿到 &lt;strong&gt;腾讯、字节、阿里、Pico&lt;/strong&gt; 等实习&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 注：该笔记本质上是作者推广其付费项目的营销内容，但项目选题思路和简历包装方向有一定参考价值。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>06 AI应用开发面试复盘 老颂</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-06-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98-%E8%80%81%E9%A2%82/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-06-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98-%E8%80%81%E9%A2%82/</guid><description># AI 应用开发岗位面试复盘（摘自小红书笔记） &gt; 来源：小红书「AI践行者-老颂」 &gt; 标题：上午面了一个AI应用候选人，说实话有点可惜 &gt; 抓取时间：2026-05-31 --- ## 面试概况 候选人简历写得很满：LangChain</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI 应用开发岗位面试复盘（摘自小红书笔记）&lt;a href=&quot;#ai-应用开发岗位面试复盘摘自小红书笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书「AI践行者-老颂」&lt;br /&gt;
标题：上午面了一个AI应用候选人，说实话有点可惜&lt;br /&gt;
抓取时间：2026-05-31&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;面试概况&lt;a href=&quot;#面试概况&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;候选人简历写得很满：LangChain、RAG、微调、提示词工程、向量数据库、模型部署都有，但一问细节就露馅了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;暴露的四大短板&lt;a href=&quot;#暴露的四大短板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1️⃣ RAG 基础不扎实&lt;a href=&quot;#1️⃣-rag-基础不扎实&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;面试追问&lt;/th&gt;&lt;th&gt;暴露问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;向量数据库是干什么的？&lt;/td&gt;&lt;td&gt;回答模糊&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;分块策略？为什么很多场景用固定大小滑动窗口？&lt;/td&gt;&lt;td&gt;卡住答不上&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;用户问专业问题，模型答非所问，第一步查什么？&lt;/td&gt;&lt;td&gt;思路混乱&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;真正做过的人会怎么答？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;直接联想到 &lt;strong&gt;召回的上下文相关性、prompt 约束是否到位&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;会用 &lt;strong&gt;评估集跑一遍不同分块和召回策略的效果对比&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2️⃣ 提示词工程停留在表面&lt;a href=&quot;#2️⃣-提示词工程停留在表面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;“做过 prompt 优化、提示词工程”&lt;br /&gt;
→ 一问 &lt;strong&gt;结构化 prompt 的设计原则&lt;/strong&gt;，答不上来&lt;br /&gt;
→ 说明平时只是在 &lt;strong&gt;“改现成模板”&lt;/strong&gt;，不是理解系统逻辑&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3️⃣ 工程意识 / 可靠性设计不足&lt;a href=&quot;#3️⃣-工程意识--可靠性设计不足&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;需要思考的问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户输入恶意指令或无关问题，模型乱输出怎么办？&lt;/li&gt;
&lt;li&gt;上下文窗口溢出，系统怎么降级？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;比较稳妥的方案（至少要说出来）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输入校验 → 意图识别 → 敏感词过滤 → 上下文截断策略 → 错误兜底话术&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;关键设计原则：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;先校验用户输入，再决定是否调用模型&lt;/li&gt;
&lt;li&gt;对关键输出做 &lt;strong&gt;二次校验和格式解析&lt;/strong&gt;，再返回给用户&lt;/li&gt;
&lt;li&gt;不是为了”好看”，是为了系统不会因为一次异常请求直接崩掉&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4️⃣ 性能优化只停留在表面&lt;a href=&quot;#4️⃣-性能优化只停留在表面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多人只会说 &lt;strong&gt;“用了流式输出”&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;真正做过的会继续讲：&lt;/strong&gt;&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优化维度&lt;/th&gt;&lt;th&gt;具体做法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;缓存&lt;/td&gt;&lt;td&gt;调用前哪些步骤可以缓存&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;批处理&lt;/td&gt;&lt;td&gt;哪些请求可以批量处理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;超时策略&lt;/td&gt;&lt;td&gt;模型推理超时怎么设置，重试还是降级&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上下文管理&lt;/td&gt;&lt;td&gt;上下文太长时怎么做摘要，效果和成本之间怎么权衡&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;这些细节，才是工程能力。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🎯 面试准备建议（原文总结）&lt;a href=&quot;#-面试准备建议原文总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;把自己做过的一个项目重新拆一遍：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;业务需求&lt;/strong&gt; — 怎么对齐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 设计&lt;/strong&gt; — 怎么设计&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt&lt;/strong&gt; — 怎么写&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常兜底&lt;/strong&gt; — 怎么兜&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt; — 怎么优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据处理&lt;/strong&gt; — 怎么处理&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;再把高频模块整理成 &lt;strong&gt;“四件套”&lt;/strong&gt;：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;原理 → 配置 → 常见问题 → 排查方法&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;💡 核心观点&lt;a href=&quot;#-核心观点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;企业现在更看重的，不是你会不会调个 API，而是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;出了问题你能不能&lt;strong&gt;定位&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;系统异常你能&lt;strong&gt;不能兜住&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;方案落地后你能&lt;strong&gt;不能让它稳定跑起来&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🏷️ 标签&lt;a href=&quot;#️-标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;#AI大模型&lt;/code&gt; &lt;code&gt;#LLM应用开发&lt;/code&gt; &lt;code&gt;#面试技巧&lt;/code&gt; &lt;code&gt;#求职&lt;/code&gt; &lt;code&gt;#程序员转型&lt;/code&gt; &lt;code&gt;#RAG&lt;/code&gt; &lt;code&gt;#技术干货&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>07 字节一面面经 JiexinX</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-07-%E5%AD%97%E8%8A%82%E4%B8%80%E9%9D%A2%E9%9D%A2%E7%BB%8F-jiexinx/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-07-%E5%AD%97%E8%8A%82%E4%B8%80%E9%9D%A2%E9%9D%A2%E7%BB%8F-jiexinx/</guid><description># 字节一面面经（AI/后端方向） &gt; 来源：小红书「Jiexin.X」 &gt; 岗位方向：AI 应用 / 后端开发 &gt; 抓取时间：2026-05-31 --- ## 面试流程（22题全记录） ### 项目 &amp; 经历环节 | 序号 | 问题 |</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;字节一面面经（AI/后端方向）&lt;a href=&quot;#字节一面面经ai后端方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书「Jiexin.X」&lt;br /&gt;
岗位方向：AI 应用 / 后端开发&lt;br /&gt;
抓取时间：2026-05-31&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;面试流程（22题全记录）&lt;a href=&quot;#面试流程22题全记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;项目 &amp;amp; 经历环节&lt;a href=&quot;#项目--经历环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;候选人回答 / 表现&lt;/th&gt;&lt;th&gt;反思&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;自我介绍&lt;/td&gt;&lt;td&gt;✅ 完成&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;项目是网上找的还是什么？&lt;/td&gt;&lt;td&gt;老实承认&lt;/td&gt;&lt;td&gt;❌ 不要纯诚实，可以包装一下项目来源&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;有实习过吗？&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;❌ 实习经历是重要加分项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;项目中挑战最大的是什么？&lt;/td&gt;&lt;td&gt;答了微调，面试官说没听懂产出，解释后仍跳过&lt;/td&gt;&lt;td&gt;❌ 项目挑战要说清楚”问题→方案→收益”链路&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;出现幻觉怎么处理？&lt;/td&gt;&lt;td&gt;提示词 → 工具 → RAG → 微调&lt;/td&gt;&lt;td&gt;✅ 架构意识有，但深度不够&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;提示词具体怎么做？&lt;/td&gt;&lt;td&gt;要基于真实内容回答，不知道就说不知道&lt;/td&gt;&lt;td&gt;⚠️ 太基础&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;还有其他提示词吗？&lt;/td&gt;&lt;td&gt;想不到了&lt;/td&gt;&lt;td&gt;❌ 缺少结构化 prompt 储备&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Agent 短期/长期记忆怎么实现？&lt;/td&gt;&lt;td&gt;答得不好&lt;/td&gt;&lt;td&gt;❌ 高频考点，必须准备&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;设计一个 Agent 要考虑哪些模块？&lt;/td&gt;&lt;td&gt;答得一坨（太开放）&lt;/td&gt;&lt;td&gt;❌ 需要准备系统架构图式的回答&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;API 超时和报错怎么解决？&lt;/td&gt;&lt;td&gt;根据重要程度处理&lt;/td&gt;&lt;td&gt;⚠️ 太笼统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;有没有考虑用大模型自己排查 API 超时和报错？&lt;/td&gt;&lt;td&gt;说了 SKILL&lt;/td&gt;&lt;td&gt;✅ 但可深入&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;消耗 token 过快怎么排查？&lt;/td&gt;&lt;td&gt;说了 SKILL 和压缩&lt;/td&gt;&lt;td&gt;✅ 但不够系统&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Java / 计算机基础环节&lt;a href=&quot;#java--计算机基础环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;候选人回答&lt;/th&gt;&lt;th&gt;反思&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;讲一下 Java 线程池&lt;/td&gt;&lt;td&gt;✅ 吟唱八股&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;重新设计一个线程池会怎么设计？&lt;/td&gt;&lt;td&gt;答得一坨（牛客刷到过但没在意）&lt;/td&gt;&lt;td&gt;❌ 八股要理解原理，能举一反三&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;怎么把 class 文件加载到 JVM 中？&lt;/td&gt;&lt;td&gt;答得一坨&lt;/td&gt;&lt;td&gt;❌ 类加载机制基础题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;MySQL 的 undolog、redolog、binlog 区别和场景？&lt;/td&gt;&lt;td&gt;✅ 开始吟唱&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;什么是两阶段提交？&lt;/td&gt;&lt;td&gt;✅ 吟唱八股&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;多线程写一个死锁&lt;/td&gt;&lt;td&gt;太久没写，没写出来（面试官换题）&lt;/td&gt;&lt;td&gt;❌ 多线程基础薄弱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;随便写一个单例模式&lt;/td&gt;&lt;td&gt;双检查锁 ✅&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;为什么要加 volatile 关键字？&lt;/td&gt;&lt;td&gt;✅ 吟唱八股&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;算法环节&lt;a href=&quot;#算法环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;表现&lt;/th&gt;&lt;th&gt;反思&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;合并两个有序数组&lt;/td&gt;&lt;td&gt;一秒写完 → 面试官问是不是刷过 → 老实承认&lt;/td&gt;&lt;td&gt;✅ 会做；❌ 下次假装思考一下&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;反问环节&lt;a href=&quot;#反问环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;| 22 | 反问 | 正常结束 |&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;💡 面试者自评&lt;a href=&quot;#-面试者自评&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;刚开始问那几个问题就感觉凉了，感觉面试官更想要有实习经历或者有突出项目的人，对我项目不太感兴趣。&lt;br /&gt;
面试官还是挺耐心和善的，后面可能看我答得不好就问了几个简单的八股。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🎯 从这份面经可以吸取的教训&lt;a href=&quot;#-从这份面经可以吸取的教训&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;项目准备方面&lt;a href=&quot;#项目准备方面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;项目来源要会包装&lt;/strong&gt; — 不要直接说”网上找的”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目挑战要有完整叙事&lt;/strong&gt; — 问题 → 方案设计 → 量化收益&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 相关的高频深度题&lt;/strong&gt;必须准备：
&lt;ul&gt;
&lt;li&gt;短期/长期记忆实现方案&lt;/li&gt;
&lt;li&gt;Agent 架构设计（至少从规划→工具→记忆→执行→反馈闭环说清楚）&lt;/li&gt;
&lt;li&gt;幻觉处理层级（提示词约束 → 工具/函数调用 → RAG 召回 → 微调对齐）&lt;/li&gt;
&lt;li&gt;API 超时、报错、token 消耗的排查和优化策略（缓存、批处理、上下文压缩、降级）&lt;/li&gt;
&lt;li&gt;结构化提示词设计原则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;八股基础方面&lt;a href=&quot;#八股基础方面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不能只会背”是什么”&lt;/strong&gt; — 面试官会追问”你怎么设计一个 X”（如线程池、Agent架构）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多线程基础不能丢&lt;/strong&gt; — 死锁、锁、并发编程是高频考点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JVM 类加载机制&lt;/strong&gt; — 经典必问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL 日志体系&lt;/strong&gt; — undo log、redo log、binlog + 两阶段提交，属于必考八股组合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;刷过的算法题，面试时假装思考一下再写&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🏷️ 标签&lt;a href=&quot;#️-标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;#字节跳动&lt;/code&gt; &lt;code&gt;#一面面经&lt;/code&gt; &lt;code&gt;#AI应用开发&lt;/code&gt; &lt;code&gt;#后端开发&lt;/code&gt; &lt;code&gt;#Java&lt;/code&gt; &lt;code&gt;#面试复盘&lt;/code&gt; &lt;code&gt;#实习&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>08 阿里淘天AI应用开发一面 有只小粉</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-08-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2-%E6%9C%89%E5%8F%AA%E5%B0%8F%E7%B2%89/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-08-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2-%E6%9C%89%E5%8F%AA%E5%B0%8F%E7%B2%89/</guid><description># 阿里淘天 AI 应用开发一面面经（5.27） &gt; 来源：小红书「有只小粉」 &gt; 岗位：AI 应用开发 &gt; 面试时长：**1 小时 30 分钟** &gt; 抓取时间：2026-05-31 --- ## 面试流程 ### 项目深挖环节（Agen</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;阿里淘天 AI 应用开发一面面经（5.27）&lt;a href=&quot;#阿里淘天-ai-应用开发一面面经527&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书「有只小粉」&lt;br /&gt;
岗位：AI 应用开发&lt;br /&gt;
面试时长：&lt;strong&gt;1 小时 30 分钟&lt;/strong&gt;&lt;br /&gt;
抓取时间：2026-05-31&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;面试流程&lt;a href=&quot;#面试流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;项目深挖环节（Agent 项目逐层追问）&lt;a href=&quot;#项目深挖环节agent-项目逐层追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这份面经最精彩的部分——面试官对 Agent 项目扣得非常细，几乎覆盖了从设计到落地全链路：&lt;/p&gt;



























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;面试问题&lt;/th&gt;&lt;th&gt;考察点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;自我介绍&lt;/td&gt;&lt;td&gt;基础表达&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;详细介绍 Agent 项目的细节和难点&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;项目真实性 + 技术深度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;会话压缩怎么做的？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;上下文管理核心技术&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;长期记忆写入的时机？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;记忆系统设计&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;上下文结构怎么组织的？有没有进行长度约束？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Prompt 工程 + Token 控制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;agent.md&lt;/code&gt; 和 &lt;code&gt;memory.md&lt;/code&gt; 的职责区分是什么？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Agent 系统架构理解&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;如果把工具和 skill 的位置交换一下，会产生什么后果？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;系统设计 + 架构权衡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;skills.md&lt;/code&gt; 的结构内容？skills 怎么导入？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Skill 机制实现&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;strong&gt;记忆检索怎么做的？怎么生成长期记忆，prompt 怎么组织的？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;记忆系统全链路&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;strong&gt;怎么进行评测？Agent 回答的评测怎么做？&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;质量保障 + 评估体系&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 这些问题说明面试官也在做类似的 Agent 系统，问得非常专深，需要真正做过 Agent 项目才能答好。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;研究生课题环节&lt;a href=&quot;#研究生课题环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;聊了一下研究生的课题内容&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;课题当中有什么挑战&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;有没有遇到具体的问题，和解决方案&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;C++ 基础环节&lt;a href=&quot;#c-基础环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;STL 的什么结构可以做 KV？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;哈希表底层的实现？冲突了怎么处理？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;如果有一个并发场景，怎么去保证读写的线程安全？&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;以上三个问题总共 1 小时（含项目深挖）&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;AI Coding 环节&lt;a href=&quot;#ai-coding-环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;












&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;序号&lt;/th&gt;&lt;th&gt;环节说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;&lt;strong&gt;目标人群提取的引擎&lt;/strong&gt; — 面试官让在写代码前先进行思考，然后根据与 AI 交互去完善和优化思路&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;这是一个新颖的 Coding 模式：不是直接让手写代码，而是先设计方案思路，再和 AI 协作迭代优化。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;💡 面经核心洞察&lt;a href=&quot;#-面经核心洞察&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Agent 项目的 7 个必准备深水区&lt;a href=&quot;#agent-项目的-7-个必准备深水区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;结合这份面经和之前的字节面经，Agent 项目高频追问集中在：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;会话压缩&lt;/strong&gt; — 怎么压缩、什么时机触发、摘要策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt; — 写入时机、生成 prompt、怎么检索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文结构&lt;/strong&gt; — 系统提示词怎么组织、长度约束策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置/职责划分&lt;/strong&gt; — &lt;code&gt;agent.md&lt;/code&gt;、&lt;code&gt;memory.md&lt;/code&gt;、&lt;code&gt;skills.md&lt;/code&gt; 各负责什么&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill 机制&lt;/strong&gt; — 结构、导入、与工具的职责区分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评测体系&lt;/strong&gt; — Agent 回答质量怎么评估&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;架构权衡&lt;/strong&gt; — 互换组件（如工具⇄skill）会有什么后果&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;值得注意的点&lt;a href=&quot;#值得注意的点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;面试官对 Agent 项目极度了解&lt;/strong&gt;，大概率也在做类似系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要把项目每个模块的”为什么这么设计”想清楚&lt;/strong&gt;，不止是”怎么做的”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Coding 环节的新趋势&lt;/strong&gt;：不要求一上来就手撕代码，而是考察思考和协作能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时长 1.5h&lt;/strong&gt;，说明面试官愿意深挖，也能扛住才是真功夫&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🏷️ 标签&lt;a href=&quot;#️-标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;#阿里&lt;/code&gt; &lt;code&gt;#淘天&lt;/code&gt; &lt;code&gt;#一面面经&lt;/code&gt; &lt;code&gt;#AI应用开发&lt;/code&gt; &lt;code&gt;#Agent&lt;/code&gt; &lt;code&gt;#面经&lt;/code&gt; &lt;code&gt;#暑期实习&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>09 腾讯AI应用开发一面 逸</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-09-%E8%85%BE%E8%AE%AFai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2-%E9%80%B8/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-09-%E8%85%BE%E8%AE%AFai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2-%E9%80%B8/</guid><description># 腾讯 AI 应用开发 一面 **来源**：小红书笔记（作者：逸，2026-04-11） **链接**：http://xhslink.com/o/2yiaDG9CXww **数据**：3357 点赞 / 6245 收藏 / 120 评论 </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;腾讯 AI 应用开发 一面&lt;a href=&quot;#腾讯-ai-应用开发-一面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;来源&lt;/strong&gt;：小红书笔记（作者：逸，2026-04-11）&lt;br /&gt;
&lt;strong&gt;链接&lt;/strong&gt;：&lt;a href=&quot;http://xhslink.com/o/2yiaDG9CXww&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/2yiaDG9CXww&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;数据&lt;/strong&gt;：3357 点赞 / 6245 收藏 / 120 评论 / 863 分享&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;1. 什么是 Agent？&lt;a href=&quot;#1-什么是-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Agent（智能体）是一种能够感知环境、做出决策并采取行动的系统。核心组件包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Planning（规划）&lt;/strong&gt;：任务分解与反思&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory（记忆）&lt;/strong&gt;：短期/长期记忆存储&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools（工具）&lt;/strong&gt;：调用外部 API、代码执行等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action（执行）&lt;/strong&gt;：实际执行操作&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2. Agent 和普通 LLM 应用的区别？&lt;a href=&quot;#2-agent-和普通-llm-应用的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;普通 LLM 应用&lt;/strong&gt;：输入→输出，单轮对话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent&lt;/strong&gt;：具备自主规划、使用工具、多步推理的能力，可以循环执行直到完成任务&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3. 常见的 Agent 框架有哪些？&lt;a href=&quot;#3-常见的-agent-框架有哪些&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：最流行的 Agent 框架，链式调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LlamaIndex&lt;/strong&gt;：专注 RAG 和数据索引&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoGPT&lt;/strong&gt;：全自动 Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MetaGPT&lt;/strong&gt;：多 Agent 协作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CrewAI&lt;/strong&gt;：角色扮演多 Agent&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4. 什么是 RAG？&lt;a href=&quot;#4-什么是-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;RAG（Retrieval-Augmented Generation）检索增强生成：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;将文档切分成 chunks&lt;/li&gt;
&lt;li&gt;通过 embedding 模型转为向量&lt;/li&gt;
&lt;li&gt;存入向量数据库&lt;/li&gt;
&lt;li&gt;用户提问时，先检索相关文档&lt;/li&gt;
&lt;li&gt;将检索结果 + 用户问题一起传给 LLM 生成答案&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5. RAG 的关键步骤？&lt;a href=&quot;#5-rag-的关键步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;文档解析与分块（Chunking）&lt;/li&gt;
&lt;li&gt;向量化（Embedding）&lt;/li&gt;
&lt;li&gt;检索（Retrieval）&lt;/li&gt;
&lt;li&gt;增强生成（Generation）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;6. 常见的 Embedding 模型？&lt;a href=&quot;#6-常见的-embedding-模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI text-embedding-3-small/large&lt;/li&gt;
&lt;li&gt;BGE 系列（BAAI）&lt;/li&gt;
&lt;li&gt;M3E&lt;/li&gt;
&lt;li&gt;Cohere Embed&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;7. 常见的向量数据库？&lt;a href=&quot;#7-常见的向量数据库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Milvus&lt;/strong&gt;：开源，高性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinecone&lt;/strong&gt;：云原生&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weaviate&lt;/strong&gt;：支持混合搜索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chroma&lt;/strong&gt;：轻量级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAISS&lt;/strong&gt;：Facebook 开源&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;8. 什么是 Prompt Engineering？&lt;a href=&quot;#8-什么是-prompt-engineering&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过设计和优化提示词来引导 LLM 生成期望的输出。常见技术：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Zero-shot / Few-shot&lt;/li&gt;
&lt;li&gt;Chain-of-Thought (CoT)&lt;/li&gt;
&lt;li&gt;ReAct&lt;/li&gt;
&lt;li&gt;Self-consistency&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;9. LLM 的关键参数？&lt;a href=&quot;#9-llm-的关键参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Temperature&lt;/strong&gt;：控制随机性（0=确定，1=随机）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top-p&lt;/strong&gt;：核采样概率阈值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Max tokens&lt;/strong&gt;：最大输出长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequency penalty&lt;/strong&gt;：重复惩罚&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;10. 什么是 Function Calling / Tool Use？&lt;a href=&quot;#10-什么是-function-calling--tool-use&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;让 LLM 能够调用外部工具：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;定义工具的 JSON Schema&lt;/li&gt;
&lt;li&gt;LLM 决定是否调用、调用哪个工具、传什么参数&lt;/li&gt;
&lt;li&gt;系统执行工具并返回结果&lt;/li&gt;
&lt;li&gt;LLM 基于结果生成最终回答&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;11. Agent 中的记忆系统？&lt;a href=&quot;#11-agent-中的记忆系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：当前对话上下文（Context Window）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;：持久化存储（向量数据库、文件系统）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作记忆&lt;/strong&gt;：任务执行过程中的中间状态&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;12. 什么是 Multi-Agent？&lt;a href=&quot;#12-什么是-multi-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;多个 Agent 协作完成复杂任务：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;角色分工（研究员、程序员、审核员等）&lt;/li&gt;
&lt;li&gt;通信机制（消息传递、共享状态）&lt;/li&gt;
&lt;li&gt;常见模式：顺序执行、并行执行、层级管理&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;13. Fine-tuning vs RAG？&lt;a href=&quot;#13-fine-tuning-vs-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;Fine-tuning&lt;/th&gt;&lt;th&gt;RAG&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;成本&lt;/td&gt;&lt;td&gt;高（需要GPU训练）&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;更新&lt;/td&gt;&lt;td&gt;需要重新训练&lt;/td&gt;&lt;td&gt;实时更新&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;适用&lt;/td&gt;&lt;td&gt;特定风格/格式&lt;/td&gt;&lt;td&gt;知识问答&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;幻觉&lt;/td&gt;&lt;td&gt;可能加剧&lt;/td&gt;&lt;td&gt;有参考减少&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;14. 如何处理 LLM 幻觉？&lt;a href=&quot;#14-如何处理-llm-幻觉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;RAG 提供参考文档&lt;/li&gt;
&lt;li&gt;设置 temperature=0&lt;/li&gt;
&lt;li&gt;要求模型引用来源&lt;/li&gt;
&lt;li&gt;后处理验证&lt;/li&gt;
&lt;li&gt;使用 Self-consistency&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;15. 如何评估 LLM 应用？&lt;a href=&quot;#15-如何评估-llm-应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动评估&lt;/strong&gt;：BLEU、ROUGE、BERTScore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人工评估&lt;/strong&gt;：准确性、相关性、流畅性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM-as-Judge&lt;/strong&gt;：用 GPT-4 评分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 评估&lt;/strong&gt;：检索召回率、答案相关性&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;16. 部署 LLM 应用的考虑？&lt;a href=&quot;#16-部署-llm-应用的考虑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;延迟优化（流式输出、缓存）&lt;/li&gt;
&lt;li&gt;成本控制（模型选择、token 限制）&lt;/li&gt;
&lt;li&gt;可扩展性&lt;/li&gt;
&lt;li&gt;安全性（输入过滤、输出审查）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;17. AI 安全和对齐问题？&lt;a href=&quot;#17-ai-安全和对齐问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;RLHF（基于人类反馈的强化学习）&lt;/li&gt;
&lt;li&gt;Constitutional AI&lt;/li&gt;
&lt;li&gt;Red Teaming&lt;/li&gt;
&lt;li&gt;内容过滤和安全护栏&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;18. 你有什么想问的？&lt;a href=&quot;#18-你有什么想问的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;（面试反问环节建议）&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;提取自小红书笔记图片（共18页），2026-05-31 整理&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>10 滴滴AI全栈开发一面</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-10-%E6%BB%B4%E6%BB%B4ai%E5%85%A8%E6%A0%88%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-10-%E6%BB%B4%E6%BB%B4ai%E5%85%A8%E6%A0%88%E5%BC%80%E5%8F%91%E4%B8%80%E9%9D%A2/</guid><description># 滴滴 AI 全栈开发 一面（不区分前后端） **来源**：小红书笔记 **链接**：http://xhslink.com/o/5d3Gt8uZdSq **标签**：互联网大厂、agent、后端开发、大厂、程序员、面试求职、大模型、春招、</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;滴滴 AI 全栈开发 一面（不区分前后端）&lt;a href=&quot;#滴滴-ai-全栈开发-一面不区分前后端&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;来源&lt;/strong&gt;：小红书笔记&lt;br /&gt;
&lt;strong&gt;链接&lt;/strong&gt;：&lt;a href=&quot;http://xhslink.com/o/5d3Gt8uZdSq&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/5d3Gt8uZdSq&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;标签&lt;/strong&gt;：互联网大厂、agent、后端开发、大厂、程序员、面试求职、大模型、春招、校招、java&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;面试题目（共40题）&lt;a href=&quot;#面试题目共40题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;基础与编程&lt;a href=&quot;#基础与编程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;MCP是什么&lt;/li&gt;
&lt;li&gt;手写单例&lt;/li&gt;
&lt;li&gt;简单的coding题（忘了）&lt;/li&gt;
&lt;li&gt;GraphQL RESTful区别&lt;/li&gt;
&lt;li&gt;前后端分离&lt;/li&gt;
&lt;li&gt;HTTP 1.0/2.0/3.0区别&lt;/li&gt;
&lt;li&gt;JS闭包&lt;/li&gt;
&lt;li&gt;异步请求：Promise async await&lt;/li&gt;
&lt;li&gt;React生命周期&lt;/li&gt;
&lt;li&gt;网络&lt;/li&gt;
&lt;li&gt;缓存&lt;/li&gt;
&lt;li&gt;算法&lt;/li&gt;
&lt;li&gt;python和js的区别&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;AI Agent 与 MCP&lt;a href=&quot;#ai-agent-与-mcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;具体讲AI项目&lt;/li&gt;
&lt;li&gt;mcp怎么运作的？&lt;/li&gt;
&lt;li&gt;mcp有哪些协议，有什么区别？&lt;/li&gt;
&lt;li&gt;mcp怎么处理并发调用？&lt;/li&gt;
&lt;li&gt;你对AI coding tools的了解有多少？&lt;/li&gt;
&lt;li&gt;国内的模型和国外的模型有什么差距？&lt;/li&gt;
&lt;li&gt;做题：字符串相加&lt;/li&gt;
&lt;li&gt;你怎么理解agent的？&lt;/li&gt;
&lt;li&gt;mcp是什么？（重复）&lt;/li&gt;
&lt;li&gt;mcp给你最大的感受是什么？&lt;/li&gt;
&lt;li&gt;你认为mcp这种协议或者其他协议能解决什么问题？&lt;/li&gt;
&lt;li&gt;AI工具在你做项目的时候能占比多少？&lt;/li&gt;
&lt;li&gt;MCP与Skill的区别是什么？&lt;/li&gt;
&lt;li&gt;ai在你日常编程中的运用？&lt;/li&gt;
&lt;li&gt;ai编程的理解？如何把握自己的能力&lt;/li&gt;
&lt;li&gt;ai编程的潜在问题&lt;/li&gt;
&lt;li&gt;能简单介绍一下这段经历吗？&lt;/li&gt;
&lt;li&gt;项目中ai的作用？&lt;/li&gt;
&lt;li&gt;智能体有哪三个要素，分别有什么作用？&lt;/li&gt;
&lt;li&gt;RAG了解吗&lt;/li&gt;
&lt;li&gt;项目具体业务、拆分工具流程等&lt;/li&gt;
&lt;li&gt;你还知道哪些工具协议，除了MCP?&lt;/li&gt;
&lt;li&gt;两个机器人对话如何实现？&lt;/li&gt;
&lt;li&gt;聊工作经历，大概问了一下是否使用过Vibe coding&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Python 进阶&lt;a href=&quot;#python-进阶&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;python多进程，多线程，协程&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Prompt 相关&lt;a href=&quot;#prompt-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Prompt技巧&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;开放性问题&lt;a href=&quot;#开放性问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;项目提问&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;题目分类统计&lt;a href=&quot;#题目分类统计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类别&lt;/th&gt;&lt;th&gt;数量&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MCP/AI Agent&lt;/td&gt;&lt;td&gt;~15&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;前端基础&lt;/td&gt;&lt;td&gt;~6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;后端基础&lt;/td&gt;&lt;td&gt;~4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;编程题&lt;/td&gt;&lt;td&gt;~4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;项目经验&lt;/td&gt;&lt;td&gt;~5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;其他&lt;/td&gt;&lt;td&gt;~6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;提取自小红书笔记文字描述，2026-05-31 整理&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>11 Agent八股 记忆检索RAG</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-11-agent%E5%85%AB%E8%82%A1-%E8%AE%B0%E5%BF%86%E6%A3%80%E7%B4%A2rag/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-11-agent%E5%85%AB%E8%82%A1-%E8%AE%B0%E5%BF%86%E6%A3%80%E7%B4%A2rag/</guid><description># Agent八股分享：一天速通记忆/检索（RAG） **来源**：小红书笔记 **链接**：http://xhslink.com/o/8tkHC8Q3yVK **标签**：互联网大厂、agent、java、后端开发、实习、暑期实习 ---</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent八股分享：一天速通记忆/检索（RAG）&lt;a href=&quot;#agent八股分享一天速通记忆检索rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;来源&lt;/strong&gt;：小红书笔记&lt;br /&gt;
&lt;strong&gt;链接&lt;/strong&gt;：&lt;a href=&quot;http://xhslink.com/o/8tkHC8Q3yVK&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/8tkHC8Q3yVK&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;标签&lt;/strong&gt;：互联网大厂、agent、java、后端开发、实习、暑期实习&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;1️⃣ 必问主线&lt;a href=&quot;#1️⃣-必问主线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;什么是 RAG？为什么它比直接让模型回答更适合企业知识问答？&lt;/li&gt;
&lt;li&gt;RAG 和微调有什么区别？什么时候用哪个？&lt;/li&gt;
&lt;li&gt;RAG 和长上下文模型谁更好？&lt;/li&gt;
&lt;li&gt;为什么说 RAG 不是一个”向量库项目”？&lt;/li&gt;
&lt;li&gt;一个 RAG 系统为什么会答错？&lt;/li&gt;
&lt;li&gt;RAG 的核心指标有哪些？&lt;/li&gt;
&lt;li&gt;什么时候不应该上 RAG？&lt;/li&gt;
&lt;li&gt;为什么很多 RAG demo 看起来能跑，线上却不好用？&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2️⃣ 检索链路与效果优化&lt;a href=&quot;#2️⃣-检索链路与效果优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;为什么说 chunking 决定了检索系统的上限？&lt;/li&gt;
&lt;li&gt;chunk size 应该怎么定？&lt;/li&gt;
&lt;li&gt;overlap 有什么作用，为什么不能太大？&lt;/li&gt;
&lt;li&gt;embedding 模型怎么选？&lt;/li&gt;
&lt;li&gt;为什么很多系统要加 rerank？&lt;/li&gt;
&lt;li&gt;cross-encoder rerank 和向量召回的关系是什么？&lt;/li&gt;
&lt;li&gt;为什么 dense retrieval 很强了，生产里还要 sparse？&lt;/li&gt;
&lt;li&gt;Hybrid Retrieval 的本质是什么？&lt;/li&gt;
&lt;li&gt;Query Rewrite 的目的是什么？&lt;/li&gt;
&lt;li&gt;query rewrite 有什么风险？&lt;/li&gt;
&lt;li&gt;Hybrid Retrieval 和 rerank 的关系是什么？&lt;/li&gt;
&lt;li&gt;元数据为什么对检索效果重要？&lt;/li&gt;
&lt;li&gt;late chunking 解决什么问题？&lt;/li&gt;
&lt;li&gt;Contextual Retrieval 的核心思想是什么？&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3️⃣ Memory 与 RAG 边界&lt;a href=&quot;#3️⃣-memory-与-rag-边界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;RAG 和 Memory 最本质的区别是什么？&lt;/li&gt;
&lt;li&gt;为什么会话历史不等于长期记忆？&lt;/li&gt;
&lt;li&gt;session state 和 memory 有什么区别？&lt;/li&gt;
&lt;li&gt;缓存是不是一种记忆？&lt;/li&gt;
&lt;li&gt;为什么说 memory 需要写入策略？&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4️⃣ 长期记忆与用户记忆&lt;a href=&quot;#4️⃣-长期记忆与用户记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;长期记忆和用户画像有什么区别？&lt;/li&gt;
&lt;li&gt;为什么长期记忆不能每轮都写？&lt;/li&gt;
&lt;li&gt;你会把哪些信息写成常驻记忆？&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5️⃣ Agentic RAG / GraphRAG 进阶题&lt;a href=&quot;#5️⃣-agentic-rag--graphrag-进阶题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;什么是 Agentic RAG？&lt;/li&gt;
&lt;li&gt;什么情况下普通 RAG 不够用？&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;提取自小红书笔记文字描述，2026-05-31 整理&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>12 AI面经 AI Agent四种范式对比</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-12-ai%E9%9D%A2%E7%BB%8F-ai-agent%E5%9B%9B%E7%A7%8D%E8%8C%83%E5%BC%8F%E5%AF%B9%E6%AF%94/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-12-ai%E9%9D%A2%E7%BB%8F-ai-agent%E5%9B%9B%E7%A7%8D%E8%8C%83%E5%BC%8F%E5%AF%B9%E6%AF%94/</guid><description>大家好 欢迎来到本期技术面试深度解析 聊一道面试题对比AI agent四种饭时react, plan, and execute multi agent以及to use agent各自是用什么场景 如何做技术选行 这道题大多数人的回答会查在列</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;大家好 欢迎来到本期技术面试深度解析
聊一道面试题对比AI agent四种饭时react, plan, and execute
multi agent以及to use agent各自是用什么场景 如何做技术选行
这道题大多数人的回答会查在列定意义上
把四种饭时逐个解释一遍就结束
但面试官要的是从工程维度理解本质差异和区设逻辑
关注我五分钟吃头一道高平面试题
深入拆解技术原理和面试官意图
首先来看知道题的考察意图
面试观问 这道题背后考察两个关键能力
第一是 agent 架构的工程感之力
能不能从延迟可靠性 可观测性等维度评价一个饭时
第二是技术选行探断力 面向具体场景能不能准确选出
该用哪种饭时 为什么
那怎么拆解呢 我们先从最常见的误区说起
很多人默认以为这四种是现性进化关系
to use 最简单 react 高级一点
plan and execute 更高级
multi agent 最牛
这是面试中最大的坑
实际上他们根本不是同意维度的比较对象
to use 是基础能力层决定模型能不能调用外部工具
react 是推理 框架层
定义推理和行动怎么交替plan and execute
控制流程 规定先规划还是边想边做
multi agent 是组织架构层
关心多个 agent  agent 怎么协作四层 可以跌加而不是护持
outline 里的一个 agent 就可以同时用react 的 function calling
整体又是multi agent 架构 清楚了层次关系 回答才不会跑偏
这就引出了关键认知 选行不是四选一
而是根据场景在每一层做组合决策
那每一层怎么选呢 先说 to use 这层
模型根据上下文自主决定 要不要掉工具掉哪个传什么参数
拿到结果后继续回复
优势是延迟低 架构 简单
但面对多不推理是每一步独立决策
缺少全局规划 容易偏离目标
所以它最适合单一或简单调有
比如查天气 发有见这类确定行操作
当问题来了 如果任务不只是调一两个工具
这就引出了react 饭式
核心是推理和行动交支进行 格式是thought action
observation 3段循环 先思考下一步做什么
执行动作拿到观察结果再继续思考
最大价值是可解释性
打开日质能看到每一步的决策链入
代价是延迟每多一轮循环就多一次LLM要用
适合中等复杂度 且对可观测性要求高的人物
比如客服工单数去分析
但react 解决不了一个更深层的问题
任务如果需要十几步 光靠边向边做
不仅慢 而且容易迷失 方向怎么办
这就引出了plan and execute 饭式
理念是先规划再执行
模型在动手前深层完整计划
然后逐步执行
这解决了react缺乏全局视野的弱点
代价是规划 消耗推理资源
计划可能不准确
好的时间是在执行中引入重新规划机制
适合步驟多弹结构清晰的任务
比如大型代码重够复杂数据处理流水线
但还有一个更几手的问题
如果任务复杂度已经超过单个agent的能力边界了
这就引出了multi agent 多智能体饭式
思路是把复杂任务拆给多个专门 agent
每个有自己的角色 工具和知识范围
通过消息或共享状态协作
最大好处是职责分离
每个agent的上下文窗口只需关注自己的范围
主流框架如Alton Gen和Cru A
通过编排着 agent 解决鞋桃问题
适合角色编解清晰的鞋作场景
比如软件工程的多角色配合内容编审发流程
好 自种饭式讲完了
面试官很可能会追问一个深华问题
技术选行的优先极怎么盘
这里给一个使用框架
低看任务复杂度
单步或少量调用
直接用towels多不推理家可解释新上react
步骤多且结构画高
用pland and execute
只有角色天然分离或单agent
上下文窗不下时才上multiagent
第二看延迟敏感度
实时交互
优先towels或最简react
后台批处理充分发挥后两者优势
第三 看可观测性需求
react的循环是天然审计追踪&lt;/p&gt;</content:encoded></item><item><title>2026 05 07 阿里淘天 AI应用开发 一面</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-2026-05-07-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91-%E4%B8%80%E9%9D%A2/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-2026-05-07-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91-%E4%B8%80%E9%9D%A2/</guid><description># 阿里淘天 AI 应用开发面经（一面） **时间**：2026-05-07 **来源**：[小红书笔记](http://xhslink.com/o/9aWfkBaZczZ) --- ### 1. 自我介绍 * 个人教育背景及项目经验概述。</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;阿里淘天 AI 应用开发面经（一面）&lt;a href=&quot;#阿里淘天-ai-应用开发面经一面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;时间&lt;/strong&gt;：2026-05-07
&lt;strong&gt;来源&lt;/strong&gt;：&lt;a href=&quot;http://xhslink.com/o/9aWfkBaZczZ&quot; target=&quot;_blank&quot;&gt;小红书笔记&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h3&gt;1. 自我介绍&lt;a href=&quot;#1-自我介绍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;个人教育背景及项目经验概述。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Java 基础与并发&lt;a href=&quot;#2-java-基础与并发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HashMap&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;底层数据结构（数组+链表+红黑树）。&lt;/li&gt;
&lt;li&gt;为什么链表长度为8时转红黑树？&lt;/li&gt;
&lt;li&gt;扩容机制与线程安全问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线程池&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;核心参数（corePoolSize, maximumPoolSize, keepAliveTime, workQueue, handler）。&lt;/li&gt;
&lt;li&gt;工作原理与任务排队策略。&lt;/li&gt;
&lt;li&gt;常见的拒绝策略。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发编程&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;synchronized&lt;/code&gt; 实现原理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReentrantLock&lt;/code&gt; 与 &lt;code&gt;synchronized&lt;/code&gt; 的区别。&lt;/li&gt;
&lt;li&gt;CAS 与 AQS 简单介绍。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. AI 应用开发相关&lt;a href=&quot;#3-ai-应用开发相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;详述 RAG 的完整链路（Embedding -&amp;gt; Vector Store -&amp;gt; Retrieval -&amp;gt; Generation）。&lt;/li&gt;
&lt;li&gt;如何通过 RAG 减少模型幻觉？&lt;/li&gt;
&lt;li&gt;常用的向量数据库（如 Milvus, Pinecone）选型对比。&lt;/li&gt;
&lt;li&gt;文档切片（Chunking）的策略对检索质量的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt 工程&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;常用的提示词技巧：Few-shot（少样本学习）、CoT（思维链）。&lt;/li&gt;
&lt;li&gt;如何优化 Prompt 以获得更稳定的输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent (智能体)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;介绍 Agent 的核心组件：规划 (Planning)、记忆 (Memory)、工具使用 (Tool Use)。&lt;/li&gt;
&lt;li&gt;ReAct 框架的工作模式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型评估&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;如何评估 AI 应用的效果？（RAGAS 框架、人工标注等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 系统设计与场景题&lt;a href=&quot;#4-系统设计与场景题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高并发 AI 对话系统&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;如何设计架构以支持大量并发请求？&lt;/li&gt;
&lt;li&gt;消息队列在系统中的应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;LLM 推理延迟高，如何优化用户体验？（流式输出 SSE/WebSocket）。&lt;/li&gt;
&lt;li&gt;缓存策略（Semantic Cache）的应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 反问环节&lt;a href=&quot;#5-反问环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;团队的技术栈与具体的业务落地场景。&lt;/li&gt;
&lt;li&gt;对面试表现的反馈。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Agent Super Result Handling 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent_super_result_handling_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent_super_result_handling_%E6%95%B4%E7%90%86/</guid><description># Agent_Super_Result_Handling ## 问题 Agent_Super_Result_Handling ## 标准回答 # Agent 调用工具返回超大结果的处理与 OpenClaw 实践 Agent 调用工具返回超</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent_Super_Result_Handling&lt;a href=&quot;#agent_super_result_handling&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Agent_Super_Result_Handling&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Agent 调用工具返回超大结果的处理与 OpenClaw 实践&lt;a href=&quot;#agent-调用工具返回超大结果的处理与-openclaw-实践&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Agent 调用工具返回超大结果（如代码搜索返回 50KB 文本）会带来三个？
接问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token 爆炸&lt;/strong&gt;：50KB 文本按 1 token≈4 字符估算，单条结果吃掉 12000+ token。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;挤占上下文空间&lt;/strong&gt;：128K 窗口下，一条结果占近 10%，挤压历史、System Prompt 和用户消息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;延迟飙升&lt;/strong&gt;：处理大结果增加计算和传输成本。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;处理思路分两步：&lt;strong&gt;限额 + 截断&lt;/strong&gt;。为每条 tool result 设字符上限，超限则采用 &lt;strong&gt;head+tail 截断&lt;/strong&gt;：保留开头让模型理解内容，保留尾部抓住错误信息，中间砍掉并加省略标记。&lt;/p&gt;&lt;p&gt;OpenClaw 实现两层防护：
&lt;strong&gt;单条截断&lt;/strong&gt;：按 context window 的 30% 设上限（硬上限 400K 字符）。检测尾部是否包含错误关键词（error/exception/traceback 等），有则 head 占约 70%（最少 2000 字符）、tail 占 30%（上限 4000 字符）分割；否则只保留开头。截断后附加提示，告知内容不完整，可用 offset/limit 重新获取。
&lt;strong&gt;全局预算守卫&lt;/strong&gt;：每次请求前计算总字符开销，超过 context window 的 75% 时，从最早的 tool result 开始替换为占位提示，优先牺牲早期结果，保证新内容空间。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 为什么不能只保留前 N 个字符&lt;a href=&quot;#1-为什么不能只保留前-n-个字符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;直接 substring(0, maxLen) 会丢失关键信息。例如 grep 搜索最相关匹配可能在中后部；命令执行失败时，真正的错误栈在末尾。&lt;/li&gt;
&lt;li&gt;head+tail 策略虽不完美，但能兜住两头。OpenClaw 的 &lt;code&gt;truncateToolResultMessage()&lt;/code&gt; 对多 block 内容按比例分配字符，避免单一 block 独占。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hasImportantTail()&lt;/code&gt; 动态检测尾部是否包含错误关键词或 JSON 闭合结构，只有命中才启用 head+tail，否则只保留开头。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 字符预算计算&lt;a href=&quot;#2-字符预算计算&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;单条上限 ≈ context window tokens × 每 token 字符数 × 30%（代码文本 token 密度高，OpenClaw 对 tool result 用换算系数 2）。128K 模型：单条约 150K 字符。&lt;/li&gt;
&lt;li&gt;全局预算 ≈ 128K × 4 × 75% ≈ 384K 字符。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 其他框架处理对比&lt;a href=&quot;#3-其他框架处理对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：ToolMessage 默认不截断，社区实践在 parser 层加限制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anthropic Claude&lt;/strong&gt;：文档建议单条 tool result 不超过 100K 字符。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoGPT&lt;/strong&gt;：早期无截断，context 常被撑爆，后加 &lt;code&gt;max_length&lt;/code&gt; 参数。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：截断后模型基于不完整信息做错误判断，怎么处理？&lt;a href=&quot;#q1截断后模型基于不完整信息做错误判断怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：在截断标记中明确告知内容被截断，并建议使用 offset/limit 或请求特定部分重新获取。OpenClaw 截断后缀会说明“Content truncated”并提供重新获取指引。更优做法是附上原始内容的字符数和行数，让模型判断信息损失程度，必要时发起二次精确查询（如缩小范围、指定行号）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：head+tail 的比例怎么定？&lt;a href=&quot;#q2headtail-的比例怎么定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：无通用最优比例，依赖 tool 类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;搜索类工具（结果按相关性排序）：head 更重要，可 head 占 70%、tail 占 30%。&lt;/li&gt;
&lt;li&gt;命令执行类工具（关键信息在末尾）：head 40%、tail 60%。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 实际使用 tail 占 30%（上限 4000 字符），head 拿剩余且最少保留 2000 字符。仅当 &lt;code&gt;hasImportantTail()&lt;/code&gt; 检测到尾部有关键词时才走 head+tail，否则默认只保留开头。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：除了截断，还有哪些方式处理超大 tool result？&lt;a href=&quot;#q3除了截断还有哪些方式处理超大-tool-result&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：
&lt;strong&gt;工具端过滤&lt;/strong&gt;：如代码搜索只返回最相关 top 10，不吐全量。
&lt;strong&gt;摘要模型压缩&lt;/strong&gt;：用 sub-agent 先将大结果压缩成摘要再喂给主模型（如 Anthropic 内部实践）。
&lt;strong&gt;分页&lt;/strong&gt;：将大结果拆成多页，模型可选翻页获取更多内容。&lt;/p&gt;&lt;p&gt;截断是最简单的兜底方案，理想情况下应在工具端控制输出量。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;Agent 调用工具返回超大结果的处理与 OpenClaw 实践&lt;a href=&quot;#agent-调用工具返回超大结果的处理与-openclaw-实践-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Agent 调用工具返回超大结果（如代码搜索返回 50KB 文本）会带来三个直接问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token 爆炸&lt;/strong&gt;：50KB 文本按 1 token≈4 字符估算，单条结果吃掉 12000+ token。&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;挤占上下文空间&lt;/strong&gt;：128K 窗口下，一条结果占近 10%，挤压历史、System Prompt 和用户消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;延迟飙升&lt;/strong&gt;：处理大结果增加计算和传输成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;处理思路分两步：&lt;strong&gt;限额 + 截断&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;为每条 tool result 设字符上限，超限则采用 &lt;strong&gt;head+tail 截断&lt;/strong&gt;：保留开头让模型理解内容，保留尾部抓住错误信息，中间砍掉并加省略标记。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Agent_Super_Result_Handling&lt;/p&gt;&lt;p&gt;Agent 调用工具返回超大结果（如代码搜索返回 50KB 文本）会带来三个直接问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Token 爆炸&lt;/strong&gt;：50KB 文本按 1 token≈4 字符估算，单条结果吃掉 12000+ token。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;挤占上下文空间&lt;/strong&gt;：128K 窗口下，一条结果占近 10%，挤压历史、System Prompt 和用户消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;延迟飙升&lt;/strong&gt;：处理大结果增加计算和传输成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;处理思路分两步：&lt;strong&gt;限额 + 截断&lt;/strong&gt;。为每条 tool result 设字符上限，超限则采用 &lt;strong&gt;head+tail 截断&lt;/strong&gt;：保留开头让模型理解内容，保留尾部抓住错误信息，中间砍掉并加省略标记。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 实现两层防护：
&lt;strong&gt;单条截断&lt;/strong&gt;：按 context window 的 30% 设上限（硬上限 400K 字符）。检测尾部是否包含错误关键词（error/exception/traceback 等），有则 head 占约 70%（最少 2000 字符）、tail 占 30%（上限 4000 字符）分割；否则只保留开头。截断后附加提示，告知内容不完整，可用 offset/limit 重新获取。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token 爆炸&lt;/strong&gt;：50KB 文本按 1 token≈4 字符估算，单条结果吃掉 12000+ token。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;挤占上下文空间&lt;/strong&gt;：128K 窗口下，一条结果占近 10%，挤压历史、System Prompt 和用户消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;延迟飙升&lt;/strong&gt;：处理大结果增加计算和传输成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;处理思路分两步：&lt;strong&gt;限额 + 截断&lt;/strong&gt;。为每条 tool result 设字符上限，超限则采用 &lt;strong&gt;head+tail 截断&lt;/strong&gt;：保留开头让模型理解内容，保留尾部抓住错误信息，中间砍掉并加省略标记。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 实现两层防护：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Agent暑期实习面经</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent%E6%9A%91%E6%9C%9F%E5%AE%9E%E4%B9%A0%E9%9D%A2%E7%BB%8F/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent%E6%9A%91%E6%9C%9F%E5%AE%9E%E4%B9%A0%E9%9D%A2%E7%BB%8F/</guid><description># Agent暑期实习面经 &gt; 来源：小红书 @菌菌 &gt; 原文链接：http://xhslink.com/o/1bp55UaMqkL &gt; 发布时间：2026-04-27 &gt; 标签：暑期实习、暑期实习面经、面经 &gt; 收藏 1095 · 点赞 </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent暑期实习面经&lt;a href=&quot;#agent暑期实习面经&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书 @菌菌
原文链接：&lt;a href=&quot;http://xhslink.com/o/1bp55UaMqkL&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/1bp55UaMqkL&lt;/a&gt;
发布时间：2026-04-27
标签：暑期实习、暑期实习面经、面经
收藏 1095 · 点赞 699 · 评论 57&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h2&gt;背景说明&lt;a href=&quot;#背景说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我从后端转 Agent，但是简历里没写任何后端内容，某种程度上缩减了面试官拷打的范围，因此大部分时间都在深挖项目，几乎没有任何传统后端八股。&lt;/p&gt;&lt;p&gt;以下是&lt;strong&gt;从数十场大厂暑期面试提炼而来的 Agent 面经&lt;/strong&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Agent 方向&lt;a href=&quot;#agent-方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;你们这个 multi-agent 选型的依据&lt;/li&gt;
&lt;li&gt;ReAct 范式你们怎么用的，其他的范式&lt;/li&gt;
&lt;li&gt;LangGraph 介绍一下，有改进过哪些框架吗&lt;/li&gt;
&lt;li&gt;记忆机制怎么做的&lt;/li&gt;
&lt;li&gt;OpenClaw、Claude Code 看过吗&lt;/li&gt;
&lt;li&gt;大模型的安全与薄弱点：prompt 工程、上下文工程、fallback 策略、retry 机制、reflection 机制、LLM 选型原因（工程侧非训练侧，每场面试问的方向不一样，但我都总结为实践经验）&lt;/li&gt;
&lt;li&gt;意图识别怎么做的，指标如何衡量的（简历有写，每场必问）&lt;/li&gt;
&lt;li&gt;multi-agent 系统评测、单 agent 本身评测&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;LLM 方向&lt;a href=&quot;#llm-方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;大模型幻觉&lt;/li&gt;
&lt;li&gt;输入输出长度&lt;/li&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;调用 API&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;算法方向&lt;a href=&quot;#算法方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Transformer&lt;/li&gt;
&lt;li&gt;注意力机制&lt;/li&gt;
&lt;li&gt;位置编码&lt;/li&gt;
&lt;li&gt;交叉熵损失函数&lt;/li&gt;
&lt;li&gt;过拟合&lt;/li&gt;
&lt;li&gt;梯度消失&lt;/li&gt;
&lt;li&gt;数据并行&lt;/li&gt;
&lt;li&gt;模型并行&lt;/li&gt;
&lt;li&gt;生成式大模型&lt;/li&gt;
&lt;li&gt;Transformer 流程&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Agent 深挖（高频）&lt;a href=&quot;#agent-深挖高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;幻觉&lt;/li&gt;
&lt;li&gt;Function Calling&lt;/li&gt;
&lt;li&gt;Prompt Engineering&lt;/li&gt;
&lt;li&gt;Tool Use&lt;/li&gt;
&lt;li&gt;ReAct&lt;/li&gt;
&lt;li&gt;CoT（链式思维）&lt;/li&gt;
&lt;li&gt;记忆管理&lt;/li&gt;
&lt;li&gt;自我纠错&lt;/li&gt;
&lt;li&gt;Planning&lt;/li&gt;
&lt;li&gt;反馈机制&lt;/li&gt;
&lt;li&gt;Multi-Agent&lt;/li&gt;
&lt;li&gt;记忆存储、压缩、优化&lt;/li&gt;
&lt;li&gt;模型评估&lt;/li&gt;
&lt;li&gt;SSE 协议&lt;/li&gt;
&lt;li&gt;A2A 协议&lt;/li&gt;
&lt;li&gt;MCP 协议&lt;/li&gt;
&lt;li&gt;RAG 优化&lt;/li&gt;
&lt;li&gt;拆分任务机制&lt;/li&gt;
&lt;li&gt;边界 case&lt;/li&gt;
&lt;li&gt;循环调用&lt;/li&gt;
&lt;li&gt;Token 优化&lt;/li&gt;
&lt;li&gt;模型选择&lt;/li&gt;
&lt;li&gt;Multi-Agent 通信&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Agent超大结果面试题整理版</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent%E8%B6%85%E5%A4%A7%E7%BB%93%E6%9E%9C%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86%E7%89%88/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-agent%E8%B6%85%E5%A4%A7%E7%BB%93%E6%9E%9C%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86%E7%89%88/</guid><description># Agent 工具调用返回超大结果的处理策略 &gt; 面试题：Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？ --- ## 一、超大结果带来的三个问题 | 问</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Agent 工具调用返回超大结果的处理策略&lt;a href=&quot;#agent-工具调用返回超大结果的处理策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;面试题：Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、超大结果带来的三个问题&lt;a href=&quot;#一超大结果带来的三个问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Token 爆炸&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;50KB 文本 ≈ 12000+ token，一条结果就干掉 128K 窗口的近 10%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;挤占上下文空间&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;对话历史、系统提示、用户消息全被挤压，模型理解质量直线下降&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;延迟飙升&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;API 按 token 计费，多塞进去的大部分是噪声，等于花钱买垃圾&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、处理思路：限额 + 截断&lt;a href=&quot;#二处理思路限额--截断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;核心原则&lt;/strong&gt;：给每条 tool result 设一个字符上限，超了就砍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;截断策略&lt;/strong&gt;：&lt;strong&gt;head + tail 截断&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;保留&lt;strong&gt;开头&lt;/strong&gt;：让模型知道内容是什么&lt;/li&gt;
&lt;li&gt;保留&lt;strong&gt;尾部&lt;/strong&gt;：抓住错误信息（错误堆栈、诊断信息往往在末尾）&lt;/li&gt;
&lt;li&gt;中间砍掉 + 加省略标记&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;📌 类比：看日志时，最后几行的报错信息通常最关键。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、OpenClaw 的两层防护&lt;a href=&quot;#三openclaw-的两层防护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;第一层：单条截断&lt;a href=&quot;#第一层单条截断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;字符上限&lt;/td&gt;&lt;td&gt;context window 的 &lt;strong&gt;30%&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;硬上限&lt;/td&gt;&lt;td&gt;400K 字符&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;head 占比&lt;/td&gt;&lt;td&gt;约 70%（最少保留 2000 字符）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tail 占比&lt;/td&gt;&lt;td&gt;约 30%（上限 4000 字符）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;智能检测&lt;/strong&gt;：&lt;code&gt;hasImportantTail()&lt;/code&gt; 检测尾部是否包含关键词（error/exception/failed/traceback 等）或 JSON 闭合结构，只有检测到才走 head+tail 分割，否则默认只保留开头。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;截断后附加提示&lt;/strong&gt;：告诉模型内容不完整，可以用 offset/limit 重新获取。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二层：全局预算守卫&lt;a href=&quot;#第二层全局预算守卫&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每次发 LLM 请求前，通过 &lt;code&gt;transformContext&lt;/code&gt; 管线自动执行全局预算检查：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;先把每条 tool result 按单条上限裁一遍&lt;/li&gt;
&lt;li&gt;估算所有消息的总字符开销&lt;/li&gt;
&lt;li&gt;如果超过全局预算（context window 的 &lt;strong&gt;75%&lt;/strong&gt;），从&lt;strong&gt;最早的 tool result&lt;/strong&gt; 开始逐条替换为占位提示&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;📌 核心思路：越早的 tool result 对当前决策影响越小，优先牺牲给新内容让路。这是一种&lt;strong&gt;抢占式策略&lt;/strong&gt;——不等 context overflow 报错，主动腾空间。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;字符预算计算公式&lt;a href=&quot;#字符预算计算公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;字符预算 = context window tokens × 每 token 字符数 × 比例系数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;以 128K token 模型为例：&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;预算类型&lt;/th&gt;&lt;th&gt;计算&lt;/th&gt;&lt;th&gt;结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;单条上限&lt;/td&gt;&lt;td&gt;128000 × 0.3 × 4&lt;/td&gt;&lt;td&gt;≈ 150K 字符&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;全局预算&lt;/td&gt;&lt;td&gt;128000 × 4 × 0.75&lt;/td&gt;&lt;td&gt;≈ 384K 字符&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ OpenClaw 对 tool result 用 &lt;strong&gt;token 换算系数 2&lt;/strong&gt;（而非 4），因为代码和结构化文本的 token 密度比自然语言高，估算更保守准确。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、扩展知识&lt;a href=&quot;#四扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;为什么不能只保留前 N 个字符？&lt;a href=&quot;#为什么不能只保留前-n-个字符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最简单的方案 &lt;code&gt;result.substring(0, maxLen)&lt;/code&gt; 会&lt;strong&gt;丢关键信息&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;grep 搜索返回 200 个匹配，最相关的那条可能在中间或末尾&lt;/li&gt;
&lt;li&gt;命令执行失败，stdout 里一堆正常输出，真正的 error 在最后几行&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;📌 只保留开头 → 模型拿到的全是无用信息，还以为执行成功了。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;head+tail 策略&lt;/strong&gt;虽然不完美，但至少能兜住两头。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;多 block 内容处理&lt;a href=&quot;#多-block-内容处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;truncateToolResultMessage()&lt;/code&gt; 对多 block 内容会&lt;strong&gt;按比例分配字符 budget&lt;/strong&gt;，每个 block 都能分到一份额度，避免某个 block 独占所有空间。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;其他 Agent 框架怎么处理&lt;a href=&quot;#其他-agent-框架怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;框架&lt;/th&gt;&lt;th&gt;处理方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LangChain&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;ToolMessage 默认不截断，社区实践通常在 tool 的 output parser 层加限制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Anthropic Claude&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;建议单条 tool result 不超过 &lt;strong&gt;100K 字符&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AutoGPT&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;早期版本没做截断，文件读取返回太大直接撑爆 context，后来才加了 &lt;code&gt;max_length&lt;/code&gt; 参数&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;五、面试官追问&lt;a href=&quot;#五面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：截断后模型根据不完整信息做了错误判断，怎么处理？&lt;a href=&quot;#q1截断后模型根据不完整信息做了错误判断怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在截断标记里告诉模型&lt;strong&gt;内容被截断了&lt;/strong&gt;，让它自己决定要不要重新获取&lt;/li&gt;
&lt;li&gt;附上原始内容的&lt;strong&gt;字符数和行数&lt;/strong&gt;，模型就能判断丢了多少信息&lt;/li&gt;
&lt;li&gt;如果模型觉得关键信息可能在被截断的部分，可以发起&lt;strong&gt;更精确的二次查询&lt;/strong&gt;（缩小搜索范围或指定行号范围）&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;OpenClaw 的截断后缀会明确告诉模型 &lt;code&gt;Content truncated&lt;/code&gt;，并建议使用 offset/limit 参数。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：head+tail 截断的比例怎么定？&lt;a href=&quot;#q2headtail-截断的比例怎么定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答&lt;/strong&gt;：没有通用最优比例，&lt;strong&gt;看 tool 的类型&lt;/strong&gt;。&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具类型&lt;/th&gt;&lt;th&gt;推荐比例&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;搜索类工具&lt;/td&gt;&lt;td&gt;head 70% / tail 30%&lt;/td&gt;&lt;td&gt;结果按相关性排序，head 更重要&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;命令执行类工具&lt;/td&gt;&lt;td&gt;head 40% / tail 60%&lt;/td&gt;&lt;td&gt;关键信息往往在末尾（错误堆栈）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;OpenClaw 的做法&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;tail 拿 budget 的 30%（上限 4000 字符）&lt;/li&gt;
&lt;li&gt;head 拿剩余大部分空间（最少保留 2000 字符）&lt;/li&gt;
&lt;li&gt;只有 &lt;code&gt;hasImportantTail()&lt;/code&gt; 检测到尾部含 error/exception/traceback 等关键词时才走 head+tail，否则默认只保留开头&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：除了截断，还有没有其他方式处理超大 tool result？&lt;a href=&quot;#q3除了截断还有没有其他方式处理超大-tool-result&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答&lt;/strong&gt;：有三种思路：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方式&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工具端过滤&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;代码搜索只返回最相关的 top 10 结果，不吐全量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;摘要压缩&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;用摘要模型先把大结果压缩成摘要再喂给主模型（Anthropic 内部有类似 sub-agent）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;分页&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;把大结果拆成多页，模型可以选择翻页获取更多内容&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;📌 截断是最简单粗暴的兜底方案，理想情况下应该在工具端就控制好输出量。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;六、总结思维导图&lt;a href=&quot;#六总结思维导图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Agent 工具返回超大结果怎么办？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 带来的问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── Token 爆炸&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── 挤占上下文空间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 延迟飙升&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 处理思路：限额 + 截断&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── head + tail 截断（保留开头+尾部）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── OpenClaw 两层防护&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── 1. 单条截断（context window 30%，硬上限 400K）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 2. 全局预算守卫（context window 75%，抢占式压缩）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 关键设计&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── hasImportantTail() 智能检测&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── 多 block 按比例分配&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 截断后附加提示（支持 offset/limit）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── 其他方案&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 工具端过滤（top N）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 摘要压缩（sub-agent）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── 分页&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;来源：面试鸭 · 2026最新AI大模型原理和应用面试题&lt;/em&gt;
&lt;em&gt;整理时间：2026-05-29&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>AI Generate CRUD Code 现场实操 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai_generate_crud_code_%E7%8E%B0%E5%9C%BA%E5%AE%9E%E6%93%8D_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai_generate_crud_code_%E7%8E%B0%E5%9C%BA%E5%AE%9E%E6%93%8D_%E6%95%B4%E7%90%86/</guid><description># AI_Generate_CRUD_Code_现场实操 ## 问题 AI_Generate_CRUD_Code_现场实操 ## 标准回答 # 现场实操：给定数据Schema生成符合RESTful规范的CRUD接口代码 这是一道典型的现场实</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI_Generate_CRUD_Code_现场实操&lt;a href=&quot;#ai_generate_crud_code_现场实操&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI_Generate_CRUD_Code_现场实操&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;现场实操：给定数据Schema生成符合RESTful规范的CRUD接口代码&lt;a href=&quot;#现场实操给定数据schema生成符合restful规范的crud接口代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;这是一道典型的现场实操题，考察候选人利用AI工具快速生成后端代码的能力？
在15分钟内完成，需要遵循以下步骤：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作流程&lt;/strong&gt;：
&lt;strong&gt;理解Schema&lt;/strong&gt;：提取数据模型定义（字段、类型、约束、关系）
&lt;strong&gt;设计RESTful端点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /resources&lt;/code&gt; - 列表查询（支持分页、过滤、排序）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /resources&lt;/code&gt; - 创建资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /resources/{id}&lt;/code&gt; - 获取单个资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT /resources/{id}&lt;/code&gt; - 全量更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PATCH /resources/{id}&lt;/code&gt; - 部分更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE /resources/{id}&lt;/code&gt; - 删除资源
&lt;strong&gt;生成代码&lt;/strong&gt;：使用AI工具（如Copilot、ChatGPT）输出控制器、服务层、数据访问层代码
&lt;strong&gt;解释关键逻辑&lt;/strong&gt;：验证、错误处理、状态码选择、数据一致性&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;关键实现逻辑要点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据验证&lt;/strong&gt;：使用DTO + 校验注解（如&lt;code&gt;@Valid&lt;/code&gt;、&lt;code&gt;@NotNull&lt;/code&gt;、&lt;code&gt;@Size&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理&lt;/strong&gt;：全局异常处理器返回标准错误格式（如&lt;code&gt;{“code”: 400, “message”: “...”}&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RESTful状态码&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;201 Created（POST成功）&lt;/li&gt;
&lt;li&gt;200 OK（GET/PUT/PATCH成功）&lt;/li&gt;
&lt;li&gt;204 No Content（DELETE成功）&lt;/li&gt;
&lt;li&gt;404 Not Found（资源不存在）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分页规范&lt;/strong&gt;：使用&lt;code&gt;page&lt;/code&gt;、&lt;code&gt;size&lt;/code&gt;参数，返回&lt;code&gt;{“data”: [], “total”: 100, “page”: 1, “size”: 20}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 常用框架示例（Spring Boot）&lt;a href=&quot;#1-常用框架示例spring-boot&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Controller示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RestController&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RequestMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserController&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PageableDefault&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Pageable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pageable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PostMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CREATED&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserCreateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PutMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, @&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserUpdateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;DeleteMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NO_CONTENT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 数据验证的错误响应&lt;a href=&quot;#2-数据验证的错误响应&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;@Valid&lt;/code&gt;触发校验，&lt;code&gt;MethodArgumentNotValidException&lt;/code&gt;处理&lt;/li&gt;
&lt;li&gt;返回格式：&lt;code&gt;{“field”: “email”, “message”: “邮箱格式不正确”}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. AI生成代码的技巧&lt;a href=&quot;#3-ai生成代码的技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;明确约束&lt;/strong&gt;：在prompt中包含Schema定义、技术栈（如Spring Boot 3 + JPA）、代码风格要求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分步生成&lt;/strong&gt;：先生成实体类，再生成Repository、Service、Controller&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人工修正&lt;/strong&gt;：检查生成的业务逻辑是否正确，补充遗漏的验证规则&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：如果Schema包含嵌套对象或数组，RESTful API怎么设计？&lt;a href=&quot;#q1如果schema包含嵌套对象或数组restful-api怎么设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：使用子资源端点，如&lt;code&gt;POST /users/{userId}/orders&lt;/code&gt;。或者将嵌套对象序列化为JSON字段，在单个请求中包含完整结构。通常推荐前者保持语义清晰。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：如何处理并发更新冲突？&lt;a href=&quot;#q2如何处理并发更新冲突&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：乐观锁方案：在表中增加&lt;code&gt;version&lt;/code&gt;字段，更新时检查版本号。若版本不匹配返回409 Conflict。AI生成代码时可要求添加&lt;code&gt;@Version&lt;/code&gt;注解（JPA）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：AI生成的代码可能存在SQL注入风险，怎么防范？&lt;a href=&quot;#q3ai生成的代码可能存在sql注入风险怎么防范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：强制要求使用参数化查询（如JPA、MyBatis的&lt;code&gt;#{}&lt;/code&gt;），禁止字符串拼接SQL。可在prompt中明确“使用防SQL注入写法”，并在代码审查时重点检查。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：15分钟内如果AI生成代码有bug，面试官会如何评判？&lt;a href=&quot;#q415分钟内如果ai生成代码有bug面试官会如何评判&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：更看重思路和解决问题的过程。你能识别出bug的位置、解释原因并提出修正方案，比完美无bug的代码更重要。建议先输出核心结构，再逐步完善验证逻辑。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;本题考察AI辅助编程能力与RESTful规范掌握程度。关键在于：快速理解Schema、设计规范接口、生成可运行的代码骨架，并能解释验证、错误处理、并发控制等&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;。AI工具是辅助，候选人的设计思路和问题排查能力才是评分核心。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;现场实操：给定数据Schema生成符合RESTful规范的CRUD接口代码&lt;a href=&quot;#现场实操给定数据schema生成符合restful规范的crud接口代码-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这是一道典型的现场实操题，考察候选人利用AI工具快速生成后端代码的能力。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在15分钟内完成，需要遵循以下步骤：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;操作流程&lt;/strong&gt;：
&lt;strong&gt;理解Schema&lt;/strong&gt;：提取数据模型定义（字段、类型、约束、关系）
&lt;strong&gt;设计RESTful端点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /resources&lt;/code&gt; - 列表查询（支持分页、过滤、排序）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /resources&lt;/code&gt; - 创建资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /resources/{id}&lt;/code&gt; - 获取单个资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT /resources/{id}&lt;/code&gt; - 全量更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PATCH /resources/{id}&lt;/code&gt; - 部分更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE /resources/{id}&lt;/code&gt; - 删除资源
&lt;strong&gt;生成代码&lt;/strong&gt;：使用AI工具（如Copilot、ChatGPT）输出控制器、服务层、数据访问层代码
&lt;strong&gt;解释关键逻辑&lt;/strong&gt;：验证、错误处理、状态码选择、数据一致性&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;关键实现逻辑要点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据验证&lt;/strong&gt;：使用DTO + 校验注解（如&lt;code&gt;@Valid&lt;/code&gt;、&lt;code&gt;@NotNull&lt;/code&gt;、&lt;code&gt;@Size&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理&lt;/strong&gt;：全局异常处理器返回标准错误格式（如&lt;code&gt;{“code”: 400, “message”: “...”}&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RESTful状态码&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;201 Created（POST成功）&lt;/li&gt;
&lt;li&gt;200 OK（GET/PUT/PATCH成功）&lt;/li&gt;
&lt;li&gt;204 No Content（DELETE成功）&lt;/li&gt;
&lt;li&gt;404 Not Found（资源不存在）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分页规范&lt;/strong&gt;：使用&lt;code&gt;page&lt;/code&gt;、&lt;code&gt;size&lt;/code&gt;参数，返回&lt;code&gt;{“data”: [], “total”: 100, “page”: 1, “size”: 20}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Controller示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RestController&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RequestMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserController&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PageableDefault&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Pageable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pageable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PostMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CREATED&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserCreateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PutMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, @&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserUpdateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;DeleteMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NO_CONTENT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;code&gt;@Valid&lt;/code&gt;触发校验，&lt;code&gt;MethodArgumentNotValidException&lt;/code&gt;处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回格式：&lt;code&gt;{“field”: “email”, “message”: “邮箱格式不正确”}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确约束&lt;/strong&gt;：在prompt中包含Schema定义、技术栈（如Spring Boot 3 + JPA）、代码风格要求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分步生成&lt;/strong&gt;：先生成实体类，再生成Repository、Service、Controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;人工修正&lt;/strong&gt;：检查生成的业务逻辑是否正确，补充遗漏的验证规则&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;：使用子资源端点，如&lt;code&gt;POST /users/{userId}/orders&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;或者将嵌套对象序列化为JSON字段，在单个请求中包含完整结构。&lt;/li&gt;
&lt;li&gt;通常推荐前者保持语义清晰。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;AI_Generate_CRUD_Code_现场实操&lt;/p&gt;&lt;p&gt;这是一道典型的现场实操题，考察候选人利用AI工具快速生成后端代码的能力。在15分钟内完成，需要遵循以下步骤：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作流程&lt;/strong&gt;：
&lt;strong&gt;理解Schema&lt;/strong&gt;：提取数据模型定义（字段、类型、约束、关系）
&lt;strong&gt;设计RESTful端点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /resources&lt;/code&gt; - 列表查询（支持分页、过滤、排序）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /resources&lt;/code&gt; - 创建资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /resources/{id}&lt;/code&gt; - 获取单个资源&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT /resources/{id}&lt;/code&gt; - 全量更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PATCH /resources/{id}&lt;/code&gt; - 部分更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE /resources/{id}&lt;/code&gt; - 删除资源
&lt;strong&gt;生成代码&lt;/strong&gt;：使用AI工具（如Copilot、ChatGPT）输出控制器、服务层、数据访问层代码
&lt;strong&gt;解释关键逻辑&lt;/strong&gt;：验证、错误处理、状态码选择、数据一致性&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;关键实现逻辑要点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据验证&lt;/strong&gt;：使用DTO + 校验注解（如&lt;code&gt;@Valid&lt;/code&gt;、&lt;code&gt;@NotNull&lt;/code&gt;、&lt;code&gt;@Size&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理&lt;/strong&gt;：全局异常处理器返回标准错误格式（如&lt;code&gt;{“code”: 400, “message”: “...”}&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RESTful状态码&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;201 Created（POST成功）&lt;/li&gt;
&lt;li&gt;200 OK（GET/PUT/PATCH成功）&lt;/li&gt;
&lt;li&gt;204 No Content（DELETE成功）&lt;/li&gt;
&lt;li&gt;404 Not Found（资源不存在）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分页规范&lt;/strong&gt;：使用&lt;code&gt;page&lt;/code&gt;、&lt;code&gt;size&lt;/code&gt;参数，返回&lt;code&gt;{“data”: [], “total”: 100, “page”: 1, “size”: 20}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Controller示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RestController&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;RequestMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserController&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PageableDefault&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Pageable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pageable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PostMapping&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CREATED&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserCreateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;GetMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;PutMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserDTO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, @&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;RequestBody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserUpdateDTO&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;DeleteMapping&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ResponseStatus&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpStatus&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NO_CONTENT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;PathVariable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ ... }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;code&gt;@Valid&lt;/code&gt;触发校验，&lt;code&gt;MethodArgumentNotValidException&lt;/code&gt;处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回格式：&lt;code&gt;{“field”: “email”, “message”: “邮箱格式不正确”}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确约束&lt;/strong&gt;：在prompt中包含Schema定义、技术栈（如Spring Boot 3 + JPA）、代码风格要求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分步生成&lt;/strong&gt;：先生成实体类，再生成Repository、Service、Controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;人工修正&lt;/strong&gt;：检查生成的业务逻辑是否正确，补充遗漏的验证规则&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：使用子资源端点，如&lt;code&gt;POST /users/{userId}/orders&lt;/code&gt;。或者将嵌套对象序列化为JSON字段，在单个请求中包含完整结构。通常推荐前者保持语义清晰。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;Q2：如何处理并发更新冲突？&lt;a href=&quot;#q2如何处理并发更新冲突-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：乐观锁方案：在表中增加&lt;code&gt;version&lt;/code&gt;字段，更新时检查版本号。若版本不匹配返回409 Conflict。AI生成代码时可要求添加&lt;code&gt;@Version&lt;/code&gt;注解（JPA）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;Q3：AI生成的代码可能存在SQL注入风险，怎么防范？&lt;a href=&quot;#q3ai生成的代码可能存在sql注入风险怎么防范-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在15分钟内完成，需要遵循以下步骤：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;理解Schema&lt;/strong&gt;：提取数据模型定义（字段、类型、约束、关系）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设计RESTful端点&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /resources&lt;/code&gt; - 列表查询（支持分页、过滤、排序）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /resources&lt;/code&gt; - 创建资源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>AI｜985硕校招｜阿里淘天AI应用开发二三面已offer</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai-985%E7%A1%95%E6%A0%A1%E6%8B%9B-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%BA%8C%E4%B8%89%E9%9D%A2%E5%B7%B2offer/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai-985%E7%A1%95%E6%A0%A1%E6%8B%9B-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%BA%8C%E4%B8%89%E9%9D%A2%E5%B7%B2offer/</guid><description># AI｜985硕校招｜阿里淘天AI 应用开发二三面已offer &gt; 来源：面经哥（微信公众号） &gt; 发布时间：2026年5月19日 &gt; 采集时间：2026-06-05 --- ## 个人背景 211本科，985硕 --- ## 二面 全程</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI｜985硕校招｜阿里淘天AI 应用开发二三面已offer&lt;a href=&quot;#ai985硕校招阿里淘天ai-应用开发二三面已offer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：面经哥（微信公众号）&lt;br /&gt;
发布时间：2026年5月19日&lt;br /&gt;
采集时间：2026-06-05&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;个人背景&lt;a href=&quot;#个人背景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;211本科，985硕&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二面&lt;a href=&quot;#二面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;全程不到 60 分钟，&lt;strong&gt;没有手撕代码&lt;/strong&gt;，也没有问常规 Java 八股。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;一、自我介绍&lt;a href=&quot;#一自我介绍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;自我介绍一下。&lt;/li&gt;
&lt;li&gt;和同龄人相比，你觉得自己的专业优势和不足分别是什么？&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;二、AI 相关问题&lt;a href=&quot;#二ai-相关问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;你怎么看待 AI？平时会在哪些场景中使用 AI？&lt;/li&gt;
&lt;li&gt;平时常用哪些 AI 工具？为什么会选择这些工具？比如 GPT、Claude、Gemini 等。&lt;/li&gt;
&lt;li&gt;你对 Open Claw 有哪些了解？你认为它的核心亮点是什么？&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;三、工程与安全问题&lt;a href=&quot;#三工程与安全问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;在海量数据场景下，数据库可以从哪些方向进行优化？比如分库分表、缓存策略等。&lt;/li&gt;
&lt;li&gt;项目中如果涉及隐私数据，你会如何保障隐私安全？&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;四、项目提问&lt;a href=&quot;#四项目提问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Agent 项目的开发背景是什么？核心功能有哪些？&lt;/li&gt;
&lt;li&gt;Agent 的完整技术链路是怎样的？实际使用反馈如何？和市面上的 AI 产品相比，你觉得它有哪些优势、不足，以及后续改进方向？&lt;/li&gt;
&lt;li&gt;如果要从 Skill 升级为 AI Agent，关键设计点是什么？&lt;/li&gt;
&lt;li&gt;实习经历相关提问。（这部分问了大概十几分钟，具体内容略）&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;五、反问环节&lt;a href=&quot;#五反问环节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;阿里淘天目前的技术栈构成是怎样的？&lt;/li&gt;
&lt;li&gt;为什么这轮没有重点考察 Java 知识点和项目细节？&lt;/li&gt;
&lt;li&gt;面试结果大概多久会出？&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三面&lt;a href=&quot;#三面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;面试感受：有些问的还有点难度，感觉没完全答到面试官想要的。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h3&gt;一、Agent 提问&lt;a href=&quot;#一agent-提问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;你在 AI Agent 相关方向的学习情况如何？比如神经网络、深度学习等课程是否有过系统学习经历？&lt;/li&gt;
&lt;li&gt;如果要设计一个面向电商运营小二的 AI Agent，用来完成&lt;strong&gt;活动海报文案生成&lt;/strong&gt;、&lt;strong&gt;商品卖点提炼&lt;/strong&gt;、&lt;strong&gt;促销策略建议&lt;/strong&gt;这三类任务，你会怎么设计？&lt;/li&gt;
&lt;li&gt;在这个 AI Agent 的设计中，为什么会选择 Skill 方案？&lt;/li&gt;
&lt;li&gt;针对活动海报文案生成、商品卖点提炼、促销策略建议这三类任务，哪些环节需要调用工具？具体会调用哪些工具？&lt;/li&gt;
&lt;li&gt;如果 AI Agent 的输出结果不稳定，你会优先排查哪些方面？&lt;/li&gt;
&lt;li&gt;你会如何设定 AI Agent 的评测目标？&lt;/li&gt;
&lt;li&gt;最近 3 个月重点学习了哪些新技术？你是通过什么方式学习的？为什么会重点学习这些内容？&lt;/li&gt;
&lt;li&gt;你认为 OpenClaw 核心解决的是什么问题？它的边界和局限在哪里？&lt;/li&gt;
&lt;li&gt;OpenClaw 主要从哪些层面尝试解决安全性问题？其中，指令清洗是如何实现的？&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试特点总结&lt;a href=&quot;#面试特点总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;二面&lt;/strong&gt;：偏综合考察，AI 视角 + 工程安全 + 项目深挖，无手撕代码，无 Java 八股&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三面&lt;/strong&gt;：重点考察 AI Agent 设计能力，围绕电商场景的 Agent 架构设计、工具调用、评测体系、安全性等展开&lt;/li&gt;
&lt;li&gt;共同关注点：OpenClaw、Agent 项目经验、AI 工具使用习惯&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>AI面试模拟练习清单</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai%E9%9D%A2%E8%AF%95%E6%A8%A1%E6%8B%9F%E7%BB%83%E4%B9%A0%E6%B8%85%E5%8D%95/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-ai%E9%9D%A2%E8%AF%95%E6%A8%A1%E6%8B%9F%E7%BB%83%E4%B9%A0%E6%B8%85%E5%8D%95/</guid><description># 🎯 AI Agent 开发 · 面试模拟练习清单 &gt; 📅 生成时间：2026-06-03 &gt; 📚 来源：基于 19 份面经 + 秋招复习笔记 &gt; 🎯 适用：AI 应用开发 / Agent 开发 / 大模型应用 校招岗位 --- ## 一</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;🎯 AI Agent 开发 · 面试模拟练习清单&lt;a href=&quot;#-ai-agent-开发--面试模拟练习清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;📅 生成时间：2026-06-03
📚 来源：基于 19 份面经 + 秋招复习笔记
🎯 适用：AI 应用开发 / Agent 开发 / 大模型应用 校招岗位&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、各大厂岗位核心要求（基于面经提炼）&lt;a href=&quot;#一各大厂岗位核心要求基于面经提炼&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;🏢 字节跳动（AI Agent 开发）&lt;a href=&quot;#-字节跳动ai-agent-开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;扎实的 Agent 项目经验，能说清动机、挑战、迭代过程&lt;/li&gt;
&lt;li&gt;了解主流 Agent 框架（LangChain、CrewAI、AutoGPT 等）&lt;/li&gt;
&lt;li&gt;熟悉 LLM 上下文工程（Context Window、压缩策略）&lt;/li&gt;
&lt;li&gt;能设计 Memory 机制（短/长期记忆、工作记忆）&lt;/li&gt;
&lt;li&gt;掌握幻觉防御体系（多层级）&lt;/li&gt;
&lt;li&gt;Prompt 工程能力（模块化、版本管理）&lt;/li&gt;
&lt;li&gt;Agent 评测与优化验证能力（四层评测体系）&lt;/li&gt;
&lt;li&gt;代码能力：Java/Python + 算法基础&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏢 阿里淘天（AI 应用开发）&lt;a href=&quot;#-阿里淘天ai-应用开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Agent 四大核心组件理解（规划/记忆/工具/执行）&lt;/li&gt;
&lt;li&gt;会话压缩与上下文管理&lt;/li&gt;
&lt;li&gt;长期记忆设计与写入策略&lt;/li&gt;
&lt;li&gt;agent.md vs memory.md vs skills.md 职责区分&lt;/li&gt;
&lt;li&gt;工具与 Skill 机制设计&lt;/li&gt;
&lt;li&gt;Java 基础扎实（HashMap、线程池、并发）&lt;/li&gt;
&lt;li&gt;Agent 评测体系&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏢 腾讯（大模型应用开发）&lt;a href=&quot;#-腾讯大模型应用开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;一面：概念扎实（Agent、RAG、Prompt Engineering）&lt;/li&gt;
&lt;li&gt;二面（系统设计）：Planner 设计、上下文优先级、异常处理、可审计 Agent&lt;/li&gt;
&lt;li&gt;能回答”为什么不这么做”层面（深度思考）&lt;/li&gt;
&lt;li&gt;技术选型的 Trade-off 分析&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏢 滴滴（AI 全栈开发）&lt;a href=&quot;#-滴滴ai-全栈开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;MCP 协议深度理解（运作方式、协议对比、并发处理）&lt;/li&gt;
&lt;li&gt;AI Coding Tools 了解程度&lt;/li&gt;
&lt;li&gt;MCP vs Skill 区别&lt;/li&gt;
&lt;li&gt;前端+后端基础&lt;/li&gt;
&lt;li&gt;智能体三要素&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;🏢 通用要求&lt;a href=&quot;#-通用要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Agent 四种范式对比（Tool Use / ReAct / Plan-and-Execute / Multi-Agent）&lt;/li&gt;
&lt;li&gt;RAG 完整链路（Chunking → Embedding → 检索 → Rerank）&lt;/li&gt;
&lt;li&gt;Function Calling / Tool Use 流程&lt;/li&gt;
&lt;li&gt;多 Agent 架构设计&lt;/li&gt;
&lt;li&gt;工程化与可靠性设计（异常处理、性能优化、Token 优化）&lt;/li&gt;
&lt;li&gt;算法基础（LeetCode Hot 100）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、高频面试题清单（分模块，共 20 题）&lt;a href=&quot;#二高频面试题清单分模块共-20-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;【Agent 核心概念】5 题&lt;a href=&quot;#agent-核心概念5-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;什么是 Agent？它与普通 LLM 应用的本质区别是什么？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 的四大核心组件是什么？分别做什么？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ReAct、Plan-and-Execute、Tool Use、Multi-Agent 四种范式如何对比？它们是线性进化关系吗？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多 Agent 架构有哪几种通信模式？各有什么优缺点？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 的长短期记忆是怎么设计的？写入和检索的策略是什么？&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;【RAG 系统】3 题&lt;a href=&quot;#rag-系统3-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RAG 的完整链路是什么？每个环节的关键点是什么？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 有哪些常见的优化手段？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 和微调（Fine-tuning）的适用场景有什么区别？什么时候不应该上 RAG？&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;【MCP 协议】3 题&lt;a href=&quot;#mcp-协议3-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MCP 协议是什么？它的工作原理是怎样的？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 和 Function Calling 有什么区别和联系？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 和 Skill 机制的区别是什么？&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;【工程实践】4 题&lt;a href=&quot;#工程实践4-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;怎么减少 Agent 的幻觉？请从多个层面说明。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt 是怎么构建和优化的？结构化 Prompt 的设计原则是什么？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话压缩怎么做？什么时候触发？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 的评测体系怎么设计？评估哪些维度？&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;【项目面试话术】3 题&lt;a href=&quot;#项目面试话术3-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;请介绍你做过的一个 Agent 项目（用”业务痛点→初版方案→踩坑迭代→量化收益”结构）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这个设计你是怎么考虑的？有没有考虑过其他方案？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遇到过什么问题？怎么解决的？&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;【算法/CS 基础】2 题&lt;a href=&quot;#算法cs-基础2-题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;线程池的核心参数有哪些？怎么设计一个合适的线程池？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单讲一下 Transformer 的流程和注意力机制。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、逐题标准答案&lt;a href=&quot;#三逐题标准答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;第 1 题：什么是 Agent？它与普通 LLM 应用的本质区别是什么？&lt;a href=&quot;#第-1-题什么是-agent它与普通-llm-应用的本质区别是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;参考标准答案（面试风格）：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Agent 是以 &lt;strong&gt;LLM 为大脑&lt;/strong&gt;、具备&lt;strong&gt;自主规划能力&lt;/strong&gt;、能调用&lt;strong&gt;外部工具&lt;/strong&gt;、拥有&lt;strong&gt;记忆系统&lt;/strong&gt;、可以&lt;strong&gt;多步推理循环&lt;/strong&gt;直至达成目标的智能系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;与普通 LLM 应用的本质区别（从 4 个维度）：&lt;/strong&gt;&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;普通 LLM 应用&lt;/th&gt;&lt;th&gt;Agent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;交互模式&lt;/td&gt;&lt;td&gt;被动一问一答，用户每步引导&lt;/td&gt;&lt;td&gt;目标驱动，自主规划执行&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具调用&lt;/td&gt;&lt;td&gt;❌ 无，只能输出文本&lt;/td&gt;&lt;td&gt;✅ 调用 API / 操作文件 / 控制浏览器等&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;记忆系统&lt;/td&gt;&lt;td&gt;仅对话上下文&lt;/td&gt;&lt;td&gt;短期记忆 + 长期记忆 + 工作记忆&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;核心循环&lt;/td&gt;&lt;td&gt;单次推理 → 输出&lt;/td&gt;&lt;td&gt;Observe → Think → Act → Observe… 循环&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;核心架构公式：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Agent = LLM(Brain) + Planning + Memory + Tool Use&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;面试加分比喻：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;普通 LLM 是”知识渊博的顾问”——你问什么他答什么；
Agent 是”能自己干活的员工”——你说”分析这份报告做成 PPT 发我邮箱”，他自己查资料、分析、做 PPT、发邮件，不需要你一步步指挥。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 2 题：Agent 的四大核心组件是什么？分别做什么？&lt;a href=&quot;#第-2-题agent-的四大核心组件是什么分别做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;参考标准答案（面试风格）：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Agent 的四大核心组件通常有两种划分方式，面试回答&lt;strong&gt;推荐用第一种&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式一（阿里淘天面经考察版本）：&lt;/strong&gt;&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;组件&lt;/th&gt;&lt;th&gt;功能&lt;/th&gt;&lt;th&gt;面试要点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;① 规划 (Planning)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;将复杂任务拆解为子目标；通过 CoT / ToT 等方法推理；具备自我反思（Self-Reflection）修正行为&lt;/td&gt;&lt;td&gt;不只是”计划”，还要提 CoT、ReAct 等推理范式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;② 记忆 (Memory)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;短期记忆=上下文窗口（In-Context Learning）；长期记忆=向量数据库+检索（用于跨会话知识沉淀）&lt;/td&gt;&lt;td&gt;区分短期/长期，面试常问”记忆写入和检索策略”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;③ 工具使用 (Tool Use)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;调用外部 API / 数据库 / 浏览器 / 文件系统等，弥补模型权重无法存储实时或专有数据的局限&lt;/td&gt;&lt;td&gt;核心是 Function Calling / MCP 协议&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;④ 执行 (Execution / Acting)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;协调规划与执行之间的循环，将规划结果转化为实际动作，处理异常和重试&lt;/td&gt;&lt;td&gt;面试官常追问”出现异常怎么处理”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;方式二（Lilian Weng 经典框架）：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;LLM (Brain) + Planning + Memory + Tool Use&lt;/strong&gt;
即把 LLM 本身作为”大脑”组件，负责理解指令、推理决策、生成输出。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;你本次回答的评价：&lt;/strong&gt;&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;要点&lt;/th&gt;&lt;th&gt;评价&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;工具→操作外部环境&lt;/td&gt;&lt;td&gt;✅ 正确&lt;/td&gt;&lt;td&gt;抓住了核心功能&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;记忆→记住用户要求&lt;/td&gt;&lt;td&gt;⚠️ 太窄&lt;/td&gt;&lt;td&gt;记忆不只是”记住用户要求”，还包括短期记忆（上下文）、长期记忆（知识）、工作记忆（当前任务状态）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;规划→计划每一步&lt;/td&gt;&lt;td&gt;✅ 基本正确&lt;/td&gt;&lt;td&gt;可以补充”任务拆解 + 自我反思”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;缺第四个组件&lt;/td&gt;&lt;td&gt;❌ 漏了&lt;/td&gt;&lt;td&gt;第四个是 &lt;strong&gt;执行 (Execution)&lt;/strong&gt; 或 &lt;strong&gt;LLM 大脑本身&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;面试加分总结句：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Agent = LLM(Brain) + Planning + Memory + Tool Use，这四个组件通过 ReAct 循环（Observe→Think→Act→Observe…）协同工作，LLM 是大脑，规划拆解目标，记忆提供知识上下文，工具负责改变外部世界。”&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;练习方式&lt;/strong&gt;：我会逐题提问，你回答后我帮你判断正确性，查资料补充完善。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Compaction OpenClaw 策略 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-compaction_openclaw_%E7%AD%96%E7%95%A5_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-compaction_openclaw_%E7%AD%96%E7%95%A5_%E6%95%B4%E7%90%86/</guid><description># Compaction_OpenClaw_策略 ## 问题 Compaction_OpenClaw_策略 ## 标准回答 # 当对话历史太长、裁剪不够用时：Compaction（压缩）及 OpenClaw 策略 **Compaction（</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Compaction_OpenClaw_策略&lt;a href=&quot;#compaction_openclaw_策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Compaction_OpenClaw_策略&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;当对话历史太长、裁剪不够用时：Compaction（压缩）及 OpenClaw 策略&lt;a href=&quot;#当对话历史太长裁剪不够用时compaction压缩及-openclaw-策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Compaction（压实/压缩）&lt;/strong&gt;：当裁剪（直接丢早期消息）已经不够用时，换用？
LLM 把一大段对话历史压缩成一段精炼摘要，用摘要替换原始消息。这样大幅缩减 token 占用，但关键信息（决策、待办、结论）仍保留。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenClaw 的 Compaction 核心流程（4 步）&lt;/strong&gt;：
&lt;strong&gt;分块 (Chunking)&lt;/strong&gt;：按 token 预算切分消息（默认 2 段），保留最近 3 轮对话原文，只压缩更早的历史。
&lt;strong&gt;逐块摘要&lt;/strong&gt;：每个 chunk 分别发给 LLM 生成摘要；若单条消息超大（&amp;gt;50% 窗口），降级处理（跳过超大消息并标注省略）。
&lt;strong&gt;合并摘要&lt;/strong&gt;：再次调用 LLM 将多段局部摘要融合成一份最终摘要，要求保留：任务状态、进度、用户最后请求、决策及原因、待办、约束条件。
&lt;strong&gt;摘要增强&lt;/strong&gt;：追加额外上下文，包括工具调用失败记录（exit code + error）、文件操作记录、最近几轮原文摘要、从 &lt;code&gt;AGENTS.md&lt;/code&gt; 提取的关键规则。&lt;/p&gt;&lt;p&gt;最终摘要替换原始消息并写回会话历史。设计理念：宁可多花 token 调用 LLM 做摘要，也不丢关键信息。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 摘要质量检查与重试&lt;a href=&quot;#1-摘要质量检查与重试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;质量审计&lt;/strong&gt;（默认关闭，需显式启用）检查摘要是否包含 5 个必要章节：&lt;code&gt;Decisions&lt;/code&gt;、&lt;code&gt;Open TODOs&lt;/code&gt;、&lt;code&gt;Constraints/Rules&lt;/code&gt;、&lt;code&gt;Pending user asks&lt;/code&gt;、&lt;code&gt;Exact identifiers&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;启用后若审计失败，会触发重试（最多 3 次）。&lt;/li&gt;
&lt;li&gt;即使未启用审计，prompt 也会要求结构化章节。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 标识符严格保留策略&lt;a href=&quot;#2-标识符严格保留策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;LLM 容易把 UUID、文件路径、API key 等概括掉。OpenClaw 默认采用 &lt;strong&gt;strict 策略&lt;/strong&gt;，要求摘要中&lt;strong&gt;原样保留&lt;/strong&gt;所有不可重构的标识符（如文件名、URL、hash、端口等），并在摘要中包含 &lt;code&gt;Exact identifiers&lt;/code&gt; 章节。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Memory Flush 联动&lt;a href=&quot;#3-memory-flush-联动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在接近 Compaction 阈值时，会先触发一次额外 Agent 轮次（Memory Flush），让模型主动把重要信息写入 &lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt; 长期存储。相当于“考前再检查一遍”，防止压缩丢失关键信息。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. Post-compaction Context 注入&lt;a href=&quot;#4-post-compaction-context-注入&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;压缩完成后，从 &lt;code&gt;AGENTS.md&lt;/code&gt; 重新注入 “Session Startup” 和 “Red Lines” 两部分，避免模型遗忘红线规则。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 工具调用失败信息保留&lt;a href=&quot;#5-工具调用失败信息保留&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Compaction 会专门提取并保留工具调用失败信息（exit code + error）。避免 Agent 压缩后重复尝试已知不可行的路径。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：Compaction 本身也要调 LLM，token 开销大吗？&lt;a href=&quot;#q1compaction-本身也要调-llmtoken-开销大吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：单次 Compaction 消耗几千 token，但能把几万 token 的历史压缩到几千 token 的摘要，后续每轮都省大量 token。长对话收益显著，总 token 消耗远低于不做压缩。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：分段摘要的 chunk 大小怎么定？&lt;a href=&quot;#q2分段摘要的-chunk-大小怎么定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：按模型 Context 窗口的 40% 为基准，自适应调整（最低 15%），预留约 4096 token 给摘要 prompt。在消息边界切分，不跨消息。跨 chunk 的上下文关联靠合并摘要阶段弥补。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：Compaction 触发时机？&lt;a href=&quot;#q3compaction-触发时机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：按 token 数触发，每次组装 prompt 前计算当前历史占比，超过阈值即触发。不用固定轮次，因为每轮长度差异大。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：strict 策略保留标识符会不会导致摘要膨胀？&lt;a href=&quot;#q4strict-策略保留标识符会不会导致摘要膨胀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：会，但标识符通常只占几十 token，相比丢失标识符后任务失败再重试的代价，成本低得多。过时标识符可在 Memory Flush 阶段由 Agent 主动清理。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;当对话历史太长、裁剪不够用时：Compaction（压缩）及 OpenClaw 策略&lt;a href=&quot;#当对话历史太长裁剪不够用时compaction压缩及-openclaw-策略-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Compaction（压实/压缩）&lt;/strong&gt;：当裁剪（直接丢早期消息）已经不够用时，换用 LLM 把一大段对话历史压缩成一段精炼摘要，用摘要替换原始消息。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这样大幅缩减 token 占用，但关键信息（决策、待办、结论）仍保留。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw 的 Compaction 核心流程（4 步）&lt;/strong&gt;：
&lt;strong&gt;分块 (Chunking)&lt;/strong&gt;：按 token 预算切分消息（默认 2 段），保留最近 3 轮对话原文，只压缩更早的历史。&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;逐块摘要&lt;/strong&gt;：每个 chunk 分别发给 LLM 生成摘要；若单条消息超大（&amp;gt;50% 窗口），降级处理（跳过超大消息并标注省略）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;合并摘要&lt;/strong&gt;：再次调用 LLM 将多段局部摘要融合成一份最终摘要，要求保留：任务状态、进度、用户最后请求、决策及原因、待办、约束条件。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Compaction_OpenClaw_策略&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Compaction（压实/压缩）&lt;/strong&gt;：当裁剪（直接丢早期消息）已经不够用时，换用 LLM 把一大段对话历史压缩成一段精炼摘要，用摘要替换原始消息。这样大幅缩减 token 占用，但关键信息（决策、待办、结论）仍保留。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw 的 Compaction 核心流程（4 步）&lt;/strong&gt;：
&lt;strong&gt;分块 (Chunking)&lt;/strong&gt;：按 token 预算切分消息（默认 2 段），保留最近 3 轮对话原文，只压缩更早的历史。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;逐块摘要&lt;/strong&gt;：每个 chunk 分别发给 LLM 生成摘要；若单条消息超大（&amp;gt;50% 窗口），降级处理（跳过超大消息并标注省略）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;合并摘要&lt;/strong&gt;：再次调用 LLM 将多段局部摘要融合成一份最终摘要，要求保留：任务状态、进度、用户最后请求、决策及原因、待办、约束条件。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;摘要增强&lt;/strong&gt;：追加额外上下文，包括工具调用失败记录（exit code + error）、文件操作记录、最近几轮原文摘要、从 &lt;code&gt;AGENTS.md&lt;/code&gt; 提取的关键规则。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM 把一大段对话历史压缩成一段精炼摘要，用摘要替换原始消息。这样大幅缩减 token 占用，但关键信息（决策、待办、结论）仍保留。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw 的 Compaction 核心流程（4 步）&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分块 (Chunking)&lt;/strong&gt;：按 token 预算切分消息（默认 2 段），保留最近 3 轮对话原文，只压缩更早的历史。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;逐块摘要&lt;/strong&gt;：每个 chunk 分别发给 LLM 生成摘要；若单条消息超大（&amp;gt;50% 窗口），降级处理（跳过超大消息并标注省略）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;合并摘要&lt;/strong&gt;：再次调用 LLM 将多段局部摘要融合成一份最终摘要，要求保留：任务状态、进度、用户最后请求、决策及原因、待办、约束条件。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Context Engine Abstraction 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-context_engine_abstraction_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-context_engine_abstraction_%E6%95%B4%E7%90%86/</guid><description># Context_Engine_Abstraction ## 问题 Context_Engine_Abstraction ## 标准回答 # OpenClaw 的可插拔 Context Engine：为什么需要抽象？ 支持哪些策略？ **</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Context_Engine_Abstraction&lt;a href=&quot;#context_engine_abstraction&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context_Engine_Abstraction&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;OpenClaw 的可插拔 Context Engine：为什么需要抽象？&lt;a href=&quot;#openclaw-的可插拔-context-engine为什么需要抽象&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;支持哪些策略？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心原因：Context 管理没有万能方案。&lt;/strong&gt; 不同的应用场景、模型窗口大小、任务类型，最优策略差异巨大。将 Context 管理抽象成接口（定义“做什么”），让策略实现（“怎么做”）可独立替换，既方便内部迭代，也方便社区扩展。这是经典的&lt;strong&gt;策略模式&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;OpenClaw 的 &lt;code&gt;ContextEngine&lt;/code&gt; 接口覆盖完整生命周期：&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;阶段&lt;/th&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;初始化&lt;/td&gt;&lt;td&gt;&lt;code&gt;bootstrap&lt;/code&gt;&lt;/td&gt;&lt;td&gt;会话首次创建时初始化（如导入历史）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;存消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;ingest&lt;/code&gt;/&lt;code&gt;ingestBatch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新消息进来时如何存储、是否做额外处理（如向量化）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;挑消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;assemble&lt;/code&gt;&lt;/td&gt;&lt;td&gt;发给模型前，在 token 预算内挑选最合适的消息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;压消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;compact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;历史太长时如何压缩（摘要、裁剪、归档）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;轮后处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;afterTurn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;每轮对话结束后的收尾工作（持久化、触发后台压缩）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;子 Agent&lt;/td&gt;&lt;td&gt;&lt;code&gt;prepareSubagentSpawn&lt;/code&gt;/&lt;code&gt;onSubagentEnded&lt;/code&gt;&lt;/td&gt;&lt;td&gt;管理子 Agent 的上下文隔离与回收&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;销毁&lt;/td&gt;&lt;td&gt;&lt;code&gt;dispose&lt;/code&gt;&lt;/td&gt;&lt;td&gt;释放引擎持有的资源&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;核心调度逻辑只依赖这套接口，不关心具体实现。通过 &lt;code&gt;registerContextEngine(id, factory)&lt;/code&gt; 注册新引擎，在配置中通过 &lt;code&gt;plugins.slots.contextEngine&lt;/code&gt; 一行切换，无需改动核心代码。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;支持的不同策略方向：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认 legacy 策略&lt;/strong&gt;：全部塞进去，塞不下线性压缩最早消息，简单粗暴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于检索的 RAG 策略&lt;/strong&gt;：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层存储策略&lt;/strong&gt;：冷热分离，最近几轮放内存、摘要放本地、更早的放云端，按需拉取&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任务感知策略&lt;/strong&gt;：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，提升 token 预算质量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义压缩策略&lt;/strong&gt;：通过 &lt;code&gt;ownsCompaction&lt;/code&gt; 标记接管压缩，可实现树状摘要、按话题分支压缩等高级方式&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 内置的 legacy 引擎&lt;a href=&quot;#1-内置的-legacy-引擎&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当前默认引擎，实现直白：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingest&lt;/code&gt; 是 no-op（消息持久化由 SessionManager 负责）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 直接透传消息列表，不做筛选&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compact&lt;/code&gt; 委托给 &lt;code&gt;compactEmbeddedPiSessionDirect()&lt;/code&gt; 做线性压缩&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;策略粗糙：“全部塞进去，塞不下压缩最早的”。短对话够用，长对话或多话题场景效果不佳。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 高级策略详解&lt;a href=&quot;#2-高级策略详解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;基于检索的 Context Engine（RAG 风格）&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingest&lt;/code&gt; 时向量化每条消息，存入向量库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 时不按时间顺序，而是根据当前 query 做语义检索，捞最相关的历史片段&lt;/li&gt;
&lt;li&gt;对跨多天、换过多个话题的长对话，比线性截断有效得多&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;分层存储引擎（冷热分离）&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;热数据：最近 3-5 轮对话，直接放内存&lt;/li&gt;
&lt;li&gt;温数据：最近几个 compaction 周期的摘要，放本地文件&lt;/li&gt;
&lt;li&gt;冷数据：更早的历史，可扔外部存储甚至云端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 时按需从不同层拉取，保证最近上下文完整，又不撑爆内存&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;任务感知引擎&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;根据当前任务类型动态调整组装策略&lt;/li&gt;
&lt;li&gt;写代码时：优先保留代码相关历史、文件路径、报错信息&lt;/li&gt;
&lt;li&gt;闲聊时：优先保留情感偏好和个人信息&lt;/li&gt;
&lt;li&gt;相同 token 预算，内容质量更高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;自定义 Compaction 引擎&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;接口中的 &lt;code&gt;ownsCompaction: true&lt;/code&gt; 标记让引擎完全接管压缩策略&lt;/li&gt;
&lt;li&gt;默认线性压缩是”最早消息一坨压成摘要”&lt;/li&gt;
&lt;li&gt;可替换为树状摘要：按话题分支组织，每个分支独立压缩，保留更多结构化信息&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 插件注册机制&lt;a href=&quot;#3-插件注册机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;切换过程对核心代码零侵入：
实现 &lt;code&gt;ContextEngine&lt;/code&gt; 接口
调用 &lt;code&gt;registerContextEngine(&quot;my-engine-id&quot;, factory)&lt;/code&gt; 注册
配置文件里将 &lt;code&gt;plugins.slots.contextEngine&lt;/code&gt; 指向引擎 ID&lt;/p&gt;&lt;p&gt;类比 Webpack plugin 体系、VS Code 扩展机制。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：legacy 引擎的 ingest 是 no-op，消息谁在管？换成 RAG 引擎职责怎么迁移？&lt;a href=&quot;#q1legacy-引擎的-ingest-是-no-op消息谁在管换成-rag-引擎职责怎么迁移&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：legacy 引擎的消息持久化由 SessionManager 负责。换成 RAG 引擎后，&lt;code&gt;ingest&lt;/code&gt; 需真正接管消息处理（至少做向量化和入库）。迁移关键是 SessionManager 需让出”写消息”动作，或双方做好协调避免重复写。这正是抽象成接口的原因——职责边界可随引擎实现灵活调整。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：assemble 时 token 预算给得很紧，不同引擎的降级策略有何差异？&lt;a href=&quot;#q2assemble-时-token-预算给得很紧不同引擎的降级策略有何差异&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;legacy 引擎&lt;/strong&gt;：暴力从最早消息开始砍，砍到塞下为止&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 引擎&lt;/strong&gt;：按相关性排序，预算紧就少捞几条，质量衰减平滑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层存储引擎&lt;/strong&gt;：优先砍冷数据层，保住热数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任务感知引擎&lt;/strong&gt;：根据任务权重动态决定哪些历史先丢（如写代码时闲聊记录优先级最低）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：ownsCompaction 标记具体怎么生效？不设标记时压缩谁触发？&lt;a href=&quot;#q3ownscompaction-标记具体怎么生效不设标记时压缩谁触发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：压缩触发分两层：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不设 &lt;code&gt;ownsCompaction&lt;/code&gt;&lt;/strong&gt;：底层 Pi runtime 内置 auto-compaction 监控 token 用量，超阈值自动压缩，外层 Runner 不介入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设 &lt;code&gt;ownsCompaction: true&lt;/code&gt;&lt;/strong&gt;：Pi 的内置 auto-compaction 被禁用，改由引擎通过 &lt;code&gt;afterTurn&lt;/code&gt; 等钩子自主决定压缩时机和方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兜底机制&lt;/strong&gt;：无论是否设标记，Runner 在上下文快炸时会直接调 &lt;code&gt;contextEngine.compact()&lt;/code&gt; 做紧急压缩&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;ownsCompaction&lt;/code&gt; 控制”日常谁来管压缩”，但”快炸了”时 Runner 一定会兜底。这对有自己存储和索引体系的引擎特别重要。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 的可插拔 Context Engine：为什么需要抽象？&lt;a href=&quot;#openclaw-的可插拔-context-engine为什么需要抽象-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;支持哪些策略？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;**核心原因：Context 管理没有万能方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;** 不同的应用场景、模型窗口大小、任务类型，最优策略差异巨大。&lt;/li&gt;
&lt;li&gt;将 Context 管理抽象成接口（定义“做什么”），让策略实现（“怎么做”）可独立替换，既方便内部迭代，也方便社区扩展。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context_Engine_Abstraction&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;OpenClaw 的可插拔 Context Engine：为什么需要抽象？支持哪些策略？&lt;a href=&quot;#openclaw-的可插拔-context-engine为什么需要抽象支持哪些策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;核心原因：Context 管理没有万能方案。&lt;/strong&gt; 不同的应用场景、模型窗口大小、任务类型，最优策略差异巨大。将 Context 管理抽象成接口（定义“做什么”），让策略实现（“怎么做”）可独立替换，既方便内部迭代，也方便社区扩展。这是经典的&lt;strong&gt;策略模式&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;OpenClaw 的 &lt;code&gt;ContextEngine&lt;/code&gt; 接口覆盖完整生命周期：&lt;/li&gt;
&lt;/ul&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;阶段&lt;/th&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;初始化&lt;/td&gt;&lt;td&gt;&lt;code&gt;bootstrap&lt;/code&gt;&lt;/td&gt;&lt;td&gt;会话首次创建时初始化（如导入历史）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;存消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;ingest&lt;/code&gt;/&lt;code&gt;ingestBatch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新消息进来时如何存储、是否做额外处理（如向量化）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;挑消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;assemble&lt;/code&gt;&lt;/td&gt;&lt;td&gt;发给模型前，在 token 预算内挑选最合适的消息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;压消息&lt;/td&gt;&lt;td&gt;&lt;code&gt;compact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;历史太长时如何压缩（摘要、裁剪、归档）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;轮后处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;afterTurn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;每轮对话结束后的收尾工作（持久化、触发后台压缩）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;子 Agent&lt;/td&gt;&lt;td&gt;&lt;code&gt;prepareSubagentSpawn&lt;/code&gt;/&lt;code&gt;onSubagentEnded&lt;/code&gt;&lt;/td&gt;&lt;td&gt;管理子 Agent 的上下文隔离与回收&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;销毁&lt;/td&gt;&lt;td&gt;&lt;code&gt;dispose&lt;/code&gt;&lt;/td&gt;&lt;td&gt;释放引擎持有的资源&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;核心调度逻辑只依赖这套接口，不关心具体实现。通过 &lt;code&gt;registerContextEngine(id, factory)&lt;/code&gt; 注册新引擎，在配置中通过 &lt;code&gt;plugins.slots.contextEngine&lt;/code&gt; 一行切换，无需改动核心代码。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;支持的不同策略方向：&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认 legacy 策略&lt;/strong&gt;：全部塞进去，塞不下线性压缩最早消息，简单粗暴&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于检索的 RAG 策略&lt;/strong&gt;：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层存储策略&lt;/strong&gt;：冷热分离，最近几轮放内存、摘要放本地、更早的放云端，按需拉取&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任务感知策略&lt;/strong&gt;：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，提升 token 预算质量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义压缩策略&lt;/strong&gt;：通过 &lt;code&gt;ownsCompaction&lt;/code&gt; 标记接管压缩，可实现树状摘要、按话题分支压缩等高级方式&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;当前默认引擎，实现直白：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingest&lt;/code&gt; 是 no-op（消息持久化由 SessionManager 负责）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 直接透传消息列表，不做筛选&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compact&lt;/code&gt; 委托给 &lt;code&gt;compactEmbeddedPiSessionDirect()&lt;/code&gt; 做线性压缩&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;策略粗糙：“全部塞进去，塞不下压缩最早的”。短对话够用，长对话或多话题场景效果不佳。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;2. 高级策略详解&lt;a href=&quot;#2-高级策略详解-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;基于检索的 Context Engine（RAG 风格）&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingest&lt;/code&gt; 时向量化每条消息，存入向量库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 时不按时间顺序，而是根据当前 query 做语义检索，捞最相关的历史片段&lt;/li&gt;
&lt;li&gt;对跨多天、换过多个话题的长对话，比线性截断有效得多&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;分层存储引擎（冷热分离）&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;热数据：最近 3-5 轮对话，直接放内存&lt;/li&gt;
&lt;li&gt;温数据：最近几个 compaction 周期的摘要，放本地文件&lt;/li&gt;
&lt;li&gt;冷数据：更早的历史，可扔外部存储甚至云端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assemble&lt;/code&gt; 时按需从不同层拉取，保证最近上下文完整，又不撑爆内存&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;任务感知引擎&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;根据当前任务类型动态调整组装策略&lt;/li&gt;
&lt;li&gt;写代码时：优先保留代码相关历史、文件路径、报错信息&lt;/li&gt;
&lt;li&gt;闲聊时：优先保留情感偏好和个人信息&lt;/li&gt;
&lt;li&gt;相同 token 预算，内容质量更高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;自定义 Compaction 引擎&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;接口中的 &lt;code&gt;ownsCompaction: true&lt;/code&gt; 标记让引擎完全接管压缩策略&lt;/li&gt;
&lt;li&gt;默认线性压缩是”最早消息一坨压成摘要”&lt;/li&gt;
&lt;li&gt;可替换为树状摘要：按话题分支组织，每个分支独立压缩，保留更多结构化信息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;切换过程对核心代码零侵入：
实现 &lt;code&gt;ContextEngine&lt;/code&gt; 接口
调用 &lt;code&gt;registerContextEngine(&quot;my-engine-id&quot;, factory)&lt;/code&gt; 注册
配置文件里将 &lt;code&gt;plugins.slots.contextEngine&lt;/code&gt; 指向引擎 ID&lt;/p&gt;&lt;p&gt;类比 Webpack plugin 体系、VS Code 扩展机制。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心原因：Context 管理没有万能方案。&lt;/strong&gt; 不同的应用场景、模型窗口大小、任务类型，最优策略差异巨大。将 Context 管理抽象成接口（定义“做什么”），让策略实现（“怎么做”）可独立替换，既方便内部迭代，也方便社区扩展。这是经典的&lt;strong&gt;策略模式&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 的 &lt;code&gt;ContextEngine&lt;/code&gt; 接口覆盖完整生命周期：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 阶段 | 方法 | 作用 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;|------|------|------|&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 初始化 | &lt;code&gt;bootstrap&lt;/code&gt; | 会话首次创建时初始化（如导入历史） |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Context Window 核心约束与处理策略 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-context_window_%E6%A0%B8%E5%BF%83%E7%BA%A6%E6%9D%9F%E4%B8%8E%E5%A4%84%E7%90%86%E7%AD%96%E7%95%A5_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-context_window_%E6%A0%B8%E5%BF%83%E7%BA%A6%E6%9D%9F%E4%B8%8E%E5%A4%84%E7%90%86%E7%AD%96%E7%95%A5_%E6%95%B4%E7%90%86/</guid><description># Context_Window_核心约束与处理策略 ## 问题 Context_Window_核心约束与处理策略 ## 标准回答 # Agent 的 Context Window：核心约束与处理策略 ## 什么是 Context Wind</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Context_Window_核心约束与处理策略&lt;a href=&quot;#context_window_核心约束与处理策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context_Window_核心约束与处理策略&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Agent 的 Context Window：核心约束与处理策略&lt;a href=&quot;#agent-的-context-window核心约束与处理策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;什么是 Context Window？&lt;a href=&quot;#什么是-context-window&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context Window（上下文窗口）是大语言模型（LLM）单次请求能处理的最大 token 数量。Token 是模型处理文本的最小单位，英文约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么是 Agent 工程中最核心的约束？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Agent 的上下文里塞的东西太多：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;System Prompt（2000-5000 token）&lt;/li&gt;
&lt;li&gt;工具定义列表（每个 200-500 token，20 个工具就是 4000-10000 token）&lt;/li&gt;
&lt;li&gt;完整对话历史&lt;/li&gt;
&lt;li&gt;每次工具调用的入参和返回结果&lt;/li&gt;
&lt;li&gt;模型回复预留空间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一次 Agent 运行可能跑几十轮，每一轮结果都追加到历史中，Context 像滚雪球一样越来越大。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 行为变得不可预测。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. Context Window 里到底塞了什么？&lt;a href=&quot;#1-context-window-里到底塞了什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以典型编程 Agent 为例：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;固定开销&lt;/strong&gt;：System Prompt + 工具定义，每次请求都得带，约 6000-15000 token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对话历史&lt;/strong&gt;：每调一次工具增加两条消息（tool_call + tool_result）。工具返回一个文件内容可能占 3000-8000 token。跑 10 轮，历史轻松突破 50K token。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 在 &lt;code&gt;src/agents/context.ts&lt;/code&gt; 中将这些组成部分拆分，按优先级管理空间占用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. OpenClaw 的 Context Window 管理机制&lt;a href=&quot;#2-openclaw-的-context-window-管理机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;窗口大小确定优先级&lt;/strong&gt;（从高到低）：
&lt;code&gt;modelsConfig&lt;/code&gt; 用户显式指定的值
模型注册表自动发现的值
默认 128K token
&lt;code&gt;agents.defaults.contextTokens&lt;/code&gt; 做全局上限截断&lt;/p&gt;&lt;p&gt;&lt;strong&gt;两道防线&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;硬下限：&lt;code&gt;CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000&lt;/code&gt;，低于此值拒绝运行&lt;/li&gt;
&lt;li&gt;软告警：&lt;code&gt;CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000&lt;/code&gt;，低于此值警告用户&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;检测到 overflow 时的渐进式处理&lt;/strong&gt;：
先尝试 &lt;strong&gt;compaction&lt;/strong&gt;（压缩早期对话历史为摘要）
再尝试&lt;strong&gt;截断过大的 tool result&lt;/strong&gt;（保留头尾加摘要）
最后报错，建议用户 &lt;code&gt;/reset&lt;/code&gt; 或换更大窗口的模型&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 主流的 Context 管理策略&lt;a href=&quot;#3-主流的-context-管理策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;策略&lt;/th&gt;&lt;th&gt;做法&lt;/th&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;滑动窗口&lt;/td&gt;&lt;td&gt;只保留最近 N 轮对话&lt;/td&gt;&lt;td&gt;实现简单&lt;/td&gt;&lt;td&gt;易丢失任务关键信息（如最初需求）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;摘要压缩&lt;/td&gt;&lt;td&gt;用额外 LLM 调用压缩长对话&lt;/td&gt;&lt;td&gt;效果好&lt;/td&gt;&lt;td&gt;延迟 + token 成本，可能丢失细节&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;分层存储&lt;/td&gt;&lt;td&gt;按优先级分级：System + 最近2轮永久保留，中间做摘要，大文本截断&lt;/td&gt;&lt;td&gt;平衡保真度和空间&lt;/td&gt;&lt;td&gt;实现复杂&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;外部检索&lt;/td&gt;&lt;td&gt;历史存向量数据库，每轮检索相关片段&lt;/td&gt;&lt;td&gt;适合超长会话&lt;/td&gt;&lt;td&gt;检索质量依赖 embedding&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;实际生产&lt;/strong&gt;：混合使用，不依赖单一策略。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. Token 计算的坑&lt;a href=&quot;#4-token-计算的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;同样长度中文比英文 token 开销高 2-3 倍&lt;/li&gt;
&lt;li&gt;不同模型的 tokenizer 不同，同一段文本在 GPT 和 Claude 中 token 数可能差 10%-20%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw 做法&lt;/strong&gt;：用各模型对应的 tokenizer 精确计算，留出 10% 安全余量&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：实现 compaction 机制时，摘要格式怎么设计？哪些信息不能丢？&lt;a href=&quot;#q1实现-compaction-机制时摘要格式怎么设计哪些信息不能丢&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;必须保留三类信息&lt;/strong&gt;：
用户的原始任务目标
已经完成了哪些关键步骤
当前的执行状态和中间产物&lt;/p&gt;&lt;p&gt;&lt;strong&gt;格式建议&lt;/strong&gt;：结构化文本，分块标注，方便 LLM 快速抓重点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最忌讳&lt;/strong&gt;：丢了任务目标 → Agent 压缩完不知道自己在干嘛。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;（调试 bug 场景）：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：不同模型的 Context Window 差异很大，怎么处理兼容性？&lt;a href=&quot;#q2不同模型的-context-window-差异很大怎么处理兼容性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心思路&lt;/strong&gt;：自适应。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Agent 启动时查模型注册表拿到窗口大小&lt;/li&gt;
&lt;li&gt;动态计算固定开销占多少，留给对话历史的空间有多少&lt;/li&gt;
&lt;li&gt;小模型（如 8K）更要激进压缩，甚至限制可注册的工具数量&lt;/li&gt;
&lt;li&gt;OpenClaw 设硬下限 16K token，低于此值拒绝运行&lt;/li&gt;
&lt;li&gt;上层给用户推荐清单，标明每个模型适合跑的复杂度的任务&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：工具返回结果特别大时（如 1 万行日志），怎么处理？&lt;a href=&quot;#q3工具返回结果特别大时如-1-万行日志怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;不能全塞&lt;/strong&gt;（30K-50K token，一次吃大半窗口）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;处理思路&lt;/strong&gt;：按需截断 + 智能提取&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最简单&lt;/strong&gt;：设 tool result token 上限，超了就保留头尾各几百行 + “中间省略 N 行” 标记&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更聪明&lt;/strong&gt;：截断前让 LLM 做一轮 relevance extraction，只留与当前任务相关的内容&lt;/li&gt;
&lt;li&gt;OpenClaw 在 &lt;code&gt;context-window-guard&lt;/code&gt; 中有类似处理，优先截断大的 tool result（最“胖”也最容易压缩）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context Window 是 Agent 工程的物理瓶颈。优秀的管理策略不是单点优化，而是组合使用&lt;strong&gt;滑动窗口、摘要压缩、分层存储、外部检索&lt;/strong&gt;等多种手段，并根据模型能力自适应调整。OpenClaw 的渐进式降级（compaction → 截断 → 报错）和精确 token 计算（含 10% 余量）是值得参考的实践。&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;算力够，但装不下那么多信息。工程上必须主动管理，而不是被动等溢出报错。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;Agent 的 Context Window：核心约束与处理策略&lt;a href=&quot;#agent-的-context-window核心约束与处理策略-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Context Window（上下文窗口）是大语言模型（LLM）单次请求能处理的最大 token 数量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Token 是模型处理文本的最小单位，英文约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**为什么是 Agent 工程中最核心的约束？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Agent 的上下文里塞的东西太多：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;System Prompt（2000-5000 token）&lt;/li&gt;
&lt;li&gt;工具定义列表（每个 200-500 token，20 个工具就是 4000-10000 token）&lt;/li&gt;
&lt;li&gt;完整对话历史&lt;/li&gt;
&lt;li&gt;每次工具调用的入参和返回结果&lt;/li&gt;
&lt;li&gt;模型回复预留空间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一次 Agent 运行可能跑几十轮，每一轮结果都追加到历史中，Context 像滚雪球一样越来越大。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context_Window_核心约束与处理策略&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Context Window（上下文窗口）是大语言模型（LLM）单次请求能处理的最大 token 数量。Token 是模型处理文本的最小单位，英文约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么是 Agent 工程中最核心的约束？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Agent 的上下文里塞的东西太多：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;System Prompt（2000-5000 token）&lt;/li&gt;
&lt;li&gt;工具定义列表（每个 200-500 token，20 个工具就是 4000-10000 token）&lt;/li&gt;
&lt;li&gt;完整对话历史&lt;/li&gt;
&lt;li&gt;每次工具调用的入参和返回结果&lt;/li&gt;
&lt;li&gt;模型回复预留空间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一次 Agent 运行可能跑几十轮，每一轮结果都追加到历史中，Context 像滚雪球一样越来越大。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 行为变得不可预测。&lt;/p&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;以典型编程 Agent 为例：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;固定开销&lt;/strong&gt;：System Prompt + 工具定义，每次请求都得带，约 6000-15000 token&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对话历史&lt;/strong&gt;：每调一次工具增加两条消息（tool_call + tool_result）。工具返回一个文件内容可能占 3000-8000 token。跑 10 轮，历史轻松突破 50K token。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Context Window（上下文窗口）是大语言模型（LLM）单次请求能处理的最大 token 数量。Token 是模型处理文本的最小单位，英文约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;为什么是 Agent 工程中最核心的约束？&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent 的上下文里塞的东西太多：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;System Prompt（2000-5000 token）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;工具定义列表（每个 200-500 token，20 个工具就是 4000-10000 token）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Contextual Query Augmentation 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-contextual_query_augmentation_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-contextual_query_augmentation_%E6%95%B4%E7%90%86/</guid><description># Contextual_Query_Augmentation ## 问题 Contextual_Query_Augmentation ## 标准回答 ``` ### 3？ 空上下文处理策略 当检索不到相关文档时，系统需要优雅降级： - *</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Contextual_Query_Augmentation&lt;a href=&quot;#contextual_query_augmentation&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Contextual_Query_Augmentation&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 3？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;空上下文处理策略&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当检索不到相关文档时，系统需要优雅降级：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **保守策略**：指示模型不要回答（默认行为）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **自定义策略**：通过自定义模板引导模型给出友好提示，避免生成幻觉内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **混合策略**：允许模型基于自身知识回答，但明确告知信息来源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 面试官追问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Q1：上下文查询增强和查询重写有什么区别？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**A**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **查询重写**：修改用户查询本身，使其更适合检索（如扩写、缩写、纠错）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **上下文查询增强**：将原始查询与检索到的文档拼接，形成完整的 prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **关系**：查询重写发生在检索前，上下文查询增强发生在检索后、生成前&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Q2：如何避免增强后的 prompt 超过 token 限制？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**A**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 对检索到的文档做截断或摘要（保留最相关的片段）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 使用动态窗口，根据可用 token 预算调整注入的文档数量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 采用滑动窗口或重排序，只保留 top-k 最相关的文档&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Q3：上下文查询增强和 RAG 是什么关系？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**A**：上下文查询增强是 RAG 流程中的一环。完整 RAG 流程为：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;查询重写（预检索）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;向量检索&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**上下文查询增强**（将查询与检索结果结合）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LLM 生成回答&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Spring AI 的 `RetrievalAugmentationAdvisor` 封装了这一流程，`ContextualQueryAugmenter` 专门负责增强步骤。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Q4：如果检索到的文档包含矛盾信息，怎么办？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**A**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 在增强 prompt 中明确要求模型基于&quot;最可信&quot;的信息回答&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 使用重排序模型，将高置信度文档放在前面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 让模型在回答中标注信息来源，或明确指出信息冲突&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 总结&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;上下文查询增强是连接检索和生成的桥梁，通过将检索到的文档与用户查询智能结合，显著提升 RAG 系统的回答质量。Spring AI 通过 `ContextualQueryAugmenter` 和空上下文处理机制，提供了灵活的实现方式，可优雅处理检索失败等边界情况。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 关键点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- ```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 3. 空上下文处理策略&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当检索不到相关文档时，系统需要优雅降级：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **保守策略**：指示模型不要回答（默认行为）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **自定义策略**：通过自定义模板引导模型给出友好提示，避免生成幻觉内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **混合策略**：允许模型基于自身知识回答，但明确告知信息来源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **A**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **查询重写**：修改用户查询本身，使其更适合检索（如扩写、缩写、纠错）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **上下文查询增强**：将原始查询与检索到的文档拼接，形成完整的 prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **关系**：查询重写发生在检索前，上下文查询增强发生在检索后、生成前&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **A**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 对检索到的文档做截断或摘要（保留最相关的片段）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 使用动态窗口，根据可用 token 预算调整注入的文档数量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 采用滑动窗口或重排序，只保留 top-k 最相关的文档&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **A**：上下文查询增强是 RAG 流程中的一环。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 完整 RAG 流程为：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;查询重写（预检索）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;向量检索&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**上下文查询增强**（将查询与检索结果结合）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LLM 生成回答&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Spring AI 的 `RetrievalAugmentationAdvisor` 封装了这一流程，`ContextualQueryAugmenter` 专门负责增强步骤。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 备注&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 本文已做格式统一与噪声清理，保留原始语义。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- ## 问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Contextual_Query_Augmentation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;当检索不到相关文档时，系统需要优雅降级：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保守策略&lt;/strong&gt;：指示模型不要回答（默认行为）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义策略&lt;/strong&gt;：通过自定义模板引导模型给出友好提示，避免生成幻觉内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合策略&lt;/strong&gt;：允许模型基于自身知识回答，但明确告知信息来源&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查询重写&lt;/strong&gt;：修改用户查询本身，使其更适合检索（如扩写、缩写、纠错）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文查询增强&lt;/strong&gt;：将原始查询与检索到的文档拼接，形成完整的 prompt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关系&lt;/strong&gt;：查询重写发生在检索前，上下文查询增强发生在检索后、生成前&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对检索到的文档做截断或摘要（保留最相关的片段）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用动态窗口，根据可用 token 预算调整注入的文档数量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;采用滑动窗口或重排序，只保留 top-k 最相关的文档&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：上下文查询增强是 RAG 流程中的一环。完整 RAG 流程为：
查询重写（预检索）
向量检索
&lt;strong&gt;上下文查询增强&lt;/strong&gt;（将查询与检索结果结合）
LLM 生成回答&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Spring AI 的 &lt;code&gt;RetrievalAugmentationAdvisor&lt;/code&gt; 封装了这一流程，&lt;code&gt;ContextualQueryAugmenter&lt;/code&gt; 专门负责增强步骤。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;Q4：如果检索到的文档包含矛盾信息，怎么办？&lt;a href=&quot;#q4如果检索到的文档包含矛盾信息怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当检索不到相关文档时，系统需要优雅降级：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保守策略&lt;/strong&gt;：指示模型不要回答（默认行为）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义策略&lt;/strong&gt;：通过自定义模板引导模型给出友好提示，避免生成幻觉内容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;混合策略&lt;/strong&gt;：允许模型基于自身知识回答，但明确告知信息来源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;Q1：上下文查询增强和查询重写有什么区别？&lt;a href=&quot;#q1上下文查询增强和查询重写有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Embedding Model Selection 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-embedding_model_selection_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-embedding_model_selection_%E6%95%B4%E7%90%86/</guid><description># Embedding_Model_Selection ## 问题 Embedding_Model_Selection ## 标准回答 # 在 RAG 中如何选择 Embedding Model（嵌入模型）—— 考虑因素与选型指南 选择 E</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Embedding_Model_Selection&lt;a href=&quot;#embedding_model_selection&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Embedding_Model_Selection&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在 RAG 中如何选择 Embedding Model（嵌入模型）—— 考虑因素与选型指南&lt;a href=&quot;#在-rag-中如何选择-embedding-model嵌入模型-考虑因素与选型指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;选择 Embedding Model 核心看 7 个因素，可概？
为”准、快、专、广、大、活、省”：
&lt;strong&gt;准（语义准确性）&lt;/strong&gt;：模型能否精准捕捉文本语义，长句理解、上下文关联、同义词区分能力直接影响向量相似度计算的可靠性。
&lt;strong&gt;快（模型效率）&lt;/strong&gt;：推理速度能否满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源。
&lt;strong&gt;专（领域适配）&lt;/strong&gt;：是否针对垂直领域做过预训练或微调。例如金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材。
&lt;strong&gt;广（多语言支持）&lt;/strong&gt;：是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能否正确嵌入。
&lt;strong&gt;大（数据规模匹配）&lt;/strong&gt;：模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩。
&lt;strong&gt;活（开放性与生态）&lt;/strong&gt;：是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活。
&lt;strong&gt;省（成本）&lt;/strong&gt;：计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 语义准确性怎么评估&lt;a href=&quot;#1-语义准确性怎么评估&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通常用语义相似度任务评估，如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。注意两点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;部分模型擅长短文本（如 Sentence-BERT），处理长文本时会丢失上下文，需选 RoBERTa 变种或 Longformer 类模型。&lt;/li&gt;
&lt;li&gt;通用模型在专业领域可能词不达意，例如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 领域适配的三种策略&lt;a href=&quot;#2-领域适配的三种策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直接选领域专用模型&lt;/strong&gt;：LegalBERT 用于法律文档，PubMedBERT 用于医学文献。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用模型 + 领域数据微调&lt;/strong&gt;：适合有私有语料的场景（如公司内部客服对话数据）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加领域适配器&lt;/strong&gt;：用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”等词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 多语言支持&lt;a href=&quot;#3-多语言支持&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单语言模型&lt;/strong&gt;：如 Chinese-BERT 只支持中文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言模型&lt;/strong&gt;：如 XLM-RoBERTa 支持 100+ 语言，但需分别处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨语言模型&lt;/strong&gt;：如 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小语种&lt;/strong&gt;：若无专用模型，用通用多语言模型 + 数据增强（如 multilingual T5 配合少量目标语言语料微调）。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 开源 vs 闭源的选择&lt;a href=&quot;#4-开源-vs-闭源的选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开源模型&lt;/strong&gt;（如 Sentence-BERT）：可灵活修改代码，适合深度定制（如加入自定义分词器），但需自己解决部署和优化问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;闭源 API&lt;/strong&gt;（如 OpenAI Embedding、Cohere）：开箱即用，适合快速验证 MVP，但受限于厂商更新和费用（OpenAI 按 token 收费，长文本成本较高）。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：线上 QPS 很高，但又想保证语义准确性，怎么平衡？&lt;a href=&quot;#q1线上-qps-很高但又想保证语义准确性怎么平衡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：使用级联策略。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;第一阶段：轻量模型快速召回 Top 100（如 MiniLM，毫秒级）。&lt;/li&gt;
&lt;li&gt;第二阶段：重型模型对 Top 100 做精排（如 BERT-large，处理 100 条只需几百毫秒）。&lt;/li&gt;
&lt;li&gt;另外可考虑模型蒸馏：用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;a href=&quot;#q2怎么判断一个嵌入模型在你的业务场景下效果好不好&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：最靠谱的方式是构建评测数据集。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;从业务数据里挑 500 到 1000 条 query，人工标注相关文档。&lt;/li&gt;
&lt;li&gt;用 Recall@K、MRR 等指标评估召回效果。&lt;/li&gt;
&lt;li&gt;不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和业务数据分布可能差很远。&lt;/li&gt;
&lt;li&gt;可做 A/B 测试，看用户的点击率和满意度是否提升。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;a href=&quot;#q3公司内部文档很多专业术语通用模型效果差但又没有足够数据微调怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：尝试以下方案：
&lt;strong&gt;LoRA 微调&lt;/strong&gt;：参数高效微调，几千条数据就能见效，训练成本低。
&lt;strong&gt;数据增强&lt;/strong&gt;：用大模型改写现有数据，或用同义词替换、回译等方式扩大数据量。
&lt;strong&gt;领域词表预处理&lt;/strong&gt;：把专业术语替换成通用模型能理解的描述（检索完再还原回来）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;选择 Embedding 模型需综合考量准确性、效率、领域适配、多语言支持、数据规模、开源生态和成本。实际业务中建议通过构建评测数据集和 A/B 测试来验证效果，避免仅依赖通用榜单。对于资源受限或专业术语强的场景，LoRA 微调、级联策略和领域词表预处理是实用技巧。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;在 RAG 中如何选择 Embedding Model（嵌入模型）—— 考虑因素与选型指南&lt;a href=&quot;#在-rag-中如何选择-embedding-model嵌入模型-考虑因素与选型指南-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;选择 Embedding Model 核心看 7 个因素，可概括为”准、快、专、广、大、活、省”：
&lt;strong&gt;准（语义准确性）&lt;/strong&gt;：模型能否精准捕捉文本语义，长句理解、上下文关联、同义词区分能力直接影响向量相似度计算的可靠性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;2. &lt;strong&gt;快（模型效率）&lt;/strong&gt;：推理速度能否满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源。&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专（领域适配）&lt;/strong&gt;：是否针对垂直领域做过预训练或微调。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;例如金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材。&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;广（多语言支持）&lt;/strong&gt;：是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能否正确嵌入。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Embedding_Model_Selection&lt;/p&gt;&lt;p&gt;选择 Embedding Model 核心看 7 个因素，可概括为”准、快、专、广、大、活、省”：
&lt;strong&gt;准（语义准确性）&lt;/strong&gt;：模型能否精准捕捉文本语义，长句理解、上下文关联、同义词区分能力直接影响向量相似度计算的可靠性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2. &lt;strong&gt;快（模型效率）&lt;/strong&gt;：推理速度能否满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专（领域适配）&lt;/strong&gt;：是否针对垂直领域做过预训练或微调。例如金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;广（多语言支持）&lt;/strong&gt;：是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能否正确嵌入。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;大（数据规模匹配）&lt;/strong&gt;：模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为”准、快、专、广、大、活、省”：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;准（语义准确性）&lt;/strong&gt;：模型能否精准捕捉文本语义，长句理解、上下文关联、同义词区分能力直接影响向量相似度计算的可靠性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;快（模型效率）&lt;/strong&gt;：推理速度能否满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专（领域适配）&lt;/strong&gt;：是否针对垂直领域做过预训练或微调。例如金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;广（多语言支持）&lt;/strong&gt;：是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能否正确嵌入。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Fine Tuning 原理与场景 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-fine_tuning_%E5%8E%9F%E7%90%86%E4%B8%8E%E5%9C%BA%E6%99%AF_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-fine_tuning_%E5%8E%9F%E7%90%86%E4%B8%8E%E5%9C%BA%E6%99%AF_%E6%95%B4%E7%90%86/</guid><description># Fine_Tuning_原理与场景 ## 问题 Fine_Tuning_原理与场景 ## 标准回答 # 大模型微调 (Fine-tuning) 原理与适用场景 大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Fine_Tuning_原理与场景&lt;a href=&quot;#fine_tuning_原理与场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Fine_Tuning_原理与场景&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;大模型微调 (Fine-tuning) 原理与适用场景&lt;a href=&quot;#大模型微调-fine-tuning-原理与适用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整？
本质上是在通用知识的基础上“精雕细琢”，让模型在某个垂直领域表现得更专业。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;微调的核心原理是迁移学习&lt;/strong&gt;：预训练模型已在海量数据上学会语言通用规律，微调用少量领域数据让模型学会特定表达方式和知识。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;什么时候需要微调而不是直接使用基础模型？&lt;a href=&quot;#什么时候需要微调而不是直接使用基础模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;专业领域应用&lt;/strong&gt;：如医疗诊断、法律咨询，基础模型对专业术语掌握不够深。用10万条专科病历数据微调，准确率可从60%提到90%以上。
&lt;strong&gt;数据安全要求高&lt;/strong&gt;：金融机构、政府部门内部数据不能传到云端 API，只能把开源模型（LLaMA、Qwen）拉下来在本地机房微调部署。
&lt;strong&gt;特定任务需要稳定输出&lt;/strong&gt;：客服机器人、代码补全等场景，Prompt工程输出不稳定、token消耗大。微调一版专用模型，响应快、成本低、格式稳定。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 微调的底层原理&lt;a href=&quot;#1-微调的底层原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预训练&lt;/strong&gt;：TB级文本自回归训练，学习“预测下一个词”。消耗几千张A100跑数月，成本千万美元。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微调&lt;/strong&gt;：学习率通常比预训练低1-2个数量级（预训练1e-4 → 微调1e-5或2e-6），防止灾难性遗忘。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据量&lt;/strong&gt;：全参数微调需1-10万条高质量样本；LoRA等参数高效方法几千条即可。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.&lt;a href=&quot;#2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;主流微调方法对比&lt;a href=&quot;#主流微调方法对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;可训练参数占比&lt;/th&gt;&lt;th&gt;显存需求（7B模型）&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;全参数微调&lt;/td&gt;&lt;td&gt;100%&lt;/td&gt;&lt;td&gt;80GB+&lt;/td&gt;&lt;td&gt;追求极致效果，资源充足&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoRA&lt;/td&gt;&lt;td&gt;0.1%-1%&lt;/td&gt;&lt;td&gt;24GB&lt;/td&gt;&lt;td&gt;资源有限，多任务切换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;QLoRA&lt;/td&gt;&lt;td&gt;0.1%-1%&lt;/td&gt;&lt;td&gt;12GB&lt;/td&gt;&lt;td&gt;消费级显卡，个人开发者&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adapter&lt;/td&gt;&lt;td&gt;1%-5%&lt;/td&gt;&lt;td&gt;30GB&lt;/td&gt;&lt;td&gt;需要频繁切换任务&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&gt;&lt;h3&gt;3.&lt;a href=&quot;#3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;微调 vs Prompt 工程 vs RAG&lt;a href=&quot;#微调-vs-prompt-工程-vs-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt工程&lt;/strong&gt;：快速验证，无需训练。缺点：token消耗大，context window有限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG&lt;/strong&gt;：适合知识库场景，知识实时更新。缺点：检索质量依赖 embedding，复杂推理能力不足。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微调&lt;/strong&gt;：适合模型能力本身不够的情况（特定推理模式、输出格式、领域术语）。知识直接编码进参数，推理无需额外context。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;实际项目常组合使用：先微调领域模型，再用RAG补充实时知识，最后用Prompt控制输出格式。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;4.&lt;a href=&quot;#4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;实践中的坑&lt;a href=&quot;#实践中的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;数据质量比数量重要&lt;/strong&gt;：1000条高质量 instruction 数据，效果可能超10万条噪声数据。
&lt;strong&gt;验证集要有代表性&lt;/strong&gt;：留出10%-20%数据做验证，覆盖实际各种场景。
&lt;strong&gt;灾难性遗忘&lt;/strong&gt;：微调过度会忘掉通用能力。可在数据中混入通用数据，或使用LoRA（原始参数不动）。
&lt;strong&gt;过拟合&lt;/strong&gt;：一般3-5个epoch足够，超过10个epoch基本过拟合。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：LoRA 的低秩分解具体怎么工作？为什么能省这么多参数？&lt;a href=&quot;#q1lora-的低秩分解具体怎么工作为什么能省这么多参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：核心思路是微调过程中权重的变化量是低秩的。原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取8或16。可训练参数从 d×k 降到 d×r + r×k。例如 4096×4096 矩阵用 rank=16，参数量从1600万降到13万，压缩100多倍。推理时把 BA 加回原始权重即可，不增加延迟。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：怎么判断一个任务应该用微调还是 RAG？&lt;a href=&quot;#q2怎么判断一个任务应该用微调还是-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：看核心瓶颈。如果是&lt;strong&gt;知识不够&lt;/strong&gt;（不知道内部文档、最新政策），用RAG更合适，知识更新方便。如果是&lt;strong&gt;能力不够&lt;/strong&gt;（不会按特定格式输出、不会某种推理），用微调，RAG补不了能力短板。另外考虑实时性：RAG知识库可随时更新，微调一次成本高周期长。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：微调后模型效果变差了，怎么排查？&lt;a href=&quot;#q3微调后模型效果变差了怎么排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：
检查训练数据：有无标注错误、格式不对、数据重复。
学习率是否太大：可降到原来的1/5试试。
是否过拟合：训练loss降但验证loss上升，减少epoch或加dropout。
是否灾难性遗忘：用原预训练模型擅长的任务测一下，若也变差说明微调数据太单一，需混入通用数据。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;微调通过在预训练模型上继续训练，使模型适配垂直领域。全参数微调效果好但资源消耗大；LoRA/QLoRA 等参数高效方法大幅降低门槛，适合资源受限场景。实践中需注意数据质量、灾难性遗忘和过拟合问题。与Prompt工程、RAG结合使用可达到最佳效果。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;大模型微调 (Fine-tuning) 原理与适用场景&lt;a href=&quot;#大模型微调-fine-tuning-原理与适用场景-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本质上是在通用知识的基础上“精雕细琢”，让模型在某个垂直领域表现得更专业。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微调的核心原理是迁移学习&lt;/strong&gt;：预训练模型已在海量数据上学会语言通用规律，微调用少量领域数据让模型学会特定表达方式和知识。&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;什么时候需要微调而不是直接使用基础模型？&lt;a href=&quot;#什么时候需要微调而不是直接使用基础模型-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专业领域应用&lt;/strong&gt;：如医疗诊断、法律咨询，基础模型对专业术语掌握不够深。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Fine_Tuning_原理与场景&lt;/p&gt;&lt;p&gt;大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上“精雕细琢”，让模型在某个垂直领域表现得更专业。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;微调的核心原理是迁移学习&lt;/strong&gt;：预训练模型已在海量数据上学会语言通用规律，微调用少量领域数据让模型学会特定表达方式和知识。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;什么时候需要微调而不是直接使用基础模型？&lt;a href=&quot;#什么时候需要微调而不是直接使用基础模型-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专业领域应用&lt;/strong&gt;：如医疗诊断、法律咨询，基础模型对专业术语掌握不够深。用10万条专科病历数据微调，准确率可从60%提到90%以上。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据安全要求高&lt;/strong&gt;：金融机构、政府部门内部数据不能传到云端 API，只能把开源模型（LLaMA、Qwen）拉下来在本地机房微调部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本质上是在通用知识的基础上“精雕细琢”，让模型在某个垂直领域表现得更专业。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;微调的核心原理是迁移学习&lt;/strong&gt;：预训练模型已在海量数据上学会语言通用规律，微调用少量领域数据让模型学会特定表达方式和知识。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;什么时候需要微调而不是直接使用基础模型？&lt;a href=&quot;#什么时候需要微调而不是直接使用基础模型-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专业领域应用&lt;/strong&gt;：如医疗诊断、法律咨询，基础模型对专业术语掌握不够深。用10万条专科病历数据微调，准确率可从60%提到90%以上。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据安全要求高&lt;/strong&gt;：金融机构、政府部门内部数据不能传到云端 API，只能把开源模型（LLaMA、Qwen）拉下来在本地机房微调部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>GPU Concurrency Performance Analysis 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-gpu_concurrency_performance_analysis_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-gpu_concurrency_performance_analysis_%E6%95%B4%E7%90%86/</guid><description># GPU_Concurrency_Performance_Analysis ## 问题 GPU_Concurrency_Performance_Analysis ## 标准回答 # GPU集群并发访问性能分析：为什么不是简单平均？ 不会简</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;GPU_Concurrency_Performance_Analysis&lt;a href=&quot;#gpu_concurrency_performance_analysis&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GPU_Concurrency_Performance_Analysis&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;GPU集群并发访问性能分析：为什么不是简单平均？&lt;a href=&quot;#gpu集群并发访问性能分析为什么不是简单平均&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;不会简单平均成每人 1 token/s，每个用户实际看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理（Batching）把多个请求打包到一起算。GPU 擅长并行计算，100 个请求打成一个 batch，计算耗时与处理单个请求接近，吞吐量直接翻几十倍。&lt;/p&gt;&lt;p&gt;假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，1000 个用户分 10 批处理完，单用户实际体验的速度是 10 tokens/s。&lt;/p&gt;&lt;p&gt;实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 请求聚合与调度机制&lt;a href=&quot;#1-请求聚合与调度机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;LLM 推理每次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时请求，GPU 每轮同时计算这 1000 个请求的下一个 token。需要请求聚合器协调：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;把同时到达的请求按 token 长度打包，短的补齐到相同长度，打成一个矩阵扔给 GPU&lt;/li&gt;
&lt;li&gt;设置聚合窗口（如每 5ms 或攒够 32 个请求），平衡效率与延迟&lt;/li&gt;
&lt;li&gt;控制粒度是 token-level batching，同一时刻处理所有请求的当前 token，再一起推进&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 动态调度与优先级&lt;a href=&quot;#2-动态调度与优先级&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;请求进入异步队列，调度器决定处理顺序：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置&lt;/li&gt;
&lt;li&gt;负载均衡：显存吃紧时减小 batch size，空闲时加大 batch&lt;/li&gt;
&lt;li&gt;动态退场：已生成完的请求退出 batch，新请求插入，流水线持续运转&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 实际场景分析&lt;a href=&quot;#3-实际场景分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;聊天机器人平台：1000 用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每 10ms 打一批，聚合 50~100 个请求&lt;/li&gt;
&lt;li&gt;所有请求每生成一个 token 进入下一轮调度&lt;/li&gt;
&lt;li&gt;pipeline 里同时跑多个 batch，每个 batch 装不同用户的不同 token&lt;/li&gt;
&lt;li&gt;最终每个用户响应速度几十 token/s&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 性能瓶颈分析思路&lt;a href=&quot;#4-性能瓶颈分析思路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;显存瓶颈&lt;/strong&gt;：KV Cache 占用大，batch size 上不去 → 看 nvidia-smi 显存占用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算瓶颈&lt;/strong&gt;：GPU 利用率满但吞吐低 → 模型太大或 batch 太小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调度瓶颈&lt;/strong&gt;：队列堆积严重 → 看请求排队时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络瓶颈&lt;/strong&gt;：分布式推理节点间通信慢 → 看 NCCL 耗时占比&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;vLLM、TensorRT-LLM 等框架提供 metrics 接口，可观察 batch size 分布、排队延迟、吞吐曲线。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：vLLM 的 PagedAttention 机制怎么优化显存利用率？&lt;a href=&quot;#q1vllm-的-pagedattention-机制怎么优化显存利用率&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：传统做法预分配最大长度 KV Cache，浪费严重。PagedAttention 把 KV Cache 切成固定大小 block，按需分配，类似虚拟内存。显存利用率从 20~30% 提升到 90% 以上。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：Continuous Batching 和 Static Batching 区别？&lt;a href=&quot;#q2continuous-batching-和-static-batching-区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：Static Batching 等一批请求全部生成完才处理下一批，短请求需等长请求。Continuous Batching 动态调度，短请求生成完就退出，新请求立即插入，吞吐提升 2~3 倍。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：First Token Latency 和 Time Per Output Token 怎么优化？&lt;a href=&quot;#q3first-token-latency-和-time-per-output-token-怎么优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：First Token Latency 受 prefill 阶段影响，优化方向为 prompt 压缩、KV Cache 预计算、prefill/decode 分离。Time Per Output Token 受 decode 阶段影响，优化方向为加大 batch size、speculative decoding、量化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：模型量化对性能影响？INT8 和 FP16 怎么选？&lt;a href=&quot;#q4模型量化对性能影响int8-和-fp16-怎么选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：FP16 比 FP32 快一倍，INT8 再快一倍但精度可能下降。高精度场景用 FP16，极致吞吐且接受轻微效果损失用 INT8。混合精度 attention 用 FP16、FFN 用 INT8 是折中方案。AWQ、GPTQ 等方案精度损失更小。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;GPU集群并发访问性能分析：为什么不是简单平均？&lt;a href=&quot;#gpu集群并发访问性能分析为什么不是简单平均-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不会简单平均成每人 1 token/s，每个用户实际看到的响应速度可能是几十 token/s。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理（Batching）把多个请求打包到一起算。&lt;/li&gt;
&lt;li&gt;GPU 擅长并行计算，100 个请求打成一个 batch，计算耗时与处理单个请求接近，吞吐量直接翻几十倍。&lt;/li&gt;
&lt;li&gt;假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，1000 个用户分 10 批处理完，单用户实际体验的速度是 10 tokens/s。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;GPU_Concurrency_Performance_Analysis&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不会简单平均成每人 1 token/s，每个用户实际看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理（Batching）把多个请求打包到一起算。GPU 擅长并行计算，100 个请求打成一个 batch，计算耗时与处理单个请求接近，吞吐量直接翻几十倍。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，1000 个用户分 10 批处理完，单用户实际体验的速度是 10 tokens/s。&lt;/li&gt;
&lt;li&gt;实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;LLM 推理每次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时请求，GPU 每轮同时计算这 1000 个请求的下一个 token。需要请求聚合器协调：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;把同时到达的请求按 token 长度打包，短的补齐到相同长度，打成一个矩阵扔给 GPU&lt;/li&gt;
&lt;li&gt;设置聚合窗口（如每 5ms 或攒够 32 个请求），平衡效率与延迟&lt;/li&gt;
&lt;li&gt;控制粒度是 token-level batching，同一时刻处理所有请求的当前 token，再一起推进&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求进入异步队列，调度器决定处理顺序：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置&lt;/li&gt;
&lt;li&gt;负载均衡：显存吃紧时减小 batch size，空闲时加大 batch&lt;/li&gt;
&lt;li&gt;动态退场：已生成完的请求退出 batch，新请求插入，流水线持续运转&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;聊天机器人平台：1000 用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不会简单平均成每人 1 token/s，每个用户实际看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理（Batching）把多个请求打包到一起算。GPU 擅长并行计算，100 个请求打成一个 batch，计算耗时与处理单个请求接近，吞吐量直接翻几十倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，1000 个用户分 10 批处理完，单用户实际体验的速度是 10 tokens/s。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;1. 请求聚合与调度机制&lt;a href=&quot;#1-请求聚合与调度机制-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM 推理每次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时请求，GPU 每轮同时计算这 1000 个请求的下一个 token。需要请求聚合器协调：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>LLM Long Conversation Handling 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-llm_long_conversation_handling_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-llm_long_conversation_handling_%E6%95%B4%E7%90%86/</guid><description># LLM_Long_Conversation_Handling ## 问题 LLM_Long_Conversation_Handling ## 标准回答 # LLM 的 Context Window 有上限，长对话时如何保证 Agent </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;LLM_Long_Conversation_Handling&lt;a href=&quot;#llm_long_conversation_handling&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LLM_Long_Conversation_Handling&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;OpenClaw 是怎么做的？&lt;/p&gt;&lt;p&gt;长对话的核心风险是 Context Window 溢出，导致请求报错或模型”失忆”。&lt;/p&gt;&lt;p&gt;OpenClaw 采用&lt;strong&gt;分层防御&lt;/strong&gt;策略，从轻到重依次处理：
&lt;strong&gt;Context Pruning（上下文修剪）&lt;/strong&gt;
每次请求前，清理不重要的早期 Tool Result。采用两级阈值：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;softTrimRatio&lt;/code&gt;（默认 0.3）：对超大的 tool result 做 head+tail 裁剪&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hardClearRatio&lt;/code&gt;（默认 0.5）：直接替换为 placeholder
保护规则：保留最近 3 条 assistant 消息、第一条 user message 之前的内容（System Prompt 等）。
&lt;strong&gt;Tool Result Context Guard（工具返回兜底）&lt;/strong&gt;
计算全局预算（Context Window × 4 × 0.75），先单条截断，若总量仍超则从最早的 tool result 开始替换为 &lt;code&gt;[compacted: tool output removed to free context]&lt;/code&gt;。确保送给 LLM 的 Context 永远安全。
&lt;strong&gt;Memory Flush（记忆刷盘）&lt;/strong&gt;
Token 用量接近 compaction 阈值时，让 Agent 将关键信息写入 &lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt;，防止压缩丢失重要细节。
&lt;strong&gt;Compaction（压缩）&lt;/strong&gt;
用 LLM 将旧对话历史压缩为摘要，替换原始消息。例如 100 条消息压成一段摘要，token 消耗降一个数量级。由于已做 Memory Flush，有损压缩可接受。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. Context Pruning 的巧妙保护&lt;a href=&quot;#1-context-pruning-的巧妙保护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;基于 pi-coding-agent 的 extension，注册在 &lt;code&gt;context&lt;/code&gt; 事件上。&lt;/li&gt;
&lt;li&gt;可修剪的对象是早期的 tool result（默认全部可修剪，支持 allow/deny glob 配置）。&lt;/li&gt;
&lt;li&gt;有 cache-ttl 冷却期（默认 5 分钟），避免每次请求重复扫描。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Tool Result 截断的智能检测&lt;a href=&quot;#2-tool-result-截断的智能检测&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;tool-result-truncation.ts&lt;/code&gt; 中，通过 &lt;code&gt;hasImportantTail()&lt;/code&gt; 检测尾部是否包含 &lt;code&gt;error&lt;/code&gt;、&lt;code&gt;exception&lt;/code&gt;、&lt;code&gt;exit code&lt;/code&gt;、&lt;code&gt;traceback&lt;/code&gt; 等关键词。若有则优先保留尾部（head+tail 策略），因为错误信息通常比正常输出更有价值。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Compaction 摘要的质量保障&lt;a href=&quot;#3-compaction-摘要的质量保障&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identifier Preservation&lt;/strong&gt;：摘要必须保留 UUID、hash、URL、文件名等不可重建的标识符。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory Flush 前置&lt;/strong&gt;：在 compaction 前先落盘关键信息，降低摘要的有损风险。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：Compaction 压缩摘要的时机怎么选？&lt;a href=&quot;#q1compaction-压缩摘要的时机怎么选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：太频繁会浪费 token 和增加延迟，太晚则 context 逼近上限。OpenClaw 采用自动触发机制：当 context token 逼近模型窗口时自动触发。在 compaction 之前，Context Pruning 已在低阈值（30% 裁剪、50% 替换）做了减负，因此 compaction 不需要太频繁。同时 Memory Flush 有独立触发条件（&lt;code&gt;softThresholdTokens&lt;/code&gt; 默认 4000），确保关键信息提前落盘。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：压缩后的摘要本身也会越来越长，怎么处理？&lt;a href=&quot;#q2压缩后的摘要本身也会越来越长怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：采用&lt;strong&gt;滚动摘要&lt;/strong&gt;策略。例如第一次压缩 1-50 条生成摘要 A，第二次将摘要 A + 51-100 条一起压缩成摘要 B。每次压缩保持摘要长度稳定，早期保真度虽会降低，但对多数场景 50 轮前的细节已不重要。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：Context Pruning 删掉的 tool result，如果后面模型又需要了怎么办？&lt;a href=&quot;#q3context-pruning-删掉的-tool-result如果后面模型又需要了怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：两种恢复途径：
&lt;strong&gt;再次读取&lt;/strong&gt;：如果是文件内容类（如 &lt;code&gt;read_file&lt;/code&gt;），文件仍在磁盘，模型可再次调用工具。
&lt;strong&gt;Memory Flush 语义存储&lt;/strong&gt;：在 compaction 前，LLM 自行提取关键信息（决策、配置、进度等）以语义形式写入 &lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt;，而非保存原始 tool result。模型后续可通过读取该文件获取上下文。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw 的四层防御体系（修剪 → 守卫 → 刷盘 → 压缩）层层递进，既保证了长对话的持续性，又通过智能检测（错误尾部优先、标识符保留）和信息落盘，最大程度降低了有损处理带来的副作用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;OpenClaw 是怎么做的？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;长对话的核心风险是 Context Window 溢出，导致请求报错或模型”失忆”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;OpenClaw 采用&lt;strong&gt;分层防御&lt;/strong&gt;策略，从轻到重依次处理：
&lt;strong&gt;Context Pruning（上下文修剪）&lt;/strong&gt;
每次请求前，清理不重要的早期 Tool Result。&lt;/li&gt;
&lt;li&gt;采用两级阈值：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;softTrimRatio&lt;/code&gt;（默认 0.3）：对超大的 tool result 做 head+tail 裁剪&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hardClearRatio&lt;/code&gt;（默认 0.5）：直接替换为 placeholder
保护规则：保留最近 3 条 assistant 消息、第一条 user message 之前的内容（System Prompt 等）。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM_Long_Conversation_Handling&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作openclaw-是怎么做的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;长对话的核心风险是 Context Window 溢出，导致请求报错或模型”失忆”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 采用&lt;strong&gt;分层防御&lt;/strong&gt;策略，从轻到重依次处理：
&lt;strong&gt;Context Pruning（上下文修剪）&lt;/strong&gt;
每次请求前，清理不重要的早期 Tool Result。采用两级阈值：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;softTrimRatio&lt;/code&gt;（默认 0.3）：对超大的 tool result 做 head+tail 裁剪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;hardClearRatio&lt;/code&gt;（默认 0.5）：直接替换为 placeholder
保护规则：保留最近 3 条 assistant 消息、第一条 user message 之前的内容（System Prompt 等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tool Result Context Guard（工具返回兜底）&lt;/strong&gt;
计算全局预算（Context Window × 4 × 0.75），先单条截断，若总量仍超则从最早的 tool result 开始替换为 &lt;code&gt;[compacted: tool output removed to free context]&lt;/code&gt;。确保送给 LLM 的 Context 永远安全。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Memory Flush（记忆刷盘）&lt;/strong&gt;
Token 用量接近 compaction 阈值时，让 Agent 将关键信息写入 &lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt;，防止压缩丢失重要细节。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 是怎么做的？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;长对话的核心风险是 Context Window 溢出，导致请求报错或模型”失忆”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 采用&lt;strong&gt;分层防御&lt;/strong&gt;策略，从轻到重依次处理：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Context Pruning（上下文修剪）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每次请求前，清理不重要的早期 Tool Result。采用两级阈值：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-llm-%E7%9A%84-context-window-%E6%9C%89%E4%B8%8A%E9%99%90-%E9%95%BF%E5%AF%B9%E8%AF%9D%E6%97%B6%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81-agent-%E4%BB%8D%E7%84%B6%E8%83%BD%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C-openclaw-%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E7%9A%84-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-llm-%E7%9A%84-context-window-%E6%9C%89%E4%B8%8A%E9%99%90-%E9%95%BF%E5%AF%B9%E8%AF%9D%E6%97%B6%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81-agent-%E4%BB%8D%E7%84%B6%E8%83%BD%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C-openclaw-%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E7%9A%84-_%E6%95%B4%E7%90%86/</guid><description># LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？ ## 问题 LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作openclaw-是怎么做的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;来源: LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;OpenClaw 是怎么做的？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;
&lt;li&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 是怎么做的？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推荐答案面试问答开始面试隐藏答案回答重点长对话最怕的就是 context window 爆了（就像手机存储满了），要么请求直接报错，要么不得不丢消息导致模型”失忆”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;来源: LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;OpenClaw 是怎么做的？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;
&lt;li&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作openclaw-是怎么做的-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;blockquote&gt;&lt;p&gt;来源: LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？.mhtml&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;a href=&quot;#llm-的-context-window-有上限长对话时如何保证-agent-仍然能正常工作-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;OpenClaw 是怎么做的？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-5&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;OpenClaw 是怎么做的？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做深度清理：移除重复内容、网页噪声、广告等，保留核心问答内容。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Memory 短期长期记忆区别存储检索 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-memory_%E7%9F%AD%E6%9C%9F%E9%95%BF%E6%9C%9F%E8%AE%B0%E5%BF%86%E5%8C%BA%E5%88%AB%E5%AD%98%E5%82%A8%E6%A3%80%E7%B4%A2_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-memory_%E7%9F%AD%E6%9C%9F%E9%95%BF%E6%9C%9F%E8%AE%B0%E5%BF%86%E5%8C%BA%E5%88%AB%E5%AD%98%E5%82%A8%E6%A3%80%E7%B4%A2_%E6%95%B4%E7%90%86/</guid><description># Memory_短期长期记忆区别存储检索 ## 问题 Memory_短期长期记忆区别存储检索 ## 标准回答 # 解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？ **短期记忆**：在当前会话或最近几轮</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Memory_短期长期记忆区别存储检索&lt;a href=&quot;#memory_短期长期记忆区别存储检索&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Memory_短期长期记忆区别存储检索&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？&lt;a href=&quot;#解释短期记忆和长期记忆在-agent-系统中的区别分别适合怎么存储和检索&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：在当前会话或最近几轮对话中临时存储的信息，容量有限，生命周期短（通常一个会话）。&lt;strong&gt;长期记忆&lt;/strong&gt;：跨会话持久化存储的用户偏好、事实知识或历史决策，需要主动写入和检索。&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;短期记忆&lt;/th&gt;&lt;th&gt;长期记忆&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;生命周期&lt;/td&gt;&lt;td&gt;单次会话或最近N轮&lt;/td&gt;&lt;td&gt;跨会话持久&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;容量&lt;/td&gt;&lt;td&gt;受模型 Context Window 限制&lt;/td&gt;&lt;td&gt;理论无限&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;存储方式&lt;/td&gt;&lt;td&gt;内存或会话缓存&lt;/td&gt;&lt;td&gt;向量数据库、关系库或文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;检索方式&lt;/td&gt;&lt;td&gt;顺序读取或滑动窗口&lt;/td&gt;&lt;td&gt;语义搜索或关键词匹配&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;典型应用&lt;/td&gt;&lt;td&gt;多轮对话上下文&lt;/td&gt;&lt;td&gt;用户画像、知识库&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;存储与检索建议&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：存储在 Redis 或内存缓存中，按会话 ID 隔离，使用 LRU 淘汰策略。检索时按时间顺序拼接进 Prompt。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;：写入向量数据库（如 Milvus、Qdrant）或关系库。检索时对用户查询做 Embedding，召回 Top-K 相关条目，再注入上下文。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 记忆的生命周期管理&lt;a href=&quot;#1-记忆的生命周期管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短期→长期沉淀&lt;/strong&gt;：通过定时任务或会话结束时，让 Agent 自动总结本次对话的关键信息，调用 &lt;code&gt;memory_upsert_longterm&lt;/code&gt; 工具写入长期库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆衰减&lt;/strong&gt;：对长期记忆可按时间衰减权重，避免过时信息干扰（如半年前的用户偏好可能已改变）。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 记忆检索的时机&lt;a href=&quot;#2-记忆检索的时机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主动检索&lt;/strong&gt;：每轮对话前，用当前用户输入作为查询，去长期记忆库捞取相关条目，与短期记忆一起注入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按需检索&lt;/strong&gt;：只有当用户明确问“还记得我之前说过…吗”或任务明显依赖历史信息时才触发检索。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 常见框架的实现&lt;a href=&quot;#3-常见框架的实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：&lt;code&gt;ConversationBufferMemory&lt;/code&gt;（短期）+ &lt;code&gt;VectorStoreRetrieverMemory&lt;/code&gt;（长期）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring AI&lt;/strong&gt;：可自定义 &lt;code&gt;Advisor&lt;/code&gt; 在每次调用前加载记忆，或用 &lt;code&gt;@PostConstruct&lt;/code&gt; 初始化记忆组件。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：短期记忆超出 Context Window 怎么办？&lt;a href=&quot;#q1短期记忆超出-context-window-怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：采用滑动窗口，只保留最近 N 轮对话。更激进的策略是调用 LLM 对早期对话做摘要压缩（Compaction），用摘要替代原始消息。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：长期记忆写入时如何避免重复或冲突？&lt;a href=&quot;#q2长期记忆写入时如何避免重复或冲突&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：写入前先做相似度去重，若已有相似条目则合并或更新。业务上可要求用户显式确认覆盖。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：如何确保 Agent 不把敏感信息写入长期记忆？&lt;a href=&quot;#q3如何确保-agent-不把敏感信息写入长期记忆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：在写入前加一层过滤：用规则或小模型检测密码、身份证等敏感字段，或让 Agent 在写入前询问用户“是否记住这条信息”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;短期记忆服务于当前会话的连贯性，长期记忆沉淀跨会话的价值信息。两者结合可让 Agent 既有“鱼”的短期缓存，又有“渔”的长期知识库。实现时需关注生命周期管理、检索时机与隐私安全。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？&lt;a href=&quot;#解释短期记忆和长期记忆在-agent-系统中的区别分别适合怎么存储和检索-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：在当前会话或最近几轮对话中临时存储的信息，容量有限，生命周期短（通常一个会话）。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;：跨会话持久化存储的用户偏好、事实知识或历史决策，需要主动写入和检索。&lt;/li&gt;
&lt;li&gt;| 维度 | 短期记忆 | 长期记忆 |
|------|----------|----------|
| 生命周期 | 单次会话或最近N轮 | 跨会话持久 |
| 容量 | 受模型 Context Window 限制 | 理论无限 |
| 存储方式 | 内存或会话缓存 | 向量数据库、关系库或文件 |
| 检索方式 | 顺序读取或滑动窗口 | 语义搜索或关键词匹配 |
| 典型应用 | 多轮对话上下文 | 用户画像、知识库 |&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;存储与检索建议&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：存储在 Redis 或内存缓存中，按会话 ID 隔离，使用 LRU 淘汰策略。&lt;/li&gt;
&lt;li&gt;检索时按时间顺序拼接进 Prompt。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Memory_短期长期记忆区别存储检索&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：在当前会话或最近几轮对话中临时存储的信息，容量有限，生命周期短（通常一个会话）。&lt;strong&gt;长期记忆&lt;/strong&gt;：跨会话持久化存储的用户偏好、事实知识或历史决策，需要主动写入和检索。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;| 维度 | 短期记忆 | 长期记忆 |
|------|----------|----------|
| 生命周期 | 单次会话或最近N轮 | 跨会话持久 |
| 容量 | 受模型 Context Window 限制 | 理论无限 |
| 存储方式 | 内存或会话缓存 | 向量数据库、关系库或文件 |
| 检索方式 | 顺序读取或滑动窗口 | 语义搜索或关键词匹配 |
| 典型应用 | 多轮对话上下文 | 用户画像、知识库 |&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;存储与检索建议&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：存储在 Redis 或内存缓存中，按会话 ID 隔离，使用 LRU 淘汰策略。检索时按时间顺序拼接进 Prompt。&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;：写入向量数据库（如 Milvus、Qdrant）或关系库。检索时对用户查询做 Embedding，召回 Top-K 相关条目，再注入上下文。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;短期→长期沉淀&lt;/strong&gt;：通过定时任务或会话结束时，让 Agent 自动总结本次对话的关键信息，调用 &lt;code&gt;memory_upsert_longterm&lt;/code&gt; 工具写入长期库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;：在当前会话或最近几轮对话中临时存储的信息，容量有限，生命周期短（通常一个会话）。&lt;strong&gt;长期记忆&lt;/strong&gt;：跨会话持久化存储的用户偏好、事实知识或历史决策，需要主动写入和检索。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 维度 | 短期记忆 | 长期记忆 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;|------|----------|----------|&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 生命周期 | 单次会话或最近N轮 | 跨会话持久 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 容量 | 受模型 Context Window 限制 | 理论无限 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Multi Knowledge Base RAG 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-multi_knowledge_base_rag_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-multi_knowledge_base_rag_%E6%95%B4%E7%90%86/</guid><description># Multi_Knowledge_Base_RAG ## 问题 Multi_Knowledge_Base_RAG ## 标准回答 # 你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？ 多知识库 RAG </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Multi_Knowledge_Base_RAG&lt;a href=&quot;#multi_knowledge_base_rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Multi_Knowledge_Base_RAG&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？&lt;a href=&quot;#你有多个知识库做-rag-的时候怎么保证查询效率和准确性兼容并尽可能减少幻觉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;多知识库 RAG 的核心挑战是：不同知识库的数据分布、格式、质量各异，直接检索容易引入噪声或遗漏关键信息，导致效率和准确性下降，甚至产生幻觉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：采用&lt;strong&gt;路由 + 融合&lt;/strong&gt;的架构。
&lt;strong&gt;路由层（Router）&lt;/strong&gt;：在检索前，先判断用户问题属于哪个知识库。可用方案：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规则路由&lt;/strong&gt;：基于关键词匹配（如“医疗”问题路由到医疗库）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型路由&lt;/strong&gt;：用小模型（如 BERT）分类问题类型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量路由&lt;/strong&gt;：将用户问题 Embedding 后，与每个知识库的摘要向量比较，选择最相似的库。
&lt;strong&gt;检索层&lt;/strong&gt;：在选定的知识库（或并行多个库）中执行向量检索，召回 Top-K 文档。
&lt;strong&gt;融合层（Fusion）&lt;/strong&gt;：对多库召回的结果进行去重、重排序（如用 Cross-Encoder 模型），选出最相关的片段。
&lt;strong&gt;生成层&lt;/strong&gt;：注入检索结果，并添加强约束 Prompt，如“如果上下文中没有明确依据，请回答‘未找到相关信息’，不要编造”。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;减少幻觉的策略&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;来源标注&lt;/strong&gt;：要求模型在回答中引用具体来源（如“根据《医疗手册》第3章…”）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自我验证&lt;/strong&gt;：让模型先尝试回答，再用检索到的知识验证一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阈值过滤&lt;/strong&gt;：相似度低于阈值（如 0.7）的文档不送入生成阶段，直接告知用户未找到。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 多路召回融合策略&lt;a href=&quot;#1-多路召回融合策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RRF（Reciprocal Rank Fusion）&lt;/strong&gt;：综合多个检索结果的排名，对排名高的文档加权。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Score 归一化&lt;/strong&gt;：不同知识库的向量距离尺度不同，需先归一化再加权平均。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 索引优化&lt;a href=&quot;#2-索引优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分层索引&lt;/strong&gt;：为每个知识库单独建索引，再加一个全局摘要索引用于路由。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元数据过滤&lt;/strong&gt;：为文档打上知识库标签，检索时通过过滤器限定范围。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 实践案例（医疗 + 法律双知识库）&lt;a href=&quot;#3-实践案例医疗--法律双知识库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由&lt;/strong&gt;：用户问“发烧怎么办”→ 路由到医疗库；“合同纠纷”→ 路由到法律库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;融合&lt;/strong&gt;：若问题模糊（如“责任”），并行检索两个库，用 RRF 融合结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;幻觉防范&lt;/strong&gt;：法律回答中强制引用法条编号；医疗回答标注“非诊疗建议”免责声明。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：如果路由判断错误，导致检索不到正确知识怎么办？&lt;a href=&quot;#q1如果路由判断错误导致检索不到正确知识怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：兜底机制：当主检索结果为空或相似度过低时，自动触发一次全库检索。同时记录错误路由样本，用于定期微调路由模型。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：如何评估多库 RAG 的检索效果？&lt;a href=&quot;#q2如何评估多库-rag-的检索效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：构建跨库测试集，对每个问题标注预期来源库和文档。评估指标：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;路由准确率&lt;/li&gt;
&lt;li&gt;召回率 Recall@K&lt;/li&gt;
&lt;li&gt;幻觉率（人工评估或与真实知识对比）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：多库 RAG 如何控制成本？&lt;a href=&quot;#q3多库-rag-如何控制成本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：① 对高频知识库做本地向量缓存；② 路由模型用小模型（如 DistilBERT）；③ 对简单问题跳过检索，直接让模型回答。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;多知识库 RAG 通过路由层选择库、融合层优化结果、约束层减少幻觉，可兼顾效率与准确性。关键在于路由的准确性和融合策略的鲁棒性，同时需要完善的兜底与评估机制。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？&lt;a href=&quot;#你有多个知识库做-rag-的时候怎么保证查询效率和准确性兼容并尽可能减少幻觉-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;多知识库 RAG 的核心挑战是：不同知识库的数据分布、格式、质量各异，直接检索容易引入噪声或遗漏关键信息，导致效率和准确性下降，甚至产生幻觉。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：采用&lt;strong&gt;路由 + 融合&lt;/strong&gt;的架构。&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;路由层（Router）&lt;/strong&gt;：在检索前，先判断用户问题属于哪个知识库。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;可用方案：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规则路由&lt;/strong&gt;：基于关键词匹配（如“医疗”问题路由到医疗库）。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Multi_Knowledge_Base_RAG&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;多知识库 RAG 的核心挑战是：不同知识库的数据分布、格式、质量各异，直接检索容易引入噪声或遗漏关键信息，导致效率和准确性下降，甚至产生幻觉。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：采用&lt;strong&gt;路由 + 融合&lt;/strong&gt;的架构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;路由层（Router）&lt;/strong&gt;：在检索前，先判断用户问题属于哪个知识库。可用方案：&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;规则路由&lt;/strong&gt;：基于关键词匹配（如“医疗”问题路由到医疗库）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型路由&lt;/strong&gt;：用小模型（如 BERT）分类问题类型。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多知识库 RAG 的核心挑战是：不同知识库的数据分布、格式、质量各异，直接检索容易引入噪声或遗漏关键信息，导致效率和准确性下降，甚至产生幻觉。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：采用&lt;strong&gt;路由 + 融合&lt;/strong&gt;的架构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;路由层（Router）&lt;/strong&gt;：在检索前，先判断用户问题属于哪个知识库。可用方案：&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规则路由&lt;/strong&gt;：基于关键词匹配（如“医疗”问题路由到医疗库）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型路由&lt;/strong&gt;：用小模型（如 BERT）分类问题类型。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenClaw Agent Runner 工作阶段整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw_agent_runner_%E5%B7%A5%E4%BD%9C%E9%98%B6%E6%AE%B5%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw_agent_runner_%E5%B7%A5%E4%BD%9C%E9%98%B6%E6%AE%B5%E6%95%B4%E7%90%86/</guid><description># OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？ ## 核心回答 Agent Runner 是 OpenClaw 的核心调度器（指挥中心），负责协调 LLM 调用、工具执行、错误处理等</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;a href=&quot;#openclaw-的-agent-runner-是如何工作的一次-agent-运行经历了哪些阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Agent Runner 是 OpenClaw 的核心调度器（指挥中心），负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行（从用户发消息到最终输出）大致经历以下 6 个阶段：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;排队&lt;/strong&gt;&lt;br /&gt;
先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准备&lt;/strong&gt;&lt;br /&gt;
解析 workspace、provider/model、thinking level 等基础参数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;插件 + Hook&lt;/strong&gt;&lt;br /&gt;
加载运行时插件后，触发 &lt;code&gt;before_model_resolve&lt;/code&gt; 和 &lt;code&gt;before_agent_start&lt;/code&gt; 钩子。插件可以在模型解析之前动态覆盖 provider 和 model。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型解析 + 鉴权&lt;/strong&gt;&lt;br /&gt;
根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;尝试执行（核心，可重试）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建或恢复 Session，加载历史消息。&lt;/li&gt;
&lt;li&gt;注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）。&lt;/li&gt;
&lt;li&gt;根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）。&lt;/li&gt;
&lt;li&gt;触发执行循环：&lt;strong&gt;LLM 调用 → 工具执行 → 结果回传 → 再调 LLM&lt;/strong&gt;，直到模型认为任务完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;溢出降级&lt;/strong&gt;&lt;br /&gt;
如果上下文超限：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先 compaction 压缩历史；&lt;/li&gt;
&lt;li&gt;再截断超大 tool result；&lt;/li&gt;
&lt;li&gt;都不行就报错并引导用户开新会话。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;整个流程的设计思路是&lt;strong&gt;每个阶段都可插拔&lt;/strong&gt;：插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. attempt + fallback 容错机制&lt;a href=&quot;#1-attempt--fallback-容错机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Agent Runner 不是跑一次就完事，容错分两层：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auth Profile 轮转&lt;/strong&gt;：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型级 Fallback&lt;/strong&gt;：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 工具调用的双层包装&lt;a href=&quot;#2-工具调用的双层包装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每个工具在注册时会经过两层包装：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hook 拦截层&lt;/strong&gt;：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取消机制层&lt;/strong&gt;：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时或手动停止时，正在执行的工具可以被中断。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 流式处理的 Provider 适配&lt;a href=&quot;#3-流式处理的-provider-适配&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Runner 默认用通用的 &lt;code&gt;streamSimple&lt;/code&gt; 做流式输出，但不同 Provider 的流式 API 差异很大，因此会根据 Provider 类型动态替换流式引擎：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ollama&lt;/strong&gt;：走原生 &lt;code&gt;/api/chat&lt;/code&gt; 直连，绕过通用路径以获得更可靠的 streaming 和工具调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;：支持 WebSocket 通道，减少 HTTP 开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google&lt;/strong&gt;：额外 Gemini 特有的 thinking 字段。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;所有 Provider 还会统一做工具名称规范化，确保工具分发能精确匹配。这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口即可。新增 Provider 也只需要写一个流式适配函数。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. Context 溢出的三级降级&lt;a href=&quot;#4-context-溢出的三级降级&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;执行循环中 context 可能超限，Runner 做了三级自动降级：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;compaction&lt;/strong&gt;：调用 Context Engine 压缩历史消息，腾出 token 空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截断超大 tool result&lt;/strong&gt;：动态策略——先检测尾部是否包含错误信息或结果摘要；如果尾部重要则保留首尾、砍掉中间并插入省略标记，否则只保留开头。单个 tool result 最多占上下文窗口的 30%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;报错降级&lt;/strong&gt;：前两步都救不回来时，告诉用户 context 太长了，建议开新会话。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问（常见问题）&lt;a href=&quot;#面试官追问常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q1：排队执行保证并发安全，如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？&lt;/strong&gt;&lt;br /&gt;
A：后面那条消息会进入 session 级队列排队等待，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q2：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/strong&gt;&lt;br /&gt;
A：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配（例如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同）。这些都在 session 历史清洗阶段自动处理，fallback 切换对历史消息透明，不需要手动做格式迁移。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q3：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/strong&gt;&lt;br /&gt;
A：两层包装本身的开销可以忽略不计（几个函数调用和 Promise 包装，微秒级别）。真正可能有性能影响的是 Hook 里的具体逻辑（例如某个插件在 beforeToolCall 里做了一次网络请求做权限校验），那是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q4：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/strong&gt;&lt;br /&gt;
A：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用“头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明，提示模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢失关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw-%E6%8A%8A-context-%E7%AE%A1%E7%90%86%E6%8A%BD%E8%B1%A1%E6%88%90%E4%BA%86%E5%8F%AF%E6%8F%92%E6%8B%94%E7%9A%84-context-engine-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%81%9A%E8%BF%99%E5%B1%82%E6%8A%BD%E8%B1%A1-%E8%BF%99%E4%B8%AA%E8%AE%BE%E8%AE%A1%E8%83%BD%E6%94%AF%E6%8C%81%E5%93%AA%E4%BA%9B%E4%B8%8D%E5%90%8C%E7%9A%84%E7%AD%96%E7%95%A5-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw-%E6%8A%8A-context-%E7%AE%A1%E7%90%86%E6%8A%BD%E8%B1%A1%E6%88%90%E4%BA%86%E5%8F%AF%E6%8F%92%E6%8B%94%E7%9A%84-context-engine-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%81%9A%E8%BF%99%E5%B1%82%E6%8A%BD%E8%B1%A1-%E8%BF%99%E4%B8%AA%E8%AE%BE%E8%AE%A1%E8%83%BD%E6%94%AF%E6%8C%81%E5%93%AA%E4%BA%9B%E4%B8%8D%E5%90%8C%E7%9A%84%E7%AD%96%E7%95%A5-_%E6%95%B4%E7%90%86/</guid><description># OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？ ## 问题 OpenClaw 把 Context 管理抽象成了可插拔的 Context Eng</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？&lt;a href=&quot;#openclaw-把-context-管理抽象成了可插拔的-context-engine为什么要做这层抽象这个设计能支持哪些不同的策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。通俗理解：Context Engine 就像手机的存储管理。有的人喜欢自动清理旧照片，有的人喜欢只删大文件，有的人喜欢全部存云端按需下载。不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大。把 Context 管理抽象成接口（定义好”做什么”），让策略实现（“怎么做”）可以独立替换，既方便内部迭代，也方便社区扩展。这就是经典的策略模式。ContextEngine接口定义在src/context-engine/types.ts，覆盖了完整的生命周期：这套接口覆盖了上下文管理的完整生命周期，核心有三大操作加上若干生命周期钩子：阶段方法做什么初始化bootstrap会话首次创建时做初始化（比如导入历史）存消息ingest/ingestBatch新消息进来时怎么存、要不要做额外处理（比如向量化）挑消息assemble发给模型前，在 token 预算内挑出最合适的一组消息压消息compact历史太长时怎么压缩（摘要、裁剪、归档…）轮后处理afterTurn每轮对话结束后的收尾工作（持久化、触发后台压缩等）子 AgentprepareSubagentSpawn/onSubagentEnded管理子 Agent 的上下文隔离与回收销毁dispose释放引擎持有的资源核心调度逻辑只依赖这套接口，压根不关心背后的具体实现。通过registerContextEngine(id, factory)注册新引擎，在配置里通过plugins.slots.contextEngine一行就能切换，完全不用动核心代码。这就是典型的策略模式 + 插件化。有了这层抽象，至少能支撑以下几种完全不同的策略方向：默认的 legacy 策略：全部塞进去，塞不下了线性压缩最早的消息，简单粗暴但够用基于检索的 RAG 策略：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景分层存储策略：类似冷热分离，最近几轮放内存、摘要放本地、更早的扔云端，按需拉取任务感知策略：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，同样的 token 预算质量更高自定义压缩策略：通过ownsCompaction标记接管压缩，可以实现树状摘要、按话题分支压缩等高级方式&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;内置的 legacy 引擎当前 OpenClaw 默认内置了一个legacy引擎，代码在src/context-engine/legacy.ts。它的实现非常直白：ingest是 no-op，因为消息持久化由 SessionManager 负责；assemble直接透传消息列表，不做任何筛选；compact委托给compactEmbeddedPiSessionDirect()做线性压缩。这个引擎能跑，但策略非常粗糙，基本就是”全部塞进去，塞不下了就压缩最早的”。对于简单的短对话够用，但一旦对话超过几十轮，或者涉及多个不同话题的长期交互，效果就明显不行了。可以实现的高级策略Context Engine 抽象真正的价值在于它能支撑完全不同的上下文管理思路：基于检索的 Context Engine这种引擎走 RAG 的路子。ingest的时候把每条消息向量化，存进向量库。到assemble阶段，不是按时间顺序把最近的消息拼进去，而是根据当前 query 做语义检索，把最相关的历史片段捞出来。对于那种跨好几天、中间换过好几个话题的长对话，这种方式比线性截断有效得多。分层存储引擎思路类似数据库的冷热分离。热数据就是最近 3-5 轮对话，直接放内存；温数据是最近几个 compaction 周期的摘要，放本地文件；冷数据是更早的历史，可以扔到外部存储甚至云端。assemble的时候按需从不同层拉取，既能保证最近的上下文完整，又不会因为历史太长撑爆内存。任务感知引擎根据当前任务类型动态调整 Context 组装策略。比如检测到用户在写代码，就优先保留代码相关的历史、文件路径、报错信息；检测到是闲聊，就优先保留情感偏好和个人信息。同样的 token 预算，塞进去的内容质量完全不一样。自定义 Compaction 引擎接口里有个ownsCompaction: true的标记，设了这个标记的引擎可以完全接管压缩策略。默认的线性压缩是把最早的消息一坨压成摘要，但你可以换成树状摘要，把对话按话题分支组织，每个分支独立压缩，保留更多结构化信息。插件注册机制整个切换过程对核心代码零侵入。写一个新引擎只需要实现ContextEngine接口，然后调用registerContextEngine(“my-rag-engine”, factory)注册进去。配置文件里把plugins.slots.contextEngine指向你的引擎 ID 就行了。这跟 Webpack 的 plugin 体系、VS Code 的扩展机制是一个思路，都是约定好接口，实现随便换。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？回答：legacy 引擎的消息持久化是 SessionManager 在做，ingest 啥也不干纯粹是因为职责没划到 Context Engine 这边。换成 RAG 引擎的话，ingest 就得真正接管消息的处理了，至少要做向量化和入库。迁移的关键是 SessionManager 得把”写消息”这个动作让出来，或者两边做好协调，不能重复写。实际上这也是为什么要抽象成接口的原因之一，职责边界可以随着引擎实现灵活调整。- &lt;strong&gt;提问&lt;/strong&gt;：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：legacy 引擎很暴力，直接从最早的消息开始砍，砍到塞得下为止。RAG 引擎好一些，它本来就是按相关性排序的，预算紧就少捞几条，质量衰减比较平滑。分层存储引擎会优先砍冷数据层，保住热数据。任务感知引擎最灵活，它可以根据任务权重动态决定哪些类型的历史先丢掉，比如写代码的时候闲聊记录优先级最低，第一个被砍。- &lt;strong&gt;提问&lt;/strong&gt;：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：OpenClaw 的压缩触发分两层。不设ownsCompaction的话，底层的 Pi runtime 有内置的 auto-compaction，它自己监控 token 用量，超过阈值就自动压缩，外层 Runner 不需要手动介入。设了ownsCompaction: true之后，Pi 的内置 auto-compaction 会被禁用，改由引擎自己通过afterTurn等生命周期钩子决定什么时候压、怎么压。但不管设没设这个标记，Runner 还有一层溢出压缩兜底，当上下文真的塞不下时，Runner 会直接调contextEngine.compact()做紧急压缩。简单说就是：ownsCompaction控制的是”日常谁来管压缩”，但”快炸了”的时候 Runner 一定会兜底。这种设计对有自己一套存储和索引体系的引擎特别重要，因为通用的压缩逻辑不了解引擎内部的数据组织方式，日常由引擎自主管理更合理。作者：Yes面试鸭官方
不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把 Context 管理抽象成接口，让策略实现可以独立替换，方便内部迭代，也方便社区扩展。&lt;/p&gt;&lt;p&gt;有了这层抽象，能支持以下几种完全不同的策略方向：&lt;/p&gt;&lt;p&gt;1.展开新页面打开2026-03-17  22:2900回复晚夜微雨问海棠特训营一、OpenClaw 抽象 Context Engine 的核心原因OpenClaw 将上下文管理从硬编码逻辑升级为可插拔的 Context Engine 插件化架构，本质是软件架构设计中「关注点分离（Separation of Concerns）」与「&lt;strong&gt;策略模式（Strat展开新页面打开2026-03-15  10:2600回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本**斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎可以实现的高级策略插件注册机制&lt;/p&gt;&lt;p&gt;提问：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？提问：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？提问：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13232. OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。通俗理解：Context Engine 就像手机的存储管理。有的人喜欢自动清理旧照片，有的人喜欢只删大文件，有的人喜欢全部存云端按需下载。不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大。把 Context 管理抽象成接口（定义好”做什么”），让策略实现（“怎么做”）可以独立替换，既方便内部迭代，也方便社区扩展。这就是经典的策略模式。ContextEngine接口定义在src/context-engine/types.ts，覆盖了完整的生命周期：这套接口覆盖了上下文管理的完整生命周期，核心有三大操作加上若干生命周期钩子：阶段方法做什么初始化bootstrap会话首次创建时做初始化（比如导入历史）存消息ingest/ingestBatch新消息进来时怎么存、要不要做额外处理（比如向量化）挑消息assemble发给模型前，在 token 预算内挑出最合适的一组消息压消息compact历史太长时怎么压缩（摘要、裁剪、归档…）轮后处理afterTurn每轮对话结束后的收尾工作（持久化、触发后台压缩等）子 AgentprepareSubagentSpawn/onSubagentEnded管理子 Agent 的上下文隔离与回收销毁dispose释放引擎持有的资源核心调度逻辑只依赖这套接口，压根不关心背后的具体实现。通过registerContextEngine(id, factory)注册新引擎，在配置里通过plugins.slots.contextEngine一行就能切换，完全不用动核心代码。这就是典型的策略模式 + 插件化。有了这层抽象，至少能支撑以下几种完全不同的策略方向：默认的 legacy 策略：全部塞进去，塞不下了线性压缩最早的消息，简单粗暴但够用基于检索的 RAG 策略：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景分层存储策略：类似冷热分离，最近几轮放内存、摘要放本地、更早的扔云端，按需拉取任务感知策略：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，同样的 token 预算质量更高自定义压缩策略：通过ownsCompaction标记接管压缩，可以实现树状摘要、按话题分支压缩等高级方式&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎当前 OpenClaw 默认内置了一个legacy引擎，代码在src/context-engine/legacy.ts。它的实现非常直白：ingest是 no-op，因为消息持久化由 SessionManager 负责；assemble直接透传消息列表，不做任何筛选；compact委托给compactEmbeddedPiSessionDirect()做线性压缩。这个引擎能跑，但策略非常粗糙，基本就是”全部塞进去，塞不下了就压缩最早的”。对于简单的短对话够用，但一旦对话超过几十轮，或者涉及多个不同话题的长期交互，效果就明显不行了。可以实现的高级策略Context Engine 抽象真正的价值在于它能支撑完全不同的上下文管理思路：基于检索的 Context Engine这种引擎走 RAG 的路子。ingest的时候把每条消息向量化，存进向量库。到assemble阶段，不是按时间顺序把最近的消息拼进去，而是根据当前 query 做语义检索，把最相关的历史片段捞出来。对于那种跨好几天、中间换过好几个话题的长对话，这种方式比线性截断有效得多。分层存储引擎思路类似数据库的冷热分离。热数据就是最近 3-5 轮对话，直接放内存；温数据是最近几个 compaction 周期的摘要，放本地文件；冷数据是更早的历史，可以扔到外部存储甚至云端。assemble的时候按需从不同层拉取，既能保证最近的上下文完整，又不会因为历史太长撑爆内存。任务感知引擎根据当前任务类型动态调整 Context 组装策略。比如检测到用户在写代码，就优先保留代码相关的历史、文件路径、报错信息；检测到是闲聊，就优先保留情感偏好和个人信息。同样的 token 预算，塞进去的内容质量完全不一样。自定义 Compaction 引擎接口里有个ownsCompaction: true的标记，设了这个标记的引擎可以完全接管压缩策略。默认的线性压缩是把最早的消息一坨压成摘要，但你可以换成树状摘要，把对话按话题分支组织，每个分支独立压缩，保留更多结构化信息。插件注册机制整个切换过程对核心代码零侵入。写一个新引擎只需要实现ContextEngine接口，然后调用registerContextEngine(“my-rag-engine”, factory)注册进去。配置文件里把plugins.slots.contextEngine指向你的引擎 ID 就行了。这跟 Webpack 的 plugin 体系、VS Code 的扩展机制是一个思路，都是约定好接口，实现随便换。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？回答：legacy 引擎的消息持久化是 SessionManager 在做，ingest 啥也不干纯粹是因为职责没划到 Context Engine 这边。换成 RAG 引擎的话，ingest 就得真正接管消息的处理了，至少要做向量化和入库。迁移的关键是 SessionManager 得把”写消息”这个动作让出来，或者两边做好协调，不能重复写。实际上这也是为什么要抽象成接口的原因之一，职责边界可以随着引擎实现灵活调整。- &lt;strong&gt;提问&lt;/strong&gt;：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：legacy 引擎很暴力，直接从最早的消息开始砍，砍到塞得下为止。RAG 引擎好一些，它本来就是按相关性排序的，预算紧就少捞几条，质量衰减比较平滑。分层存储引擎会优先砍冷数据层，保住热数据。任务感知引擎最灵活，它可以根据任务权重动态决定哪些类型的历史先丢掉，比如写代码的时候闲聊记录优先级最低，第一个被砍。- &lt;strong&gt;提问&lt;/strong&gt;：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：OpenClaw 的压缩触发分两层。不设ownsCompaction的话，底层的 Pi runtime 有内置的 auto-compaction，它自己监控 token 用量，超过阈值就自动压缩，外层 Runner 不需要手动介入。设了ownsCompaction: true之后，Pi 的内置 auto-compaction 会被禁用，改由引擎自己通过afterTurn等生命周期钩子决定什么时候压、怎么压。但不管设没设这个标记，Runner 还有一层溢出压缩兜底，当上下文真的塞不下时，Runner 会直接调contextEngine.compact()做紧急压缩。简单说就是：ownsCompaction控制的是”日常谁来管压缩”，但”快炸了”的时候 Runner 一定会兜底。这种设计对有自己一套存储和索引体系的引擎特别重要，因为通用的压缩逻辑不了解引擎内部的数据组织方式，日常由引擎自主管理更合理。作者：Yes面试鸭官方
不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把 Context 管理抽象成接口，让策略实现可以独立替换，方便内部迭代，也方便社区扩展。&lt;/p&gt;&lt;p&gt;有了这层抽象，能支持以下几种完全不同的策略方向：&lt;/p&gt;&lt;p&gt;1.展开新页面打开2026-03-17  22:2900回复晚夜微雨问海棠特训营一、OpenClaw 抽象 Context Engine 的核心原因OpenClaw 将上下文管理从硬编码逻辑升级为可插拔的 Context Engine 插件化架构，本质是软件架构设计中「关注点分离（Separation of Concerns）」与「&lt;strong&gt;策略模式（Strat展开新页面打开2026-03-15  10:2600回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本**斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎可以实现的高级策略插件注册机制&lt;/p&gt;&lt;p&gt;提问：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？提问：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？提问：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？&lt;a href=&quot;#openclaw-把-context-管理抽象成了可插拔的-context-engine为什么要做这层抽象&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;这个设计能支持哪些不同的策略？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这个设计能支持哪些不同的策略？&lt;/li&gt;
&lt;li&gt;NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。通俗理解：Context Engine 就像手机的存储管理。有的人喜欢自动清理旧照片，有的人喜欢只删大文件，有的人喜欢全部存云端按需下载。不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大。把 Context 管理抽象成接口（定义好”做什么”），让策略实现（“怎么做”）可以独立替换，既方便内部迭代，也方便社区扩展。这就是经典的策略模式。ContextEngine接口定义在src/context-engine/types.ts，覆盖了完整的生命周期：这套接口覆盖了上下文管理的完整生命周期，核心有三大操作加上若干生命周期钩子：阶段方法做什么初始化bootstrap会话首次创建时做初始化（比如导入历史）存消息ingest/ingestBatch新消息进来时怎么存、要不要做额外处理（比如向量化）挑消息assemble发给模型前，在 token 预算内挑出最合适的一组消息压消息compact历史太长时怎么压缩（摘要、裁剪、归档…）轮后处理afterTurn每轮对话结束后的收尾工作（持久化、触发后台压缩等）子 AgentprepareSubagentSpawn/onSubagentEnded管理子 Agent 的上下文隔离与回收销毁dispose释放引擎持有的资源核心调度逻辑只依赖这套接口，压根不关心背后的具体实现。通过registerContextEngine(id, factory)注册新引擎，在配置里通过plugins.slots.contextEngine一行就能切换，完全不用动核心代码。这就是典型的策略模式 + 插件化。有了这层抽象，至少能支撑以下几种完全不同的策略方向：默认的 legacy 策略：全部塞进去，塞不下了线性压缩最早的消息，简单粗暴但够用基于检索的 RAG 策略：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景分层存储策略：类似冷热分离，最近几轮放内存、摘要放本地、更早的扔云端，按需拉取任务感知策略：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，同样的 token 预算质量更高自定义压缩策略：通过ownsCompaction标记接管压缩，可以实现树状摘要、按话题分支压缩等高级方式&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎当前 OpenClaw 默认内置了一个legacy引擎，代码在src/context-engine/legacy.ts。它的实现非常直白：ingest是 no-op，因为消息持久化由 SessionManager 负责；assemble直接透传消息列表，不做任何筛选；compact委托给compactEmbeddedPiSessionDirect()做线性压缩。这个引擎能跑，但策略非常粗糙，基本就是”全部塞进去，塞不下了就压缩最早的”。对于简单的短对话够用，但一旦对话超过几十轮，或者涉及多个不同话题的长期交互，效果就明显不行了。可以实现的高级策略Context Engine 抽象真正的价值在于它能支撑完全不同的上下文管理思路：基于检索的 Context Engine这种引擎走 RAG 的路子。ingest的时候把每条消息向量化，存进向量库。到assemble阶段，不是按时间顺序把最近的消息拼进去，而是根据当前 query 做语义检索，把最相关的历史片段捞出来。对于那种跨好几天、中间换过好几个话题的长对话，这种方式比线性截断有效得多。分层存储引擎思路类似数据库的冷热分离。热数据就是最近 3-5 轮对话，直接放内存；温数据是最近几个 compaction 周期的摘要，放本地文件；冷数据是更早的历史，可以扔到外部存储甚至云端。assemble的时候按需从不同层拉取，既能保证最近的上下文完整，又不会因为历史太长撑爆内存。任务感知引擎根据当前任务类型动态调整 Context 组装策略。比如检测到用户在写代码，就优先保留代码相关的历史、文件路径、报错信息；检测到是闲聊，就优先保留情感偏好和个人信息。同样的 token 预算，塞进去的内容质量完全不一样。自定义 Compaction 引擎接口里有个ownsCompaction: true的标记，设了这个标记的引擎可以完全接管压缩策略。默认的线性压缩是把最早的消息一坨压成摘要，但你可以换成树状摘要，把对话按话题分支组织，每个分支独立压缩，保留更多结构化信息。插件注册机制整个切换过程对核心代码零侵入。写一个新引擎只需要实现ContextEngine接口，然后调用registerContextEngine(“my-rag-engine”, factory)注册进去。配置文件里把plugins.slots.contextEngine指向你的引擎 ID 就行了。这跟 Webpack 的 plugin 体系、VS Code 的扩展机制是一个思路，都是约定好接口，实现随便换。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？回答：legacy 引擎的消息持久化是 SessionManager 在做，ingest 啥也不干纯粹是因为职责没划到 Context Engine 这边。换成 RAG 引擎的话，ingest 就得真正接管消息的处理了，至少要做向量化和入库。迁移的关键是 SessionManager 得把”写消息”这个动作让出来，或者两边做好协调，不能重复写。实际上这也是为什么要抽象成接口的原因之一，职责边界可以随着引擎实现灵活调整。- &lt;strong&gt;提问&lt;/strong&gt;：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：legacy 引擎很暴力，直接从最早的消息开始砍，砍到塞得下为止。RAG 引擎好一些，它本来就是按相关性排序的，预算紧就少捞几条，质量衰减比较平滑。分层存储引擎会优先砍冷数据层，保住热数据。任务感知引擎最灵活，它可以根据任务权重动态决定哪些类型的历史先丢掉，比如写代码的时候闲聊记录优先级最低，第一个被砍。- &lt;strong&gt;提问&lt;/strong&gt;：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：OpenClaw 的压缩触发分两层。不设ownsCompaction的话，底层的 Pi runtime 有内置的 auto-compaction，它自己监控 token 用量，超过阈值就自动压缩，外层 Runner 不需要手动介入。设了ownsCompaction: true之后，Pi 的内置 auto-compaction 会被禁用，改由引擎自己通过afterTurn等生命周期钩子决定什么时候压、怎么压。但不管设没设这个标记，Runner 还有一层溢出压缩兜底，当上下文真的塞不下时，Runner 会直接调contextEngine.compact()做紧急压缩。简单说就是：ownsCompaction控制的是”日常谁来管压缩”，但”快炸了”的时候 Runner 一定会兜底。这种设计对有自己一套存储和索引体系的引擎特别重要，因为通用的压缩逻辑不了解引擎内部的数据组织方式，日常由引擎自主管理更合理。作者：Yes面试鸭官方
不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把 Context 管理抽象成接口，让策略实现可以独立替换，方便内部迭代，也方便社区扩展。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;有了这层抽象，能支持以下几种完全不同的策略方向：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;1.展开新页面打开2026-03-17  22:2900回复晚夜微雨问海棠特训营一、OpenClaw 抽象 Context Engine 的核心原因OpenClaw 将上下文管理从硬编码逻辑升级为可插拔的 Context Engine 插件化架构，本质是软件架构设计中「关注点分离（Separation of Concerns）」与「&lt;strong&gt;策略模式（Strat展开新页面打开2026-03-15  10:2600回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本**斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎可以实现的高级策略插件注册机制&lt;/p&gt;&lt;p&gt;提问：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？提问：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？提问：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13232. OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。通俗理解：Context Engine 就像手机的存储管理。有的人喜欢自动清理旧照片，有的人喜欢只删大文件，有的人喜欢全部存云端按需下载。不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大。把 Context 管理抽象成接口（定义好”做什么”），让策略实现（“怎么做”）可以独立替换，既方便内部迭代，也方便社区扩展。这就是经典的策略模式。ContextEngine接口定义在src/context-engine/types.ts，覆盖了完整的生命周期：这套接口覆盖了上下文管理的完整生命周期，核心有三大操作加上若干生命周期钩子：阶段方法做什么初始化bootstrap会话首次创建时做初始化（比如导入历史）存消息ingest/ingestBatch新消息进来时怎么存、要不要做额外处理（比如向量化）挑消息assemble发给模型前，在 token 预算内挑出最合适的一组消息压消息compact历史太长时怎么压缩（摘要、裁剪、归档…）轮后处理afterTurn每轮对话结束后的收尾工作（持久化、触发后台压缩等）子 AgentprepareSubagentSpawn/onSubagentEnded管理子 Agent 的上下文隔离与回收销毁dispose释放引擎持有的资源核心调度逻辑只依赖这套接口，压根不关心背后的具体实现。通过registerContextEngine(id, factory)注册新引擎，在配置里通过plugins.slots.contextEngine一行就能切换，完全不用动核心代码。这就是典型的策略模式 + 插件化。有了这层抽象，至少能支撑以下几种完全不同的策略方向：默认的 legacy 策略：全部塞进去，塞不下了线性压缩最早的消息，简单粗暴但够用基于检索的 RAG 策略：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景分层存储策略：类似冷热分离，最近几轮放内存、摘要放本地、更早的扔云端，按需拉取任务感知策略：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，同样的 token 预算质量更高自定义压缩策略：通过ownsCompaction标记接管压缩，可以实现树状摘要、按话题分支压缩等高级方式&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎当前 OpenClaw 默认内置了一个legacy引擎，代码在src/context-engine/legacy.ts。它的实现非常直白：ingest是 no-op，因为消息持久化由 SessionManager 负责；assemble直接透传消息列表，不做任何筛选；compact委托给compactEmbeddedPiSessionDirect()做线性压缩。这个引擎能跑，但策略非常粗糙，基本就是”全部塞进去，塞不下了就压缩最早的”。对于简单的短对话够用，但一旦对话超过几十轮，或者涉及多个不同话题的长期交互，效果就明显不行了。可以实现的高级策略Context Engine 抽象真正的价值在于它能支撑完全不同的上下文管理思路：基于检索的 Context Engine这种引擎走 RAG 的路子。ingest的时候把每条消息向量化，存进向量库。到assemble阶段，不是按时间顺序把最近的消息拼进去，而是根据当前 query 做语义检索，把最相关的历史片段捞出来。对于那种跨好几天、中间换过好几个话题的长对话，这种方式比线性截断有效得多。分层存储引擎思路类似数据库的冷热分离。热数据就是最近 3-5 轮对话，直接放内存；温数据是最近几个 compaction 周期的摘要，放本地文件；冷数据是更早的历史，可以扔到外部存储甚至云端。assemble的时候按需从不同层拉取，既能保证最近的上下文完整，又不会因为历史太长撑爆内存。任务感知引擎根据当前任务类型动态调整 Context 组装策略。比如检测到用户在写代码，就优先保留代码相关的历史、文件路径、报错信息；检测到是闲聊，就优先保留情感偏好和个人信息。同样的 token 预算，塞进去的内容质量完全不一样。自定义 Compaction 引擎接口里有个ownsCompaction: true的标记，设了这个标记的引擎可以完全接管压缩策略。默认的线性压缩是把最早的消息一坨压成摘要，但你可以换成树状摘要，把对话按话题分支组织，每个分支独立压缩，保留更多结构化信息。插件注册机制整个切换过程对核心代码零侵入。写一个新引擎只需要实现ContextEngine接口，然后调用registerContextEngine(“my-rag-engine”, factory)注册进去。配置文件里把plugins.slots.contextEngine指向你的引擎 ID 就行了。这跟 Webpack 的 plugin 体系、VS Code 的扩展机制是一个思路，都是约定好接口，实现随便换。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？回答：legacy 引擎的消息持久化是 SessionManager 在做，ingest 啥也不干纯粹是因为职责没划到 Context Engine 这边。换成 RAG 引擎的话，ingest 就得真正接管消息的处理了，至少要做向量化和入库。迁移的关键是 SessionManager 得把”写消息”这个动作让出来，或者两边做好协调，不能重复写。实际上这也是为什么要抽象成接口的原因之一，职责边界可以随着引擎实现灵活调整。- &lt;strong&gt;提问&lt;/strong&gt;：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：legacy 引擎很暴力，直接从最早的消息开始砍，砍到塞得下为止。RAG 引擎好一些，它本来就是按相关性排序的，预算紧就少捞几条，质量衰减比较平滑。分层存储引擎会优先砍冷数据层，保住热数据。任务感知引擎最灵活，它可以根据任务权重动态决定哪些类型的历史先丢掉，比如写代码的时候闲聊记录优先级最低，第一个被砍。- &lt;strong&gt;提问&lt;/strong&gt;：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：OpenClaw 的压缩触发分两层。不设ownsCompaction的话，底层的 Pi runtime 有内置的 auto-compaction，它自己监控 token 用量，超过阈值就自动压缩，外层 Runner 不需要手动介入。设了ownsCompaction: true之后，Pi 的内置 auto-compaction 会被禁用，改由引擎自己通过afterTurn等生命周期钩子决定什么时候压、怎么压。但不管设没设这个标记，Runner 还有一层溢出压缩兜底，当上下文真的塞不下时，Runner 会直接调contextEngine.compact()做紧急压缩。简单说就是：ownsCompaction控制的是”日常谁来管压缩”，但”快炸了”的时候 Runner 一定会兜底。这种设计对有自己一套存储和索引体系的引擎特别重要，因为通用的压缩逻辑不了解引擎内部的数据组织方式，日常由引擎自主管理更合理。作者：Yes面试鸭官方
不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把 Context 管理抽象成接口，让策略实现可以独立替换，方便内部迭代，也方便社区扩展。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;有了这层抽象，能支持以下几种完全不同的策略方向：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;1.展开新页面打开2026-03-17  22:2900回复晚夜微雨问海棠特训营一、OpenClaw 抽象 Context Engine 的核心原因OpenClaw 将上下文管理从硬编码逻辑升级为可插拔的 Context Engine 插件化架构，本质是软件架构设计中「关注点分离（Separation of Concerns）」与「&lt;strong&gt;策略模式（Strat展开新页面打开2026-03-15  10:2600回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本**斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;内置的 legacy 引擎可以实现的高级策略插件注册机制&lt;/p&gt;&lt;p&gt;提问：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？提问：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？提问：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？&lt;a href=&quot;#openclaw-把-context-管理抽象成了可插拔的-context-engine为什么要做这层抽象-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？&lt;a href=&quot;#openclaw-把-context-管理抽象成了可插拔的-context-engine为什么要做这层抽象这个设计能支持哪些不同的策略-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1144面试问答做这层抽象的根本原因是Context 管理没有万能方案。通俗理解：Context Engine 就像手机的存储管理。有的人喜欢自动清理旧照片，有的人喜欢只删大文件，有的人喜欢全部存云端按需下载。不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大。把 Context 管理抽象成接口（定义好”做什么”），让策略实现（“怎么做”）可以独立替换，既方便内部迭代，也方便社区扩展。这就是经典的策略模式。ContextEngine接口定义在src/context-engine/types.ts，覆盖了完整的生命周期：这套接口覆盖了上下文管理的完整生命周期，核心有三大操作加上若干生命周期钩子：阶段方法做什么初始化bootstrap会话首次创建时做初始化（比如导入历史）存消息ingest/ingestBatch新消息进来时怎么存、要不要做额外处理（比如向量化）挑消息assemble发给模型前，在 token 预算内挑出最合适的一组消息压消息compact历史太长时怎么压缩（摘要、裁剪、归档…）轮后处理afterTurn每轮对话结束后的收尾工作（持久化、触发后台压缩等）子 AgentprepareSubagentSpawn/onSubagentEnded管理子 Agent 的上下文隔离与回收销毁dispose释放引擎持有的资源核心调度逻辑只依赖这套接口，压根不关心背后的具体实现。通过registerContextEngine(id, factory)注册新引擎，在配置里通过plugins.slots.contextEngine一行就能切换，完全不用动核心代码。这就是典型的策略模式 + 插件化。有了这层抽象，至少能支撑以下几种完全不同的策略方向：默认的 legacy 策略：全部塞进去，塞不下了线性压缩最早的消息，简单粗暴但够用基于检索的 RAG 策略：消息入库时向量化，组装时按语义相关性捞历史，适合长对话多话题场景分层存储策略：类似冷热分离，最近几轮放内存、摘要放本地、更早的扔云端，按需拉取任务感知策略：根据当前任务类型（写代码 vs 闲聊）动态决定保留哪些历史，同样的 token 预算质量更高自定义压缩策略：通过ownsCompaction标记接管压缩，可以实现树状摘要、按话题分支压缩等高级方式&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;内置的 legacy 引擎当前 OpenClaw 默认内置了一个legacy引擎，代码在src/context-engine/legacy.ts。它的实现非常直白：ingest是 no-op，因为消息持久化由 SessionManager 负责；assemble直接透传消息列表，不做任何筛选；compact委托给compactEmbeddedPiSessionDirect()做线性压缩。这个引擎能跑，但策略非常粗糙，基本就是”全部塞进去，塞不下了就压缩最早的”。对于简单的短对话够用，但一旦对话超过几十轮，或者涉及多个不同话题的长期交互，效果就明显不行了。可以实现的高级策略Context Engine 抽象真正的价值在于它能支撑完全不同的上下文管理思路：基于检索的 Context Engine这种引擎走 RAG 的路子。ingest的时候把每条消息向量化，存进向量库。到assemble阶段，不是按时间顺序把最近的消息拼进去，而是根据当前 query 做语义检索，把最相关的历史片段捞出来。对于那种跨好几天、中间换过好几个话题的长对话，这种方式比线性截断有效得多。分层存储引擎思路类似数据库的冷热分离。热数据就是最近 3-5 轮对话，直接放内存；温数据是最近几个 compaction 周期的摘要，放本地文件；冷数据是更早的历史，可以扔到外部存储甚至云端。assemble的时候按需从不同层拉取，既能保证最近的上下文完整，又不会因为历史太长撑爆内存。任务感知引擎根据当前任务类型动态调整 Context 组装策略。比如检测到用户在写代码，就优先保留代码相关的历史、文件路径、报错信息；检测到是闲聊，就优先保留情感偏好和个人信息。同样的 token 预算，塞进去的内容质量完全不一样。自定义 Compaction 引擎接口里有个ownsCompaction: true的标记，设了这个标记的引擎可以完全接管压缩策略。默认的线性压缩是把最早的消息一坨压成摘要，但你可以换成树状摘要，把对话按话题分支组织，每个分支独立压缩，保留更多结构化信息。插件注册机制整个切换过程对核心代码零侵入。写一个新引擎只需要实现ContextEngine接口，然后调用registerContextEngine(“my-rag-engine”, factory)注册进去。配置文件里把plugins.slots.contextEngine指向你的引擎 ID 就行了。这跟 Webpack 的 plugin 体系、VS Code 的扩展机制是一个思路，都是约定好接口，实现随便换。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：legacy 引擎的 ingest 是 no-op，那消息是谁在管？如果换成 RAG 引擎，这块职责怎么迁移？回答：legacy 引擎的消息持久化是 SessionManager 在做，ingest 啥也不干纯粹是因为职责没划到 Context Engine 这边。换成 RAG 引擎的话，ingest 就得真正接管消息的处理了，至少要做向量化和入库。迁移的关键是 SessionManager 得把”写消息”这个动作让出来，或者两边做好协调，不能重复写。实际上这也是为什么要抽象成接口的原因之一，职责边界可以随着引擎实现灵活调整。- &lt;strong&gt;提问&lt;/strong&gt;：assemble 的时候有个 token 预算参数，如果预算给得很紧，不同引擎的降级策略会有什么差异？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：legacy 引擎很暴力，直接从最早的消息开始砍，砍到塞得下为止。RAG 引擎好一些，它本来就是按相关性排序的，预算紧就少捞几条，质量衰减比较平滑。分层存储引擎会优先砍冷数据层，保住热数据。任务感知引擎最灵活，它可以根据任务权重动态决定哪些类型的历史先丢掉，比如写代码的时候闲聊记录优先级最低，第一个被砍。- &lt;strong&gt;提问&lt;/strong&gt;：ownsCompaction 这个标记具体怎么生效的？不设这个标记的话压缩是谁触发的？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：OpenClaw 的压缩触发分两层。不设ownsCompaction的话，底层的 Pi runtime 有内置的 auto-compaction，它自己监控 token 用量，超过阈值就自动压缩，外层 Runner 不需要手动介入。设了ownsCompaction: true之后，Pi 的内置 auto-compaction 会被禁用，改由引擎自己通过afterTurn等生命周期钩子决定什么时候压、怎么压。但不管设没设这个标记，Runner 还有一层溢出压缩兜底，当上下文真的塞不下时，Runner 会直接调contextEngine.compact()做紧急压缩。简单说就是：ownsCompaction控制的是”日常谁来管压缩”，但”快炸了”的时候 Runner 一定会兜底。这种设计对有自己一套存储和索引体系的引擎特别重要，因为通用的压缩逻辑不了解引擎内部的数据组织方式，日常由引擎自主管理更合理。作者：Yes面试鸭官方- 不同的应用场景、不同的模型上下文窗口大小、不同的任务类型，最优的 Context 策略差异巨大&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把 Context 管理抽象成接口，让策略实现可以独立替换，方便内部迭代，也方便社区扩展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw-%E7%9A%84-agent-runner-%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84-%E4%B8%80%E6%AC%A1-agent-%E8%BF%90%E8%A1%8C%E7%BB%8F%E5%8E%86%E4%BA%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-openclaw-%E7%9A%84-agent-runner-%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84-%E4%B8%80%E6%AC%A1-agent-%E8%BF%90%E8%A1%8C%E7%BB%8F%E5%8E%86%E4%BA%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5-_%E6%95%B4%E7%90%86/</guid><description># OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？ ## 问题 OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？ ## 标准回答 Op</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;a href=&quot;#openclaw-的-agent-runner-是如何工作的一次-agent-运行经历了哪些阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方
一次完整的 Agent 运行，大致分一下几个阶段：排队：先进 session级队列 后进 全局队列准备：解析 workspace、provider/model、thin展开新页面打开2026-03-15  19:2000回复晚夜微雨问海棠特训营一、OpenClaw 工具执行模块的稳定性保障体系OpenClaw 的工具执行模块（Tools System/Skill Execution Engine）是打通AI「思考」到「落地」的核心执行单元，其稳定性通过多层级、全链路的防护与容错机制实现，从执行前、执行中、执行后全周期覆盖，核展开新页面打开2026-03-15  09:1500回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制工具调用的双层包装流式处理的 Provider 适配Context 溢出的三级降级&lt;/p&gt;&lt;p&gt;提问：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？提问：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？提问：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？提问：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13228. OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/p&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方
一次完整的 Agent 运行，大致分一下几个阶段：排队：先进 session级队列 后进 全局队列准备：解析 workspace、provider/model、thin展开新页面打开2026-03-15  19:2000回复晚夜微雨问海棠特训营一、OpenClaw 工具执行模块的稳定性保障体系OpenClaw 的工具执行模块（Tools System/Skill Execution Engine）是打通AI「思考」到「落地」的核心执行单元，其稳定性通过多层级、全链路的防护与容错机制实现，从执行前、执行中、执行后全周期覆盖，核展开新页面打开2026-03-15  09:1500回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制工具调用的双层包装流式处理的 Provider 适配Context 溢出的三级降级&lt;/p&gt;&lt;p&gt;提问：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？提问：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？提问：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？提问：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 的 Agent Runner 是如何工作的？&lt;a href=&quot;#openclaw-的-agent-runner-是如何工作的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;一次 Agent 运行经历了哪些阶段？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;一次 Agent 运行经历了哪些阶段？&lt;/li&gt;
&lt;li&gt;NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/p&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方
一次完整的 Agent 运行，大致分一下几个阶段：排队：先进 session级队列 后进 全局队列准备：解析 workspace、provider/model、thin展开新页面打开2026-03-15  19:2000回复晚夜微雨问海棠特训营一、OpenClaw 工具执行模块的稳定性保障体系OpenClaw 的工具执行模块（Tools System/Skill Execution Engine）是打通AI「思考」到「落地」的核心执行单元，其稳定性通过多层级、全链路的防护与容错机制实现，从执行前、执行中、执行后全周期覆盖，核展开新页面打开2026-03-15  09:1500回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制工具调用的双层包装流式处理的 Provider 适配Context 溢出的三级降级&lt;/p&gt;&lt;p&gt;提问：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？提问：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？提问：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？提问：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13228. OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/p&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方
一次完整的 Agent 运行，大致分一下几个阶段：排队：先进 session级队列 后进 全局队列准备：解析 workspace、provider/model、thin展开新页面打开2026-03-15  19:2000回复晚夜微雨问海棠特训营一、OpenClaw 工具执行模块的稳定性保障体系OpenClaw 的工具执行模块（Tools System/Skill Execution Engine）是打通AI「思考」到「落地」的核心执行单元，其稳定性通过多层级、全链路的防护与容错机制实现，从执行前、执行中、执行后全周期覆盖，核展开新页面打开2026-03-15  09:1500回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制工具调用的双层包装流式处理的 Provider 适配Context 溢出的三级降级&lt;/p&gt;&lt;p&gt;提问：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？提问：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？提问：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？提问：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 的 Agent Runner 是如何工作的？&lt;a href=&quot;#openclaw-的-agent-runner-是如何工作的-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;一次 Agent 运行经历了哪些阶段？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Agent Runner 是如何工作的？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？&lt;a href=&quot;#openclaw-的-agent-runner-是如何工作的一次-agent-运行经历了哪些阶段-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方- 一次完整的 Agent 运行，大致分一下几个阶段：排队：先进 session级队列 后进 全局队列准备：解析 workspace、provider/model、thin展开新页面打开2026-03-15  19:2000回复晚夜微雨问海棠特训营一、OpenClaw 工具执行模块的稳定性保障体系OpenClaw 的工具执行模块（Tools System/Skill Execution Engine）是打通AI「思考」到「落地」的核心执行单元，其稳定性通过多层级、全链路的防护与容错机制实现，从执行前、执行中、执行后全周期覆盖，核展开新页面打开2026-03-15  09:1500回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制工具调用的双层包装流式处理的 Provider 适配Context 溢出的三级降级&lt;/p&gt;&lt;p&gt;提问：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？提问：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？提问：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？提问：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13228. OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？NEW困难AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1200面试问答Agent Runner 是 OpenClaw 的核心调度器，可以理解为”指挥中心”，负责协调 LLM 调用、工具执行、错误处理等所有环节。一次完整的 Agent 运行从用户发消息到最终输出，大致经历以下阶段：1）排队，先进 session 级队列（保证同一会话串行），再进全局队列（控制总并发），防止资源被打满2）准备，解析 workspace、provider/model、thinking level 等基础参数3）插件 + Hook，加载运行时插件后，触发before_model_resolve和before_agent_start钩子，插件可以在模型解析之前动态覆盖 provider 和 model4）模型解析 + 鉴权，根据（可能被 Hook 修改过的）配置确定模型定义、上下文窗口大小，并按优先级选出可用的 API Key5）尝试执行（核心，可重试）：创建或恢复 Session，加载历史消息注册工具集（统一走 customTools 路径，保证沙箱和策略过滤一致性）根据 Provider 设置流式引擎（Ollama 直连、OpenAI WebSocket、通用 HTTP 等）触发执行循环：LLM 调用 → 工具执行 → 结果回传 → 再调 LLM，直到模型认为任务完成6）溢出降级，如果上下文超限：先 compaction 压缩历史 → 再截断超大 tool result → 都不行就报错引导用户开新会话整个流程的设计思路是每个阶段都可插拔。插件通过 Hook 介入、模型和 Provider 可动态切换、工具集按需组合。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;attempt + fallback 容错机制Agent Runner 不是跑一次就完事，容错分两层：1）Auth Profile 轮转：如果一次尝试因为 auth 失败、限流或服务过载挂了，Runner 会自动切到同 Provider 的下一个 API Key 重试。比如配了三个 OpenAI Key，第一个被限流就自动换第二个。&lt;/p&gt;&lt;p&gt;2） 模型级 Fallback：如果所有 Key 都轮完还是失败，Runner 向外层抛出 FailoverError，外层的 model-fallback 层会切到配置的备用模型。比如 Claude 整体不可用就降级到 GPT-4o，用户几乎感知不到切换。重试有上限（根据 profile 数量动态计算，范围 32-160 次），不会无限重试。遇到服务过载还会加指数退避，避免继续打爆上游。工具调用的双层包装每个工具在注册时会经过两层包装：1）Hook 拦截层：插件可以在工具执行前异步检查参数、做权限校验，甚至直接阻止执行。这一层还内置了循环检测，防止 LLM 反复调用同一工具陷入死循环。&lt;/p&gt;&lt;p&gt;2） 取消机制层：把外部的 AbortSignal 和工具自带的信号合并。当用户发了新消息、超时了、或手动停止时，正在执行的工具可以被中断，不用干等到超时。流式处理的 Provider 适配Runner 默认用通用的streamSimple做流式输出，但不同 Provider 的流式 API 差异很大，所以会根据 Provider 类型动态替换流式引擎：Ollama：走原生/api/chat直连，绕过通用路径以获得更可靠的 streaming 和工具调用OpenAI：支持 WebSocket 通道，减少 HTTP 开销Google：额外 Gemini 特有的 thinking 字段所有 Provider 还会统一做工具名称规范化（有些模型输出的工具名带空格或前缀），确保工具分发能精确匹配这层适配做完后，执行循环的代码不用管底下是哪家 Provider，调同一个接口就行。新增 Provider 也只需要写一个流式适配函数。Context 溢出的三级降级执行循环跑着跑着 context 可能会超限，特别是工具返回了大量内容的时候。Runner 对此做了三级自动降级：1）先尝试compaction，调用 Context Engine 压缩历史消息，腾出 token 空间2）compaction 还不够的话，截断超大 tool result。截断策略是动态的：先检测尾部是否包含错误信息或结果摘要，如果尾部重要就保留首尾、砍掉中间；否则只保留开头。截断位置会插入说明提示模型内容被截断了。单个 tool result 最多占上下文窗口的 30%3）前两步都救不回来，报错降级，告诉用户 context 太长了，建议开新会话整个过程对用户透明，尽最大努力保证对话能继续下去。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：你说排队执行保证并发安全，那如果用户快速连发两条消息会怎样？后面那条是排队等还是直接丢弃？回答：后面那条消息会进入 session 级队列排队等，不会丢弃也不会并发执行。设计上是嵌套两级队列：先进 session 队列（保证同 session 串行），再进全局队列（控制总并发）。等前一条消息的 Agent 运行完成后才处理下一条。用户体验上是第二条消息会等一会儿才开始响应。- &lt;strong&gt;提问&lt;/strong&gt;：fallback 机制切换模型之后，之前的对话历史格式兼容吗？不同模型的消息格式不一样怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：历史消息以统一的中间格式存储在 session 文件中。切换模型时用的是同一份 session file，新的 attempt 启动时会根据目标 Provider 的特性做格式适配。比如 Gemini 和 Anthropic 的 turn 交替规则不同、thinking block 处理不同，这些都在 session 历史清洗阶段自动处理。所以 fallback 切换对历史消息是透明的，不需要手动做格式迁移。- &lt;strong&gt;提问&lt;/strong&gt;：工具的 Hook 拦截层会不会引入性能问题？每次工具调用都多走两层包装，延迟能接受吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：两层包装本身的开销可以忽略不计，就是几个函数调用和 Promise 包装，微秒级别。真正可能有性能影响的是 Hook 里的具体逻辑，比如某个插件在 beforeToolCall 里做了一次网络请求做权限校验，那这个延迟是插件自己的问题，不是框架的问题。没注册 Hook 的话，拦截层会直接透传到原始工具函数，几乎零开销。- &lt;strong&gt;提问&lt;/strong&gt;：Context 溢出的时候截断 tool result，截断策略是什么？会不会截掉关键信息？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：截断策略是动态的。它会先检测 tool result 尾部是否包含错误信息、结果摘要或 JSON 闭合结构。如果尾部重要，采用”头+尾”策略保留首尾、砍掉中间并插入省略标记；如果尾部不重要，只保留头部。截断后会追加说明告诉模型内容被截断了，模型可以决定是否需要重新调用工具分段读取。当然会有丢关键信息的风险，这是工程上的折中，总比直接报错中断对话要好。作者：Yes面试鸭官方&lt;/li&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Re Reading SpringAI 实现 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-re_reading_springai_%E5%AE%9E%E7%8E%B0_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-re_reading_springai_%E5%AE%9E%E7%8E%B0_%E6%95%B4%E7%90%86/</guid><description># Re_Reading_SpringAI_实现 ## 问题 Re_Reading_SpringAI_实现 ## 标准回答 # 什么是 Re-Reading？ 如何基于 Spring AI 实现 Re-Reading Advisor？ Re</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Re_Reading_SpringAI_实现&lt;a href=&quot;#re_reading_springai_实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Re_Reading_SpringAI_实现&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是 Re-Reading？&lt;a href=&quot;#什么是-re-reading&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/p&gt;&lt;p&gt;Re-Reading（重读），也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是：对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答。有文献研究证明这是有一定效果的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：这种方法会因重复处理输入导致成本加倍，在面向 C 端开放的应用中需谨慎使用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;基于 Spring AI 的实现步骤&lt;/strong&gt;：
&lt;strong&gt;创建自定义 Advisor 类&lt;/strong&gt;：该类需同时实现 &lt;code&gt;CallAroundAdvisor&lt;/code&gt;（同步请求）和 &lt;code&gt;StreamAroundAdvisor&lt;/code&gt;（流式请求）接口，让该类更通用。
&lt;em&gt;（在 Spring AI 1.0 版本中，上述两个接口需改为 &lt;code&gt;CallAdvisor&lt;/code&gt; 和 &lt;code&gt;StreamAdvisor&lt;/code&gt;）&lt;/em&gt;
&lt;strong&gt;修改用户提示词&lt;/strong&gt;：在 Advisor 的前置处理逻辑中（如 &lt;code&gt;aroundCall&lt;/code&gt; 或 &lt;code&gt;aroundStream&lt;/code&gt; 方法调用之前），对用户的原始输入文本进行改写。改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读。通过看源码能够看到提示词格式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{Input_Query}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Read the question again: {Input_Query}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;{Input_Query}&lt;/code&gt; 是用户原始的提问内容。
&lt;strong&gt;传递给模型&lt;/strong&gt;：将改写后的提示词传递给大语言模型进行处理。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. Re-Reading 的适用场景&lt;a href=&quot;#1-re-reading-的适用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;复杂推理题&lt;/strong&gt;：数学、逻辑、多步骤任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长指令遵循&lt;/strong&gt;：包含多个约束条件的任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易产生歧义的问题&lt;/strong&gt;：通过重读可消除理解偏差&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 成本与收益权衡&lt;a href=&quot;#2-成本与收益权衡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;成本&lt;/strong&gt;：每次请求 token 消耗翻倍（输入翻倍，输出不变）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收益&lt;/strong&gt;：准确率提升 5-15%（取决于模型和任务复杂度）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策&lt;/strong&gt;：对高价值任务（如医疗、金融）可接受；对高并发 C 端场景需谨慎&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 与类似技术的对比&lt;a href=&quot;#3-与类似技术的对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;技术&lt;/th&gt;&lt;th&gt;原理&lt;/th&gt;&lt;th&gt;成本&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Re-Reading&lt;/td&gt;&lt;td&gt;重复输入 + 明确指令&lt;/td&gt;&lt;td&gt;token ×2&lt;/td&gt;&lt;td&gt;复杂推理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chain-of-Thought&lt;/td&gt;&lt;td&gt;中间推理步骤&lt;/td&gt;&lt;td&gt;输出长&lt;/td&gt;&lt;td&gt;数学/逻辑题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-Consistency&lt;/td&gt;&lt;td&gt;多次采样投票&lt;/td&gt;&lt;td&gt;token ×N&lt;/td&gt;&lt;td&gt;高准确率要求&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ReAct&lt;/td&gt;&lt;td&gt;推理+行动循环&lt;/td&gt;&lt;td&gt;多次 LLM 调用&lt;/td&gt;&lt;td&gt;Agent 任务&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：Re-Reading 和简单的“再说一遍”有什么区别？&lt;a href=&quot;#q1re-reading-和简单的再说一遍有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：Re-Reading 不是让用户重复输入，而是在系统层面用明确指令（如“Read the question again:”）引导模型重新审视问题。这种结构化重复比自然语言重复更有效，且可封装为 Advisor 自动应用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：如果模型本身足够强大（如 GPT-4），Re-Reading 还有用吗？&lt;a href=&quot;#q2如果模型本身足够强大如-gpt-4re-reading-还有用吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：有用，但提升幅度较小。研究表明，对复杂推理任务，即使 SOTA 模型也能从 Re-Reading 中获益（3-8% 准确率提升）。对小模型（7B-13B）效果更显著。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：如何避免 Re-Reading 带来的重复计费问题？&lt;a href=&quot;#q3如何避免-re-reading-带来的重复计费问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;选择性启用&lt;/strong&gt;：仅对高复杂度任务启用（如通过分类器判断是否需要）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt 缓存&lt;/strong&gt;：利用 LLM 提供商的 prompt 缓存功能（如 Anthropic、DeepSeek），相同前缀可降低成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型筛选&lt;/strong&gt;：对简单的日常问答跳过 Re-Reading&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：Spring AI 的 Advisor 链中，Re-Reading Advisor 应该放在什么位置？&lt;a href=&quot;#q4spring-ai-的-advisor-链中re-reading-advisor-应该放在什么位置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：建议放在&lt;strong&gt;早期&lt;/strong&gt;，在参数验证、日志等基础 Advisor 之后，但在 RAG 检索、工具调用等业务 Advisor 之前。因为 Re-Reading 仅修改用户输入，不依赖外部数据，提前处理可让后续 Advisor 基于增强后的输入工作。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Re-Reading 是一种简单有效的提示工程技巧，通过结构化重复输入提升模型推理准确率。在 Spring AI 中，实现自定义 Advisor 即可无缝集成。需根据任务复杂度和成本敏感性决定是否启用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Re-Reading？&lt;a href=&quot;#什么是-re-reading-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Re-Reading（重读），也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;核心思想是：对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答。&lt;/li&gt;
&lt;li&gt;有文献研究证明这是有一定效果的。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Re_Reading_SpringAI_实现&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;a href=&quot;#什么是-re-reading如何基于-spring-ai-实现-re-reading-advisor&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Re-Reading（重读），也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是：对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答。有文献研究证明这是有一定效果的。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：这种方法会因重复处理输入导致成本加倍，在面向 C 端开放的应用中需谨慎使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于 Spring AI 的实现步骤&lt;/strong&gt;：
&lt;strong&gt;创建自定义 Advisor 类&lt;/strong&gt;：该类需同时实现 &lt;code&gt;CallAroundAdvisor&lt;/code&gt;（同步请求）和 &lt;code&gt;StreamAroundAdvisor&lt;/code&gt;（流式请求）接口，让该类更通用。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;（在 Spring AI 1.0 版本中，上述两个接口需改为 &lt;code&gt;CallAdvisor&lt;/code&gt; 和 &lt;code&gt;StreamAdvisor&lt;/code&gt;）&lt;/em&gt;
&lt;strong&gt;修改用户提示词&lt;/strong&gt;：在 Advisor 的前置处理逻辑中（如 &lt;code&gt;aroundCall&lt;/code&gt; 或 &lt;code&gt;aroundStream&lt;/code&gt; 方法调用之前），对用户的原始输入文本进行改写。改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读。通过看源码能够看到提示词格式：&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{Input_Query}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Read the question again: {Input_Query}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;{Input_Query}&lt;/code&gt; 是用户原始的提问内容。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Re-Reading（重读），也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是：对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答。有文献研究证明这是有一定效果的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：这种方法会因重复处理输入导致成本加倍，在面向 C 端开放的应用中需谨慎使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于 Spring AI 的实现步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创建自定义 Advisor 类&lt;/strong&gt;：该类需同时实现 &lt;code&gt;CallAroundAdvisor&lt;/code&gt;（同步请求）和 &lt;code&gt;StreamAroundAdvisor&lt;/code&gt;（流式请求）接口，让该类更通用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>React Form Prompt Design 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-react_form_prompt_design_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-react_form_prompt_design_%E6%95%B4%E7%90%86/</guid><description># React_Form_Prompt_Design ## 问题 React_Form_Prompt_Design ## 标准回答 # 设计包含上下文约束的 React 表单组件 Prompt 要让大模型生成能直接使用的 React 表单组</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;React_Form_Prompt_Design&lt;a href=&quot;#react_form_prompt_design&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;React_Form_Prompt_Design&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;设计包含上下文约束的 React 表单组件 Prompt&lt;a href=&quot;#设计包含上下文约束的-react-表单组件-prompt&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;要让大模型生成能直接使用的 React 表单组件，Prompt 必须覆盖四个维度：&lt;strong&gt;字段定义、验证规？
、交互行为、代码规范&lt;/strong&gt;。以下是一个实战级 Prompt 模板：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;字段清单：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 邮箱：必填，标准邮箱格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码：必填，必须和密码字段一致&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 手机号：选填，11 位数字，1 开头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;验证行为：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 每个字段失焦时触发校验，不要边打字边校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误提示红色小字，显示在对应输入框正下方&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码强度用三段式进度条展示（弱/中/强）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码字段只在密码字段有值后才启用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提交逻辑：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 点击提交后按钮变成 loading 状态，显示&quot;提交中...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 请求完成前禁止重复点击&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;代码要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用函数组件 + hooks，不用 class 组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 类型定义单独放一个 types.ts 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 验证规则用 zod schema 定义，不要散落在组件里&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误信息统一放 constants.ts，支持国际化替换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 样式用 Tailwind CSS，响应式适配移动端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出格式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- RegisterForm.tsx（主组件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- types.ts（类型定义）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- schema.ts（zod 验证规则）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- constants.ts（错误信息常量）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 最后给一个使用示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此 Prompt 的关键在于把每个细节写死，AI 没有发挥空间，输出质量稳定。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 为什么用 React Hook Form 而不是受控组件？&lt;a href=&quot;#1-为什么用-react-hook-form-而不是受控组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;受控组件每个字段都要 useState，每次输入触发重渲染。5 个字段的表单打一个字渲染 5 遍。React Hook Form 使用非受控组件（ref），只在提交或校验时收集数据，性能差距可达 10 倍以上。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 验证库选型对比&lt;a href=&quot;#2-验证库选型对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;zod&lt;/th&gt;&lt;th&gt;yup&lt;/th&gt;&lt;th&gt;joi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;包体积&lt;/td&gt;&lt;td&gt;12KB&lt;/td&gt;&lt;td&gt;22KB&lt;/td&gt;&lt;td&gt;140KB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TypeScript 支持&lt;/td&gt;&lt;td&gt;原生完美&lt;/td&gt;&lt;td&gt;需额外配置&lt;/td&gt;&lt;td&gt;较弱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API 风格&lt;/td&gt;&lt;td&gt;链式调用&lt;/td&gt;&lt;td&gt;链式调用&lt;/td&gt;&lt;td&gt;配置对象&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;错误信息定制&lt;/td&gt;&lt;td&gt;简单直接&lt;/td&gt;&lt;td&gt;需额外配置&lt;/td&gt;&lt;td&gt;较麻烦&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;生态整合&lt;/td&gt;&lt;td&gt;React Hook Form 官方推荐&lt;/td&gt;&lt;td&gt;社区主流&lt;/td&gt;&lt;td&gt;Node 端&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;zod 与 TypeScript 配合最好，定义一个 schema 同时得到运行时校验和类型定义。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 写 Prompt 容易忽略的坑&lt;a href=&quot;#3-写-prompt-容易忽略的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;边界情况未提（如用户名前后空格不 trim） → AI 不会处理&lt;/li&gt;
&lt;li&gt;联动关系不明确 → 需单独描述 &lt;code&gt;if userType === &apos;company&apos; then companyName.required = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;一次性生成复杂表单 → 建议分三轮：类型定义+验证 schema → 组件骨架 → 样式优化&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：表单字段多了 Prompt 很长，怎么组织让 AI 不漏东西？&lt;a href=&quot;#q1表单字段多了-prompt-很长怎么组织让-ai-不漏东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：用结构化格式（Markdown 表格或 YAML 缩进），每个字段单独一个 block。末尾加”请确认你理解了所有 N 个字段的要求后再生成代码”，让 AI 先复述需求。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：验证逻辑复杂（字段联动），Prompt 怎么写？&lt;a href=&quot;#q2验证逻辑复杂字段联动prompt-怎么写&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：联动关系单独拎出来写，不要混在字段定义里。用伪代码或流程图表达，如 &lt;code&gt;if userType === &apos;company&apos; then companyName.required = true&lt;/code&gt;。越复杂的逻辑越要明确。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：生成的代码有 bug，怎么通过改 Prompt 来修？&lt;a href=&quot;#q3生成的代码有-bug怎么通过改-prompt-来修&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：把 bug 现象描述清楚喂回去，例如”确认密码字段校验有问题：密码清空后再填确认密码，校验不触发。请修复，确保密码字段变化时重新校验确认密码字段”。实质是将 debug 思路用自然语言表达。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：React Hook Form 和 Formik 推荐哪个？&lt;a href=&quot;#q4react-hook-form-和-formik-推荐哪个&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：新项目选 React Hook Form。性能：非受控组件重渲染少，快 2-3 倍；体积：8KB vs 12KB；API 更简洁。Formik 优势是社区资料多，但已非首选。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;设计包含上下文约束的 React 表单组件 Prompt&lt;a href=&quot;#设计包含上下文约束的-react-表单组件-prompt-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;要让大模型生成能直接使用的 React 表单组件，Prompt 必须覆盖四个维度：&lt;strong&gt;字段定义、验证规则、交互行为、代码规范&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;以下是一个实战级 Prompt 模板：&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 字段清单：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 邮箱：必填，标准邮箱格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码：必填，必须和密码字段一致&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 手机号：选填，11 位数字，1 开头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;验证行为：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 每个字段失焦时触发校验，不要边打字边校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误提示红色小字，显示在对应输入框正下方&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码强度用三段式进度条展示（弱/中/强）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码字段只在密码字段有值后才启用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提交逻辑：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 点击提交后按钮变成 loading 状态，显示&quot;提交中...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 请求完成前禁止重复点击&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;代码要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用函数组件 + hooks，不用 class 组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 类型定义单独放一个 types.ts 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 验证规则用 zod schema 定义，不要散落在组件里&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误信息统一放 constants.ts，支持国际化替换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 样式用 Tailwind CSS，响应式适配移动端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出格式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- RegisterForm.tsx（主组件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- types.ts（类型定义）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- schema.ts（zod 验证规则）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- constants.ts（错误信息常量）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 最后给一个使用示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此 Prompt 的关键在于把每个细节写死，AI 没有发挥空间，输出质量稳定。&lt;/p&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;受控组件每个字段都要 useState，每次输入触发重渲染。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;React_Form_Prompt_Design&lt;/p&gt;&lt;p&gt;要让大模型生成能直接使用的 React 表单组件，Prompt 必须覆盖四个维度：&lt;strong&gt;字段定义、验证规则、交互行为、代码规范&lt;/strong&gt;。以下是一个实战级 Prompt 模板：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 字段清单：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 邮箱：必填，标准邮箱格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码：必填，必须和密码字段一致&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 手机号：选填，11 位数字，1 开头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;验证行为：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 每个字段失焦时触发校验，不要边打字边校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误提示红色小字，显示在对应输入框正下方&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 密码强度用三段式进度条展示（弱/中/强）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 确认密码字段只在密码字段有值后才启用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提交逻辑：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 点击提交后按钮变成 loading 状态，显示&quot;提交中...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 请求完成前禁止重复点击&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;代码要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 用函数组件 + hooks，不用 class 组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 类型定义单独放一个 types.ts 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 验证规则用 zod schema 定义，不要散落在组件里&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 错误信息统一放 constants.ts，支持国际化替换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 样式用 Tailwind CSS，响应式适配移动端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出格式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- RegisterForm.tsx（主组件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- types.ts（类型定义）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- schema.ts（zod 验证规则）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- constants.ts（错误信息常量）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 最后给一个使用示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此 Prompt 的关键在于把每个细节写死，AI 没有发挥空间，输出质量稳定。&lt;/p&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;受控组件每个字段都要 useState，每次输入触发重渲染。5 个字段的表单打一个字渲染 5 遍。React Hook Form 使用非受控组件（ref），只在提交或校验时收集数据，性能差距可达 10 倍以上。&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;2. 验证库选型对比&lt;a href=&quot;#2-验证库选型对比-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;zod&lt;/th&gt;&lt;th&gt;yup&lt;/th&gt;&lt;th&gt;joi&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;包体积&lt;/td&gt;&lt;td&gt;12KB&lt;/td&gt;&lt;td&gt;22KB&lt;/td&gt;&lt;td&gt;140KB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TypeScript 支持&lt;/td&gt;&lt;td&gt;原生完美&lt;/td&gt;&lt;td&gt;需额外配置&lt;/td&gt;&lt;td&gt;较弱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API 风格&lt;/td&gt;&lt;td&gt;链式调用&lt;/td&gt;&lt;td&gt;链式调用&lt;/td&gt;&lt;td&gt;配置对象&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;错误信息定制&lt;/td&gt;&lt;td&gt;简单直接&lt;/td&gt;&lt;td&gt;需额外配置&lt;/td&gt;&lt;td&gt;较麻烦&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;生态整合&lt;/td&gt;&lt;td&gt;React Hook Form 官方推荐&lt;/td&gt;&lt;td&gt;社区主流&lt;/td&gt;&lt;td&gt;Node 端&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;zod 与 TypeScript 配合最好，定义一个 schema 同时得到运行时校验和类型定义。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;、交互行为、代码规范**。以下是一个实战级 Prompt 模板：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;邮箱：必填，标准邮箱格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>ReAct 模式构建自主规划智能体 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-react_%E6%A8%A1%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%87%AA%E4%B8%BB%E8%A7%84%E5%88%92%E6%99%BA%E8%83%BD%E4%BD%93_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-react_%E6%A8%A1%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%87%AA%E4%B8%BB%E8%A7%84%E5%88%92%E6%99%BA%E8%83%BD%E4%BD%93_%E6%95%B4%E7%90%86/</guid><description># ReAct_模式构建自主规划智能体 ## 问题 ReAct_模式构建自主规划智能体 ## 标准回答 # 什么是 ReAct？ 如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？ **ReAct（Reasoning + Ac</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;ReAct_模式构建自主规划智能体&lt;a href=&quot;#react_模式构建自主规划智能体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ReAct_模式构建自主规划智能体&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是 ReAct？&lt;a href=&quot;#什么是-react&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ReAct（Reasoning + Acting）&lt;/strong&gt; 是一种让大语言模型交替进行推理和行动的 Prompt 范式。模型在每一步先“思考”（Reasoning），然后“行动”（Acting），再根据观察结果（Observation）继续思考，形成闭环。这使得 AI 能主动调用工具、获取外部信息，并动态调整计划。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;基于 ReAct 构建自主规划 Agent 的关键步骤&lt;/strong&gt;：
&lt;strong&gt;定义工具集&lt;/strong&gt;：提供模型可调用的外部函数（如搜索、计算器、API）。
&lt;strong&gt;设计 Prompt 格式&lt;/strong&gt;：明确要求模型输出 &lt;code&gt;Thought:&lt;/code&gt;（推理）、&lt;code&gt;Action:&lt;/code&gt;（行动）、&lt;code&gt;Observation:&lt;/code&gt;（观察）的结构。
&lt;strong&gt;解析与执行&lt;/strong&gt;：应用层解析 &lt;code&gt;Action:&lt;/code&gt; 字段，执行对应工具，将结果填入 &lt;code&gt;Observation:&lt;/code&gt;。
&lt;strong&gt;循环迭代&lt;/strong&gt;：重复上述过程，直到模型输出 &lt;code&gt;Final Answer:&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例 Prompt 结构&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一个能使用工具的智能体。你有以下工具：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- search(query): 搜索互联网&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- calculate(expression): 计算数学表达式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请按以下格式回答：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Thought: 你的思考过程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Action: 工具名称(参数)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Observation: 工具返回结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...（重复）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Final Answer: 最终答案&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. ReAct 与 CoT 的区别&lt;a href=&quot;#1-react-与-cot-的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CoT（Chain of Thought）&lt;/strong&gt;：仅推理，不执行动作，适合数学逻辑题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ReAct&lt;/strong&gt;：推理 + 行动，通过外部反馈修正推理，适合需要实时信息或工具操作的任务。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 常见框架实现&lt;a href=&quot;#2-常见框架实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：&lt;code&gt;AgentExecutor&lt;/code&gt; + &lt;code&gt;ReActDocstoreAgent&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring AI&lt;/strong&gt;：&lt;code&gt;ChatClient&lt;/code&gt; + &lt;code&gt;@Tool&lt;/code&gt; 注解 + &lt;code&gt;Advisor&lt;/code&gt; 自定义输出解析。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoGen&lt;/strong&gt;：多 Agent 协作中的 ReAct 模式。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 优化技巧&lt;a href=&quot;#3-优化技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;限制最大循环次数&lt;/strong&gt;：防止死循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误恢复&lt;/strong&gt;：当工具调用失败时，将错误信息作为 &lt;code&gt;Observation&lt;/code&gt; 让模型自己修正。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;思维链压缩&lt;/strong&gt;：对历史 &lt;code&gt;Thought&lt;/code&gt; 进行摘要，避免上下文超限。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：ReAct 模式会显著增加 token 消耗，如何优化？&lt;a href=&quot;#q1react-模式会显著增加-token-消耗如何优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：① 使用更精简的 Prompt 模板（如只要求输出 &lt;code&gt;Action&lt;/code&gt; 和 &lt;code&gt;Observation&lt;/code&gt;，隐藏 &lt;code&gt;Thought&lt;/code&gt;）。② 对历史观察结果进行摘要。③ 设置最大循环次数，及时终止。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：ReAct 与 Plan-and-Solve 模式有何不同？&lt;a href=&quot;#q2react-与-plan-and-solve-模式有何不同&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：ReAct 是逐步决策，每次根据最新观察调整下一步；Plan-and-Solve 先生成完整计划再执行，灵活性较低，但 token 消耗更少。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：如何防止模型在 ReAct 中编造不存在的工具？&lt;a href=&quot;#q3如何防止模型在-react-中编造不存在的工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：在 System Prompt 中明确列出可用工具，并强调“只能使用上述工具，不要编造”。应用层严格校验 &lt;code&gt;Action&lt;/code&gt; 字段，只执行白名单内的工具。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ReAct 让 LLM 具备自主规划与工具使用能力，是构建智能 Agent 的核心模式之一。通过结构化的 Thought-Action-Observation 循环，模型能动态适应环境变化，解决复杂任务。实现时需注意工具集设计、循环控制与错误处理。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 ReAct？&lt;a href=&quot;#什么是-react-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;ReAct（Reasoning + Acting）&lt;/strong&gt; 是一种让大语言模型交替进行推理和行动的 Prompt 范式。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模型在每一步先“思考”（Reasoning），然后“行动”（Acting），再根据观察结果（Observation）继续思考，形成闭环。&lt;/li&gt;
&lt;li&gt;这使得 AI 能主动调用工具、获取外部信息，并动态调整计划。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;ReAct_模式构建自主规划智能体&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是 ReAct？如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？&lt;a href=&quot;#什么是-react如何基于-react-模式构建具备自主规划能力的-ai-智能体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;ReAct（Reasoning + Acting）&lt;/strong&gt; 是一种让大语言模型交替进行推理和行动的 Prompt 范式。模型在每一步先“思考”（Reasoning），然后“行动”（Acting），再根据观察结果（Observation）继续思考，形成闭环。这使得 AI 能主动调用工具、获取外部信息，并动态调整计划。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于 ReAct 构建自主规划 Agent 的关键步骤&lt;/strong&gt;：
&lt;strong&gt;定义工具集&lt;/strong&gt;：提供模型可调用的外部函数（如搜索、计算器、API）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设计 Prompt 格式&lt;/strong&gt;：明确要求模型输出 &lt;code&gt;Thought:&lt;/code&gt;（推理）、&lt;code&gt;Action:&lt;/code&gt;（行动）、&lt;code&gt;Observation:&lt;/code&gt;（观察）的结构。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;解析与执行&lt;/strong&gt;：应用层解析 &lt;code&gt;Action:&lt;/code&gt; 字段，执行对应工具，将结果填入 &lt;code&gt;Observation:&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ReAct（Reasoning + Acting）&lt;/strong&gt; 是一种让大语言模型交替进行推理和行动的 Prompt 范式。模型在每一步先“思考”（Reasoning），然后“行动”（Acting），再根据观察结果（Observation）继续思考，形成闭环。这使得 AI 能主动调用工具、获取外部信息，并动态调整计划。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于 ReAct 构建自主规划 Agent 的关键步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义工具集&lt;/strong&gt;：提供模型可调用的外部函数（如搜索、计算器、API）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设计 Prompt 格式&lt;/strong&gt;：明确要求模型输出 &lt;code&gt;Thought:&lt;/code&gt;（推理）、&lt;code&gt;Action:&lt;/code&gt;（行动）、&lt;code&gt;Observation:&lt;/code&gt;（观察）的结构。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Spring AI Modular RAG Architecture 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-spring_ai_modular_rag_architecture_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-spring_ai_modular_rag_architecture_%E6%95%B4%E7%90%86/</guid><description># Spring_AI_Modular_RAG_Architecture ## 问题 Spring_AI_Modular_RAG_Architecture ## 标准回答 # Spring AI 模块化 RAG 架构：预检索、检索、后检索三</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Spring_AI_Modular_RAG_Architecture&lt;a href=&quot;#spring_ai_modular_rag_architecture&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Spring_AI_Modular_RAG_Architecture&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Spring AI 模块化 RAG 架构：预检索、检索、后检索三阶段&lt;a href=&quot;#spring-ai-模块化-rag-架构预检索检索后检索三阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Spring AI 提出的模块？
RAG 架构将检索增强生成过程分解为 &lt;strong&gt;预检索 (Pre-Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索 (Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索后 (Post-Retrieval)&lt;/strong&gt; 三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;阶段&lt;/th&gt;&lt;th&gt;职责&lt;/th&gt;&lt;th&gt;核心组件&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;预检索&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;接收原始查询，优化和转换，生成更适合检索的查询版本&lt;/td&gt;&lt;td&gt;QueryTransformer：&lt;code&gt;RewriteQueryTransformer&lt;/code&gt;（改写）、&lt;code&gt;TranslationQueryTransformer&lt;/code&gt;（翻译）、&lt;code&gt;CompressionQueryTransformer&lt;/code&gt;（压缩历史）、&lt;code&gt;MultiQueryExpander&lt;/code&gt;（扩展为多查询提高召回）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;检索&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;使用优化后的查询，从知识库中搜索并召回最相关的文档片段&lt;/td&gt;&lt;td&gt;&lt;code&gt;DocumentRetriever&lt;/code&gt;（如 &lt;code&gt;VectorStoreDocumentRetriever&lt;/code&gt;），负责相似性搜索和元数据过滤；多源检索时使用 &lt;code&gt;DocumentJoiner&lt;/code&gt; 合并结果&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;检索后&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;对检索到的文档集进一步处理和优化，筛选最适合作为上下文的文档&lt;/td&gt;&lt;td&gt;文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供 &lt;code&gt;DocumentPostProcessor&lt;/code&gt; API 支持自定义后处理（目前尚不成熟）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 为什么需要模块化 RAG？&lt;a href=&quot;#1-为什么需要模块化-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;灵活性&lt;/strong&gt;：不同场景（如问答、摘要、代码生成）需要不同的检索策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可维护性&lt;/strong&gt;：各阶段独立演进，替换组件不影响整体流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：可针对瓶颈阶段单独调优（如预检索阶段增加查询改写，提升召回率）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 各阶段的典型实现&lt;a href=&quot;#2-各阶段的典型实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预检索&lt;/strong&gt;：在多轮对话中，使用 &lt;code&gt;CompressionQueryTransformer&lt;/code&gt; 将历史对话压缩与当前问题合并，避免上下文爆炸&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索&lt;/strong&gt;：向量检索 + 关键词检索混合（Hybrid Search），提升召回和精度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索后&lt;/strong&gt;：使用 &lt;code&gt;Cohere Rerank&lt;/code&gt; 或 &lt;code&gt;Cross-Encoder&lt;/code&gt; 模型对召回文档重排序，将最相关的放在前面&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 与传统 RAG 的区别&lt;a href=&quot;#3-与传统-rag-的区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;传统 RAG 通常只包含“检索”和“生成”两步，查询优化和后处理硬编码或缺失。模块化 RAG 将每一步都暴露为可插拔组件，开发者可按需组合。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：预检索阶段的查询改写和扩展，会不会引入噪音？如何控制？&lt;a href=&quot;#q1预检索阶段的查询改写和扩展会不会引入噪音如何控制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：可能。例如将单查询扩展为多个查询，可能召回不相关文档。控制方法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;限制扩展数量（如最多 3 个变体）&lt;/li&gt;
&lt;li&gt;使用相似度阈值过滤低相关性结果&lt;/li&gt;
&lt;li&gt;在检索后阶段用重排序模型降噪&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：检索阶段如果同时使用向量检索和关键词检索，结果如何合并？&lt;a href=&quot;#q2检索阶段如果同时使用向量检索和关键词检索结果如何合并&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：使用 &lt;code&gt;DocumentJoiner&lt;/code&gt;，常见策略：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加权合并&lt;/strong&gt;：向量和关键词得分加权平均&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;互惠排名融合&lt;/strong&gt;：根据排名位置融合，避免分数尺度问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分集合并&lt;/strong&gt;：交替取出结果，保证多样性&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：检索后阶段的文档压缩/摘要，会不会丢失关键信息？&lt;a href=&quot;#q3检索后阶段的文档压缩摘要会不会丢失关键信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：会。但这是权衡 token 成本和信息完整性的必要手段。优化方法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提取式摘要&lt;/strong&gt;：保留原文中的关键句子，而非生成式摘要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分块压缩&lt;/strong&gt;：对长文档按段落压缩，保留每段核心&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要性评分&lt;/strong&gt;：只压缩低重要性片段&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：Spring AI 的模块化 RAG 与 LangChain 的 LCEL 有什么异同？&lt;a href=&quot;#q4spring-ai-的模块化-rag-与-langchain-的-lcel-有什么异同&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;相同：都支持链式组合和组件化&lt;/li&gt;
&lt;li&gt;不同：Spring AI 更强调阶段划分（预、检、后），并提供了官方 QueryTransformer 实现；LangChain 更灵活但需要开发者自行组装。Spring AI 与 Spring 生态集成更好（如结合 Spring Boot 配置）。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Spring AI 的模块化 RAG 架构通过将流程拆分为预检索、检索、后检索三个阶段，提供了高度的灵活性和可扩展性。开发者可根据业务需求替换或定制每个阶段的组件（如查询改写器、检索器、后处理器），实现更精准的检索增强生成。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;Spring AI 模块化 RAG 架构：预检索、检索、后检索三阶段&lt;a href=&quot;#spring-ai-模块化-rag-架构预检索检索后检索三阶段-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Spring AI 提出的模块化 RAG 架构将检索增强生成过程分解为 &lt;strong&gt;预检索 (Pre-Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索 (Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索后 (Post-Retrieval)&lt;/strong&gt; 三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;| 阶段 | 职责 | 核心组件 |
|------|------|----------|
| &lt;strong&gt;预检索&lt;/strong&gt; | 接收原始查询，优化和转换，生成更适合检索的查询版本 | QueryTransformer：&lt;code&gt;RewriteQueryTransformer&lt;/code&gt;（改写）、&lt;code&gt;TranslationQueryTransformer&lt;/code&gt;（翻译）、&lt;code&gt;CompressionQueryTransformer&lt;/code&gt;（压缩历史）、&lt;code&gt;MultiQueryExpander&lt;/code&gt;（扩展为多查询提高召回） |
| &lt;strong&gt;检索&lt;/strong&gt; | 使用优化后的查询，从知识库中搜索并召回最相关的文档片段 | &lt;code&gt;DocumentRetriever&lt;/code&gt;（如 &lt;code&gt;VectorStoreDocumentRetriever&lt;/code&gt;），负责相似性搜索和元数据过滤；多源检索时使用 &lt;code&gt;DocumentJoiner&lt;/code&gt; 合并结果 |
| &lt;strong&gt;检索后&lt;/strong&gt; | 对检索到的文档集进一步处理和优化，筛选最适合作为上下文的文档 | 文档重排序、无关文档移除、文档内容压缩或摘要等。&lt;/li&gt;
&lt;li&gt;Spring AI 提供 &lt;code&gt;DocumentPostProcessor&lt;/code&gt; API 支持自定义后处理（目前尚不成熟） |&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;灵活性&lt;/strong&gt;：不同场景（如问答、摘要、代码生成）需要不同的检索策略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可维护性&lt;/strong&gt;：各阶段独立演进，替换组件不影响整体流程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：可针对瓶颈阶段单独调优（如预检索阶段增加查询改写，提升召回率）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预检索&lt;/strong&gt;：在多轮对话中，使用 &lt;code&gt;CompressionQueryTransformer&lt;/code&gt; 将历史对话压缩与当前问题合并，避免上下文爆炸&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索&lt;/strong&gt;：向量检索 + 关键词检索混合（Hybrid Search），提升召回和精度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索后&lt;/strong&gt;：使用 &lt;code&gt;Cohere Rerank&lt;/code&gt; 或 &lt;code&gt;Cross-Encoder&lt;/code&gt; 模型对召回文档重排序，将最相关的放在前面&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;传统 RAG 通常只包含“检索”和“生成”两步，查询优化和后处理硬编码或缺失。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模块化 RAG 将每一步都暴露为可插拔组件，开发者可按需组合。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Spring_AI_Modular_RAG_Architecture&lt;/p&gt;&lt;p&gt;Spring AI 提出的模块化 RAG 架构将检索增强生成过程分解为 &lt;strong&gt;预检索 (Pre-Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索 (Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索后 (Post-Retrieval)&lt;/strong&gt; 三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;| 阶段 | 职责 | 核心组件 |
|------|------|----------|
| &lt;strong&gt;预检索&lt;/strong&gt; | 接收原始查询，优化和转换，生成更适合检索的查询版本 | QueryTransformer：&lt;code&gt;RewriteQueryTransformer&lt;/code&gt;（改写）、&lt;code&gt;TranslationQueryTransformer&lt;/code&gt;（翻译）、&lt;code&gt;CompressionQueryTransformer&lt;/code&gt;（压缩历史）、&lt;code&gt;MultiQueryExpander&lt;/code&gt;（扩展为多查询提高召回） |
| &lt;strong&gt;检索&lt;/strong&gt; | 使用优化后的查询，从知识库中搜索并召回最相关的文档片段 | &lt;code&gt;DocumentRetriever&lt;/code&gt;（如 &lt;code&gt;VectorStoreDocumentRetriever&lt;/code&gt;），负责相似性搜索和元数据过滤；多源检索时使用 &lt;code&gt;DocumentJoiner&lt;/code&gt; 合并结果 |
| &lt;strong&gt;检索后&lt;/strong&gt; | 对检索到的文档集进一步处理和优化，筛选最适合作为上下文的文档 | 文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供 &lt;code&gt;DocumentPostProcessor&lt;/code&gt; API 支持自定义后处理（目前尚不成熟） |&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;灵活性&lt;/strong&gt;：不同场景（如问答、摘要、代码生成）需要不同的检索策略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可维护性&lt;/strong&gt;：各阶段独立演进，替换组件不影响整体流程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：可针对瓶颈阶段单独调优（如预检索阶段增加查询改写，提升召回率）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预检索&lt;/strong&gt;：在多轮对话中，使用 &lt;code&gt;CompressionQueryTransformer&lt;/code&gt; 将历史对话压缩与当前问题合并，避免上下文爆炸&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索&lt;/strong&gt;：向量检索 + 关键词检索混合（Hybrid Search），提升召回和精度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索后&lt;/strong&gt;：使用 &lt;code&gt;Cohere Rerank&lt;/code&gt; 或 &lt;code&gt;Cross-Encoder&lt;/code&gt; 模型对召回文档重排序，将最相关的放在前面&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;传统 RAG 通常只包含“检索”和“生成”两步，查询优化和后处理硬编码或缺失。模块化 RAG 将每一步都暴露为可插拔组件，开发者可按需组合。&lt;/p&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：可能。例如将单查询扩展为多个查询，可能召回不相关文档。控制方法：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;限制扩展数量（如最多 3 个变体）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用相似度阈值过滤低相关性结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在检索后阶段用重排序模型降噪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAG 架构将检索增强生成过程分解为 &lt;strong&gt;预检索 (Pre-Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索 (Retrieval)&lt;/strong&gt;、&lt;strong&gt;检索后 (Post-Retrieval)&lt;/strong&gt; 三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| 阶段 | 职责 | 核心组件 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;|------|------|----------|&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| &lt;strong&gt;预检索&lt;/strong&gt; | 接收原始查询，优化和转换，生成更适合检索的查询版本 | QueryTransformer：&lt;code&gt;RewriteQueryTransformer&lt;/code&gt;（改写）、&lt;code&gt;TranslationQueryTransformer&lt;/code&gt;（翻译）、&lt;code&gt;CompressionQueryTransformer&lt;/code&gt;（压缩历史）、&lt;code&gt;MultiQueryExpander&lt;/code&gt;（扩展为多查询提高召回） |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| &lt;strong&gt;检索&lt;/strong&gt; | 使用优化后的查询，从知识库中搜索并召回最相关的文档片段 | &lt;code&gt;DocumentRetriever&lt;/code&gt;（如 &lt;code&gt;VectorStoreDocumentRetriever&lt;/code&gt;），负责相似性搜索和元数据过滤；多源检索时使用 &lt;code&gt;DocumentJoiner&lt;/code&gt; 合并结果 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>SpringAI SuperAgent 应用与特性 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-springai_superagent_%E5%BA%94%E7%94%A8%E4%B8%8E%E7%89%B9%E6%80%A7_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-springai_superagent_%E5%BA%94%E7%94%A8%E4%B8%8E%E7%89%B9%E6%80%A7_%E6%95%B4%E7%90%86/</guid><description># SpringAI_SuperAgent_应用与特性 ## 问题 SpringAI_SuperAgent_应用与特性 ## 标准回答 # 你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？ 用到了哪些特性？ ## 标准回</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;SpringAI_SuperAgent_应用与特性&lt;a href=&quot;#springai_superagent_应用与特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SpringAI_SuperAgent_应用与特性&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？&lt;a href=&quot;#你在-ai-超级智能体项目中如何利用-spring-ai-开发应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;用到了哪些特性？&lt;/p&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 AI 超级智能体项目中，Spring AI 提供了构建模块化、可扩展 Agent 的核心能力，主要用到以下特性：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ChatClient 与工具调用&lt;/strong&gt;：通过 &lt;code&gt;@Tool&lt;/code&gt; 注解将业务能力（搜索、数据库查询等）暴露给 LLM，实现 ReAct 循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advisor 链&lt;/strong&gt;：在请求前后插入自定义逻辑，如日志、限流、记忆加载、内容安全过滤。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAG 支持&lt;/strong&gt;：利用 &lt;code&gt;RetrievalAugmentationAdvisor&lt;/code&gt; 集成向量存储，实现知识库增强生成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模型抽象&lt;/strong&gt;：统一接口支持 OpenAI、Ollama、Claude 等，便于切换或混合调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function Calling 与 Stream&lt;/strong&gt;：支持流式输出与并行工具调用，提升响应速度。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;典型架构&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Controller&lt;/strong&gt;：接收用户请求，调用 &lt;code&gt;ChatClient&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service + @Tool&lt;/strong&gt;：封装内部 API 或第三方服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory Advisor&lt;/strong&gt;：加载长期记忆并写回。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt;：集成 Micrometer 追踪 Token 消耗与调用链。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 高级特性使用场景&lt;a href=&quot;#1-高级特性使用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多模态输入&lt;/strong&gt;：通过 &lt;code&gt;ChatClient&lt;/code&gt; 支持图片+文本混合 prompt。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化输出&lt;/strong&gt;：利用 &lt;code&gt;BeanOutputConverter&lt;/code&gt; 强制模型返回 JSON 对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态工具选择&lt;/strong&gt;：根据用户意图通过 &lt;code&gt;PromptRequest&lt;/code&gt; 动态注册工具集。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 性能优化实践&lt;a href=&quot;#2-性能优化实践&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;：对常用 RAG 结果启用 Caffeine 本地缓存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批处理&lt;/strong&gt;：多个工具调用合并为一次 &lt;code&gt;ChatClient&lt;/code&gt; 请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超时与重试&lt;/strong&gt;：配置 &lt;code&gt;RetryTemplate&lt;/code&gt; 应对模型 API 不稳定。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：如何保证 Super Agent 的长期记忆不膨胀？&lt;a href=&quot;#q1如何保证-super-agent-的长期记忆不膨胀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：采用分层记忆：短期滑动窗口 + 长期向量检索。每晚让 Agent 自我总结，将重要事实写入长期库，丢弃临时细节。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：如何处理工具调用中的依赖关系（如先搜索后计算）？&lt;a href=&quot;#q2如何处理工具调用中的依赖关系如先搜索后计算&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：在 Prompt 中明确任务步骤，或使用 &lt;code&gt;SequentialToolExecutor&lt;/code&gt; 编排。Spring AI 本身不强制顺序，但可通过 &lt;code&gt;Advice&lt;/code&gt; 实现自定义编排器。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：Spring AI 与 LangChain 相比有何优劣？&lt;a href=&quot;#q3spring-ai-与-langchain-相比有何优劣&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：Spring AI 与 Spring Boot 生态无缝集成，适合 Java 技术栈企业；LangChain 生态更丰富，但 Python 依赖较重。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？&lt;a href=&quot;#你在-ai-超级智能体项目中如何利用-spring-ai-开发应用-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;用到了哪些特性？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 AI 超级智能体项目中，Spring AI 提供了构建模块化、可扩展 Agent 的核心能力，主要用到以下特性：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ChatClient 与工具调用&lt;/strong&gt;：通过 &lt;code&gt;@Tool&lt;/code&gt; 注解将业务能力（搜索、数据库查询等）暴露给 LLM，实现 ReAct 循环。&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advisor 链&lt;/strong&gt;：在请求前后插入自定义逻辑，如日志、限流、记忆加载、内容安全过滤。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RAG 支持&lt;/strong&gt;：利用 &lt;code&gt;RetrievalAugmentationAdvisor&lt;/code&gt; 集成向量存储，实现知识库增强生成。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;SpringAI_SuperAgent_应用与特性&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？用到了哪些特性？&lt;a href=&quot;#你在-ai-超级智能体项目中如何利用-spring-ai-开发应用用到了哪些特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 AI 超级智能体项目中，Spring AI 提供了构建模块化、可扩展 Agent 的核心能力，主要用到以下特性：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ChatClient 与工具调用&lt;/strong&gt;：通过 &lt;code&gt;@Tool&lt;/code&gt; 注解将业务能力（搜索、数据库查询等）暴露给 LLM，实现 ReAct 循环。&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advisor 链&lt;/strong&gt;：在请求前后插入自定义逻辑，如日志、限流、记忆加载、内容安全过滤。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RAG 支持&lt;/strong&gt;：利用 &lt;code&gt;RetrievalAugmentationAdvisor&lt;/code&gt; 集成向量存储，实现知识库增强生成。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多模型抽象&lt;/strong&gt;：统一接口支持 OpenAI、Ollama、Claude 等，便于切换或混合调用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 AI 超级智能体项目中，Spring AI 提供了构建模块化、可扩展 Agent 的核心能力，主要用到以下特性：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ChatClient 与工具调用&lt;/strong&gt;：通过 &lt;code&gt;@Tool&lt;/code&gt; 注解将业务能力（搜索、数据库查询等）暴露给 LLM，实现 ReAct 循环。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advisor 链&lt;/strong&gt;：在请求前后插入自定义逻辑，如日志、限流、记忆加载、内容安全过滤。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RAG 支持&lt;/strong&gt;：利用 &lt;code&gt;RetrievalAugmentationAdvisor&lt;/code&gt; 集成向量存储，实现知识库增强生成。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多模型抽象&lt;/strong&gt;：统一接口支持 OpenAI、Ollama、Claude 等，便于切换或混合调用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>System Prompt Agent职责与长Prompt处理 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-system_prompt_agent%E8%81%8C%E8%B4%A3%E4%B8%8E%E9%95%BFprompt%E5%A4%84%E7%90%86_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-system_prompt_agent%E8%81%8C%E8%B4%A3%E4%B8%8E%E9%95%BFprompt%E5%A4%84%E7%90%86_%E6%95%B4%E7%90%86/</guid><description># System_Prompt_Agent职责与长Prompt处理 ## 问题 System_Prompt_Agent职责与长Prompt处理 ## 标准回答 # System Prompt 在 Agent 系统中的职责与长 Prompt </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;System_Prompt_Agent职责与长Prompt处理&lt;a href=&quot;#system_prompt_agent职责与长prompt处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;System_Prompt_Agent职责与长Prompt处理&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;System Prompt 在 Agent 系统中的职责与长 Prompt 处理策略&lt;a href=&quot;#system-prompt-在-agent-系统中的职责与长-prompt-处理策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;System Prompt 是？
Agent 的“操作系统”，承载了所有行为的底层规则。在 Agent 系统中，其职责可归为五类：
&lt;strong&gt;角色定义和行为准则&lt;/strong&gt;：告诉模型“你是谁”（编程助手、客服等），并约束语气、风格和边界。
&lt;strong&gt;工具使用规范和约束&lt;/strong&gt;：告知有哪些工具可用、如何调用、何时使用。
&lt;strong&gt;输出格式要求&lt;/strong&gt;：规定回复格式（JSON、Markdown、消息标签等）。
&lt;strong&gt;安全与权限控制&lt;/strong&gt;：设定禁止行为（危险命令、信息泄露等），划清红线。
&lt;strong&gt;上下文信息补充&lt;/strong&gt;：提供当前运行环境（工作目录、时间、用户身份、技能清单等）。&lt;/p&gt;&lt;p&gt;当 System Prompt 越来越长时，处理策略为 &lt;strong&gt;“拆、选、扔”&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拆&lt;/strong&gt;：按职责拆分为独立模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选&lt;/strong&gt;：根据当前任务场景只注入相关模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扔&lt;/strong&gt;：将稳定不变的知识移出 prompt，放入外部文件或知识库，按需读取。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 模块化组装方案（以 OpenClaw 为例）&lt;a href=&quot;#1-模块化组装方案以-openclaw-为例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;OpenClaw 将 System Prompt 拆为三层：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基础层（每次必加）&lt;/strong&gt;：身份声明、安全红线、工具列表及调用规范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;场景层（按需加载）&lt;/strong&gt;：技能提示、记忆召回、消息路由、语音合成等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态层（每次生成）&lt;/strong&gt;：当前时间、工作目录、用户白名单、沙箱信息等。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;同时支持 &lt;strong&gt;分级加载&lt;/strong&gt;：通过 &lt;code&gt;promptMode&lt;/code&gt; 参数控制加载级别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;完整模式：主 Agent 使用。&lt;/li&gt;
&lt;li&gt;精简模式：子 Agent 使用（仅核心模块）。&lt;/li&gt;
&lt;li&gt;最小模式：仅身份声明。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 插件化扩展机制&lt;a href=&quot;#2-插件化扩展机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过钩子（Hook）在 System Prompt 拼装前注入内容。插件有四种注入方式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;替换系统提示（覆盖全部）&lt;/li&gt;
&lt;li&gt;头部追加（适合静态指令，可缓存）&lt;/li&gt;
&lt;li&gt;尾部追加（同样可缓存）&lt;/li&gt;
&lt;li&gt;对话层注入（动态上下文，每轮变化）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;优先级机制（&lt;code&gt;priority&lt;/code&gt; 数值）解决冲突：高优先级覆盖低优先级的 &lt;code&gt;systemPrompt&lt;/code&gt; 字段；拼接型字段按优先级顺序拼接。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 长 System Prompt 的性能影响&lt;a href=&quot;#3-长-system-prompt-的性能影响&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token 消耗与延迟&lt;/strong&gt;：Prompt 越长，每次请求成本越高。按需加载可显著降低子 Agent 的开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Cache&lt;/strong&gt;：LLM 提供商（如 Anthropic、OpenAI）支持对不变部分缓存，第二次请求不重复计费。因此将稳定内容放在系统提示层（头部/尾部追加）有利于缓存命中。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 业界其他方案对比&lt;a href=&quot;#4-业界其他方案对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cursor&lt;/strong&gt;：全量加载极长 System Prompt，依赖模型长上下文能力，适合场景单一的应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devin&lt;/strong&gt;：将规则编码为代码逻辑，灵活性较低但减少 prompt 依赖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LangChain&lt;/strong&gt;：模板化组装，Callbacks 偏向观测，prompt 注入灵活度不如 OpenClaw 的四字段钩子。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？&lt;a href=&quot;#q1system-prompt-里的安全规则真的靠谱吗用户通过-prompt-injection-绕过去怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：纯靠 System Prompt 不够。必须在代码层面做硬校验：路径白名单、危险命令拦截等。OpenClaw 采用分层防御：System Prompt 中的安全模块作为第一道防线，工具执行层的 &lt;code&gt;before_tool_call&lt;/code&gt; 钩子和审批机制提供真正保障。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：模块拼接顺序会影响模型行为吗？&lt;a href=&quot;#q2模块拼接顺序会影响模型行为吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：会。模型对开头和结尾关注度更高。OpenClaw 的固定顺序为：Identity → Tooling → Safety（最前面），Skills → Memory（中间），Runtime 信息（最后），符合“重要内容靠前”原则。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：按需读取外部文件不也消耗 token 吗？如何判断何时放 prompt 里、何时放外部？&lt;a href=&quot;#q3按需读取外部文件不也消耗-token-吗如何判断何时放-prompt-里何时放外部&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：判断标准：&lt;strong&gt;频率&lt;/strong&gt;和&lt;strong&gt;体积&lt;/strong&gt;。每次请求都需要的信息放 prompt 里，偶尔用到的放外部；体积小（&amp;lt;500 token）可直接放，体积大且使用频率低于 30% 时放外部更经济。OpenClaw 的 Skills 模块正是此思路：prompt 中只放技能目录，需要时再读取完整 &lt;code&gt;SKILL.md&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：多个插件通过钩子注入 System Prompt 时如何解决冲突？&lt;a href=&quot;#q4多个插件通过钩子注入-system-prompt-时如何解决冲突&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：通过优先级机制。&lt;code&gt;priority&lt;/code&gt; 数值越大越先执行。对于 &lt;code&gt;systemPrompt&lt;/code&gt; 字段，后执行的覆盖先执行的（高优先级覆盖低优先级）；对于 &lt;code&gt;prependContext&lt;/code&gt;、&lt;code&gt;appendSystemContext&lt;/code&gt; 等拼接字段，按优先级顺序依次拼接，不覆盖。开发者如需覆盖核心 prompt，应设高优先级并使用 &lt;code&gt;systemPrompt&lt;/code&gt; 字段；若仅追加内容，用拼接字段避免冲突。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;System Prompt 在 Agent 系统中的职责与长 Prompt 处理策略&lt;a href=&quot;#system-prompt-在-agent-系统中的职责与长-prompt-处理策略-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System Prompt 是 Agent 的“操作系统”，承载了所有行为的底层规则。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在 Agent 系统中，其职责可归为五类：
&lt;strong&gt;角色定义和行为准则&lt;/strong&gt;：告诉模型“你是谁”（编程助手、客服等），并约束语气、风格和边界。&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;工具使用规范和约束&lt;/strong&gt;：告知有哪些工具可用、如何调用、何时使用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输出格式要求&lt;/strong&gt;：规定回复格式（JSON、Markdown、消息标签等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安全与权限控制&lt;/strong&gt;：设定禁止行为（危险命令、信息泄露等），划清红线。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System_Prompt_Agent职责与长Prompt处理&lt;/p&gt;&lt;p&gt;System Prompt 是 Agent 的“操作系统”，承载了所有行为的底层规则。在 Agent 系统中，其职责可归为五类：
&lt;strong&gt;角色定义和行为准则&lt;/strong&gt;：告诉模型“你是谁”（编程助手、客服等），并约束语气、风格和边界。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2. &lt;strong&gt;工具使用规范和约束&lt;/strong&gt;：告知有哪些工具可用、如何调用、何时使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输出格式要求&lt;/strong&gt;：规定回复格式（JSON、Markdown、消息标签等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安全与权限控制&lt;/strong&gt;：设定禁止行为（危险命令、信息泄露等），划清红线。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;上下文信息补充&lt;/strong&gt;：提供当前运行环境（工作目录、时间、用户身份、技能清单等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent 的“操作系统”，承载了所有行为的底层规则。在 Agent 系统中，其职责可归为五类：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;角色定义和行为准则&lt;/strong&gt;：告诉模型“你是谁”（编程助手、客服等），并约束语气、风格和边界。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;工具使用规范和约束&lt;/strong&gt;：告知有哪些工具可用、如何调用、何时使用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输出格式要求&lt;/strong&gt;：规定回复格式（JSON、Markdown、消息标签等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安全与权限控制&lt;/strong&gt;：设定禁止行为（危险命令、信息泄露等），划清红线。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-system-prompt-%E5%9C%A8-agent-%E7%B3%BB%E7%BB%9F%E4%B8%AD%E6%89%BF%E8%BD%BD%E4%BA%86%E5%93%AA%E4%BA%9B%E8%81%8C%E8%B4%A3-%E5%A6%82%E6%9E%9C-system-prompt-%E8%B6%8A%E6%9D%A5%E8%B6%8A%E9%95%BF-%E4%BD%A0%E4%BC%9A%E6%80%8E%E4%B9%88%E5%A4%84%E7%90%86-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-system-prompt-%E5%9C%A8-agent-%E7%B3%BB%E7%BB%9F%E4%B8%AD%E6%89%BF%E8%BD%BD%E4%BA%86%E5%93%AA%E4%BA%9B%E8%81%8C%E8%B4%A3-%E5%A6%82%E6%9E%9C-system-prompt-%E8%B6%8A%E6%9D%A5%E8%B6%8A%E9%95%BF-%E4%BD%A0%E4%BC%9A%E6%80%8E%E4%B9%88%E5%A4%84%E7%90%86-_%E6%95%B4%E7%90%86/</guid><description># System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？ ## 问题 System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;a href=&quot;#system-prompt-在-agent-系统中承载了哪些职责如果-system-prompt-越来越长你会怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。简单理解：每次你跟 ChatGPT、Cursor 这类 AI 工具对话时，你看到的只是 User Prompt（你的提问），但在你看不见的地方，开发者已经预先塞了一大段”隐藏指令”告诉模型该怎么表现，这段隐藏指令就是 System Prompt。Agent 系统比普通聊天复杂得多，所以它的 System Prompt 也更长、职责更重。它承载的职责可以归成五类：1）角色定义和行为准则：告诉模型”你是谁”，比如你是一个编程助手、客服机器人还是数据分析师，同时约束它的语气、风格和边界。&lt;/p&gt;&lt;p&gt;2） 工具使用规范和约束：Agent 最核心的能力是”能调用工具”（读文件、跑命令、搜索网页等），System Prompt 要告诉模型有哪些工具可用、每个工具怎么调、什么场景该用哪个。&lt;/p&gt;&lt;p&gt;3） 输出格式要求：规定模型以什么格式回复，比如 JSON、还是 markdown？消息标签怎么打、多通道消息怎么路由、静默回复用什么标记等。&lt;/p&gt;&lt;p&gt;4） 安全与权限控制：设定模型不能做什么，比如不能执行危险命令、不能泄露内部配置、不能擅自做破坏性操作等。这相当于给 AI 划红线。&lt;/p&gt;&lt;p&gt;5） 上下文信息补充：把当前运行环境的关键信息（工作目录、当前时间、用户身份、技能清单）告诉模型，让它的回答更贴合当前场景。至于 System Prompt 越来越长怎么办，核心策略就三个字：拆、选、扔。拆，是把 System Prompt 按职责拆成独立模块，每个模块管一件事。选，是根据当前任务场景只注入相关模块，不需要的不塞进去。扔，是把稳定不变的知识从 prompt 里移出去，放到外部文件或知识库里，让 Agent 需要的时候通过工具调用自己去读。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;模块化组装方案以 OpenClaw 为例，它的 System Prompt 不是一整坨字符串，而是拆成了十几个独立模块，每次请求时按需拼接。这些模块可以分成三层来理解：第一层：基础身份与安全（每次必加）身份声明：一句话告诉模型”你是谁”，这是整个 prompt 的锚点安全红线：写明不能自我复制、不能绕过安全机制、不能追求超出用户请求的目标工具列表：根据权限策略过滤后，列出当前可用的工具及调用规范工具调用风格：低风险操作不用解释直接调、敏感操作要先跟用户确认第二层：场景能力模块（按需加载）技能提示：告诉 Agent “你有哪些预装技能可以激活”，类似手机里的 App 列表记忆召回：指导模型在回答前先搜索历史记忆，避免”失忆”消息路由：跨通道（Signal、Telegram、Discord 等）发消息的规则语音合成：只有开启了 TTS 功能才注入第三层：动态运行时上下文（每次请求动态生成）当前时间、工作目录、操作系统、shell 类型等环境信息授权白名单用户列表沙箱信息（如果 Agent 跑在 Docker 里，要告诉它路径映射关系）项目配置文件的内容（行为规则、人格语气、用户偏好等）还有个关键设计：分级加载。OpenClaw 用一个加载级别参数控制注入哪些模块：完整模式：加载全部模块，主 Agent 用精简模式：只保留工具列表、工作目录、运行时信息等核心模块，子 Agent 用（子 Agent 不需要消息路由、心跳这些能力）最小模式：只返回一句身份声明这样同一套代码就能服务不同角色，子 Agent 不用背负主 Agent 那几千 token 的冗余指令。这种拆法的好处：每个模块独立维护、独立测试。加一个新功能不用在一个几千行的字符串里找位置插入，直接新增一个模块就行。插件化扩展机制除了内置模块，OpenClaw 还支持第三方插件向 System Prompt 注入内容。原理是在 System Prompt 即将拼装完成时，系统广播一个信号：“我要构建 prompt 了，谁想加点东西？” 注册了这个钩子（Hook）的插件就能在这时候把自己的内容塞进去。插件有四种注入方式：替换系统提示：直接覆盖整个 System Prompt（后注册的覆盖先注册的）系统提示头部追加：拼到 System Prompt 开头，适合静态指令，能被 LLM 的 prompt cache 缓存系统提示尾部追加：拼到 System Prompt 末尾，同样可缓存对话层注入：放到用户消息前面，适合每轮可能变化的动态上下文比如一个”代码规范检查”插件，可以通过钩子把当前项目的编码规范注入到 System Prompt 里，Agent 写代码时就会自动遵守这些规范。不需要改任何核心代码。长 System Prompt 的性能影响System Prompt 越长，每次请求消耗的 token 就越多，响应延迟也会上去。所以”按需加载”不只是架构上好看，在成本上也是刚需。一个代码审查任务根本不需要知道消息路由规范，一个简单问答也不需要加载完整的工具列表。模块化拼接 + 分级加载，能让子 Agent 的 prompt 比主 Agent 短得多，直接节省 token 开销。同时，prompt cache（提示缓存）也是降本的重要手段。很多 LLM 提供商（如 Anthropic、OpenAI）支持对 System Prompt 中不变的部分做缓存，第二次请求如果 prompt 前缀没变，就不重复计算 token 费用。所以插件注入方式才区分了”系统提示层”和”对话层”：把稳定内容放系统提示里吃缓存，动态内容走对话层每轮注入。业界其他方案的对比Cursor 的做法是把大量规则写进 System Prompt，然后靠模型的长上下文能力硬扛，简单粗暴但有效。它的 System Prompt 非常长（包含工具说明、代码引用格式、提交规范等等），但因为 Cursor 面向的场景相对单一（代码编辑），所以每次都全量加载也还能接受。Devin 走的是另一个极端，把很多行为规则编码成代码逻辑而不是自然语言 prompt，减少对 System Prompt 的依赖，但灵活性就差一些，改规则要改代码，不像改 prompt 那样随时能调。LangChain 的 Agent 框架用模板化的方式组装 prompt，跟 OpenClaw 思路类似，也有 Callbacks 系统可以在生命周期各节点插入逻辑，但它的 Callbacks 更偏”观测”（日志、追踪），在 prompt 注入这个环节的灵活度不如 OpenClaw 的四字段钩子精细。其实模块化组装 + 按需加载已经成了 Agent 系统处理 System Prompt 的主流方案，OpenClaw 在这个基础上加了分级加载（promptMode）和四字段插件钩子，算是做到了比较好的平衡。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？回答：纯靠 System Prompt 写安全规则肯定不够，模型层面的 prompt injection（用户故意构造输入来”欺骗”模型忽略之前的指令）防不胜防。所以关键操作必须在代码层面做硬校验，比如文件操作要做路径白名单检查，危险命令要在执行层面拦截，不能只靠 System Prompt 里写一句”禁止执行 rm -rf”就完事了。OpenClaw 的做法就是这样分层的：System Prompt 里有 Safety 模块写明安全红线（第一道防线，降低模型主动犯错的概率），但真正的保障在工具执行层。比如before_tool_call钩子可以在工具真正执行前拦截或修改参数，exec 工具有审批机制（用户要/approve才能执行敏感命令）。- &lt;strong&gt;提问&lt;/strong&gt;：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：会的，研究表明模型对 System Prompt 开头和结尾的内容关注度更高，中间部分容易被”稀释”（这跟人类阅读习惯类似）。所以最核心的身份定义和安全规则一般放在最前面，工具列表和格式要求放中间，动态上下文信息放后面。OpenClaw 的模块拼接顺序是固定写在buildAgentSystemPrompt函数里的：Identity → Tooling → Safety 在最前面，Skills → Memory 等能力模块在中间，Runtime 信息放最后。这个顺序符合”重要内容靠前”的通用原则。- &lt;strong&gt;提问&lt;/strong&gt;：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：判断标准就两条。第一看频率，每次请求都需要用到的信息放 prompt 里，偶尔才用到的放外部。第二看体积，几十个 token 的信息直接放 prompt 里没关系，但如果是几千 token 的编码规范文档，放外部按需读取更划算。读文件虽然也消耗 token，但它是”用到才花钱”，比每次请求都带上要省得多。一般来说，超过 500 token 且使用频率低于 30% 的信息，放外部就更经济。OpenClaw 的 Skills 模块就是这个思路：System Prompt 里只放一个技能目录（很短），模型判断需要某个技能时再通过 read 工具去读完整的 SKILL.md 文件。- &lt;strong&gt;提问&lt;/strong&gt;：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：完全可能冲突。比如两个插件一个要求”输出格式用 JSON”，另一个要求”输出格式用 Markdown”，模型就懵了。OpenClaw 的解决方案是优先级机制：每个钩子注册时可以指定priority数值，数值越大优先级越高，执行越靠前。对于systemPrompt字段，合并逻辑是”后执行的覆盖先执行的”（即低优先级插件的 systemPrompt 会被高优先级的覆盖）；对于prependContext、prependSystemContext、appendSystemContext这些拼接型字段，则是按优先级顺序依次拼接，不存在覆盖。所以插件开发者需要注意：如果你要覆盖核心 prompt，就设高优先级 + 用systemPrompt字段；如果只是追加上下文，用拼接型字段就不会跟别人冲突。作者：Yes面试鸭官方
你是一个专业的数据分析助手，具有以下特征：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拥有 10 年数据科学经展开新页面打开2026-03-15  09:0300回复承担职责可归结五类：1 角色定义和行为准则 2.工具使用规范和约束 3.输出格式要求 4. 安全与权限控制 5.上下文信息补充&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System prompt 越来越长：核心：拆、选、扔&lt;/p&gt;&lt;p&gt;拆，把System Prompt 按指责拆成独立模块，每个模块管一件事&lt;/p&gt;&lt;p&gt;选，根据当前任务场景只注入相关模块，不需要的展开新页面打开2026-03-14  11:4700回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;模块化组装方案插件化扩展机制长 System Prompt 的性能影响业界其他方案的对比&lt;/p&gt;&lt;p&gt;提问：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？提问：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？提问：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？提问：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813222. System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。简单理解：每次你跟 ChatGPT、Cursor 这类 AI 工具对话时，你看到的只是 User Prompt（你的提问），但在你看不见的地方，开发者已经预先塞了一大段”隐藏指令”告诉模型该怎么表现，这段隐藏指令就是 System Prompt。Agent 系统比普通聊天复杂得多，所以它的 System Prompt 也更长、职责更重。它承载的职责可以归成五类：1）角色定义和行为准则：告诉模型”你是谁”，比如你是一个编程助手、客服机器人还是数据分析师，同时约束它的语气、风格和边界。&lt;/p&gt;&lt;p&gt;2） 工具使用规范和约束：Agent 最核心的能力是”能调用工具”（读文件、跑命令、搜索网页等），System Prompt 要告诉模型有哪些工具可用、每个工具怎么调、什么场景该用哪个。&lt;/p&gt;&lt;p&gt;3） 输出格式要求：规定模型以什么格式回复，比如 JSON、还是 markdown？消息标签怎么打、多通道消息怎么路由、静默回复用什么标记等。&lt;/p&gt;&lt;p&gt;4） 安全与权限控制：设定模型不能做什么，比如不能执行危险命令、不能泄露内部配置、不能擅自做破坏性操作等。这相当于给 AI 划红线。&lt;/p&gt;&lt;p&gt;5） 上下文信息补充：把当前运行环境的关键信息（工作目录、当前时间、用户身份、技能清单）告诉模型，让它的回答更贴合当前场景。至于 System Prompt 越来越长怎么办，核心策略就三个字：拆、选、扔。拆，是把 System Prompt 按职责拆成独立模块，每个模块管一件事。选，是根据当前任务场景只注入相关模块，不需要的不塞进去。扔，是把稳定不变的知识从 prompt 里移出去，放到外部文件或知识库里，让 Agent 需要的时候通过工具调用自己去读。&lt;/p&gt;&lt;p&gt;模块化组装方案以 OpenClaw 为例，它的 System Prompt 不是一整坨字符串，而是拆成了十几个独立模块，每次请求时按需拼接。这些模块可以分成三层来理解：第一层：基础身份与安全（每次必加）身份声明：一句话告诉模型”你是谁”，这是整个 prompt 的锚点安全红线：写明不能自我复制、不能绕过安全机制、不能追求超出用户请求的目标工具列表：根据权限策略过滤后，列出当前可用的工具及调用规范工具调用风格：低风险操作不用解释直接调、敏感操作要先跟用户确认第二层：场景能力模块（按需加载）技能提示：告诉 Agent “你有哪些预装技能可以激活”，类似手机里的 App 列表记忆召回：指导模型在回答前先搜索历史记忆，避免”失忆”消息路由：跨通道（Signal、Telegram、Discord 等）发消息的规则语音合成：只有开启了 TTS 功能才注入第三层：动态运行时上下文（每次请求动态生成）当前时间、工作目录、操作系统、shell 类型等环境信息授权白名单用户列表沙箱信息（如果 Agent 跑在 Docker 里，要告诉它路径映射关系）项目配置文件的内容（行为规则、人格语气、用户偏好等）还有个关键设计：分级加载。OpenClaw 用一个加载级别参数控制注入哪些模块：完整模式：加载全部模块，主 Agent 用精简模式：只保留工具列表、工作目录、运行时信息等核心模块，子 Agent 用（子 Agent 不需要消息路由、心跳这些能力）最小模式：只返回一句身份声明这样同一套代码就能服务不同角色，子 Agent 不用背负主 Agent 那几千 token 的冗余指令。这种拆法的好处：每个模块独立维护、独立测试。加一个新功能不用在一个几千行的字符串里找位置插入，直接新增一个模块就行。插件化扩展机制除了内置模块，OpenClaw 还支持第三方插件向 System Prompt 注入内容。原理是在 System Prompt 即将拼装完成时，系统广播一个信号：“我要构建 prompt 了，谁想加点东西？” 注册了这个钩子（Hook）的插件就能在这时候把自己的内容塞进去。插件有四种注入方式：替换系统提示：直接覆盖整个 System Prompt（后注册的覆盖先注册的）系统提示头部追加：拼到 System Prompt 开头，适合静态指令，能被 LLM 的 prompt cache 缓存系统提示尾部追加：拼到 System Prompt 末尾，同样可缓存对话层注入：放到用户消息前面，适合每轮可能变化的动态上下文比如一个”代码规范检查”插件，可以通过钩子把当前项目的编码规范注入到 System Prompt 里，Agent 写代码时就会自动遵守这些规范。不需要改任何核心代码。长 System Prompt 的性能影响System Prompt 越长，每次请求消耗的 token 就越多，响应延迟也会上去。所以”按需加载”不只是架构上好看，在成本上也是刚需。一个代码审查任务根本不需要知道消息路由规范，一个简单问答也不需要加载完整的工具列表。模块化拼接 + 分级加载，能让子 Agent 的 prompt 比主 Agent 短得多，直接节省 token 开销。同时，prompt cache（提示缓存）也是降本的重要手段。很多 LLM 提供商（如 Anthropic、OpenAI）支持对 System Prompt 中不变的部分做缓存，第二次请求如果 prompt 前缀没变，就不重复计算 token 费用。所以插件注入方式才区分了”系统提示层”和”对话层”：把稳定内容放系统提示里吃缓存，动态内容走对话层每轮注入。业界其他方案的对比Cursor 的做法是把大量规则写进 System Prompt，然后靠模型的长上下文能力硬扛，简单粗暴但有效。它的 System Prompt 非常长（包含工具说明、代码引用格式、提交规范等等），但因为 Cursor 面向的场景相对单一（代码编辑），所以每次都全量加载也还能接受。Devin 走的是另一个极端，把很多行为规则编码成代码逻辑而不是自然语言 prompt，减少对 System Prompt 的依赖，但灵活性就差一些，改规则要改代码，不像改 prompt 那样随时能调。LangChain 的 Agent 框架用模板化的方式组装 prompt，跟 OpenClaw 思路类似，也有 Callbacks 系统可以在生命周期各节点插入逻辑，但它的 Callbacks 更偏”观测”（日志、追踪），在 prompt 注入这个环节的灵活度不如 OpenClaw 的四字段钩子精细。其实模块化组装 + 按需加载已经成了 Agent 系统处理 System Prompt 的主流方案，OpenClaw 在这个基础上加了分级加载（promptMode）和四字段插件钩子，算是做到了比较好的平衡。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？回答：纯靠 System Prompt 写安全规则肯定不够，模型层面的 prompt injection（用户故意构造输入来”欺骗”模型忽略之前的指令）防不胜防。所以关键操作必须在代码层面做硬校验，比如文件操作要做路径白名单检查，危险命令要在执行层面拦截，不能只靠 System Prompt 里写一句”禁止执行 rm -rf”就完事了。OpenClaw 的做法就是这样分层的：System Prompt 里有 Safety 模块写明安全红线（第一道防线，降低模型主动犯错的概率），但真正的保障在工具执行层。比如before_tool_call钩子可以在工具真正执行前拦截或修改参数，exec 工具有审批机制（用户要/approve才能执行敏感命令）。- &lt;strong&gt;提问&lt;/strong&gt;：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：会的，研究表明模型对 System Prompt 开头和结尾的内容关注度更高，中间部分容易被”稀释”（这跟人类阅读习惯类似）。所以最核心的身份定义和安全规则一般放在最前面，工具列表和格式要求放中间，动态上下文信息放后面。OpenClaw 的模块拼接顺序是固定写在buildAgentSystemPrompt函数里的：Identity → Tooling → Safety 在最前面，Skills → Memory 等能力模块在中间，Runtime 信息放最后。这个顺序符合”重要内容靠前”的通用原则。- &lt;strong&gt;提问&lt;/strong&gt;：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：判断标准就两条。第一看频率，每次请求都需要用到的信息放 prompt 里，偶尔才用到的放外部。第二看体积，几十个 token 的信息直接放 prompt 里没关系，但如果是几千 token 的编码规范文档，放外部按需读取更划算。读文件虽然也消耗 token，但它是”用到才花钱”，比每次请求都带上要省得多。一般来说，超过 500 token 且使用频率低于 30% 的信息，放外部就更经济。OpenClaw 的 Skills 模块就是这个思路：System Prompt 里只放一个技能目录（很短），模型判断需要某个技能时再通过 read 工具去读完整的 SKILL.md 文件。- &lt;strong&gt;提问&lt;/strong&gt;：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：完全可能冲突。比如两个插件一个要求”输出格式用 JSON”，另一个要求”输出格式用 Markdown”，模型就懵了。OpenClaw 的解决方案是优先级机制：每个钩子注册时可以指定priority数值，数值越大优先级越高，执行越靠前。对于systemPrompt字段，合并逻辑是”后执行的覆盖先执行的”（即低优先级插件的 systemPrompt 会被高优先级的覆盖）；对于prependContext、prependSystemContext、appendSystemContext这些拼接型字段，则是按优先级顺序依次拼接，不存在覆盖。所以插件开发者需要注意：如果你要覆盖核心 prompt，就设高优先级 + 用systemPrompt字段；如果只是追加上下文，用拼接型字段就不会跟别人冲突。作者：Yes面试鸭官方
你是一个专业的数据分析助手，具有以下特征：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拥有 10 年数据科学经展开新页面打开2026-03-15  09:0300回复承担职责可归结五类：1 角色定义和行为准则 2.工具使用规范和约束 3.输出格式要求 4. 安全与权限控制 5.上下文信息补充&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System prompt 越来越长：核心：拆、选、扔&lt;/p&gt;&lt;p&gt;拆，把System Prompt 按指责拆成独立模块，每个模块管一件事&lt;/p&gt;&lt;p&gt;选，根据当前任务场景只注入相关模块，不需要的展开新页面打开2026-03-14  11:4700回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;模块化组装方案插件化扩展机制长 System Prompt 的性能影响业界其他方案的对比&lt;/p&gt;&lt;p&gt;提问：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？提问：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？提问：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？提问：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;System Prompt 在 Agent 系统中承载了哪些职责？&lt;a href=&quot;#system-prompt-在-agent-系统中承载了哪些职责&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;如果 System Prompt 越来越长，你会怎么处理？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如果 System Prompt 越来越长，你会怎么处理？&lt;/li&gt;
&lt;li&gt;NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。简单理解：每次你跟 ChatGPT、Cursor 这类 AI 工具对话时，你看到的只是 User Prompt（你的提问），但在你看不见的地方，开发者已经预先塞了一大段”隐藏指令”告诉模型该怎么表现，这段隐藏指令就是 System Prompt。Agent 系统比普通聊天复杂得多，所以它的 System Prompt 也更长、职责更重。它承载的职责可以归成五类：1）角色定义和行为准则：告诉模型”你是谁”，比如你是一个编程助手、客服机器人还是数据分析师，同时约束它的语气、风格和边界。&lt;/p&gt;&lt;p&gt;2） 工具使用规范和约束：Agent 最核心的能力是”能调用工具”（读文件、跑命令、搜索网页等），System Prompt 要告诉模型有哪些工具可用、每个工具怎么调、什么场景该用哪个。&lt;/p&gt;&lt;p&gt;3） 输出格式要求：规定模型以什么格式回复，比如 JSON、还是 markdown？消息标签怎么打、多通道消息怎么路由、静默回复用什么标记等。&lt;/p&gt;&lt;p&gt;4） 安全与权限控制：设定模型不能做什么，比如不能执行危险命令、不能泄露内部配置、不能擅自做破坏性操作等。这相当于给 AI 划红线。&lt;/p&gt;&lt;p&gt;5） 上下文信息补充：把当前运行环境的关键信息（工作目录、当前时间、用户身份、技能清单）告诉模型，让它的回答更贴合当前场景。至于 System Prompt 越来越长怎么办，核心策略就三个字：拆、选、扔。拆，是把 System Prompt 按职责拆成独立模块，每个模块管一件事。选，是根据当前任务场景只注入相关模块，不需要的不塞进去。扔，是把稳定不变的知识从 prompt 里移出去，放到外部文件或知识库里，让 Agent 需要的时候通过工具调用自己去读。&lt;/p&gt;&lt;p&gt;模块化组装方案以 OpenClaw 为例，它的 System Prompt 不是一整坨字符串，而是拆成了十几个独立模块，每次请求时按需拼接。这些模块可以分成三层来理解：第一层：基础身份与安全（每次必加）身份声明：一句话告诉模型”你是谁”，这是整个 prompt 的锚点安全红线：写明不能自我复制、不能绕过安全机制、不能追求超出用户请求的目标工具列表：根据权限策略过滤后，列出当前可用的工具及调用规范工具调用风格：低风险操作不用解释直接调、敏感操作要先跟用户确认第二层：场景能力模块（按需加载）技能提示：告诉 Agent “你有哪些预装技能可以激活”，类似手机里的 App 列表记忆召回：指导模型在回答前先搜索历史记忆，避免”失忆”消息路由：跨通道（Signal、Telegram、Discord 等）发消息的规则语音合成：只有开启了 TTS 功能才注入第三层：动态运行时上下文（每次请求动态生成）当前时间、工作目录、操作系统、shell 类型等环境信息授权白名单用户列表沙箱信息（如果 Agent 跑在 Docker 里，要告诉它路径映射关系）项目配置文件的内容（行为规则、人格语气、用户偏好等）还有个关键设计：分级加载。OpenClaw 用一个加载级别参数控制注入哪些模块：完整模式：加载全部模块，主 Agent 用精简模式：只保留工具列表、工作目录、运行时信息等核心模块，子 Agent 用（子 Agent 不需要消息路由、心跳这些能力）最小模式：只返回一句身份声明这样同一套代码就能服务不同角色，子 Agent 不用背负主 Agent 那几千 token 的冗余指令。这种拆法的好处：每个模块独立维护、独立测试。加一个新功能不用在一个几千行的字符串里找位置插入，直接新增一个模块就行。插件化扩展机制除了内置模块，OpenClaw 还支持第三方插件向 System Prompt 注入内容。原理是在 System Prompt 即将拼装完成时，系统广播一个信号：“我要构建 prompt 了，谁想加点东西？” 注册了这个钩子（Hook）的插件就能在这时候把自己的内容塞进去。插件有四种注入方式：替换系统提示：直接覆盖整个 System Prompt（后注册的覆盖先注册的）系统提示头部追加：拼到 System Prompt 开头，适合静态指令，能被 LLM 的 prompt cache 缓存系统提示尾部追加：拼到 System Prompt 末尾，同样可缓存对话层注入：放到用户消息前面，适合每轮可能变化的动态上下文比如一个”代码规范检查”插件，可以通过钩子把当前项目的编码规范注入到 System Prompt 里，Agent 写代码时就会自动遵守这些规范。不需要改任何核心代码。长 System Prompt 的性能影响System Prompt 越长，每次请求消耗的 token 就越多，响应延迟也会上去。所以”按需加载”不只是架构上好看，在成本上也是刚需。一个代码审查任务根本不需要知道消息路由规范，一个简单问答也不需要加载完整的工具列表。模块化拼接 + 分级加载，能让子 Agent 的 prompt 比主 Agent 短得多，直接节省 token 开销。同时，prompt cache（提示缓存）也是降本的重要手段。很多 LLM 提供商（如 Anthropic、OpenAI）支持对 System Prompt 中不变的部分做缓存，第二次请求如果 prompt 前缀没变，就不重复计算 token 费用。所以插件注入方式才区分了”系统提示层”和”对话层”：把稳定内容放系统提示里吃缓存，动态内容走对话层每轮注入。业界其他方案的对比Cursor 的做法是把大量规则写进 System Prompt，然后靠模型的长上下文能力硬扛，简单粗暴但有效。它的 System Prompt 非常长（包含工具说明、代码引用格式、提交规范等等），但因为 Cursor 面向的场景相对单一（代码编辑），所以每次都全量加载也还能接受。Devin 走的是另一个极端，把很多行为规则编码成代码逻辑而不是自然语言 prompt，减少对 System Prompt 的依赖，但灵活性就差一些，改规则要改代码，不像改 prompt 那样随时能调。LangChain 的 Agent 框架用模板化的方式组装 prompt，跟 OpenClaw 思路类似，也有 Callbacks 系统可以在生命周期各节点插入逻辑，但它的 Callbacks 更偏”观测”（日志、追踪），在 prompt 注入这个环节的灵活度不如 OpenClaw 的四字段钩子精细。其实模块化组装 + 按需加载已经成了 Agent 系统处理 System Prompt 的主流方案，OpenClaw 在这个基础上加了分级加载（promptMode）和四字段插件钩子，算是做到了比较好的平衡。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？回答：纯靠 System Prompt 写安全规则肯定不够，模型层面的 prompt injection（用户故意构造输入来”欺骗”模型忽略之前的指令）防不胜防。所以关键操作必须在代码层面做硬校验，比如文件操作要做路径白名单检查，危险命令要在执行层面拦截，不能只靠 System Prompt 里写一句”禁止执行 rm -rf”就完事了。OpenClaw 的做法就是这样分层的：System Prompt 里有 Safety 模块写明安全红线（第一道防线，降低模型主动犯错的概率），但真正的保障在工具执行层。比如before_tool_call钩子可以在工具真正执行前拦截或修改参数，exec 工具有审批机制（用户要/approve才能执行敏感命令）。- &lt;strong&gt;提问&lt;/strong&gt;：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：会的，研究表明模型对 System Prompt 开头和结尾的内容关注度更高，中间部分容易被”稀释”（这跟人类阅读习惯类似）。所以最核心的身份定义和安全规则一般放在最前面，工具列表和格式要求放中间，动态上下文信息放后面。OpenClaw 的模块拼接顺序是固定写在buildAgentSystemPrompt函数里的：Identity → Tooling → Safety 在最前面，Skills → Memory 等能力模块在中间，Runtime 信息放最后。这个顺序符合”重要内容靠前”的通用原则。- &lt;strong&gt;提问&lt;/strong&gt;：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：判断标准就两条。第一看频率，每次请求都需要用到的信息放 prompt 里，偶尔才用到的放外部。第二看体积，几十个 token 的信息直接放 prompt 里没关系，但如果是几千 token 的编码规范文档，放外部按需读取更划算。读文件虽然也消耗 token，但它是”用到才花钱”，比每次请求都带上要省得多。一般来说，超过 500 token 且使用频率低于 30% 的信息，放外部就更经济。OpenClaw 的 Skills 模块就是这个思路：System Prompt 里只放一个技能目录（很短），模型判断需要某个技能时再通过 read 工具去读完整的 SKILL.md 文件。- &lt;strong&gt;提问&lt;/strong&gt;：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：完全可能冲突。比如两个插件一个要求”输出格式用 JSON”，另一个要求”输出格式用 Markdown”，模型就懵了。OpenClaw 的解决方案是优先级机制：每个钩子注册时可以指定priority数值，数值越大优先级越高，执行越靠前。对于systemPrompt字段，合并逻辑是”后执行的覆盖先执行的”（即低优先级插件的 systemPrompt 会被高优先级的覆盖）；对于prependContext、prependSystemContext、appendSystemContext这些拼接型字段，则是按优先级顺序依次拼接，不存在覆盖。所以插件开发者需要注意：如果你要覆盖核心 prompt，就设高优先级 + 用systemPrompt字段；如果只是追加上下文，用拼接型字段就不会跟别人冲突。作者：Yes面试鸭官方
你是一个专业的数据分析助手，具有以下特征：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拥有 10 年数据科学经展开新页面打开2026-03-15  09:0300回复承担职责可归结五类：1 角色定义和行为准则 2.工具使用规范和约束 3.输出格式要求 4. 安全与权限控制 5.上下文信息补充&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System prompt 越来越长：核心：拆、选、扔&lt;/p&gt;&lt;p&gt;拆，把System Prompt 按指责拆成独立模块，每个模块管一件事&lt;/p&gt;&lt;p&gt;选，根据当前任务场景只注入相关模块，不需要的展开新页面打开2026-03-14  11:4700回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;模块化组装方案插件化扩展机制长 System Prompt 的性能影响业界其他方案的对比&lt;/p&gt;&lt;p&gt;提问：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？提问：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？提问：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？提问：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813222. System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。简单理解：每次你跟 ChatGPT、Cursor 这类 AI 工具对话时，你看到的只是 User Prompt（你的提问），但在你看不见的地方，开发者已经预先塞了一大段”隐藏指令”告诉模型该怎么表现，这段隐藏指令就是 System Prompt。Agent 系统比普通聊天复杂得多，所以它的 System Prompt 也更长、职责更重。它承载的职责可以归成五类：1）角色定义和行为准则：告诉模型”你是谁”，比如你是一个编程助手、客服机器人还是数据分析师，同时约束它的语气、风格和边界。&lt;/p&gt;&lt;p&gt;2） 工具使用规范和约束：Agent 最核心的能力是”能调用工具”（读文件、跑命令、搜索网页等），System Prompt 要告诉模型有哪些工具可用、每个工具怎么调、什么场景该用哪个。&lt;/p&gt;&lt;p&gt;3） 输出格式要求：规定模型以什么格式回复，比如 JSON、还是 markdown？消息标签怎么打、多通道消息怎么路由、静默回复用什么标记等。&lt;/p&gt;&lt;p&gt;4） 安全与权限控制：设定模型不能做什么，比如不能执行危险命令、不能泄露内部配置、不能擅自做破坏性操作等。这相当于给 AI 划红线。&lt;/p&gt;&lt;p&gt;5） 上下文信息补充：把当前运行环境的关键信息（工作目录、当前时间、用户身份、技能清单）告诉模型，让它的回答更贴合当前场景。至于 System Prompt 越来越长怎么办，核心策略就三个字：拆、选、扔。拆，是把 System Prompt 按职责拆成独立模块，每个模块管一件事。选，是根据当前任务场景只注入相关模块，不需要的不塞进去。扔，是把稳定不变的知识从 prompt 里移出去，放到外部文件或知识库里，让 Agent 需要的时候通过工具调用自己去读。&lt;/p&gt;&lt;p&gt;模块化组装方案以 OpenClaw 为例，它的 System Prompt 不是一整坨字符串，而是拆成了十几个独立模块，每次请求时按需拼接。这些模块可以分成三层来理解：第一层：基础身份与安全（每次必加）身份声明：一句话告诉模型”你是谁”，这是整个 prompt 的锚点安全红线：写明不能自我复制、不能绕过安全机制、不能追求超出用户请求的目标工具列表：根据权限策略过滤后，列出当前可用的工具及调用规范工具调用风格：低风险操作不用解释直接调、敏感操作要先跟用户确认第二层：场景能力模块（按需加载）技能提示：告诉 Agent “你有哪些预装技能可以激活”，类似手机里的 App 列表记忆召回：指导模型在回答前先搜索历史记忆，避免”失忆”消息路由：跨通道（Signal、Telegram、Discord 等）发消息的规则语音合成：只有开启了 TTS 功能才注入第三层：动态运行时上下文（每次请求动态生成）当前时间、工作目录、操作系统、shell 类型等环境信息授权白名单用户列表沙箱信息（如果 Agent 跑在 Docker 里，要告诉它路径映射关系）项目配置文件的内容（行为规则、人格语气、用户偏好等）还有个关键设计：分级加载。OpenClaw 用一个加载级别参数控制注入哪些模块：完整模式：加载全部模块，主 Agent 用精简模式：只保留工具列表、工作目录、运行时信息等核心模块，子 Agent 用（子 Agent 不需要消息路由、心跳这些能力）最小模式：只返回一句身份声明这样同一套代码就能服务不同角色，子 Agent 不用背负主 Agent 那几千 token 的冗余指令。这种拆法的好处：每个模块独立维护、独立测试。加一个新功能不用在一个几千行的字符串里找位置插入，直接新增一个模块就行。插件化扩展机制除了内置模块，OpenClaw 还支持第三方插件向 System Prompt 注入内容。原理是在 System Prompt 即将拼装完成时，系统广播一个信号：“我要构建 prompt 了，谁想加点东西？” 注册了这个钩子（Hook）的插件就能在这时候把自己的内容塞进去。插件有四种注入方式：替换系统提示：直接覆盖整个 System Prompt（后注册的覆盖先注册的）系统提示头部追加：拼到 System Prompt 开头，适合静态指令，能被 LLM 的 prompt cache 缓存系统提示尾部追加：拼到 System Prompt 末尾，同样可缓存对话层注入：放到用户消息前面，适合每轮可能变化的动态上下文比如一个”代码规范检查”插件，可以通过钩子把当前项目的编码规范注入到 System Prompt 里，Agent 写代码时就会自动遵守这些规范。不需要改任何核心代码。长 System Prompt 的性能影响System Prompt 越长，每次请求消耗的 token 就越多，响应延迟也会上去。所以”按需加载”不只是架构上好看，在成本上也是刚需。一个代码审查任务根本不需要知道消息路由规范，一个简单问答也不需要加载完整的工具列表。模块化拼接 + 分级加载，能让子 Agent 的 prompt 比主 Agent 短得多，直接节省 token 开销。同时，prompt cache（提示缓存）也是降本的重要手段。很多 LLM 提供商（如 Anthropic、OpenAI）支持对 System Prompt 中不变的部分做缓存，第二次请求如果 prompt 前缀没变，就不重复计算 token 费用。所以插件注入方式才区分了”系统提示层”和”对话层”：把稳定内容放系统提示里吃缓存，动态内容走对话层每轮注入。业界其他方案的对比Cursor 的做法是把大量规则写进 System Prompt，然后靠模型的长上下文能力硬扛，简单粗暴但有效。它的 System Prompt 非常长（包含工具说明、代码引用格式、提交规范等等），但因为 Cursor 面向的场景相对单一（代码编辑），所以每次都全量加载也还能接受。Devin 走的是另一个极端，把很多行为规则编码成代码逻辑而不是自然语言 prompt，减少对 System Prompt 的依赖，但灵活性就差一些，改规则要改代码，不像改 prompt 那样随时能调。LangChain 的 Agent 框架用模板化的方式组装 prompt，跟 OpenClaw 思路类似，也有 Callbacks 系统可以在生命周期各节点插入逻辑，但它的 Callbacks 更偏”观测”（日志、追踪），在 prompt 注入这个环节的灵活度不如 OpenClaw 的四字段钩子精细。其实模块化组装 + 按需加载已经成了 Agent 系统处理 System Prompt 的主流方案，OpenClaw 在这个基础上加了分级加载（promptMode）和四字段插件钩子，算是做到了比较好的平衡。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？回答：纯靠 System Prompt 写安全规则肯定不够，模型层面的 prompt injection（用户故意构造输入来”欺骗”模型忽略之前的指令）防不胜防。所以关键操作必须在代码层面做硬校验，比如文件操作要做路径白名单检查，危险命令要在执行层面拦截，不能只靠 System Prompt 里写一句”禁止执行 rm -rf”就完事了。OpenClaw 的做法就是这样分层的：System Prompt 里有 Safety 模块写明安全红线（第一道防线，降低模型主动犯错的概率），但真正的保障在工具执行层。比如before_tool_call钩子可以在工具真正执行前拦截或修改参数，exec 工具有审批机制（用户要/approve才能执行敏感命令）。- &lt;strong&gt;提问&lt;/strong&gt;：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：会的，研究表明模型对 System Prompt 开头和结尾的内容关注度更高，中间部分容易被”稀释”（这跟人类阅读习惯类似）。所以最核心的身份定义和安全规则一般放在最前面，工具列表和格式要求放中间，动态上下文信息放后面。OpenClaw 的模块拼接顺序是固定写在buildAgentSystemPrompt函数里的：Identity → Tooling → Safety 在最前面，Skills → Memory 等能力模块在中间，Runtime 信息放最后。这个顺序符合”重要内容靠前”的通用原则。- &lt;strong&gt;提问&lt;/strong&gt;：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：判断标准就两条。第一看频率，每次请求都需要用到的信息放 prompt 里，偶尔才用到的放外部。第二看体积，几十个 token 的信息直接放 prompt 里没关系，但如果是几千 token 的编码规范文档，放外部按需读取更划算。读文件虽然也消耗 token，但它是”用到才花钱”，比每次请求都带上要省得多。一般来说，超过 500 token 且使用频率低于 30% 的信息，放外部就更经济。OpenClaw 的 Skills 模块就是这个思路：System Prompt 里只放一个技能目录（很短），模型判断需要某个技能时再通过 read 工具去读完整的 SKILL.md 文件。- &lt;strong&gt;提问&lt;/strong&gt;：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：完全可能冲突。比如两个插件一个要求”输出格式用 JSON”，另一个要求”输出格式用 Markdown”，模型就懵了。OpenClaw 的解决方案是优先级机制：每个钩子注册时可以指定priority数值，数值越大优先级越高，执行越靠前。对于systemPrompt字段，合并逻辑是”后执行的覆盖先执行的”（即低优先级插件的 systemPrompt 会被高优先级的覆盖）；对于prependContext、prependSystemContext、appendSystemContext这些拼接型字段，则是按优先级顺序依次拼接，不存在覆盖。所以插件开发者需要注意：如果你要覆盖核心 prompt，就设高优先级 + 用systemPrompt字段；如果只是追加上下文，用拼接型字段就不会跟别人冲突。作者：Yes面试鸭官方
你是一个专业的数据分析助手，具有以下特征：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拥有 10 年数据科学经展开新页面打开2026-03-15  09:0300回复承担职责可归结五类：1 角色定义和行为准则 2.工具使用规范和约束 3.输出格式要求 4. 安全与权限控制 5.上下文信息补充&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System prompt 越来越长：核心：拆、选、扔&lt;/p&gt;&lt;p&gt;拆，把System Prompt 按指责拆成独立模块，每个模块管一件事&lt;/p&gt;&lt;p&gt;选，根据当前任务场景只注入相关模块，不需要的展开新页面打开2026-03-14  11:4700回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;模块化组装方案插件化扩展机制长 System Prompt 的性能影响业界其他方案的对比&lt;/p&gt;&lt;p&gt;提问：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？提问：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？提问：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？提问：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;System Prompt 在 Agent 系统中承载了哪些职责？&lt;a href=&quot;#system-prompt-在-agent-系统中承载了哪些职责-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;如果 System Prompt 越来越长，你会怎么处理？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;System Prompt 在 Agent 系统中承载了哪些职责？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;a href=&quot;#system-prompt-在-agent-系统中承载了哪些职责如果-system-prompt-越来越长你会怎么处理-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？&lt;a href=&quot;#system-prompt-在-agent-系统中承载了哪些职责如果-system-prompt-越来越长你会怎么处理-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2296面试问答System Prompt 就是 Agent 的”操作系统”，所有行为的底层规则都写在这里面。简单理解：每次你跟 ChatGPT、Cursor 这类 AI 工具对话时，你看到的只是 User Prompt（你的提问），但在你看不见的地方，开发者已经预先塞了一大段”隐藏指令”告诉模型该怎么表现，这段隐藏指令就是 System Prompt。Agent 系统比普通聊天复杂得多，所以它的 System Prompt 也更长、职责更重。它承载的职责可以归成五类：1）角色定义和行为准则：告诉模型”你是谁”，比如你是一个编程助手、客服机器人还是数据分析师，同时约束它的语气、风格和边界。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;2） 工具使用规范和约束：Agent 最核心的能力是”能调用工具”（读文件、跑命令、搜索网页等），System Prompt 要告诉模型有哪些工具可用、每个工具怎么调、什么场景该用哪个。&lt;/p&gt;&lt;p&gt;3） 输出格式要求：规定模型以什么格式回复，比如 JSON、还是 markdown？消息标签怎么打、多通道消息怎么路由、静默回复用什么标记等。&lt;/p&gt;&lt;p&gt;4） 安全与权限控制：设定模型不能做什么，比如不能执行危险命令、不能泄露内部配置、不能擅自做破坏性操作等。这相当于给 AI 划红线。&lt;/p&gt;&lt;p&gt;5） 上下文信息补充：把当前运行环境的关键信息（工作目录、当前时间、用户身份、技能清单）告诉模型，让它的回答更贴合当前场景。至于 System Prompt 越来越长怎么办，核心策略就三个字：拆、选、扔。拆，是把 System Prompt 按职责拆成独立模块，每个模块管一件事。选，是根据当前任务场景只注入相关模块，不需要的不塞进去。扔，是把稳定不变的知识从 prompt 里移出去，放到外部文件或知识库里，让 Agent 需要的时候通过工具调用自己去读。&lt;/p&gt;&lt;p&gt;模块化组装方案以 OpenClaw 为例，它的 System Prompt 不是一整坨字符串，而是拆成了十几个独立模块，每次请求时按需拼接。这些模块可以分成三层来理解：第一层：基础身份与安全（每次必加）身份声明：一句话告诉模型”你是谁”，这是整个 prompt 的锚点安全红线：写明不能自我复制、不能绕过安全机制、不能追求超出用户请求的目标工具列表：根据权限策略过滤后，列出当前可用的工具及调用规范工具调用风格：低风险操作不用解释直接调、敏感操作要先跟用户确认第二层：场景能力模块（按需加载）技能提示：告诉 Agent “你有哪些预装技能可以激活”，类似手机里的 App 列表记忆召回：指导模型在回答前先搜索历史记忆，避免”失忆”消息路由：跨通道（Signal、Telegram、Discord 等）发消息的规则语音合成：只有开启了 TTS 功能才注入第三层：动态运行时上下文（每次请求动态生成）当前时间、工作目录、操作系统、shell 类型等环境信息授权白名单用户列表沙箱信息（如果 Agent 跑在 Docker 里，要告诉它路径映射关系）项目配置文件的内容（行为规则、人格语气、用户偏好等）还有个关键设计：分级加载。OpenClaw 用一个加载级别参数控制注入哪些模块：完整模式：加载全部模块，主 Agent 用精简模式：只保留工具列表、工作目录、运行时信息等核心模块，子 Agent 用（子 Agent 不需要消息路由、心跳这些能力）最小模式：只返回一句身份声明这样同一套代码就能服务不同角色，子 Agent 不用背负主 Agent 那几千 token 的冗余指令。这种拆法的好处：每个模块独立维护、独立测试。加一个新功能不用在一个几千行的字符串里找位置插入，直接新增一个模块就行。插件化扩展机制除了内置模块，OpenClaw 还支持第三方插件向 System Prompt 注入内容。原理是在 System Prompt 即将拼装完成时，系统广播一个信号：“我要构建 prompt 了，谁想加点东西？” 注册了这个钩子（Hook）的插件就能在这时候把自己的内容塞进去。插件有四种注入方式：替换系统提示：直接覆盖整个 System Prompt（后注册的覆盖先注册的）系统提示头部追加：拼到 System Prompt 开头，适合静态指令，能被 LLM 的 prompt cache 缓存系统提示尾部追加：拼到 System Prompt 末尾，同样可缓存对话层注入：放到用户消息前面，适合每轮可能变化的动态上下文比如一个”代码规范检查”插件，可以通过钩子把当前项目的编码规范注入到 System Prompt 里，Agent 写代码时就会自动遵守这些规范。不需要改任何核心代码。长 System Prompt 的性能影响System Prompt 越长，每次请求消耗的 token 就越多，响应延迟也会上去。所以”按需加载”不只是架构上好看，在成本上也是刚需。一个代码审查任务根本不需要知道消息路由规范，一个简单问答也不需要加载完整的工具列表。模块化拼接 + 分级加载，能让子 Agent 的 prompt 比主 Agent 短得多，直接节省 token 开销。同时，prompt cache（提示缓存）也是降本的重要手段。很多 LLM 提供商（如 Anthropic、OpenAI）支持对 System Prompt 中不变的部分做缓存，第二次请求如果 prompt 前缀没变，就不重复计算 token 费用。所以插件注入方式才区分了”系统提示层”和”对话层”：把稳定内容放系统提示里吃缓存，动态内容走对话层每轮注入。业界其他方案的对比Cursor 的做法是把大量规则写进 System Prompt，然后靠模型的长上下文能力硬扛，简单粗暴但有效。它的 System Prompt 非常长（包含工具说明、代码引用格式、提交规范等等），但因为 Cursor 面向的场景相对单一（代码编辑），所以每次都全量加载也还能接受。Devin 走的是另一个极端，把很多行为规则编码成代码逻辑而不是自然语言 prompt，减少对 System Prompt 的依赖，但灵活性就差一些，改规则要改代码，不像改 prompt 那样随时能调。LangChain 的 Agent 框架用模板化的方式组装 prompt，跟 OpenClaw 思路类似，也有 Callbacks 系统可以在生命周期各节点插入逻辑，但它的 Callbacks 更偏”观测”（日志、追踪），在 prompt 注入这个环节的灵活度不如 OpenClaw 的四字段钩子精细。其实模块化组装 + 按需加载已经成了 Agent 系统处理 System Prompt 的主流方案，OpenClaw 在这个基础上加了分级加载（promptMode）和四字段插件钩子，算是做到了比较好的平衡。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：System Prompt 里的安全规则真的靠谱吗？用户通过 prompt injection 绕过去怎么办？回答：纯靠 System Prompt 写安全规则肯定不够，模型层面的 prompt injection（用户故意构造输入来”欺骗”模型忽略之前的指令）防不胜防。所以关键操作必须在代码层面做硬校验，比如文件操作要做路径白名单检查，危险命令要在执行层面拦截，不能只靠 System Prompt 里写一句”禁止执行 rm -rf”就完事了。OpenClaw 的做法就是这样分层的：System Prompt 里有 Safety 模块写明安全红线（第一道防线，降低模型主动犯错的概率），但真正的保障在工具执行层。比如before_tool_call钩子可以在工具真正执行前拦截或修改参数，exec 工具有审批机制（用户要/approve才能执行敏感命令）。- &lt;strong&gt;提问&lt;/strong&gt;：模块化拼接 System Prompt 的时候，模块之间的顺序会影响模型的行为吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：会的，研究表明模型对 System Prompt 开头和结尾的内容关注度更高，中间部分容易被”稀释”（这跟人类阅读习惯类似）。所以最核心的身份定义和安全规则一般放在最前面，工具列表和格式要求放中间，动态上下文信息放后面。OpenClaw 的模块拼接顺序是固定写在buildAgentSystemPrompt函数里的：Identity → Tooling → Safety 在最前面，Skills → Memory 等能力模块在中间，Runtime 信息放最后。这个顺序符合”重要内容靠前”的通用原则。- &lt;strong&gt;提问&lt;/strong&gt;：如果把知识移到外部文件让 Agent 按需读取，模型读文件这个动作本身不也消耗 token 吗？怎么判断什么时候该放 prompt 里，什么时候该放外部？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：判断标准就两条。第一看频率，每次请求都需要用到的信息放 prompt 里，偶尔才用到的放外部。第二看体积，几十个 token 的信息直接放 prompt 里没关系，但如果是几千 token 的编码规范文档，放外部按需读取更划算。读文件虽然也消耗 token，但它是”用到才花钱”，比每次请求都带上要省得多。一般来说，超过 500 token 且使用频率低于 30% 的信息，放外部就更经济。OpenClaw 的 Skills 模块就是这个思路：System Prompt 里只放一个技能目录（很短），模型判断需要某个技能时再通过 read 工具去读完整的 SKILL.md 文件。- &lt;strong&gt;提问&lt;/strong&gt;：多个插件同时通过钩子注入 System Prompt，有没有冲突的可能？怎么解决？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：完全可能冲突。比如两个插件一个要求”输出格式用 JSON”，另一个要求”输出格式用 Markdown”，模型就懵了。OpenClaw 的解决方案是优先级机制：每个钩子注册时可以指定priority数值，数值越大优先级越高，执行越靠前。对于systemPrompt字段，合并逻辑是”后执行的覆盖先执行的”（即低优先级插件的 systemPrompt 会被高优先级的覆盖）；对于prependContext、prependSystemContext、appendSystemContext这些拼接型字段，则是按优先级顺序依次拼接，不存在覆盖。所以插件开发者需要注意：如果你要覆盖核心 prompt，就设高优先级 + 用systemPrompt字段；如果只是追加上下文，用拼接型字段就不会跟别人冲突。作者：Yes面试鸭官方- 你是一个专业的数据分析助手，具有以下特征：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Tool Calling Complete Link 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-tool_calling_complete_link_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-tool_calling_complete_link_%E6%95%B4%E7%90%86/</guid><description># Tool_Calling_Complete_Link ## 问题 Tool_Calling_Complete_Link ## 标准回答 # Tool Calling（工具调用）完整链路：定义、调用与回传 Tool Calling 的核心</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Tool_Calling_Complete_Link&lt;a href=&quot;#tool_calling_complete_link&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Tool_Calling_Complete_Link&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Tool Calling（工具调用）完整链路：定义、调用与回传&lt;a href=&quot;#tool-calling工具调用完整链路定义调用与回传&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Tool Calling 的核心链路就四步：&lt;strong&gt;定义工具 → LLM 决策 → 系统？
行 → 结果回传&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 工具定义&lt;a href=&quot;#1-工具定义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每个工具本质上是一段 JSON Schema，包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具的名字&lt;/li&gt;
&lt;li&gt;一段自然语言描述&lt;/li&gt;
&lt;li&gt;参数的类型约束&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM 不直接执行代码，只认这段 Schema 文本。示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;get_weather&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;查询指定城市的当前天气&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;properties&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;城市名称&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;required&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. LLM 决策调用&lt;a href=&quot;#2-llm-决策调用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;LLM 收到用户消息和工具列表后，若判断需要调用工具，返回一个特殊的 &lt;code&gt;tool_use&lt;/code&gt; 消息（OpenAI 用 &lt;code&gt;tool_calls&lt;/code&gt;，Anthropic 用 &lt;code&gt;tool_use&lt;/code&gt;），包含工具名和填好的参数 JSON。注意：LLM 只是”说”要调什么工具、传什么参数，它自己&lt;strong&gt;不会执行&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 系统执行&lt;a href=&quot;#3-系统执行&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;系统侧拿到 &lt;code&gt;tool_use&lt;/code&gt; 后，解析出工具名，找到本地注册的对应函数，传入参数执行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 结果回传&lt;a href=&quot;#4-结果回传&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;执行完拿到结果，包装成 &lt;code&gt;tool_result&lt;/code&gt; 消息追加到对话历史，再发回给 LLM。LLM 看到后有两种选择：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;信息够了 → 直接生成最终回答&lt;/li&gt;
&lt;li&gt;需要更多信息 → 再发一个 &lt;code&gt;tool_use&lt;/code&gt;，形成循环&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;完整链路&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 从 Function Calling 到 Tool Calling 的演进&lt;a href=&quot;#1-从-function-calling-到-tool-calling-的演进&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Function Calling&lt;/strong&gt;（OpenAI 2023.06）：一次只能调一个函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Calling&lt;/strong&gt;（2023.11）：支持 parallel tool calls，LLM 一次返回多个 tool_use，系统并行执行，一轮搞定多查询场景&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不同厂商在 Schema 处理上有差异：Gemini 不支持 &lt;code&gt;patternProperties&lt;/code&gt;，xAI 不支持 &lt;code&gt;minLength&lt;/code&gt;/&lt;code&gt;maxLength&lt;/code&gt;，OpenAI 要求参数顶层必须是 &lt;code&gt;type: &quot;object&quot;&lt;/code&gt;。工程上需要一层 Schema 归一化来抹平差异。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 工具结果的上下文管理&lt;a href=&quot;#2-工具结果的上下文管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;工具返回数据量可能很大（如代码搜索返回 50KB）。生产级系统一般做截断：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;head+tail 保留&lt;/strong&gt;：取开头和结尾各一部分，中间用省略标记替代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设置单条上限&lt;/strong&gt;：如占上下文窗口 20%-30% 或字符数硬上限&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 安全与权限控制&lt;a href=&quot;#3-安全与权限控制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;工具调用是 Agent 系统中最容易出安全问题的环节。LLM 可能被 prompt injection 诱导调用不该调的工具（删除文件、发送邮件）。生产环境至少做三件事：
&lt;strong&gt;工具白名单&lt;/strong&gt;：只暴露当前场景必需的工具
&lt;strong&gt;参数校验&lt;/strong&gt;：服务端做 Schema 验证和业务规则校验
&lt;strong&gt;敏感操作加人工确认&lt;/strong&gt;（如 LangChain 的 &lt;code&gt;HumanApprovalCallbackHandler&lt;/code&gt;）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 错误处理和重试&lt;a href=&quot;#4-错误处理和重试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;工具执行失败是常态（网络超时、API 限流、参数格式错误）。好的做法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;将错误信息包装成 &lt;code&gt;tool_result&lt;/code&gt; 返回给 LLM，让它自己决定怎么处理&lt;/li&gt;
&lt;li&gt;设置最大重试次数（一般 3-5 次），超时强制返回，避免死循环&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：LLM 返回的工具参数格式不对（少必填字段或类型不匹配），怎么处理？&lt;a href=&quot;#q1llm-返回的工具参数格式不对少必填字段或类型不匹配怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：两层防线。第一层：系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 &lt;code&gt;tool_result&lt;/code&gt; 返回给 LLM，大多数模型会自己修正参数重新调用。第二层：设置重试上限（一般 3 次），避免来回纠错死循环。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：parallel tool calls 并行执行多个工具时，其中一个失败怎么办？&lt;a href=&quot;#q2parallel-tool-calls-并行执行多个工具时其中一个失败怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：各工具的执行结果独立回传，失败的那个单独返回错误信息，成功的正常返回结果。所有 &lt;code&gt;tool_result&lt;/code&gt; 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，类似 &lt;code&gt;Promise.allSettled&lt;/code&gt; 的思路。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;a href=&quot;#q3tool-calling-和-rag-都是给-llm-补充外部信息它们的边界在哪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG&lt;/strong&gt;：提前检索、一次性注入，把相关文档片段塞进 prompt，适合知识查询类场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Calling&lt;/strong&gt;：按需执行、多轮交互，LLM 动态决定要不要调、调哪个，适合需要实时数据或执行副作用的场景（查数据库、发请求、操作文件系统）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;简单说：RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：怎么让 LLM 更准确地选择正确的工具？&lt;a href=&quot;#q4怎么让-llm-更准确地选择正确的工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;写好 description&lt;/strong&gt;：写清楚工具干什么、什么场景该用、什么场景不该用；参数的 description 也要写明白（如”用户的唯一标识符，必须是数字格式”）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制工具数量&lt;/strong&gt;：超过 15-20 个时，LLM 选择准确率明显下降。解决方案：分场景加载不同工具集，或做一层路由先判断意图再加载对应工具&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;Tool Calling（工具调用）完整链路：定义、调用与回传&lt;a href=&quot;#tool-calling工具调用完整链路定义调用与回传-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tool Calling 的核心链路就四步：&lt;strong&gt;定义工具 → LLM 决策 → 系统执行 → 结果回传&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。&lt;/li&gt;
&lt;li&gt;Tool Calling 就是这个”下命令再拿报告”的标准化流程。&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;1. 工具定义&lt;a href=&quot;#1-工具定义-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个工具本质上是一段 JSON Schema，包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具的名字&lt;/li&gt;
&lt;li&gt;一段自然语言描述&lt;/li&gt;
&lt;li&gt;参数的类型约束&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM 不直接执行代码，只认这段 Schema 文本。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;示例：&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;get_weather&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;查询指定城市的当前天气&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;properties&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;城市名称&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;required&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;LLM 收到用户消息和工具列表后，若判断需要调用工具，返回一个特殊的 &lt;code&gt;tool_use&lt;/code&gt; 消息（OpenAI 用 &lt;code&gt;tool_calls&lt;/code&gt;，Anthropic 用 &lt;code&gt;tool_use&lt;/code&gt;），包含工具名和填好的参数 JSON。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tool_Calling_Complete_Link&lt;/p&gt;&lt;p&gt;Tool Calling 的核心链路就四步：&lt;strong&gt;定义工具 → LLM 决策 → 系统执行 → 结果回传&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;1. 工具定义&lt;a href=&quot;#1-工具定义-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个工具本质上是一段 JSON Schema，包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具的名字&lt;/li&gt;
&lt;li&gt;一段自然语言描述&lt;/li&gt;
&lt;li&gt;参数的类型约束&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM 不直接执行代码，只认这段 Schema 文本。示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;get_weather&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;查询指定城市的当前天气&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;properties&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;城市名称&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;required&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;city&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;LLM 收到用户消息和工具列表后，若判断需要调用工具，返回一个特殊的 &lt;code&gt;tool_use&lt;/code&gt; 消息（OpenAI 用 &lt;code&gt;tool_calls&lt;/code&gt;，Anthropic 用 &lt;code&gt;tool_use&lt;/code&gt;），包含工具名和填好的参数 JSON。注意：LLM 只是”说”要调什么工具、传什么参数，它自己&lt;strong&gt;不会执行&lt;/strong&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;3. 系统执行&lt;a href=&quot;#3-系统执行-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;系统侧拿到 &lt;code&gt;tool_use&lt;/code&gt; 后，解析出工具名，找到本地注册的对应函数，传入参数执行。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;4. 结果回传&lt;a href=&quot;#4-结果回传-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;执行完拿到结果，包装成 &lt;code&gt;tool_result&lt;/code&gt; 消息追加到对话历史，再发回给 LLM。LLM 看到后有两种选择：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;信息够了 → 直接生成最终回答&lt;/li&gt;
&lt;li&gt;需要更多信息 → 再发一个 &lt;code&gt;tool_use&lt;/code&gt;，形成循环&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;完整链路&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Function Calling&lt;/strong&gt;（OpenAI 2023.06）：一次只能调一个函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Calling&lt;/strong&gt;（2023.11）：支持 parallel tool calls，LLM 一次返回多个 tool_use，系统并行执行，一轮搞定多查询场景&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不同厂商在 Schema 处理上有差异：Gemini 不支持 &lt;code&gt;patternProperties&lt;/code&gt;，xAI 不支持 &lt;code&gt;minLength&lt;/code&gt;/&lt;code&gt;maxLength&lt;/code&gt;，OpenAI 要求参数顶层必须是 &lt;code&gt;type: &quot;object&quot;&lt;/code&gt;。工程上需要一层 Schema 归一化来抹平差异。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行 → 结果回传**。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;1. 工具定义&lt;a href=&quot;#1-工具定义-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个工具本质上是一段 JSON Schema，包含：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;工具的名字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Tool Calling SpringAI 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-tool_calling_springai_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-tool_calling_springai_%E6%95%B4%E7%90%86/</guid><description># Tool_Calling_SpringAI ## 问题 Tool_Calling_SpringAI ## 标准回答 # 什么是工具调用 Tool Calling？ 如何利用 Spring AI 实现工具调用？ **Tool Callin</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Tool_Calling_SpringAI&lt;a href=&quot;#tool_calling_springai&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Tool_Calling_SpringAI&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是工具调用 Tool Calling？&lt;a href=&quot;#什么是工具调用-tool-calling&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;如何利用 Spring AI 实现工具调用？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tool Calling（工具调用）&lt;/strong&gt; 是一种让大语言模型能够请求调用外部函数或 API 的机制。模型不直接执行代码，而是输出结构化的调用请求（函数名和参数），由应用程序负责实际执行并将结果回传给模型。这使 LLM 能够获取实时信息、操作外部系统、执行计算等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在 Spring AI 中实现工具调用&lt;/strong&gt;：
&lt;strong&gt;定义工具（Function）&lt;/strong&gt;：使用 &lt;code&gt;@Tool&lt;/code&gt; 注解或实现 &lt;code&gt;Function&lt;/code&gt; 接口。
&lt;strong&gt;注册工具&lt;/strong&gt;：在 &lt;code&gt;ChatClient&lt;/code&gt; 或 &lt;code&gt;ChatModel&lt;/code&gt; 配置中注册工具 Bean。
&lt;strong&gt;发起请求&lt;/strong&gt;：模型自动识别需要调用工具的场景，返回 &lt;code&gt;ToolCall&lt;/code&gt; 对象。
&lt;strong&gt;执行与回传&lt;/strong&gt;：应用执行工具后，将结果作为 &lt;code&gt;ToolExecutionResult&lt;/code&gt; 消息追加到对话中，模型基于结果生成最终回答。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例代码&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Component&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WeatherService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Tool&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;查询指定城市的当前天气&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getWeather&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;city&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 实现天气查询逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;晴天，25°C&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 配置 ChatClient&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Bean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ChatClient&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chatClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ChatModel&lt;/span&gt;&lt;span&gt;&lt;span&gt; chatModel&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WeatherService&lt;/span&gt;&lt;span&gt; weatherService) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ChatClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;builder&lt;/span&gt;&lt;span&gt;(chatModel)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;defaultTools&lt;/span&gt;&lt;span&gt;(weatherService)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 使用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; response &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chatClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;北京今天天气怎么样？&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Spring AI 自动处理工具调用的完整链路：模型返回 &lt;code&gt;tool_calls&lt;/code&gt; → 框架执行对应方法 → 结果回填 → 模型生成最终回复。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. Tool Calling 的工作流程&lt;a href=&quot;#1-tool-calling-的工作流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一步&lt;/strong&gt;：用户消息发送给 LLM，同时附上可用工具的定义（JSON Schema）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二步&lt;/strong&gt;：LLM 判断是否需要调用工具。如果是，返回包含 &lt;code&gt;tool_calls&lt;/code&gt; 字段的响应（工具名和参数）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三步&lt;/strong&gt;：应用解析 &lt;code&gt;tool_calls&lt;/code&gt;，执行对应函数，获得结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第四步&lt;/strong&gt;：应用将结果作为 &lt;code&gt;tool&lt;/code&gt; 角色的消息再次发送给 LLM。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第五步&lt;/strong&gt;：LLM 基于工具结果生成最终回答，或继续请求调用其他工具。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Spring AI 的工具注册方式&lt;a href=&quot;#2-spring-ai-的工具注册方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;@Tool&lt;/code&gt; 注解&lt;/strong&gt;：在任意 Spring Bean 的方法上使用，框架自动扫描并注册。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;FunctionCallback&lt;/code&gt; 接口&lt;/strong&gt;：手动实现 &lt;code&gt;call&lt;/code&gt; 方法，通过 &lt;code&gt;ChatClient.Builder.defaultFunctions()&lt;/code&gt; 注册。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态工具&lt;/strong&gt;：通过 &lt;code&gt;Prompt&lt;/code&gt; 的 &lt;code&gt;options&lt;/code&gt; 参数动态传入工具实例。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 处理并行工具调用&lt;a href=&quot;#3-处理并行工具调用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Spring AI 支持模型一次返回多个 &lt;code&gt;tool_calls&lt;/code&gt;，框架默认串行执行，也可以配置线程池并行执行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 错误处理与重试&lt;a href=&quot;#4-错误处理与重试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;工具执行抛异常时，Spring AI 会将异常信息作为 &lt;code&gt;tool&lt;/code&gt; 消息返回给模型，让模型自行决定下一步（如修正参数重试或报告错误）。&lt;/li&gt;
&lt;li&gt;可以配置 &lt;code&gt;RetryTemplate&lt;/code&gt; 对工具调用进行重试。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：Tool Calling 和 Function Calling 是一回事吗？&lt;a href=&quot;#q1tool-calling-和-function-calling-是一回事吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：本质相同，但 OpenAI 在 2023 年 11 月将 &lt;code&gt;functions&lt;/code&gt; 参数升级为 &lt;code&gt;tools&lt;/code&gt;，支持并行调用和更丰富的工具类型（如代码解释器）。Spring AI 统一抽象为工具。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：如何处理工具返回的数据过大导致上下文超限？&lt;a href=&quot;#q2如何处理工具返回的数据过大导致上下文超限&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：Spring AI 不提供自动截断，但可以在工具方法内部对结果进行摘要、截断或只返回关键信息。也可以结合 Spring AI 的 &lt;code&gt;Advice&lt;/code&gt; 对工具结果进行后处理。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：如何让模型在特定条件下才调用工具？&lt;a href=&quot;#q3如何让模型在特定条件下才调用工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：通过 &lt;code&gt;@Tool&lt;/code&gt; 的 &lt;code&gt;description&lt;/code&gt; 写清楚工具的适用场景，并利用 System Prompt 引导模型的行为。复杂场景可自定义 &lt;code&gt;ToolCallingChatClient&lt;/code&gt; 进行前置判断。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Spring AI 简化了 Tool Calling 的集成，开发者只需定义带 &lt;code&gt;@Tool&lt;/code&gt; 注解的方法，框架自动完成函数调用链路。这为构建具备行动能力的智能 Agent 提供了基础。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是工具调用 Tool Calling？&lt;a href=&quot;#什么是工具调用-tool-calling-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;如何利用 Spring AI 实现工具调用？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Tool Calling（工具调用）&lt;/strong&gt; 是一种让大语言模型能够请求调用外部函数或 API 的机制。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模型不直接执行代码，而是输出结构化的调用请求（函数名和参数），由应用程序负责实际执行并将结果回传给模型。&lt;/li&gt;
&lt;li&gt;这使 LLM 能够获取实时信息、操作外部系统、执行计算等。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tool_Calling_SpringAI&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;什么是工具调用 Tool Calling？如何利用 Spring AI 实现工具调用？&lt;a href=&quot;#什么是工具调用-tool-calling如何利用-spring-ai-实现工具调用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;
&lt;section&gt;&lt;h2&gt;核心回答&lt;a href=&quot;#核心回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Tool Calling（工具调用）&lt;/strong&gt; 是一种让大语言模型能够请求调用外部函数或 API 的机制。模型不直接执行代码，而是输出结构化的调用请求（函数名和参数），由应用程序负责实际执行并将结果回传给模型。这使 LLM 能够获取实时信息、操作外部系统、执行计算等。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 Spring AI 中实现工具调用&lt;/strong&gt;：
&lt;strong&gt;定义工具（Function）&lt;/strong&gt;：使用 &lt;code&gt;@Tool&lt;/code&gt; 注解或实现 &lt;code&gt;Function&lt;/code&gt; 接口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注册工具&lt;/strong&gt;：在 &lt;code&gt;ChatClient&lt;/code&gt; 或 &lt;code&gt;ChatModel&lt;/code&gt; 配置中注册工具 Bean。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;发起请求&lt;/strong&gt;：模型自动识别需要调用工具的场景，返回 &lt;code&gt;ToolCall&lt;/code&gt; 对象。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何利用 Spring AI 实现工具调用？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tool Calling（工具调用）&lt;/strong&gt; 是一种让大语言模型能够请求调用外部函数或 API 的机制。模型不直接执行代码，而是输出结构化的调用请求（函数名和参数），由应用程序负责实际执行并将结果回传给模型。这使 LLM 能够获取实时信息、操作外部系统、执行计算等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 Spring AI 中实现工具调用&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义工具（Function）&lt;/strong&gt;：使用 &lt;code&gt;@Tool&lt;/code&gt; 注解或实现 &lt;code&gt;Function&lt;/code&gt; 接口。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注册工具&lt;/strong&gt;：在 &lt;code&gt;ChatClient&lt;/code&gt; 或 &lt;code&gt;ChatModel&lt;/code&gt; 配置中注册工具 Bean。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Vector Search Metrics 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-vector_search_metrics_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-vector_search_metrics_%E6%95%B4%E7%90%86/</guid><description># Vector_Search_Metrics ## 问题 Vector_Search_Metrics ## 标准回答 # 向量搜索方法：余弦相似度、欧几里得距离、曼哈顿距离 向量搜索的核心是衡量两个向量的相似程度，三种常见方法各有侧重： </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Vector_Search_Metrics&lt;a href=&quot;#vector_search_metrics&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Vector_Search_Metrics&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;向量搜索方法：余弦相似度、欧几里得距离、曼哈顿距离&lt;a href=&quot;#向量搜索方法余弦相似度欧几里得距离曼哈顿距离&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;向量搜索的核心是衡量两个向量的相似程度，三种常见方法各有侧重：&lt;/p&gt;&lt;p&gt;| 方法 | 原理 | 取值范围 | 适用场景 |
|---？
—|------|----------|----------|
| &lt;strong&gt;余弦相似度&lt;/strong&gt; | 计算两个向量的夹角，只看方向不看长度 | -1 到 1（1 表示完全同向） | 文本语义检索、推荐系统 |
| &lt;strong&gt;欧几里得距离&lt;/strong&gt; | 空间中两点之间的直线距离（勾股定理） | ≥ 0（越小越相似） | 图像检索、人脸识别 |
| &lt;strong&gt;曼哈顿距离&lt;/strong&gt; | 各维度差值绝对值之和（街区距离） | ≥ 0（越小越相似） | 网格坐标、稀疏高维数据 |&lt;/p&gt;&lt;p&gt;&lt;strong&gt;选型逻辑&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文本、推荐系统 → 余弦相似度&lt;/li&gt;
&lt;li&gt;图像、视频检索 → 欧氏距离&lt;/li&gt;
&lt;li&gt;网格坐标、稀疏高维数据 → 曼哈顿距离&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 数学公式与计算复杂度&lt;a href=&quot;#1-数学公式与计算复杂度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;假设有两个 n 维向量 A 和 B：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;余弦相似度&lt;/strong&gt;：&lt;code&gt;cos(θ) = (A·B) / (|A|×|B|)&lt;/code&gt;，需计算点积和模长。向量数据库（如 Faiss、Milvus）通常先对向量做 L2 归一化，归一化后余弦相似度等价于点积，可省去模长计算。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;欧氏距离&lt;/strong&gt;：&lt;code&gt;√Σ(Ai - Bi)²&lt;/code&gt;，实际检索时常省略开根号，直接比较平方和以减少计算。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;曼哈顿距离&lt;/strong&gt;：&lt;code&gt;Σ|Ai - Bi|&lt;/code&gt;，计算最简单，无乘法和开方，在高维稀疏场景效率最高。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 不同场景的选型考量&lt;a href=&quot;#2-不同场景的选型考量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文本语义检索&lt;/strong&gt;：Embedding 模型输出的向量长度本身无业务含义（长文本 vs 短文本不影响语义），只关心方向，因此余弦相似度是默认选择。OpenAI 的 text-embedding-ada-002、BGE、M3E 等模型均建议使用余弦相似度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图像检索&lt;/strong&gt;：ResNet、CLIP 等视觉模型提取的特征向量，数值大小本身携带像素强度、纹理密度等信息。人脸识别领域（如 ArcFace、CosFace）虽名字带”Cos”，但推理时用欧氏距离效果更稳定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐系统&lt;/strong&gt;：用户点击、购买等行为天然是 0/1 稀疏向量，曼哈顿距离对个别维度的极端值不敏感，鲁棒性优于欧氏距离。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 向量数据库的索引加速&lt;a href=&quot;#3-向量数据库的索引加速&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;暴力遍历 1 亿条向量不可行，需建索引：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IVF 系列&lt;/strong&gt;：将向量空间切分成 1000-10000 个聚类中心，查询时只在最近的几个聚类中搜索。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HNSW&lt;/strong&gt;：构建多层图结构，高层稀疏跳跃、低层密集精确（Pinecone、Qdrant 默认使用）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PQ 量化&lt;/strong&gt;：将向量切分为子空间，每个子空间量化为码本，可压缩 32 倍，精度损失可控。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些索引算法与距离度量正交，IVF 可搭配余弦、HNSW 可搭配欧氏，只需在建索引和查询时保持一致。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 实际踩坑经验&lt;a href=&quot;#4-实际踩坑经验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;向量未归一化就用余弦相似度&lt;/strong&gt;：结果会很诡异。需先对向量做 L2 归一化再存入向量库。
&lt;strong&gt;欧氏距离对数值尺度敏感&lt;/strong&gt;：若某几个维度的数值特别大，会主导距离。建议先做 z-score 标准化，让各维度方差一致。
&lt;strong&gt;维度灾难&lt;/strong&gt;：当维度超过几百维，所有向量之间的距离趋于相等，区分度变差。此时降维或换用近似算法比纠结距离度量更重要。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：余弦相似度和欧氏距离在归一化向量上是等价的，为什么？&lt;a href=&quot;#q1余弦相似度和欧氏距离在归一化向量上是等价的为什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：归一化后所有向量模长为 1。欧氏距离平方 &lt;code&gt;|A-B|² = |A|² + |B|² - 2A·B = 2 - 2A·B&lt;/code&gt;，而余弦相似度就是 A·B。两者单调递减，排序结果完全一致。因此很多向量库内部会强制归一化，统一用点积计算，还能利用 SIMD 指令加速。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：为什么曼哈顿距离对高维稀疏数据更友好？&lt;a href=&quot;#q2为什么曼哈顿距离对高维稀疏数据更友好&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：稀疏向量大部分维度为 0，有值的维度可能差异很大。欧氏距离会平方放大差异（差 10 → 贡献 100），少数极端维度主导距离；曼哈顿距离只是线性累加（差 10 → 贡献 10），对稀疏数据更稳定。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：实际业务中如何选择距离度量？&lt;a href=&quot;#q3实际业务中如何选择距离度量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;：
优先看 Embedding 模型的官方推荐（大多数文本模型建议余弦相似度）
如果是自己训练的模型，看训练时 loss 函数用的什么度量，推理时保持一致
拿不准时跑 A/B 测试，用业务指标决定，不要凭感觉猜测&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;向量搜索方法：余弦相似度、欧几里得距离、曼哈顿距离&lt;a href=&quot;#向量搜索方法余弦相似度欧几里得距离曼哈顿距离-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;向量搜索的核心是衡量两个向量的相似程度，三种常见方法各有侧重：&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;原理&lt;/th&gt;&lt;th&gt;取值范围&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;余弦相似度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;计算两个向量的夹角，只看方向不看长度&lt;/td&gt;&lt;td&gt;-1 到 1（1 表示完全同向）&lt;/td&gt;&lt;td&gt;文本语义检索、推荐系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;欧几里得距离&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;空间中两点之间的直线距离（勾股定理）&lt;/td&gt;&lt;td&gt;≥ 0（越小越相似）&lt;/td&gt;&lt;td&gt;图像检索、人脸识别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;曼哈顿距离&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;各维度差值绝对值之和（街区距离）&lt;/td&gt;&lt;td&gt;≥ 0（越小越相似）&lt;/td&gt;&lt;td&gt;网格坐标、稀疏高维数据&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;选型逻辑&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文本、推荐系统 → 余弦相似度&lt;/li&gt;
&lt;li&gt;图像、视频检索 → 欧氏距离&lt;/li&gt;
&lt;li&gt;网格坐标、稀疏高维数据 → 曼哈顿距离&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;假设有两个 n 维向量 A 和 B：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;余弦相似度&lt;/strong&gt;：&lt;code&gt;cos(θ) = (A·B) / (|A|×|B|)&lt;/code&gt;，需计算点积和模长。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;向量数据库（如 Faiss、Milvus）通常先对向量做 L2 归一化，归一化后余弦相似度等价于点积，可省去模长计算。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;欧氏距离&lt;/strong&gt;：&lt;code&gt;√Σ(Ai - Bi)²&lt;/code&gt;，实际检索时常省略开根号，直接比较平方和以减少计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;曼哈顿距离&lt;/strong&gt;：&lt;code&gt;Σ|Ai - Bi|&lt;/code&gt;，计算最简单，无乘法和开方，在高维稀疏场景效率最高。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;2. 不同场景的选型考量&lt;a href=&quot;#2-不同场景的选型考量-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文本语义检索&lt;/strong&gt;：Embedding 模型输出的向量长度本身无业务含义（长文本 vs 短文本不影响语义），只关心方向，因此余弦相似度是默认选择。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Vector_Search_Metrics&lt;/p&gt;&lt;p&gt;向量搜索的核心是衡量两个向量的相似程度，三种常见方法各有侧重：&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;原理&lt;/th&gt;&lt;th&gt;取值范围&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;余弦相似度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;计算两个向量的夹角，只看方向不看长度&lt;/td&gt;&lt;td&gt;-1 到 1（1 表示完全同向）&lt;/td&gt;&lt;td&gt;文本语义检索、推荐系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;欧几里得距离&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;空间中两点之间的直线距离（勾股定理）&lt;/td&gt;&lt;td&gt;≥ 0（越小越相似）&lt;/td&gt;&lt;td&gt;图像检索、人脸识别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;曼哈顿距离&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;各维度差值绝对值之和（街区距离）&lt;/td&gt;&lt;td&gt;≥ 0（越小越相似）&lt;/td&gt;&lt;td&gt;网格坐标、稀疏高维数据&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;选型逻辑&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文本、推荐系统 → 余弦相似度&lt;/li&gt;
&lt;li&gt;图像、视频检索 → 欧氏距离&lt;/li&gt;
&lt;li&gt;网格坐标、稀疏高维数据 → 曼哈顿距离&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;假设有两个 n 维向量 A 和 B：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;余弦相似度&lt;/strong&gt;：&lt;code&gt;cos(θ) = (A·B) / (|A|×|B|)&lt;/code&gt;，需计算点积和模长。向量数据库（如 Faiss、Milvus）通常先对向量做 L2 归一化，归一化后余弦相似度等价于点积，可省去模长计算。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;欧氏距离&lt;/strong&gt;：&lt;code&gt;√Σ(Ai - Bi)²&lt;/code&gt;，实际检索时常省略开根号，直接比较平方和以减少计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;曼哈顿距离&lt;/strong&gt;：&lt;code&gt;Σ|Ai - Bi|&lt;/code&gt;，计算最简单，无乘法和开方，在高维稀疏场景效率最高。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;section&gt;&lt;h3&gt;2. 不同场景的选型考量&lt;a href=&quot;#2-不同场景的选型考量-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文本语义检索&lt;/strong&gt;：Embedding 模型输出的向量长度本身无业务含义（长文本 vs 短文本不影响语义），只关心方向，因此余弦相似度是默认选择。OpenAI 的 text-embedding-ada-002、BGE、M3E 等模型均建议使用余弦相似度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图像检索&lt;/strong&gt;：ResNet、CLIP 等视觉模型提取的特征向量，数值大小本身携带像素强度、纹理密度等信息。人脸识别领域（如 ArcFace、CosFace）虽名字带”Cos”，但推理时用欧氏距离效果更稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;—|------|----------|----------|&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| &lt;strong&gt;余弦相似度&lt;/strong&gt; | 计算两个向量的夹角，只看方向不看长度 | -1 到 1（1 表示完全同向） | 文本语义检索、推荐系统 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| &lt;strong&gt;欧几里得距离&lt;/strong&gt; | 空间中两点之间的直线距离（勾股定理） | ≥ 0（越小越相似） | 图像检索、人脸识别 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;| &lt;strong&gt;曼哈顿距离&lt;/strong&gt; | 各维度差值绝对值之和（街区距离） | ≥ 0（越小越相似） | 网格坐标、稀疏高维数据 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;文本、推荐系统 → 余弦相似度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-agent-%E7%9A%84-context-window-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%83%E6%98%AF-agent-%E5%B7%A5%E7%A8%8B%E4%B8%AD%E6%9C%80%E6%A0%B8%E5%BF%83%E7%9A%84%E7%BA%A6%E6%9D%9F%E4%B9%8B%E4%B8%80-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-agent-%E7%9A%84-context-window-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%83%E6%98%AF-agent-%E5%B7%A5%E7%A8%8B%E4%B8%AD%E6%9C%80%E6%A0%B8%E5%BF%83%E7%9A%84%E7%BA%A6%E6%9D%9F%E4%B9%8B%E4%B8%80-_%E6%95%B4%E7%90%86/</guid><description># 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？ ## 问题 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？ ## 标准回答 </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？&lt;a href=&quot;#什么是-agent-的-context-window为什么它是-agent-工程中最核心的约束之一&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方
Agent 的上下文里塞了很多东西：System prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型留回复空间。一次Agent可能跑很多伦，每一轮的结果都追加到历史里，展开新页面打开2026-03-14  12:0300回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么OpenClaw 的 Context Window 管理机制主流的 Context 管理策略token 计算的坑&lt;/p&gt;&lt;p&gt;提问：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？提问：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？提问：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813223. 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/p&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方
Agent 的上下文里塞了很多东西：System prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型留回复空间。一次Agent可能跑很多伦，每一轮的结果都追加到历史里，展开新页面打开2026-03-14  12:0300回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么OpenClaw 的 Context Window 管理机制主流的 Context 管理策略token 计算的坑&lt;/p&gt;&lt;p&gt;提问：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？提问：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？提问：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Agent 的 Context Window？&lt;a href=&quot;#什么是-agent-的-context-window&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;为什么它是 Agent 工程中最核心的约束之一？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Agent 的 Context Window？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;为什么它是 Agent 工程中最核心的约束之一？&lt;/li&gt;
&lt;li&gt;NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/p&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方
Agent 的上下文里塞了很多东西：System prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型留回复空间。一次Agent可能跑很多伦，每一轮的结果都追加到历史里，展开新页面打开2026-03-14  12:0300回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么OpenClaw 的 Context Window 管理机制主流的 Context 管理策略token 计算的坑&lt;/p&gt;&lt;p&gt;提问：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？提问：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？提问：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813223. 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/p&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方
Agent 的上下文里塞了很多东西：System prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型留回复空间。一次Agent可能跑很多伦，每一轮的结果都追加到历史里，展开新页面打开2026-03-14  12:0300回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么OpenClaw 的 Context Window 管理机制主流的 Context 管理策略token 计算的坑&lt;/p&gt;&lt;p&gt;提问：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？提问：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？提问：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Agent 的 Context Window？&lt;a href=&quot;#什么是-agent-的-context-window-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;为什么它是 Agent 工程中最核心的约束之一？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Agent 的 Context Window？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？&lt;a href=&quot;#什么是-agent-的-context-window为什么它是-agent-工程中最核心的约束之一-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方- Agent 的上下文里塞了很多东西：System prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型留回复空间。一次Agent可能跑很多伦，每一轮的结果都追加到历史里，展开新页面打开2026-03-14  12:0300回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么OpenClaw 的 Context Window 管理机制主流的 Context 管理策略token 计算的坑&lt;/p&gt;&lt;p&gt;提问：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？提问：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？提问：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813223. 什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2244面试问答Context Window 就是 LLM 单次请求能处理的最大 token 数（token 是模型处理文本的最小单位，英文大约 1 token ≈ 4 个字符，中文 1 个汉字通常 2-3 个 token），决定了你能”喂”给模型多少信息。因为 Agent 的上下文里得塞的东西太多了：System Prompt、工具定义列表、完整对话历史、每次工具调用的入参和返回结果，还得给模型回复留空间。一次 Agent 运行可能跑几十轮，每一轮工具调用的结果都会追加到历史里，context 像滚雪球一样越来越大。这就是它成为 Agent 工程中最核心约束的原因：算力够，但是装不下那么多信息。一旦超出窗口，要么直接报错中断任务，要么被迫裁剪历史导致关键信息丢失，Agent 的行为就会变得不可预测。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Context Window 里到底塞了什么要理解为什么 Context 这么容易爆，得先搞清楚一次 Agent 请求里到底塞了哪些内容。拿一个典型的编程 Agent 来说：System Prompt 通常就有 2000-5000 token，包含角色设定、行为约束、输出格式要求。工具定义也不小，每个工具的 JSON Schema 描述大概 200-500 token，注册 20 个工具就是 4000-10000 token。这两块是固定开销，每次请求都得带。真正吃 token 的是对话历史。Agent 每调一次工具，history 里就多两条消息：一条是 LLM 的 tool_call 请求，一条是工具的执行结果。如果工具返回的是一整个文件的内容，一条消息就可能占掉 3000-8000 token。跑 10 轮下来，对话历史轻松突破 50K token。OpenClaw 在src/agents/context.ts里把这些组成部分拆分得很清楚，按优先级管理每一块的空间占用。OpenClaw 的 Context Window 管理机制OpenClaw 通过多个来源确定窗口大小，优先级从高到低是：modelsConfig里用户显式指定的值 &amp;gt; 从模型注册表自动发现的值 &amp;gt; 默认的 128K token。同时可以用agents.defaults.contextTokens做全局上限截断。系统设了两道防线：1）硬下限CONTEXT_WINDOW_HARD_MIN_TOKENS = 16,000，低于这个值直接拒绝运行，因为 Agent 在这么小的窗口里基本没法正常工作2）软告警CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32,000，低于这个值会警告用户可能影响效果当检测到 context overflow 时，OpenClaw 按优先级逐步处理：先尝试compaction，把早期的对话历史压缩成摘要再尝试截断过大的 tool result，比如一个文件读取返回了 5000 行，只保留头尾加摘要最后才报错建议用户/reset或换更大窗口的模型。这种渐进式降级比直接截断要优雅得多。主流的 Context 管理策略除了 OpenClaw 的做法，业界还有几种常见方案：1）滑动窗口：只保留最近 N 轮对话，早期的直接丢掉。实现最简单，但容易丢失任务关键信息，比如用户最初的需求描述2）摘要压缩：用一次额外的 LLM 调用把长对话压缩成一段摘要。效果好，但有额外的延迟和 token 成本，压缩过程本身也可能丢失细节3）分层存储：把不同类型的上下文分优先级，System Prompt 和最近 2 轮永远保留，中间的历史做摘要，工具返回的大文本做截断4）外部检索：把历史存到向量数据库，每轮只从里面检索最相关的片段填入 context。Retrieval-augmented 的思路，适合超长会话实际生产中一般是混合使用，不会只依赖单一策略。token 计算的坑token 数不等于字符数，也不等于词数，这中间有不少坑。英文文本平均 1 个 token 约等于 4 个字符，中文文本 1 个汉字通常会被切成 2-3 个 token。同样一段中文内容，token 开销比等长的英文内容高 2-3 倍。更麻烦的是，不同模型的 tokenizer 不一样。同一段文本在 GPT 和 Claude 里算出来的 token 数可能差 10%-20%。所以你不能简单地拿一个 tokenizer 算完就完了，得根据实际使用的模型来校准。OpenClaw 对此的做法是用各模型对应的 tokenizer 做精确计算，同时留出 10% 的安全余量，防止因为计算误差导致请求被截断。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果你要实现一个 compaction 机制，把历史对话压缩成摘要，你会怎么设计这个摘要的格式？哪些信息一定不能丢？回答：摘要至少得保留三类信息：用户的原始任务目标、已经完成了哪些关键步骤、当前的执行状态和中间产物。比如 Agent 正在调试一个 bug，摘要得写清楚”用户报告了 NPE 异常，已经定位到是 UserService 第 87 行空指针，尝试了加 null check 但测试仍然失败”。格式上建议用结构化文本，把这三类信息分块标注，方便 LLM 快速抓到重点。最忌讳的是丢了任务目标，那 Agent 压缩完就不知道自己在干嘛了。- &lt;strong&gt;提问&lt;/strong&gt;：不同模型的 Context Window 差异很大，你在做 Agent 产品的时候怎么处理这种兼容性问题？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：核心思路是做自适应。在 Agent 启动时先查模型注册表拿到窗口大小，然后动态计算固定开销占多少、留给对话历史的空间有多少。如果用户选了个 8K 窗口的小模型，就得更激进地做压缩，甚至限制可注册的工具数量。OpenClaw 的做法是设了硬下限 16K token，低于这个值直接拒绝运行，因为再怎么压缩也保证不了质量。上层可以给用户一个推荐清单，标明每个模型适合跑什么复杂度的任务。- &lt;strong&gt;提问&lt;/strong&gt;：工具返回结果特别大的时候，比如读了一个 1 万行的日志文件，你怎么处理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：直接全塞进 context 肯定不行，1 万行日志可能就 30K-50K token，一次就把窗口吃大半。处理的思路是按需截断加智能提取。最简单的是设一个 tool result 的 token 上限，超了就保留头尾各几百行加一个”中间省略 N 行”的标记。更聪明的做法是在截断前先让 LLM 做一轮 relevance extraction（相关性提取），只留跟当前任务相关的内容。OpenClaw 在 context-window-guard 里就有类似的处理，优先截断大的 tool result，因为这部分最”胖”也最容易压缩。作者：Yes面试鸭官方&lt;/li&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>什么是 Re Reading？如何基于 Spring AI 实现 Re Reading Advisor？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-re-reading-%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E-spring-ai-%E5%AE%9E%E7%8E%B0-re-reading-advisor-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-re-reading-%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E-spring-ai-%E5%AE%9E%E7%8E%B0-re-reading-advisor-_%E6%95%B4%E7%90%86/</guid><description># 什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？ ## 问题 什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？ ## 标准回</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;a href=&quot;#什么是-re-reading如何基于-spring-ai-实现-re-reading-advisor&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的。不过，这种方法会因为重复处理输入导致成本加倍，所以在面向 C 端开放的应用中需要谨慎使用。在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：1）创建自定义 Advisor 类：该类需要同时实现CallAroundAdvisor（用于同步请求）和StreamAroundAdvisor（用于流式请求）接口，让该类更通用&lt;/p&gt;&lt;p&gt;(在 Spring AI 1.0 版本中，上述两个接口需要更改为CallAdvisor和StreamAdvisor)2）修改用户提示词：在 Advisor 的前置处理逻辑中（例如aroundCall或aroundStream方法调用之前），对用户的原始输入文本进行改写。 改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读，通过看源码能够看到提示词：▼markdown复制代码{Input_Query}&lt;/p&gt;&lt;p&gt;Read the question again: {Input_Query}其中，{Input_Query}是用户原始的提问内容。&lt;/p&gt;&lt;p&gt;3） 传递给模型：将改写后的提示词传递给大语言模型进行处理。
对复杂问题，重复阅读，让模型能够更好理解，从而生成更加准确的答案&lt;/p&gt;&lt;p&gt;Spring AI实现&lt;/p&gt;&lt;p&gt;1.可以通过自定义Advisor类进行实现&lt;/p&gt;&lt;p&gt;2.在拦截之后进行修改提示词&lt;/p&gt;&lt;p&gt;改写格式一般是将原始输入重新重复一遍（让模型再次读取一遍）&lt;/p&gt;&lt;p&gt;3.展开新页面打开2026-03-18  16:5200回复迷途者之博士退学中特训营重读是一种让LLM重新阅读问题，从而提高LLM推理能力的技术，核心思想就是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的，不过这种方法会因为重复处理请求导致api成本加倍，所以面对C端应用时需要谨慎使用。然后，我在项展开新页面打开2025-12-22  20:2600回复我一定要找到工作Re-Reading(重读)，核心思想是，对于复杂问题，让ai重复阅读一次问题，有助于模型更好地理解我们的问题，从而生成更准确的答案。缺点是：重复处理输入导致成本加倍，所以在面向 C端开放的应用中需要谨慎使用。在SpringAI中，可以通过自展开新页面打开2025-11-29  16:2600回复yyc什么是 Re-Reading?如何基于 Spring Al 实现 Re-Reading Advisor?Re-Reading（Re2）是通过让大语言模型重读问题提升推理能力的技术。核心思想是重复阅读帮助模型更好理解题意约束，生成更准确深入的回答。使用注意：文献证明有效，但因重复处理输展开新页面打开2025-11-13  17:2800回复XiCallAroundAdvidor以及StreamAroundAdvisor接口：展开新页面打开2025-09-23  12:5000回复面试鸭5102特训营Re-Reading也叫Read2，是指在AI遇到复杂问题的情况下，通过让AI重复阅读一次用户的提示词从而提高AI回复的准确度。&lt;/p&gt;&lt;p&gt;Read2的实现通过自定义一个advisor类，该advidor类实现CallAroundAdvidor以及StreamAroundAdvisor接口以及实现里面的方法，展开新页面打开2025-09-04  16:4000回复超大桶可乐特训营Re-Reading 是指在提示词中，显示的指示LLM重新阅读一遍用户的输入，这样可以让LLM的输出更准确。有文献研究表明这是一种有效的手段。具体实现时，通过定义一个ReReadingAdvisor，继承 BaseAdvisor 类，重写 before() 方法，将用户的提示修改为如下格展开新页面打开2025-08-26  15:0100回复拒绝内耗特训营ReReading简称Re2，实际上是一种提示词工程，它将用户的提示词重复了一遍，起到了一个强调的作用。我们可以利用 Advisor 接口，来实现一个Re-Reading Advisor，关键在于对用户的提示词进行修改。2025-08-04  18:0800回复云墨总结：Spring AI 的Re-reading（重读）Re-reading（重读）是 Spring AI 中用于对大模型返回的结果进行再次处理或解析的一种机制。核心作用：对 AI 模型生成的内容进行结构化提取或**格式转展开新页面打开2025-07-17  09:2600回复一口南瓜饼Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术&lt;/p&gt;&lt;p&gt;在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：&lt;/p&gt;&lt;p&gt;）创建自定义 Advisor 类：该类需要同时实现 CallAroundAdvisor（用于同步展开新页面打开2025-07-12  15:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？用到了哪些特性？上次浏览：2026-03-16 15:12:36你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？如何实现程序和 AI 大模型的集成？有哪些方式？Agent 死循环问题有遇到过吗？如何解决？如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？11764. 什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的。不过，这种方法会因为重复处理输入导致成本加倍，所以在面向 C 端开放的应用中需要谨慎使用。在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：1）创建自定义 Advisor 类：该类需要同时实现CallAroundAdvisor（用于同步请求）和StreamAroundAdvisor（用于流式请求）接口，让该类更通用&lt;/p&gt;&lt;p&gt;(在 Spring AI 1.0 版本中，上述两个接口需要更改为CallAdvisor和StreamAdvisor)2）修改用户提示词：在 Advisor 的前置处理逻辑中（例如aroundCall或aroundStream方法调用之前），对用户的原始输入文本进行改写。 改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读，通过看源码能够看到提示词：▼markdown复制代码{Input_Query}&lt;/p&gt;&lt;p&gt;Read the question again: {Input_Query}其中，{Input_Query}是用户原始的提问内容。&lt;/p&gt;&lt;p&gt;3） 传递给模型：将改写后的提示词传递给大语言模型进行处理。
对复杂问题，重复阅读，让模型能够更好理解，从而生成更加准确的答案&lt;/p&gt;&lt;p&gt;Spring AI实现&lt;/p&gt;&lt;p&gt;1.可以通过自定义Advisor类进行实现&lt;/p&gt;&lt;p&gt;2.在拦截之后进行修改提示词&lt;/p&gt;&lt;p&gt;改写格式一般是将原始输入重新重复一遍（让模型再次读取一遍）&lt;/p&gt;&lt;p&gt;3.展开新页面打开2026-03-18  16:5200回复迷途者之博士退学中特训营重读是一种让LLM重新阅读问题，从而提高LLM推理能力的技术，核心思想就是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的，不过这种方法会因为重复处理请求导致api成本加倍，所以面对C端应用时需要谨慎使用。然后，我在项展开新页面打开2025-12-22  20:2600回复我一定要找到工作Re-Reading(重读)，核心思想是，对于复杂问题，让ai重复阅读一次问题，有助于模型更好地理解我们的问题，从而生成更准确的答案。缺点是：重复处理输入导致成本加倍，所以在面向 C端开放的应用中需要谨慎使用。在SpringAI中，可以通过自展开新页面打开2025-11-29  16:2600回复yyc什么是 Re-Reading?如何基于 Spring Al 实现 Re-Reading Advisor?Re-Reading（Re2）是通过让大语言模型重读问题提升推理能力的技术。核心思想是重复阅读帮助模型更好理解题意约束，生成更准确深入的回答。使用注意：文献证明有效，但因重复处理输展开新页面打开2025-11-13  17:2800回复XiCallAroundAdvidor以及StreamAroundAdvisor接口：展开新页面打开2025-09-23  12:5000回复面试鸭5102特训营Re-Reading也叫Read2，是指在AI遇到复杂问题的情况下，通过让AI重复阅读一次用户的提示词从而提高AI回复的准确度。&lt;/p&gt;&lt;p&gt;Read2的实现通过自定义一个advisor类，该advidor类实现CallAroundAdvidor以及StreamAroundAdvisor接口以及实现里面的方法，展开新页面打开2025-09-04  16:4000回复超大桶可乐特训营Re-Reading 是指在提示词中，显示的指示LLM重新阅读一遍用户的输入，这样可以让LLM的输出更准确。有文献研究表明这是一种有效的手段。具体实现时，通过定义一个ReReadingAdvisor，继承 BaseAdvisor 类，重写 before() 方法，将用户的提示修改为如下格展开新页面打开2025-08-26  15:0100回复拒绝内耗特训营ReReading简称Re2，实际上是一种提示词工程，它将用户的提示词重复了一遍，起到了一个强调的作用。我们可以利用 Advisor 接口，来实现一个Re-Reading Advisor，关键在于对用户的提示词进行修改。2025-08-04  18:0800回复云墨总结：Spring AI 的Re-reading（重读）Re-reading（重读）是 Spring AI 中用于对大模型返回的结果进行再次处理或解析的一种机制。核心作用：对 AI 模型生成的内容进行结构化提取或**格式转展开新页面打开2025-07-17  09:2600回复一口南瓜饼Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术&lt;/p&gt;&lt;p&gt;在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：&lt;/p&gt;&lt;p&gt;）创建自定义 Advisor 类：该类需要同时实现 CallAroundAdvisor（用于同步展开新页面打开2025-07-12  15:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Re-Reading？&lt;a href=&quot;#什么是-re-reading&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Re-Reading？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/li&gt;
&lt;li&gt;VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的。不过，这种方法会因为重复处理输入导致成本加倍，所以在面向 C 端开放的应用中需要谨慎使用。在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：1）创建自定义 Advisor 类：该类需要同时实现CallAroundAdvisor（用于同步请求）和StreamAroundAdvisor（用于流式请求）接口，让该类更通用&lt;/p&gt;&lt;p&gt;(在 Spring AI 1.0 版本中，上述两个接口需要更改为CallAdvisor和StreamAdvisor)2）修改用户提示词：在 Advisor 的前置处理逻辑中（例如aroundCall或aroundStream方法调用之前），对用户的原始输入文本进行改写。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读，通过看源码能够看到提示词：▼markdown复制代码{Input_Query}&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Read the question again: {Input_Query}其中，{Input_Query}是用户原始的提问内容。&lt;/p&gt;&lt;p&gt;3） 传递给模型：将改写后的提示词传递给大语言模型进行处理。
对复杂问题，重复阅读，让模型能够更好理解，从而生成更加准确的答案&lt;/p&gt;&lt;p&gt;Spring AI实现&lt;/p&gt;&lt;p&gt;1.可以通过自定义Advisor类进行实现&lt;/p&gt;&lt;p&gt;2.在拦截之后进行修改提示词&lt;/p&gt;&lt;p&gt;改写格式一般是将原始输入重新重复一遍（让模型再次读取一遍）&lt;/p&gt;&lt;p&gt;3.展开新页面打开2026-03-18  16:5200回复迷途者之博士退学中特训营重读是一种让LLM重新阅读问题，从而提高LLM推理能力的技术，核心思想就是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的，不过这种方法会因为重复处理请求导致api成本加倍，所以面对C端应用时需要谨慎使用。然后，我在项展开新页面打开2025-12-22  20:2600回复我一定要找到工作Re-Reading(重读)，核心思想是，对于复杂问题，让ai重复阅读一次问题，有助于模型更好地理解我们的问题，从而生成更准确的答案。缺点是：重复处理输入导致成本加倍，所以在面向 C端开放的应用中需要谨慎使用。在SpringAI中，可以通过自展开新页面打开2025-11-29  16:2600回复yyc什么是 Re-Reading?如何基于 Spring Al 实现 Re-Reading Advisor?Re-Reading（Re2）是通过让大语言模型重读问题提升推理能力的技术。核心思想是重复阅读帮助模型更好理解题意约束，生成更准确深入的回答。使用注意：文献证明有效，但因重复处理输展开新页面打开2025-11-13  17:2800回复XiCallAroundAdvidor以及StreamAroundAdvisor接口：展开新页面打开2025-09-23  12:5000回复面试鸭5102特训营Re-Reading也叫Read2，是指在AI遇到复杂问题的情况下，通过让AI重复阅读一次用户的提示词从而提高AI回复的准确度。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Read2的实现通过自定义一个advisor类，该advidor类实现CallAroundAdvidor以及StreamAroundAdvisor接口以及实现里面的方法，展开新页面打开2025-09-04  16:4000回复超大桶可乐特训营Re-Reading 是指在提示词中，显示的指示LLM重新阅读一遍用户的输入，这样可以让LLM的输出更准确。有文献研究表明这是一种有效的手段。具体实现时，通过定义一个ReReadingAdvisor，继承 BaseAdvisor 类，重写 before() 方法，将用户的提示修改为如下格展开新页面打开2025-08-26  15:0100回复拒绝内耗特训营ReReading简称Re2，实际上是一种提示词工程，它将用户的提示词重复了一遍，起到了一个强调的作用。我们可以利用 Advisor 接口，来实现一个Re-Reading Advisor，关键在于对用户的提示词进行修改。2025-08-04  18:0800回复云墨总结：Spring AI 的Re-reading（重读）Re-reading（重读）是 Spring AI 中用于对大模型返回的结果进行再次处理或解析的一种机制。核心作用：对 AI 模型生成的内容进行结构化提取或**格式转展开新页面打开2025-07-17  09:2600回复一口南瓜饼Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：&lt;/p&gt;&lt;p&gt;）创建自定义 Advisor 类：该类需要同时实现 CallAroundAdvisor（用于同步展开新页面打开2025-07-12  15:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;p&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？用到了哪些特性？上次浏览：2026-03-16 15:12:36你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？如何实现程序和 AI 大模型的集成？有哪些方式？Agent 死循环问题有遇到过吗？如何解决？如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？11764. 什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的。不过，这种方法会因为重复处理输入导致成本加倍，所以在面向 C 端开放的应用中需要谨慎使用。在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：1）创建自定义 Advisor 类：该类需要同时实现CallAroundAdvisor（用于同步请求）和StreamAroundAdvisor（用于流式请求）接口，让该类更通用&lt;/p&gt;&lt;p&gt;(在 Spring AI 1.0 版本中，上述两个接口需要更改为CallAdvisor和StreamAdvisor)2）修改用户提示词：在 Advisor 的前置处理逻辑中（例如aroundCall或aroundStream方法调用之前），对用户的原始输入文本进行改写。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？&lt;a href=&quot;#什么是-re-reading如何基于-spring-ai-实现-re-reading-advisor-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？VIP中等后端编程导航标记分享131891Re-Reading (重读)，也称为 Re2，是一种通过让大语言模型重新阅读问题来提高其推理能力的技术。核心思想是，对于复杂问题，重复阅读和审视问题有助于模型更好地理解题意和约束，从而生成更准确、更深入的回答，有文献研究证明这是有一定效果的。不过，这种方法会因为重复处理输入导致成本加倍，所以在面向 C 端开放的应用中需要谨慎使用。在 Spring AI 中，可以通过自定义 Advisor 来实现 Re-Reading 功能：1）创建自定义 Advisor 类：该类需要同时实现CallAroundAdvisor（用于同步请求）和StreamAroundAdvisor（用于流式请求）接口，让该类更通用&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;(在 Spring AI 1.0 版本中，上述两个接口需要更改为CallAdvisor和StreamAdvisor)2）修改用户提示词：在 Advisor 的前置处理逻辑中（例如aroundCall或aroundStream方法调用之前），对用户的原始输入文本进行改写。 改写的格式通常是将原始输入重复一遍，并用明确的指令引导模型重新阅读，通过看源码能够看到提示词：▼markdown复制代码{Input_Query}&lt;/li&gt;
&lt;li&gt;Read the question again: {Input_Query}其中，{Input_Query}是用户原始的提问内容。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;3） 传递给模型：将改写后的提示词传递给大语言模型进行处理。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-spring-ai-%E6%8F%90%E5%87%BA%E7%9A%84%E6%A8%A1%E5%9D%97%E5%8C%96-rag-%E6%9E%B6%E6%9E%84-%E9%A2%84%E6%A3%80%E7%B4%A2-%E6%A3%80%E7%B4%A2%E5%92%8C%E5%90%8E%E6%A3%80%E7%B4%A2%E9%98%B6%E6%AE%B5%E5%90%84%E8%87%AA%E8%B4%9F%E8%B4%A3%E4%BB%80%E4%B9%88-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF-spring-ai-%E6%8F%90%E5%87%BA%E7%9A%84%E6%A8%A1%E5%9D%97%E5%8C%96-rag-%E6%9E%B6%E6%9E%84-%E9%A2%84%E6%A3%80%E7%B4%A2-%E6%A3%80%E7%B4%A2%E5%92%8C%E5%90%8E%E6%A3%80%E7%B4%A2%E9%98%B6%E6%AE%B5%E5%90%84%E8%87%AA%E8%B4%9F%E8%B4%A3%E4%BB%80%E4%B9%88-_%E6%95%B4%E7%90%86/</guid><description># 什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？ ## 问题 什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？ ## 标准回答 什么是 Spri</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？&lt;a href=&quot;#什么是-spring-ai-提出的模块化-rag-架构预检索检索和后检索阶段各自负责什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？VIP中等后端编程导航标记分享151441Spring AI 提出的模块化 RAG 架构是将整个检索增强生成过程分解为预检索、检索、检索后三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;&lt;p&gt;1） 预检索阶段 (Pre-Retrieval)：职责：接收用户的原始查询，并对其进行优化和转换，生成更适合后续检索的查询版本。组件：包括各种QueryTransformer，如RewriteQueryTransformer（改写查询使其更清晰）、TranslationQueryTransformer（翻译查询）、CompressionQueryTransformer（在多轮对话中压缩历史和当前问题）、以及MultiQueryExpander（将单查询扩展为多查询，提高召回）。&lt;/p&gt;&lt;p&gt;2） 检索阶段 (Retrieval)：职责：使用预检索阶段优化后的查询，从知识库中搜索并召回最相关的文档片段。组件：核心是DocumentRetriever（如VectorStoreDocumentRetriever），它负责执行相似性搜索并根据元数据过滤结果。如果涉及多源检索，还可能用到DocumentJoiner来合并结果。&lt;/p&gt;&lt;p&gt;3） 检索后阶段 (Post-Retrieval)：职责：对检索到的文档集进行进一步处理和优化，筛选出最适合提供给大模型的上下文，可以解决上下文丢失问题、上下文长度限制，并减少冗余内容。组件：可能包括文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供了DocumentPostProcessorAPI 来支持自定义的后处理逻辑，但目前并不成熟。
预检索就是在用户输入提示词的时候。对用户的提示词进行查询重写，多查询扩展，查询压缩等操作，最终输出增强的用户查询&lt;/p&gt;&lt;p&gt;检索中就是将用户的增强查询从知识库中的文档进行搜索，最终输出相关文档的过程，展开新页面打开2026-02-26  16:5400回复我一定要找到工作Sprin⁠g AI 官方声称‌提供了一个 “模块化” 的 RAG ‎架构，用于优化大模‌型回复的准确性。&lt;/p&gt;&lt;p&gt;简单来说，⁠就是把整个文档过滤‌检索阶段拆分为：检索前、检索时、检索‎后，分别针对每个阶‌段提供了可自定义的组件。&lt;/p&gt;&lt;p&gt;•	1在预检索阶段，系统接收用户的原始查询，可以通过&lt;strong&gt;查询重写、多查询扩展展开新页面打开2025-12-04  23:2000回复yyc什么是 Spring Al 提出的模块化 RAG 架构?预检索、检索和后检索阶段各自负责什么?Spring AI 模块化 RAG 架构将检索增强生成过程分解为三个核心阶段，每个阶段包含可配置组件以提升大模型响应准确性和灵活性：1. 预检索阶段 (Pre-Retrieval)&lt;strong&gt;展开新页面打开2025-11-13  17:2200回复云墨Spring AI 模块化 RAG 三阶段总结模块化 RAG 定义Spring AI 的 模块化 RAG（检索增强生成） 是一种将 RAG 流程拆分为独立、可插拔组件的技术架构。它通过灵活组合不同模块（如检索、查询改写、生成等），实现高度定制化的知识增强生成流程。三阶段演进展开新页面打开2025-07-04  22:5500回复晚夜微雨问海棠特训营Spring AI 提出的模块化 RAG 架构解析Spring AI 提出的模块化 RAG (Retrieval-Augmented Generation) 架构是一种将检索增强生成过程分解为三个明确阶段的框架，以提高系统的灵活性、可维护性和性能。模块化 RAG 的三个阶段展开新页面打开2025-06-07  20:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;市面上有哪些主流的 LLM Agent 框架？各自的特点是什么？AutoGPT 如何实现自主决策？什么是 A2A 协议，它的核心架构及主要组件有哪些？什么是查询重写？它有什么作用？如何基于 Spring AI 实现查询重写？什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？上次浏览：2026-03-16 15:11:49什么是工具调用 Tool Calling？如何利用 Spring AI 实现工具调用？上次浏览：2026-03-16 15:11:24什么是 ReAct？如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？上次浏览：2026-03-16 15:12:08什么是 OpenManus？它的实现原理是什么？什么是 CoT 思维链？如何实现 CoT 思维链？如何保证 AI 应用的性能和稳定性？11776. 什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？VIP中等后端编程导航标记分享151441Spring AI 提出的模块化 RAG 架构是将整个检索增强生成过程分解为预检索、检索、检索后三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;&lt;p&gt;1） 预检索阶段 (Pre-Retrieval)：职责：接收用户的原始查询，并对其进行优化和转换，生成更适合后续检索的查询版本。组件：包括各种QueryTransformer，如RewriteQueryTransformer（改写查询使其更清晰）、TranslationQueryTransformer（翻译查询）、CompressionQueryTransformer（在多轮对话中压缩历史和当前问题）、以及MultiQueryExpander（将单查询扩展为多查询，提高召回）。&lt;/p&gt;&lt;p&gt;2） 检索阶段 (Retrieval)：职责：使用预检索阶段优化后的查询，从知识库中搜索并召回最相关的文档片段。组件：核心是DocumentRetriever（如VectorStoreDocumentRetriever），它负责执行相似性搜索并根据元数据过滤结果。如果涉及多源检索，还可能用到DocumentJoiner来合并结果。&lt;/p&gt;&lt;p&gt;3） 检索后阶段 (Post-Retrieval)：职责：对检索到的文档集进行进一步处理和优化，筛选出最适合提供给大模型的上下文，可以解决上下文丢失问题、上下文长度限制，并减少冗余内容。组件：可能包括文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供了DocumentPostProcessorAPI 来支持自定义的后处理逻辑，但目前并不成熟。
预检索就是在用户输入提示词的时候。对用户的提示词进行查询重写，多查询扩展，查询压缩等操作，最终输出增强的用户查询&lt;/p&gt;&lt;p&gt;检索中就是将用户的增强查询从知识库中的文档进行搜索，最终输出相关文档的过程，展开新页面打开2026-02-26  16:5400回复我一定要找到工作Sprin⁠g AI 官方声称‌提供了一个 “模块化” 的 RAG ‎架构，用于优化大模‌型回复的准确性。&lt;/p&gt;&lt;p&gt;简单来说，⁠就是把整个文档过滤‌检索阶段拆分为：检索前、检索时、检索‎后，分别针对每个阶‌段提供了可自定义的组件。&lt;/p&gt;&lt;p&gt;•	1在预检索阶段，系统接收用户的原始查询，可以通过&lt;strong&gt;查询重写、多查询扩展展开新页面打开2025-12-04  23:2000回复yyc什么是 Spring Al 提出的模块化 RAG 架构?预检索、检索和后检索阶段各自负责什么?Spring AI 模块化 RAG 架构将检索增强生成过程分解为三个核心阶段，每个阶段包含可配置组件以提升大模型响应准确性和灵活性：1. 预检索阶段 (Pre-Retrieval)&lt;strong&gt;展开新页面打开2025-11-13  17:2200回复云墨Spring AI 模块化 RAG 三阶段总结模块化 RAG 定义Spring AI 的 模块化 RAG（检索增强生成） 是一种将 RAG 流程拆分为独立、可插拔组件的技术架构。它通过灵活组合不同模块（如检索、查询改写、生成等），实现高度定制化的知识增强生成流程。三阶段演进展开新页面打开2025-07-04  22:5500回复晚夜微雨问海棠特训营Spring AI 提出的模块化 RAG 架构解析Spring AI 提出的模块化 RAG (Retrieval-Augmented Generation) 架构是一种将检索增强生成过程分解为三个明确阶段的框架，以提高系统的灵活性、可维护性和性能。模块化 RAG 的三个阶段展开新页面打开2025-06-07  20:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;/strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Spring AI 提出的模块化 RAG 架构？&lt;a href=&quot;#什么是-spring-ai-提出的模块化-rag-架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;预检索、检索和后检索阶段各自负责什么？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;预检索、检索和后检索阶段各自负责什么？&lt;/li&gt;
&lt;li&gt;VIP中等后端编程导航标记分享151441Spring AI 提出的模块化 RAG 架构是将整个检索增强生成过程分解为预检索、检索、检索后三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？VIP中等后端编程导航标记分享151441Spring AI 提出的模块化 RAG 架构是将整个检索增强生成过程分解为预检索、检索、检索后三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/p&gt;&lt;p&gt;1） 预检索阶段 (Pre-Retrieval)：职责：接收用户的原始查询，并对其进行优化和转换，生成更适合后续检索的查询版本。组件：包括各种QueryTransformer，如RewriteQueryTransformer（改写查询使其更清晰）、TranslationQueryTransformer（翻译查询）、CompressionQueryTransformer（在多轮对话中压缩历史和当前问题）、以及MultiQueryExpander（将单查询扩展为多查询，提高召回）。&lt;/p&gt;&lt;p&gt;2） 检索阶段 (Retrieval)：职责：使用预检索阶段优化后的查询，从知识库中搜索并召回最相关的文档片段。组件：核心是DocumentRetriever（如VectorStoreDocumentRetriever），它负责执行相似性搜索并根据元数据过滤结果。如果涉及多源检索，还可能用到DocumentJoiner来合并结果。&lt;/p&gt;&lt;p&gt;3） 检索后阶段 (Post-Retrieval)：职责：对检索到的文档集进行进一步处理和优化，筛选出最适合提供给大模型的上下文，可以解决上下文丢失问题、上下文长度限制，并减少冗余内容。组件：可能包括文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供了DocumentPostProcessorAPI 来支持自定义的后处理逻辑，但目前并不成熟。- 预检索就是在用户输入提示词的时候。对用户的提示词进行查询重写，多查询扩展，查询压缩等操作，最终输出增强的用户查询&lt;/p&gt;&lt;p&gt;检索中就是将用户的增强查询从知识库中的文档进行搜索，最终输出相关文档的过程，展开新页面打开2026-02-26  16:5400回复我一定要找到工作Sprin⁠g AI 官方声称‌提供了一个 “模块化” 的 RAG ‎架构，用于优化大模‌型回复的准确性。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;简单来说，⁠就是把整个文档过滤‌检索阶段拆分为：检索前、检索时、检索‎后，分别针对每个阶‌段提供了可自定义的组件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？&lt;a href=&quot;#什么是-spring-ai-提出的模块化-rag-架构预检索检索和后检索阶段各自负责什么-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？VIP中等后端编程导航标记分享151441Spring AI 提出的模块化 RAG 架构是将整个检索增强生成过程分解为预检索、检索、检索后三个核心阶段，每个阶段包含可配置的组件，以提升大模型响应的准确性和灵活性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;1） 预检索阶段 (Pre-Retrieval)：职责：接收用户的原始查询，并对其进行优化和转换，生成更适合后续检索的查询版本。组件：包括各种QueryTransformer，如RewriteQueryTransformer（改写查询使其更清晰）、TranslationQueryTransformer（翻译查询）、CompressionQueryTransformer（在多轮对话中压缩历史和当前问题）、以及MultiQueryExpander（将单查询扩展为多查询，提高召回）。&lt;/p&gt;&lt;p&gt;2） 检索阶段 (Retrieval)：职责：使用预检索阶段优化后的查询，从知识库中搜索并召回最相关的文档片段。组件：核心是DocumentRetriever（如VectorStoreDocumentRetriever），它负责执行相似性搜索并根据元数据过滤结果。如果涉及多源检索，还可能用到DocumentJoiner来合并结果。&lt;/p&gt;&lt;p&gt;3） 检索后阶段 (Post-Retrieval)：职责：对检索到的文档集进行进一步处理和优化，筛选出最适合提供给大模型的上下文，可以解决上下文丢失问题、上下文长度限制，并减少冗余内容。组件：可能包括文档重排序、无关文档移除、文档内容压缩或摘要等。Spring AI 提供了DocumentPostProcessorAPI 来支持自定义的后处理逻辑，但目前并不成熟。- 预检索就是在用户输入提示词的时候。对用户的提示词进行查询重写，多查询扩展，查询压缩等操作，最终输出增强的用户查询&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;检索中就是将用户的增强查询从知识库中的文档进行搜索，最终输出相关文档的过程，展开新页面打开2026-02-26  16:5400回复我一定要找到工作Sprin⁠g AI 官方声称‌提供了一个 “模块化” 的 RAG ‎架构，用于优化大模‌型回复的准确性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%8A%E4%B8%8B%E6%96%87%E6%9F%A5%E8%AF%A2%E5%A2%9E%E5%BC%BA-%E5%AE%83%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8-%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E-spring-ai-%E5%AE%9E%E7%8E%B0%E4%B8%8A%E4%B8%8B%E6%96%87%E6%9F%A5%E8%AF%A2%E5%A2%9E%E5%BC%BA%E6%9D%A5%E5%A4%84%E7%90%86%E6%97%A0%E5%85%B3%E9%97%AE%E9%A2%98-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%8A%E4%B8%8B%E6%96%87%E6%9F%A5%E8%AF%A2%E5%A2%9E%E5%BC%BA-%E5%AE%83%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8-%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E-spring-ai-%E5%AE%9E%E7%8E%B0%E4%B8%8A%E4%B8%8B%E6%96%87%E6%9F%A5%E8%AF%A2%E5%A2%9E%E5%BC%BA%E6%9D%A5%E5%A4%84%E7%90%86%E6%97%A0%E5%85%B3%E9%97%AE%E9%A2%98-_%E6%95%B4%E7%90%86/</guid><description># 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？ ## 问题 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？ ## 标准回答 什么</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;a href=&quot;#什么是上下文查询增强它有什么作用如何基于-spring-ai-实现上下文查询增强来处理无关问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。 检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。
默认情况下，RetrievalAugmentationAdvisor检索增强顾问内部就使用了上下文查询增强，当它没有找到相关文档时，它会指示模型不要回答用户查询。这是一种保守的策略，可以防止模型在没有足够信息的情况下生成不准确的展开新页面打开2025-12-04  23:1400回复axing特训营什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？上下文查询增强是 RAG 的核心步骤，它把用户的原始查询和检索到的相关文档结合，生成一个增强Prompt提供给大模型，让模型基于外部知识生成更准确、更相关的回答。这样可以让 AI 回答展开新页面打开2025-11-04  18:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;市面上有哪些主流的 LLM Agent 框架？各自的特点是什么？AutoGPT 如何实现自主决策？什么是 A2A 协议，它的核心架构及主要组件有哪些？什么是查询重写？它有什么作用？如何基于 Spring AI 实现查询重写？什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？上次浏览：2026-03-16 15:11:49什么是工具调用 Tool Calling？如何利用 Spring AI 实现工具调用？上次浏览：2026-03-16 15:11:24什么是 ReAct？如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？上次浏览：2026-03-16 15:12:08什么是 OpenManus？它的实现原理是什么？什么是 CoT 思维链？如何实现 CoT 思维链？如何保证 AI 应用的性能和稳定性？11775. 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。 检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。
默认情况下，RetrievalAugmentationAdvisor检索增强顾问内部就使用了上下文查询增强，当它没有找到相关文档时，它会指示模型不要回答用户查询。这是一种保守的策略，可以防止模型在没有足够信息的情况下生成不准确的展开新页面打开2025-12-04  23:1400回复axing特训营什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？上下文查询增强是 RAG 的核心步骤，它把用户的原始查询和检索到的相关文档结合，生成一个增强Prompt提供给大模型，让模型基于外部知识生成更准确、更相关的回答。这样可以让 AI 回答展开新页面打开2025-11-04  18:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是上下文查询增强？&lt;a href=&quot;#什么是上下文查询增强&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;它有什么作用？&lt;/li&gt;
&lt;li&gt;如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是上下文查询增强？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;它有什么作用？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。
默认情况下，RetrievalAugmentationAdvisor检索增强顾问内部就使用了上下文查询增强，当它没有找到相关文档时，它会指示模型不要回答用户查询。这是一种保守的策略，可以防止模型在没有足够信息的情况下生成不准确的展开新页面打开2025-12-04  23:1400回复axing特训营什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？上下文查询增强是 RAG 的核心步骤，它把用户的原始查询和检索到的相关文档结合，生成一个增强Prompt提供给大模型，让模型基于外部知识生成更准确、更相关的回答。这样可以让 AI 回答展开新页面打开2025-11-04  18:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;市面上有哪些主流的 LLM Agent 框架？各自的特点是什么？AutoGPT 如何实现自主决策？什么是 A2A 协议，它的核心架构及主要组件有哪些？什么是查询重写？它有什么作用？如何基于 Spring AI 实现查询重写？什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？上次浏览：2026-03-16 15:11:49什么是工具调用 Tool Calling？如何利用 Spring AI 实现工具调用？上次浏览：2026-03-16 15:11:24什么是 ReAct？如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？上次浏览：2026-03-16 15:12:08什么是 OpenManus？它的实现原理是什么？什么是 CoT 思维链？如何实现 CoT 思维链？如何保证 AI 应用的性能和稳定性？11775. 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。
默认情况下，RetrievalAugmentationAdvisor检索增强顾问内部就使用了上下文查询增强，当它没有找到相关文档时，它会指示模型不要回答用户查询。这是一种保守的策略，可以防止模型在没有足够信息的情况下生成不准确的展开新页面打开2025-12-04  23:1400回复axing特训营什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？上下文查询增强是 RAG 的核心步骤，它把用户的原始查询和检索到的相关文档结合，生成一个增强Prompt提供给大模型，让模型基于外部知识生成更准确、更相关的回答。这样可以让 AI 回答展开新页面打开2025-11-04  18:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;什么是上下文查询增强？&lt;a href=&quot;#什么是上下文查询增强-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？&lt;a href=&quot;#什么是上下文查询增强它有什么作用如何基于-spring-ai-实现上下文查询增强来处理无关问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。 检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。- 默认情况下，RetrievalAugmentationAdvisor检索增强顾问内部就使用了上下文查询增强，当它没有找到相关文档时，它会指示模型不要回答用户查询。这是一种保守的策略，可以防止模型在没有足够信息的情况下生成不准确的展开新页面打开2025-12-04  23:1400回复axing特训营什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？上下文查询增强是 RAG 的核心步骤，它把用户的原始查询和检索到的相关文档结合，生成一个增强Prompt提供给大模型，让模型基于外部知识生成更准确、更相关的回答。这样可以让 AI 回答展开新页面打开2025-11-04  18:5900回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;市面上有哪些主流的 LLM Agent 框架？各自的特点是什么？AutoGPT 如何实现自主决策？什么是 A2A 协议，它的核心架构及主要组件有哪些？什么是查询重写？它有什么作用？如何基于 Spring AI 实现查询重写？什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？什么是 Spring AI 提出的模块化 RAG 架构？预检索、检索和后检索阶段各自负责什么？上次浏览：2026-03-16 15:11:49什么是工具调用 Tool Calling？如何利用 Spring AI 实现工具调用？上次浏览：2026-03-16 15:11:24什么是 ReAct？如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体？上次浏览：2026-03-16 15:12:08什么是 OpenManus？它的实现原理是什么？什么是 CoT 思维链？如何实现 CoT 思维链？如何保证 AI 应用的性能和稳定性？11775. 什么是上下文查询增强？它有什么作用？如何基于 Spring AI 实现上下文查询增强来处理无关问题？VIP中等后端编程导航标记分享121354上下文查询增强是 RAG 流程中的一个核心环节，指的是把用户的原始查询与从知识库中检索到的相关文档进行结合，形成一个信息更丰富的增强提示，然后将这个增强提示提供给 AI，让模型能基于这些特定知识生成回答。主要作用是为大模型提供必要的、实时的外部知识，这样 AI 的回答就不仅仅依赖于其预训练的通用知识，提高答案的准确性、相关性和时效性。Spring AI 的RetrievalAugmentationAdvisor内部使用ContextualQueryAugmenter来实现上下文查询增强。当处理用户提出的无关问题时，ContextualQueryAugmenter提供了空上下文处理机制。我们可以配置ContextualQueryAugmenter的allowEmptyContext(false)，并提供一个自定义的emptyContextPromptTemplate。 检索不到相关文档时，系统会使用这个自定义模板来指示大模型如何回应。在我们的项目中，这个自定义模板会引导 AI 礼貌地告知用户 “它只能回答恋爱相关的问题”，并给出联系客服的方式，优雅地处理了超出知识库范围的提问。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求） 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%81%87%E8%AE%BE%E9%9C%80%E8%A6%81%E8%AE%A9%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90%E4%B8%80%E4%B8%AAreact%E8%A1%A8%E5%8D%95%E7%BB%84%E4%BB%B6%E4%BB%A3%E7%A0%81-%E8%AF%B7%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E5%8C%85%E5%90%AB%E4%B8%8A%E4%B8%8B%E6%96%87%E7%BA%A6%E6%9D%9F%E7%9A%84prompt-%E9%9C%80%E5%8C%85%E5%90%AB%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81-%E9%94%99%E8%AF%AF%E6%8F%90%E7%A4%BA%E7%AD%89%E8%A6%81%E6%B1%82-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%81%87%E8%AE%BE%E9%9C%80%E8%A6%81%E8%AE%A9%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90%E4%B8%80%E4%B8%AAreact%E8%A1%A8%E5%8D%95%E7%BB%84%E4%BB%B6%E4%BB%A3%E7%A0%81-%E8%AF%B7%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E5%8C%85%E5%90%AB%E4%B8%8A%E4%B8%8B%E6%96%87%E7%BA%A6%E6%9D%9F%E7%9A%84prompt-%E9%9C%80%E5%8C%85%E5%90%AB%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81-%E9%94%99%E8%AF%AF%E6%8F%90%E7%A4%BA%E7%AD%89%E8%A6%81%E6%B1%82-_%E6%95%B4%E7%90%86/</guid><description># 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求） ## 问题 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）&lt;a href=&quot;#假设需要让大模型生成一个react表单组件代码请设计一个包含上下文约束的prompt需包含数据验证错误提示等要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提？
等要求）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;&lt;p&gt;字段清单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮箱：必填，标准邮箱格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码：必填，必须和密码字段一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机号：选填，11 位数字，1 开头&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证行为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个字段失焦时触发校验，不要边打字边校验&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误提示红色小字，显示在对应输入框正下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码强度用三段式进度条展示（弱/中/强）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码字段只在密码字段有值后才启用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;提交逻辑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击提交后按钮变成 loading 状态，显示”提交中…”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求完成前禁止重复点击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代码要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用函数组件 + hooks，不用 class 组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类型定义单独放一个 types.ts 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证规则用 zod schema 定义，不要散落在组件里&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误信息统一放 constants.ts，支持国际化替换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式用 Tailwind CSS，响应式适配移动端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;输出格式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RegisterForm.tsx（主组件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;types.ts（类型定义）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;schema.ts（zod 验证规则）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;constants.ts（错误信息常量）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后给一个使用示例这个 Prompt 的关键在于把每个细节都定死了，AI 照着抄就行，没有发挥空间就不会出幺蛾子。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件传统的受控组件写法，每个字段都要 useState，每次输入都触发 setState，组件就会重新渲染。5 个字段的表单，用户打一个字就要渲染 5 遍，字段多了性能很难看。React Hook Form 用的是非受控组件，通过 ref 直接读取 DOM 的值，只在提交或校验时才收集数据。同样 5 个字段，用户打字时组件压根不重渲染，性能差距能到 10 倍以上。而且受控组件写起来很啰嗦，每个字段都要写 value、onChange、错误状态，代码量轻松翻倍。React Hook Form 用 register 一行搞定，代码干净很多。验证库选型对比维度zodyupjoi包体积12KB22KB140KBTypeScript 支持原生，类型推导完美需要额外配置类型支持较弱API 风格链式调用，更现代链式调用配置对象式错误信息定制简单直接需要额外配置比较麻烦生态整合React Hook Form 官方推荐社区主流主要用在 Node 端运行时校验支持支持支持现在新项目基本都用 zod，跟 TypeScript 配合是最好的，定义一个 schema 就能同时得到运行时校验和类型定义，不用写两遍。写 Prompt 容易忽略的坑很多人写 Prompt 只关注主流程，边界情况完全不提。AI 默认是不会处理这些的，你不说它就不做。比如用户名前后带空格，不 trim 的话会存进数据库，后面登录的时候就对不上了。这种细节要在 Prompt 里明确写出来。分步生成 vs 一次性生成复杂表单不建议一个 Prompt 全搞定。更好的做法是分三轮：1）第一轮让 AI 生成类型定义和验证 schema，确认字段和规则没问题&lt;/p&gt;&lt;p&gt;2） 第二轮基于第一轮的输出，生成组件骨架和基础交互&lt;/p&gt;&lt;p&gt;3） 第三轮加上样式和性能优化每一轮都能检查，出问题好定位。一口气全塞进去，AI 经常顾此失彼，验证规则对了但交互逻辑不对，或者交互对了但样式乱七八糟。相关资源：React Hook Form 官方文档:&lt;a href=&quot;https://react-hook-form.com/Tailwind&quot; target=&quot;_blank&quot;&gt;https://react-hook-form.com/Tailwind&lt;/a&gt; CSS 官方文档:&lt;a href=&quot;https://tailwindcss.com/Zod&quot; target=&quot;_blank&quot;&gt;https://tailwindcss.com/Zod&lt;/a&gt; 类型验证库:&lt;a href=&quot;https://github.com/colinhacks/zod&quot; target=&quot;_blank&quot;&gt;https://github.com/colinhacks/zod&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？回答：用结构化格式来组织，比如 Markdown 表格或者 YAML 风格的缩进。每个字段单独一个 block，里面包含名称、类型、必填性、校验规则、错误提示。AI 对结构化数据的理解能力比纯文本强很多，漏东西的概率会低不少。另外可以在末尾加一句”请确认你理解了所有 N 个字段的要求后再生成代码”，让 AI 先复述一遍需求。- &lt;strong&gt;提问&lt;/strong&gt;：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：联动关系要单独拎出来写清楚，不要混在字段定义里。比如”当用户类型选择企业时，公司名称和营业执照号变成必填”，这种就单独一段描述。还可以用伪代码或者流程图来表达，比如”if userType === ‘company’ then companyName.required = true”。越复杂的逻辑越要写得明确，别指望 AI 能猜出你的意图。- &lt;strong&gt;提问&lt;/strong&gt;：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：把 bug 现象描述清楚喂回去。比如”你生成的代码在确认密码字段校验时有问题，当密码字段清空后再填确认密码，校验不会触发。请修复这个问题，确保密码字段变化时会重新校验确认密码字段”。本质上就是把你 debug 的思路用自然语言写出来。如果 bug 很隐蔽，可以把出问题的代码段贴回去，让 AI 重点看那一块。- &lt;strong&gt;提问&lt;/strong&gt;：React Hook Form 和 Formik 你更推荐哪个？为什么？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：现在新项目肯定选 React Hook Form。性能上，React Hook Form 是非受控组件，重渲染次数少很多，官方 benchmark 显示能快 2-3 倍。体积上，React Hook Form 压缩后 8KB，Formik 要 12KB。API 上，React Hook Form 的 register 比 Formik 的 Field 组件更简洁。唯一 Formik 还有点优势的是社区资料多一些，毕竟出来得早，但 React Hook Form 现在文档也很完善了，上手不难。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件验证库选型对比写 Prompt 容易忽略的坑分步生成 vs 一次性生成&lt;/p&gt;&lt;p&gt;提问：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？提问：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？提问：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？提问：React Hook Form 和 Formik 你更推荐哪个？为什么？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;解释LangChain框架中的Chain和Agent概念，并举例说明各自的应用场景上次浏览：2026-03-16 15:02:59什么是大模型的”涌现能力”？列举三种典型表现并解释其可能成因要让AI生成一个带表单验证的Vue3组件，请写出包含以下要素的Prompt上次浏览：2026-03-16 15:06:23假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）上次浏览：2026-03-16 15:07:05请描述使用LangChain构建一个文档问答系统的关键技术组件及实现步骤上次浏览：2026-03-16 15:07:08假设要开发一个智能工单分类系统，请拆解AI可参与的环节并说明技术选型思路当需要处理超长大模型上下文窗口限制时，有哪些可行的工程解决方案？请举例说明假设在电商系统中，哪些功能适合直接使用大模型完成，哪些需要结合工程化手段？上次浏览：2026-03-16 15:07:38假设请你设计一个医疗问诊系统，如何平衡AI幻觉带来的风险与效率提升？需要哪些技术手段？设计智能客服系统时，如何通过知识库构建解决长尾问题？请描述具体实现步骤11341. 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;&lt;p&gt;字段清单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮箱：必填，标准邮箱格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码：必填，必须和密码字段一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机号：选填，11 位数字，1 开头&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证行为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个字段失焦时触发校验，不要边打字边校验&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误提示红色小字，显示在对应输入框正下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码强度用三段式进度条展示（弱/中/强）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码字段只在密码字段有值后才启用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;提交逻辑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击提交后按钮变成 loading 状态，显示”提交中…”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求完成前禁止重复点击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代码要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用函数组件 + hooks，不用 class 组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类型定义单独放一个 types.ts 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证规则用 zod schema 定义，不要散落在组件里&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误信息统一放 constants.ts，支持国际化替换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式用 Tailwind CSS，响应式适配移动端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;输出格式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RegisterForm.tsx（主组件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;types.ts（类型定义）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;schema.ts（zod 验证规则）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;constants.ts（错误信息常量）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后给一个使用示例这个 Prompt 的关键在于把每个细节都定死了，AI 照着抄就行，没有发挥空间就不会出幺蛾子。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件传统的受控组件写法，每个字段都要 useState，每次输入都触发 setState，组件就会重新渲染。5 个字段的表单，用户打一个字就要渲染 5 遍，字段多了性能很难看。React Hook Form 用的是非受控组件，通过 ref 直接读取 DOM 的值，只在提交或校验时才收集数据。同样 5 个字段，用户打字时组件压根不重渲染，性能差距能到 10 倍以上。而且受控组件写起来很啰嗦，每个字段都要写 value、onChange、错误状态，代码量轻松翻倍。React Hook Form 用 register 一行搞定，代码干净很多。验证库选型对比维度zodyupjoi包体积12KB22KB140KBTypeScript 支持原生，类型推导完美需要额外配置类型支持较弱API 风格链式调用，更现代链式调用配置对象式错误信息定制简单直接需要额外配置比较麻烦生态整合React Hook Form 官方推荐社区主流主要用在 Node 端运行时校验支持支持支持现在新项目基本都用 zod，跟 TypeScript 配合是最好的，定义一个 schema 就能同时得到运行时校验和类型定义，不用写两遍。写 Prompt 容易忽略的坑很多人写 Prompt 只关注主流程，边界情况完全不提。AI 默认是不会处理这些的，你不说它就不做。比如用户名前后带空格，不 trim 的话会存进数据库，后面登录的时候就对不上了。这种细节要在 Prompt 里明确写出来。分步生成 vs 一次性生成复杂表单不建议一个 Prompt 全搞定。更好的做法是分三轮：1）第一轮让 AI 生成类型定义和验证 schema，确认字段和规则没问题&lt;/p&gt;&lt;p&gt;2） 第二轮基于第一轮的输出，生成组件骨架和基础交互&lt;/p&gt;&lt;p&gt;3） 第三轮加上样式和性能优化每一轮都能检查，出问题好定位。一口气全塞进去，AI 经常顾此失彼，验证规则对了但交互逻辑不对，或者交互对了但样式乱七八糟。相关资源：React Hook Form 官方文档:&lt;a href=&quot;https://react-hook-form.com/Tailwind&quot; target=&quot;_blank&quot;&gt;https://react-hook-form.com/Tailwind&lt;/a&gt; CSS 官方文档:&lt;a href=&quot;https://tailwindcss.com/Zod&quot; target=&quot;_blank&quot;&gt;https://tailwindcss.com/Zod&lt;/a&gt; 类型验证库:&lt;a href=&quot;https://github.com/colinhacks/zod&quot; target=&quot;_blank&quot;&gt;https://github.com/colinhacks/zod&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？回答：用结构化格式来组织，比如 Markdown 表格或者 YAML 风格的缩进。每个字段单独一个 block，里面包含名称、类型、必填性、校验规则、错误提示。AI 对结构化数据的理解能力比纯文本强很多，漏东西的概率会低不少。另外可以在末尾加一句”请确认你理解了所有 N 个字段的要求后再生成代码”，让 AI 先复述一遍需求。- &lt;strong&gt;提问&lt;/strong&gt;：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：联动关系要单独拎出来写清楚，不要混在字段定义里。比如”当用户类型选择企业时，公司名称和营业执照号变成必填”，这种就单独一段描述。还可以用伪代码或者流程图来表达，比如”if userType === ‘company’ then companyName.required = true”。越复杂的逻辑越要写得明确，别指望 AI 能猜出你的意图。- &lt;strong&gt;提问&lt;/strong&gt;：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：把 bug 现象描述清楚喂回去。比如”你生成的代码在确认密码字段校验时有问题，当密码字段清空后再填确认密码，校验不会触发。请修复这个问题，确保密码字段变化时会重新校验确认密码字段”。本质上就是把你 debug 的思路用自然语言写出来。如果 bug 很隐蔽，可以把出问题的代码段贴回去，让 AI 重点看那一块。- &lt;strong&gt;提问&lt;/strong&gt;：React Hook Form 和 Formik 你更推荐哪个？为什么？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：现在新项目肯定选 React Hook Form。性能上，React Hook Form 是非受控组件，重渲染次数少很多，官方 benchmark 显示能快 2-3 倍。体积上，React Hook Form 压缩后 8KB，Formik 要 12KB。API 上，React Hook Form 的 register 比 Formik 的 Field 组件更简洁。唯一 Formik 还有点优势的是社区资料多一些，毕竟出来得早，但 React Hook Form 现在文档也很完善了，上手不难。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件验证库选型对比写 Prompt 容易忽略的坑分步生成 vs 一次性生成&lt;/p&gt;&lt;p&gt;提问：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？提问：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？提问：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？提问：React Hook Form 和 Formik 你更推荐哪个？为什么？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）&lt;a href=&quot;#假设需要让大模型生成一个react表单组件代码请设计一个包含上下文约束的prompt需包含数据验证错误提示等要求-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字段清单：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮箱：必填，标准邮箱格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码：必填，必须和密码字段一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机号：选填，11 位数字，1 开头&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证行为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个字段失焦时触发校验，不要边打字边校验&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误提示红色小字，显示在对应输入框正下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码强度用三段式进度条展示（弱/中/强）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码字段只在密码字段有值后才启用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;提交逻辑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击提交后按钮变成 loading 状态，显示”提交中…”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求完成前禁止重复点击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代码要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用函数组件 + hooks，不用 class 组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类型定义单独放一个 types.ts 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证规则用 zod schema 定义，不要散落在组件里&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误信息统一放 constants.ts，支持国际化替换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式用 Tailwind CSS，响应式适配移动端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;输出格式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RegisterForm.tsx（主组件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;types.ts（类型定义）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;schema.ts（zod 验证规则）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;constants.ts（错误信息常量）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后给一个使用示例这个 Prompt 的关键在于把每个细节都定死了，AI 照着抄就行，没有发挥空间就不会出幺蛾子。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件传统的受控组件写法，每个字段都要 useState，每次输入都触发 setState，组件就会重新渲染。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）
假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;字段清单：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮箱：必填，标准邮箱格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码：必填，必须和密码字段一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机号：选填，11 位数字，1 开头&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证行为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个字段失焦时触发校验，不要边打字边校验&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误提示红色小字，显示在对应输入框正下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码强度用三段式进度条展示（弱/中/强）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码字段只在密码字段有值后才启用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;提交逻辑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击提交后按钮变成 loading 状态，显示”提交中…”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求完成前禁止重复点击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代码要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用函数组件 + hooks，不用 class 组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类型定义单独放一个 types.ts 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证规则用 zod schema 定义，不要散落在组件里&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误信息统一放 constants.ts，支持国际化替换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式用 Tailwind CSS，响应式适配移动端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;输出格式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RegisterForm.tsx（主组件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;types.ts（类型定义）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;schema.ts（zod 验证规则）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;constants.ts（错误信息常量）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后给一个使用示例这个 Prompt 的关键在于把每个细节都定死了，AI 照着抄就行，没有发挥空间就不会出幺蛾子。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件传统的受控组件写法，每个字段都要 useState，每次输入都触发 setState，组件就会重新渲染。5 个字段的表单，用户打一个字就要渲染 5 遍，字段多了性能很难看。React Hook Form 用的是非受控组件，通过 ref 直接读取 DOM 的值，只在提交或校验时才收集数据。同样 5 个字段，用户打字时组件压根不重渲染，性能差距能到 10 倍以上。而且受控组件写起来很啰嗦，每个字段都要写 value、onChange、错误状态，代码量轻松翻倍。React Hook Form 用 register 一行搞定，代码干净很多。验证库选型对比维度zodyupjoi包体积12KB22KB140KBTypeScript 支持原生，类型推导完美需要额外配置类型支持较弱API 风格链式调用，更现代链式调用配置对象式错误信息定制简单直接需要额外配置比较麻烦生态整合React Hook Form 官方推荐社区主流主要用在 Node 端运行时校验支持支持支持现在新项目基本都用 zod，跟 TypeScript 配合是最好的，定义一个 schema 就能同时得到运行时校验和类型定义，不用写两遍。写 Prompt 容易忽略的坑很多人写 Prompt 只关注主流程，边界情况完全不提。AI 默认是不会处理这些的，你不说它就不做。比如用户名前后带空格，不 trim 的话会存进数据库，后面登录的时候就对不上了。这种细节要在 Prompt 里明确写出来。分步生成 vs 一次性生成复杂表单不建议一个 Prompt 全搞定。更好的做法是分三轮：1）第一轮让 AI 生成类型定义和验证 schema，确认字段和规则没问题&lt;/p&gt;&lt;p&gt;2） 第二轮基于第一轮的输出，生成组件骨架和基础交互&lt;/p&gt;&lt;p&gt;3） 第三轮加上样式和性能优化每一轮都能检查，出问题好定位。一口气全塞进去，AI 经常顾此失彼，验证规则对了但交互逻辑不对，或者交互对了但样式乱七八糟。相关资源：React Hook Form 官方文档:&lt;a href=&quot;https://react-hook-form.com/Tailwind&quot; target=&quot;_blank&quot;&gt;https://react-hook-form.com/Tailwind&lt;/a&gt; CSS 官方文档:&lt;a href=&quot;https://tailwindcss.com/Zod&quot; target=&quot;_blank&quot;&gt;https://tailwindcss.com/Zod&lt;/a&gt; 类型验证库:&lt;a href=&quot;https://github.com/colinhacks/zod&quot; target=&quot;_blank&quot;&gt;https://github.com/colinhacks/zod&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？回答：用结构化格式来组织，比如 Markdown 表格或者 YAML 风格的缩进。每个字段单独一个 block，里面包含名称、类型、必填性、校验规则、错误提示。AI 对结构化数据的理解能力比纯文本强很多，漏东西的概率会低不少。另外可以在末尾加一句”请确认你理解了所有 N 个字段的要求后再生成代码”，让 AI 先复述一遍需求。- &lt;strong&gt;提问&lt;/strong&gt;：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：联动关系要单独拎出来写清楚，不要混在字段定义里。比如”当用户类型选择企业时，公司名称和营业执照号变成必填”，这种就单独一段描述。还可以用伪代码或者流程图来表达，比如”if userType === ‘company’ then companyName.required = true”。越复杂的逻辑越要写得明确，别指望 AI 能猜出你的意图。- &lt;strong&gt;提问&lt;/strong&gt;：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：把 bug 现象描述清楚喂回去。比如”你生成的代码在确认密码字段校验时有问题，当密码字段清空后再填确认密码，校验不会触发。请修复这个问题，确保密码字段变化时会重新校验确认密码字段”。本质上就是把你 debug 的思路用自然语言写出来。如果 bug 很隐蔽，可以把出问题的代码段贴回去，让 AI 重点看那一块。- &lt;strong&gt;提问&lt;/strong&gt;：React Hook Form 和 Formik 你更推荐哪个？为什么？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：现在新项目肯定选 React Hook Form。性能上，React Hook Form 是非受控组件，重渲染次数少很多，官方 benchmark 显示能快 2-3 倍。体积上，React Hook Form 压缩后 8KB，Formik 要 12KB。API 上，React Hook Form 的 register 比 Formik 的 Field 组件更简洁。唯一 Formik 还有点优势的是社区资料多一些，毕竟出来得早，但 React Hook Form 现在文档也很完善了，上手不难。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件验证库选型对比写 Prompt 容易忽略的坑分步生成 vs 一次性生成&lt;/p&gt;&lt;p&gt;提问：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？提问：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？提问：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？提问：React Hook Form 和 Formik 你更推荐哪个？为什么？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;解释LangChain框架中的Chain和Agent概念，并举例说明各自的应用场景上次浏览：2026-03-16 15:02:59什么是大模型的”涌现能力”？列举三种典型表现并解释其可能成因要让AI生成一个带表单验证的Vue3组件，请写出包含以下要素的Prompt上次浏览：2026-03-16 15:06:23假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）上次浏览：2026-03-16 15:07:05请描述使用LangChain构建一个文档问答系统的关键技术组件及实现步骤上次浏览：2026-03-16 15:07:08假设要开发一个智能工单分类系统，请拆解AI可参与的环节并说明技术选型思路当需要处理超长大模型上下文窗口限制时，有哪些可行的工程解决方案？请举例说明假设在电商系统中，哪些功能适合直接使用大模型完成，哪些需要结合工程化手段？上次浏览：2026-03-16 15:07:38假设请你设计一个医疗问诊系统，如何平衡AI幻觉带来的风险与效率提升？需要哪些技术手段？设计智能客服系统时，如何通过知识库构建解决长尾问题？请描述具体实现步骤11341. 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;字段清单：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮箱：必填，标准邮箱格式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码：必填，必须和密码字段一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机号：选填，11 位数字，1 开头&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;验证行为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每个字段失焦时触发校验，不要边打字边校验&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误提示红色小字，显示在对应输入框正下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;密码强度用三段式进度条展示（弱/中/强）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认密码字段只在密码字段有值后才启用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;提交逻辑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任一必填字段未通过校验时，提交按钮 disabled 且置灰&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击提交后按钮变成 loading 状态，显示”提交中…”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求完成前禁止重复点击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功后调用 onSuccess 回调并清空表单，失败后保留已填内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代码要求：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用函数组件 + hooks，不用 class 组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类型定义单独放一个 types.ts 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证规则用 zod schema 定义，不要散落在组件里&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;错误信息统一放 constants.ts，支持国际化替换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式用 Tailwind CSS，响应式适配移动端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键逻辑加注释，特别是正则表达式要写清楚匹配什么&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;输出格式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RegisterForm.tsx（主组件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;types.ts（类型定义）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;schema.ts（zod 验证规则）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;constants.ts（错误信息常量）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后给一个使用示例这个 Prompt 的关键在于把每个细节都定死了，AI 照着抄就行，没有发挥空间就不会出幺蛾子。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件传统的受控组件写法，每个字段都要 useState，每次输入都触发 setState，组件就会重新渲染。5 个字段的表单，用户打一个字就要渲染 5 遍，字段多了性能很难看。React Hook Form 用的是非受控组件，通过 ref 直接读取 DOM 的值，只在提交或校验时才收集数据。同样 5 个字段，用户打字时组件压根不重渲染，性能差距能到 10 倍以上。而且受控组件写起来很啰嗦，每个字段都要写 value、onChange、错误状态，代码量轻松翻倍。React Hook Form 用 register 一行搞定，代码干净很多。验证库选型对比维度zodyupjoi包体积12KB22KB140KBTypeScript 支持原生，类型推导完美需要额外配置类型支持较弱API 风格链式调用，更现代链式调用配置对象式错误信息定制简单直接需要额外配置比较麻烦生态整合React Hook Form 官方推荐社区主流主要用在 Node 端运行时校验支持支持支持现在新项目基本都用 zod，跟 TypeScript 配合是最好的，定义一个 schema 就能同时得到运行时校验和类型定义，不用写两遍。写 Prompt 容易忽略的坑很多人写 Prompt 只关注主流程，边界情况完全不提。AI 默认是不会处理这些的，你不说它就不做。比如用户名前后带空格，不 trim 的话会存进数据库，后面登录的时候就对不上了。这种细节要在 Prompt 里明确写出来。分步生成 vs 一次性生成复杂表单不建议一个 Prompt 全搞定。更好的做法是分三轮：1）第一轮让 AI 生成类型定义和验证 schema，确认字段和规则没问题&lt;/p&gt;&lt;p&gt;2） 第二轮基于第一轮的输出，生成组件骨架和基础交互&lt;/p&gt;&lt;p&gt;3） 第三轮加上样式和性能优化每一轮都能检查，出问题好定位。一口气全塞进去，AI 经常顾此失彼，验证规则对了但交互逻辑不对，或者交互对了但样式乱七八糟。相关资源：React Hook Form 官方文档:&lt;a href=&quot;https://react-hook-form.com/Tailwind&quot; target=&quot;_blank&quot;&gt;https://react-hook-form.com/Tailwind&lt;/a&gt; CSS 官方文档:&lt;a href=&quot;https://tailwindcss.com/Zod&quot; target=&quot;_blank&quot;&gt;https://tailwindcss.com/Zod&lt;/a&gt; 类型验证库:&lt;a href=&quot;https://github.com/colinhacks/zod&quot; target=&quot;_blank&quot;&gt;https://github.com/colinhacks/zod&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？回答：用结构化格式来组织，比如 Markdown 表格或者 YAML 风格的缩进。每个字段单独一个 block，里面包含名称、类型、必填性、校验规则、错误提示。AI 对结构化数据的理解能力比纯文本强很多，漏东西的概率会低不少。另外可以在末尾加一句”请确认你理解了所有 N 个字段的要求后再生成代码”，让 AI 先复述一遍需求。- &lt;strong&gt;提问&lt;/strong&gt;：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：联动关系要单独拎出来写清楚，不要混在字段定义里。比如”当用户类型选择企业时，公司名称和营业执照号变成必填”，这种就单独一段描述。还可以用伪代码或者流程图来表达，比如”if userType === ‘company’ then companyName.required = true”。越复杂的逻辑越要写得明确，别指望 AI 能猜出你的意图。- &lt;strong&gt;提问&lt;/strong&gt;：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：把 bug 现象描述清楚喂回去。比如”你生成的代码在确认密码字段校验时有问题，当密码字段清空后再填确认密码，校验不会触发。请修复这个问题，确保密码字段变化时会重新校验确认密码字段”。本质上就是把你 debug 的思路用自然语言写出来。如果 bug 很隐蔽，可以把出问题的代码段贴回去，让 AI 重点看那一块。- &lt;strong&gt;提问&lt;/strong&gt;：React Hook Form 和 Formik 你更推荐哪个？为什么？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：现在新项目肯定选 React Hook Form。性能上，React Hook Form 是非受控组件，重渲染次数少很多，官方 benchmark 显示能快 2-3 倍。体积上，React Hook Form 压缩后 8KB，Formik 要 12KB。API 上，React Hook Form 的 register 比 Formik 的 Field 组件更简洁。唯一 Formik 还有点优势的是社区资料多一些，毕竟出来得早，但 React Hook Form 现在文档也很完善了，上手不难。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么用 React Hook Form 而不是受控组件验证库选型对比写 Prompt 容易忽略的坑分步生成 vs 一次性生成&lt;/p&gt;&lt;p&gt;提问：表单字段多了以后 Prompt 会很长，怎么组织才能让 AI 不漏东西？提问：如果验证逻辑很复杂，比如字段之间有联动关系，Prompt 该怎么写？提问：生成的代码跑起来有 bug，怎么通过改 Prompt 来修而不是自己手动改？提问：React Hook Form 和 Formik 你更推荐哪个？为什么？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）&lt;a href=&quot;#假设需要让大模型生成一个react表单组件代码请设计一个包含上下文约束的prompt需包含数据验证错误提示等要求-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）&lt;a href=&quot;#假设需要让大模型生成一个react表单组件代码请设计一个包含上下文约束的prompt需包含数据验证错误提示等要求-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）VIP中等大模型标记分享31022面试问答让大模型生成一个能直接用的 React 表单组件，Prompt 得把上下文约束写死，不然 AI 就会按自己的理解乱发挥。一个完整的 Prompt 应该覆盖四个维度：字段定义、验证规则、交互行为、代码规范。直接上一个实战级的 Prompt 示例：▼plaintext复制代码用 React 18 + TypeScript + React Hook Form 写一个用户注册表单组件。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;用户名：必填，2-10 个字符，只能包含字母数字下划线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;邮箱：必填，标准邮箱格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;密码：必填，8-20 位，至少包含一个大写、一个小写、一个数字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%90%91%E9%87%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD-%E5%B8%B8%E8%A7%81%E7%9A%84%E5%90%91%E9%87%8F%E6%90%9C%E7%B4%A2%E6%96%B9%E6%B3%95-%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6-%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E8%B7%9D%E7%A6%BB%E5%92%8C%E6%9B%BC%E5%93%88%E9%A1%BF%E8%B7%9D%E7%A6%BB%E5%88%86%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%90%91%E9%87%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD-%E5%B8%B8%E8%A7%81%E7%9A%84%E5%90%91%E9%87%8F%E6%90%9C%E7%B4%A2%E6%96%B9%E6%B3%95-%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6-%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E8%B7%9D%E7%A6%BB%E5%92%8C%E6%9B%BC%E5%93%88%E9%A1%BF%E8%B7%9D%E7%A6%BB%E5%88%86%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB-_%E6%95%B4%E7%90%86/</guid><description># 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？ ## 问题 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？ ## 标准回答 向量数据库中，常</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？&lt;a href=&quot;#向量数据库中常见的向量搜索方法余弦相似度欧几里得距离和曼哈顿距离分别是什么有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。文本向量检索基本都用它，因为我们关心的是语义方向，一篇 100 字的文章和一篇 1000 字的文章只要讲的是同一个主题，余弦相似度就会很高。取值范围 -1 到 1，1 是完全同向，-1 是完全反向。欧几里得距离算的是空间中两点之间的直线距离，就是勾股定理那一套。图像检索、人脸识别这类场景用得多，因为像素特征向量本身就有”绝对位置”的含义，两张图的特征向量在空间里离得越近，长得就越像。取值 ≥ 0，越小越相似。曼哈顿距离把各维度的差值绝对值加起来，像在城市街区里沿着街道走，不能斜着穿。网格数据、稀疏特征向量用得比较多，比如地图坐标计算、高维稀疏文本特征。取值 ≥ 0，同样越小越相似。三种方法的选型逻辑：文本、推荐系统首选余弦相似度；图像、视频检索首选欧氏距离；网格坐标、稀疏高维数据考虑曼哈顿距离。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;数学公式与计算复杂度假设有两个 n 维向量 A 和 B：1）余弦相似度的公式是两个向量的点积除以模长的乘积，计算量主要是 n 次乘法加 n 次加法，再算两个模长。Faiss、Milvus 这类向量数据库内部会对归一化后的向量做优化，归一化之后余弦相似度就等价于点积，省掉模长计算。&lt;/p&gt;&lt;p&gt;2） 欧氏距离是各维度差值平方和再开根号。实际检索时经常省掉开根号这一步，直接比较平方和就够了，能省不少计算。&lt;/p&gt;&lt;p&gt;3） 曼哈顿距离是各维度差值绝对值之和，计算最简单，没有乘法和开方，在高维稀疏场景下效率有优势。三种距离的计算过程对比：余弦相似度：先算点积 A·B，再算 |A| 和 |B|，最后做除法&lt;/p&gt;&lt;p&gt;欧氏距离：逐维度算差值、平方、累加，最后开根号&lt;/p&gt;&lt;p&gt;曼哈顿距离：逐维度算差值、取绝对值、累加不同场景的选型考量文本语义检索基本锁定余弦相似度，原因很直接：Embedding 模型输出的向量长度本身没有业务含义，一个句子长一点短一点不影响语义，我们只关心向量指向哪个方向。OpenAI 的 text-embedding-ada-002、BGE、M3E 这些模型出来的向量都建议用余弦相似度。图像检索更适合欧氏距离，ResNet、CLIP 这类视觉模型提取的特征向量，其数值大小本身携带了像素强度、纹理密度这些信息。人脸识别领域的 ArcFace、CosFace 虽然名字里带 Cos，但训练时用的是角度 margin，推理时用欧氏距离效果更稳定。曼哈顿距离在推荐系统的用户行为特征上有奇效，用户点击、购买这类行为天然是 0/1 稀疏向量，曼哈顿距离对这种数据不敏感于个别维度的极端值，鲁棒性比欧氏距离好。向量数据库的索引加速不管用哪种距离度量，暴力遍历 1 亿条向量肯定扛不住，所以向量数据库都会建索引。主流的索引算法：1）IVF 系列：先把向量空间切成 1000-10000 个聚类中心，查询时只在最近的几个聚类里找，Milvus、Faiss 都支持。&lt;/p&gt;&lt;p&gt;2） HNSW：构建多层图结构，高层稀疏跳跃、低层密集精确，Pinecone、Qdrant 默认都用这个。&lt;/p&gt;&lt;p&gt;3） PQ 量化：把 128 维向量切成 8 个子空间，每个子空间量化成 256 个码本，空间压缩 32 倍，精度损失可控。这些索引算法和距离度量是正交的，IVF 搭余弦、HNSW 搭欧氏都行，只要在建索引和查询时保持一致就没问题。实际踩坑经验1）向量没归一化就用余弦相似度，结果会很诡异。有些 Embedding 模型输出的向量本身不是单位向量，得自己先 L2 归一化再存进向量库。&lt;/p&gt;&lt;p&gt;2） 欧氏距离对数值尺度敏感，如果某几个维度的数值特别大，会把距离带偏。工业界常见做法是先做 z-score 标准化，让各维度方差一致。&lt;/p&gt;&lt;p&gt;3） 高维空间有”维度灾难”，当维度超过几百维，所有向量之间的距离都趋于相等，区分度变差。这时候降维或者换用近似算法比纠结用哪种距离更重要。&lt;/p&gt;&lt;p&gt;维基百科余弦相似度维基百科欧几里得距离维基百科曼哈顿距离&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？回答：归一化之后所有向量的模长都是 1，欧氏距离的平方展开是 |A|² + |B|² - 2A·B = 2 - 2A·B，而余弦相似度就是 A·B。两者是单调递减关系，排序结果完全一致。所以很多向量库内部会强制归一化，统一用点积来算，还能利用 SIMD 指令加速。- &lt;strong&gt;提问&lt;/strong&gt;：为什么说曼哈顿距离对高维稀疏数据更友好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：稀疏向量里大部分维度都是 0，有值的维度可能差异很大。欧氏距离会把大差异平方放大，一个维度差 10 就贡献 100；曼哈顿距离只是线性累加，差 10 就贡献 10。这样少数几个极端维度不会主导整体距离，对稀疏数据更稳定。- &lt;strong&gt;提问&lt;/strong&gt;：实际业务中怎么选向量搜索的距离度量？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：先看 Embedding 模型官方推荐，大多数文本模型都建议余弦相似度。如果是自己训练的模型，就看训练时 loss 函数用的什么度量，推理时保持一致。实在拿不准就跑个 A/B 测试，用业务指标说话，别凭感觉猜。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度不同场景的选型考量向量数据库的索引加速实际踩坑经验&lt;/p&gt;&lt;p&gt;提问：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？提问：为什么说曼哈顿距离对高维稀疏数据更友好？提问：实际业务中怎么选向量搜索的距离度量？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Copilot 模式和 Agent 模式的区别是什么？上次浏览：2026-03-16 14:49:50什么是向量数据库？在基于大模型的应用开发中，向量数据库主要解决什么问题？你都了解哪些向量数据库？如何选型？上次浏览：2026-03-16 14:50:03向量数据库原理是什么？ 请简述下它的原理上次浏览：2026-03-16 14:50:13向量数据库中的 HNSW、LSH、PQ 分别是什么意思？向量数据库中的 ANN 是什么？为什么需要用它？向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？向量数据库的工作流程有哪些？请简述下什么是 MCP 协议，它在 AI 大模型系统中的作用是什么？上次浏览：2026-03-16 14:50:33MCP 架构包含哪些核心组件？上次浏览：2026-03-16 14:51:22MCP 协议支持哪两种模式？上次浏览：2026-03-16 14:51:4211595. 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。文本向量检索基本都用它，因为我们关心的是语义方向，一篇 100 字的文章和一篇 1000 字的文章只要讲的是同一个主题，余弦相似度就会很高。取值范围 -1 到 1，1 是完全同向，-1 是完全反向。欧几里得距离算的是空间中两点之间的直线距离，就是勾股定理那一套。图像检索、人脸识别这类场景用得多，因为像素特征向量本身就有”绝对位置”的含义，两张图的特征向量在空间里离得越近，长得就越像。取值 ≥ 0，越小越相似。曼哈顿距离把各维度的差值绝对值加起来，像在城市街区里沿着街道走，不能斜着穿。网格数据、稀疏特征向量用得比较多，比如地图坐标计算、高维稀疏文本特征。取值 ≥ 0，同样越小越相似。三种方法的选型逻辑：文本、推荐系统首选余弦相似度；图像、视频检索首选欧氏距离；网格坐标、稀疏高维数据考虑曼哈顿距离。&lt;/p&gt;&lt;p&gt;数学公式与计算复杂度假设有两个 n 维向量 A 和 B：1）余弦相似度的公式是两个向量的点积除以模长的乘积，计算量主要是 n 次乘法加 n 次加法，再算两个模长。Faiss、Milvus 这类向量数据库内部会对归一化后的向量做优化，归一化之后余弦相似度就等价于点积，省掉模长计算。&lt;/p&gt;&lt;p&gt;2） 欧氏距离是各维度差值平方和再开根号。实际检索时经常省掉开根号这一步，直接比较平方和就够了，能省不少计算。&lt;/p&gt;&lt;p&gt;3） 曼哈顿距离是各维度差值绝对值之和，计算最简单，没有乘法和开方，在高维稀疏场景下效率有优势。三种距离的计算过程对比：余弦相似度：先算点积 A·B，再算 |A| 和 |B|，最后做除法&lt;/p&gt;&lt;p&gt;欧氏距离：逐维度算差值、平方、累加，最后开根号&lt;/p&gt;&lt;p&gt;曼哈顿距离：逐维度算差值、取绝对值、累加不同场景的选型考量文本语义检索基本锁定余弦相似度，原因很直接：Embedding 模型输出的向量长度本身没有业务含义，一个句子长一点短一点不影响语义，我们只关心向量指向哪个方向。OpenAI 的 text-embedding-ada-002、BGE、M3E 这些模型出来的向量都建议用余弦相似度。图像检索更适合欧氏距离，ResNet、CLIP 这类视觉模型提取的特征向量，其数值大小本身携带了像素强度、纹理密度这些信息。人脸识别领域的 ArcFace、CosFace 虽然名字里带 Cos，但训练时用的是角度 margin，推理时用欧氏距离效果更稳定。曼哈顿距离在推荐系统的用户行为特征上有奇效，用户点击、购买这类行为天然是 0/1 稀疏向量，曼哈顿距离对这种数据不敏感于个别维度的极端值，鲁棒性比欧氏距离好。向量数据库的索引加速不管用哪种距离度量，暴力遍历 1 亿条向量肯定扛不住，所以向量数据库都会建索引。主流的索引算法：1）IVF 系列：先把向量空间切成 1000-10000 个聚类中心，查询时只在最近的几个聚类里找，Milvus、Faiss 都支持。&lt;/p&gt;&lt;p&gt;2） HNSW：构建多层图结构，高层稀疏跳跃、低层密集精确，Pinecone、Qdrant 默认都用这个。&lt;/p&gt;&lt;p&gt;3） PQ 量化：把 128 维向量切成 8 个子空间，每个子空间量化成 256 个码本，空间压缩 32 倍，精度损失可控。这些索引算法和距离度量是正交的，IVF 搭余弦、HNSW 搭欧氏都行，只要在建索引和查询时保持一致就没问题。实际踩坑经验1）向量没归一化就用余弦相似度，结果会很诡异。有些 Embedding 模型输出的向量本身不是单位向量，得自己先 L2 归一化再存进向量库。&lt;/p&gt;&lt;p&gt;2） 欧氏距离对数值尺度敏感，如果某几个维度的数值特别大，会把距离带偏。工业界常见做法是先做 z-score 标准化，让各维度方差一致。&lt;/p&gt;&lt;p&gt;3） 高维空间有”维度灾难”，当维度超过几百维，所有向量之间的距离都趋于相等，区分度变差。这时候降维或者换用近似算法比纠结用哪种距离更重要。&lt;/p&gt;&lt;p&gt;维基百科余弦相似度维基百科欧几里得距离维基百科曼哈顿距离&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？回答：归一化之后所有向量的模长都是 1，欧氏距离的平方展开是 |A|² + |B|² - 2A·B = 2 - 2A·B，而余弦相似度就是 A·B。两者是单调递减关系，排序结果完全一致。所以很多向量库内部会强制归一化，统一用点积来算，还能利用 SIMD 指令加速。- &lt;strong&gt;提问&lt;/strong&gt;：为什么说曼哈顿距离对高维稀疏数据更友好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：稀疏向量里大部分维度都是 0，有值的维度可能差异很大。欧氏距离会把大差异平方放大，一个维度差 10 就贡献 100；曼哈顿距离只是线性累加，差 10 就贡献 10。这样少数几个极端维度不会主导整体距离，对稀疏数据更稳定。- &lt;strong&gt;提问&lt;/strong&gt;：实际业务中怎么选向量搜索的距离度量？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：先看 Embedding 模型官方推荐，大多数文本模型都建议余弦相似度。如果是自己训练的模型，就看训练时 loss 函数用的什么度量，推理时保持一致。实在拿不准就跑个 A/B 测试，用业务指标说话，别凭感觉猜。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度不同场景的选型考量向量数据库的索引加速实际踩坑经验&lt;/p&gt;&lt;p&gt;提问：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？提问：为什么说曼哈顿距离对高维稀疏数据更友好？提问：实际业务中怎么选向量搜索的距离度量？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？&lt;a href=&quot;#向量数据库中常见的向量搜索方法余弦相似度欧几里得距离和曼哈顿距离分别是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;有什么区别？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;有什么区别？&lt;/li&gt;
&lt;li&gt;VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。文本向量检索基本都用它，因为我们关心的是语义方向，一篇 100 字的文章和一篇 1000 字的文章只要讲的是同一个主题，余弦相似度就会很高。取值范围 -1 到 1，1 是完全同向，-1 是完全反向。欧几里得距离算的是空间中两点之间的直线距离，就是勾股定理那一套。图像检索、人脸识别这类场景用得多，因为像素特征向量本身就有”绝对位置”的含义，两张图的特征向量在空间里离得越近，长得就越像。取值 ≥ 0，越小越相似。曼哈顿距离把各维度的差值绝对值加起来，像在城市街区里沿着街道走，不能斜着穿。网格数据、稀疏特征向量用得比较多，比如地图坐标计算、高维稀疏文本特征。取值 ≥ 0，同样越小越相似。三种方法的选型逻辑：文本、推荐系统首选余弦相似度；图像、视频检索首选欧氏距离；网格坐标、稀疏高维数据考虑曼哈顿距离。&lt;/p&gt;&lt;p&gt;数学公式与计算复杂度假设有两个 n 维向量 A 和 B：1）余弦相似度的公式是两个向量的点积除以模长的乘积，计算量主要是 n 次乘法加 n 次加法，再算两个模长。Faiss、Milvus 这类向量数据库内部会对归一化后的向量做优化，归一化之后余弦相似度就等价于点积，省掉模长计算。&lt;/p&gt;&lt;p&gt;2） 欧氏距离是各维度差值平方和再开根号。实际检索时经常省掉开根号这一步，直接比较平方和就够了，能省不少计算。&lt;/p&gt;&lt;p&gt;3） 曼哈顿距离是各维度差值绝对值之和，计算最简单，没有乘法和开方，在高维稀疏场景下效率有优势。三种距离的计算过程对比：余弦相似度：先算点积 A·B，再算 |A| 和 |B|，最后做除法&lt;/p&gt;&lt;p&gt;欧氏距离：逐维度算差值、平方、累加，最后开根号&lt;/p&gt;&lt;p&gt;曼哈顿距离：逐维度算差值、取绝对值、累加不同场景的选型考量文本语义检索基本锁定余弦相似度，原因很直接：Embedding 模型输出的向量长度本身没有业务含义，一个句子长一点短一点不影响语义，我们只关心向量指向哪个方向。OpenAI 的 text-embedding-ada-002、BGE、M3E 这些模型出来的向量都建议用余弦相似度。图像检索更适合欧氏距离，ResNet、CLIP 这类视觉模型提取的特征向量，其数值大小本身携带了像素强度、纹理密度这些信息。人脸识别领域的 ArcFace、CosFace 虽然名字里带 Cos，但训练时用的是角度 margin，推理时用欧氏距离效果更稳定。曼哈顿距离在推荐系统的用户行为特征上有奇效，用户点击、购买这类行为天然是 0/1 稀疏向量，曼哈顿距离对这种数据不敏感于个别维度的极端值，鲁棒性比欧氏距离好。向量数据库的索引加速不管用哪种距离度量，暴力遍历 1 亿条向量肯定扛不住，所以向量数据库都会建索引。主流的索引算法：1）IVF 系列：先把向量空间切成 1000-10000 个聚类中心，查询时只在最近的几个聚类里找，Milvus、Faiss 都支持。&lt;/p&gt;&lt;p&gt;2） HNSW：构建多层图结构，高层稀疏跳跃、低层密集精确，Pinecone、Qdrant 默认都用这个。&lt;/p&gt;&lt;p&gt;3） PQ 量化：把 128 维向量切成 8 个子空间，每个子空间量化成 256 个码本，空间压缩 32 倍，精度损失可控。这些索引算法和距离度量是正交的，IVF 搭余弦、HNSW 搭欧氏都行，只要在建索引和查询时保持一致就没问题。实际踩坑经验1）向量没归一化就用余弦相似度，结果会很诡异。有些 Embedding 模型输出的向量本身不是单位向量，得自己先 L2 归一化再存进向量库。&lt;/p&gt;&lt;p&gt;2） 欧氏距离对数值尺度敏感，如果某几个维度的数值特别大，会把距离带偏。工业界常见做法是先做 z-score 标准化，让各维度方差一致。&lt;/p&gt;&lt;p&gt;3） 高维空间有”维度灾难”，当维度超过几百维，所有向量之间的距离都趋于相等，区分度变差。这时候降维或者换用近似算法比纠结用哪种距离更重要。&lt;/p&gt;&lt;p&gt;维基百科余弦相似度维基百科欧几里得距离维基百科曼哈顿距离&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？回答：归一化之后所有向量的模长都是 1，欧氏距离的平方展开是 |A|² + |B|² - 2A·B = 2 - 2A·B，而余弦相似度就是 A·B。两者是单调递减关系，排序结果完全一致。所以很多向量库内部会强制归一化，统一用点积来算，还能利用 SIMD 指令加速。- &lt;strong&gt;提问&lt;/strong&gt;：为什么说曼哈顿距离对高维稀疏数据更友好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：稀疏向量里大部分维度都是 0，有值的维度可能差异很大。欧氏距离会把大差异平方放大，一个维度差 10 就贡献 100；曼哈顿距离只是线性累加，差 10 就贡献 10。这样少数几个极端维度不会主导整体距离，对稀疏数据更稳定。- &lt;strong&gt;提问&lt;/strong&gt;：实际业务中怎么选向量搜索的距离度量？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：先看 Embedding 模型官方推荐，大多数文本模型都建议余弦相似度。如果是自己训练的模型，就看训练时 loss 函数用的什么度量，推理时保持一致。实在拿不准就跑个 A/B 测试，用业务指标说话，别凭感觉猜。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度不同场景的选型考量向量数据库的索引加速实际踩坑经验&lt;/p&gt;&lt;p&gt;提问：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？提问：为什么说曼哈顿距离对高维稀疏数据更友好？提问：实际业务中怎么选向量搜索的距离度量？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;Copilot 模式和 Agent 模式的区别是什么？上次浏览：2026-03-16 14:49:50什么是向量数据库？在基于大模型的应用开发中，向量数据库主要解决什么问题？你都了解哪些向量数据库？如何选型？上次浏览：2026-03-16 14:50:03向量数据库原理是什么？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;请简述下它的原理上次浏览：2026-03-16 14:50:13向量数据库中的 HNSW、LSH、PQ 分别是什么意思？向量数据库中的 ANN 是什么？为什么需要用它？向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？向量数据库的工作流程有哪些？请简述下什么是 MCP 协议，它在 AI 大模型系统中的作用是什么？上次浏览：2026-03-16 14:50:33MCP 架构包含哪些核心组件？上次浏览：2026-03-16 14:51:22MCP 协议支持哪两种模式？上次浏览：2026-03-16 14:51:4211595. 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。文本向量检索基本都用它，因为我们关心的是语义方向，一篇 100 字的文章和一篇 1000 字的文章只要讲的是同一个主题，余弦相似度就会很高。取值范围 -1 到 1，1 是完全同向，-1 是完全反向。欧几里得距离算的是空间中两点之间的直线距离，就是勾股定理那一套。图像检索、人脸识别这类场景用得多，因为像素特征向量本身就有”绝对位置”的含义，两张图的特征向量在空间里离得越近，长得就越像。取值 ≥ 0，越小越相似。曼哈顿距离把各维度的差值绝对值加起来，像在城市街区里沿着街道走，不能斜着穿。网格数据、稀疏特征向量用得比较多，比如地图坐标计算、高维稀疏文本特征。取值 ≥ 0，同样越小越相似。三种方法的选型逻辑：文本、推荐系统首选余弦相似度；图像、视频检索首选欧氏距离；网格坐标、稀疏高维数据考虑曼哈顿距离。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度假设有两个 n 维向量 A 和 B：1）余弦相似度的公式是两个向量的点积除以模长的乘积，计算量主要是 n 次乘法加 n 次加法，再算两个模长。Faiss、Milvus 这类向量数据库内部会对归一化后的向量做优化，归一化之后余弦相似度就等价于点积，省掉模长计算。&lt;/p&gt;&lt;p&gt;2） 欧氏距离是各维度差值平方和再开根号。实际检索时经常省掉开根号这一步，直接比较平方和就够了，能省不少计算。&lt;/p&gt;&lt;p&gt;3） 曼哈顿距离是各维度差值绝对值之和，计算最简单，没有乘法和开方，在高维稀疏场景下效率有优势。三种距离的计算过程对比：余弦相似度：先算点积 A·B，再算 |A| 和 |B|，最后做除法&lt;/p&gt;&lt;p&gt;欧氏距离：逐维度算差值、平方、累加，最后开根号&lt;/p&gt;&lt;p&gt;曼哈顿距离：逐维度算差值、取绝对值、累加不同场景的选型考量文本语义检索基本锁定余弦相似度，原因很直接：Embedding 模型输出的向量长度本身没有业务含义，一个句子长一点短一点不影响语义，我们只关心向量指向哪个方向。OpenAI 的 text-embedding-ada-002、BGE、M3E 这些模型出来的向量都建议用余弦相似度。图像检索更适合欧氏距离，ResNet、CLIP 这类视觉模型提取的特征向量，其数值大小本身携带了像素强度、纹理密度这些信息。人脸识别领域的 ArcFace、CosFace 虽然名字里带 Cos，但训练时用的是角度 margin，推理时用欧氏距离效果更稳定。曼哈顿距离在推荐系统的用户行为特征上有奇效，用户点击、购买这类行为天然是 0/1 稀疏向量，曼哈顿距离对这种数据不敏感于个别维度的极端值，鲁棒性比欧氏距离好。向量数据库的索引加速不管用哪种距离度量，暴力遍历 1 亿条向量肯定扛不住，所以向量数据库都会建索引。主流的索引算法：1）IVF 系列：先把向量空间切成 1000-10000 个聚类中心，查询时只在最近的几个聚类里找，Milvus、Faiss 都支持。&lt;/p&gt;&lt;p&gt;2） HNSW：构建多层图结构，高层稀疏跳跃、低层密集精确，Pinecone、Qdrant 默认都用这个。&lt;/p&gt;&lt;p&gt;3） PQ 量化：把 128 维向量切成 8 个子空间，每个子空间量化成 256 个码本，空间压缩 32 倍，精度损失可控。这些索引算法和距离度量是正交的，IVF 搭余弦、HNSW 搭欧氏都行，只要在建索引和查询时保持一致就没问题。实际踩坑经验1）向量没归一化就用余弦相似度，结果会很诡异。有些 Embedding 模型输出的向量本身不是单位向量，得自己先 L2 归一化再存进向量库。&lt;/p&gt;&lt;p&gt;2） 欧氏距离对数值尺度敏感，如果某几个维度的数值特别大，会把距离带偏。工业界常见做法是先做 z-score 标准化，让各维度方差一致。&lt;/p&gt;&lt;p&gt;3） 高维空间有”维度灾难”，当维度超过几百维，所有向量之间的距离都趋于相等，区分度变差。这时候降维或者换用近似算法比纠结用哪种距离更重要。&lt;/p&gt;&lt;p&gt;维基百科余弦相似度维基百科欧几里得距离维基百科曼哈顿距离&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？回答：归一化之后所有向量的模长都是 1，欧氏距离的平方展开是 |A|² + |B|² - 2A·B = 2 - 2A·B，而余弦相似度就是 A·B。两者是单调递减关系，排序结果完全一致。所以很多向量库内部会强制归一化，统一用点积来算，还能利用 SIMD 指令加速。- &lt;strong&gt;提问&lt;/strong&gt;：为什么说曼哈顿距离对高维稀疏数据更友好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：稀疏向量里大部分维度都是 0，有值的维度可能差异很大。欧氏距离会把大差异平方放大，一个维度差 10 就贡献 100；曼哈顿距离只是线性累加，差 10 就贡献 10。这样少数几个极端维度不会主导整体距离，对稀疏数据更稳定。- &lt;strong&gt;提问&lt;/strong&gt;：实际业务中怎么选向量搜索的距离度量？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：先看 Embedding 模型官方推荐，大多数文本模型都建议余弦相似度。如果是自己训练的模型，就看训练时 loss 函数用的什么度量，推理时保持一致。实在拿不准就跑个 A/B 测试，用业务指标说话，别凭感觉猜。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度不同场景的选型考量向量数据库的索引加速实际踩坑经验&lt;/p&gt;&lt;p&gt;提问：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？提问：为什么说曼哈顿距离对高维稀疏数据更友好？提问：实际业务中怎么选向量搜索的距离度量？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？&lt;a href=&quot;#向量数据库中常见的向量搜索方法余弦相似度欧几里得距离和曼哈顿距离分别是什么-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;有什么区别？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？&lt;a href=&quot;#向量数据库中常见的向量搜索方法余弦相似度欧几里得距离和曼哈顿距离分别是什么有什么区别-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;向量数据库中，常见的向量搜索方法：余弦相似度、欧几里得距离和曼哈顿距离分别是什么？有什么区别？VIP中等AI大模型RAG向量数据库标记分享211328面试问答向量搜索的核心就是衡量两个向量有多”像”，三种方法各有侧重：余弦相似度只看方向不看长度，两个向量夹角越小、值越接近 1，说明方向越一致。文本向量检索基本都用它，因为我们关心的是语义方向，一篇 100 字的文章和一篇 1000 字的文章只要讲的是同一个主题，余弦相似度就会很高。取值范围 -1 到 1，1 是完全同向，-1 是完全反向。欧几里得距离算的是空间中两点之间的直线距离，就是勾股定理那一套。图像检索、人脸识别这类场景用得多，因为像素特征向量本身就有”绝对位置”的含义，两张图的特征向量在空间里离得越近，长得就越像。取值 ≥ 0，越小越相似。曼哈顿距离把各维度的差值绝对值加起来，像在城市街区里沿着街道走，不能斜着穿。网格数据、稀疏特征向量用得比较多，比如地图坐标计算、高维稀疏文本特征。取值 ≥ 0，同样越小越相似。三种方法的选型逻辑：文本、推荐系统首选余弦相似度；图像、视频检索首选欧氏距离；网格坐标、稀疏高维数据考虑曼哈顿距离。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度假设有两个 n 维向量 A 和 B：1）余弦相似度的公式是两个向量的点积除以模长的乘积，计算量主要是 n 次乘法加 n 次加法，再算两个模长。Faiss、Milvus 这类向量数据库内部会对归一化后的向量做优化，归一化之后余弦相似度就等价于点积，省掉模长计算。&lt;/p&gt;&lt;p&gt;2） 欧氏距离是各维度差值平方和再开根号。实际检索时经常省掉开根号这一步，直接比较平方和就够了，能省不少计算。&lt;/p&gt;&lt;p&gt;3） 曼哈顿距离是各维度差值绝对值之和，计算最简单，没有乘法和开方，在高维稀疏场景下效率有优势。三种距离的计算过程对比：余弦相似度：先算点积 A·B，再算 |A| 和 |B|，最后做除法&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;欧氏距离：逐维度算差值、平方、累加，最后开根号&lt;/li&gt;
&lt;li&gt;曼哈顿距离：逐维度算差值、取绝对值、累加不同场景的选型考量文本语义检索基本锁定余弦相似度，原因很直接：Embedding 模型输出的向量长度本身没有业务含义，一个句子长一点短一点不影响语义，我们只关心向量指向哪个方向。OpenAI 的 text-embedding-ada-002、BGE、M3E 这些模型出来的向量都建议用余弦相似度。图像检索更适合欧氏距离，ResNet、CLIP 这类视觉模型提取的特征向量，其数值大小本身携带了像素强度、纹理密度这些信息。人脸识别领域的 ArcFace、CosFace 虽然名字里带 Cos，但训练时用的是角度 margin，推理时用欧氏距离效果更稳定。曼哈顿距离在推荐系统的用户行为特征上有奇效，用户点击、购买这类行为天然是 0/1 稀疏向量，曼哈顿距离对这种数据不敏感于个别维度的极端值，鲁棒性比欧氏距离好。向量数据库的索引加速不管用哪种距离度量，暴力遍历 1 亿条向量肯定扛不住，所以向量数据库都会建索引。主流的索引算法：1）IVF 系列：先把向量空间切成 1000-10000 个聚类中心，查询时只在最近的几个聚类里找，Milvus、Faiss 都支持。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;2） HNSW：构建多层图结构，高层稀疏跳跃、低层密集精确，Pinecone、Qdrant 默认都用这个。&lt;/p&gt;&lt;p&gt;3） PQ 量化：把 128 维向量切成 8 个子空间，每个子空间量化成 256 个码本，空间压缩 32 倍，精度损失可控。这些索引算法和距离度量是正交的，IVF 搭余弦、HNSW 搭欧氏都行，只要在建索引和查询时保持一致就没问题。实际踩坑经验1）向量没归一化就用余弦相似度，结果会很诡异。有些 Embedding 模型输出的向量本身不是单位向量，得自己先 L2 归一化再存进向量库。&lt;/p&gt;&lt;p&gt;2） 欧氏距离对数值尺度敏感，如果某几个维度的数值特别大，会把距离带偏。工业界常见做法是先做 z-score 标准化，让各维度方差一致。&lt;/p&gt;&lt;p&gt;3） 高维空间有”维度灾难”，当维度超过几百维，所有向量之间的距离都趋于相等，区分度变差。这时候降维或者换用近似算法比纠结用哪种距离更重要。&lt;/p&gt;&lt;p&gt;维基百科余弦相似度维基百科欧几里得距离维基百科曼哈顿距离&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？回答：归一化之后所有向量的模长都是 1，欧氏距离的平方展开是 |A|² + |B|² - 2A·B = 2 - 2A·B，而余弦相似度就是 A·B。两者是单调递减关系，排序结果完全一致。所以很多向量库内部会强制归一化，统一用点积来算，还能利用 SIMD 指令加速。- &lt;strong&gt;提问&lt;/strong&gt;：为什么说曼哈顿距离对高维稀疏数据更友好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：稀疏向量里大部分维度都是 0，有值的维度可能差异很大。欧氏距离会把大差异平方放大，一个维度差 10 就贡献 100；曼哈顿距离只是线性累加，差 10 就贡献 10。这样少数几个极端维度不会主导整体距离，对稀疏数据更稳定。- &lt;strong&gt;提问&lt;/strong&gt;：实际业务中怎么选向量搜索的距离度量？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：先看 Embedding 模型官方推荐，大多数文本模型都建议余弦相似度。如果是自己训练的模型，就看训练时 loss 函数用的什么度量，推理时保持一致。实在拿不准就跑个 A/B 测试，用业务指标说话，别凭感觉猜。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数学公式与计算复杂度不同场景的选型考量向量数据库的索引加速实际踩坑经验&lt;/p&gt;&lt;p&gt;提问：余弦相似度和欧氏距离在归一化向量上是等价的，能解释一下为什么吗？提问：为什么说曼哈顿距离对高维稀疏数据更友好？提问：实际业务中怎么选向量搜索的距离度量？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%9C%A8-rag-%E4%B8%AD-%E4%BD%A0%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9-embedding-model-%E5%B5%8C%E5%85%A5%E6%A8%A1%E5%9E%8B-%E9%9C%80%E8%A6%81%E8%80%83%E8%99%91%E5%93%AA%E4%BA%9B%E5%9B%A0%E7%B4%A0-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%9C%A8-rag-%E4%B8%AD-%E4%BD%A0%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9-embedding-model-%E5%B5%8C%E5%85%A5%E6%A8%A1%E5%9E%8B-%E9%9C%80%E8%A6%81%E8%80%83%E8%99%91%E5%93%AA%E4%BA%9B%E5%9B%A0%E7%B4%A0-_%E6%95%B4%E7%90%86/</guid><description># 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？ ## 问题 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？ ## 标准回答 在 RAG 中，你如何选择 </description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;a href=&quot;#在-rag-中你如何选择-embedding-model-嵌入模型需要考虑哪些因素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。是不是针对垂直领域做过预训练或微调，金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材4）广，多语言支持。是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能不能正确嵌入5）大，数据规模匹配。模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩6）活，开放性与生态。是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活7）省，成本。计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;语义准确性怎么评估这是模型的理解基本功，通常用语义相似度任务来评估，比如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。需要注意两点：一是部分模型擅长短文本，像 Sentence-BERT 处理长文本时会丢失上下文，这种情况得选 RoBERTa 变种或 Longformer 类模型；二是通用模型在专业领域可能词不达意，比如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。模型效率的权衡领域适配的三种策略让模型懂行话有三种常见策略：1）直接选领域专用模型，LegalBERT 用于法律文档，PubMedBERT 用于医学文献2）用通用模型加领域数据微调，适合有私有语料的场景，比如用公司内部客服对话数据微调3）添加领域适配器，用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域有个真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”这些词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。多语言支持单语言模型像 Chinese-BERT 只支持中文，XLM-RoBERTa 支持 100 多种语言但需要分别处理。跨语言模型像 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。小语种比如斯瓦希里语可能没有专用模型，这时候得用通用多语言模型加数据增强，比如用 Google 的 multilingual T5 模型配合少量目标语言语料微调。开源和闭源的选择开源模型像 Sentence-BERT 可以灵活修改代码，适合深度定制，比如加入自定义分词器，但需要自己解决部署和优化问题。闭源 API 像 OpenAI Embedding、Cohere 开箱即用，适合快速验证 MVP，但受限于厂商更新和费用，OpenAI 按 token 收费，长文本成本比较高。相关文档与扩展阅读链接Hugging Face 官方 Embedding 模型合集：Hugging Face Embedding Models11549. 在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？回答：可以用级联策略。第一阶段用轻量模型快速召回 Top 100，MiniLM 这种毫秒级就能出结果。第二阶段用重型模型对这 100 条做精排，BERT-large 处理 100 条也就几百毫秒。这样既保证了响应速度，又不损失最终的语义准确性。另外可以考虑模型蒸馏，用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：最靠谱的方式是构建评测数据集。从业务数据里挑 500 到 1000 条 query，人工标注相关文档，然后用 Recall@K、MRR 这些指标来评估召回效果。不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和你的业务数据分布可能差很远。另外可以做 A/B 测试，看用户的点击率和满意度有没有提升。- &lt;strong&gt;提问&lt;/strong&gt;：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：可以试几个方案。一是用 LoRA 这种参数高效微调技术，几千条数据就能有效果，训练成本也低。二是用数据增强，把现有数据用大模型改写扩充，或者用同义词替换、回译等方式扩大数据量。三是构建领域词表做预处理，把专业术语替换成通用模型能理解的描述，检索完再还原回来。
① 开源模型，比如 BGE、M3E、Sentence Transformers、E5、GTE；&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;② 商业 embedding，比如 OpenAI text-embedding-3、Cohere、Google Gecko；&lt;/p&gt;&lt;p&gt;③ 大模型自带的向量接口展开新页面打开2025-11-18  16:5300回复NULL准快专广大活省准：大模型能否精确提取文档中重要信息快：向量转换速度专：是否有对不同的领域进行术语调整广：适配多语言大：语义和数据规模是否匹配活：相关社区或技术是否更新快展开新页面打开2025-08-23  03:1900回复晚夜微雨问海棠特训营在 RAG 系统中选择 Embedding 模型需综合考量以下核心要素，形成系统性决策框架：一、任务需求维度语义粒度短句匹配（如问答对）→ 选择擅长句子级嵌入的模型（如all-MiniLM-L6-v2）长文档检索展开新页面打开2025-04-22  14:1400回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;语义准确性怎么评估模型效率的权衡领域适配的三种策略多语言支持开源和闭源的选择相关文档与扩展阅读链接&lt;/p&gt;&lt;p&gt;提问：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？提问：怎么判断一个嵌入模型在你的业务场景下效果好不好？提问：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;什么是 RAG 中的分块？为什么需要分块？在 RAG 中，常见的分块策略有哪些？分别有什么区别？在 RAG 中的 Embedding 嵌入是什么？在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？上次浏览：2026-03-16 11:41:28在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？在 RAG 中，索引流程中的文档解析你们怎么做的？在 RAG 应用的过程中，关于提示工程的设计有什么心得和技巧吗？上次浏览：2026-03-16 11:41:50什么是 Advanced RAG？上次浏览：2026-03-16 11:42:17什么是 Modular RAG？上次浏览：2026-03-16 11:42:40什么是护栏技术？上次浏览：2026-03-16 11:42:49什么是 GPTCache？上次浏览：2026-03-16 11:43:3511550. 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。是不是针对垂直领域做过预训练或微调，金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材4）广，多语言支持。是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能不能正确嵌入5）大，数据规模匹配。模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩6）活，开放性与生态。是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活7）省，成本。计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费&lt;/p&gt;&lt;p&gt;语义准确性怎么评估这是模型的理解基本功，通常用语义相似度任务来评估，比如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。需要注意两点：一是部分模型擅长短文本，像 Sentence-BERT 处理长文本时会丢失上下文，这种情况得选 RoBERTa 变种或 Longformer 类模型；二是通用模型在专业领域可能词不达意，比如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。模型效率的权衡领域适配的三种策略让模型懂行话有三种常见策略：1）直接选领域专用模型，LegalBERT 用于法律文档，PubMedBERT 用于医学文献2）用通用模型加领域数据微调，适合有私有语料的场景，比如用公司内部客服对话数据微调3）添加领域适配器，用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域有个真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”这些词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。多语言支持单语言模型像 Chinese-BERT 只支持中文，XLM-RoBERTa 支持 100 多种语言但需要分别处理。跨语言模型像 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。小语种比如斯瓦希里语可能没有专用模型，这时候得用通用多语言模型加数据增强，比如用 Google 的 multilingual T5 模型配合少量目标语言语料微调。开源和闭源的选择开源模型像 Sentence-BERT 可以灵活修改代码，适合深度定制，比如加入自定义分词器，但需要自己解决部署和优化问题。闭源 API 像 OpenAI Embedding、Cohere 开箱即用，适合快速验证 MVP，但受限于厂商更新和费用，OpenAI 按 token 收费，长文本成本比较高。相关文档与扩展阅读链接Hugging Face 官方 Embedding 模型合集：Hugging Face Embedding Models11549. 在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？回答：可以用级联策略。第一阶段用轻量模型快速召回 Top 100，MiniLM 这种毫秒级就能出结果。第二阶段用重型模型对这 100 条做精排，BERT-large 处理 100 条也就几百毫秒。这样既保证了响应速度，又不损失最终的语义准确性。另外可以考虑模型蒸馏，用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：最靠谱的方式是构建评测数据集。从业务数据里挑 500 到 1000 条 query，人工标注相关文档，然后用 Recall@K、MRR 这些指标来评估召回效果。不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和你的业务数据分布可能差很远。另外可以做 A/B 测试，看用户的点击率和满意度有没有提升。- &lt;strong&gt;提问&lt;/strong&gt;：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：可以试几个方案。一是用 LoRA 这种参数高效微调技术，几千条数据就能有效果，训练成本也低。二是用数据增强，把现有数据用大模型改写扩充，或者用同义词替换、回译等方式扩大数据量。三是构建领域词表做预处理，把专业术语替换成通用模型能理解的描述，检索完再还原回来。
① 开源模型，比如 BGE、M3E、Sentence Transformers、E5、GTE；&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;② 商业 embedding，比如 OpenAI text-embedding-3、Cohere、Google Gecko；&lt;/p&gt;&lt;p&gt;③ 大模型自带的向量接口展开新页面打开2025-11-18  16:5300回复NULL准快专广大活省准：大模型能否精确提取文档中重要信息快：向量转换速度专：是否有对不同的领域进行术语调整广：适配多语言大：语义和数据规模是否匹配活：相关社区或技术是否更新快展开新页面打开2025-08-23  03:1900回复晚夜微雨问海棠特训营在 RAG 系统中选择 Embedding 模型需综合考量以下核心要素，形成系统性决策框架：一、任务需求维度语义粒度短句匹配（如问答对）→ 选择擅长句子级嵌入的模型（如all-MiniLM-L6-v2）长文档检索展开新页面打开2025-04-22  14:1400回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;语义准确性怎么评估模型效率的权衡领域适配的三种策略多语言支持开源和闭源的选择相关文档与扩展阅读链接&lt;/p&gt;&lt;p&gt;提问：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？提问：怎么判断一个嵌入模型在你的业务场景下效果好不好？提问：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;a href=&quot;#在-rag-中你如何选择-embedding-model-嵌入模型需要考虑哪些因素-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。&lt;/li&gt;
&lt;li&gt;模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。&lt;/li&gt;
&lt;li&gt;推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。是不是针对垂直领域做过预训练或微调，金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材4）广，多语言支持。是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能不能正确嵌入5）大，数据规模匹配。模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩6）活，开放性与生态。是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活7）省，成本。计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费&lt;/p&gt;&lt;p&gt;语义准确性怎么评估这是模型的理解基本功，通常用语义相似度任务来评估，比如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。需要注意两点：一是部分模型擅长短文本，像 Sentence-BERT 处理长文本时会丢失上下文，这种情况得选 RoBERTa 变种或 Longformer 类模型；二是通用模型在专业领域可能词不达意，比如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。模型效率的权衡领域适配的三种策略让模型懂行话有三种常见策略：1）直接选领域专用模型，LegalBERT 用于法律文档，PubMedBERT 用于医学文献2）用通用模型加领域数据微调，适合有私有语料的场景，比如用公司内部客服对话数据微调3）添加领域适配器，用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域有个真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”这些词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。多语言支持单语言模型像 Chinese-BERT 只支持中文，XLM-RoBERTa 支持 100 多种语言但需要分别处理。跨语言模型像 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。小语种比如斯瓦希里语可能没有专用模型，这时候得用通用多语言模型加数据增强，比如用 Google 的 multilingual T5 模型配合少量目标语言语料微调。开源和闭源的选择开源模型像 Sentence-BERT 可以灵活修改代码，适合深度定制，比如加入自定义分词器，但需要自己解决部署和优化问题。闭源 API 像 OpenAI Embedding、Cohere 开箱即用，适合快速验证 MVP，但受限于厂商更新和费用，OpenAI 按 token 收费，长文本成本比较高。相关文档与扩展阅读链接Hugging Face 官方 Embedding 模型合集：Hugging Face Embedding Models11549. 在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？回答：可以用级联策略。第一阶段用轻量模型快速召回 Top 100，MiniLM 这种毫秒级就能出结果。第二阶段用重型模型对这 100 条做精排，BERT-large 处理 100 条也就几百毫秒。这样既保证了响应速度，又不损失最终的语义准确性。另外可以考虑模型蒸馏，用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：最靠谱的方式是构建评测数据集。从业务数据里挑 500 到 1000 条 query，人工标注相关文档，然后用 Recall@K、MRR 这些指标来评估召回效果。不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和你的业务数据分布可能差很远。另外可以做 A/B 测试，看用户的点击率和满意度有没有提升。- &lt;strong&gt;提问&lt;/strong&gt;：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：可以试几个方案。一是用 LoRA 这种参数高效微调技术，几千条数据就能有效果，训练成本也低。二是用数据增强，把现有数据用大模型改写扩充，或者用同义词替换、回译等方式扩大数据量。三是构建领域词表做预处理，把专业术语替换成通用模型能理解的描述，检索完再还原回来。
① 开源模型，比如 BGE、M3E、Sentence Transformers、E5、GTE；&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;② 商业 embedding，比如 OpenAI text-embedding-3、Cohere、Google Gecko；&lt;/p&gt;&lt;p&gt;③ 大模型自带的向量接口展开新页面打开2025-11-18  16:5300回复NULL准快专广大活省准：大模型能否精确提取文档中重要信息快：向量转换速度专：是否有对不同的领域进行术语调整广：适配多语言大：语义和数据规模是否匹配活：相关社区或技术是否更新快展开新页面打开2025-08-23  03:1900回复晚夜微雨问海棠特训营在 RAG 系统中选择 Embedding 模型需综合考量以下核心要素，形成系统性决策框架：一、任务需求维度语义粒度短句匹配（如问答对）→ 选择擅长句子级嵌入的模型（如all-MiniLM-L6-v2）长文档检索展开新页面打开2025-04-22  14:1400回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;语义准确性怎么评估模型效率的权衡领域适配的三种策略多语言支持开源和闭源的选择相关文档与扩展阅读链接&lt;/p&gt;&lt;p&gt;提问：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？提问：怎么判断一个嵌入模型在你的业务场景下效果好不好？提问：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;什么是 RAG 中的分块？为什么需要分块？在 RAG 中，常见的分块策略有哪些？分别有什么区别？在 RAG 中的 Embedding 嵌入是什么？在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？上次浏览：2026-03-16 11:41:28在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？在 RAG 中，索引流程中的文档解析你们怎么做的？在 RAG 应用的过程中，关于提示工程的设计有什么心得和技巧吗？上次浏览：2026-03-16 11:41:50什么是 Advanced RAG？上次浏览：2026-03-16 11:42:17什么是 Modular RAG？上次浏览：2026-03-16 11:42:40什么是护栏技术？上次浏览：2026-03-16 11:42:49什么是 GPTCache？上次浏览：2026-03-16 11:43:3511550. 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。是不是针对垂直领域做过预训练或微调，金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材4）广，多语言支持。是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能不能正确嵌入5）大，数据规模匹配。模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩6）活，开放性与生态。是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活7）省，成本。计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费&lt;/p&gt;&lt;p&gt;语义准确性怎么评估这是模型的理解基本功，通常用语义相似度任务来评估，比如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。需要注意两点：一是部分模型擅长短文本，像 Sentence-BERT 处理长文本时会丢失上下文，这种情况得选 RoBERTa 变种或 Longformer 类模型；二是通用模型在专业领域可能词不达意，比如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。模型效率的权衡领域适配的三种策略让模型懂行话有三种常见策略：1）直接选领域专用模型，LegalBERT 用于法律文档，PubMedBERT 用于医学文献2）用通用模型加领域数据微调，适合有私有语料的场景，比如用公司内部客服对话数据微调3）添加领域适配器，用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域有个真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”这些词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。多语言支持单语言模型像 Chinese-BERT 只支持中文，XLM-RoBERTa 支持 100 多种语言但需要分别处理。跨语言模型像 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。小语种比如斯瓦希里语可能没有专用模型，这时候得用通用多语言模型加数据增强，比如用 Google 的 multilingual T5 模型配合少量目标语言语料微调。开源和闭源的选择开源模型像 Sentence-BERT 可以灵活修改代码，适合深度定制，比如加入自定义分词器，但需要自己解决部署和优化问题。闭源 API 像 OpenAI Embedding、Cohere 开箱即用，适合快速验证 MVP，但受限于厂商更新和费用，OpenAI 按 token 收费，长文本成本比较高。相关文档与扩展阅读链接Hugging Face 官方 Embedding 模型合集：Hugging Face Embedding Models11549. 在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？回答：可以用级联策略。第一阶段用轻量模型快速召回 Top 100，MiniLM 这种毫秒级就能出结果。第二阶段用重型模型对这 100 条做精排，BERT-large 处理 100 条也就几百毫秒。这样既保证了响应速度，又不损失最终的语义准确性。另外可以考虑模型蒸馏，用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：最靠谱的方式是构建评测数据集。从业务数据里挑 500 到 1000 条 query，人工标注相关文档，然后用 Recall@K、MRR 这些指标来评估召回效果。不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和你的业务数据分布可能差很远。另外可以做 A/B 测试，看用户的点击率和满意度有没有提升。- &lt;strong&gt;提问&lt;/strong&gt;：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：可以试几个方案。一是用 LoRA 这种参数高效微调技术，几千条数据就能有效果，训练成本也低。二是用数据增强，把现有数据用大模型改写扩充，或者用同义词替换、回译等方式扩大数据量。三是构建领域词表做预处理，把专业术语替换成通用模型能理解的描述，检索完再还原回来。
① 开源模型，比如 BGE、M3E、Sentence Transformers、E5、GTE；&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;② 商业 embedding，比如 OpenAI text-embedding-3、Cohere、Google Gecko；&lt;/p&gt;&lt;p&gt;③ 大模型自带的向量接口展开新页面打开2025-11-18  16:5300回复NULL准快专广大活省准：大模型能否精确提取文档中重要信息快：向量转换速度专：是否有对不同的领域进行术语调整广：适配多语言大：语义和数据规模是否匹配活：相关社区或技术是否更新快展开新页面打开2025-08-23  03:1900回复晚夜微雨问海棠特训营在 RAG 系统中选择 Embedding 模型需综合考量以下核心要素，形成系统性决策框架：一、任务需求维度语义粒度短句匹配（如问答对）→ 选择擅长句子级嵌入的模型（如all-MiniLM-L6-v2）长文档检索展开新页面打开2025-04-22  14:1400回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;语义准确性怎么评估模型效率的权衡领域适配的三种策略多语言支持开源和闭源的选择相关文档与扩展阅读链接&lt;/p&gt;&lt;p&gt;提问：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？提问：怎么判断一个嵌入模型在你的业务场景下效果好不好？提问：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;a href=&quot;#在-rag-中你如何选择-embedding-model-嵌入模型需要考虑哪些因素-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？&lt;a href=&quot;#在-rag-中你如何选择-embedding-model-嵌入模型需要考虑哪些因素-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;在 RAG 中，你如何选择 Embedding Model 嵌入模型，需要考虑哪些因素？VIP中等AI大模型RAG标记分享302576面试问答选择 Embedding Model 核心看7 个因素，可以概括为”准、快、专、广、大、活、省”：1）准，语义准确性。模型能不能精准捕捉文本语义，长句理解、上下文关联、同义词区分这些能力直接影响向量相似度计算的可靠性2）快，模型效率。推理速度能不能满足业务实时性要求，QPS 高的场景不能用太大的模型，显存占用也得适配硬件资源3）专，领域适配。是不是针对垂直领域做过预训练或微调，金融模型懂”PE 估值”是市盈率，通用模型可能理解成体育器材4）广，多语言支持。是否支持业务所需语言，跨语言对齐能力怎么样，中英混合文本能不能正确嵌入5）大，数据规模匹配。模型参数量和训练数据规模要匹配语料复杂度，小数据用大模型容易过拟合，大数据用小模型会出现语义坍缩6）活，开放性与生态。是否开源、社区是否活跃、能不能定制化微调，API 调用是否灵活7）省，成本。计算成本包括训练推理的硬件投入，使用成本包括第三方 API 的 token 费用和商用授权费&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;语义准确性怎么评估这是模型的理解基本功，通常用语义相似度任务来评估，比如 STS-B 数据集，看模型对同义句和反义句的向量距离是否合理。需要注意两点：一是部分模型擅长短文本，像 Sentence-BERT 处理长文本时会丢失上下文，这种情况得选 RoBERTa 变种或 Longformer 类模型；二是通用模型在专业领域可能词不达意，比如”主诉”在医疗文本中是专有名词，通用模型可能理解成”主要诉求”。模型效率的权衡领域适配的三种策略让模型懂行话有三种常见策略：1）直接选领域专用模型，LegalBERT 用于法律文档，PubMedBERT 用于医学文献2）用通用模型加领域数据微调，适合有私有语料的场景，比如用公司内部客服对话数据微调3）添加领域适配器，用 LoRA 技术在不改变原模型的前提下新增少量参数适配领域有个真实案例：某电商场景的 RAG 用通用模型时，“SKU”、“客单价”这些词嵌入效果很差，切换到零售领域预训练的模型后，召回准确率提升了 23%。多语言支持单语言模型像 Chinese-BERT 只支持中文，XLM-RoBERTa 支持 100 多种语言但需要分别处理。跨语言模型像 mBERT 基于双语对齐训练，中英句子嵌入在同一空间，适合翻译场景。小语种比如斯瓦希里语可能没有专用模型，这时候得用通用多语言模型加数据增强，比如用 Google 的 multilingual T5 模型配合少量目标语言语料微调。开源和闭源的选择开源模型像 Sentence-BERT 可以灵活修改代码，适合深度定制，比如加入自定义分词器，但需要自己解决部署和优化问题。闭源 API 像 OpenAI Embedding、Cohere 开箱即用，适合快速验证 MVP，但受限于厂商更新和费用，OpenAI 按 token 收费，长文本成本比较高。相关文档与扩展阅读链接Hugging Face 官方 Embedding 模型合集：Hugging Face Embedding Models11549. 在 RAG 中，你知道有哪些 Embedding Model 嵌入模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果线上 QPS 很高，但又想保证语义准确性，怎么平衡？回答：可以用级联策略。第一阶段用轻量模型快速召回 Top 100，MiniLM 这种毫秒级就能出结果。第二阶段用重型模型对这 100 条做精排，BERT-large 处理 100 条也就几百毫秒。这样既保证了响应速度，又不损失最终的语义准确性。另外可以考虑模型蒸馏，用大模型的输出去训练小模型，让小模型在特定场景下接近大模型效果。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个嵌入模型在你的业务场景下效果好不好？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：最靠谱的方式是构建评测数据集。从业务数据里挑 500 到 1000 条 query，人工标注相关文档，然后用 Recall@K、MRR 这些指标来评估召回效果。不能只看 MTEB 榜单排名，因为榜单用的是通用数据集，和你的业务数据分布可能差很远。另外可以做 A/B 测试，看用户的点击率和满意度有没有提升。- &lt;strong&gt;提问&lt;/strong&gt;：公司内部文档很多专业术语，通用模型效果差，但又没有足够数据微调，怎么办？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回答&lt;/strong&gt;：可以试几个方案。一是用 LoRA 这种参数高效微调技术，几千条数据就能有效果，训练成本也低。二是用数据增强，把现有数据用大模型改写扩充，或者用同义词替换、回译等方式扩大数据量。三是构建领域词表做预处理，把专业术语替换成通用模型能理解的描述，检索完再还原回来。- ① 开源模型，比如 BGE、M3E、Sentence Transformers、E5、GTE；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;② 商业 embedding，比如 OpenAI text-embedding-3、Cohere、Google Gecko；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>如何找到第一份agent实习 项目分享</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E7%AC%AC%E4%B8%80%E4%BB%BDagent%E5%AE%9E%E4%B9%A0-%E9%A1%B9%E7%9B%AE%E5%88%86%E4%BA%AB/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E7%AC%AC%E4%B8%80%E4%BB%BDagent%E5%AE%9E%E4%B9%A0-%E9%A1%B9%E7%9B%AE%E5%88%86%E4%BA%AB/</guid><description>各位大家在關注或者在寻找Agent開發後段開發或者全戰開發的小夥伴們大家好 今天我就在這裡就進行一期對一個人在最近兩個月早熟期時期 最後可力無收到最後短暫寫到一個小場出場的一個短暫時期 最終拿到Over的一系經驗分享不要包括幾個部分所謂是個</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;各位大家在關注或者在寻找Agent開發後段開發或者全戰開發的小夥伴們大家好
今天我就在這裡就進行一期對一個人在最近兩個月早熟期時期
最後可力無收到最後短暫寫到一個小場出場的一個短暫時期
最終拿到Over的一系經驗分享不要包括幾個部分所謂是個人的背景
我的熟期時期的一些經歷
最後是項目的方面介紹一下個人的項目情況
還有一些用AI幫助我做的事情
最後就是相關聯結
昨天主播就是一個一名耳其界的中上九本科生個人是三個零零是些零比三零零
然後在書記時期的時候我也是拿到一些大場比如騰訊之間
美團、螞蟻這些大型企業的緣面的
都是有一些中場比如中按Opo等等一些小場的情況大家可以看一下我的時間中
我是從大概三月中旬開始脫地的
最終是3月23號的第一場面是電給自己
那大師主播我已經會準備得非常不同分
直接贏得脫皮上結果就靠大麻了
所以也是三進攻最後全都到在一面大概是從5月中旬的時候
我就用我後面優化後新改了一個AI項目
開始進行面試這種時候到了出場的Offer
還有Opo到了HR面但是可能HR面後面掛了
我介紹一下個人的項目情況
我就是一個後端的高比方項目加一個AI項目
這個後端項目的話就是
一個支持星球上的當時花錢買的項目
所以就不放出來建立了
但是我感覺那個項目有點太難了
我還得自己給它變簡單了一點
加起來其實大家直接用HMR點皮加做一些優化
感覺是OK的可以給大家看一下我舊項目的剪例是怎麼寫的
畢竟我之前那些大廠的項目也是
剛好舊項目吃月到的
首先肯定是有一些寫到好的地方
第一點我感覺就是我的格式和結構
我之前是前面黑底字的一些改革
加上帽號後面是詳細的描述
第二點可能就是就這些數字的變化
會從原來一個比較差的指標
然後後面得到一個更良好的指標
為什麼說這些數字的變化很重要
因為你又試著就意味著你要做側瓶
覺得做項目比較重要的感覺
就是有這種側瓶思維還有壁環的思維
因為你就壁環了
才是完整流程
意味著你這個項目才是可以跌代的可以優化的
也是可以反映出你個人的優化的思維
我們大概不僅內容有拉格它的大概流程
即方面的設計
Agent工作流
這個工作流就是這種拉掛伏裡面的那個節點
可以實現
然後就是工具
然後模型優化
這一個當時是我趴自己的項目
亮點太少強行
要加了一個我説
大概是我的項目
某一個環節
那應該是評審
那環節可能太厚實了
我就想給它做一個
效應的項目
微調一下
看它們接受了一些時間
降低延遲
好的
就先談一談
為什麼我從一個拉格項目
最後換了一個項目
變成了一個mini boat
只能提項目
然後它
第一點
你用項目
假設你做那個拉格項目放上去
你的便宜式觀彈
一連要可能回外圖
就我們先
需要瞭解到
拉格它其實在工業上
是用來處理達到
可能前往跟兩級的即使
如果你是
那種比較即使個
300個的溫當的話
應該是沒有必要上
拉格的
假設我會答
我是為了解
解決生活中的需求
比如說
這裡我的筆記
但它的
筆記數量可能
達不到那麼多
就可能不算一個應用場景
那你假如說
我找做一個醫療入手
或者是金融入手
就是會放一些
比如說
公開的數據進去
但
現在的
在一個方面
現在
A3也可以進行電網搜索
如果有電網搜索功能之後
我直接上網去搜
因為都是公開的資料
除非你是4人的文道
公開資料
你就是
拉格
進行處理
跟直接進行搜索
它的效果對比
要證明
拉格的效果
要比這個
連搜索也更好
這可能是需要一些數據的
職程的
我問你說
我是為了學習使用
我要學習一下AI
我就做了一個拉格
那我感覺也是
不太
好的理由
因為AI的方便
我覺得是一個
一直在追溯勒典的
這樣一個方向
因為它的
技術跌代是非常快的
大概
可能兩三個月
我就會突然冒出一些新的技術
那
這個拉格
它其實是2024年
的兩三年前
比較火的技術
那你說
我學AI
我用這個
來進行學
可能會讓
密室官覺得
你對
這是新技術的
好幾何探索
不住
第二個理由就是對
主拉格你要對
它有
非常多的數據
你要對它
就是一些掌握
要大概了解
你怎麼得到一些
對家的選擇
比如說
拉格裡面
它有
切塊
切塊大橋的選擇
還有
評測數據
指標的選擇
然後
那個
Invading的模型的選擇
可能是需要你
執行
很多組的AB測試
來得到這種答案
還有
密室官
可能會問你一些
比如說
你這個
技術方面
你顯得三層技衣設計
你可以
詳細講講
你大概存了
幾個月的數據
它可問你
數據量的大小數
多少
你數據的
存儲上線是多少
問你
大概
Token值
能存多少
我倒是這個
面臉的
就不存在
我問問問
還有點
就是
多數拉格
切塊不算是
真正的Agent
因為
很多拉格
它其實
就停留在了一個
那種對話
上面
跟真正的Agent
不太一樣
真正Agent
怎麼樣
就是
包裹
上下文
包裹
機
包裹工具
掉用
等等
然後
它的主體
是一個Agent loop
就是一個
循環
它會
每一次
就用輸入一個
問題
之後
我們請會通過
一個
外容
不斷的循環
它會判斷
這一次
它會接駁
或是直接
返回對話
並退出
如果
音要做拉格
應該要做
Agent
還有一個
就是
拉格
我覺得
做得人
太多了
一方面
如果
它
做得非常好
便是
可能
記住了它
這個
項目的亮點
那大家
是不是有可能
拿去問
下一個
那邊是
你
我要在這方面
做類似的創新
項目
你不要做到
用話
別人做到了
就
很容易
就
被別人
逼下去
或是
因為
太大眾了
就
沒有什麼新意
容易
讓人
視覺
疲勞
就
介紹一下
我的新項目
那
minibot
可能
就簡單的
描述一下
這個項目
怎麼做出來了
主要參考了
幾項
項目
是它開源
的
侵量級
的
智能體
框架
它大概就
四千多行
我覺得
是一個
非常有趣
我們快速上手
了解
AI
安全智能體
甚至是
速通
成一個項目
的
很好的框架
同時
我有
學了
能
code
這個
課程
去開源
的
項目
是它
裡面的
一些
哈利斯
設計
想辦法
把哈利斯
設計
融入
這個
Nanable
它的
黃架
裡面
同時
我做
這個項目
是
有參考
一些
小紅
書上
黃紅
學
H
他的
P
可項目
就
介紹一下
正和新內容
先介紹
記憶
算項目
管理
我覺得這算是
Nanable
它的
記憶
就好
這兩層
記憶
加工
可能有些
不準確
大家
繼續學
想
想想
關於
參考
難道
不懂
他
可能
有些
動態
主動
是
把code
的
他
裡面的
想想
會有進行
拆解
太長的工具
他
就會
換成
一個
站位
符
來
要的方式
還有
記憶
壓縮部分
就
這次
先
詳細
詳細
掌握
這個
互可
其實
算是
一個
實現的手段
學現
這些
工具
安全
運行
質地
算是
一個目的
工具
安全
設計
三層
審批
這個
例子
例如
設計
我工具
全部的工具
一線工具
是
白銘單
可以
用它
直接放行
所以
讓它運行
會名單的話
可能有危險
需要我這個用戶
確認
要不要
運行
會名單
直接
繼續
不能運行
這一個工具
波子的意思就是
比如
這個
pre-tour use
就是
在你
調用工具
之前
它是
一定會走的
像是
一個
不發按鈕
就你
到
土耳
就一定
會先觸發
這個pre-tour use
在pre-tour use
裡面
就可以
用到
我之前
設計
這個
三層審批
就在這裡判斷一下
它是
哪一個名單的
然後
它是
審計的
避完
就是設計的
Benchmark任務級
這部分說出來
就是有參考
到P-Code這個項目
我介紹一下
Benchmark
大概是
什麼情況
Benchmark就
比如說你設計好
一個
這室的問題
裡面你可以審
一些
比如任務的ID
任務
任務裡面
你輸入
是什麼
可以
給上下文
還可以
放一些
比如你的
循環的預算值
也可以放一些
參考的
判斷指標
那
到就是
讓你的Agent
去執行這室的裡面
讓它
避行
就讓它看它
給出來的答案裡面
比如說
你
查一個天氣
流查
背景的天氣
大家是不是
提到
背景
提到天氣
這件事
就是
判斷
你查
這個天氣
也不能循環
太多次
你查一個天氣
你讓這個Agent
循環的
十次
可能
超出那個
循環預算
就
不算通過
就通過這樣
一個一個
的設計
任務級的方式
可以得到
也就是
當前
你的Agent
可以通過的
百分別
算是通過率
你可以定型優化
可以定型型
和你的致力
之後
你說
我這一次通過的
任務級
提高了多少
PT提高了多少
這也是一個
一款
和評測的4位
大概
項目是
講到這裡
專業級的
就大家參考一下
就好
大概還是
後端的部分
我主要寫
My Circle Radice
因為中經濟
所以我個人找我的比較好
之前
學的是
Jama
Jama
那些
語言的八國
被不太說
我直接不寫上去
想Log
就像我學Molog
就不寫白不寫
也寫上去
還有
技術
還有操作系統
直接也可以放進去
還有這個AICoding
YepCoding
也比較重要的部分
也算是口察的重點
再介紹一下
我來找實際心情式
用了AI
幫助我做了哪些東西
第一點就是先建立
來幫我寫了
但是大家需要
有自己的判斷
所以它寫得好不好
然後
比如我
讓它找這個要求
前面一個要點
加帽
加上後面
加進描述
的格式來寫
我有時候
它會
輸出一些
比較廢話的東西
你可以讓它
是剪解一點
不是要求
可以讓它
就它有時候會
小標題
剩下小標題
我就是說
你給我放在統一行裡
還有它
寫得太難了
寫得太高級了
這方面你覺得
要看你自己的水平
能不能講出來
如果沒有
講不出來的話
一定要讓它再開簡單一點
我們還可以
我們還可以
接觸AI
來幫助你進行
模擬面試
再如果
去BOSS上
看一些
崗位描述
可以把那個崗位描述
複製下來
加上
幫你檢例
複製下來
發給AI
跟他說我現在
尋找LOMO實習
半眼下面是關
來
把對我進行口打
可以從
項目八股
算法
按個方面
就是
AI庫底方面
我的項目
其實就是
AI項目
都是用
Y5庫底做的
做這個
用AI庫底
是有一些好處的
庫底的時候
你可能就會用上一些
有機會去
比為
壓死我一下
開心會有好愛
最愛的
就趕重一下
這個AI庫底
大概是什麼個流程
我也可以繼續
AI學習概念
其實學習
學習概念
你也可以跟
說裡面是關節
當你某個問題
問住你的話
就可以到
別人關
就法外面是關
然後
法外面是關
參考答案
你開個市民
然後說
幫我記錄一下
這一次問題
你可以
指定一個
文件夾罪的
他
以後
都往裡面記
最後
相關的練習
還有這個
P-Core項目
好的
大家
如果
第一次分享
就到這裡
就說
希望大家
可以多點
再多鬆鬆
加上關注
我&lt;/p&gt;</content:encoded></item><item><title>如何找到第一份agent实习 项目分享 整理版</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E7%AC%AC%E4%B8%80%E4%BB%BDagent%E5%AE%9E%E4%B9%A0-%E9%A1%B9%E7%9B%AE%E5%88%86%E4%BA%AB-%E6%95%B4%E7%90%86%E7%89%88/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E7%AC%AC%E4%B8%80%E4%BB%BDagent%E5%AE%9E%E4%B9%A0-%E9%A1%B9%E7%9B%AE%E5%88%86%E4%BA%AB-%E6%95%B4%E7%90%86%E7%89%88/</guid><description># 如何找到第一份Agent实习 - 项目分享 &gt; 本文整理自一位计算机专业本科生的实习经验分享，主要涵盖个人背景、项目经历、面试准备及AI工具使用等方面。 ## 目录 1. [个人背景](#个人背景) 2. [实习时间线](#实习时间线)</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;如何找到第一份Agent实习 - 项目分享&lt;a href=&quot;#如何找到第一份agent实习---项目分享&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;本文整理自一位计算机专业本科生的实习经验分享，主要涵盖个人背景、项目经历、面试准备及AI工具使用等方面。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h2&gt;目录&lt;a href=&quot;#目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%AA%E4%BA%BA%E8%83%8C%E6%99%AF&quot;&gt;个人背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AE%9E%E4%B9%A0%E6%97%B6%E9%97%B4%E7%BA%BF&quot;&gt;实习时间线&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%A1%B9%E7%9B%AE%E7%BB%8F%E5%8E%86&quot;&gt;项目经历&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BB%8Erag%E9%A1%B9%E7%9B%AE%E5%88%B0minibot%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%BD%AC%E5%8F%98&quot;&gt;从RAG项目到MiniBot项目的转变&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%96%B0%E9%A1%B9%E7%9B%AEminibot%E6%8A%80%E6%9C%AF%E7%BB%86%E8%8A%82&quot;&gt;新项目（MiniBot）技术细节&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ai%E8%BE%85%E5%8A%A9%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%87&quot;&gt;AI辅助面试准备&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%9B%B8%E5%85%B3%E8%B5%84%E6%BA%90&quot;&gt;相关资源&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;个人背景&lt;a href=&quot;#个人背景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;学历&lt;/strong&gt;：计算机相关专业本科生（中上水平）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：后端开发、全栈开发、Agent开发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求职目标&lt;/strong&gt;：寻找Agent开发、后端开发或全栈开发方向的实习机会&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;实习时间线&lt;a href=&quot;#实习时间线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3月中旬&lt;/strong&gt;：开始投递简历&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3月23日&lt;/strong&gt;：第一场面试（电话面），因准备不足未通过&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5月中旬&lt;/strong&gt;：使用优化后的AI项目重新开始面试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终结果&lt;/strong&gt;：获得多个Offer，包括某公司HR面（最终未通过）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;项目经历&lt;a href=&quot;#项目经历&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 后端高并发项目&lt;a href=&quot;#1-后端高并发项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目来源&lt;/strong&gt;：基于付费课程项目进行二次开发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：HMR（可能指某种高并发框架）+ 优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;支持高并发场景&lt;/li&gt;
&lt;li&gt;进行了性能优化&lt;/li&gt;
&lt;li&gt;适合作为面试项目展示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. AI项目（MiniBot智能体）&lt;a href=&quot;#2-ai项目minibot智能体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目定位&lt;/strong&gt;：从RAG项目转型而来的AI智能体项目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术架构&lt;/strong&gt;：基于开源智能体框架（约4000行代码）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心功能&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;智能对话与任务执行&lt;/li&gt;
&lt;li&gt;工具调用与安全控制&lt;/li&gt;
&lt;li&gt;记忆管理与压缩&lt;/li&gt;
&lt;li&gt;基准测试评估&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;从RAG项目到MiniBot项目的转变&lt;a href=&quot;#从rag项目到minibot项目的转变&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;转变原因分析：&lt;a href=&quot;#转变原因分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1. RAG项目的局限性&lt;a href=&quot;#1-rag项目的局限性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用场景限制&lt;/strong&gt;：RAG更适合处理大规模数据（百万级以上），小型项目（如个人笔记）价值有限&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术时效性&lt;/strong&gt;：RAG是2024年及之前较火的技术，AI领域技术迭代快，可能让面试官觉得缺乏对新技术的探索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实现复杂度&lt;/strong&gt;：需要掌握向量数据库选择、分块策略、评测指标等多方面知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同质化严重&lt;/strong&gt;：做RAG项目的人太多，容易缺乏新意&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. MiniBot项目的优势&lt;a href=&quot;#2-minibot项目的优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;真正Agent架构&lt;/strong&gt;：包含上下文管理、工具调用、Agent循环等完整要素&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术新颖性&lt;/strong&gt;：更符合当前AI Agent发展趋势&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;差异化竞争&lt;/strong&gt;：相对较少人做类似的智能体项目&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;新项目（MiniBot）技术细节&lt;a href=&quot;#新项目minibot技术细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;核心功能模块：&lt;a href=&quot;#核心功能模块&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1. 记忆管理系统&lt;a href=&quot;#1-记忆管理系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;两层记忆架构&lt;/strong&gt;：短期记忆与长期记忆&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆压缩&lt;/strong&gt;：对过长内容进行压缩处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态记忆&lt;/strong&gt;：根据上下文自动管理记忆内容&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 工具安全设计&lt;a href=&quot;#2-工具安全设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;三层审批机制&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;白名单工具：直接放行&lt;/li&gt;
&lt;li&gt;灰名单工具：需要用户确认&lt;/li&gt;
&lt;li&gt;黑名单工具：禁止运行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-tool Use钩子&lt;/strong&gt;：工具调用前的安全检查点&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 基准测试（Benchmark）系统&lt;a href=&quot;#3-基准测试benchmark系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务级评估&lt;/strong&gt;：设计具体问题场景进行测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评估指标&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;任务完成率&lt;/li&gt;
&lt;li&gt;循环次数限制&lt;/li&gt;
&lt;li&gt;结果准确性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续优化&lt;/strong&gt;：通过测试结果指导项目迭代&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技术参考：&lt;a href=&quot;#技术参考&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;开源智能体框架（约4000行代码）&lt;/li&gt;
&lt;li&gt;《能Code》课程中的设计理念&lt;/li&gt;
&lt;li&gt;小红书上的相关项目参考&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;AI辅助面试准备&lt;a href=&quot;#ai辅助面试准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 简历优化&lt;a href=&quot;#1-简历优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;格式规范&lt;/strong&gt;：使用统一格式，前面加粗关键词，后面详细描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据量化&lt;/strong&gt;：展示项目前后的性能指标变化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容精简&lt;/strong&gt;：避免废话，突出重点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;难度控制&lt;/strong&gt;：确保描述内容与自身水平匹配&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 模拟面试&lt;a href=&quot;#2-模拟面试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;岗位描述分析&lt;/strong&gt;：从BOSS直聘等平台获取岗位JD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI模拟面试&lt;/strong&gt;：将简历和JD提供给AI进行模拟面试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多维度准备&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;项目经验&lt;/li&gt;
&lt;li&gt;八股文（基础知识）&lt;/li&gt;
&lt;li&gt;算法题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 技术学习&lt;a href=&quot;#3-技术学习&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI八股文&lt;/strong&gt;：使用AI学习常见的AI面试问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概念学习&lt;/strong&gt;：遇到不懂的概念让AI解释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题记录&lt;/strong&gt;：建立问题集，方便复习回顾&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 技术栈准备&lt;a href=&quot;#4-技术栈准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重点技术&lt;/strong&gt;：MySQL、Redis（因为更符合当前求职市场需求）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补充技能&lt;/strong&gt;：操作系统、AI Coding等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算法练习&lt;/strong&gt;：使用AI辅助进行算法学习&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;相关资源&lt;a href=&quot;#相关资源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开源项目&lt;/strong&gt;：P-Core项目（基准测试参考）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习课程&lt;/strong&gt;：《能Code》课程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区参考&lt;/strong&gt;：小红书上的AI项目分享&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;找到第一份Agent实习的关键在于：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;项目差异化&lt;/strong&gt;：选择相对新颖且有深度的项目方向&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术深度&lt;/strong&gt;：深入理解项目中的技术细节和设计思想&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;面试准备&lt;/strong&gt;：系统性地准备项目介绍、八股文和算法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI工具利用&lt;/strong&gt;：善用AI辅助简历优化、模拟面试和技术学习&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续迭代&lt;/strong&gt;：根据面试反馈不断优化项目和准备策略&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;整理说明：本文基于语音转录内容整理，修正了明显的口语化表达和错别字，优化了文档结构，使其更符合技术分享文档的规范。&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>如果一个GPU集群的LLM处理能力为1000tokens s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token s吗？怎么分析性能瓶颈 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AAgpu%E9%9B%86%E7%BE%A4%E7%9A%84llm%E5%A4%84%E7%90%86%E8%83%BD%E5%8A%9B%E4%B8%BA1000tokens_s-%E9%82%A31000%E4%B8%AA%E7%94%A8%E6%88%B7%E5%90%8C%E6%97%B6%E5%B9%B6%E5%8F%91%E8%AE%BF%E9%97%AE-%E5%93%8D%E5%BA%94%E7%BB%99%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84%E6%80%A7%E8%83%BD%E5%8F%AA%E6%9C%891-token_s%E5%90%97-%E6%80%8E%E4%B9%88%E5%88%86%E6%9E%90%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AAgpu%E9%9B%86%E7%BE%A4%E7%9A%84llm%E5%A4%84%E7%90%86%E8%83%BD%E5%8A%9B%E4%B8%BA1000tokens_s-%E9%82%A31000%E4%B8%AA%E7%94%A8%E6%88%B7%E5%90%8C%E6%97%B6%E5%B9%B6%E5%8F%91%E8%AE%BF%E9%97%AE-%E5%93%8D%E5%BA%94%E7%BB%99%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84%E6%80%A7%E8%83%BD%E5%8F%AA%E6%9C%891-token_s%E5%90%97-%E6%80%8E%E4%B9%88%E5%88%86%E6%9E%90%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88_%E6%95%B4%E7%90%86/</guid><description># 如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈 ## 问题 # 如果一个GPU集群的LLM处理能力为1000tokens_s，那</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokens_s那1000个用户同时并发访问响应给每个用户的性能只有1-token_s吗怎么分析性能瓶颈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokens_s那1000个用户同时并发访问响应给每个用户的性能只有1-token_s吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;怎么分析性能瓶颈&lt;/p&gt;&lt;p&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokenss那1000个用户同时并发访问响应给每个用户的性能只有1-tokens吗怎么分析性能瓶颈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，那 1000 个用户分 10 批就处理完了。单用户实际体验到的速度是 10 tokens/s，不是 1 token/s。实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;请求聚合与调度机制LLM 推理有个特点：一次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时来请求，GPU 不是一个一个处理，而是每轮同时算这 1000 个请求的下一个 token。这就需要一个请求聚合器来协调：1）把同时到达的请求按 token 长度打包，比如用户 A 发 2 个 token、用户 B 发 4 个、用户 C 发 6 个，聚合器会把短的补齐到相同长度，打成一个矩阵扔给 GPU 一次算完2）通常有个聚合窗口，比如每 5ms 或者攒够 32 个请求就发一批，跟公交车发车一个道理：不等人就浪费座位，等太久乘客就骂娘3）控制粒度是 token-level batching，同一时刻只处理所有请求的当前 token，算完再一起推进到下一个动态调度与优先级请求进来不会立刻推理，先进一个异步队列，调度器根据策略决定谁先算：1）优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置2）负载均衡：GPU 显存吃紧时减小 batch size，空闲时加大 batch 塞更多请求3）动态退场：已经生成完的请求退出 batch，新请求插进来，整个过程是一条流水线实际场景分析拿一个聊天机器人平台举例：1000 个用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。调度可能是这样跑的：1）每 10ms 打一批，聚合 50~100 个请求2）所有请求每生成一个 token 就进入下一轮调度3）pipeline 里同时跑着多个 batch，每个 batch 装的是不同用户的不同 token最终每个用户实际体验到的响应速度是几十 token/s，远比简单除法算出来的 1 token/s 快。性能瓶颈分析思路遇到吞吐上不去或者延迟高，从这几个方向排查：1）显存瓶颈：KV Cache 占用太大，batch size 上不去，看 nvidia-smi 的显存占用2）计算瓶颈：GPU 利用率拉满但吞吐还是低，说明模型太大或者 batch 太小没喂饱 GPU3）调度瓶颈：队列堆积严重，调度器跟不上请求速度，看请求排队时间4）网络瓶颈：分布式推理场景下，节点间通信成瓶颈，看 NCCL 的耗时占比vLLM、TensorRT-LLM 这些推理框架都有 metrics 接口，可以直接看 batch size 分布、排队延迟、吞吐曲线，定位瓶颈点。Java 模拟示例用 Java 模拟并发请求和资源排队机制：▼java复制代码ExecutorServiceexecutor=Executors.newFixedThreadPool(100);SemaphoregpuTokens=newSemaphore(1000);// 模拟 1000 token/s 的能力for(inti=0; i &amp;lt;1000; i++) {&lt;/p&gt;&lt;p&gt;executor.submit(() -&amp;gt; {try{if(gpuTokens.tryAcquire(10,1, TimeUnit.SECONDS)) {&lt;/p&gt;&lt;p&gt;System.out.println(“Token allocated to user: ”+ Thread.currentThread().getName());&lt;/p&gt;&lt;p&gt;Thread.sleep(100);// 模拟推理延迟gpuTokens.release(10);&lt;/p&gt;&lt;p&gt;}else{&lt;/p&gt;&lt;p&gt;System.out.println(“Timeout, user dropped.”);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}catch(InterruptedException e) {&lt;/p&gt;&lt;p&gt;Thread.currentThread().interrupt();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;}这段代码用 Semaphore 模拟 GPU 的 token 处理能力，每个用户请求 10 个 token，超时就丢弃。实际生产环境的调度比这复杂得多，但核心思想一样：资源有限，靠排队和批处理来提升整体吞吐。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？回答：传统做法是给每个请求预分配最大长度的 KV Cache，比如最大 2048 tokens 就分配 2048 的显存，但大多数请求用不完，显存浪费严重。PagedAttention 借鉴操作系统的分页思想，把 KV Cache 切成固定大小的 block，按需分配。请求来了先给一个 block，用完再分配下一个，就跟虚拟内存一样按需加载。这样显存利用率能从 20~30% 提升到 90% 以上，同样的显存能塞更多请求，吞吐直接翻几倍。- &lt;strong&gt;提问&lt;/strong&gt;：Continuous Batching 和传统的 Static Batching 有什么区别？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：Static Batching 是攒一批请求，等所有请求都生成完才处理下一批。问题是短请求早就生成完了还得等长请求，GPU 干等着浪费算力。Continuous Batching 是动态调度，短请求生成完就退出 batch，新请求马上插进来，整个过程像流水线一样不停转。vLLM、TensorRT-LLM 都用的这种方式，吞吐能比 Static Batching 高 2~3 倍。- &lt;strong&gt;提问&lt;/strong&gt;：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：First Token Latency 是首 token 延迟，主要卡在 prefill 阶段，整个 prompt 要一次性过一遍模型。优化方向是 prompt 压缩、KV Cache 预计算、prefill 和 decode 分离部署。Time Per Output Token 是后续每个 token 的生成耗时，主要看 decode 阶段的效率，优化方向是加大 batch size、用 speculative decoding 一次预测多个 token、量化降低计算量。两个指标侧重点不一样，First Token 影响用户体感的响应速度，TPOT 影响整体吞吐。- &lt;strong&gt;提问&lt;/strong&gt;：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：量化就是降低权重和激活值的精度，FP16 比 FP32 快一倍左右，INT8 比 FP16 又快一倍左右。但精度损失也是真实存在的，INT8 量化后模型效果可能会掉几个点。选型看场景：对精度要求高的用 FP16，追求极致吞吐且能接受一点效果损失的用 INT8。还有个折中方案是混合精度，attention 层用 FP16 保精度，FFN 层用 INT8 提速度。AWQ、GPTQ 这些量化方案在保精度上做了很多优化，实际效果损失比朴素 INT8 小很多。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求聚合与调度机制动态调度与优先级实际场景分析性能瓶颈分析思路Java 模拟示例&lt;/p&gt;&lt;p&gt;提问：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？提问：Continuous Batching 和传统的 Static Batching 有什么区别？提问：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？提问：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？用到了哪些特性？上次浏览：2026-03-16 15:12:36你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？如何实现程序和 AI 大模型的集成？有哪些方式？Agent 死循环问题有遇到过吗？如何解决？如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？11871. 如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，那 1000 个用户分 10 批就处理完了。单用户实际体验到的速度是 10 tokens/s，不是 1 token/s。实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;&lt;p&gt;请求聚合与调度机制LLM 推理有个特点：一次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时来请求，GPU 不是一个一个处理，而是每轮同时算这 1000 个请求的下一个 token。这就需要一个请求聚合器来协调：1）把同时到达的请求按 token 长度打包，比如用户 A 发 2 个 token、用户 B 发 4 个、用户 C 发 6 个，聚合器会把短的补齐到相同长度，打成一个矩阵扔给 GPU 一次算完2）通常有个聚合窗口，比如每 5ms 或者攒够 32 个请求就发一批，跟公交车发车一个道理：不等人就浪费座位，等太久乘客就骂娘3）控制粒度是 token-level batching，同一时刻只处理所有请求的当前 token，算完再一起推进到下一个动态调度与优先级请求进来不会立刻推理，先进一个异步队列，调度器根据策略决定谁先算：1）优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置2）负载均衡：GPU 显存吃紧时减小 batch size，空闲时加大 batch 塞更多请求3）动态退场：已经生成完的请求退出 batch，新请求插进来，整个过程是一条流水线实际场景分析拿一个聊天机器人平台举例：1000 个用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。调度可能是这样跑的：1）每 10ms 打一批，聚合 50~100 个请求2）所有请求每生成一个 token 就进入下一轮调度3）pipeline 里同时跑着多个 batch，每个 batch 装的是不同用户的不同 token最终每个用户实际体验到的响应速度是几十 token/s，远比简单除法算出来的 1 token/s 快。性能瓶颈分析思路遇到吞吐上不去或者延迟高，从这几个方向排查：1）显存瓶颈：KV Cache 占用太大，batch size 上不去，看 nvidia-smi 的显存占用2）计算瓶颈：GPU 利用率拉满但吞吐还是低，说明模型太大或者 batch 太小没喂饱 GPU3）调度瓶颈：队列堆积严重，调度器跟不上请求速度，看请求排队时间4）网络瓶颈：分布式推理场景下，节点间通信成瓶颈，看 NCCL 的耗时占比vLLM、TensorRT-LLM 这些推理框架都有 metrics 接口，可以直接看 batch size 分布、排队延迟、吞吐曲线，定位瓶颈点。Java 模拟示例用 Java 模拟并发请求和资源排队机制：▼java复制代码ExecutorServiceexecutor=Executors.newFixedThreadPool(100);SemaphoregpuTokens=newSemaphore(1000);// 模拟 1000 token/s 的能力for(inti=0; i &amp;lt;1000; i++) {&lt;/p&gt;&lt;p&gt;executor.submit(() -&amp;gt; {try{if(gpuTokens.tryAcquire(10,1, TimeUnit.SECONDS)) {&lt;/p&gt;&lt;p&gt;System.out.println(“Token allocated to user: ”+ Thread.currentThread().getName());&lt;/p&gt;&lt;p&gt;Thread.sleep(100);// 模拟推理延迟gpuTokens.release(10);&lt;/p&gt;&lt;p&gt;}else{&lt;/p&gt;&lt;p&gt;System.out.println(“Timeout, user dropped.”);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}catch(InterruptedException e) {&lt;/p&gt;&lt;p&gt;Thread.currentThread().interrupt();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;}这段代码用 Semaphore 模拟 GPU 的 token 处理能力，每个用户请求 10 个 token，超时就丢弃。实际生产环境的调度比这复杂得多，但核心思想一样：资源有限，靠排队和批处理来提升整体吞吐。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？回答：传统做法是给每个请求预分配最大长度的 KV Cache，比如最大 2048 tokens 就分配 2048 的显存，但大多数请求用不完，显存浪费严重。PagedAttention 借鉴操作系统的分页思想，把 KV Cache 切成固定大小的 block，按需分配。请求来了先给一个 block，用完再分配下一个，就跟虚拟内存一样按需加载。这样显存利用率能从 20~30% 提升到 90% 以上，同样的显存能塞更多请求，吞吐直接翻几倍。- &lt;strong&gt;提问&lt;/strong&gt;：Continuous Batching 和传统的 Static Batching 有什么区别？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：Static Batching 是攒一批请求，等所有请求都生成完才处理下一批。问题是短请求早就生成完了还得等长请求，GPU 干等着浪费算力。Continuous Batching 是动态调度，短请求生成完就退出 batch，新请求马上插进来，整个过程像流水线一样不停转。vLLM、TensorRT-LLM 都用的这种方式，吞吐能比 Static Batching 高 2~3 倍。- &lt;strong&gt;提问&lt;/strong&gt;：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：First Token Latency 是首 token 延迟，主要卡在 prefill 阶段，整个 prompt 要一次性过一遍模型。优化方向是 prompt 压缩、KV Cache 预计算、prefill 和 decode 分离部署。Time Per Output Token 是后续每个 token 的生成耗时，主要看 decode 阶段的效率，优化方向是加大 batch size、用 speculative decoding 一次预测多个 token、量化降低计算量。两个指标侧重点不一样，First Token 影响用户体感的响应速度，TPOT 影响整体吞吐。- &lt;strong&gt;提问&lt;/strong&gt;：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：量化就是降低权重和激活值的精度，FP16 比 FP32 快一倍左右，INT8 比 FP16 又快一倍左右。但精度损失也是真实存在的，INT8 量化后模型效果可能会掉几个点。选型看场景：对精度要求高的用 FP16，追求极致吞吐且能接受一点效果损失的用 INT8。还有个折中方案是混合精度，attention 层用 FP16 保精度，FFN 层用 INT8 提速度。AWQ、GPTQ 这些量化方案在保精度上做了很多优化，实际效果损失比朴素 INT8 小很多。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求聚合与调度机制动态调度与优先级实际场景分析性能瓶颈分析思路Java 模拟示例&lt;/p&gt;&lt;p&gt;提问：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？提问：Continuous Batching 和传统的 Static Batching 有什么区别？提问：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？提问：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokenss那1000个用户同时并发访问响应给每个用户的性能只有1-tokens吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;怎么分析性能瓶颈
如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？&lt;/li&gt;
&lt;li&gt;怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。&lt;/li&gt;
&lt;li&gt;LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。&lt;/li&gt;
&lt;li&gt;GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈
如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，那 1000 个用户分 10 批就处理完了。单用户实际体验到的速度是 10 tokens/s，不是 1 token/s。实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;&lt;p&gt;请求聚合与调度机制LLM 推理有个特点：一次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时来请求，GPU 不是一个一个处理，而是每轮同时算这 1000 个请求的下一个 token。这就需要一个请求聚合器来协调：1）把同时到达的请求按 token 长度打包，比如用户 A 发 2 个 token、用户 B 发 4 个、用户 C 发 6 个，聚合器会把短的补齐到相同长度，打成一个矩阵扔给 GPU 一次算完2）通常有个聚合窗口，比如每 5ms 或者攒够 32 个请求就发一批，跟公交车发车一个道理：不等人就浪费座位，等太久乘客就骂娘3）控制粒度是 token-level batching，同一时刻只处理所有请求的当前 token，算完再一起推进到下一个动态调度与优先级请求进来不会立刻推理，先进一个异步队列，调度器根据策略决定谁先算：1）优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置2）负载均衡：GPU 显存吃紧时减小 batch size，空闲时加大 batch 塞更多请求3）动态退场：已经生成完的请求退出 batch，新请求插进来，整个过程是一条流水线实际场景分析拿一个聊天机器人平台举例：1000 个用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。调度可能是这样跑的：1）每 10ms 打一批，聚合 50~100 个请求2）所有请求每生成一个 token 就进入下一轮调度3）pipeline 里同时跑着多个 batch，每个 batch 装的是不同用户的不同 token最终每个用户实际体验到的响应速度是几十 token/s，远比简单除法算出来的 1 token/s 快。性能瓶颈分析思路遇到吞吐上不去或者延迟高，从这几个方向排查：1）显存瓶颈：KV Cache 占用太大，batch size 上不去，看 nvidia-smi 的显存占用2）计算瓶颈：GPU 利用率拉满但吞吐还是低，说明模型太大或者 batch 太小没喂饱 GPU3）调度瓶颈：队列堆积严重，调度器跟不上请求速度，看请求排队时间4）网络瓶颈：分布式推理场景下，节点间通信成瓶颈，看 NCCL 的耗时占比vLLM、TensorRT-LLM 这些推理框架都有 metrics 接口，可以直接看 batch size 分布、排队延迟、吞吐曲线，定位瓶颈点。Java 模拟示例用 Java 模拟并发请求和资源排队机制：▼java复制代码ExecutorServiceexecutor=Executors.newFixedThreadPool(100);SemaphoregpuTokens=newSemaphore(1000);// 模拟 1000 token/s 的能力for(inti=0; i &amp;lt;1000; i++) {&lt;/p&gt;&lt;p&gt;executor.submit(() -&amp;gt; {try{if(gpuTokens.tryAcquire(10,1, TimeUnit.SECONDS)) {&lt;/p&gt;&lt;p&gt;System.out.println(“Token allocated to user: ”+ Thread.currentThread().getName());&lt;/p&gt;&lt;p&gt;Thread.sleep(100);// 模拟推理延迟gpuTokens.release(10);&lt;/p&gt;&lt;p&gt;}else{&lt;/p&gt;&lt;p&gt;System.out.println(“Timeout, user dropped.”);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}catch(InterruptedException e) {&lt;/p&gt;&lt;p&gt;Thread.currentThread().interrupt();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;}这段代码用 Semaphore 模拟 GPU 的 token 处理能力，每个用户请求 10 个 token，超时就丢弃。实际生产环境的调度比这复杂得多，但核心思想一样：资源有限，靠排队和批处理来提升整体吞吐。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？回答：传统做法是给每个请求预分配最大长度的 KV Cache，比如最大 2048 tokens 就分配 2048 的显存，但大多数请求用不完，显存浪费严重。PagedAttention 借鉴操作系统的分页思想，把 KV Cache 切成固定大小的 block，按需分配。请求来了先给一个 block，用完再分配下一个，就跟虚拟内存一样按需加载。这样显存利用率能从 20~30% 提升到 90% 以上，同样的显存能塞更多请求，吞吐直接翻几倍。- &lt;strong&gt;提问&lt;/strong&gt;：Continuous Batching 和传统的 Static Batching 有什么区别？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：Static Batching 是攒一批请求，等所有请求都生成完才处理下一批。问题是短请求早就生成完了还得等长请求，GPU 干等着浪费算力。Continuous Batching 是动态调度，短请求生成完就退出 batch，新请求马上插进来，整个过程像流水线一样不停转。vLLM、TensorRT-LLM 都用的这种方式，吞吐能比 Static Batching 高 2~3 倍。- &lt;strong&gt;提问&lt;/strong&gt;：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：First Token Latency 是首 token 延迟，主要卡在 prefill 阶段，整个 prompt 要一次性过一遍模型。优化方向是 prompt 压缩、KV Cache 预计算、prefill 和 decode 分离部署。Time Per Output Token 是后续每个 token 的生成耗时，主要看 decode 阶段的效率，优化方向是加大 batch size、用 speculative decoding 一次预测多个 token、量化降低计算量。两个指标侧重点不一样，First Token 影响用户体感的响应速度，TPOT 影响整体吞吐。- &lt;strong&gt;提问&lt;/strong&gt;：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：量化就是降低权重和激活值的精度，FP16 比 FP32 快一倍左右，INT8 比 FP16 又快一倍左右。但精度损失也是真实存在的，INT8 量化后模型效果可能会掉几个点。选型看场景：对精度要求高的用 FP16，追求极致吞吐且能接受一点效果损失的用 INT8。还有个折中方案是混合精度，attention 层用 FP16 保精度，FFN 层用 INT8 提速度。AWQ、GPTQ 这些量化方案在保精度上做了很多优化，实际效果损失比朴素 INT8 小很多。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求聚合与调度机制动态调度与优先级实际场景分析性能瓶颈分析思路Java 模拟示例&lt;/p&gt;&lt;p&gt;提问：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？提问：Continuous Batching 和传统的 Static Batching 有什么区别？提问：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？提问：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;你在 AI 超级智能体项目中如何利用 Spring AI 开发应用？用到了哪些特性？上次浏览：2026-03-16 15:12:36你有多个知识库，做 RAG 的时候，怎么保证查询效率和准确性兼容，并尽可能减少幻觉？如何实现程序和 AI 大模型的集成？有哪些方式？Agent 死循环问题有遇到过吗？如何解决？如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？11871. 如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，那 1000 个用户分 10 批就处理完了。单用户实际体验到的速度是 10 tokens/s，不是 1 token/s。实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/p&gt;&lt;p&gt;请求聚合与调度机制LLM 推理有个特点：一次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时来请求，GPU 不是一个一个处理，而是每轮同时算这 1000 个请求的下一个 token。这就需要一个请求聚合器来协调：1）把同时到达的请求按 token 长度打包，比如用户 A 发 2 个 token、用户 B 发 4 个、用户 C 发 6 个，聚合器会把短的补齐到相同长度，打成一个矩阵扔给 GPU 一次算完2）通常有个聚合窗口，比如每 5ms 或者攒够 32 个请求就发一批，跟公交车发车一个道理：不等人就浪费座位，等太久乘客就骂娘3）控制粒度是 token-level batching，同一时刻只处理所有请求的当前 token，算完再一起推进到下一个动态调度与优先级请求进来不会立刻推理，先进一个异步队列，调度器根据策略决定谁先算：1）优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置2）负载均衡：GPU 显存吃紧时减小 batch size，空闲时加大 batch 塞更多请求3）动态退场：已经生成完的请求退出 batch，新请求插进来，整个过程是一条流水线实际场景分析拿一个聊天机器人平台举例：1000 个用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。调度可能是这样跑的：1）每 10ms 打一批，聚合 50~100 个请求2）所有请求每生成一个 token 就进入下一轮调度3）pipeline 里同时跑着多个 batch，每个 batch 装的是不同用户的不同 token最终每个用户实际体验到的响应速度是几十 token/s，远比简单除法算出来的 1 token/s 快。性能瓶颈分析思路遇到吞吐上不去或者延迟高，从这几个方向排查：1）显存瓶颈：KV Cache 占用太大，batch size 上不去，看 nvidia-smi 的显存占用2）计算瓶颈：GPU 利用率拉满但吞吐还是低，说明模型太大或者 batch 太小没喂饱 GPU3）调度瓶颈：队列堆积严重，调度器跟不上请求速度，看请求排队时间4）网络瓶颈：分布式推理场景下，节点间通信成瓶颈，看 NCCL 的耗时占比vLLM、TensorRT-LLM 这些推理框架都有 metrics 接口，可以直接看 batch size 分布、排队延迟、吞吐曲线，定位瓶颈点。Java 模拟示例用 Java 模拟并发请求和资源排队机制：▼java复制代码ExecutorServiceexecutor=Executors.newFixedThreadPool(100);SemaphoregpuTokens=newSemaphore(1000);// 模拟 1000 token/s 的能力for(inti=0; i &amp;lt;1000; i++) {&lt;/p&gt;&lt;p&gt;executor.submit(() -&amp;gt; {try{if(gpuTokens.tryAcquire(10,1, TimeUnit.SECONDS)) {&lt;/p&gt;&lt;p&gt;System.out.println(“Token allocated to user: ”+ Thread.currentThread().getName());&lt;/p&gt;&lt;p&gt;Thread.sleep(100);// 模拟推理延迟gpuTokens.release(10);&lt;/p&gt;&lt;p&gt;}else{&lt;/p&gt;&lt;p&gt;System.out.println(“Timeout, user dropped.”);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}catch(InterruptedException e) {&lt;/p&gt;&lt;p&gt;Thread.currentThread().interrupt();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;}这段代码用 Semaphore 模拟 GPU 的 token 处理能力，每个用户请求 10 个 token，超时就丢弃。实际生产环境的调度比这复杂得多，但核心思想一样：资源有限，靠排队和批处理来提升整体吞吐。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？回答：传统做法是给每个请求预分配最大长度的 KV Cache，比如最大 2048 tokens 就分配 2048 的显存，但大多数请求用不完，显存浪费严重。PagedAttention 借鉴操作系统的分页思想，把 KV Cache 切成固定大小的 block，按需分配。请求来了先给一个 block，用完再分配下一个，就跟虚拟内存一样按需加载。这样显存利用率能从 20~30% 提升到 90% 以上，同样的显存能塞更多请求，吞吐直接翻几倍。- &lt;strong&gt;提问&lt;/strong&gt;：Continuous Batching 和传统的 Static Batching 有什么区别？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：Static Batching 是攒一批请求，等所有请求都生成完才处理下一批。问题是短请求早就生成完了还得等长请求，GPU 干等着浪费算力。Continuous Batching 是动态调度，短请求生成完就退出 batch，新请求马上插进来，整个过程像流水线一样不停转。vLLM、TensorRT-LLM 都用的这种方式，吞吐能比 Static Batching 高 2~3 倍。- &lt;strong&gt;提问&lt;/strong&gt;：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：First Token Latency 是首 token 延迟，主要卡在 prefill 阶段，整个 prompt 要一次性过一遍模型。优化方向是 prompt 压缩、KV Cache 预计算、prefill 和 decode 分离部署。Time Per Output Token 是后续每个 token 的生成耗时，主要看 decode 阶段的效率，优化方向是加大 batch size、用 speculative decoding 一次预测多个 token、量化降低计算量。两个指标侧重点不一样，First Token 影响用户体感的响应速度，TPOT 影响整体吞吐。- &lt;strong&gt;提问&lt;/strong&gt;：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：量化就是降低权重和激活值的精度，FP16 比 FP32 快一倍左右，INT8 比 FP16 又快一倍左右。但精度损失也是真实存在的，INT8 量化后模型效果可能会掉几个点。选型看场景：对精度要求高的用 FP16，追求极致吞吐且能接受一点效果损失的用 INT8。还有个折中方案是混合精度，attention 层用 FP16 保精度，FFN 层用 INT8 提速度。AWQ、GPTQ 这些量化方案在保精度上做了很多优化，实际效果损失比朴素 INT8 小很多。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求聚合与调度机制动态调度与优先级实际场景分析性能瓶颈分析思路Java 模拟示例&lt;/p&gt;&lt;p&gt;提问：vLLM 的 PagedAttention 机制是怎么优化显存利用率的？提问：Continuous Batching 和传统的 Static Batching 有什么区别？提问：推理服务的 First Token Latency 和 Time Per Output Token 怎么分别优化？提问：模型量化对推理性能有什么影响？INT8 和 FP16 怎么选？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokenss那1000个用户同时并发访问响应给每个用户的性能只有1-tokens吗-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;怎么分析性能瓶颈
如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokens_s那1000个用户同时并发访问响应给每个用户的性能只有1-token_s吗怎么分析性能瓶颈-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果一个GPU集群的LLM处理能力为1000tokens_s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token_s吗？怎么分析性能瓶颈&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈&lt;a href=&quot;#如果一个gpu集群的llm处理能力为1000tokenss那1000个用户同时并发访问响应给每个用户的性能只有1-tokens吗怎么分析性能瓶颈-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈VIP中等后端场景题大模型标记分享131248面试问答不会简单平均成每人 1 token/s，实际上每个用户看到的响应速度可能是几十 token/s。LLM 推理不是把算力切成 1000 份分给 1000 个用户，而是靠批处理把多个请求打包到一起算。GPU 擅长的就是并行计算，100 个请求打成一个 batch，计算耗时跟处理单个请求差不多，吞吐量直接翻几十倍。假设每次批处理包含 100 个用户的请求，每个用户请求 10 tokens，那 1000 个用户分 10 批就处理完了。单用户实际体验到的速度是 10 tokens/s，不是 1 token/s。实际响应速度取决于三个核心因素：请求的 token 长度、batch 大小策略、排队调度机制。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请求聚合与调度机制LLM 推理有个特点：一次 forward 只生成 1 个 token，然后循环生成下一个。1000 个用户同时来请求，GPU 不是一个一个处理，而是每轮同时算这 1000 个请求的下一个 token。这就需要一个请求聚合器来协调：1）把同时到达的请求按 token 长度打包，比如用户 A 发 2 个 token、用户 B 发 4 个、用户 C 发 6 个，聚合器会把短的补齐到相同长度，打成一个矩阵扔给 GPU 一次算完2）通常有个聚合窗口，比如每 5ms 或者攒够 32 个请求就发一批，跟公交车发车一个道理：不等人就浪费座位，等太久乘客就骂娘3）控制粒度是 token-level batching，同一时刻只处理所有请求的当前 token，算完再一起推进到下一个动态调度与优先级请求进来不会立刻推理，先进一个异步队列，调度器根据策略决定谁先算：1）优先级策略：付费用户优先、重试请求优先、token 少的先算完让出位置2）负载均衡：GPU 显存吃紧时减小 batch size，空闲时加大 batch 塞更多请求3）动态退场：已经生成完的请求退出 batch，新请求插进来，整个过程是一条流水线实际场景分析拿一个聊天机器人平台举例：1000 个用户并发，请求平均 20 tokens，GPU 最大 batch 128，吞吐 1000 tokens/s。调度可能是这样跑的：1）每 10ms 打一批，聚合 50~100 个请求2）所有请求每生成一个 token 就进入下一轮调度3）pipeline 里同时跑着多个 batch，每个 batch 装的是不同用户的不同 token最终每个用户实际体验到的响应速度是几十 token/s，远比简单除法算出来的 1 token/s 快。性能瓶颈分析思路遇到吞吐上不去或者延迟高，从这几个方向排查：1）显存瓶颈：KV Cache 占用太大，batch size 上不去，看 nvidia-smi 的显存占用2）计算瓶颈：GPU 利用率拉满但吞吐还是低，说明模型太大或者 batch 太小没喂饱 GPU3）调度瓶颈：队列堆积严重，调度器跟不上请求速度，看请求排队时间4）网络瓶颈：分布式推理场景下，节点间通信成瓶颈，看 NCCL 的耗时占比vLLM、TensorRT-LLM 这些推理框架都有 metrics 接口，可以直接看 batch size 分布、排队延迟、吞吐曲线，定位瓶颈点。Java 模拟示例用 Java 模拟并发请求和资源排队机制：▼java复制代码ExecutorServiceexecutor=Executors.newFixedThreadPool(100);SemaphoregpuTokens=newSemaphore(1000);// 模拟 1000 token/s 的能力for(inti=0; i &amp;lt;1000; i++) {&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;executor.submit(() -&amp;gt; {try{if(gpuTokens.tryAcquire(10,1, TimeUnit.SECONDS)) {&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%BD%93%E5%AF%B9%E8%AF%9D%E5%8E%86%E5%8F%B2%E5%AE%9E%E5%9C%A8%E5%A4%AA%E9%95%BF-%E8%A3%81%E5%89%AA%E4%B9%9F%E4%B8%8D%E5%A4%9F%E7%94%A8%E6%97%B6-%E8%BF%98%E6%9C%89%E4%BB%80%E4%B9%88%E5%8A%9E%E6%B3%95-%E4%BB%80%E4%B9%88%E6%98%AF-compaction-openclaw-%E7%9A%84-compaction-%E7%AD%96%E7%95%A5%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E5%BD%93%E5%AF%B9%E8%AF%9D%E5%8E%86%E5%8F%B2%E5%AE%9E%E5%9C%A8%E5%A4%AA%E9%95%BF-%E8%A3%81%E5%89%AA%E4%B9%9F%E4%B8%8D%E5%A4%9F%E7%94%A8%E6%97%B6-%E8%BF%98%E6%9C%89%E4%BB%80%E4%B9%88%E5%8A%9E%E6%B3%95-%E4%BB%80%E4%B9%88%E6%98%AF-compaction-openclaw-%E7%9A%84-compaction-%E7%AD%96%E7%95%A5%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84-_%E6%95%B4%E7%90%86/</guid><description># 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？ ## 问题 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？Op</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？&lt;a href=&quot;#当对话历史实在太长裁剪也不够用时还有什么办法什么是-compactionopenclaw-的-compaction-策略是怎样的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1179面试问答裁剪是把早期消息直接丢掉，简单粗暴但会丢信息。Compaction（压实/压缩）换了个思路：用 LLM 把一大段对话历史”压缩”成一段精炼摘要，然后用摘要替换掉原始消息。打个比方，就像把一本 300 页的会议记录压缩成 5 页的纪要。篇幅大幅缩减，但关键决议、待办事项、重要结论都保留了。这样 Context 窗口腾出来了，关键信息也没丢。OpenClaw 的 Compaction 核心流程分 4 步走：分块（Chunking）：先把待压缩的消息按 token 预算切成多个 chunk（默认切 2 段）。切分在单条消息的边界进行，chunk 大小由 Context 窗口比例自适应计算。同时把最近几轮对话（默认 3 轮）分离出来保留原文，只压缩更早的消息。逐块摘要（Per-chunk Summarization）：每个 chunk 分别发给 LLM 生成一段摘要。如果某条消息超大（超过 Context 窗口的 50%），会走降级路径：先跳过超大消息只压缩小消息，再标注超大消息被省略了。合并摘要（Merge Summaries）：把多段局部摘要再调一次 LLM 融合成一份连贯的最终摘要，要求保留：进行中的任务状态、批量操作进度、用户最后的请求、决策及原因、待办事项和约束条件。摘要增强（Summary Augmentation）：在合并摘要基础上，追加额外上下文，比如工具调用失败记录（包含 exit code 和 error 状态）、文件操作记录（读过和修改过的文件列表）、最近几轮对话的原文摘要、以及从 AGENTS.md 提取的关键规则。最终结果替换掉原始消息，写入 session 历史。这个设计的核心理念是：宁可多花点 token 调一次 LLM 做摘要，也不要丢掉关键信息让后续任务翻车。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;摘要质量检查压缩不是调一次 LLM 就完事了，OpenClaw 做了专门的质量校验。压缩完成后会检查摘要是否包含 5 个必要的结构化章节：Decisions（做过的决策）Open TODOs（未完成的任务）Constraints/Rules（约束条件）Pending user asks（用户尚未被回应的请求）Exact identifiers（需要精确保留的标识符）除了章节完整性之外，质量审计还会检查两个方面：摘要是否保留了从最近消息中提取的关键标识符（strict 策略下）以及摘要内容是否反映了用户最新的请求。不过需要注意，这套质量检查+重试机制（quality guard）默认是关闭的，需要在配置中显式启用。启用后，如果摘要未通过质量审计，会触发重试（最多重试 1 次，可配置，上限 3 次）。即使不启用 quality guard，结构化章节的要求也会通过 prompt 指令传达给 LLM，只是不会做事后校验和自动重试。标识符保留策略摘要有一个特别容易踩的坑：LLM 会把 UUID、hash、API key、URL、文件名这些标识符”概括”掉。比如把file: src/controllers/UserController.ts概括成”修改了一个控制器文件”，后续 Agent 想继续操作这个文件就找不到了。OpenClaw 默认采用strict 策略，要求摘要中精确保留所有不可重构的标识符。Compaction 的 prompt 里会给 LLM 一条通用指令，明确要求原样保留 UUID、hash、ID、token、API key、主机名、IP、端口、URL、文件名等。同时要求摘要必须包含一个 Exact identifiers 章节来列出关键标识符。注意 prompt 不会列举本次对话中出现的具体标识符，具体标识符的检验是在质量审计阶段，从最近 10 条消息中自动提取并比对摘要内容。Memory Flush 联动OpenClaw 还有一个很巧妙的设计：在接近 Compaction 阈值的时候，会先触发一次额外的 Agent 轮次（Memory Flush），让模型把重要信息主动写入 memory 目录。你可以把它理解成”考试交卷前最后再检查一遍”。模型知道自己的对话历史马上要被压缩了，所以赶紧把最重要的信息往长期存储里写一份。这样即使 Compaction 的摘要质量不理想，关键信息在 memory 目录里还有一份备份。这是短期记忆到长期记忆的逃生通道，保证信息不会因为压缩而彻底丢失。Post-compaction Context 注入压缩完成后，系统会从 AGENTS.md 里读取 “Session Startup” 和 “Red Lines” 两个部分，重新注入到上下文里。为什么要这么做？因为 Compaction 把早期消息替换成了摘要，但 Agent 的启动流程和红线规则可能就在那些被替换掉的早期消息里。如果不重新注入，模型压缩完之后可能忘了自己有哪些不能碰的红线，行为就可能失控。工具调用失败的特殊处理Compaction 还会专门提取并保留工具调用失败的信息，包括 exit code 和 error 状态。这些失败信息对后续任务成功率至关重要。比如 Agent 之前尝试过写入某个文件被权限拒绝了，如果这条失败记录在压缩时被丢掉，Agent 压缩后又会傻傻地去试一次，再失败，白白浪费一轮循环。保留失败记录就能让 Agent 直接跳过已知不可行的路径，换别的方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？回答：单次 Compaction 大概消耗几千 token，跟一轮正常对话差不多。但它能把几万 token 的对话历史压缩到几千 token 的摘要，后续每一轮对话都省了大量 Context 开销。从整个 session 生命周期看，做 Compaction 的 token 总消耗远低于不做 Compaction 把完整历史一直带着。越长的对话收益越明显，100 轮的对话如果不压缩，光 Context 填充就要烧掉几十万 token 甚至更多。- &lt;strong&gt;提问&lt;/strong&gt;：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：chunk 大小按 token 上限来切，默认是模型 Context 窗口的 40%（基准比例），会根据消息平均大小自适应调整（最低 15%），同时预留约 4096 token 给摘要 prompt 和推理预算。切的时候是在单条消息的边界切，不会把一条消息拆到两个 chunk 里，但不会刻意保证 user+assistant 对话回合的完整性。chunk 之间确实可能丢跨 chunk 的上下文关联，所以才需要合并摘要阶段，让 LLM 把多段摘要融合起来，补上跨段的逻辑关系。另外还有 20% 的安全缓冲来补偿 token 估算不准的问题。- &lt;strong&gt;提问&lt;/strong&gt;：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：按 token 数触发。每次拼完整的 prompt 之前会算一下当前对话历史占了多少 token，超过阈值就触发 Compaction。用固定轮次不靠谱，因为每轮对话的长度差异很大，有的轮次用户就说了一句话，有的轮次 Agent 调了 5 个工具返回一大堆结果。按 token 数控制才能精确地管住 Context 窗口的使用率。- &lt;strong&gt;提问&lt;/strong&gt;：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：会。这是 strict 策略的一个已知代价，摘要会比宽松策略长一些。但在实际场景中，标识符占的 token 比例并不大，通常几十个 token 就能覆盖一个 session 里的所有关键标识符。相比丢失标识符导致后续任务失败再重试的 token 浪费，保留它们的成本低得多。如果确实需要清理过时标识符，可以在 Memory Flush 阶段让 Agent 主动判断哪些标识符还有用，只把有用的写入长期记忆。作者：Yes面试鸭官方
Compaction 压缩：用 LLM 把一大段对话历史压缩成一段精炼摘要，然后用摘要替换掉原始消息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Compaction 核心流程分 4 步走：分块 Chunking ：先把待压缩的消息按 token 预算切成多个 ch展开新页面打开2026-03-17  21:4900回复晚夜微雨问海棠特训营一、对话历史超长、裁剪失效时的终极解决方案当渐进式裁剪（Pruning）仍无法控制Token占用时，行业通用的终极方案包括：对话压缩（Compaction）：用LLM将旧对话历史总结为紧凑摘要，替换原始内容，是最直接有效的手段。分层记忆+RAG召回：将旧历史归档展开新页面打开2026-03-15  09:2200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;摘要质量检查标识符保留策略Memory Flush 联动Post-compaction Context 注入工具调用失败的特殊处理&lt;/p&gt;&lt;p&gt;提问：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？提问：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？提问：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？提问：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13231. 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1179面试问答裁剪是把早期消息直接丢掉，简单粗暴但会丢信息。Compaction（压实/压缩）换了个思路：用 LLM 把一大段对话历史”压缩”成一段精炼摘要，然后用摘要替换掉原始消息。打个比方，就像把一本 300 页的会议记录压缩成 5 页的纪要。篇幅大幅缩减，但关键决议、待办事项、重要结论都保留了。这样 Context 窗口腾出来了，关键信息也没丢。OpenClaw 的 Compaction 核心流程分 4 步走：分块（Chunking）：先把待压缩的消息按 token 预算切成多个 chunk（默认切 2 段）。切分在单条消息的边界进行，chunk 大小由 Context 窗口比例自适应计算。同时把最近几轮对话（默认 3 轮）分离出来保留原文，只压缩更早的消息。逐块摘要（Per-chunk Summarization）：每个 chunk 分别发给 LLM 生成一段摘要。如果某条消息超大（超过 Context 窗口的 50%），会走降级路径：先跳过超大消息只压缩小消息，再标注超大消息被省略了。合并摘要（Merge Summaries）：把多段局部摘要再调一次 LLM 融合成一份连贯的最终摘要，要求保留：进行中的任务状态、批量操作进度、用户最后的请求、决策及原因、待办事项和约束条件。摘要增强（Summary Augmentation）：在合并摘要基础上，追加额外上下文，比如工具调用失败记录（包含 exit code 和 error 状态）、文件操作记录（读过和修改过的文件列表）、最近几轮对话的原文摘要、以及从 AGENTS.md 提取的关键规则。最终结果替换掉原始消息，写入 session 历史。这个设计的核心理念是：宁可多花点 token 调一次 LLM 做摘要，也不要丢掉关键信息让后续任务翻车。&lt;/p&gt;&lt;p&gt;摘要质量检查压缩不是调一次 LLM 就完事了，OpenClaw 做了专门的质量校验。压缩完成后会检查摘要是否包含 5 个必要的结构化章节：Decisions（做过的决策）Open TODOs（未完成的任务）Constraints/Rules（约束条件）Pending user asks（用户尚未被回应的请求）Exact identifiers（需要精确保留的标识符）除了章节完整性之外，质量审计还会检查两个方面：摘要是否保留了从最近消息中提取的关键标识符（strict 策略下）以及摘要内容是否反映了用户最新的请求。不过需要注意，这套质量检查+重试机制（quality guard）默认是关闭的，需要在配置中显式启用。启用后，如果摘要未通过质量审计，会触发重试（最多重试 1 次，可配置，上限 3 次）。即使不启用 quality guard，结构化章节的要求也会通过 prompt 指令传达给 LLM，只是不会做事后校验和自动重试。标识符保留策略摘要有一个特别容易踩的坑：LLM 会把 UUID、hash、API key、URL、文件名这些标识符”概括”掉。比如把file: src/controllers/UserController.ts概括成”修改了一个控制器文件”，后续 Agent 想继续操作这个文件就找不到了。OpenClaw 默认采用strict 策略，要求摘要中精确保留所有不可重构的标识符。Compaction 的 prompt 里会给 LLM 一条通用指令，明确要求原样保留 UUID、hash、ID、token、API key、主机名、IP、端口、URL、文件名等。同时要求摘要必须包含一个 Exact identifiers 章节来列出关键标识符。注意 prompt 不会列举本次对话中出现的具体标识符，具体标识符的检验是在质量审计阶段，从最近 10 条消息中自动提取并比对摘要内容。Memory Flush 联动OpenClaw 还有一个很巧妙的设计：在接近 Compaction 阈值的时候，会先触发一次额外的 Agent 轮次（Memory Flush），让模型把重要信息主动写入 memory 目录。你可以把它理解成”考试交卷前最后再检查一遍”。模型知道自己的对话历史马上要被压缩了，所以赶紧把最重要的信息往长期存储里写一份。这样即使 Compaction 的摘要质量不理想，关键信息在 memory 目录里还有一份备份。这是短期记忆到长期记忆的逃生通道，保证信息不会因为压缩而彻底丢失。Post-compaction Context 注入压缩完成后，系统会从 AGENTS.md 里读取 “Session Startup” 和 “Red Lines” 两个部分，重新注入到上下文里。为什么要这么做？因为 Compaction 把早期消息替换成了摘要，但 Agent 的启动流程和红线规则可能就在那些被替换掉的早期消息里。如果不重新注入，模型压缩完之后可能忘了自己有哪些不能碰的红线，行为就可能失控。工具调用失败的特殊处理Compaction 还会专门提取并保留工具调用失败的信息，包括 exit code 和 error 状态。这些失败信息对后续任务成功率至关重要。比如 Agent 之前尝试过写入某个文件被权限拒绝了，如果这条失败记录在压缩时被丢掉，Agent 压缩后又会傻傻地去试一次，再失败，白白浪费一轮循环。保留失败记录就能让 Agent 直接跳过已知不可行的路径，换别的方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？回答：单次 Compaction 大概消耗几千 token，跟一轮正常对话差不多。但它能把几万 token 的对话历史压缩到几千 token 的摘要，后续每一轮对话都省了大量 Context 开销。从整个 session 生命周期看，做 Compaction 的 token 总消耗远低于不做 Compaction 把完整历史一直带着。越长的对话收益越明显，100 轮的对话如果不压缩，光 Context 填充就要烧掉几十万 token 甚至更多。- &lt;strong&gt;提问&lt;/strong&gt;：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：chunk 大小按 token 上限来切，默认是模型 Context 窗口的 40%（基准比例），会根据消息平均大小自适应调整（最低 15%），同时预留约 4096 token 给摘要 prompt 和推理预算。切的时候是在单条消息的边界切，不会把一条消息拆到两个 chunk 里，但不会刻意保证 user+assistant 对话回合的完整性。chunk 之间确实可能丢跨 chunk 的上下文关联，所以才需要合并摘要阶段，让 LLM 把多段摘要融合起来，补上跨段的逻辑关系。另外还有 20% 的安全缓冲来补偿 token 估算不准的问题。- &lt;strong&gt;提问&lt;/strong&gt;：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：按 token 数触发。每次拼完整的 prompt 之前会算一下当前对话历史占了多少 token，超过阈值就触发 Compaction。用固定轮次不靠谱，因为每轮对话的长度差异很大，有的轮次用户就说了一句话，有的轮次 Agent 调了 5 个工具返回一大堆结果。按 token 数控制才能精确地管住 Context 窗口的使用率。- &lt;strong&gt;提问&lt;/strong&gt;：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：会。这是 strict 策略的一个已知代价，摘要会比宽松策略长一些。但在实际场景中，标识符占的 token 比例并不大，通常几十个 token 就能覆盖一个 session 里的所有关键标识符。相比丢失标识符导致后续任务失败再重试的 token 浪费，保留它们的成本低得多。如果确实需要清理过时标识符，可以在 Memory Flush 阶段让 Agent 主动判断哪些标识符还有用，只把有用的写入长期记忆。作者：Yes面试鸭官方
Compaction 压缩：用 LLM 把一大段对话历史压缩成一段精炼摘要，然后用摘要替换掉原始消息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Compaction 核心流程分 4 步走：分块 Chunking ：先把待压缩的消息按 token 预算切成多个 ch展开新页面打开2026-03-17  21:4900回复晚夜微雨问海棠特训营一、对话历史超长、裁剪失效时的终极解决方案当渐进式裁剪（Pruning）仍无法控制Token占用时，行业通用的终极方案包括：对话压缩（Compaction）：用LLM将旧对话历史总结为紧凑摘要，替换原始内容，是最直接有效的手段。分层记忆+RAG召回：将旧历史归档展开新页面打开2026-03-15  09:2200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;摘要质量检查标识符保留策略Memory Flush 联动Post-compaction Context 注入工具调用失败的特殊处理&lt;/p&gt;&lt;p&gt;提问：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？提问：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？提问：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？提问：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？&lt;a href=&quot;#当对话历史实在太长裁剪也不够用时还有什么办法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;什么是 Compaction？&lt;/li&gt;
&lt;li&gt;OpenClaw 的 Compaction 策略是怎样的？&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;什么是 Compaction？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1179面试问答裁剪是把早期消息直接丢掉，简单粗暴但会丢信息。Compaction（压实/压缩）换了个思路：用 LLM 把一大段对话历史”压缩”成一段精炼摘要，然后用摘要替换掉原始消息。打个比方，就像把一本 300 页的会议记录压缩成 5 页的纪要。篇幅大幅缩减，但关键决议、待办事项、重要结论都保留了。这样 Context 窗口腾出来了，关键信息也没丢。OpenClaw 的 Compaction 核心流程分 4 步走：分块（Chunking）：先把待压缩的消息按 token 预算切成多个 chunk（默认切 2 段）。切分在单条消息的边界进行，chunk 大小由 Context 窗口比例自适应计算。同时把最近几轮对话（默认 3 轮）分离出来保留原文，只压缩更早的消息。逐块摘要（Per-chunk Summarization）：每个 chunk 分别发给 LLM 生成一段摘要。如果某条消息超大（超过 Context 窗口的 50%），会走降级路径：先跳过超大消息只压缩小消息，再标注超大消息被省略了。合并摘要（Merge Summaries）：把多段局部摘要再调一次 LLM 融合成一份连贯的最终摘要，要求保留：进行中的任务状态、批量操作进度、用户最后的请求、决策及原因、待办事项和约束条件。摘要增强（Summary Augmentation）：在合并摘要基础上，追加额外上下文，比如工具调用失败记录（包含 exit code 和 error 状态）、文件操作记录（读过和修改过的文件列表）、最近几轮对话的原文摘要、以及从 AGENTS.md 提取的关键规则。最终结果替换掉原始消息，写入 session 历史。这个设计的核心理念是：宁可多花点 token 调一次 LLM 做摘要，也不要丢掉关键信息让后续任务翻车。&lt;/p&gt;&lt;p&gt;摘要质量检查压缩不是调一次 LLM 就完事了，OpenClaw 做了专门的质量校验。压缩完成后会检查摘要是否包含 5 个必要的结构化章节：Decisions（做过的决策）Open TODOs（未完成的任务）Constraints/Rules（约束条件）Pending user asks（用户尚未被回应的请求）Exact identifiers（需要精确保留的标识符）除了章节完整性之外，质量审计还会检查两个方面：摘要是否保留了从最近消息中提取的关键标识符（strict 策略下）以及摘要内容是否反映了用户最新的请求。不过需要注意，这套质量检查+重试机制（quality guard）默认是关闭的，需要在配置中显式启用。启用后，如果摘要未通过质量审计，会触发重试（最多重试 1 次，可配置，上限 3 次）。即使不启用 quality guard，结构化章节的要求也会通过 prompt 指令传达给 LLM，只是不会做事后校验和自动重试。标识符保留策略摘要有一个特别容易踩的坑：LLM 会把 UUID、hash、API key、URL、文件名这些标识符”概括”掉。比如把file: src/controllers/UserController.ts概括成”修改了一个控制器文件”，后续 Agent 想继续操作这个文件就找不到了。OpenClaw 默认采用strict 策略，要求摘要中精确保留所有不可重构的标识符。Compaction 的 prompt 里会给 LLM 一条通用指令，明确要求原样保留 UUID、hash、ID、token、API key、主机名、IP、端口、URL、文件名等。同时要求摘要必须包含一个 Exact identifiers 章节来列出关键标识符。注意 prompt 不会列举本次对话中出现的具体标识符，具体标识符的检验是在质量审计阶段，从最近 10 条消息中自动提取并比对摘要内容。Memory Flush 联动OpenClaw 还有一个很巧妙的设计：在接近 Compaction 阈值的时候，会先触发一次额外的 Agent 轮次（Memory Flush），让模型把重要信息主动写入 memory 目录。你可以把它理解成”考试交卷前最后再检查一遍”。模型知道自己的对话历史马上要被压缩了，所以赶紧把最重要的信息往长期存储里写一份。这样即使 Compaction 的摘要质量不理想，关键信息在 memory 目录里还有一份备份。这是短期记忆到长期记忆的逃生通道，保证信息不会因为压缩而彻底丢失。Post-compaction Context 注入压缩完成后，系统会从 AGENTS.md 里读取 “Session Startup” 和 “Red Lines” 两个部分，重新注入到上下文里。为什么要这么做？因为 Compaction 把早期消息替换成了摘要，但 Agent 的启动流程和红线规则可能就在那些被替换掉的早期消息里。如果不重新注入，模型压缩完之后可能忘了自己有哪些不能碰的红线，行为就可能失控。工具调用失败的特殊处理Compaction 还会专门提取并保留工具调用失败的信息，包括 exit code 和 error 状态。这些失败信息对后续任务成功率至关重要。比如 Agent 之前尝试过写入某个文件被权限拒绝了，如果这条失败记录在压缩时被丢掉，Agent 压缩后又会傻傻地去试一次，再失败，白白浪费一轮循环。保留失败记录就能让 Agent 直接跳过已知不可行的路径，换别的方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？回答：单次 Compaction 大概消耗几千 token，跟一轮正常对话差不多。但它能把几万 token 的对话历史压缩到几千 token 的摘要，后续每一轮对话都省了大量 Context 开销。从整个 session 生命周期看，做 Compaction 的 token 总消耗远低于不做 Compaction 把完整历史一直带着。越长的对话收益越明显，100 轮的对话如果不压缩，光 Context 填充就要烧掉几十万 token 甚至更多。- &lt;strong&gt;提问&lt;/strong&gt;：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：chunk 大小按 token 上限来切，默认是模型 Context 窗口的 40%（基准比例），会根据消息平均大小自适应调整（最低 15%），同时预留约 4096 token 给摘要 prompt 和推理预算。切的时候是在单条消息的边界切，不会把一条消息拆到两个 chunk 里，但不会刻意保证 user+assistant 对话回合的完整性。chunk 之间确实可能丢跨 chunk 的上下文关联，所以才需要合并摘要阶段，让 LLM 把多段摘要融合起来，补上跨段的逻辑关系。另外还有 20% 的安全缓冲来补偿 token 估算不准的问题。- &lt;strong&gt;提问&lt;/strong&gt;：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：按 token 数触发。每次拼完整的 prompt 之前会算一下当前对话历史占了多少 token，超过阈值就触发 Compaction。用固定轮次不靠谱，因为每轮对话的长度差异很大，有的轮次用户就说了一句话，有的轮次 Agent 调了 5 个工具返回一大堆结果。按 token 数控制才能精确地管住 Context 窗口的使用率。- &lt;strong&gt;提问&lt;/strong&gt;：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：会。这是 strict 策略的一个已知代价，摘要会比宽松策略长一些。但在实际场景中，标识符占的 token 比例并不大，通常几十个 token 就能覆盖一个 session 里的所有关键标识符。相比丢失标识符导致后续任务失败再重试的 token 浪费，保留它们的成本低得多。如果确实需要清理过时标识符，可以在 Memory Flush 阶段让 Agent 主动判断哪些标识符还有用，只把有用的写入长期记忆。作者：Yes面试鸭官方
Compaction 压缩：用 LLM 把一大段对话历史压缩成一段精炼摘要，然后用摘要替换掉原始消息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Compaction 核心流程分 4 步走：分块 Chunking ：先把待压缩的消息按 token 预算切成多个 ch展开新页面打开2026-03-17  21:4900回复晚夜微雨问海棠特训营一、对话历史超长、裁剪失效时的终极解决方案当渐进式裁剪（Pruning）仍无法控制Token占用时，行业通用的终极方案包括：对话压缩（Compaction）：用LLM将旧对话历史总结为紧凑摘要，替换原始内容，是最直接有效的手段。分层记忆+RAG召回：将旧历史归档展开新页面打开2026-03-15  09:2200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;摘要质量检查标识符保留策略Memory Flush 联动Post-compaction Context 注入工具调用失败的特殊处理&lt;/p&gt;&lt;p&gt;提问：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？提问：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？提问：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？提问：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:28在 OpenClaw 中，一条用户消息从进入系统到收到回复，完整链路是怎样的？OpenClaw 的 Agent Runner 是如何工作的？一次 Agent 运行经历了哪些阶段？LLM 的 Context Window 有上限，长对话时如何保证 Agent 仍然能正常工作？OpenClaw 是怎么做的？Agent 调用工具可能返回超大结果（比如代码搜索返回 50KB），这会带来什么问题？你会怎么处理？OpenClaw 是怎么做的？当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？OpenClaw 把 Context 管理抽象成了可插拔的 Context Engine，为什么要做这层抽象？这个设计能支持哪些不同的策略？如果一个 Agent 系统要同时接入 Telegram、飞书、钉钉等渠道，你会怎么设计抽象层？OpenClaw 的 Channel Plugin 接口是怎么设计的？13231. 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1179面试问答裁剪是把早期消息直接丢掉，简单粗暴但会丢信息。Compaction（压实/压缩）换了个思路：用 LLM 把一大段对话历史”压缩”成一段精炼摘要，然后用摘要替换掉原始消息。打个比方，就像把一本 300 页的会议记录压缩成 5 页的纪要。篇幅大幅缩减，但关键决议、待办事项、重要结论都保留了。这样 Context 窗口腾出来了，关键信息也没丢。OpenClaw 的 Compaction 核心流程分 4 步走：分块（Chunking）：先把待压缩的消息按 token 预算切成多个 chunk（默认切 2 段）。切分在单条消息的边界进行，chunk 大小由 Context 窗口比例自适应计算。同时把最近几轮对话（默认 3 轮）分离出来保留原文，只压缩更早的消息。逐块摘要（Per-chunk Summarization）：每个 chunk 分别发给 LLM 生成一段摘要。如果某条消息超大（超过 Context 窗口的 50%），会走降级路径：先跳过超大消息只压缩小消息，再标注超大消息被省略了。合并摘要（Merge Summaries）：把多段局部摘要再调一次 LLM 融合成一份连贯的最终摘要，要求保留：进行中的任务状态、批量操作进度、用户最后的请求、决策及原因、待办事项和约束条件。摘要增强（Summary Augmentation）：在合并摘要基础上，追加额外上下文，比如工具调用失败记录（包含 exit code 和 error 状态）、文件操作记录（读过和修改过的文件列表）、最近几轮对话的原文摘要、以及从 AGENTS.md 提取的关键规则。最终结果替换掉原始消息，写入 session 历史。这个设计的核心理念是：宁可多花点 token 调一次 LLM 做摘要，也不要丢掉关键信息让后续任务翻车。&lt;/p&gt;&lt;p&gt;摘要质量检查压缩不是调一次 LLM 就完事了，OpenClaw 做了专门的质量校验。压缩完成后会检查摘要是否包含 5 个必要的结构化章节：Decisions（做过的决策）Open TODOs（未完成的任务）Constraints/Rules（约束条件）Pending user asks（用户尚未被回应的请求）Exact identifiers（需要精确保留的标识符）除了章节完整性之外，质量审计还会检查两个方面：摘要是否保留了从最近消息中提取的关键标识符（strict 策略下）以及摘要内容是否反映了用户最新的请求。不过需要注意，这套质量检查+重试机制（quality guard）默认是关闭的，需要在配置中显式启用。启用后，如果摘要未通过质量审计，会触发重试（最多重试 1 次，可配置，上限 3 次）。即使不启用 quality guard，结构化章节的要求也会通过 prompt 指令传达给 LLM，只是不会做事后校验和自动重试。标识符保留策略摘要有一个特别容易踩的坑：LLM 会把 UUID、hash、API key、URL、文件名这些标识符”概括”掉。比如把file: src/controllers/UserController.ts概括成”修改了一个控制器文件”，后续 Agent 想继续操作这个文件就找不到了。OpenClaw 默认采用strict 策略，要求摘要中精确保留所有不可重构的标识符。Compaction 的 prompt 里会给 LLM 一条通用指令，明确要求原样保留 UUID、hash、ID、token、API key、主机名、IP、端口、URL、文件名等。同时要求摘要必须包含一个 Exact identifiers 章节来列出关键标识符。注意 prompt 不会列举本次对话中出现的具体标识符，具体标识符的检验是在质量审计阶段，从最近 10 条消息中自动提取并比对摘要内容。Memory Flush 联动OpenClaw 还有一个很巧妙的设计：在接近 Compaction 阈值的时候，会先触发一次额外的 Agent 轮次（Memory Flush），让模型把重要信息主动写入 memory 目录。你可以把它理解成”考试交卷前最后再检查一遍”。模型知道自己的对话历史马上要被压缩了，所以赶紧把最重要的信息往长期存储里写一份。这样即使 Compaction 的摘要质量不理想，关键信息在 memory 目录里还有一份备份。这是短期记忆到长期记忆的逃生通道，保证信息不会因为压缩而彻底丢失。Post-compaction Context 注入压缩完成后，系统会从 AGENTS.md 里读取 “Session Startup” 和 “Red Lines” 两个部分，重新注入到上下文里。为什么要这么做？因为 Compaction 把早期消息替换成了摘要，但 Agent 的启动流程和红线规则可能就在那些被替换掉的早期消息里。如果不重新注入，模型压缩完之后可能忘了自己有哪些不能碰的红线，行为就可能失控。工具调用失败的特殊处理Compaction 还会专门提取并保留工具调用失败的信息，包括 exit code 和 error 状态。这些失败信息对后续任务成功率至关重要。比如 Agent 之前尝试过写入某个文件被权限拒绝了，如果这条失败记录在压缩时被丢掉，Agent 压缩后又会傻傻地去试一次，再失败，白白浪费一轮循环。保留失败记录就能让 Agent 直接跳过已知不可行的路径，换别的方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？回答：单次 Compaction 大概消耗几千 token，跟一轮正常对话差不多。但它能把几万 token 的对话历史压缩到几千 token 的摘要，后续每一轮对话都省了大量 Context 开销。从整个 session 生命周期看，做 Compaction 的 token 总消耗远低于不做 Compaction 把完整历史一直带着。越长的对话收益越明显，100 轮的对话如果不压缩，光 Context 填充就要烧掉几十万 token 甚至更多。- &lt;strong&gt;提问&lt;/strong&gt;：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：chunk 大小按 token 上限来切，默认是模型 Context 窗口的 40%（基准比例），会根据消息平均大小自适应调整（最低 15%），同时预留约 4096 token 给摘要 prompt 和推理预算。切的时候是在单条消息的边界切，不会把一条消息拆到两个 chunk 里，但不会刻意保证 user+assistant 对话回合的完整性。chunk 之间确实可能丢跨 chunk 的上下文关联，所以才需要合并摘要阶段，让 LLM 把多段摘要融合起来，补上跨段的逻辑关系。另外还有 20% 的安全缓冲来补偿 token 估算不准的问题。- &lt;strong&gt;提问&lt;/strong&gt;：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：按 token 数触发。每次拼完整的 prompt 之前会算一下当前对话历史占了多少 token，超过阈值就触发 Compaction。用固定轮次不靠谱，因为每轮对话的长度差异很大，有的轮次用户就说了一句话，有的轮次 Agent 调了 5 个工具返回一大堆结果。按 token 数控制才能精确地管住 Context 窗口的使用率。- &lt;strong&gt;提问&lt;/strong&gt;：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：会。这是 strict 策略的一个已知代价，摘要会比宽松策略长一些。但在实际场景中，标识符占的 token 比例并不大，通常几十个 token 就能覆盖一个 session 里的所有关键标识符。相比丢失标识符导致后续任务失败再重试的 token 浪费，保留它们的成本低得多。如果确实需要清理过时标识符，可以在 Memory Flush 阶段让 Agent 主动判断哪些标识符还有用，只把有用的写入长期记忆。作者：Yes面试鸭官方
Compaction 压缩：用 LLM 把一大段对话历史压缩成一段精炼摘要，然后用摘要替换掉原始消息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw 的 Compaction 核心流程分 4 步走：分块 Chunking ：先把待压缩的消息按 token 预算切成多个 ch展开新页面打开2026-03-17  21:4900回复晚夜微雨问海棠特训营一、对话历史超长、裁剪失效时的终极解决方案当渐进式裁剪（Pruning）仍无法控制Token占用时，行业通用的终极方案包括：对话压缩（Compaction）：用LLM将旧对话历史总结为紧凑摘要，替换原始内容，是最直接有效的手段。分层记忆+RAG召回：将旧历史归档展开新页面打开2026-03-15  09:2200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;摘要质量检查标识符保留策略Memory Flush 联动Post-compaction Context 注入工具调用失败的特殊处理&lt;/p&gt;&lt;p&gt;提问：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？提问：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？提问：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？提问：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？&lt;a href=&quot;#当对话历史实在太长裁剪也不够用时还有什么办法-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;什么是 Compaction？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;OpenClaw 的 Compaction 策略是怎样的？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？&lt;a href=&quot;#当对话历史实在太长裁剪也不够用时还有什么办法什么是-compactionopenclaw-的-compaction-策略是怎样的-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;当对话历史实在太长、裁剪也不够用时，还有什么办法？什么是 Compaction？OpenClaw 的 Compaction 策略是怎样的？NEW中等AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享1179面试问答裁剪是把早期消息直接丢掉，简单粗暴但会丢信息。Compaction（压实/压缩）换了个思路：用 LLM 把一大段对话历史”压缩”成一段精炼摘要，然后用摘要替换掉原始消息。打个比方，就像把一本 300 页的会议记录压缩成 5 页的纪要。篇幅大幅缩减，但关键决议、待办事项、重要结论都保留了。这样 Context 窗口腾出来了，关键信息也没丢。OpenClaw 的 Compaction 核心流程分 4 步走：分块（Chunking）：先把待压缩的消息按 token 预算切成多个 chunk（默认切 2 段）。切分在单条消息的边界进行，chunk 大小由 Context 窗口比例自适应计算。同时把最近几轮对话（默认 3 轮）分离出来保留原文，只压缩更早的消息。逐块摘要（Per-chunk Summarization）：每个 chunk 分别发给 LLM 生成一段摘要。如果某条消息超大（超过 Context 窗口的 50%），会走降级路径：先跳过超大消息只压缩小消息，再标注超大消息被省略了。合并摘要（Merge Summaries）：把多段局部摘要再调一次 LLM 融合成一份连贯的最终摘要，要求保留：进行中的任务状态、批量操作进度、用户最后的请求、决策及原因、待办事项和约束条件。摘要增强（Summary Augmentation）：在合并摘要基础上，追加额外上下文，比如工具调用失败记录（包含 exit code 和 error 状态）、文件操作记录（读过和修改过的文件列表）、最近几轮对话的原文摘要、以及从 AGENTS.md 提取的关键规则。最终结果替换掉原始消息，写入 session 历史。这个设计的核心理念是：宁可多花点 token 调一次 LLM 做摘要，也不要丢掉关键信息让后续任务翻车。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;摘要质量检查压缩不是调一次 LLM 就完事了，OpenClaw 做了专门的质量校验。压缩完成后会检查摘要是否包含 5 个必要的结构化章节：Decisions（做过的决策）Open TODOs（未完成的任务）Constraints/Rules（约束条件）Pending user asks（用户尚未被回应的请求）Exact identifiers（需要精确保留的标识符）除了章节完整性之外，质量审计还会检查两个方面：摘要是否保留了从最近消息中提取的关键标识符（strict 策略下）以及摘要内容是否反映了用户最新的请求。不过需要注意，这套质量检查+重试机制（quality guard）默认是关闭的，需要在配置中显式启用。启用后，如果摘要未通过质量审计，会触发重试（最多重试 1 次，可配置，上限 3 次）。即使不启用 quality guard，结构化章节的要求也会通过 prompt 指令传达给 LLM，只是不会做事后校验和自动重试。标识符保留策略摘要有一个特别容易踩的坑：LLM 会把 UUID、hash、API key、URL、文件名这些标识符”概括”掉。比如把file: src/controllers/UserController.ts概括成”修改了一个控制器文件”，后续 Agent 想继续操作这个文件就找不到了。OpenClaw 默认采用strict 策略，要求摘要中精确保留所有不可重构的标识符。Compaction 的 prompt 里会给 LLM 一条通用指令，明确要求原样保留 UUID、hash、ID、token、API key、主机名、IP、端口、URL、文件名等。同时要求摘要必须包含一个 Exact identifiers 章节来列出关键标识符。注意 prompt 不会列举本次对话中出现的具体标识符，具体标识符的检验是在质量审计阶段，从最近 10 条消息中自动提取并比对摘要内容。Memory Flush 联动OpenClaw 还有一个很巧妙的设计：在接近 Compaction 阈值的时候，会先触发一次额外的 Agent 轮次（Memory Flush），让模型把重要信息主动写入 memory 目录。你可以把它理解成”考试交卷前最后再检查一遍”。模型知道自己的对话历史马上要被压缩了，所以赶紧把最重要的信息往长期存储里写一份。这样即使 Compaction 的摘要质量不理想，关键信息在 memory 目录里还有一份备份。这是短期记忆到长期记忆的逃生通道，保证信息不会因为压缩而彻底丢失。Post-compaction Context 注入压缩完成后，系统会从 AGENTS.md 里读取 “Session Startup” 和 “Red Lines” 两个部分，重新注入到上下文里。为什么要这么做？因为 Compaction 把早期消息替换成了摘要，但 Agent 的启动流程和红线规则可能就在那些被替换掉的早期消息里。如果不重新注入，模型压缩完之后可能忘了自己有哪些不能碰的红线，行为就可能失控。工具调用失败的特殊处理Compaction 还会专门提取并保留工具调用失败的信息，包括 exit code 和 error 状态。这些失败信息对后续任务成功率至关重要。比如 Agent 之前尝试过写入某个文件被权限拒绝了，如果这条失败记录在压缩时被丢掉，Agent 压缩后又会傻傻地去试一次，再失败，白白浪费一轮循环。保留失败记录就能让 Agent 直接跳过已知不可行的路径，换别的方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？回答：单次 Compaction 大概消耗几千 token，跟一轮正常对话差不多。但它能把几万 token 的对话历史压缩到几千 token 的摘要，后续每一轮对话都省了大量 Context 开销。从整个 session 生命周期看，做 Compaction 的 token 总消耗远低于不做 Compaction 把完整历史一直带着。越长的对话收益越明显，100 轮的对话如果不压缩，光 Context 填充就要烧掉几十万 token 甚至更多。- &lt;strong&gt;提问&lt;/strong&gt;：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：chunk 大小按 token 上限来切，默认是模型 Context 窗口的 40%（基准比例），会根据消息平均大小自适应调整（最低 15%），同时预留约 4096 token 给摘要 prompt 和推理预算。切的时候是在单条消息的边界切，不会把一条消息拆到两个 chunk 里，但不会刻意保证 user+assistant 对话回合的完整性。chunk 之间确实可能丢跨 chunk 的上下文关联，所以才需要合并摘要阶段，让 LLM 把多段摘要融合起来，补上跨段的逻辑关系。另外还有 20% 的安全缓冲来补偿 token 估算不准的问题。- &lt;strong&gt;提问&lt;/strong&gt;：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：按 token 数触发。每次拼完整的 prompt 之前会算一下当前对话历史占了多少 token，超过阈值就触发 Compaction。用固定轮次不靠谱，因为每轮对话的长度差异很大，有的轮次用户就说了一句话，有的轮次 Agent 调了 5 个工具返回一大堆结果。按 token 数控制才能精确地管住 Context 窗口的使用率。- &lt;strong&gt;提问&lt;/strong&gt;：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：会。这是 strict 策略的一个已知代价，摘要会比宽松策略长一些。但在实际场景中，标识符占的 token 比例并不大，通常几十个 token 就能覆盖一个 session 里的所有关键标识符。相比丢失标识符导致后续任务失败再重试的 token 浪费，保留它们的成本低得多。如果确实需要清理过时标识符，可以在 Memory Flush 阶段让 Agent 主动判断哪些标识符还有用，只把有用的写入长期记忆。作者：Yes面试鸭官方- Compaction 压缩：用 LLM 把一大段对话历史压缩成一段精炼摘要，然后用摘要替换掉原始消息&lt;/li&gt;
&lt;li&gt;OpenClaw 的 Compaction 核心流程分 4 步走：分块 Chunking ：先把待压缩的消息按 token 预算切成多个 ch展开新页面打开2026-03-17  21:4900回复晚夜微雨问海棠特训营一、对话历史超长、裁剪失效时的终极解决方案当渐进式裁剪（Pruning）仍无法控制Token占用时，行业通用的终极方案包括：对话压缩（Compaction）：用LLM将旧对话历史总结为紧凑摘要，替换原始内容，是最直接有效的手段。分层记忆+RAG召回：将旧历史归档展开新页面打开2026-03-15  09:2200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;摘要质量检查标识符保留策略Memory Flush 联动Post-compaction Context 注入工具调用失败的特殊处理&lt;/p&gt;&lt;p&gt;提问：Compaction 本身也要调 LLM，那 token 开销大不大？会不会得不偿失？提问：分段摘要的 chunk 大小怎么定的？切太小会不会丢上下文？提问：Compaction 触发的时机是什么？是固定轮次触发还是按 token 数触发？提问：strict 策略保留标识符，但有些标识符已经过时了不需要了，不会造成摘要膨胀吗？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>校招生写Agent项目最怕这5个追问</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E6%A0%A1%E6%8B%9B%E7%94%9F%E5%86%99agent%E9%A1%B9%E7%9B%AE%E6%9C%80%E6%80%95%E8%BF%995%E4%B8%AA%E8%BF%BD%E9%97%AE/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E6%A0%A1%E6%8B%9B%E7%94%9F%E5%86%99agent%E9%A1%B9%E7%9B%AE%E6%9C%80%E6%80%95%E8%BF%995%E4%B8%AA%E8%BF%BD%E9%97%AE/</guid><description># 校招生写Agent项目，最怕这5个追问 &gt; 来源：小红书 @黄同学h &gt; 原文链接：http://xhslink.com/o/5TeS1z9FWsQ &gt; 发布时间：2026-04-11 &gt; 标签：Agent、Agent开发、后端开发、互</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;校招生写Agent项目，最怕这5个追问&lt;a href=&quot;#校招生写agent项目最怕这5个追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书 @黄同学h
原文链接：&lt;a href=&quot;http://xhslink.com/o/5TeS1z9FWsQ&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/5TeS1z9FWsQ&lt;/a&gt;
发布时间：2026-04-11
标签：Agent、Agent开发、后端开发、互联网大厂、Agent项目
收藏 311 · 点赞 222 · 评论 4&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;很多同学现在都会在简历上补一个 Agent 项目，但真正拉开差距的，是面试官顺着往下问的时候，你能不能讲明白。&lt;/p&gt;&lt;p&gt;我自己前实习和秋招那段时间，很多项目和经历其实都是按这个思路去设计的。一个好的项目，不是功能点多，而是能让人有好奇心继续问下去。只要对方愿意继续问，你就有机会把后面的场景、方案、收益讲完整。&lt;/p&gt;&lt;p&gt;这篇文章我想聊的是：如果你简历上写了 Agent 项目，面试官最容易会从哪些地方继续追问；以及为什么很多项目做出来了，最后还是会在追问里讲散。你会发现，后面的追问其实不是黑盒，基本都会落到几个固定方向。&lt;/p&gt;&lt;p&gt;如果你现在也在准备 Agent 项目、想写简历、或者想把项目讲得更像一个能扛面试的工程项目，这篇应该会对你有帮助。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;好的项目，不是功能点多，而是能让人继续问下去。&lt;/p&gt;&lt;p&gt;我自己前实习和秋招那段时间，很多项目和经历其实都是按这个思路去设计的。我能在短短的一分钟介绍之后，就让面试官有提问的欲望，从而拿捏项目拷打环节。&lt;/p&gt;&lt;p&gt;如果项目只是功能罗列，那面试官最多听你讲一轮，很难继续往下问。但如果你的项目里有明确的场景、有设计取舍、有合适的方案、有指标收益，后面的追问其实不是黑盒，基本都会落到几个很固定的方向。&lt;/p&gt;&lt;p&gt;所以做 Agent 项目的时候，不是做完以后再想面试官会怎么问我，而是一开始就要想清楚：如果这个项目真的让人想继续问下去，最容易会问到哪里？&lt;/p&gt;&lt;p&gt;我自己前实习和秋招那段时间，反复被问、反复复盘下来，Agent 项目最常见的，基本就是下面这5个方向。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;追问1：你这个项目，到底在解决什么问题？&lt;a href=&quot;#追问1你这个项目到底在解决什么问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人介绍项目时，上来就是报菜名式地：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;接了 tool calling&lt;/li&gt;
&lt;li&gt;做了 memory&lt;/li&gt;
&lt;li&gt;支持多轮对话&lt;/li&gt;
&lt;li&gt;接了 shell / MCP / browser&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;但你把这些东西列完，面试官其实还是会继续问：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;所以你为什么要做这个项目？它到底想解决什么问题？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果这个点答不清楚，项目就难以有差异度，很容易让面试官感觉：今天这场面试又要听一个 toy project 了。&lt;/p&gt;&lt;p&gt;我觉得一个优秀的思路是，从你自己的痛点出发，带点产品 sense。比如我做的 pico 这个项目，我就会说：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;我之所以要自己做个 coding agent，有两点：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 可控性。&lt;/strong&gt; 平时我也会用 Claude Code 这类产品，但很多关键东西对用户来说其实是黑盒，比如 prompt 是怎么拼的、上下文是怎么组装的、工具在什么条件下会被调用，我很难真正判断它为什么这次做对了、下次又为什么会跑偏，某种程度上有点像抽卡。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 隐私和部署要求。&lt;/strong&gt; 实验室有些项目本身有保密约束，不适合直接放到外部开源服务里做，所以我也希望这套 agent 从工具到模型都能自己控制。我在项目里预留了接开源模型的能力，比如可以直接接实验室已经部署好的 Qwen，这样在需要保密的场景下也能真正用起来。&lt;/p&gt;&lt;p&gt;如果有这样的描述，结合自己的痛点，把为什么 + 解决什么问题表达清楚，那面试官对你这个项目的好奇心会多很多。你们会很有话题聊。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;追问2：为什么这里要做成 Agent？为什么不直接用现成方案？&lt;a href=&quot;#追问2为什么这里要做成-agent为什么不直接用现成方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你刚解释完为什么这里要做成 Agent，对方很快就会接着问：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;那为什么不是普通 Workflow？为什么不是直接用现成方案？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这类问题一旦被问到，面试官其实就在判断两件事：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;你有没有想清楚”为什么这里需要 Agent”&lt;/li&gt;
&lt;li&gt;你是不是只是在重复造轮子&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;因为现在现成方案已经很多了。&lt;/p&gt;&lt;p&gt;你做 code agent，逃不开 Claude Code、OpenCode。你做更通用的 Agent，也很容易被问到 OpenClaw、Hermes 这类系统。&lt;/p&gt;&lt;p&gt;所以你得讲清楚：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;为什么这里需要模型做动态决策&lt;/li&gt;
&lt;li&gt;为什么不是固定流程&lt;/li&gt;
&lt;li&gt;为什么不是直接拿成熟方案来拼&lt;/li&gt;
&lt;li&gt;你自己做的价值到底在哪&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你只能回答一句”我想练练手”，这个项目在面试里基本撑不住。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;追问3：系统为什么不会失控？&lt;a href=&quot;#追问3系统为什么不会失控&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多 Agent 项目一开始看起来都挺顺：能对话，能调工具，能跑几轮，甚至还能给面试官演示一下。真正往下问的时候，问题就来了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具为什么不会乱调&lt;/li&gt;
&lt;li&gt;状态为什么不会出现偏移&lt;/li&gt;
&lt;li&gt;上下文为什么不会越堆越乱&lt;/li&gt;
&lt;li&gt;memory 为什么不会把旧信息一直带着跑&lt;/li&gt;
&lt;li&gt;长任务中间崩了怎么办&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;很多项目到这里就接不住了。因为大家在做项目的时候最多达到”这个东西跑通过”的程度。但真到面试里，大家更容易挂掉的地方不是它跑没跑通，而是顺着往下问时，你讲不清它为什么没有一路跑偏，为什么还能稳定地跑下去。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;追问4：上下文和 memory，到底怎么管？&lt;a href=&quot;#追问4上下文和-memory到底怎么管&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上下文和 memory 是每一个 agent 都逃不开的话题，属于是必考的项目问题。&lt;/p&gt;&lt;p&gt;你一上来就说自己做了 memory、做了上下文压缩、做了长期记忆。但面试官真正想了解的是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你到底让它记住了什么&lt;/li&gt;
&lt;li&gt;什么该进 prompt，什么不该进&lt;/li&gt;
&lt;li&gt;为什么不是把历史全塞进去&lt;/li&gt;
&lt;li&gt;旧结论过期了怎么办&lt;/li&gt;
&lt;li&gt;你的方案是怎么做的，有考虑你的 agent 具体场景吗&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;面试官不是在听你会不会背术语。他是在看你有没有真正想过：Agent 什么时候该记，什么时候该忘。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;追问5：你了解这个方向上已经有什么成熟方案吗？你自己的项目跟它们差在哪？&lt;a href=&quot;#追问5你了解这个方向上已经有什么成熟方案吗你自己的项目跟它们差在哪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;不少同学做项目的时候，注意力都放在我把这个东西做出来了。但面试官继续往下问的时候，往往还会在意另一件事：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;你做这个项目之前，有没有看过这个方向上已经有什么成熟方案？你自己的项目跟它们差在哪里？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这个问题的难点，不是让你去做一份竞品分析。而是看你有没有基本的判断力和对新技术的敏感度。&lt;/p&gt;&lt;p&gt;比如你做 code agent，面试官很容易问到：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你了解过 Claude Code、OpenCode 这些东西吗？&lt;/li&gt;
&lt;li&gt;你这个项目跟它们相比，差异到底在哪？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你做的是更通用的 Agent，也可能会被问到：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你有没有看过 OpenClaw、Hermes 这一类方案？&lt;/li&gt;
&lt;li&gt;你自己的项目重点放在哪？&lt;/li&gt;
&lt;li&gt;你和这些系统相比，到底少了什么，多了什么，或者你更关注哪一层？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;以后大家去实习工作了，一个新项目的落地肯定也逃不过这个问题。你能不能把自己的项目放回到整个生态里去看，面试官就是在提前考察你有没有这样的敏感度。&lt;/p&gt;&lt;p&gt;如果你只会说”我自己做了一个 Agent”，那项目很容易显得视野太窄。但如果你能讲清楚：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这个方向上已经有谁在做&lt;/li&gt;
&lt;li&gt;它们分别强在哪&lt;/li&gt;
&lt;li&gt;你的项目为什么不跟它们比功能广度&lt;/li&gt;
&lt;li&gt;你自己这一版重点想讲清楚的到底是哪一层&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;那会让面试官眼前一亮的。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;为什么我觉得 code agent 特别适合校招面试？&lt;a href=&quot;#为什么我觉得-code-agent-特别适合校招面试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果要让我推荐一个业务方向，来让项目天然更容易引发面试官继续问，code agent 确实是个很适合讲的垂直方向。&lt;/p&gt;&lt;p&gt;它天然就能把很多面试官会继续深问的东西带出来：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具&lt;/li&gt;
&lt;li&gt;状态&lt;/li&gt;
&lt;li&gt;上下文&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;评测&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些点你只要能讲顺两三层，项目就不只是一个热点词，而更像一个能扛追问的工程项目。也正因为这样，我最后才会选这个方向，自己做了 pico 这个项目。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;附：Pico 项目简历描述示例&lt;a href=&quot;#附pico-项目简历描述示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pico: 本地代码智能体 Harness&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心技术：&lt;/strong&gt; Python、Agent Harness、Tool Calling、Context Engineering、Memory Retrieval、Prompt Cache&lt;/p&gt;&lt;p&gt;&lt;strong&gt;项目描述：&lt;/strong&gt;
面向代码仓库长链路任务开发本地代码 Agent Harness，覆盖模型接入、工具调用、上下文管理、结构化记忆、运行审计与评测闭环，重点解决多轮任务中的上下文膨胀、重复读取、工具误调用和结果不可复现问题&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心工作：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agent Harness 架构设计&lt;/strong&gt;：负责本地代码 Agent 的整体设计与开发，统一模型接入、工具执行、会话状态和运行工件落盘流程，形成可回放的任务执行链路；支持 2 类模型后端、7 类工具和 3 类运行工件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;长上下文治理&lt;/strong&gt;：针对代码仓库长链路任务中的 prompt 膨胀问题，设计分层上下文管理与预算裁剪机制；在 12 组真实长上下文配置上，将平均 prompt 长度从 6964 压缩到 5418，平均压缩率 18.01%，最高压缩率 35.63%。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结构化记忆系统&lt;/strong&gt;：将任务摘要、文件摘要和会话笔记分层管理，并结合 freshness 校验和相关记忆召回减少重复读取；在 12 个真实记忆依赖任务中，将重复读文件次数从 8 次降到 3 次，平均工具步数从 0.67 降到 0.25，任务正确率从 66.7% 提升到 100%。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;工具安全与运行治理&lt;/strong&gt;：构建标准化工具调用与安全边界，覆盖参数校验、工作区隔离、高风险审批、只读委派、重复调用拦截和敏感信息脱敏；在 1 个真实治理场景中，结构化记录 3 次路径选择拦截、5 次无效参数拒绝和 2 次重复调用拦截。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评测与审计闭环&lt;/strong&gt;：建立固定 benchmark 与运行审计体系，支持 pass_rate / attempts / tool_steps / failure_category / trace 的自动汇总与回归对比；当前覆盖 6 个标准化任务和 86 条自动化测试。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型后端效果评估&lt;/strong&gt;：搭建 GPT / Claude provider 分离对比框架，在 GPT 后端的 6 个固定任务上取得 83.33% 的 pass rate，平均 attempts=3.00、平均 tool_steps=2.00，支撑不同模型后端的效果与成本评估。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;我想做的，不是一个为了炫技的 Agent demo，是一个真正方便大家拿去研究、包装、写进简历、准备面试的项目。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>现场实操：给定一个包含数据Schema的API文档，请使用AI工具在15分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%8E%B0%E5%9C%BA%E5%AE%9E%E6%93%8D-%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E5%8C%85%E5%90%AB%E6%95%B0%E6%8D%AEschema%E7%9A%84api%E6%96%87%E6%A1%A3-%E8%AF%B7%E4%BD%BF%E7%94%A8ai%E5%B7%A5%E5%85%B7%E5%9C%A815%E5%88%86%E9%92%9F%E5%86%85%E7%94%9F%E6%88%90%E7%AC%A6%E5%90%88restful%E8%A7%84%E8%8C%83%E7%9A%84crud%E6%8E%A5%E5%8F%A3%E4%BB%A3%E7%A0%81-%E5%B9%B6%E8%A7%A3%E9%87%8A%E5%85%B3%E9%94%AE%E5%AE%9E%E7%8E%B0%E9%80%BB%E8%BE%91_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%8E%B0%E5%9C%BA%E5%AE%9E%E6%93%8D-%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E5%8C%85%E5%90%AB%E6%95%B0%E6%8D%AEschema%E7%9A%84api%E6%96%87%E6%A1%A3-%E8%AF%B7%E4%BD%BF%E7%94%A8ai%E5%B7%A5%E5%85%B7%E5%9C%A815%E5%88%86%E9%92%9F%E5%86%85%E7%94%9F%E6%88%90%E7%AC%A6%E5%90%88restful%E8%A7%84%E8%8C%83%E7%9A%84crud%E6%8E%A5%E5%8F%A3%E4%BB%A3%E7%A0%81-%E5%B9%B6%E8%A7%A3%E9%87%8A%E5%85%B3%E9%94%AE%E5%AE%9E%E7%8E%B0%E9%80%BB%E8%BE%91_%E6%95%B4%E7%90%86/</guid><description># 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在15分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑 ## 问题 现场实操：给定一个包含数据Schema的API文档，请使用AI工具？ 15分钟内</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在15分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;a href=&quot;#现场实操给定一个包含数据schema的api文档请使用ai工具在15分钟内生成符合restful规范的crud接口代码并解释关键实现逻辑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具？
15分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在15分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v1.0)## 基础信息-&lt;strong&gt;Base URL&lt;/strong&gt;:&lt;code&gt;https://api.example.com/v1&lt;/code&gt;-&lt;strong&gt;数据格式&lt;/strong&gt;: JSON-认证方式: Bearer Token (需在Header中添加&lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;)&lt;/p&gt;&lt;p&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/p&gt;&lt;p&gt;|--------------|---------|------|--------------------------|&lt;/p&gt;&lt;p&gt;|&lt;code&gt;id&lt;/code&gt;| string  | 是   | 唯一标识符 (UUIDv4)      |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;title&lt;/code&gt;| string  | 是   | 任务标题 (1-100字符)     |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;description&lt;/code&gt;| string  | 否   | 任务描述 (可选)          |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;status&lt;/code&gt;| enum    | 是   |&lt;code&gt;pending&lt;/code&gt;/&lt;code&gt;completed&lt;/code&gt;|&lt;/p&gt;&lt;p&gt;|&lt;code&gt;dueDate&lt;/code&gt;| string  | 否   | 截止日期 (ISO8601格式)   |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;createdAt&lt;/code&gt;| string  | 是   | 创建时间 (ISO8601格式)   |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;updatedAt&lt;/code&gt;| string  | 是   | 最后更新时间 (ISO8601)   |&lt;/p&gt;&lt;p&gt;---## API 接口列表### 1. 获取Todo列表&lt;strong&gt;GET&lt;/strong&gt;&lt;code&gt;/todos&lt;/code&gt;#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/p&gt;&lt;p&gt;|------------|---------|--------|--------------------------|&lt;/p&gt;&lt;p&gt;|&lt;code&gt;status&lt;/code&gt;| string  | -      | 过滤状态 (&lt;code&gt;pending/completed&lt;/code&gt;) |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;page&lt;/code&gt;| integer | 1      | 分页页码                 |&lt;/p&gt;&lt;p&gt;|&lt;code&gt;limit&lt;/code&gt;| integer | 20     | 每页数量 (最大100)       |#### 响应示例```json&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;“total”: 45,&lt;/p&gt;&lt;p&gt;“page”: 1,&lt;/p&gt;&lt;p&gt;“limit”: 20,&lt;/p&gt;&lt;p&gt;“items”: [&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;“id”: “550e8400-e29b-41d4-a716-446655440000”,&lt;/p&gt;&lt;p&gt;“title”: “购买食材”,&lt;/p&gt;&lt;p&gt;“status”: “pending”,&lt;/p&gt;&lt;p&gt;“dueDate”: “2025-03-30T09:00:00Z”,&lt;/p&gt;&lt;p&gt;“createdAt”: “2025-03-28T14:30:00Z”&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;]&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;code&gt; &lt;/code&gt; `&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h3&gt;2. 创建新Todo&lt;a href=&quot;#2-创建新todo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/todos&lt;/code&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;请求体&lt;a href=&quot;#请求体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;. 获取单个Todo详情&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 扩展知识&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 面试官追问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **提问**：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？回答：拿到代码第一件事就是扫一遍安全问题。如果发现有 SQL 拼接这种明显漏洞，直接手动改成参数化查询。如果是鉴权没做，补上@PreAuthorize或者自定义拦截器。改完之后会反向给 AI 一个反馈，告诉它下次要注意这个点，后续生成的代码质量会提升。- **提问**：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：PUT 是全量更新，客户端得把所有字段都传过来，没传的字段会被置空。PATCH 是部分更新，只更新传了的字段。实际项目里 PATCH 用得更多，因为前端很少会一次性改全部字段。生成代码时如果是编辑场景，优先用 PATCH 加一个非空校验逻辑。- **提问**：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：优先级是安全 &amp;gt; 正确性 &amp;gt; 规范性。第一改安全漏洞，比如 SQL 注入、越权访问。第二改逻辑错误，比如空指针、边界条件没处理。第三才是代码风格、命名规范这些。规范性的问题不影响功能，面试完再改也行。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧生成代码的 Review 重点不同 AI 工具的差异面试现场实操建议&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提问：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？提问：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？提问：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？热门面试题目榜更多说说 Java 中 HashMap 的原理？&lt;/span&gt;&lt;span&gt;9130&lt;/span&gt;&lt;span&gt;Java 中的序列化和反序列化是什么？&lt;/span&gt;&lt;span&gt;6255&lt;/span&gt;&lt;span&gt;MySQL 索引的最左前缀匹配原则是什么？&lt;/span&gt;&lt;span&gt;5662&lt;/span&gt;&lt;span&gt;Java 中 ConcurrentHashMap &lt;/span&gt;&lt;span&gt;1.7&lt;/span&gt;&lt;span&gt; 和 &lt;/span&gt;&lt;span&gt;1.8&lt;/span&gt;&lt;span&gt; 之间有哪些区别？&lt;/span&gt;&lt;span&gt;5067&lt;/span&gt;&lt;span&gt;Java 中有哪些集合类？请简单介绍&lt;/span&gt;&lt;span&gt;4854&lt;/span&gt;&lt;span&gt;MySQL 的索引类型有哪些？&lt;/span&gt;&lt;span&gt;4845&lt;/span&gt;&lt;span&gt;详细描述一条 SQL 语句在 MySQL 中的执行过程。&lt;/span&gt;&lt;span&gt;4218&lt;/span&gt;&lt;span&gt;什么是 RAG？RAG 的主要流程是什么？&lt;/span&gt;&lt;span&gt;4151&lt;/span&gt;&lt;span&gt;MySQL 的存储引擎有哪些？它们之间有什么区别？&lt;/span&gt;&lt;span&gt;4092&lt;/span&gt;&lt;span&gt;数据库的脏读、不可重复读和幻读分别是什么？&lt;/span&gt;&lt;span&gt;3900&lt;/span&gt;&lt;span&gt;推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 答案&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;设计智能客服系统时，如何通过知识库构建解决长尾问题？请描述具体实现步骤当大模型API响应延迟超过&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;秒时，前端可以采取哪些优化策略保证用户体验？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;使用LangChain时，如何实现多路召回结果的动态权重分配？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;09&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;02&lt;/span&gt;&lt;span&gt;当大模型上下文窗口扩展到&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;万token时，哪些现有业务场景可能发生质变？当发现RAG系统召回结果与用户query意图不匹配时，有哪些可能的改进方向？使用LangChain实现RAG系统时，如何处理PDF文档中的表格数据召回问题？现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑参数高效微调（PEFT）如何减少计算成本？冻结层在微调中的作用是什么？为什么需要混合精度训练？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;09&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;27&lt;/span&gt;&lt;span&gt;模型输出重复和幻觉如何微调解决？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0511345&lt;/span&gt;&lt;span&gt;. 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`id`| string  | 是   | 唯一标识符 (UUIDv&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`title`| string  | 是   | 任务标题 (&lt;/span&gt;&lt;span&gt;1-100&lt;/span&gt;&lt;span&gt;字符)     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`description`| string  | 否   | 任务描述 (可选)          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| enum    | 是   |`pending`/`completed`|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`dueDate`| string  | 否   | 截止日期 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`createdAt`| string  | 是   | 创建时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`updatedAt`| string  | 是   | 最后更新时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## API 接口列表### &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;. 获取Todo列表**GET**`/todos`#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|------------|---------|--------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| string  | -      | 过滤状态 (`pending/completed`) |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`page`| integer | &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;      | 分页页码                 |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`limit`| integer | &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;     | 每页数量 (最大&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)       |#### 响应示例```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;total&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;items&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;购买食材&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-30T09:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T14:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**POST** `/todos`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 请求体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;239&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;250&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;256&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;264&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;266&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;270&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;280&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;283&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;285&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;286&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;287&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;290&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;291&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;292&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;295&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;296&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;297&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;298&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;301&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;302&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;303&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;304&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;305&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;306&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;307&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;308&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;309&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;310&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;311&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;312&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;313&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;314&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;315&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;316&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;317&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;318&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;319&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;320&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;321&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;322&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;323&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;324&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;325&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;326&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;327&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;328&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;329&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;330&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;331&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;332&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;333&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;334&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;335&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;336&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;337&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;338&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;339&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;340&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;341&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;342&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;343&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;344&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;345&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;346&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;347&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;348&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;349&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;350&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;351&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;352&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;353&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;354&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;355&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;356&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;357&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;358&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;359&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;360&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;361&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;362&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;363&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;364&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;365&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;366&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;367&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;368&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;369&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;370&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;371&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;372&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;373&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;374&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;375&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;376&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;377&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;378&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;379&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;380&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;381&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **提问**：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？回答：拿到代码第一件事就是扫一遍安全问题。如果发现有 SQL 拼接这种明显漏洞，直接手动改成参数化查询。如果是鉴权没做，补上@PreAuthorize或者自定义拦截器。改完之后会反向给 AI 一个反馈，告诉它下次要注意这个点，后续生成的代码质量会提升。- **提问**：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;382&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：PUT 是全量更新，客户端得把所有字段都传过来，没传的字段会被置空。PATCH 是部分更新，只更新传了的字段。实际项目里 PATCH 用得更多，因为前端很少会一次性改全部字段。生成代码时如果是编辑场景，优先用 PATCH 加一个非空校验逻辑。- **提问**：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;383&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：优先级是安全 &amp;gt; 正确性 &amp;gt; 规范性。第一改安全漏洞，比如 SQL 注入、越权访问。第二改逻辑错误，比如空指针、边界条件没处理。第三才是代码风格、命名规范这些。规范性的问题不影响功能，面试完再改也行。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;384&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;385&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧生成代码的 Review 重点不同 AI 工具的差异面试现场实操建议&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;386&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;387&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提问：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？提问：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？提问：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？热门面试题目榜更多说说 Java 中 HashMap 的原理？&lt;/span&gt;&lt;span&gt;9130&lt;/span&gt;&lt;span&gt;Java 中的序列化和反序列化是什么？&lt;/span&gt;&lt;span&gt;6255&lt;/span&gt;&lt;span&gt;MySQL 索引的最左前缀匹配原则是什么？&lt;/span&gt;&lt;span&gt;5662&lt;/span&gt;&lt;span&gt;Java 中 ConcurrentHashMap &lt;/span&gt;&lt;span&gt;1.7&lt;/span&gt;&lt;span&gt; 和 &lt;/span&gt;&lt;span&gt;1.8&lt;/span&gt;&lt;span&gt; 之间有哪些区别？&lt;/span&gt;&lt;span&gt;5067&lt;/span&gt;&lt;span&gt;Java 中有哪些集合类？请简单介绍&lt;/span&gt;&lt;span&gt;4854&lt;/span&gt;&lt;span&gt;MySQL 的索引类型有哪些？&lt;/span&gt;&lt;span&gt;4845&lt;/span&gt;&lt;span&gt;详细描述一条 SQL 语句在 MySQL 中的执行过程。&lt;/span&gt;&lt;span&gt;4218&lt;/span&gt;&lt;span&gt;什么是 RAG？RAG 的主要流程是什么？&lt;/span&gt;&lt;span&gt;4151&lt;/span&gt;&lt;span&gt;MySQL 的存储引擎有哪些？它们之间有什么区别？&lt;/span&gt;&lt;span&gt;4092&lt;/span&gt;&lt;span&gt;数据库的脏读、不可重复读和幻读分别是什么？&lt;/span&gt;&lt;span&gt;3900&lt;/span&gt;&lt;span&gt;推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;388&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;389&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;390&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;391&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; 来源: 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑.mhtml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;392&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;393&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;##&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;394&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;395&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 关键点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;396&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;397&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- # 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;398&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;399&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;400&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;401&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;402&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;403&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;404&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`id`| string  | 是   | 唯一标识符 (UUIDv&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;405&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;406&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`title`| string  | 是   | 任务标题 (&lt;/span&gt;&lt;span&gt;1-100&lt;/span&gt;&lt;span&gt;字符)     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;407&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;408&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`description`| string  | 否   | 任务描述 (可选)          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;409&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;410&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| enum    | 是   |`pending`/`completed`|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;411&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;412&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`dueDate`| string  | 否   | 截止日期 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;413&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;414&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`createdAt`| string  | 是   | 创建时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;415&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;416&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`updatedAt`| string  | 是   | 最后更新时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;417&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;418&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## API 接口列表### &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;. 获取Todo列表**GET**`/todos`#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;419&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;420&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|------------|---------|--------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;421&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;422&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| string  | -      | 过滤状态 (`pending/completed`) |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;423&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;424&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`page`| integer | &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;      | 分页页码                 |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;425&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;426&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`limit`| integer | &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;     | 每页数量 (最大&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)       |#### 响应示例```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;427&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;428&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;429&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;430&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;total&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;431&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;432&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;433&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;434&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;435&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;436&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;items&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;437&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;438&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;439&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;440&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;441&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;442&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;购买食材&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;443&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;444&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;445&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;446&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-30T09:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;447&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;448&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T14:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;449&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;450&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;451&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;452&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;453&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;454&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;455&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;456&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;457&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;458&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;459&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;460&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**POST** `/todos`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;461&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;462&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 请求体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;463&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;464&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;465&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;466&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;467&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;468&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;469&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;470&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;471&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;472&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;473&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;474&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;475&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;476&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;477&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;478&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;479&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;480&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;481&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;482&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;483&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;484&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;485&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;486&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;487&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;488&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;489&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;490&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;491&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;492&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;493&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;494&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;495&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;496&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;497&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;498&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;499&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;500&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;501&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;502&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;503&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;504&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;505&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;506&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;507&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;508&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;509&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;510&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;511&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;512&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;513&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;514&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;515&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;516&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;517&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;518&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;519&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;520&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;521&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;522&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;523&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;524&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;525&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;526&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;527&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;528&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;529&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;530&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;531&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;532&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;533&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;534&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;535&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;536&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;537&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;538&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;539&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;540&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;541&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;542&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;543&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;544&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;545&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;546&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;547&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;548&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;549&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;550&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;551&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;552&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;553&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;554&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;555&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;556&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;557&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;558&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;559&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;560&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;561&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;562&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;563&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;564&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;565&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;566&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;567&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;568&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;569&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;570&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;571&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;572&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;573&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;574&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;575&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;576&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;577&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;578&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;579&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;580&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;581&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;582&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;583&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;584&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;585&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;586&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;587&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;588&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;589&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;590&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;591&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;592&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;593&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;594&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;595&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;596&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;597&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;598&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;599&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;600&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;601&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;602&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;603&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;604&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;605&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;606&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;607&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;608&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;609&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;610&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;611&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;612&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;613&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;614&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;615&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;616&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;617&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;618&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 备注&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;619&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;620&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 本文已做格式统一与噪声清理，保留原始语义。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;621&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- ## 问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;622&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;623&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;624&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;625&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;626&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;627&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;628&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;629&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;630&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`id`| string  | 是   | 唯一标识符 (UUIDv&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;631&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;632&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`title`| string  | 是   | 任务标题 (&lt;/span&gt;&lt;span&gt;1-100&lt;/span&gt;&lt;span&gt;字符)     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;633&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;634&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`description`| string  | 否   | 任务描述 (可选)          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;635&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;636&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| enum    | 是   |`pending`/`completed`|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;637&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;638&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`dueDate`| string  | 否   | 截止日期 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;639&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;640&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`createdAt`| string  | 是   | 创建时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;641&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;642&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`updatedAt`| string  | 是   | 最后更新时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;643&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;644&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## API 接口列表### &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;. 获取Todo列表**GET**`/todos`#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;645&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;646&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|------------|---------|--------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;647&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;648&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| string  | -      | 过滤状态 (`pending/completed`) |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;649&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;650&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`page`| integer | &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;      | 分页页码                 |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;651&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;652&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`limit`| integer | &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;     | 每页数量 (最大&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)       |#### 响应示例```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;653&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;654&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;655&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;656&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;total&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;657&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;658&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;659&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;660&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;661&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;662&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;items&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;663&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;664&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;665&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;666&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;667&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;668&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;购买食材&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;669&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;670&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;671&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;672&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-30T09:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;673&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;674&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T14:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;675&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;676&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;677&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;678&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;679&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;680&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;681&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;682&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;683&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;684&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;685&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;686&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**POST** `/todos`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;687&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;688&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 请求体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;689&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;690&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;691&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;692&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;693&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;694&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;695&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;696&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;697&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;698&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;699&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;700&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;701&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;702&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;703&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;704&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;705&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;706&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;707&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;708&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;709&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;710&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;711&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;712&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;713&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;714&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;715&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;716&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;717&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;718&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;719&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;720&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;721&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;722&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;723&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;724&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;725&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;726&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;727&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;728&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;729&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;730&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;731&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;732&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;733&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;734&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;735&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;736&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;737&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;738&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;739&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;740&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;741&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;742&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;743&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;744&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;745&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;746&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;747&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;748&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;749&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;750&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;751&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;752&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;753&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;754&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;755&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;756&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;757&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;758&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;759&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;760&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;761&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;762&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;763&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;764&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;765&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;766&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;767&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;768&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;769&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;770&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;771&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;772&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;773&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;774&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;775&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;776&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;777&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;778&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;779&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;780&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;781&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;782&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;783&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;784&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;785&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;786&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;787&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;788&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;789&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;790&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;791&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;792&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;793&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;794&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;795&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;796&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;797&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;798&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;799&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;800&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;801&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;802&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;803&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;804&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;805&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;806&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;807&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;808&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;809&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;810&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;811&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;812&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;813&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;814&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;815&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;816&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;817&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;818&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;819&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;820&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;821&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;822&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;823&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;824&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;825&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;826&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;827&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;828&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;829&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;830&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;831&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;832&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;833&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;834&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;835&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;836&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;837&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;838&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;839&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;840&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **提问**：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？回答：拿到代码第一件事就是扫一遍安全问题。如果发现有 SQL 拼接这种明显漏洞，直接手动改成参数化查询。如果是鉴权没做，补上@PreAuthorize或者自定义拦截器。改完之后会反向给 AI 一个反馈，告诉它下次要注意这个点，后续生成的代码质量会提升。- **提问**：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;841&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：PUT 是全量更新，客户端得把所有字段都传过来，没传的字段会被置空。PATCH 是部分更新，只更新传了的字段。实际项目里 PATCH 用得更多，因为前端很少会一次性改全部字段。生成代码时如果是编辑场景，优先用 PATCH 加一个非空校验逻辑。- **提问**：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;842&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：优先级是安全 &amp;gt; 正确性 &amp;gt; 规范性。第一改安全漏洞，比如 SQL 注入、越权访问。第二改逻辑错误，比如空指针、边界条件没处理。第三才是代码风格、命名规范这些。规范性的问题不影响功能，面试完再改也行。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;843&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;844&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧生成代码的 Review 重点不同 AI 工具的差异面试现场实操建议&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;845&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;846&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提问：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？提问：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？提问：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？热门面试题目榜更多说说 Java 中 HashMap 的原理？&lt;/span&gt;&lt;span&gt;9130&lt;/span&gt;&lt;span&gt;Java 中的序列化和反序列化是什么？&lt;/span&gt;&lt;span&gt;6255&lt;/span&gt;&lt;span&gt;MySQL 索引的最左前缀匹配原则是什么？&lt;/span&gt;&lt;span&gt;5662&lt;/span&gt;&lt;span&gt;Java 中 ConcurrentHashMap &lt;/span&gt;&lt;span&gt;1.7&lt;/span&gt;&lt;span&gt; 和 &lt;/span&gt;&lt;span&gt;1.8&lt;/span&gt;&lt;span&gt; 之间有哪些区别？&lt;/span&gt;&lt;span&gt;5067&lt;/span&gt;&lt;span&gt;Java 中有哪些集合类？请简单介绍&lt;/span&gt;&lt;span&gt;4854&lt;/span&gt;&lt;span&gt;MySQL 的索引类型有哪些？&lt;/span&gt;&lt;span&gt;4845&lt;/span&gt;&lt;span&gt;详细描述一条 SQL 语句在 MySQL 中的执行过程。&lt;/span&gt;&lt;span&gt;4218&lt;/span&gt;&lt;span&gt;什么是 RAG？RAG 的主要流程是什么？&lt;/span&gt;&lt;span&gt;4151&lt;/span&gt;&lt;span&gt;MySQL 的存储引擎有哪些？它们之间有什么区别？&lt;/span&gt;&lt;span&gt;4092&lt;/span&gt;&lt;span&gt;数据库的脏读、不可重复读和幻读分别是什么？&lt;/span&gt;&lt;span&gt;3900&lt;/span&gt;&lt;span&gt;推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;847&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;848&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;设计智能客服系统时，如何通过知识库构建解决长尾问题？请描述具体实现步骤当大模型API响应延迟超过&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;秒时，前端可以采取哪些优化策略保证用户体验？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;08&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;使用LangChain时，如何实现多路召回结果的动态权重分配？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;09&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;02&lt;/span&gt;&lt;span&gt;当大模型上下文窗口扩展到&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;万token时，哪些现有业务场景可能发生质变？当发现RAG系统召回结果与用户query意图不匹配时，有哪些可能的改进方向？使用LangChain实现RAG系统时，如何处理PDF文档中的表格数据召回问题？现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑参数高效微调（PEFT）如何减少计算成本？冻结层在微调中的作用是什么？为什么需要混合精度训练？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;09&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;27&lt;/span&gt;&lt;span&gt;模型输出重复和幻觉如何微调解决？上次浏览：&lt;/span&gt;&lt;span&gt;2026-03-16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;0511345&lt;/span&gt;&lt;span&gt;. 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;849&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;850&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;851&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;852&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;853&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;854&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`id`| string  | 是   | 唯一标识符 (UUIDv&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;855&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;856&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`title`| string  | 是   | 任务标题 (&lt;/span&gt;&lt;span&gt;1-100&lt;/span&gt;&lt;span&gt;字符)     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;857&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;858&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`description`| string  | 否   | 任务描述 (可选)          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;859&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;860&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| enum    | 是   |`pending`/`completed`|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;861&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;862&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`dueDate`| string  | 否   | 截止日期 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;863&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;864&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`createdAt`| string  | 是   | 创建时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;865&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;866&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`updatedAt`| string  | 是   | 最后更新时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;867&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;868&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## API 接口列表### &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;. 获取Todo列表**GET**`/todos`#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;869&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;870&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|------------|---------|--------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;871&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;872&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| string  | -      | 过滤状态 (`pending/completed`) |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;873&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;874&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`page`| integer | &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;      | 分页页码                 |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;875&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;876&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`limit`| integer | &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;     | 每页数量 (最大&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)       |#### 响应示例```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;877&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;878&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;879&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;880&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;total&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;881&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;882&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;883&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;884&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;885&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;886&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;items&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;887&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;888&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;889&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;890&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;891&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;892&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;购买食材&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;893&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;894&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;895&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;896&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-30T09:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;897&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;898&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T14:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;899&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;900&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;901&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;902&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;903&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;904&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;905&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;906&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;907&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;908&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;909&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;910&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**POST** `/todos`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;911&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;912&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 请求体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;913&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;914&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;915&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;916&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;917&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;918&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;919&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;920&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;921&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;922&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;923&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;924&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;925&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;926&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;927&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;928&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;929&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;930&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;931&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;932&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;933&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;934&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;935&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;936&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;937&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;938&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;939&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;940&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;941&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;942&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;943&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;944&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;945&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;946&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;947&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;948&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;949&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;950&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;951&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;952&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;953&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;954&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;955&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;956&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;957&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;958&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;959&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;960&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;961&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;962&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;963&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;964&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;965&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;966&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;967&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;968&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;969&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;970&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;971&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;972&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;973&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;974&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;975&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;976&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;977&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;978&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;979&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;980&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;981&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;982&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;983&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;984&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;985&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;986&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;987&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;988&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;989&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;990&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;991&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;992&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;993&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;994&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;995&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;996&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;997&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;998&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;999&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1000&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1001&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1002&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1003&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1004&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1005&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1006&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1007&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1008&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1009&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1010&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1011&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1012&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1013&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1014&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1015&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1016&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1017&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1018&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1019&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1020&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1021&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1022&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1023&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1024&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1025&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1026&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1027&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1028&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1029&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1030&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1031&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1032&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1033&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1034&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1035&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1036&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1037&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1038&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1039&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1040&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1041&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1042&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1043&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1044&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1045&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1046&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1047&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1048&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1049&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1050&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1051&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1052&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1053&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1054&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1055&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1056&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1057&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1058&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1059&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1060&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1061&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1062&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1063&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1064&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **提问**：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？回答：拿到代码第一件事就是扫一遍安全问题。如果发现有 SQL 拼接这种明显漏洞，直接手动改成参数化查询。如果是鉴权没做，补上@PreAuthorize或者自定义拦截器。改完之后会反向给 AI 一个反馈，告诉它下次要注意这个点，后续生成的代码质量会提升。- **提问**：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1065&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：PUT 是全量更新，客户端得把所有字段都传过来，没传的字段会被置空。PATCH 是部分更新，只更新传了的字段。实际项目里 PATCH 用得更多，因为前端很少会一次性改全部字段。生成代码时如果是编辑场景，优先用 PATCH 加一个非空校验逻辑。- **提问**：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1066&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **回答**：优先级是安全 &amp;gt; 正确性 &amp;gt; 规范性。第一改安全漏洞，比如 SQL 注入、越权访问。第二改逻辑错误，比如空指针、边界条件没处理。第三才是代码风格、命名规范这些。规范性的问题不影响功能，面试完再改也行。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1067&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1068&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧生成代码的 Review 重点不同 AI 工具的差异面试现场实操建议&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1069&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1070&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提问：如果 AI 生成的代码有明显的安全漏洞，你会怎么处理？提问：RESTful 规范里 PUT 和 PATCH 有什么区别，生成代码时要怎么选？提问：如果时间来不及，AI 生成的代码只来得及做部分修改，你会优先改哪里？热门面试题目榜更多说说 Java 中 HashMap 的原理？&lt;/span&gt;&lt;span&gt;9130&lt;/span&gt;&lt;span&gt;Java 中的序列化和反序列化是什么？&lt;/span&gt;&lt;span&gt;6255&lt;/span&gt;&lt;span&gt;MySQL 索引的最左前缀匹配原则是什么？&lt;/span&gt;&lt;span&gt;5662&lt;/span&gt;&lt;span&gt;Java 中 ConcurrentHashMap &lt;/span&gt;&lt;span&gt;1.7&lt;/span&gt;&lt;span&gt; 和 &lt;/span&gt;&lt;span&gt;1.8&lt;/span&gt;&lt;span&gt; 之间有哪些区别？&lt;/span&gt;&lt;span&gt;5067&lt;/span&gt;&lt;span&gt;Java 中有哪些集合类？请简单介绍&lt;/span&gt;&lt;span&gt;4854&lt;/span&gt;&lt;span&gt;MySQL 的索引类型有哪些？&lt;/span&gt;&lt;span&gt;4845&lt;/span&gt;&lt;span&gt;详细描述一条 SQL 语句在 MySQL 中的执行过程。&lt;/span&gt;&lt;span&gt;4218&lt;/span&gt;&lt;span&gt;什么是 RAG？RAG 的主要流程是什么？&lt;/span&gt;&lt;span&gt;4151&lt;/span&gt;&lt;span&gt;MySQL 的存储引擎有哪些？它们之间有什么区别？&lt;/span&gt;&lt;span&gt;4092&lt;/span&gt;&lt;span&gt;数据库的脏读、不可重复读和幻读分别是什么？&lt;/span&gt;&lt;span&gt;3900&lt;/span&gt;&lt;span&gt;推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1071&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1072&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1073&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1074&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; 来源: 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑.mhtml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1075&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1076&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- # 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1077&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1078&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1079&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1080&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1081&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1082&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1083&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`id`| string  | 是   | 唯一标识符 (UUIDv&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1084&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1085&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`title`| string  | 是   | 任务标题 (&lt;/span&gt;&lt;span&gt;1-100&lt;/span&gt;&lt;span&gt;字符)     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1086&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1087&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`description`| string  | 否   | 任务描述 (可选)          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1088&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1089&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| enum    | 是   |`pending`/`completed`|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1090&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1091&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`dueDate`| string  | 否   | 截止日期 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1092&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1093&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`createdAt`| string  | 是   | 创建时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;格式)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1094&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1095&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`updatedAt`| string  | 是   | 最后更新时间 (ISO&lt;/span&gt;&lt;span&gt;8601&lt;/span&gt;&lt;span&gt;)   |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1096&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1097&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## API 接口列表### &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;. 获取Todo列表**GET**`/todos`#### 参数| 参数名     | 类型    | 默认值 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1098&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1099&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|------------|---------|--------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`status`| string  | -      | 过滤状态 (`pending/completed`) |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`page`| integer | &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;      | 分页页码                 |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|`limit`| integer | &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;     | 每页数量 (最大&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)       |#### 响应示例```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;total&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;items&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;购买食材&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-30T09:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T14:30:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**POST** `/todos`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 请求体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``#### 响应 (&lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; Created)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**GET** `/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;项目会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;准备季度项目汇报材料&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pending&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;dueDate&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-04-01T14:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;createdAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T15:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;. 更新Todo信息**PATCH**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 请求体 (部分更新)```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;550e8400-e29b-41d4-a716-446655440000&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;更新后的会议准备&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedAt&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;2025-03-28T16:00:00Z&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---### &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;. 删除Todo**DELETE**`/todos/{&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}`#### 响应 (&lt;/span&gt;&lt;span&gt;204&lt;/span&gt;&lt;span&gt; No Content)---### &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;. 批量更新状态**POST**`/todos/batch-update`#### 请求体```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;ids&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;id1&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;id2&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;completed&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#### 响应&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1239&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;updatedCount&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}` ``&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---## 错误处理| 状态码 | 描述                  |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;|--------|-----------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1250&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;    | 请求参数验证失败      |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;    | 未授权访问            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;    | 资源不存在            |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1256&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;429&lt;/span&gt;&lt;span&gt;    | 请求频率限制          |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;| &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;    | 服务器内部错误        |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;错误响应示例：```json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1264&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1266&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;INVALID_DUE_DATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;截止日期不能早于当前时间&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1270&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;` ` `标记分享&lt;/span&gt;&lt;span&gt;51006&lt;/span&gt;&lt;span&gt;这道实操题考察的是Prompt 工程能力和对 RESTful 规范的理解，核心思路是把 Schema 喂给 AI，再通过结构化 Prompt 引导它生成标准 CRUD 代码。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- - 整个操作流程分 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 步：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）先把 API 文档里的 Schema 提取出来，比如一个用户表有 id、name、email、created_at 这些字段&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）构造一个精准的 Prompt，明确告诉 AI 要用什么框架、遵循什么规范、返回什么格式&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）拿到生成的代码后快速 review，重点看路由设计、参数校验、异常处理这几块假设 Schema 是这样的：▼json复制代码{&lt;/span&gt;&lt;span&gt;&quot;User&quot;&lt;/span&gt;&lt;span&gt;:{&lt;/span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;long, 主键&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 最大50字符&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;string, 必填, 邮箱格式&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;datetime, 自动生成&quot;&lt;/span&gt;&lt;span&gt;}}给 AI 的 Prompt 可以这样写：▼text复制代码基于以下 Schema 生成 Spring Boot 的 RESTful CRUD 接口：-框架：Spring Boot &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;.x + Spring Data JPA-规范：严格遵循 RESTful，GET 用于查询，POST 用于创建，PUT 用于全量更新，DELETE 用于删除-响应格式：统一包装成 {&lt;/span&gt;&lt;span&gt;code,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;} 结构-要求：包含参数校验注解、异常处理Schema:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;粘贴上面的&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;}AI 生成的 Controller 核心代码大概长这样：▼java复制代码@RestController@RequestMapping(&lt;/span&gt;&lt;span&gt;&quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;)publicclassUserController{&lt;/span&gt;&lt;span&gt;@AutowiredprivateUserService&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userService;@GetMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;getById(@PathVariableLong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id){returnResult.success(userService.findById(id));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1280&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PostMappingpublicResult&amp;lt;User&amp;gt;create(@Valid@RequestBodyUserCreateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.create(dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@PutMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;User&amp;gt;update(@PathVariableLong id,@Valid@RequestBodyUserUpdateDTO dto){&lt;/span&gt;&lt;span&gt;returnResult.success(userService.update(id,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dto));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1283&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}@DeleteMapping(&lt;/span&gt;&lt;span&gt;&quot;/{id}&quot;&lt;/span&gt;&lt;span&gt;)publicResult&amp;lt;Void&amp;gt;delete(@PathVariableLong id){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1285&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1286&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;userService.delete(id);returnResult.success(null);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1287&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1290&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}拿到代码后重点检查这几个地方：路由是不是用了复数名词、HTTP 方法用得对不对、有没有加@Valid做参数校验。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1291&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- -&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1292&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 优化技巧很多人用 AI 生成代码效果不好，问题往往出在 Prompt 太模糊。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- - AI 不是人，它猜不到你想要 Spring Boot 还是 Express，猜不到你们公司用的是驼峰还是下划线命名。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1295&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- - 一个高质量的 Prompt 要包含 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 个要素：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）技术栈版本，比如 Spring Boot &lt;/span&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;span&gt;、JDK &lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;、MyBatis Plus &lt;/span&gt;&lt;span&gt;3.52&lt;/span&gt;&lt;span&gt;）编码规范，比如 RESTful 风格、统一响应体结构、驼峰命名&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）完整上下文，Schema 要全贴上去，字段类型、约束条件一个都不能少&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）反例约束，告诉 AI 不要干什么，比如&lt;/span&gt;&lt;span&gt;&quot;不要用 Lombok&quot;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&quot;不要用 XML 配置&quot;&lt;/span&gt;&lt;span&gt;生成代码的 Review 重点AI 生成的代码不能直接用，至少要检查这几个地方：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）安全性漏洞，有没有 SQL 注入风险、有没有做权限校验&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）异常处理是不是完善，空指针、资源不存在这些边界情况覆盖了没有&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）事务边界对不对，涉及多表操作的有没有加@Transactional&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;）日志是不是规范，关键操作有没有打日志，日志级别用得对不对不同 AI 工具的差异现在市面上 AI 编程工具很多，Cursor、GitHub Copilot、通义灵码、CodeGeeX 各有特点：工具强项弱项Cursor上下文理解强，能读懂整个项目收费，国内网络不稳定Copilot补全速度快，和 IDE 集成好对中文注释理解一般通义灵码中文支持好，免费额度多复杂逻辑生成质量不如前两者CodeGeeX完全免费，国产模型偶尔会生成过时 API面试现场实操建议&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt; 分钟时间很紧，建议这样分配：&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）前 &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; 分钟，快速阅读 Schema，理解业务含义，想清楚要生成哪些接口&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）中间 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; 分钟，写 Prompt、喂给 AI、拿到代码、快速调整明显问题&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;）最后 &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; 分钟，给面试官讲解代码结构和设计决策，展示你的工程思维关键是要表现出你不是在无脑用 AI，而是知道 AI 生成的东西哪里可能有坑、怎么 review、怎么改进。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1296&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1297&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 本文已做格式统一与噪声清理，保留原始语义。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1298&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- # 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;11345&lt;/span&gt;&lt;span&gt;. 现场实操：给定一个包含数据Schema的API文档，请使用AI工具在&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;分钟内生成符合RESTful规范的CRUD接口代码，并解释关键实现逻辑VIP中等大模型为方便拷贝至编辑器，以下文档以 Markdown 源码进行展示▼markdown复制代码# TodoList API 文档 (v&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;)## 基础信息-**Base URL**:`https:&lt;/span&gt;&lt;span&gt;//api.example.com/v1`-**数据格式**: JSON-认证方式: Bearer Token (需在Header中添加`Authorization: Bearer &amp;lt;token&amp;gt;`)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1301&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- ---## 数据结构 Schema### Todo 对象| 字段名       | 类型    | 必填 | 描述                     |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1302&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- |--------------|---------|------|--------------------------|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1303&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1304&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 本文已做格式统一与噪声清理，保留原始语义。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>秋招 AI应用开发 Agent 复习笔记</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%A7%8B%E6%8B%9B-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91-agent-%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%A7%8B%E6%8B%9B-ai%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91-agent-%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid><description># 🎯 AI 应用开发 / Agent 方向 · 秋招复习笔记 &gt; 📅 整理时间：2026-06-02 &gt; 📚 来源：基于 workspace 内 18 份面经资料整合 &gt; 🎯 适用：AI 应用开发 / Agent 开发 / 大模型应用 校</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;🎯 AI 应用开发 / Agent 方向 · 秋招复习笔记&lt;a href=&quot;#-ai-应用开发--agent-方向--秋招复习笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;📅 整理时间：2026-06-02
📚 来源：基于 workspace 内 18 份面经资料整合
🎯 适用：AI 应用开发 / Agent 开发 / 大模型应用 校招岗位&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;📖 总目录&lt;a href=&quot;#-总目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-agent-%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E4%B8%8E%E6%9E%B6%E6%9E%84&quot;&gt;Agent 核心概念与架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-agent-%E5%9B%9B%E7%A7%8D%E8%8C%83%E5%BC%8F%E6%B7%B1%E5%BA%A6%E5%AF%B9%E6%AF%94&quot;&gt;Agent 四种范式深度对比&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-rag-%E6%A3%80%E7%B4%A2%E5%A2%9E%E5%BC%BA%E7%94%9F%E6%88%90&quot;&gt;RAG 检索增强生成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-mcp-%E5%8D%8F%E8%AE%AE&quot;&gt;MCP 协议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-memory-%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F&quot;&gt;Memory 记忆系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-prompt-%E5%B7%A5%E7%A8%8B&quot;&gt;Prompt 工程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-function-calling--tool-use&quot;&gt;Function Calling / Tool Use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-multi-agent-%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E6%9E%B6%E6%9E%84&quot;&gt;Multi-Agent 多智能体架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%E5%B9%BB%E8%A7%89%E5%A4%84%E7%90%86&quot;&gt;幻觉处理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%A1%E7%90%86&quot;&gt;上下文管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-%E5%B7%A5%E7%A8%8B%E5%8C%96%E4%B8%8E%E5%8F%AF%E9%9D%A0%E6%80%A7%E8%AE%BE%E8%AE%A1&quot;&gt;工程化与可靠性设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-agent-%E8%AF%84%E6%B5%8B%E4%BD%93%E7%B3%BB&quot;&gt;Agent 评测体系&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-%E9%A1%B9%E7%9B%AE%E9%9D%A2%E8%AF%95%E8%AF%9D%E6%9C%AF&quot;&gt;项目面试话术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-%E7%AE%97%E6%B3%95--cs-%E5%9F%BA%E7%A1%80%E9%AB%98%E9%A2%91%E7%82%B9&quot;&gt;算法 / CS 基础高频点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#15-%E5%90%84%E5%AE%B6%E5%A4%A7%E5%8E%82%E9%9D%A2%E7%BB%8F%E9%80%9F%E8%A7%88&quot;&gt;各家大厂面经速览&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#16-%E8%B4%B4%E5%BF%83%E9%81%BF%E5%9D%91%E6%8C%87%E5%8D%97&quot;&gt;贴心避坑指南&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;1. Agent 核心概念与架构&lt;a href=&quot;#1-agent-核心概念与架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 什么是 Agent？&lt;a href=&quot;#11-什么是-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Agent（智能体）是一种能够&lt;strong&gt;感知环境、做出决策并采取行动&lt;/strong&gt;的系统。与普通 LLM 应用的核心区别：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;普通 LLM 应用&lt;/th&gt;&lt;th&gt;Agent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;交互模式&lt;/td&gt;&lt;td&gt;输入→输出，单轮&lt;/td&gt;&lt;td&gt;多轮循环，自主规划&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具使用&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;调用外部 API、代码执行等&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;推理能力&lt;/td&gt;&lt;td&gt;单次推理&lt;/td&gt;&lt;td&gt;多步推理，反思纠错&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;目标驱动&lt;/td&gt;&lt;td&gt;被动响应&lt;/td&gt;&lt;td&gt;主动规划直到完成任务&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 Agent 四大核心组件（面试高频）&lt;a href=&quot;#12-agent-四大核心组件面试高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;┌─────────────────────────────────────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│              Agent                    │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──┐ │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  │规划   │  │记忆   │  │工具   │  │执行│ │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  │Planning│ │Memory │  │Tools │  │Act│ │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│  └──────┘  └──────┘  └──────┘  └──┘ │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─────────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Planning（规划）&lt;/strong&gt;：任务分解、反思、ReAct、CoT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory（记忆）&lt;/strong&gt;：短期记忆（上下文窗口）、长期记忆（向量库）、工作记忆（执行状态）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools（工具）&lt;/strong&gt;：Function Calling、MCP、自定义工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action（执行）&lt;/strong&gt;：执行操作并观察结果&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;面试回答模板&lt;/strong&gt;：先讲这四要素，再结合你的项目具体展开。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 Agent vs 大模型的本质区别&lt;a href=&quot;#13-agent-vs-大模型的本质区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;大模型：静态参数推理，无记忆无工具&lt;/li&gt;
&lt;li&gt;Agent：&lt;strong&gt;感知 → 规划 → 工具调用 → 执行 → 反馈&lt;/strong&gt; 闭环&lt;/li&gt;
&lt;li&gt;Agent 具备：自主性、反应性、目标导向、与环境的交互能力&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2. Agent 四种范式深度对比&lt;a href=&quot;#2-agent-四种范式深度对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;高频难题&lt;/strong&gt;：对比 React、Plan-and-Execute、Tool Use、Multi-Agent 四种范式
⚠️ &lt;strong&gt;最大误区&lt;/strong&gt;：认为它们是线性进化关系（低级→高级）。&lt;strong&gt;实际上它们是不同维度&lt;/strong&gt;的！&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h3&gt;2.1 层次关系（面试必讲）&lt;a href=&quot;#21-层次关系面试必讲&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;组织架构层  →  Multi-Agent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;流程控制层  →  Plan-and-Execute / ReAct&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;推理框架层  →  ReAct&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;基础能力层  →  Tool Use / Function Calling&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;👉 &lt;strong&gt;一个 Agent 可以同时用 ReAct + Function Calling，整个系统又是 Multi-Agent 架构。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 各范式详解&lt;a href=&quot;#22-各范式详解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;范式&lt;/th&gt;&lt;th&gt;层次&lt;/th&gt;&lt;th&gt;核心机制&lt;/th&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tool Use&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;基础能力层&lt;/td&gt;&lt;td&gt;模型自主决定是否调工具、调哪个、传什么参数&lt;/td&gt;&lt;td&gt;延迟低，架构简单&lt;/td&gt;&lt;td&gt;缺少全局规划，易偏离目标&lt;/td&gt;&lt;td&gt;简单调用（查天气、发邮件）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ReAct&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;推理框架层&lt;/td&gt;&lt;td&gt;Thought → Action → Observation 三段循环&lt;/td&gt;&lt;td&gt;可解释性强，有决策链路日志&lt;/td&gt;&lt;td&gt;每轮多一次 LLM 调用，延迟高&lt;/td&gt;&lt;td&gt;中等复杂度，需可观测性&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plan-and-Execute&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;流程控制层&lt;/td&gt;&lt;td&gt;先规划完整计划，再逐步执行，可重规划&lt;/td&gt;&lt;td&gt;全局视野，避免迷失&lt;/td&gt;&lt;td&gt;规划消耗资源，计划可能不准确&lt;/td&gt;&lt;td&gt;步骤多、结构清晰的任务（代码重构）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Multi-Agent&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;组织架构层&lt;/td&gt;&lt;td&gt;多 Agent 分工协作，消息通信&lt;/td&gt;&lt;td&gt;职责分离，上下文专注&lt;/td&gt;&lt;td&gt;通信开销，协调复杂度&lt;/td&gt;&lt;td&gt;角色天然分离的场景&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 技术选型优先级（面试加分回答）&lt;a href=&quot;#23-技术选型优先级面试加分回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;看任务复杂度&lt;/strong&gt;：简单 → Tool Use；多步推理 → ReAct；步骤多/结构化高 → Plan-and-Execute；角色天然分离 → Multi-Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;看延迟敏感度&lt;/strong&gt;：实时交互优先 Tool Use 或最简 ReAct&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;看可观测性需求&lt;/strong&gt;：ReAct 的循环是天然审计追踪&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3. RAG 检索增强生成&lt;a href=&quot;#3-rag-检索增强生成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 RAG 完整链路&lt;a href=&quot;#31-rag-完整链路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;文档 → 分块(Chunking) → Embedding向量化 → 向量数据库存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户提问 → Embedding查询 → 检索Top-K → Rerank重排序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;→ 注入Prompt上下文 → LLM生成回答&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 面试常考细节&lt;a href=&quot;#32-面试常考细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;(1) Chunking 策略&lt;a href=&quot;#1-chunking-策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;策略&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;固定大小滑动窗口&lt;/td&gt;&lt;td&gt;简单，实现容易&lt;/td&gt;&lt;td&gt;通用场景&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;语义分块&lt;/td&gt;&lt;td&gt;按段落/章节自然边界切分&lt;/td&gt;&lt;td&gt;结构化文档&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;递归分块&lt;/td&gt;&lt;td&gt;大块→小块逐级拆分&lt;/td&gt;&lt;td&gt;长文档&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;关键认知&lt;/strong&gt;：chunking 决定了检索系统的上限。需要&lt;strong&gt;用评估集跑不同策略的效果对比&lt;/strong&gt;。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;(2) Embedding 模型&lt;a href=&quot;#2-embedding-模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;OpenAI text-embedding-3-small/large&lt;/li&gt;
&lt;li&gt;BGE 系列（BAAI）&lt;/li&gt;
&lt;li&gt;M3E（国产）&lt;/li&gt;
&lt;li&gt;Cohere Embed&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;(3) 向量数据库选型&lt;a href=&quot;#3-向量数据库选型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名称&lt;/th&gt;&lt;th&gt;特点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Milvus&lt;/td&gt;&lt;td&gt;开源高性能，企业级&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pinecone&lt;/td&gt;&lt;td&gt;云原生，管理简单&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weaviate&lt;/td&gt;&lt;td&gt;支持混合搜索&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chroma&lt;/td&gt;&lt;td&gt;轻量级，适合原型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FAISS&lt;/td&gt;&lt;td&gt;Facebook 开源，高效本地部署&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;(4) RAG 优化六大手段&lt;a href=&quot;#4-rag-优化六大手段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分块策略优化&lt;/strong&gt;：按语义分块而不是固定长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多路检索&lt;/strong&gt;：向量检索 + 关键词(BM25)检索 + 混合检索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重排序(Rerank)&lt;/strong&gt;：对候选结果二次排序，提升精度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文压缩&lt;/strong&gt;：只保留和问题最相关的部分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询改写&lt;/strong&gt;：把用户问题改写成更适合检索的形式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反馈循环&lt;/strong&gt;：根据用户满意度反向调整检索策略&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;(5) RAG vs 微调&lt;a href=&quot;#5-rag-vs-微调&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;RAG&lt;/th&gt;&lt;th&gt;Fine-tuning&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;成本&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;td&gt;高（需要 GPU 训练）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;更新&lt;/td&gt;&lt;td&gt;实时更新文档即可&lt;/td&gt;&lt;td&gt;需要重新训练&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;适用场景&lt;/td&gt;&lt;td&gt;知识问答、事实查询&lt;/td&gt;&lt;td&gt;特定风格/格式/行为对齐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;对幻觉影响&lt;/td&gt;&lt;td&gt;减少（有参考依据）&lt;/td&gt;&lt;td&gt;可能加剧（死记硬背）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;面试高频追问&lt;/strong&gt;：什么时候不应该上 RAG？答：当知识变化极快、或对延迟极度敏感、或模型本身已具备足够知识时。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;(6) RAG 常见失败原因&lt;a href=&quot;#6-rag-常见失败原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;检索召回率不足（Top-K 太少或 chunking 不当）&lt;/li&gt;
&lt;li&gt;检索到的上下文相关性低&lt;/li&gt;
&lt;li&gt;注入的上下文干扰了模型判断&lt;/li&gt;
&lt;li&gt;用户问题表述不规范&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4. MCP 协议&lt;a href=&quot;#4-mcp-协议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 什么是 MCP&lt;a href=&quot;#41-什么是-mcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MCP（Model Context Protocol）是 Anthropic 推出的&lt;strong&gt;模型上下文协议&lt;/strong&gt;，用于标准化 LLM 与外部工具/数据源的交互方式。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 MCP 工作方式&lt;a href=&quot;#42-mcp-工作方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LLM ←→ MCP Client ←→ MCP Server ←→ 外部工具/数据源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↑              ↑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON-RPC      Tool Schema 注册&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 MCP vs Function Calling&lt;a href=&quot;#43-mcp-vs-function-calling&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;对比维度&lt;/th&gt;&lt;th&gt;Function Calling&lt;/th&gt;&lt;th&gt;MCP&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;标准化程度&lt;/td&gt;&lt;td&gt;模型厂商各自定义&lt;/td&gt;&lt;td&gt;统一开放协议&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具发现&lt;/td&gt;&lt;td&gt;需预注册&lt;/td&gt;&lt;td&gt;动态发现&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;通信方式&lt;/td&gt;&lt;td&gt;JSON Schema 内嵌&lt;/td&gt;&lt;td&gt;独立 Server 进程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;跨语言&lt;/td&gt;&lt;td&gt;取决于 SDK&lt;/td&gt;&lt;td&gt;Server 独立，语言无关&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;安全性&lt;/td&gt;&lt;td&gt;需自行隔离&lt;/td&gt;&lt;td&gt;Server 级隔离&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4 MCP vs Skill（面试高频）&lt;a href=&quot;#44-mcp-vs-skill面试高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;对比&lt;/th&gt;&lt;th&gt;MCP&lt;/th&gt;&lt;th&gt;Skill&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;定位&lt;/td&gt;&lt;td&gt;标准化工具调用协议&lt;/td&gt;&lt;td&gt;封装好的任务级能力&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;粒度&lt;/td&gt;&lt;td&gt;单个工具/能力&lt;/td&gt;&lt;td&gt;一个完整功能的集合&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;复用性&lt;/td&gt;&lt;td&gt;跨平台通用&lt;/td&gt;&lt;td&gt;平台特定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;关系&lt;/td&gt;&lt;td&gt;可作为 Skill 内部调用协议&lt;/td&gt;&lt;td&gt;可组合多个 MCP 工具&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5 其他工具协议&lt;a href=&quot;#45-其他工具协议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A2A（Agent-to-Agent）&lt;/strong&gt;：Google 提出的 Agent 间通信协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSE（Server-Sent Events）&lt;/strong&gt;：服务端推送，常用于流式输出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;：全双工通信，用于实时交互&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5. Memory 记忆系统&lt;a href=&quot;#5-memory-记忆系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 三层记忆结构（面试必答）&lt;a href=&quot;#51-三层记忆结构面试必答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;存储方式&lt;/th&gt;&lt;th&gt;典型实现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前对话上下文&lt;/td&gt;&lt;td&gt;滑动窗口 / 摘要压缩&lt;/td&gt;&lt;td&gt;Context Window&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工作记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前任务中间状态&lt;/td&gt;&lt;td&gt;进程内存&lt;/td&gt;&lt;td&gt;当前子目标、已收集证据&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;跨会话持久化信息&lt;/td&gt;&lt;td&gt;向量数据库 / KV存储&lt;/td&gt;&lt;td&gt;用户偏好、历史交互&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 记忆设计核心问题&lt;a href=&quot;#52-记忆设计核心问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;写入时机&lt;/strong&gt;：不是所有信息都值得存 → 需要&lt;strong&gt;重要性打分+去重&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索方式&lt;/strong&gt;：&lt;strong&gt;相关性和时效性要兼顾&lt;/strong&gt; → 时间衰减权重&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遗忘策略&lt;/strong&gt;：记忆库越来越大 → 检索精度下降 → 需要定期整理&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.3 长期记忆的生成与检索&lt;a href=&quot;#53-长期记忆的生成与检索&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;触发条件（任务完成/用户明确指示/重要信息出现）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 调用 LLM 对当前会话做摘要/结构化提取&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 向量化存储到记忆库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 下次需要时通过语义检索召回&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 动态注入上下文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;面试追问点&lt;/strong&gt;：agent.md vs memory.md vs skills.md 的职责区分？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;agent.md&lt;/strong&gt;：定义 Agent 的行为规则、系统 prompt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;memory.md&lt;/strong&gt;：存储跨会话的长期记忆&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skills.md&lt;/strong&gt;：注册可复用的能力模块&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;6. Prompt 工程&lt;a href=&quot;#6-prompt-工程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;6.1 常见 Prompt 技术&lt;a href=&quot;#61-常见-prompt-技术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;技术&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;面试要点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Zero-shot&lt;/td&gt;&lt;td&gt;直接提问，无示例&lt;/td&gt;&lt;td&gt;基础&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Few-shot&lt;/td&gt;&lt;td&gt;给几个输入输出示例&lt;/td&gt;&lt;td&gt;要能说清楚选 few shot 的原则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chain-of-Thought (CoT)&lt;/td&gt;&lt;td&gt;引导模型逐步推理&lt;/td&gt;&lt;td&gt;适合数学/逻辑问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ReAct&lt;/td&gt;&lt;td&gt;推理+行动交替&lt;/td&gt;&lt;td&gt;Agent 核心&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-consistency&lt;/td&gt;&lt;td&gt;多次采样选最一致的答案&lt;/td&gt;&lt;td&gt;提升准确率&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 结构化 Prompt 设计原则&lt;a href=&quot;#62-结构化-prompt-设计原则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;系统角色指令（你是谁、要做什么）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;核心约束（不能做什么、必须遵循什么）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;工具/技能描述（可用能力注册）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;上下文信息（记忆/RAG检索结果）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户输入（当前轮）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出格式要求&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 优化 Prompt 的常见手段&lt;a href=&quot;#63-优化-prompt-的常见手段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;所有 Prompt 修改要&lt;strong&gt;版本化管理&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;关键指令放前面（模型更关注开头和结尾）&lt;/li&gt;
&lt;li&gt;用分隔符明确区分不同信息块&lt;/li&gt;
&lt;li&gt;显式注入约束减少模型”猜”的概率&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;7. Function Calling / Tool Use&lt;a href=&quot;#7-function-calling--tool-use&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;7.1 完整链路&lt;a href=&quot;#71-完整链路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;工具注册（定义 Schema） → 候选筛选（工具多时） → 模型决策&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;→ 参数校验 → 执行隔离 → 结果处理 → 注入上下文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;很多初学者只关注”模型怎么输出 function call”，忽略了前后两端的工程细节。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.2 工具设计原则&lt;a href=&quot;#72-工具设计原则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;工具粒度&lt;/strong&gt;：太大（模型难以理解） vs 太小（增加调用次数）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema 设计&lt;/strong&gt;：description 对完成率影响很大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具装载&lt;/strong&gt;：不要一次性加载所有工具，按需选择&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发处理&lt;/strong&gt;：独立工具可并行调用&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.3 工具 Schema 示例&lt;a href=&quot;#73-工具-schema-示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;search_document&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;搜索知识库中的文档，返回相关片段&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;object&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;properties&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;query&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;string&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;搜索关键词&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;top_k&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;integer&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;返回结果数量&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;required&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;query&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;8. Multi-Agent 多智能体架构&lt;a href=&quot;#8-multi-agent-多智能体架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;8.1 为什么用 Multi-Agent（面试话术）&lt;a href=&quot;#81-为什么用-multi-agent面试话术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;职责分离&lt;/strong&gt;：不同 Agent 专注不同任务，代码结构清晰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能力扩展&lt;/strong&gt;：独立扩展子 Agent，不影响整体&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文精简&lt;/strong&gt;：每个 Agent 只需关注自己的上下文窗口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作效率&lt;/strong&gt;：主 Agent 分解调度，子 Agent 并行执行&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8.2 三种通信模式&lt;a href=&quot;#82-三种通信模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Orchestrator（编排器）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;主 Agent 拆任务、分配、汇总&lt;/td&gt;&lt;td&gt;简单分解任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Peer-to-Peer（对等）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Agent 间平等协商&lt;/td&gt;&lt;td&gt;需要多方讨论&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hierarchical（层级）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;上级管理下级&lt;/td&gt;&lt;td&gt;复杂组织结构&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8.3 主Agent与子Agent通信&lt;a href=&quot;#83-主agent与子agent通信&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通信方式&lt;/strong&gt;：消息队列（Redis/RabbitMQ）、HTTP/RPC、共享存储&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory 访问&lt;/strong&gt;：一般不直接访问对方记忆，通过消息传递数据&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;9. 幻觉处理&lt;a href=&quot;#9-幻觉处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;9.1 幻觉产生原因&lt;a href=&quot;#91-幻觉产生原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;模型训练数据的偏差和不完整&lt;/li&gt;
&lt;li&gt;上下文约束不足，模型自由发挥&lt;/li&gt;
&lt;li&gt;检索到的信息相关性不足或错误&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9.2 多层幻觉防御策略&lt;a href=&quot;#92-多层幻觉防御策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第一层：Prompt 约束&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 要求模型引用来源、设置 temperature=0、指令约束&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第二层：工具/函数调用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 用精确计算替代模型猜测（如计算器、查询数据库）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第三层：RAG 召回&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 提供参考文档，减少依赖模型内部知识&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第四层：后处理验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 对输出做静态检查、格式校验、事实核查&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第五层：微调对齐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 特定场景下用微调纠正模型行为&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;10. 上下文管理&lt;a href=&quot;#10-上下文管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;10.1 上下文压缩&lt;a href=&quot;#101-上下文压缩&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;触发时机&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;当前上下文长度接近模型上限（如 80%）&lt;/li&gt;
&lt;li&gt;多轮对话中历史信息冗余&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;压缩方法&lt;/strong&gt;：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;摘要压缩&lt;/td&gt;&lt;td&gt;用模型生成历史摘要，保留核心信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;关键信息提取&lt;/td&gt;&lt;td&gt;抽取实体、动作、意图，丢弃次要描述&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;滑动窗口&lt;/td&gt;&lt;td&gt;只保留最近 N 轮对话&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10.2 上下文结构组织&lt;a href=&quot;#102-上下文结构组织&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;优先级策略（从高到低）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 系统规则 / 约束&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 当前轮用户明确输入&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 外部工具返回结果 / 知识库证据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 用户历史偏好（soft hint，不可覆盖当前事实）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10.3 会话压缩面试参考&lt;a href=&quot;#103-会话压缩面试参考&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;阿里淘天面试官追问：会话压缩怎么做的？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考回答&lt;/strong&gt;：当上下文窗口接近限制时，触发摘要压缩。先用模型对当前上下文生成摘要，保留系统指令、关键决策、已收集的重要信息，丢弃中间重复的推理过程和低价值日志。摘要完成后替换原始上下文，节省 token 空间。同时记录摘要的历史版本，必要时可回溯。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;11. 工程化与可靠性设计&lt;a href=&quot;#11-工程化与可靠性设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;11.1 异常处理三层策略&lt;a href=&quot;#111-异常处理三层策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;策略&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;第一层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;重试&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;指数退避重试，限制最大次数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;降级&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;主工具失败换备用工具/简化路径&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第三层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;上报&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;处理不了交给人类介入&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.2 鲁棒性设计要点&lt;a href=&quot;#112-鲁棒性设计要点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输入校验 → 意图识别 → 敏感词过滤 → 上下文截断 → 错误兜底&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;二次校验与格式解析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键原则&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;先校验用户输入，再决定是否调用模型&lt;/li&gt;
&lt;li&gt;对关键输出做二次校验&lt;/li&gt;
&lt;li&gt;不要为了”好看”，是为了系统不会因为一次异常直接崩掉&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.3 性能优化（面试要能展开）&lt;a href=&quot;#113-性能优化面试要能展开&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;具体措施&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;模型推理&lt;/td&gt;&lt;td&gt;流式输出(SSE)，减少感知延迟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具调用&lt;/td&gt;&lt;td&gt;并行调用独立工具，连接池复用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;网络传输&lt;/td&gt;&lt;td&gt;缓存(Semantic Cache)，减少重复请求&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上下文组装&lt;/td&gt;&lt;td&gt;只注入必要上下文&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;预计算&lt;/td&gt;&lt;td&gt;确定性中间结果提前算好存储&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;熔断机制&lt;/td&gt;&lt;td&gt;工具连续失败超阈值时自动熔断&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.4 Token 消耗优化&lt;a href=&quot;#114-token-消耗优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;上下文压缩（摘要替换原始历史）&lt;/li&gt;
&lt;li&gt;缓存（常用技能、知识不重复加载）&lt;/li&gt;
&lt;li&gt;批处理（合并小请求）&lt;/li&gt;
&lt;li&gt;模型选择（简单任务用轻量模型）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.5 可审计 Agent 设计&lt;a href=&quot;#115-可审计-agent-设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;审计目标：&lt;strong&gt;能追责、能定因、能复现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需记录的信息：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户输入&lt;/li&gt;
&lt;li&gt;系统 prompt 版本&lt;/li&gt;
&lt;li&gt;工具候选集 + 最终选择&lt;/li&gt;
&lt;li&gt;调用参数 + 工具返回结果&lt;/li&gt;
&lt;li&gt;状态变迁&lt;/li&gt;
&lt;li&gt;模型输出 + 最终结果&lt;/li&gt;
&lt;li&gt;扩展：模型版本、知识库版本、trace_id&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;12. Agent 评测体系&lt;a href=&quot;#12-agent-评测体系&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;12.1 四层评测体系（面试杀手锏）&lt;a href=&quot;#121-四层评测体系面试杀手锏&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;第一层：保底&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;确保系统每次改动后仍能稳定运行&lt;/td&gt;&lt;td&gt;防止”改坏”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;第二层：Benchmark&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;固定题目，用通过率、耗时、失败原因量化&lt;/td&gt;&lt;td&gt;避免”凭感觉”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;第三层：过程记录&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;记录运行过程以便复盘&lt;/td&gt;&lt;td&gt;不只看到最终结果&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;第四层：回归&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;将真实翻车 case 放回评测集&lt;/td&gt;&lt;td&gt;贴近真实场景&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;12.2 Agent 评估维度&lt;a href=&quot;#122-agent-评估维度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;任务完成率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;是否达到目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;步骤效率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;花了多少步，有没有走弯路&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工具调用准确率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;选对工具、参数正确&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;幻觉率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;编造不存在的信息或工具&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;异常恢复率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;出错后能否自己修复&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;人类介入率&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;多少任务需要人接管&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;12.3 评估方式&lt;a href=&quot;#123-评估方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离线评估&lt;/strong&gt;：benchmark 跑回归测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在线评估&lt;/strong&gt;：真实用户留存、反馈、复用率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM-as-Judge&lt;/strong&gt;：用 GPT-4 或其他模型评分&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;13. 项目面试话术&lt;a href=&quot;#13-项目面试话术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;13.1 项目介绍的”四步公式”&lt;a href=&quot;#131-项目介绍的四步公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;业务痛点 → 初版方案 → 踩坑迭代 → 量化收益&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;错误示范&lt;/strong&gt;：“我用了一套多 Agent 的系统，用了 RAG、Prompt 优化……”
&lt;strong&gt;正确示范&lt;/strong&gt;：“我在 XX 场景下遇到了 XX 问题（业务场景），一开始尝试了 XX 方案（初版），但发现了 XX 问题（踩坑），于是改成了 XX，最终 XX 指标提升了 XX%（收益）。“&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;13.2 面试官最怕的 5 个追问（校招生专供）&lt;a href=&quot;#132-面试官最怕的-5-个追问校招生专供&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“这个设计你是怎么考虑的？有没有考虑过其他方案？”&lt;/strong&gt;
→ 展示技术选型思考，说清楚为什么选 A 不选 B&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“遇到过什么问题？怎么解决的？”&lt;/strong&gt;
→ 展示真实踩坑经验，这是区分”做过”和”看过”的关键&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“如果 XX 情况发生，系统会怎么样？”&lt;/strong&gt;
→ 展示对边界情况的思考&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“有量化的效果吗？”&lt;/strong&gt;
→ 必须有指标，不能用”感觉”回答&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“为什么这么设计？Trade-off 是什么？”&lt;/strong&gt;
→ 展示架构权衡能力&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;13.3 项目包装要点&lt;a href=&quot;#133-项目包装要点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不要说自己项目是”网上找的”&lt;/strong&gt;，可以说”参考了 xx 开源方案，结合实际业务做了 xx 改进”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个功能点都要能说出”为什么”&lt;/strong&gt;，不只是”做了什么”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;准备 1-2 个深度模块&lt;/strong&gt;展开讲，其他一笔带过&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;准备完整的叙事&lt;/strong&gt;：场景 → 问题 → 方案 → 迭代 → 收益&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;13.4 Skill 机制面试回答&lt;a href=&quot;#134-skill-机制面试回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题：skill 是怎么运作的？&lt;/strong&gt;
当用户提问触发条件时，系统从 skill 库匹配最合适的 skill，将其内容（自然语言描述 + JSON Schema）注入 Prompt 上下文，交由大模型处理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题：内置 skill 和业务自定义 skill 冲突了怎么办？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;命名空间隔离（不同前缀/目录）&lt;/li&gt;
&lt;li&gt;优先级机制（按规则选择）&lt;/li&gt;
&lt;li&gt;冲突检测告警&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;问题：太长或不当的 skill 会导致什么？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;上下文溢出，关键指令被截断&lt;/li&gt;
&lt;li&gt;性能下降，Token 消耗增加&lt;/li&gt;
&lt;li&gt;噪音干扰，降低执行准确性&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;14. 算法 / CS 基础高频点&lt;a href=&quot;#14-算法--cs-基础高频点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;14.1 必刷算法&lt;a href=&quot;#141-必刷算法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高频题&lt;/strong&gt;：合并两个有序数组、字符串相加、单例模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每日必做&lt;/strong&gt;：LeetCode Hot 100 + 剑指 Offer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tips&lt;/strong&gt;：刷过的题面试时假装思考一下再写&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14.2 Java 高频八股&lt;a href=&quot;#142-java-高频八股&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模块&lt;/th&gt;&lt;th&gt;重点&lt;/th&gt;&lt;th&gt;面试要求&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;线程池&lt;/td&gt;&lt;td&gt;核心参数、拒绝策略、工作原理&lt;/td&gt;&lt;td&gt;✅ 能讲清配置，能设计&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HashMap&lt;/td&gt;&lt;td&gt;底层结构、红黑树转换阈值(8)、扩容&lt;/td&gt;&lt;td&gt;✅ 原理+并发安全&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JVM&lt;/td&gt;&lt;td&gt;类加载机制(三大步骤)、垃圾回收算法、内存分布&lt;/td&gt;&lt;td&gt;✅ 经典必考&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;并发&lt;/td&gt;&lt;td&gt;synchronized 原理、ReentrantLock、CAS、AQS&lt;/td&gt;&lt;td&gt;✅ 死锁要能写出来&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;undo log/redo log/binlog + 两阶段提交&lt;/td&gt;&lt;td&gt;✅ 经典组合&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;单例&lt;/td&gt;&lt;td&gt;双检锁 + volatile&lt;/td&gt;&lt;td&gt;✅ 手写级&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14.3 Python 相关&lt;a href=&quot;#143-python-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;多进程、多线程、协程的区别&lt;/li&gt;
&lt;li&gt;Python vs JS 的区别&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14.4 网络基础&lt;a href=&quot;#144-网络基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;HTTP 1.0 / 2.0 / 3.0 区别&lt;/li&gt;
&lt;li&gt;前后端分离概念&lt;/li&gt;
&lt;li&gt;SSE / WebSocket&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14.5 LLM / 算法基础（非训练岗也要知道）&lt;a href=&quot;#145-llm--算法基础非训练岗也要知道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Transformer 流程&lt;/li&gt;
&lt;li&gt;注意力机制&lt;/li&gt;
&lt;li&gt;位置编码&lt;/li&gt;
&lt;li&gt;过拟合 / 梯度消失&lt;/li&gt;
&lt;li&gt;模型并行 / 数据并行&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;15. 各家大厂面经速览&lt;a href=&quot;#15-各家大厂面经速览&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;字节跳动（一面）&lt;a href=&quot;#字节跳动一面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;题号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;核心考点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;为什么要自己搞 code agent？挑战？&lt;/td&gt;&lt;td&gt;项目动机+深度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;同一个模型不同 context 长度下的差异？&lt;/td&gt;&lt;td&gt;上下文工程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;怎么减少 Agent 幻觉？&lt;/td&gt;&lt;td&gt;多层防御体系&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Prompt 怎么构建的？&lt;/td&gt;&lt;td&gt;模块化+版本管理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Memory 机制怎么做？&lt;/td&gt;&lt;td&gt;短/长期记忆&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;任务恢复怎么做？&lt;/td&gt;&lt;td&gt;状态快照+恢复&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;怎么评测和验证优化效果？&lt;/td&gt;&lt;td&gt;四层评测体系&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;阿里淘天（一面）&lt;a href=&quot;#阿里淘天一面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;题号&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;核心考点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;会话压缩怎么做？&lt;/td&gt;&lt;td&gt;上下文管理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;长期记忆写入时机？&lt;/td&gt;&lt;td&gt;记忆系统设计&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;上下文结构 / 长度约束？&lt;/td&gt;&lt;td&gt;Prompt 工程+Token控制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;agent.md vs memory.md 职责区分？&lt;/td&gt;&lt;td&gt;架构理解&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;工具和 skill 位置互换的后果？&lt;/td&gt;&lt;td&gt;架构权衡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;怎么评测 Agent 回答质量？&lt;/td&gt;&lt;td&gt;评估体系&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;HashMap + 线程池 + 并发&lt;/td&gt;&lt;td&gt;Java 基础&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;腾讯（一面→二面）&lt;a href=&quot;#腾讯一面二面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;一面：概念型题（什么是 Agent、RAG、Prompt Engineering）&lt;/li&gt;
&lt;li&gt;二面：系统设计题（Planner 设计、上下文优先级、异常处理、可审计 Agent）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二面和一面最大区别&lt;/strong&gt;：一面问”会不会”，二面问”为什么不这么做、不这么做会出什么问题”&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;滴滴 AI 全栈（一面）&lt;a href=&quot;#滴滴-ai-全栈一面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;MCP 深度题（运作方式、协议对比、并发处理）&lt;/li&gt;
&lt;li&gt;AI coding tools 了解程度&lt;/li&gt;
&lt;li&gt;MCP vs Skill 区别&lt;/li&gt;
&lt;li&gt;前端基础+后端基础都会问&lt;/li&gt;
&lt;li&gt;智能体三要素&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;16. 贴心避坑指南&lt;a href=&quot;#16-贴心避坑指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;❌ 常见翻车现场&lt;a href=&quot;#-常见翻车现场&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. 项目被问倒&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;项目是网上找的 → 被面试官看轻&lt;/li&gt;
&lt;li&gt;项目挑战答不上来 → 面试官觉得你没做过&lt;/li&gt;
&lt;li&gt;没有量化指标 → 话术再好也白搭&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 八股只会背&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;背了线程池参数 → 追问”怎么设计一个” → 露馅&lt;/li&gt;
&lt;li&gt;背了 RAG 流程 → 追问”chunking 怎么选” → 卡住&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3. 忽略工程细节&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;会说”流式输出” → 说不清缓存、超时、降级&lt;/li&gt;
&lt;li&gt;会说”做了评测” → 说不清评测维度&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;✅ 制胜关键点&lt;a href=&quot;#-制胜关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;实习经历是最大加分项&lt;/strong&gt; → 你现在就在做 AI 应用+Agent，珍惜每个遇到的真实问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每天实习时记录踩坑细节&lt;/strong&gt; → 面试时这就是你的”真实感”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目表达用”先讲场景，再讲方案”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;准备一个”原理→配置→常见问题→排查方法”四件套&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个设计决策都要能说出 trade-off&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;👑 最终面试官想看到的&lt;a href=&quot;#-最终面试官想看到的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;企业现在更看重的，不是你会不会调 API，而是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;出了问题你能不能&lt;strong&gt;定位&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;系统异常你能不能&lt;strong&gt;兜住&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;方案落地后你能不能&lt;strong&gt;让它稳定跑起来&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;💪 退出挑战杯省下的时间和心力，现在全部可以投入到秋招准备中。
方向正是你感兴趣的 AI Agent，这就是你说的”想做的有意义的事”。
加油！&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>秋招AI面经问题all</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%A7%8B%E6%8B%9Bai%E9%9D%A2%E7%BB%8F%E9%97%AE%E9%A2%98all/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E7%A7%8B%E6%8B%9Bai%E9%9D%A2%E7%BB%8F%E9%97%AE%E9%A2%98all/</guid><description># 秋招以来的AI面经问题 All &gt; 来源：小红书 @玖 &gt; 原文链接：http://xhslink.com/o/4THd9NZseQI &gt; 发布时间：2026-01-30 &gt; 标签：面试、面经、校招、秋招、互联网大厂、AI &gt; 收藏 1</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;秋招以来的AI面经问题 All&lt;a href=&quot;#秋招以来的ai面经问题-all&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书 @玖
原文链接：&lt;a href=&quot;http://xhslink.com/o/4THd9NZseQI&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/4THd9NZseQI&lt;/a&gt;
发布时间：2026-01-30
标签：面试、面经、校招、秋招、互联网大厂、AI
收藏 1633 · 点赞 815 · 评论 37&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;面经问题汇总（共43题）&lt;a href=&quot;#面经问题汇总共43题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;为什么做 Agent 项目？&lt;/li&gt;
&lt;li&gt;了解过市面上有哪些智能体 Agent 吗&lt;/li&gt;
&lt;li&gt;讲下 Agent 项目&lt;/li&gt;
&lt;li&gt;Agent 项目开发的框架&lt;/li&gt;
&lt;li&gt;介绍一些 AI 大模型&lt;/li&gt;
&lt;li&gt;RAG 系统流程&lt;/li&gt;
&lt;li&gt;MCP 和 Function Calling&lt;/li&gt;
&lt;li&gt;如何写好的 Prompt&lt;/li&gt;
&lt;li&gt;多轮对话的实现方案&lt;/li&gt;
&lt;li&gt;Agent 项目背景&lt;/li&gt;
&lt;li&gt;LLM 产生幻觉的原因及解决方案&lt;/li&gt;
&lt;li&gt;MCP 协议的核心内容&lt;/li&gt;
&lt;li&gt;推理模式的差异化设计&lt;/li&gt;
&lt;li&gt;RAG 检索优化策略&lt;/li&gt;
&lt;li&gt;特定推理模型不支持 MCP 的技术原因&lt;/li&gt;
&lt;li&gt;Agent 推理模式&lt;/li&gt;
&lt;li&gt;跨模块错误追踪的 Agent 知识库构建方案&lt;/li&gt;
&lt;li&gt;多 Agent 执行策略的智能选择和切换机制设计&lt;/li&gt;
&lt;li&gt;简历关键词提取的技术实现&lt;/li&gt;
&lt;li&gt;RAG 评估方案&lt;/li&gt;
&lt;li&gt;SSE 的局限性&lt;/li&gt;
&lt;li&gt;举例复杂任务下执行流程&lt;/li&gt;
&lt;li&gt;MCP 通信方式&lt;/li&gt;
&lt;li&gt;项目中 AI 贡献的代码占比&lt;/li&gt;
&lt;li&gt;Prompt 是如何优化的&lt;/li&gt;
&lt;li&gt;Agent 框架有哪些，比较优劣&lt;/li&gt;
&lt;li&gt;Multi Agent 方案&lt;/li&gt;
&lt;li&gt;上下文工程&lt;/li&gt;
&lt;li&gt;任务规划&lt;/li&gt;
&lt;li&gt;模型选型&lt;/li&gt;
&lt;li&gt;前后端怎么通信的&lt;/li&gt;
&lt;li&gt;介绍一下 Transformer&lt;/li&gt;
&lt;li&gt;做 Agent 是怎么学习的&lt;/li&gt;
&lt;li&gt;RAG 检索是怎么做的&lt;/li&gt;
&lt;li&gt;ChatGPT 等 LLM 的原理&lt;/li&gt;
&lt;li&gt;Function Calling 流程&lt;/li&gt;
&lt;li&gt;RAG 怎么做&lt;/li&gt;
&lt;li&gt;Embedding 模型怎么选&lt;/li&gt;
&lt;li&gt;Prompt 写法&lt;/li&gt;
&lt;li&gt;如何优化大模型幻觉&lt;/li&gt;
&lt;li&gt;MCP 是什么，为什么要学&lt;/li&gt;
&lt;li&gt;向量数据库和传统数据库区别&lt;/li&gt;
&lt;li&gt;Agent 长短期记忆怎么做的&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;分类统计&lt;a href=&quot;#分类统计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类别&lt;/th&gt;&lt;th&gt;题数&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Agent 基础与项目&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAG 检索增强生成&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MCP 协议&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Prompt 工程&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;大模型原理&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Multi-Agent&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Function Calling&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;其他工程实践&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>腾讯大模型应用开发二面</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%85%BE%E8%AE%AF%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%BA%8C%E9%9D%A2/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%85%BE%E8%AE%AF%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E4%BA%8C%E9%9D%A2/</guid><description># 腾讯大模型应用开发 二面 &gt; 来源：小红书 @逸 &gt; 原文链接：http://xhslink.com/o/5vDCA2JigSO &gt; 发布时间：2026-04-12 &gt; 标签：面试、面经、AI、Agent、实习 --- ## Q1：如果</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;腾讯大模型应用开发 二面&lt;a href=&quot;#腾讯大模型应用开发-二面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书 @逸
原文链接：&lt;a href=&quot;http://xhslink.com/o/5vDCA2JigSO&quot; target=&quot;_blank&quot;&gt;http://xhslink.com/o/5vDCA2JigSO&lt;/a&gt;
发布时间：2026-04-12
标签：面试、面经、AI、Agent、实习&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;Q1：如果让你设计一个 Agent 的规划器，怎么避免它每一步都重新规划，导致路径震荡？&lt;a href=&quot;#q1如果让你设计一个-agent-的规划器怎么避免它每一步都重新规划导致路径震荡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;规划器不能每拿到一个 observation 就整体重算，不然很容易出现前一步刚决定检索，后一步又改成思考，再下一步又回去检索，整个执行路径会来回抖动。&lt;/p&gt;&lt;p&gt;更稳的做法是把规划分成**“全局计划”&lt;strong&gt;和&lt;/strong&gt;”局部调整”**两层。全局计划只定义阶段目标，比如信息收集、证据校验、结果生成；局部调整只允许在当前阶段内微调具体动作。&lt;/p&gt;&lt;p&gt;另外要给 planner 一个明确的状态表示，比如当前子目标、已完成步骤、失败原因、剩余预算。如果没有状态约束，模型会把每次新 observation 当成全新任务来理解。&lt;/p&gt;&lt;p&gt;线上一般还会加**“重规划阈值”**，只有在关键前提失效、连续失败或者用户目标变化时才允许重规划，这样路径会稳定很多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q2：如果一个 Agent 需要同时查知识库、调外部 API、再结合用户历史偏好回答，你怎么处理这三类上下文的优先级？&lt;a href=&quot;#q2如果一个-agent-需要同时查知识库调外部-api再结合用户历史偏好回答你怎么处理这三类上下文的优先级&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这三类信息不能混着塞，要先定义优先级。通常&lt;strong&gt;系统规则最高&lt;/strong&gt;，接下来是当前轮用户明确输入，再往下是外部工具返回和知识库证据，&lt;strong&gt;用户历史偏好通常最低&lt;/strong&gt;。因为偏好只能影响表达方式或默认选择，不能覆盖当前轮事实。&lt;/p&gt;&lt;p&gt;比如用户历史里一直偏好 Python，但这轮明确说”用 Java 给我写”，那当前轮约束一定优先。&lt;/p&gt;&lt;p&gt;这几类上下文不能一股脑全塞进 prompt，要有&lt;strong&gt;分层拼接策略&lt;/strong&gt;，每层标注来源和可信度。工具返回的结果也要做可信度排序，因为有些工具返回的是参考值，有些是精确计算。拼的时候系统约束放最前面，用户输入紧随其后，工具和知识库结果按相关性排，偏好信息放最后，作为 soft hint。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q3：如何评估一个 Agent 的好坏？&lt;a href=&quot;#q3如何评估一个-agent-的好坏&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;不能只看最终答案对不对，还要看&lt;strong&gt;过程&lt;/strong&gt;。通常会从这几个维度评估：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务完成率&lt;/strong&gt;：有没有达到目标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步骤效率&lt;/strong&gt;：花了多少步、有没有走弯路&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具调用准确率&lt;/strong&gt;：选对工具、参数填对、返回结果正确使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;幻觉率&lt;/strong&gt;：有没有编造不存在的信息或工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户满意度&lt;/strong&gt;：用户愿不愿意继续用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;评估方式分&lt;strong&gt;离线&lt;/strong&gt;和&lt;strong&gt;在线&lt;/strong&gt;两种：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;离线&lt;/strong&gt;：用 benchmark 数据集跑回归测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在线&lt;/strong&gt;：看真实用户留存、反馈和复用率&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;很多团队只关注离线指标，但上线后真正有用的是在线指标，因为离线数据很难覆盖边界情况和长尾场景。线上还要看&lt;strong&gt;异常恢复率&lt;/strong&gt;（出了错能不能自己修回来）和&lt;strong&gt;人类介入率&lt;/strong&gt;（有多少任务需要人接管），这两个指标直接反映了 Agent 的工程成熟度。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q4：Agent 里的 Memory 机制怎么设计？&lt;a href=&quot;#q4agent-里的-memory-机制怎么设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Agent 的记忆分三层：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;存储方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;短期记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前对话的上下文窗口&lt;/td&gt;&lt;td&gt;滑动窗口或摘要压缩&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;长期记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;跨会话持久化信息（用户偏好、历史交互、知识）&lt;/td&gt;&lt;td&gt;向量数据库或 KV 存储&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工作记忆&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当前任务执行中的中间状态（已收集证据、已尝试方案、当前子目标）&lt;/td&gt;&lt;td&gt;进程内存&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;设计时要考虑三个核心问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;写入时机&lt;/strong&gt;：不是所有信息都值得存，要做重要性打分和去重&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索方式&lt;/strong&gt;：相关性和时效性要兼顾&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遗忘策略&lt;/strong&gt;：不然记忆库越来越大、越来越杂，检索精度反而下降&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q5：Function Calling 和 Tool Use 有什么区别？&lt;a href=&quot;#q5function-calling-和-tool-use-有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Function Calling&lt;/strong&gt; 是模型侧的能力：模型在生成过程中决定要调用哪个函数、传什么参数，然后把调用意图以结构化格式输出。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tool Use&lt;/strong&gt; 是更广义的概念，包括 Function Calling 以及外部工具的注册、发现、调度、执行和结果回传。在实际工程里，Function Calling 只是 Tool Use 链路中的一环。&lt;/p&gt;&lt;p&gt;完整链路还包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工具注册&lt;/strong&gt;：告诉模型有哪些工具、每个工具的 schema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具选择&lt;/strong&gt;：有几十个工具时怎么快速筛选候选&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数校验&lt;/strong&gt;：模型填的参数可能不合法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行隔离&lt;/strong&gt;：工具执行可能出错、超时、返回异常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果处理&lt;/strong&gt;：工具返回的原始数据怎么注入回上下文&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;很多初学者只关注模型怎么输出 function call，忽略了前后两端的工程细节。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q6：怎么处理 Agent 执行过程中的异常和错误？&lt;a href=&quot;#q6怎么处理-agent-执行过程中的异常和错误&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;常见异常分四类：工具调用失败（网络超时、服务不可用、参数错误）、模型输出异常（幻觉、格式错误、输出截断）、状态不一致（上下文过长、记忆冲突）、业务逻辑异常（用户目标变更、权限不足）。&lt;/p&gt;&lt;p&gt;处理策略分三层：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;策略&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;第一层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;重试&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;对临时性错误用指数退避重试，限制最大重试次数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;降级&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;主工具失败时换备用工具或切换更简单的执行路径&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第三层&lt;/td&gt;&lt;td&gt;&lt;strong&gt;上报&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;自己处理不了的交给人类介入或切换到人工客服&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;每层都要记录详细的错误日志和上下文快照，方便后续排查。线上 Agent 一定要有&lt;strong&gt;熔断机制&lt;/strong&gt;，当某个工具连续失败率超过阈值时自动熔断，避免无效调用浪费资源和时间。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q7：你怎么理解 Agent 的 Planning 能力？&lt;a href=&quot;#q7你怎么理解-agent-的-planning-能力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Planning 不是简单让模型列个 to-do list，而是让模型根据当前状态和目标&lt;strong&gt;动态决定&lt;/strong&gt;下一步做什么。&lt;/p&gt;&lt;p&gt;常见 Planning 范式：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;范式&lt;/th&gt;&lt;th&gt;特点&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ReAct&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;交替推理和执行，每步根据上一步结果决定下一步&lt;/td&gt;&lt;td&gt;简单任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plan-and-Execute&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;先生成完整计划再逐步执行，偏离时重新规划&lt;/td&gt;&lt;td&gt;复杂任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tree of Thought&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;探索多条分支路径，选最优的继续&lt;/td&gt;&lt;td&gt;需要对比多种方案&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;实际工程里通常混合使用。Planning 的难点不在于生成计划，而在于：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如何判断计划是否偏离&lt;/li&gt;
&lt;li&gt;何时需要重新规划&lt;/li&gt;
&lt;li&gt;如何避免重复失败的路径&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q8：Multi-Agent 系统怎么设计？&lt;a href=&quot;#q8multi-agent-系统怎么设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;核心是&lt;strong&gt;分工、协调和仲裁&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分工&lt;/strong&gt;：明确每个 Agent 的职责边界和能力范围，避免职责重叠&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协调&lt;/strong&gt;：统一的消息协议和状态同步机制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仲裁&lt;/strong&gt;：多个 Agent 给出不同结果时，由谁决定最终输出&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;常见架构模式：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;适用场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Orchestrator&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;主 Agent 拆解任务、分配子 Agent、汇总结果&lt;/td&gt;&lt;td&gt;简单分解任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Peer-to-Peer&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Agent 之间平等协商&lt;/td&gt;&lt;td&gt;需要多方讨论&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hierarchical&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;层级管理，上级管理下级&lt;/td&gt;&lt;td&gt;复杂组织结构&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q9：如何优化 Agent 的响应延迟？&lt;a href=&quot;#q9如何优化-agent-的响应延迟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;延迟优化要分阶段看：模型推理、工具调用、网络传输、上下文组装。&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;阶段&lt;/th&gt;&lt;th&gt;优化手段&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;模型推理&lt;/td&gt;&lt;td&gt;流式输出，减少感知延迟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工具调用&lt;/td&gt;&lt;td&gt;并行调用多个独立工具&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;网络传输&lt;/td&gt;&lt;td&gt;缓存减少重复请求，连接池复用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上下文组装&lt;/td&gt;&lt;td&gt;只注入必要上下文，避免无关信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;预计算&lt;/td&gt;&lt;td&gt;确定性中间结果提前算好存起来&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;整体思路：&lt;strong&gt;能并行的并行、能缓存的缓存、能裁剪的裁剪、能预计算的预计算&lt;/strong&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q10：RAG 系统常见的问题和优化方案？&lt;a href=&quot;#q10rag-系统常见的问题和优化方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;核心问题三类：检索不准、上下文不够、生成质量差。&lt;/p&gt;&lt;p&gt;优化方案：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分块策略优化&lt;/strong&gt;：按语义分块而不是固定长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多路检索&lt;/strong&gt;：向量检索 + 关键词检索 + 混合检索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重排序&lt;/strong&gt;：用 reranker 对候选结果二次排序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文压缩&lt;/strong&gt;：只保留和问题最相关的部分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询改写&lt;/strong&gt;：把用户问题改写成更适合检索的形式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反馈循环&lt;/strong&gt;：根据用户满意度反向调整检索策略&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q11：如果让你做一个”可审计”的 Agent，你会保留哪些信息？&lt;a href=&quot;#q11如果让你做一个可审计的-agent你会保留哪些信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可审计不是简单把聊天记录存下来，而是要能还原**“它为什么这样做”**。&lt;/p&gt;&lt;p&gt;至少要保留：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户输入&lt;/li&gt;
&lt;li&gt;系统 prompt 版本&lt;/li&gt;
&lt;li&gt;工具候选集&lt;/li&gt;
&lt;li&gt;最终工具选择&lt;/li&gt;
&lt;li&gt;调用参数、工具返回&lt;/li&gt;
&lt;li&gt;状态变迁&lt;/li&gt;
&lt;li&gt;模型输出和最终结果&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更完整的还要带上：模型版本、知识库版本、检索到的文档 ID、rerank 结果、trace_id。&lt;/p&gt;&lt;p&gt;线上出了问题，才能准确回放是 prompt 变了、知识库变了、模型变了，还是工具变了。真正的审计目标不是”存档”，而是**“能追责、能定因、能复现”**。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q12：为什么很多 Agent Demo 很惊艳，但一上线就不稳定？&lt;a href=&quot;#q12为什么很多-agent-demo-很惊艳但一上线就不稳定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;因为 Demo 是在理想输入、有限工具、单次任务和短上下文下演示的，模型只要看起来会做事就行。但线上环境完全不一样——输入脏、任务长、工具多、状态复杂、异常频繁，还要考虑权限、安全、性能和成本。&lt;/p&gt;&lt;p&gt;Demo 能跑通，只能说明**“这个方向有可能”&lt;strong&gt;；上线稳定，说明的是你&lt;/strong&gt;把模型的不确定性关进了工程笼子里**。&lt;/p&gt;&lt;p&gt;真正难的是做治理，不是做演示。很多团队一开始总怪模型不够强，后来才发现大量问题其实来自：状态管理、工具设计、上下文污染和缺少回放能力。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Q13：你觉得二面和一面在 AI Agent 方向上最大的区别是什么？&lt;a href=&quot;#q13你觉得二面和一面在-ai-agent-方向上最大的区别是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一面很多时候还会看你&lt;strong&gt;知不知道概念&lt;/strong&gt;，比如 RAG、Tool Calling、Memory、Multi-Agent 这些名词你能不能说清。&lt;/p&gt;&lt;p&gt;二面通常就不满足于名词解释了，更想知道你能不能&lt;strong&gt;把这些东西真正落到系统里&lt;/strong&gt;。会追着问边界条件、失败案例、线上治理和设计取舍。不是问你”会不会”，而是问你**“为什么不这么做，不这么做会出什么问题”**。&lt;/p&gt;&lt;p&gt;如果你答的时候一直停留在定义层面，二面一般很容易被看出来。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%AF%B7%E8%A7%A3%E9%87%8A-tool-calling-%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8-%E7%9A%84%E5%AE%8C%E6%95%B4%E9%93%BE%E8%B7%AF-%E5%B7%A5%E5%85%B7%E6%98%AF%E6%80%8E%E4%B9%88%E5%AE%9A%E4%B9%89%E7%9A%84-llm-%E6%80%8E%E4%B9%88%E8%B0%83%E7%94%A8%E5%AE%83-%E7%BB%93%E6%9E%9C%E6%80%8E%E4%B9%88%E5%9B%9E%E4%BC%A0__%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%AF%B7%E8%A7%A3%E9%87%8A-tool-calling-%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8-%E7%9A%84%E5%AE%8C%E6%95%B4%E9%93%BE%E8%B7%AF-%E5%B7%A5%E5%85%B7%E6%98%AF%E6%80%8E%E4%B9%88%E5%AE%9A%E4%B9%89%E7%9A%84-llm-%E6%80%8E%E4%B9%88%E8%B0%83%E7%94%A8%E5%AE%83-%E7%BB%93%E6%9E%9C%E6%80%8E%E4%B9%88%E5%9B%9E%E4%BC%A0__%E6%95%B4%E7%90%86/</guid><description># 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_ ## 问题 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_ ##</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_&lt;a href=&quot;#请解释-tool-calling工具调用的完整链路工具是怎么定义的llm-怎么调用它结果怎么回传_&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;a href=&quot;#请解释-tool-calling工具调用的完整链路工具是怎么定义的llm-怎么调用它结果怎么回传&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。先说工具定义。每个工具本质上就是一段 JSON Schema（一种描述数据结构的标准格式），里面包含工具的名字、一段自然语言描述、以及参数的类型约束。LLM 不会直接执行任何代码，它只认这段 Schema 文本。你在系统侧注册好工具，然后把这些 Schema 塞进 system prompt 或者 tools 字段传给 LLM：▼json复制代码{“name”:“get_weather”,“description”:“查询指定城市的当前天气”,“parameters”:{“type”:“object”,“properties”:{“city”:{“type”:“string”,“description”:“城市名称”}},“required”:[“city”]}}然后是LLM 决策调用。LLM 收到用户消息和工具列表后，如果判断当前问题得调用工具，它不会直接回答用户，而是返回一个特殊的tool_use消息，里面带着工具名和填好的参数 JSON。备注：不同厂商命名不同，OpenAI 用 tool_calls，Anthropic 用 tool_use，本文以 Anthropic 命名为例。注意，LLM 只是”说”它想调什么工具、传什么参数，它自己压根不会去执行。这跟你在聊天里说”帮我查一下天气”一样，说的人不会真的去查，执行的是系统侧。系统侧拿到 tool_use 消息后，解析出工具名，找到本地注册的对应函数，把参数传进去跑。执行完拿到结果，包装成 tool_result 消息追加到对话历史里，再整个发回给 LLM。LLM 看到 tool_result 后有两种选择：如果信息够了就直接生成最终回答如果还需要更多信息，它会再发一个 tool_use，形成一个循环，直到它认为可以回复用户为止。整个链路：用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use 含工具名和参数 → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/p&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进OpenAI 最早在 2023 年 6 月推出的叫Function Calling，当时一次只能调一个函数。到了 2023 年 11 月，升级成了 Tool Calling，最大的变化是支持 parallel tool calls，LLM 一次可以返回多个 tool_use，系统可以并行执行完再统一回传结果。举个场景：用户问”北京和上海今天天气怎么样”，用 Function Calling 的话 LLM 得先调一次 get_weather(“北京”)，等结果回来再调 get_weather(“上海”)，两轮网络往返。换成 Tool Calling，LLM 直接返回两个 tool_use，系统并发执行，一轮就搞定了。Anthropic 的 Claude、Google 的 Gemini 也都支持 Tool Calling，机制基本一样，但在 Schema 处理上有差异。比如 Gemini 不支持 patternProperties 和 additionalProperties 这些关键字，xAI 不支持 minLength、maxLength 约束，OpenAI 要求参数顶层必须是 type: “object”。实际工程里通常需要一层 Schema 归一化来抹平这些差异。工具结果的上下文管理工具返回的数据量可能非常大。一次代码搜索可能返回 50KB 的内容，直接塞进上下文会快速吃掉 token 配额。生产级系统一般会做截断处理，常见的策略是 head + tail 保留，取开头和结尾各一部分，中间用省略标记替代，同时设置单条结果的上限，比如一般会设置单条结果占上下文窗口比例的上限（如 20%-30%）以及字符数硬上限。安全和权限控制工具调用是 Agent 系统里最容易出安全问题的环节。LLM 可能被 prompt injection 诱导去调用不该调的工具，比如删除文件、发送邮件。所以生产环境至少要做三件事：1）工具白名单，只暴露当前场景必需的工具。&lt;/p&gt;&lt;p&gt;2） 参数校验，不能完全信任 LLM 填的参数，服务端必须做 Schema 验证和业务规则校验。&lt;/p&gt;&lt;p&gt;3） 敏感操作加人工确认，像 LangChain 的 HumanApprovalCallbackHandler 就是在执行前弹一个确认。错误处理和重试工具执行失败是常态，网络超时、API 限流、参数格式错误都可能发生。好的做法是把错误信息也包装成 tool_result 返回给 LLM，让它自己决定怎么处理。大多数模型看到错误后会尝试修改参数重新调用，或者换一个工具，或者直接告诉用户”这个信息暂时查不到”。但要注意设置最大重试次数，不然 LLM 可能陷入死循环不停地调同一个工具。一般 3-5 次就够了，超了就强制返回。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？回答：两层防线。第一层是在系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 tool_result 返回给 LLM，大多数模型看到具体的报错信息后会自己修正参数重新调用。第二层是设置重试上限，一般 3 次，避免来回纠错死循环。- &lt;strong&gt;提问&lt;/strong&gt;：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：各工具的执行结果是独立回传的，失败的那个单独返回错误信息，成功的正常返回结果。所有 tool_result 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，这跟 Promise.allSettled 的思路一样。- &lt;strong&gt;提问&lt;/strong&gt;：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：RAG 是”提前检索、一次性注入”，把相关文档片段塞进 prompt 就完事了，适合知识查询类的场景。Tool Calling 是”按需执行、多轮交互”，LLM 在推理过程中动态决定要不要调、调哪个，适合需要实时数据、需要执行副作用的场景，比如查数据库、发请求、操作文件系统。简单说，RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。- &lt;strong&gt;提问&lt;/strong&gt;：怎么让 LLM 更准确地选择正确的工具？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：工具的 description 写得好不好直接决定调用准确率。description 要写清楚这个工具干什么、什么场景该用、什么场景不该用。参数的 description 也一样重要，别偷懒写个”id”就完了，要写明白”用户的唯一标识符，必须是数字格式”。另外工具数量不能太多，超过 15-20 个的时候 LLM 选择准确率会明显下降，这时候要么分场景加载不同的工具集，要么做一层路由先判断意图再加载对应工具。作者：Yes面试鸭官方
工具定义：工具本质是一段 JSON Schema，包含工具名字、一段自然语言描述、参数的类型约束。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM角色调用：受到用户消息和工具列表后，判断当前问题得调用工具，返回一个特殊的tool_use 消息，里面带着工具名和填好的参数 JSON展开新页面打开2026-03-14  11:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进工具结果的上下文管理安全和权限控制错误处理和重试&lt;/p&gt;&lt;p&gt;提问：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？提问：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？提问：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？提问：怎么让 LLM 更准确地选择正确的工具？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813221. 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。先说工具定义。每个工具本质上就是一段 JSON Schema（一种描述数据结构的标准格式），里面包含工具的名字、一段自然语言描述、以及参数的类型约束。LLM 不会直接执行任何代码，它只认这段 Schema 文本。你在系统侧注册好工具，然后把这些 Schema 塞进 system prompt 或者 tools 字段传给 LLM：▼json复制代码{“name”:“get_weather”,“description”:“查询指定城市的当前天气”,“parameters”:{“type”:“object”,“properties”:{“city”:{“type”:“string”,“description”:“城市名称”}},“required”:[“city”]}}然后是LLM 决策调用。LLM 收到用户消息和工具列表后，如果判断当前问题得调用工具，它不会直接回答用户，而是返回一个特殊的tool_use消息，里面带着工具名和填好的参数 JSON。备注：不同厂商命名不同，OpenAI 用 tool_calls，Anthropic 用 tool_use，本文以 Anthropic 命名为例。注意，LLM 只是”说”它想调什么工具、传什么参数，它自己压根不会去执行。这跟你在聊天里说”帮我查一下天气”一样，说的人不会真的去查，执行的是系统侧。系统侧拿到 tool_use 消息后，解析出工具名，找到本地注册的对应函数，把参数传进去跑。执行完拿到结果，包装成 tool_result 消息追加到对话历史里，再整个发回给 LLM。LLM 看到 tool_result 后有两种选择：如果信息够了就直接生成最终回答如果还需要更多信息，它会再发一个 tool_use，形成一个循环，直到它认为可以回复用户为止。整个链路：用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use 含工具名和参数 → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/p&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进OpenAI 最早在 2023 年 6 月推出的叫Function Calling，当时一次只能调一个函数。到了 2023 年 11 月，升级成了 Tool Calling，最大的变化是支持 parallel tool calls，LLM 一次可以返回多个 tool_use，系统可以并行执行完再统一回传结果。举个场景：用户问”北京和上海今天天气怎么样”，用 Function Calling 的话 LLM 得先调一次 get_weather(“北京”)，等结果回来再调 get_weather(“上海”)，两轮网络往返。换成 Tool Calling，LLM 直接返回两个 tool_use，系统并发执行，一轮就搞定了。Anthropic 的 Claude、Google 的 Gemini 也都支持 Tool Calling，机制基本一样，但在 Schema 处理上有差异。比如 Gemini 不支持 patternProperties 和 additionalProperties 这些关键字，xAI 不支持 minLength、maxLength 约束，OpenAI 要求参数顶层必须是 type: “object”。实际工程里通常需要一层 Schema 归一化来抹平这些差异。工具结果的上下文管理工具返回的数据量可能非常大。一次代码搜索可能返回 50KB 的内容，直接塞进上下文会快速吃掉 token 配额。生产级系统一般会做截断处理，常见的策略是 head + tail 保留，取开头和结尾各一部分，中间用省略标记替代，同时设置单条结果的上限，比如一般会设置单条结果占上下文窗口比例的上限（如 20%-30%）以及字符数硬上限。安全和权限控制工具调用是 Agent 系统里最容易出安全问题的环节。LLM 可能被 prompt injection 诱导去调用不该调的工具，比如删除文件、发送邮件。所以生产环境至少要做三件事：1）工具白名单，只暴露当前场景必需的工具。&lt;/p&gt;&lt;p&gt;2） 参数校验，不能完全信任 LLM 填的参数，服务端必须做 Schema 验证和业务规则校验。&lt;/p&gt;&lt;p&gt;3） 敏感操作加人工确认，像 LangChain 的 HumanApprovalCallbackHandler 就是在执行前弹一个确认。错误处理和重试工具执行失败是常态，网络超时、API 限流、参数格式错误都可能发生。好的做法是把错误信息也包装成 tool_result 返回给 LLM，让它自己决定怎么处理。大多数模型看到错误后会尝试修改参数重新调用，或者换一个工具，或者直接告诉用户”这个信息暂时查不到”。但要注意设置最大重试次数，不然 LLM 可能陷入死循环不停地调同一个工具。一般 3-5 次就够了，超了就强制返回。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？回答：两层防线。第一层是在系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 tool_result 返回给 LLM，大多数模型看到具体的报错信息后会自己修正参数重新调用。第二层是设置重试上限，一般 3 次，避免来回纠错死循环。- &lt;strong&gt;提问&lt;/strong&gt;：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：各工具的执行结果是独立回传的，失败的那个单独返回错误信息，成功的正常返回结果。所有 tool_result 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，这跟 Promise.allSettled 的思路一样。- &lt;strong&gt;提问&lt;/strong&gt;：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：RAG 是”提前检索、一次性注入”，把相关文档片段塞进 prompt 就完事了，适合知识查询类的场景。Tool Calling 是”按需执行、多轮交互”，LLM 在推理过程中动态决定要不要调、调哪个，适合需要实时数据、需要执行副作用的场景，比如查数据库、发请求、操作文件系统。简单说，RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。- &lt;strong&gt;提问&lt;/strong&gt;：怎么让 LLM 更准确地选择正确的工具？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：工具的 description 写得好不好直接决定调用准确率。description 要写清楚这个工具干什么、什么场景该用、什么场景不该用。参数的 description 也一样重要，别偷懒写个”id”就完了，要写明白”用户的唯一标识符，必须是数字格式”。另外工具数量不能太多，超过 15-20 个的时候 LLM 选择准确率会明显下降，这时候要么分场景加载不同的工具集，要么做一层路由先判断意图再加载对应工具。作者：Yes面试鸭官方
工具定义：工具本质是一段 JSON Schema，包含工具名字、一段自然语言描述、参数的类型约束。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;LLM角色调用：受到用户消息和工具列表后，判断当前问题得调用工具，返回一个特殊的tool_use 消息，里面带着工具名和填好的参数 JSON展开新页面打开2026-03-14  11:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;/p&gt;&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;p&gt;&lt;/p&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进工具结果的上下文管理安全和权限控制错误处理和重试&lt;/p&gt;&lt;p&gt;提问：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？提问：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？提问：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？提问：怎么让 LLM 更准确地选择正确的工具？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;a href=&quot;#请解释-tool-calling工具调用的完整链路工具是怎么定义的llm-怎么调用它结果怎么回传-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。&lt;/li&gt;
&lt;li&gt;打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。&lt;/li&gt;
&lt;li&gt;Tool Calling 就是这个”下命令再拿报告”的标准化流程。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。先说工具定义。每个工具本质上就是一段 JSON Schema（一种描述数据结构的标准格式），里面包含工具的名字、一段自然语言描述、以及参数的类型约束。LLM 不会直接执行任何代码，它只认这段 Schema 文本。你在系统侧注册好工具，然后把这些 Schema 塞进 system prompt 或者 tools 字段传给 LLM：▼json复制代码{“name”:“get_weather”,“description”:“查询指定城市的当前天气”,“parameters”:{“type”:“object”,“properties”:{“city”:{“type”:“string”,“description”:“城市名称”}},“required”:[“city”]}}然后是LLM 决策调用。LLM 收到用户消息和工具列表后，如果判断当前问题得调用工具，它不会直接回答用户，而是返回一个特殊的tool_use消息，里面带着工具名和填好的参数 JSON。备注：不同厂商命名不同，OpenAI 用 tool_calls，Anthropic 用 tool_use，本文以 Anthropic 命名为例。注意，LLM 只是”说”它想调什么工具、传什么参数，它自己压根不会去执行。这跟你在聊天里说”帮我查一下天气”一样，说的人不会真的去查，执行的是系统侧。系统侧拿到 tool_use 消息后，解析出工具名，找到本地注册的对应函数，把参数传进去跑。执行完拿到结果，包装成 tool_result 消息追加到对话历史里，再整个发回给 LLM。LLM 看到 tool_result 后有两种选择：如果信息够了就直接生成最终回答如果还需要更多信息，它会再发一个 tool_use，形成一个循环，直到它认为可以回复用户为止。整个链路：用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use 含工具名和参数 → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/p&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进OpenAI 最早在 2023 年 6 月推出的叫Function Calling，当时一次只能调一个函数。到了 2023 年 11 月，升级成了 Tool Calling，最大的变化是支持 parallel tool calls，LLM 一次可以返回多个 tool_use，系统可以并行执行完再统一回传结果。举个场景：用户问”北京和上海今天天气怎么样”，用 Function Calling 的话 LLM 得先调一次 get_weather(“北京”)，等结果回来再调 get_weather(“上海”)，两轮网络往返。换成 Tool Calling，LLM 直接返回两个 tool_use，系统并发执行，一轮就搞定了。Anthropic 的 Claude、Google 的 Gemini 也都支持 Tool Calling，机制基本一样，但在 Schema 处理上有差异。比如 Gemini 不支持 patternProperties 和 additionalProperties 这些关键字，xAI 不支持 minLength、maxLength 约束，OpenAI 要求参数顶层必须是 type: “object”。实际工程里通常需要一层 Schema 归一化来抹平这些差异。工具结果的上下文管理工具返回的数据量可能非常大。一次代码搜索可能返回 50KB 的内容，直接塞进上下文会快速吃掉 token 配额。生产级系统一般会做截断处理，常见的策略是 head + tail 保留，取开头和结尾各一部分，中间用省略标记替代，同时设置单条结果的上限，比如一般会设置单条结果占上下文窗口比例的上限（如 20%-30%）以及字符数硬上限。安全和权限控制工具调用是 Agent 系统里最容易出安全问题的环节。LLM 可能被 prompt injection 诱导去调用不该调的工具，比如删除文件、发送邮件。所以生产环境至少要做三件事：1）工具白名单，只暴露当前场景必需的工具。&lt;/p&gt;&lt;p&gt;2） 参数校验，不能完全信任 LLM 填的参数，服务端必须做 Schema 验证和业务规则校验。&lt;/p&gt;&lt;p&gt;3） 敏感操作加人工确认，像 LangChain 的 HumanApprovalCallbackHandler 就是在执行前弹一个确认。错误处理和重试工具执行失败是常态，网络超时、API 限流、参数格式错误都可能发生。好的做法是把错误信息也包装成 tool_result 返回给 LLM，让它自己决定怎么处理。大多数模型看到错误后会尝试修改参数重新调用，或者换一个工具，或者直接告诉用户”这个信息暂时查不到”。但要注意设置最大重试次数，不然 LLM 可能陷入死循环不停地调同一个工具。一般 3-5 次就够了，超了就强制返回。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？回答：两层防线。第一层是在系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 tool_result 返回给 LLM，大多数模型看到具体的报错信息后会自己修正参数重新调用。第二层是设置重试上限，一般 3 次，避免来回纠错死循环。- &lt;strong&gt;提问&lt;/strong&gt;：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：各工具的执行结果是独立回传的，失败的那个单独返回错误信息，成功的正常返回结果。所有 tool_result 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，这跟 Promise.allSettled 的思路一样。- &lt;strong&gt;提问&lt;/strong&gt;：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：RAG 是”提前检索、一次性注入”，把相关文档片段塞进 prompt 就完事了，适合知识查询类的场景。Tool Calling 是”按需执行、多轮交互”，LLM 在推理过程中动态决定要不要调、调哪个，适合需要实时数据、需要执行副作用的场景，比如查数据库、发请求、操作文件系统。简单说，RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。- &lt;strong&gt;提问&lt;/strong&gt;：怎么让 LLM 更准确地选择正确的工具？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：工具的 description 写得好不好直接决定调用准确率。description 要写清楚这个工具干什么、什么场景该用、什么场景不该用。参数的 description 也一样重要，别偷懒写个”id”就完了，要写明白”用户的唯一标识符，必须是数字格式”。另外工具数量不能太多，超过 15-20 个的时候 LLM 选择准确率会明显下降，这时候要么分场景加载不同的工具集，要么做一层路由先判断意图再加载对应工具。作者：Yes面试鸭官方
工具定义：工具本质是一段 JSON Schema，包含工具名字、一段自然语言描述、参数的类型约束。&lt;/li&gt;
&lt;li&gt;LLM角色调用：受到用户消息和工具列表后，判断当前问题得调用工具，返回一个特殊的tool_use 消息，里面带着工具名和填好的参数 JSON展开新页面打开2026-03-14  11:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进工具结果的上下文管理安全和权限控制错误处理和重试&lt;/p&gt;&lt;p&gt;提问：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？提问：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？提问：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？提问：怎么让 LLM 更准确地选择正确的工具？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;如何实现 AI 多轮对话功能？如何解决对话记忆持久化问题？如果一个GPU集群的LLM处理能力为1000tokens/s，那1000个用户同时并发访问，响应给每个用户的性能只有1 token/s吗？怎么分析性能瓶颈什么是结构化输出？Spring AI 是怎么实现结构化输出的？什么是 Re-Reading？如何基于 Spring AI 实现 Re-Reading Advisor？什么是 Spring AI 框架？它有哪些核心特性？上次浏览：2026-03-18 18:41:27什么是 AI Agent？它和直接调用大模型 API 做一次问答有什么本质区别？请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?System Prompt 在 Agent 系统中承载了哪些职责？如果 System Prompt 越来越长，你会怎么处理？什么是 Agent 的 Context Window？为什么它是 Agent 工程中最核心的约束之一？解释「短期记忆」和「长期记忆」在 Agent 系统中的区别，分别适合怎么存储和检索？OpenClaw 是什么？它要解决什么问题？它的核心能力有哪些？上次浏览：2026-03-16 15:12:52OpenClaw 的核心组件有哪些？请描述它们之间的关系上次浏览：2026-03-16 15:15:2813221. 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。先说工具定义。每个工具本质上就是一段 JSON Schema（一种描述数据结构的标准格式），里面包含工具的名字、一段自然语言描述、以及参数的类型约束。LLM 不会直接执行任何代码，它只认这段 Schema 文本。你在系统侧注册好工具，然后把这些 Schema 塞进 system prompt 或者 tools 字段传给 LLM：▼json复制代码{“name”:“get_weather”,“description”:“查询指定城市的当前天气”,“parameters”:{“type”:“object”,“properties”:{“city”:{“type”:“string”,“description”:“城市名称”}},“required”:[“city”]}}然后是LLM 决策调用。LLM 收到用户消息和工具列表后，如果判断当前问题得调用工具，它不会直接回答用户，而是返回一个特殊的tool_use消息，里面带着工具名和填好的参数 JSON。备注：不同厂商命名不同，OpenAI 用 tool_calls，Anthropic 用 tool_use，本文以 Anthropic 命名为例。注意，LLM 只是”说”它想调什么工具、传什么参数，它自己压根不会去执行。这跟你在聊天里说”帮我查一下天气”一样，说的人不会真的去查，执行的是系统侧。系统侧拿到 tool_use 消息后，解析出工具名，找到本地注册的对应函数，把参数传进去跑。执行完拿到结果，包装成 tool_result 消息追加到对话历史里，再整个发回给 LLM。LLM 看到 tool_result 后有两种选择：如果信息够了就直接生成最终回答如果还需要更多信息，它会再发一个 tool_use，形成一个循环，直到它认为可以回复用户为止。整个链路：用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use 含工具名和参数 → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/p&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进OpenAI 最早在 2023 年 6 月推出的叫Function Calling，当时一次只能调一个函数。到了 2023 年 11 月，升级成了 Tool Calling，最大的变化是支持 parallel tool calls，LLM 一次可以返回多个 tool_use，系统可以并行执行完再统一回传结果。举个场景：用户问”北京和上海今天天气怎么样”，用 Function Calling 的话 LLM 得先调一次 get_weather(“北京”)，等结果回来再调 get_weather(“上海”)，两轮网络往返。换成 Tool Calling，LLM 直接返回两个 tool_use，系统并发执行，一轮就搞定了。Anthropic 的 Claude、Google 的 Gemini 也都支持 Tool Calling，机制基本一样，但在 Schema 处理上有差异。比如 Gemini 不支持 patternProperties 和 additionalProperties 这些关键字，xAI 不支持 minLength、maxLength 约束，OpenAI 要求参数顶层必须是 type: “object”。实际工程里通常需要一层 Schema 归一化来抹平这些差异。工具结果的上下文管理工具返回的数据量可能非常大。一次代码搜索可能返回 50KB 的内容，直接塞进上下文会快速吃掉 token 配额。生产级系统一般会做截断处理，常见的策略是 head + tail 保留，取开头和结尾各一部分，中间用省略标记替代，同时设置单条结果的上限，比如一般会设置单条结果占上下文窗口比例的上限（如 20%-30%）以及字符数硬上限。安全和权限控制工具调用是 Agent 系统里最容易出安全问题的环节。LLM 可能被 prompt injection 诱导去调用不该调的工具，比如删除文件、发送邮件。所以生产环境至少要做三件事：1）工具白名单，只暴露当前场景必需的工具。&lt;/p&gt;&lt;p&gt;2） 参数校验，不能完全信任 LLM 填的参数，服务端必须做 Schema 验证和业务规则校验。&lt;/p&gt;&lt;p&gt;3） 敏感操作加人工确认，像 LangChain 的 HumanApprovalCallbackHandler 就是在执行前弹一个确认。错误处理和重试工具执行失败是常态，网络超时、API 限流、参数格式错误都可能发生。好的做法是把错误信息也包装成 tool_result 返回给 LLM，让它自己决定怎么处理。大多数模型看到错误后会尝试修改参数重新调用，或者换一个工具，或者直接告诉用户”这个信息暂时查不到”。但要注意设置最大重试次数，不然 LLM 可能陷入死循环不停地调同一个工具。一般 3-5 次就够了，超了就强制返回。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？回答：两层防线。第一层是在系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 tool_result 返回给 LLM，大多数模型看到具体的报错信息后会自己修正参数重新调用。第二层是设置重试上限，一般 3 次，避免来回纠错死循环。- &lt;strong&gt;提问&lt;/strong&gt;：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：各工具的执行结果是独立回传的，失败的那个单独返回错误信息，成功的正常返回结果。所有 tool_result 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，这跟 Promise.allSettled 的思路一样。- &lt;strong&gt;提问&lt;/strong&gt;：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：RAG 是”提前检索、一次性注入”，把相关文档片段塞进 prompt 就完事了，适合知识查询类的场景。Tool Calling 是”按需执行、多轮交互”，LLM 在推理过程中动态决定要不要调、调哪个，适合需要实时数据、需要执行副作用的场景，比如查数据库、发请求、操作文件系统。简单说，RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。- &lt;strong&gt;提问&lt;/strong&gt;：怎么让 LLM 更准确地选择正确的工具？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：工具的 description 写得好不好直接决定调用准确率。description 要写清楚这个工具干什么、什么场景该用、什么场景不该用。参数的 description 也一样重要，别偷懒写个”id”就完了，要写明白”用户的唯一标识符，必须是数字格式”。另外工具数量不能太多，超过 15-20 个的时候 LLM 选择准确率会明显下降，这时候要么分场景加载不同的工具集，要么做一层路由先判断意图再加载对应工具。作者：Yes面试鸭官方
工具定义：工具本质是一段 JSON Schema，包含工具名字、一段自然语言描述、参数的类型约束。&lt;/li&gt;
&lt;li&gt;LLM角色调用：受到用户消息和工具列表后，判断当前问题得调用工具，返回一个特殊的tool_use 消息，里面带着工具名和填好的参数 JSON展开新页面打开2026-03-14  11:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进工具结果的上下文管理安全和权限控制错误处理和重试&lt;/p&gt;&lt;p&gt;提问：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？提问：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？提问：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？提问：怎么让 LLM 更准确地选择正确的工具？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;a href=&quot;#请解释-tool-calling工具调用的完整链路工具是怎么定义的llm-怎么调用它结果怎么回传-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传_&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?&lt;a href=&quot;#请解释-tool-calling工具调用的完整链路工具是怎么定义的llm-怎么调用它结果怎么回传-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;请解释 Tool Calling（工具调用）的完整链路：工具是怎么定义的、LLM 怎么调用它、结果怎么回传?NEW简单AIOpenClaw大模型应用开发AI应用开发Agent开发标记分享2450面试问答Tool Calling 的核心链路就四步：定义工具 → LLM 决策 → 系统执行 → 结果回传。打个比方：LLM 就像一个只会动嘴的指挥官，它不能亲自去查数据库、读文件，但它可以”下命令”让外部系统去执行，然后看执行报告决定下一步。Tool Calling 就是这个”下命令再拿报告”的标准化流程。先说工具定义。每个工具本质上就是一段 JSON Schema（一种描述数据结构的标准格式），里面包含工具的名字、一段自然语言描述、以及参数的类型约束。LLM 不会直接执行任何代码，它只认这段 Schema 文本。你在系统侧注册好工具，然后把这些 Schema 塞进 system prompt 或者 tools 字段传给 LLM：▼json复制代码{“name”:“get_weather”,“description”:“查询指定城市的当前天气”,“parameters”:{“type”:“object”,“properties”:{“city”:{“type”:“string”,“description”:“城市名称”}},“required”:[“city”]}}然后是LLM 决策调用。LLM 收到用户消息和工具列表后，如果判断当前问题得调用工具，它不会直接回答用户，而是返回一个特殊的tool_use消息，里面带着工具名和填好的参数 JSON。备注：不同厂商命名不同，OpenAI 用 tool_calls，Anthropic 用 tool_use，本文以 Anthropic 命名为例。注意，LLM 只是”说”它想调什么工具、传什么参数，它自己压根不会去执行。这跟你在聊天里说”帮我查一下天气”一样，说的人不会真的去查，执行的是系统侧。系统侧拿到 tool_use 消息后，解析出工具名，找到本地注册的对应函数，把参数传进去跑。执行完拿到结果，包装成 tool_result 消息追加到对话历史里，再整个发回给 LLM。LLM 看到 tool_result 后有两种选择：如果信息够了就直接生成最终回答如果还需要更多信息，它会再发一个 tool_use，形成一个循环，直到它认为可以回复用户为止。整个链路：用户发消息 → LLM 分析消息和工具列表 → LLM 返回 tool_use 含工具名和参数 → 系统执行工具函数 → 系统构造 tool_result → 发回 LLM → LLM 决定继续调用或输出最终回复&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进OpenAI 最早在 2023 年 6 月推出的叫Function Calling，当时一次只能调一个函数。到了 2023 年 11 月，升级成了 Tool Calling，最大的变化是支持 parallel tool calls，LLM 一次可以返回多个 tool_use，系统可以并行执行完再统一回传结果。举个场景：用户问”北京和上海今天天气怎么样”，用 Function Calling 的话 LLM 得先调一次 get_weather(“北京”)，等结果回来再调 get_weather(“上海”)，两轮网络往返。换成 Tool Calling，LLM 直接返回两个 tool_use，系统并发执行，一轮就搞定了。Anthropic 的 Claude、Google 的 Gemini 也都支持 Tool Calling，机制基本一样，但在 Schema 处理上有差异。比如 Gemini 不支持 patternProperties 和 additionalProperties 这些关键字，xAI 不支持 minLength、maxLength 约束，OpenAI 要求参数顶层必须是 type: “object”。实际工程里通常需要一层 Schema 归一化来抹平这些差异。工具结果的上下文管理工具返回的数据量可能非常大。一次代码搜索可能返回 50KB 的内容，直接塞进上下文会快速吃掉 token 配额。生产级系统一般会做截断处理，常见的策略是 head + tail 保留，取开头和结尾各一部分，中间用省略标记替代，同时设置单条结果的上限，比如一般会设置单条结果占上下文窗口比例的上限（如 20%-30%）以及字符数硬上限。安全和权限控制工具调用是 Agent 系统里最容易出安全问题的环节。LLM 可能被 prompt injection 诱导去调用不该调的工具，比如删除文件、发送邮件。所以生产环境至少要做三件事：1）工具白名单，只暴露当前场景必需的工具。&lt;/p&gt;&lt;p&gt;2） 参数校验，不能完全信任 LLM 填的参数，服务端必须做 Schema 验证和业务规则校验。&lt;/p&gt;&lt;p&gt;3） 敏感操作加人工确认，像 LangChain 的 HumanApprovalCallbackHandler 就是在执行前弹一个确认。错误处理和重试工具执行失败是常态，网络超时、API 限流、参数格式错误都可能发生。好的做法是把错误信息也包装成 tool_result 返回给 LLM，让它自己决定怎么处理。大多数模型看到错误后会尝试修改参数重新调用，或者换一个工具，或者直接告诉用户”这个信息暂时查不到”。但要注意设置最大重试次数，不然 LLM 可能陷入死循环不停地调同一个工具。一般 3-5 次就够了，超了就强制返回。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？回答：两层防线。第一层是在系统侧用 JSON Schema 做参数校验，不合规直接拦住不执行，把校验错误信息包装成 tool_result 返回给 LLM，大多数模型看到具体的报错信息后会自己修正参数重新调用。第二层是设置重试上限，一般 3 次，避免来回纠错死循环。- &lt;strong&gt;提问&lt;/strong&gt;：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：各工具的执行结果是独立回传的，失败的那个单独返回错误信息，成功的正常返回结果。所有 tool_result 一起发回给 LLM，让它自己判断：可能只用成功的那几个结果就够了，也可能决定重试失败的那个。不需要全部成功才继续，这跟 Promise.allSettled 的思路一样。- &lt;strong&gt;提问&lt;/strong&gt;：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：RAG 是”提前检索、一次性注入”，把相关文档片段塞进 prompt 就完事了，适合知识查询类的场景。Tool Calling 是”按需执行、多轮交互”，LLM 在推理过程中动态决定要不要调、调哪个，适合需要实时数据、需要执行副作用的场景，比如查数据库、发请求、操作文件系统。简单说，RAG 解决”LLM 不知道的事”，Tool Calling 解决”LLM 做不到的事”。- &lt;strong&gt;提问&lt;/strong&gt;：怎么让 LLM 更准确地选择正确的工具？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：工具的 description 写得好不好直接决定调用准确率。description 要写清楚这个工具干什么、什么场景该用、什么场景不该用。参数的 description 也一样重要，别偷懒写个”id”就完了，要写明白”用户的唯一标识符，必须是数字格式”。另外工具数量不能太多，超过 15-20 个的时候 LLM 选择准确率会明显下降，这时候要么分场景加载不同的工具集，要么做一层路由先判断意图再加载对应工具。作者：Yes面试鸭官方- 工具定义：工具本质是一段 JSON Schema，包含工具名字、一段自然语言描述、参数的类型约束。&lt;/li&gt;
&lt;li&gt;LLM角色调用：受到用户消息和工具列表后，判断当前问题得调用工具，返回一个特殊的tool_use 消息，里面带着工具名和填好的参数 JSON展开新页面打开2026-03-14  11:4200回复添加回答编辑预览请输入回答内容…（支持使用 Markdown ）xMarkdown 语法一级标题# 标题二级标题## 标题三级标题### 标题粗体&lt;strong&gt;粗体文本&lt;/strong&gt;斜体&lt;em&gt;斜体文本&lt;/em&gt;引用&amp;gt; 引用文本链接&lt;a href=&quot;url&quot;&gt;链接描述&lt;/a&gt;图片&lt;figure&gt;&lt;img /&gt;&lt;figcaption&gt;alt&lt;/figcaption&gt;&lt;/figure&gt;代码&lt;code&gt;代码&lt;/code&gt;代码块&lt;code&gt;编程语言↵无序列表- 项目有序列表1. 项目分割线---删除线~~文本~~任务列表- [ ] 待办事项行内公式$公式$块级公式$$↵公式↵$$Mermaid图表&lt;/code&gt;mermaid快捷键粗体Ctrl-B斜体Ctrl-I链接Ctrl-K图片Shift-Ctrl-I代码Shift-Ctrl-K代码块Shift-Ctrl-C无序列表Shift-Ctrl-U有序列表Shift-Ctrl-O目录字数:0行数:1回到顶部提交目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从 Function Calling 到 Tool Calling 的演进工具结果的上下文管理安全和权限控制错误处理和重试&lt;/p&gt;&lt;p&gt;提问：如果 LLM 返回的工具参数格式不对，比如少了必填字段或者类型不匹配，你怎么处理？提问：parallel tool calls 并行执行多个工具的时候，如果其中一个失败了怎么办？提问：Tool Calling 和 RAG 都是给 LLM 补充外部信息，它们的边界在哪？提问：怎么让 LLM 更准确地选择正确的工具？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>请解释大模型微调(Fine tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？ 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%AF%B7%E8%A7%A3%E9%87%8A%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83-fine-tuning-%E7%9A%84%E5%8E%9F%E7%90%86-%E5%B9%B6%E8%AF%B4%E6%98%8E%E5%9C%A8%E4%BB%80%E4%B9%88%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF%E4%B8%8B%E9%9C%80%E8%A6%81%E5%BE%AE%E8%B0%83%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E5%9F%BA%E7%A1%80%E6%A8%A1%E5%9E%8B-_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E8%AF%B7%E8%A7%A3%E9%87%8A%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83-fine-tuning-%E7%9A%84%E5%8E%9F%E7%90%86-%E5%B9%B6%E8%AF%B4%E6%98%8E%E5%9C%A8%E4%BB%80%E4%B9%88%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF%E4%B8%8B%E9%9C%80%E8%A6%81%E5%BE%AE%E8%B0%83%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E5%9F%BA%E7%A1%80%E6%A8%A1%E5%9E%8B-_%E6%95%B4%E7%90%86/</guid><description># 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？ ## 问题 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？ ## 标准回</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;a href=&quot;#请解释大模型微调fine-tuning的原理并说明在什么业务场景下需要微调而不是直接使用基础模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/p&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;扩展知识&lt;a href=&quot;#扩展知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;主流微调方法对比&lt;a href=&quot;#主流微调方法对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;微调 vs Prompt 工程 vs RAG&lt;a href=&quot;#微调-vs-prompt-工程-vs-rag&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;实践中的坑&lt;a href=&quot;#实践中的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;答案&lt;a href=&quot;#答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;微调的过拟合风险如何通过正则化缓解？上次浏览：2026-03-16 15:06:11请详细讨论微调时如何防止灾难性遗忘问题？在多模态微调（如图文生成）中，如何确保文本和图像数据的对齐质量？上次浏览：2026-03-16 15:02:13请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？上次浏览：2026-03-16 15:02:32解释LangChain框架中的Chain和Agent概念，并举例说明各自的应用场景上次浏览：2026-03-16 15:02:59什么是大模型的”涌现能力”？列举三种典型表现并解释其可能成因要让AI生成一个带表单验证的Vue3组件，请写出包含以下要素的Prompt上次浏览：2026-03-16 15:06:23假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）上次浏览：2026-03-16 15:07:05请描述使用LangChain构建一个文档问答系统的关键技术组件及实现步骤上次浏览：2026-03-16 15:07:08假设要开发一个智能工单分类系统，请拆解AI可参与的环节并说明技术选型思路11326. 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/p&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;a href=&quot;#请解释大模型微调fine-tuning的原理并说明在什么业务场景下需要微调而不是直接使用基础模型-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。&lt;/li&gt;
&lt;li&gt;本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。&lt;/li&gt;
&lt;li&gt;微调的核心原理是迁移学习。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/p&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;p&gt;微调的过拟合风险如何通过正则化缓解？上次浏览：2026-03-16 15:06:11请详细讨论微调时如何防止灾难性遗忘问题？在多模态微调（如图文生成）中，如何确保文本和图像数据的对齐质量？上次浏览：2026-03-16 15:02:13请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？上次浏览：2026-03-16 15:02:32解释LangChain框架中的Chain和Agent概念，并举例说明各自的应用场景上次浏览：2026-03-16 15:02:59什么是大模型的”涌现能力”？列举三种典型表现并解释其可能成因要让AI生成一个带表单验证的Vue3组件，请写出包含以下要素的Prompt上次浏览：2026-03-16 15:06:23假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）上次浏览：2026-03-16 15:07:05请描述使用LangChain构建一个文档问答系统的关键技术组件及实现步骤上次浏览：2026-03-16 15:07:08假设要开发一个智能工单分类系统，请拆解AI可参与的环节并说明技术选型思路11326. 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/p&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;来源: 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？.mhtml&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;
&lt;h1&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;a href=&quot;#请解释大模型微调fine-tuning的原理并说明在什么业务场景下需要微调而不是直接使用基础模型-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h1&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？&lt;a href=&quot;#请解释大模型微调fine-tuning的原理并说明在什么业务场景下需要微调而不是直接使用基础模型-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;微调的过拟合风险如何通过正则化缓解？上次浏览：2026-03-16 15:06:11请详细讨论微调时如何防止灾难性遗忘问题？在多模态微调（如图文生成）中，如何确保文本和图像数据的对齐质量？上次浏览：2026-03-16 15:02:13请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？上次浏览：2026-03-16 15:02:32解释LangChain框架中的Chain和Agent概念，并举例说明各自的应用场景上次浏览：2026-03-16 15:02:59什么是大模型的”涌现能力”？列举三种典型表现并解释其可能成因要让AI生成一个带表单验证的Vue3组件，请写出包含以下要素的Prompt上次浏览：2026-03-16 15:06:23假设需要让大模型生成一个React表单组件代码，请设计一个包含上下文约束的Prompt（需包含数据验证、错误提示等要求）上次浏览：2026-03-16 15:07:05请描述使用LangChain构建一个文档问答系统的关键技术组件及实现步骤上次浏览：2026-03-16 15:07:08假设要开发一个智能工单分类系统，请拆解AI可参与的环节并说明技术选型思路11326. 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？大模型微调是在预训练模型的基础上，用特定领域的数据集继续训练，让模型的权重朝着目标任务的方向调整。本质上是在通用知识的基础上”精雕细琢”，让模型在某个垂直领域表现得更专业。微调的核心原理是迁移学习。预训练模型已经在海量数据上学会了语言的通用规律，微调就是在这个基础上，用少量的领域数据让模型学会特定领域的表达方式和知识。打个比方，预训练模型像是读完了整个图书馆的通才，微调就是让它去医院实习三个月，变成一个懂医学的通才。什么时候需要微调而不是直接用基础模型？主要看这几种情况：1）专业领域应用。比如医疗诊断、法律咨询这类场景，GPT 对骨科、心内科的专业术语和诊疗逻辑掌握得不够深，直接拿来用容易出错。这时候用 10 万条专科病历数据做微调，准确率能从 60% 提到 90% 以上。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;2） 数据安全要求高的场景。金融机构、政府部门的内部数据不能传到 OpenAI 的服务器上，只能把 LLaMA、Qwen 这类开源模型拉下来，在自己的机房里微调部署。&lt;/p&gt;&lt;p&gt;3） 特定任务需要稳定输出。像客服机器人、代码补全这类场景，用 Prompt 工程虽然也能跑，但输出格式不稳定，token 消耗大。微调一版专用模型，响应速度快、成本低，还不用每次都塞一堆 few-shot 示例。&lt;/p&gt;&lt;p&gt;微调的底层原理预训练阶段，模型在 TB 级别的文本上做自回归训练，学会了”给定前文预测下一个词”的能力。这个过程会消耗几千张 A100 跑几个月，成本上千万美元。微调阶段的学习率通常比预训练低 1-2 个数量级，比如预训练用 1e-4，微调可能用 1e-5 或 2e-6。原因是预训练模型的参数已经在一个相对优秀的位置了，学习率太大会把这些好的权重带偏，造成灾难性遗忘，模型忘掉原来学会的通用能力。训练数据量上，全参数微调一般需要 1 万到 10 万条高质量样本，LoRA 这类参数高效方法可能几千条就能起效。数据格式通常是 instruction-input-output 三元组，或者直接是 QA 对。&lt;/p&gt;&lt;p&gt;目前业界常用的微调方法分两大类：全参数微调直接更新模型所有参数，效果最好但资源消耗也最大。一个 7B 参数的模型全参微调，至少需要 80GB 显存（A100 80G 或者 2 张 A100 40G），训练 1 万条数据大概跑 2-3 小时。参数高效微调只更新一小部分参数，其他参数冻结。代表方法有：LoRA 在原始权重矩阵旁边插入两个低秩矩阵 A 和 B，只训练这两个小矩阵。7B 模型用 LoRA 微调，显存需求降到 24GB 左右，一张 RTX 4090 就能跑，可训练参数量只有原来的 0.1%-1%。QLoRA 在 LoRA 基础上加了 4bit 量化，显存进一步压到 12GB 以下，消费级显卡也能微调大模型。Adapter 在 Transformer 层之间插入小型全连接模块，训练时只更新 Adapter 的参数。Prefix-tuning 在输入前面拼接可学习的虚拟 token，只训练这些前缀向量。| 方法 | 可训练参数占比 | 显存需求 |（7B模型）适用场景| 全参数微调 | 100% | 80GB+ |追求极致效果，资源充足| LoRA | 0.1%-1% | 24GB |资源有限，多任务切换| QLoRA | 0.1%-1% | 12GB |消费级显卡，个人开发者| Adapter | 1%-5% | 30GB |需要频繁切换任务&lt;/p&gt;&lt;p&gt;这三种方法都能让模型适配特定任务，但适用场景不同：Prompt 工程适合快速验证，不需要训练，改改提示词就能跑。缺点是每次推理都要塞一堆 few-shot 示例，token 消耗大，context window 有限，塞不下太多背景知识。RAG适合知识库场景，把问题扔给向量数据库检索相关文档，再喂给模型生成答案。好处是知识可以实时更新，不用重新训练。缺点是检索质量依赖 embedding 模型和切分策略，复杂推理能力还得靠模型本身。微调适合模型能力本身不够的情况，比如需要学会特定的推理模式、输出格式、领域术语。知识直接编码进参数里，推理时不需要额外的 context。实际项目中这三种方法经常组合使用。比如先微调一版领域模型，再用 RAG 补充实时知识，最后用 Prompt 控制输出格式。&lt;/p&gt;&lt;p&gt;1） 数据质量比数量重要得多。1000 条高质量的 instruction 数据，效果可能比 10 万条噪声数据好。数据里如果有矛盾的标注，模型会学得很混乱。&lt;/p&gt;&lt;p&gt;2） 验证集要足够有代表性。很多人只看训练 loss 下降就觉得微调成功了，结果拿去用发现效果很差。一定要留出 10%-20% 的数据做验证，而且验证集要覆盖实际使用的各种场景。&lt;/p&gt;&lt;p&gt;3） 灾难性遗忘。微调过度模型会忘掉原来的通用能力，只会回答训练集里见过的问题。可以在微调数据里混入一部分通用数据，或者用 LoRA 这种方法，原始参数不动就不会遗忘。&lt;/p&gt;&lt;p&gt;4） 过拟合。小数据集微调几轮效果很好，多跑几轮反而变差。一般 3-5 个 epoch 就够了，超过 10 个 epoch 基本都是在过拟合。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提问&lt;/strong&gt;：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？回答：LoRA 的核心思路是，微调过程中权重的变化量是低秩的，不需要更新整个权重矩阵。假设原始权重矩阵 W 是 d×k 维，LoRA 把增量 ΔW 分解成两个小矩阵 A（d×r）和 B（r×k）的乘积，r 通常取 8 或 16，远小于 d 和 k。这样可训练参数从 d×k 变成 d×r + r×k，比如 4096×4096 的矩阵用 rank=16，参数量从 1600 万降到 13 万，压缩了 100 多倍。推理时把 BA 加回原始权重就行，不增加推理延迟。- &lt;strong&gt;提问&lt;/strong&gt;：怎么判断一个任务应该用微调还是 RAG？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：看任务的核心瓶颈在哪。如果是知识不够，比如模型不知道公司内部的产品文档、最新的法规政策，用 RAG 更合适，知识更新也方便。如果是能力不够，比如模型不会按特定格式输出、不会做某种类型的推理，那得微调，RAG 再怎么检索也补不上能力短板。还有一个考量是实时性，RAG 的知识库可以随时更新，微调一次成本高、周期长。- &lt;strong&gt;提问&lt;/strong&gt;：微调后模型效果变差了，怎么排查？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回答&lt;/strong&gt;：首先看训练数据有没有问题，比如标注错误、格式不对、数据重复。然后看学习率是不是太大了，可以降到原来的 1/5 试试。再看有没有过拟合，训练 loss 一直降但验证 loss 开始上升就是过拟合了，减少 epoch 或者加 dropout。最后检查是不是灾难性遗忘，用原来预训练模型擅长的任务测一下，如果这些任务也变差了，说明微调数据太单一，需要混入通用数据。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;微调的底层原理&lt;/p&gt;&lt;p&gt;提问：LoRA 的低秩分解具体是怎么工作的？为什么能省这么多参数？提问：怎么判断一个任务应该用微调还是 RAG？提问：微调后模型效果变差了，怎么排查？热门面试题目榜更多说说 Java 中 HashMap 的原理？9130Java 中的序列化和反序列化是什么？6255MySQL 索引的最左前缀匹配原则是什么？5662Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别？5067Java 中有哪些集合类？请简单介绍4854MySQL 的索引类型有哪些？4845详细描述一条 SQL 语句在 MySQL 中的执行过程。4218什么是 RAG？RAG 的主要流程是什么？4151MySQL 的存储引擎有哪些？它们之间有什么区别？4092数据库的脏读、不可重复读和幻读分别是什么？3900推荐教程更多AI 超级智能体亿级流量点赞系统教程智能协同云图库项目教程预览用户交流一起刷题学习、求职交流、反馈建议、获取更新通知面试鸭《用户协议》《隐私政策》友情链接编程导航老鱼简历代码小抄剪切助手联系我们商务合作站长：程序员鱼皮关注我们扫码关注面试鸭公众号&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;blockquote&gt;&lt;p&gt;来源: 请解释大模型微调(Fine-tuning)的原理，并说明在什么业务场景下需要微调而不是直接使用基础模型？.mhtml&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>长上下文openclaw如何处理 整理</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E9%95%BF%E4%B8%8A%E4%B8%8B%E6%96%87openclaw%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86_%E6%95%B4%E7%90%86/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E9%95%BF%E4%B8%8A%E4%B8%8B%E6%96%87openclaw%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86_%E6%95%B4%E7%90%86/</guid><description># 长上下文openclaw如何处理 ## 问题 长上下文openclaw如何处理 ## 标准回答 LLM的上下文窗口有限，长对话时容易&quot;爆窗&quot;，导致请求失败或Agent&quot;失忆&quot;。 OpenClaw的四层防护机制 Context Pruni</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;长上下文openclaw如何处理&lt;a href=&quot;#长上下文openclaw如何处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题&lt;a href=&quot;#问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;长上下文openclaw如何处理&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;标准回答&lt;a href=&quot;#标准回答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;LLM的上下文窗口有限，长对话时容易”爆窗”，导致请求失败或Agent”失忆”。&lt;/p&gt;&lt;p&gt;OpenClaw的四层防护机制
Context Pruning（上下文修剪） - 轻量修剪&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;作用：定期清理早期、不重要的内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键策略：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护系统提示和最近3轮对话（保持连贯性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;裁剪早期的工具返回结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分两级阈值：30%时裁剪，50%时替换为占位符&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类比：清理手机缓存，保留核心应用
Tool Result Context Guard（工具返回兜底） - 实时防护&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作用：发送给LLM前最后一层安全检查&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工作流程：
计算可用预算 = 窗口大小 × 0.75（预留余量）
截断超长的单条工具返回（优先保留错误信息）
如总量仍超，替换最早的旧结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;价值：确保永远不会因工具返回过大而请求失败
Memory Flush（记忆刷盘） - 关键信息备份&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发：在准备压缩前&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作：Agent自主将关键信息写到文件（memory/YYYY-MM-DD.md）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目的：防止压缩时丢失重要细节
Compaction（压缩） - 历史对话摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法：用LLM将100条对话压缩成一段摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优化：采用”滚动摘要”，摘要也可被再次压缩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护：要求保留URL、文件名等不可重建的标识符&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;设计亮点&lt;/p&gt;&lt;p&gt;分层渐进&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;从轻到重，避免过早使用”重”压缩&lt;/li&gt;
&lt;li&gt;能小修就不大动&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;智能截断&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具返回截断时，检测并优先保留错误信息&lt;/li&gt;
&lt;li&gt;避免”执行200行日志，最后报错”被误判为成功&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;时间与空间平衡&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Context Pruning处理早期空间（旧内容）&lt;/li&gt;
&lt;li&gt;Memory Flush处理关键信息（语义记忆）&lt;/li&gt;
&lt;li&gt;Compaction处理时间序列（历史对话）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;回答示例&lt;/p&gt;&lt;p&gt;面试官：长对话时如何保证Agent不”失忆”？&lt;/p&gt;&lt;p&gt;您可以回答：&lt;/p&gt;&lt;p&gt;OpenClaw采用四层渐进式防御策略：
日常修剪：定期清理早期的工具返回，但保留核心指令和最近对话
实时兜底：每次发请求前做安全检查，保证不超窗口限制
关键备份：压缩前先把重要信息存到文件
历史压缩：用LLM把长对话压缩成摘要&lt;/p&gt;&lt;p&gt;这四层分别对应：空间清理、实时防护、信息备份、时间压缩。既保证不”失忆”，又控制成本。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;面试官追问&lt;a href=&quot;#面试官追问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果压缩时丢了重要信息怎么办？&lt;/p&gt;&lt;p&gt;您可以回答：&lt;/p&gt;&lt;p&gt;这是分层防御的价值所在。压缩前有Memory Flush，让Agent自己决定什么重要，先存到文件。压缩后有标识符保留，不会丢失文件名、URL这类关键引用。即使真的需要原始信息，文件类的结果可以重新读取工具获取。
这个解释层次清晰，突出了OpenClaw的核心设计理念：分层、渐进、有保障。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;关键点&lt;a href=&quot;#关键点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LLM的上下文窗口有限，长对话时容易”爆窗”，导致请求失败或Agent”失忆”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw的四层防护机制
Context Pruning（上下文修剪） - 轻量修剪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作用：定期清理早期、不重要的内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键策略：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护系统提示和最近3轮对话（保持连贯性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;裁剪早期的工具返回结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分两级阈值：30%时裁剪，50%时替换为占位符&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类比：清理手机缓存，保留核心应用
Tool Result Context Guard（工具返回兜底） - 实时防护&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作用：发送给LLM前最后一层安全检查&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工作流程：
计算可用预算 = 窗口大小 × 0.75（预留余量）
截断超长的单条工具返回（优先保留错误信息）
如总量仍超，替换最早的旧结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;价值：确保永远不会因工具返回过大而请求失败
Memory Flush（记忆刷盘） - 关键信息备份&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发：在准备压缩前&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作：Agent自主将关键信息写到文件（memory/YYYY-MM-DD.md）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目的：防止压缩时丢失重要细节
Compaction（压缩） - 历史对话摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法：用LLM将100条对话压缩成一段摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优化：采用”滚动摘要”，摘要也可被再次压缩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护：要求保留URL、文件名等不可重建的标识符&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;设计亮点&lt;/p&gt;&lt;p&gt;分层渐进&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;从轻到重，避免过早使用”重”压缩&lt;/li&gt;
&lt;li&gt;能小修就不大动&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;智能截断&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具返回截断时，检测并优先保留错误信息&lt;/li&gt;
&lt;li&gt;避免”执行200行日志，最后报错”被误判为成功&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;时间与空间平衡&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Context Pruning处理早期空间（旧内容）&lt;/li&gt;
&lt;li&gt;Memory Flush处理关键信息（语义记忆）&lt;/li&gt;
&lt;li&gt;Compaction处理时间序列（历史对话）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;回答示例&lt;/p&gt;&lt;p&gt;面试官：长对话时如何保证Agent不”失忆”？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;您可以回答：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw采用四层渐进式防御策略：
日常修剪：定期清理早期的工具返回，但保留核心指令和最近对话
实时兜底：每次发请求前做安全检查，保证不超窗口限制
关键备份：压缩前先把重要信息存到文件
历史压缩：用LLM把长对话压缩成摘要&lt;/p&gt;&lt;p&gt;这四层分别对应：空间清理、实时防护、信息备份、时间压缩。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;既保证不”失忆”，又控制成本。&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果压缩时丢了重要信息怎么办？&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;备注&lt;a href=&quot;#备注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;问题&lt;a href=&quot;#问题-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;长上下文openclaw如何处理&lt;/p&gt;&lt;p&gt;LLM的上下文窗口有限，长对话时容易”爆窗”，导致请求失败或Agent”失忆”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw的四层防护机制
Context Pruning（上下文修剪） - 轻量修剪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作用：定期清理早期、不重要的内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键策略：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护系统提示和最近3轮对话（保持连贯性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;裁剪早期的工具返回结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分两级阈值：30%时裁剪，50%时替换为占位符&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类比：清理手机缓存，保留核心应用
Tool Result Context Guard（工具返回兜底） - 实时防护&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;作用：发送给LLM前最后一层安全检查&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工作流程：
计算可用预算 = 窗口大小 × 0.75（预留余量）
截断超长的单条工具返回（优先保留错误信息）
如总量仍超，替换最早的旧结果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;价值：确保永远不会因工具返回过大而请求失败
Memory Flush（记忆刷盘） - 关键信息备份&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发：在准备压缩前&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作：Agent自主将关键信息写到文件（memory/YYYY-MM-DD.md）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目的：防止压缩时丢失重要细节
Compaction（压缩） - 历史对话摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方法：用LLM将100条对话压缩成一段摘要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优化：采用”滚动摘要”，摘要也可被再次压缩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保护：要求保留URL、文件名等不可重建的标识符&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;设计亮点&lt;/p&gt;&lt;p&gt;分层渐进&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;从轻到重，避免过早使用”重”压缩&lt;/li&gt;
&lt;li&gt;能小修就不大动&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;智能截断&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工具返回截断时，检测并优先保留错误信息&lt;/li&gt;
&lt;li&gt;避免”执行200行日志，最后报错”被误判为成功&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;时间与空间平衡&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Context Pruning处理早期空间（旧内容）&lt;/li&gt;
&lt;li&gt;Memory Flush处理关键信息（语义记忆）&lt;/li&gt;
&lt;li&gt;Compaction处理时间序列（历史对话）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;回答示例&lt;/p&gt;&lt;p&gt;面试官：长对话时如何保证Agent不”失忆”？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;您可以回答：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OpenClaw采用四层渐进式防御策略：
日常修剪：定期清理早期的工具返回，但保留核心指令和最近对话
实时兜底：每次发请求前做安全检查，保证不超窗口限制
关键备份：压缩前先把重要信息存到文件
历史压缩：用LLM把长对话压缩成摘要&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;这四层分别对应：空间清理、实时防护、信息备份、时间压缩。既保证不”失忆”，又控制成本。&lt;a href=&quot;#这四层分别对应空间清理实时防护信息备份时间压缩既保证不失忆又控制成本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果压缩时丢了重要信息怎么办？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;您可以回答：&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这是分层防御的价值所在。压缩前有Memory Flush，让Agent自己决定什么重要，先存到文件。压缩后有标识符保留，不会丢失文件名、URL这类关键引用。即使真的需要原始信息，文件类的结果可以重新读取工具获取。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;长上下文openclaw如何处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LLM的上下文窗口有限，长对话时容易”爆窗”，导致请求失败或Agent”失忆”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenClaw的四层防护机制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Context Pruning（上下文修剪） - 轻量修剪&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;作用：定期清理早期、不重要的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本文已做格式统一与噪声清理，保留原始语义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>阿里AI应用研发实习一面</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E9%98%BF%E9%87%8Cai%E5%BA%94%E7%94%A8%E7%A0%94%E5%8F%91%E5%AE%9E%E4%B9%A0%E4%B8%80%E9%9D%A2/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-agent%E9%9D%A2%E7%BB%8F-%E9%98%BF%E9%87%8Cai%E5%BA%94%E7%94%A8%E7%A0%94%E5%8F%91%E5%AE%9E%E4%B9%A0%E4%B8%80%E9%9D%A2/</guid><description># 阿里 AI 应用研发实习一面面经 &gt; 来源：小红书 @未知作者 &gt; 原文链接：https://www.xiaohongshu.com/discovery/item/6a054355000000003501fec8 &gt; 发布时间：2026</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;阿里 AI 应用研发实习一面面经&lt;a href=&quot;#阿里-ai-应用研发实习一面面经&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;来源：小红书 @未知作者
原文链接：&lt;a href=&quot;https://www.xiaohongshu.com/discovery/item/6a054355000000003501fec8&quot; target=&quot;_blank&quot;&gt;https://www.xiaohongshu.com/discovery/item/6a054355000000003501fec8&lt;/a&gt;
发布时间：2026-01-30
标签：面经、面试题、互联网大厂、AI Agent、RAG、JVM&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、AI Agent 相关&lt;a href=&quot;#一ai-agent-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI Agents 和大模型的本质区别是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agent 相比单纯的大模型对话进化在哪些方面？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;什么是 ReAct 框架？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它的工作原理是什么？解决了什么问题？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agent 的 Memory（记忆）机制有哪些？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请简要说明。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、RAG（检索增强生成）相关&lt;a href=&quot;#二rag检索增强生成相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAG 解决了大模型中的哪些问题？&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAG 系统中文档分块的策略有哪些？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如何选择适合自己的分块方式？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如何评估一个 RAG 系统的检索质量？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;追问：只看召回率吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索阶段的常见瓶颈是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如何定位问题？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;微调（Fine-tuning）与 RAG 的区别是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各自适合什么场景？在实际项目中如何决策？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、Java / JVM 基础&lt;a href=&quot;#三java--jvm-基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一个 Java 进程从启动后，其内存对象大概是如何分布的？&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;函数的临时变量存放在哪里？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;栈和堆是如何关联的？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;你用过或了解哪些垃圾回收算法？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最常用的是哪一种？&lt;/li&gt;
&lt;li&gt;追问：JVM 参数中可配置的 GC 算法/回收器。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、AI coding&lt;a href=&quot;#四ai-coding&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;面试官在 AI coding 环节&lt;strong&gt;没有直接评价完成质量&lt;/strong&gt;，但进行了以下深入追问：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;询问对题目的理解&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完成后要做什么（比如测试）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发过程中是否存在问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>大模型Transformer高频面试题</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-%E5%A4%A7%E6%A8%A1%E5%9E%8B-%E5%A4%A7%E6%A8%A1%E5%9E%8Btransformer%E9%AB%98%E9%A2%91%E9%9D%A2%E8%AF%95%E9%A2%98/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-%E5%A4%A7%E6%A8%A1%E5%9E%8B-%E5%A4%A7%E6%A8%A1%E5%9E%8Btransformer%E9%AB%98%E9%A2%91%E9%9D%A2%E8%AF%95%E9%A2%98/</guid><description># 大模型 &amp; Transformer 高频面试题及答案 &gt; 🎯 适用岗位：算法工程师、AI 应用开发、大模型研发 &gt; 📅 整理日期：2026-06-07 &gt; 💬 答案按面试口语化写，直接照着说就行 --- ## 一、Transformer</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;大模型 &amp;amp; Transformer 高频面试题及答案&lt;a href=&quot;#大模型--transformer-高频面试题及答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;🎯 适用岗位：算法工程师、AI 应用开发、大模型研发
📅 整理日期：2026-06-07
💬 答案按面试口语化写，直接照着说就行&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、Transformer 核心架构&lt;a href=&quot;#一transformer-核心架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：Transformer 的基本结构是什么？&lt;a href=&quot;#q1transformer-的基本结构是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Transformer 分两半——Encoder 和 Decoder，每半都是 N 个一样的层叠在一起。&lt;/p&gt;&lt;p&gt;单层 Encoder 就是：多头注意力 → 残差+归一化 → 前馈网络 → 残差+归一化。&lt;/p&gt;&lt;p&gt;Decoder 多了一步：先是带 mask 的自注意力（只能看当前和之前的 token），然后是交叉注意力（去拿 Encoder 的信息），最后才是前馈网络。&lt;/p&gt;&lt;p&gt;现在主流大模型分三种路线：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BERT 那种只用 Encoder&lt;/strong&gt;：双向注意力，擅长理解类任务，比如分类、实体识别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT/LLaMA 那种只用 Decoder&lt;/strong&gt;：单向注意力，擅长生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T5 那种 Encoder+Decoder&lt;/strong&gt;：适合翻译、摘要这种输入输出都很长的任务&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;追问：为什么现在大模型几乎都用 Decoder-only？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;主要几个原因：一是自回归的训练目标和推理完全一致，训练效率高；二是单向注意力天然适配 next-token prediction；三是工程上更简单，推理时 KV Cache 处理更自然；四是实验发现同等参数量下 Decoder-only 的 scaling 效果更好。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：Transformer 相比 RNN/LSTM 有什么优势？&lt;a href=&quot;#q2transformer-相比-rnnlstm-有什么优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最核心的就两点：&lt;strong&gt;并行&lt;/strong&gt;和&lt;strong&gt;长距离依赖&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;RNN 必须一个 token 一个 token 顺序算，没法并行，GPU 利用率低。Transformer 的注意力机制所有位置可以同时算，训练速度差了好几倍。&lt;/p&gt;&lt;p&gt;另外 RNN 处理长序列容易梯度消失，远处的信息传着传着就丢了。Transformer 的注意力是直接”看”到所有位置的，不管隔多远都是一步到位。&lt;/p&gt;&lt;p&gt;当然 Transformer 也有代价——注意力是 O(n²) 的复杂度，序列越长越吃内存，但总体来说在 GPU 上训练还是比 RNN 快得多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、Self-Attention 机制&lt;a href=&quot;#二self-attention-机制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q3：Self-Attention 的计算流程是什么？&lt;a href=&quot;#q3self-attention-的计算流程是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;简单说就三步：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;输入先过三个线性层，分别得到 Q（查询）、K（键）、V（值）&lt;/li&gt;
&lt;li&gt;Q 和 K 做点积算相似度，除以 √d_k 缩放一下，过 softmax 得到注意力权重&lt;/li&gt;
&lt;li&gt;用权重对 V 做加权求和，得到输出&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;用公式说就是：&lt;code&gt;Attention(Q,K,V) = softmax(Q·K^T / √d_k) · V&lt;/code&gt;&lt;/p&gt;&lt;p&gt;直觉上理解：Q 是”我想找什么”，K 是”我有什么”，Q·K^T 算的是匹配程度，V 是”找到之后给你什么内容”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：为什么要除以 √d_k？⭐超高频&lt;a href=&quot;#q4为什么要除以-d_k超高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;因为 d_k 一大，Q 和 K 的点积值就会变得很大，softmax 一收到很大的输入，输出就几乎变成 one-hot 了——只有一个位置接近 1，其他都接近 0。这时候梯度几乎为 0，模型就训不动了。&lt;/p&gt;&lt;p&gt;除以 √d_k 就是把点积值”拉回”正常范围，让 softmax 的输出更平滑，梯度能正常传播。&lt;/p&gt;&lt;p&gt;数学上解释的话：假设 Q 和 K 的每个元素都是均值为 0、方差为 1 的，那点积的方差就是 d_k，除以 √d_k 之后方差就归一化回 1 了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q5：Multi-Head Attention 的作用是什么？&lt;a href=&quot;#q5multi-head-attention-的作用是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;多头注意力就是让模型同时从不同角度去看输入。每个头学到的注意力模式不一样——有的头关注语法关系，有的关注语义关系，有的关注相邻词，有的关注远距离依赖。&lt;/p&gt;&lt;p&gt;如果只用一个大头，它只能学一种模式；用多个小头，每个头可以专门化，最后拼起来信息更丰富。&lt;/p&gt;&lt;p&gt;而且多头在计算上也更高效：每个头的维度是 d_model/h，多个头可以并行算，总计算量和单头差不多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q6：MHA / MQA / GQA 的区别？⭐高频&lt;a href=&quot;#q6mha--mqa--gqa-的区别高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这三个的区别就在于 K 和 V 是不是共享的：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MHA&lt;/strong&gt;（多头注意力）：每个头都有自己的 Q、K、V，效果最好但 KV Cache 最大，推理最慢&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MQA&lt;/strong&gt;（多查询注意力）：Q 还是每个头独立，但 K 和 V 所有头共享一份，推理最快但效果会掉一点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GQA&lt;/strong&gt;（分组查询注意力）：折中方案，把头分成几组，组内共享 K 和 V。比如 8 个头分 2 组，每组 4 个头共享一组 K、V&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;现在主流模型基本都选 GQA，比如 LLaMA-2/3、Mistral，用很小的质量损失换来了显著的推理加速和内存节省。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、位置编码&lt;a href=&quot;#三位置编码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q7：为什么 Transformer 需要位置编码？&lt;a href=&quot;#q7为什么-transformer-需要位置编码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;因为 Self-Attention 是”不分先后”的——你把输入的顺序打乱，Attention 算出来的结果只是对应位置换了一下，模型根本不知道谁在前谁在后。&lt;/p&gt;&lt;p&gt;“猫吃鱼”和”鱼吃猫”对 Attention 来说是一样的，这显然不行。所以得额外告诉模型每个 token 在哪个位置，这就是位置编码。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q8：RoPE 旋转位置编码是什么？为什么现在主流都用它？&lt;a href=&quot;#q8rope-旋转位置编码是什么为什么现在主流都用它&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;位置编码分几代：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绝对位置编码&lt;/strong&gt;（BERT 用的）：给每个位置一个固定向量，简单但超出训练长度就不行了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相对位置编码&lt;/strong&gt;（T5 用的）：编码的是两个 token 之间的距离，外推性好但实现复杂&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RoPE&lt;/strong&gt;（LLaMA、Qwen 用的）：用旋转矩阵把位置信息”转”进 Q 和 K 里，这样 Q·K^T 的点积天然就包含了相对位置信息&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;RoPE 厉害的地方在于它统一了绝对和相对位置编码的优点——实现简单，外推性好，所以现在基本是大模型的标配。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、KV Cache 与推理优化&lt;a href=&quot;#四kv-cache-与推理优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q9：什么是 KV Cache？为什么需要它？⭐超高频&lt;a href=&quot;#q9什么是-kv-cache为什么需要它超高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大模型生成文本是一个 token 一个 token 往外蹦的。每生成一个新 token，都要用前面所有 token 的 K 和 V 来算注意力。&lt;/p&gt;&lt;p&gt;问题是：前面那些 token 的 K 和 V 其实不会变，每次重新算是纯浪费。所以就把算过的 K 和 V 缓存起来，下次直接用，只算新 token 的就行。&lt;/p&gt;&lt;p&gt;没有 KV Cache 的话，生成第 t 个 token 要重新算前 t-1 个，复杂度是 O(t²)；有了之后只算当前 token 的，复杂度降到 O(t)。推理速度能快 5-10 倍，现在所有线上服务的大模型都用这个。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q10：为什么缓存 K 和 V，不缓存 Q？⭐超高频&lt;a href=&quot;#q10为什么缓存-k-和-v不缓存-q超高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;因为历史 token 的 K 和 V 在后续每一步都要被”查”到——新 token 的 Q 要和所有历史 token 的 K 算相似度，再用权重去取历史 token 的 V。所以缓存 K 和 V 有实实在在的收益。&lt;/p&gt;&lt;p&gt;但 Q 不一样——每个 token 的 Q 只在当前这一步用，下一步的 Q 是新 token 产生的，跟之前的 Q 没关系。所以缓存 Q 没有任何加速效果，不是”不能”缓存，是缓存了也没用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q11：常见的推理加速方法有哪些？&lt;a href=&quot;#q11常见的推理加速方法有哪些&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;主要有这几个：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KV Cache&lt;/strong&gt;：缓存历史 K/V 避免重复计算，5-10 倍加速，没有精度损失&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：把模型权重从 FP16 压到 INT8 甚至 INT4，2-4 倍加速，精度损失很小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GQA/MQA&lt;/strong&gt;：减少 K/V 的头数，降低内存和计算量，1.5-3 倍加速&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speculative Decoding（投机解码）&lt;/strong&gt;：用小模型先猜几个 token，大模型并行验证，猜对了就一次接受多个，2-3 倍加速，精度无损&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Batching&lt;/strong&gt;：动态把不同请求拼在一起，提高 GPU 利用率，吞吐能翻好几倍&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;五、大模型训练与对齐&lt;a href=&quot;#五大模型训练与对齐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q12：大模型的训练流程是什么？&lt;a href=&quot;#q12大模型的训练流程是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;分三步走：&lt;strong&gt;预训练 → SFT → RLHF/DPO&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;预训练&lt;/strong&gt;：用海量无标注文本（万亿级 token），目标是 next-token prediction。这一步最贵，烧掉 99% 的算力和数据，让模型学会语言的基本规律和世界知识。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SFT（有监督微调）&lt;/strong&gt;：用几万条高质量的”指令-回答”对，教模型听懂人的指令、按格式回答。这一步成本中等，但很关键，是从”语言模型”变成”助手”的关键一步。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;RLHF/DPO（对齐训练）&lt;/strong&gt;：用人类偏好数据，让模型的回答更符合人的价值观——更有用、更安全、更诚实。这一步成本相对低，但决定了模型的”性格”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q13：RLHF 的流程是什么？&lt;a href=&quot;#q13rlhf-的流程是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;两步：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步，训练奖励模型&lt;/strong&gt;：让人对同一个问题的多个回答排序，用这些排序数据训练一个打分模型，它能给回答打出一个”人类偏好分数”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步，用 PPO 强化学习优化&lt;/strong&gt;：让大模型生成回答，奖励模型打分，用 PPO 算法根据分数更新大模型。同时加一个 KL 散度惩罚，防止模型为了拿高分而变得太极端。&lt;/p&gt;&lt;p&gt;RLHF 的问题：奖励模型可能被”钻空子”（reward hacking），PPO 训练不稳定、超参难调，而且需要同时跑 4 个模型（策略模型、参考模型、奖励模型、价值模型），显存开销很大。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q14：DPO 和 RLHF 的区别？⭐高频&lt;a href=&quot;#q14dpo-和-rlhf-的区别高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;DPO 本质上是 RLHF 的简化版。&lt;/p&gt;&lt;p&gt;RLHF 要两步：先训练奖励模型，再用 PPO 做强化学习。DPO 把这两步合成一步——直接用人类偏好数据（好回答 vs 差回答）来优化策略模型，不需要单独的奖励模型，也不需要 PPO。&lt;/p&gt;&lt;p&gt;好处很明显：训练更稳定（不像 PPO 那么多超参要调），只需要 2 个模型而不是 4 个，实现也简单得多。&lt;/p&gt;&lt;p&gt;所以现在 DPO 基本成了对齐训练的主流选择，除非有特殊需求才会用 RLHF。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q15：LoRA 的原理是什么？⭐高频&lt;a href=&quot;#q15lora-的原理是什么高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;LoRA 的核心想法是：微调时不直接改原始权重，而是加一个低秩的”补丁”。&lt;/p&gt;&lt;p&gt;原始是 &lt;code&gt;Y = X·W&lt;/code&gt;，LoRA 变成 &lt;code&gt;Y = X·(W + B·A)&lt;/code&gt;，其中 B 和 A 是两个很小的矩阵，秩 r 远小于原始维度。&lt;/p&gt;&lt;p&gt;举个例子：如果原始权重是 4096×4096，有 1600 万参数；LoRA 用秩 8 的话，B 是 4096×8，A 是 8×4096，加起来才 6.5 万参数，&lt;strong&gt;减少了 99.6%&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;关键优势：一是训练参数极少，单卡就能微调大模型；二是推理时可以把 B·A 合并回 W，没有任何额外延迟；三是不同任务可以训练不同的 LoRA，随时切换。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;六、大模型架构与应用&lt;a href=&quot;#六大模型架构与应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q16：MoE（混合专家）是什么？&lt;a href=&quot;#q16moe混合专家是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MoE 的思路是：模型参数可以很大，但每个 token 只激活其中一小部分。&lt;/p&gt;&lt;p&gt;具体来说，每一层有多个”专家”（其实就是多个前馈网络），来一个 token 先过路由器（Gate），路由器选出最合适的 Top-K 个专家，只让这几个专家算，最后把结果加权求和。&lt;/p&gt;&lt;p&gt;比如 Mixtral 8×7B，总参数 46.7B，但每个 token 只用 12.9B 的参数，计算量跟 13B 的稠密模型差不多，效果却接近 47B 的。&lt;/p&gt;&lt;p&gt;挑战主要是：负载均衡（别让所有 token 都挤到同一个专家）、多卡通信开销大、显存占用还是按总参数来的。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q17：RAG 和微调的区别？怎么选？⭐高频&lt;a href=&quot;#q17rag-和微调的区别怎么选高频&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;RAG 是给模型外挂一个知识库，每次提问先检索相关内容，塞进 prompt 里让模型基于检索结果回答。微调是用特定数据继续训练模型，把知识”写进”权重里。&lt;/p&gt;&lt;p&gt;核心区别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;知识更新&lt;/strong&gt;：RAG 改检索库就行，实时更新；微调得重新训练&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;幻觉控制&lt;/strong&gt;：RAG 有检索结果做依据，幻觉少；微调全靠模型”记忆”，容易编&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本&lt;/strong&gt;：RAG 不用训练，成本低；微调要 GPU 和数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;擅长的事&lt;/strong&gt;：RAG 擅长知识密集型问答，微调擅长调整风格、格式、特定能力&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;选哪个？需要实时知识就 RAG，需要特定风格/能力就微调，两者都要就 RAG + 微调一起上。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q18：大模型的幻觉问题怎么缓解？&lt;a href=&quot;#q18大模型的幻觉问题怎么缓解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大模型幻觉的根本原因是：它是概率语言模型，不是知识库，生成的是”看起来合理”的文本，不保证事实正确。&lt;/p&gt;&lt;p&gt;缓解方法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG&lt;/strong&gt;：最直接，给模型提供外部知识做依据，效果最好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CoT（思维链）&lt;/strong&gt;：让模型一步步推理，中间步骤可以检查，减少跳步出错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对齐训练&lt;/strong&gt;：RLHF/DPO 训练时惩罚幻觉输出，让模型学会说”我不知道”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统提示&lt;/strong&gt;：在 prompt 里明确要求”不确定就说不知道”，简单但有效&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;实际中一般是 RAG + CoT + 对齐训练三板斧一起用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q19：什么是思维链（CoT）？&lt;a href=&quot;#q19什么是思维链cot&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CoT 就是让模型把推理过程写出来，而不是直接给答案。&lt;/p&gt;&lt;p&gt;有几种用法：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero-shot CoT&lt;/strong&gt;：最简单，在 prompt 末尾加一句”Let’s think step by step”，模型就会自动展开推理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Few-shot CoT&lt;/strong&gt;：给几个带推理过程的示例，模型照着格式来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Consistency&lt;/strong&gt;：多次采样取多数结果，更可靠但更慢&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;为什么 CoT 有效？因为复杂问题一步算出来容易错，拆成多个简单步骤每步出错的概率就低多了。而且中间步骤可以人工检查，方便定位问题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;🎯 速记口诀&lt;a href=&quot;#-速记口诀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Transformer 核心：Self-Attention + 位置编码 + 残差 + LayerNorm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Attention 缩放：除以 √d_k，不然 softmax 变 one-hot，梯度消失&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;位置编码：RoPE 是主流，统一绝对+相对&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;KV Cache：缓存历史 K/V 省重复计算，Q 不用缓存因为只用一次&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MHA→GQA：质量和速度的折中，LLaMA-2/3 的选择&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;训练三步曲：预训练 → SFT → RLHF/DPO&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DPO vs RLHF：DPO 不需要奖励模型，更简单稳定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LoRA：低秩补丁，训练 0.1% 参数，推理零延迟&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RAG vs 微调：要实时知识用 RAG，要风格能力用微调&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;幻觉缓解：RAG + CoT + 对齐训练 三板斧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>ping curl 排查面试题</title><link>https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80-ping-curl-%E6%8E%92%E6%9F%A5%E9%9D%A2%E8%AF%95%E9%A2%98/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E6%B1%82%E8%81%8C%E4%BD%9C%E6%88%98%E5%AE%A4-%E9%9D%A2%E7%BB%8F-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80-ping-curl-%E6%8E%92%E6%9F%A5%E9%9D%A2%E8%AF%95%E9%A2%98/</guid><description># Ping / Curl 服务不通 —— 面试高频问题及答案 &gt; 🎯 适用岗位：运维工程师、SRE、后端开发、网络工程师 &gt; 📅 整理日期：2026-06-07 --- ## 一、核心概念：ping 和 curl 到底有什么区别？ | 维</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Ping / Curl 服务不通 —— 面试高频问题及答案&lt;a href=&quot;#ping--curl-服务不通--面试高频问题及答案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;🎯 适用岗位：运维工程师、SRE、后端开发、网络工程师
📅 整理日期：2026-06-07&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、核心概念：ping 和 curl 到底有什么区别？&lt;a href=&quot;#一核心概念ping-和-curl-到底有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;ping&lt;/th&gt;&lt;th&gt;curl&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;协议&lt;/td&gt;&lt;td&gt;ICMP（网络层）&lt;/td&gt;&lt;td&gt;HTTP/HTTPS（应用层，底层走 TCP）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;能测什么&lt;/td&gt;&lt;td&gt;主机是否在线、网络是否可达&lt;/td&gt;&lt;td&gt;服务端口是否开放、HTTP 服务是否正常响应&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不能测什么&lt;/td&gt;&lt;td&gt;端口状态、服务状态&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;常被拦截&lt;/td&gt;&lt;td&gt;ICMP 常被防火墙/云安全组禁掉&lt;/td&gt;&lt;td&gt;TCP 端口可能被防火墙/安全组拦截&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;面试关键句&lt;/strong&gt;：ping 通只说明 ICMP 可达，不代表服务可用；ping 不通也不代表服务不可用，可能只是 ICMP 被禁。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、六大经典场景 Q&amp;amp;A&lt;a href=&quot;#二六大经典场景-qa&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：能 ping 通，但 curl 不通，可能的原因有哪些？&lt;a href=&quot;#q1能-ping-通但-curl-不通可能的原因有哪些&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答案（按排查优先级排列）&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务未启动 / 端口未监听&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ping 走 ICMP，只验证主机在线；curl 走 TCP，需要目标端口有进程监听&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;ss -tlnp | grep &amp;lt;端口&amp;gt;&lt;/code&gt; 或 &lt;code&gt;netstat -tlnp | grep &amp;lt;端口&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防火墙 / 安全组只放行了 ICMP，未放行 TCP 端口&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;云服务器安全组常见：只允许 ping（ICMP），未开放 80/443 等端口&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;iptables -L -n&lt;/code&gt; 检查本地防火墙；云控制台检查安全组规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务只监听了 127.0.0.1（localhost），未监听 0.0.0.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务绑定在回环地址，外部无法访问&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;ss -tlnp&lt;/code&gt; 看监听地址是 &lt;code&gt;127.0.0.1:8080&lt;/code&gt; 还是 &lt;code&gt;0.0.0.0:8080&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DNS 解析异常&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ping 可能走了 /etc/hosts 或不同 DNS，curl 解析到了错误 IP&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;nslookup 域名&lt;/code&gt; / &lt;code&gt;dig 域名&lt;/code&gt;，对比 ping 和 curl 解析的 IP 是否一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代理配置干扰&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;curl 默认读取 &lt;code&gt;http_proxy&lt;/code&gt; / &lt;code&gt;https_proxy&lt;/code&gt; 环境变量，可能走了代理&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;curl -v --noproxy &apos;*&apos; URL&lt;/code&gt; 跳过代理测试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTTPS 证书问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;curl 访问 HTTPS 时证书校验失败（自签证书、过期、域名不匹配）&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;curl -kv URL&lt;/code&gt; 跳过证书验证测试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务端拦截了 User-Agent 或请求头&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某些 WAF / CDN 会拦截非浏览器的请求&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;curl -A &quot;Mozilla/5.0&quot; URL&lt;/code&gt; 伪装 UA 测试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：ping 不通，但 curl 能通，可能的原因？&lt;a href=&quot;#q2ping-不通但-curl-能通可能的原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答案&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ICMP 被防火墙 / 安全组禁掉&lt;/strong&gt;（最常见）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;云服务器默认可能禁 ping；运维出于安全考虑主动禁 ICMP&lt;/li&gt;
&lt;li&gt;这是&lt;strong&gt;正常现象&lt;/strong&gt;，不代表服务有问题&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内核参数禁用了 ICMP 响应&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;net.ipv4.icmp_echo_ignore_all = 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;sysctl net.ipv4.icmp_echo_ignore_all&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中间路由器丢弃 ICMP 包&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某些网络设备/运营商策略丢弃 ICMP，但放行 TCP&lt;/li&gt;
&lt;li&gt;排查：&lt;code&gt;traceroute IP&lt;/code&gt; 看在哪一跳开始丢包&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;面试关键句&lt;/strong&gt;：ping 不通 ≠ 服务不可用，生产环境中 ICMP 被禁是常态，应以 TCP 端口连通性为准。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：ping 和 curl 都不通，怎么排查？&lt;a href=&quot;#q3ping-和-curl-都不通怎么排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答案（分层排查法，从底层到上层）&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;物理层 → 数据链路层 → 网络层 → 传输层 → 应用层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 1：检查本机网络&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;127.0.0.1&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 回环地址，验证 TCP/IP 协议栈&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;本机IP&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 验证网卡配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;默认网关&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# 验证到网关的连通性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 2：检查路由&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;traceroute&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 看数据包卡在哪一跳&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mtr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;# 实时跟踪，比 traceroute 更好用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;# 查看路由表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3：检查 DNS&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nslookup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;域名&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# DNS 能否解析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;域名&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IP&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# 如果 IP 能通但域名不通 → DNS 问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 4：检查端口连通性&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;telnet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;端口&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 测试 TCP 端口是否开放&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-zv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;端口&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 更灵活的端口探测&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 5：检查防火墙 / 安全组&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# 本地防火墙规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 云平台：检查安全组入方向规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 6：检查服务本身&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ss&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-tlnp&lt;/span&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;# 服务是否在监听&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;服务名&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 服务是否运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;服务名&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 查看服务日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：如何判断是服务端问题还是客户端问题？&lt;a href=&quot;#q4如何判断是服务端问题还是客户端问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答案&lt;/strong&gt;：&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;排查手段&lt;/th&gt;&lt;th&gt;服务端问题&lt;/th&gt;&lt;th&gt;客户端问题&lt;/th&gt;&lt;th&gt;中间网络问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;从其他机器 curl 同一地址&lt;/td&gt;&lt;td&gt;也不通&lt;/td&gt;&lt;td&gt;能通&lt;/td&gt;&lt;td&gt;部分能通&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;telnet/nc 测端口&lt;/td&gt;&lt;td&gt;连接被拒&lt;/td&gt;&lt;td&gt;超时&lt;/td&gt;&lt;td&gt;超时&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;traceroute&lt;/td&gt;&lt;td&gt;到达目标后丢包&lt;/td&gt;&lt;td&gt;第一跳就丢&lt;/td&gt;&lt;td&gt;中间某跳丢包&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;服务端 ss -tlnp&lt;/td&gt;&lt;td&gt;端口未监听&lt;/td&gt;&lt;td&gt;端口正常监听&lt;/td&gt;&lt;td&gt;端口正常监听&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;服务端日志&lt;/td&gt;&lt;td&gt;有报错&lt;/td&gt;&lt;td&gt;无异常&lt;/td&gt;&lt;td&gt;无异常&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;快速判断口诀&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connection refused&lt;/strong&gt; → 服务端没监听（服务端问题）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection timeout&lt;/strong&gt; → 防火墙拦截 / 路由不通（中间网络或客户端问题）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只有自己不通&lt;/strong&gt; → 客户端问题（本地防火墙/代理/DNS）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q5：curl 返回常见错误码的含义？&lt;a href=&quot;#q5curl-返回常见错误码的含义&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;错误码&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;排查方向&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (6) Could not resolve host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;DNS 解析失败&lt;/td&gt;&lt;td&gt;检查 DNS 配置、/etc/hosts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (7) Failed to connect&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCP 连接失败&lt;/td&gt;&lt;td&gt;端口未开放/防火墙拦截&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (28) Connection timed out&lt;/code&gt;&lt;/td&gt;&lt;td&gt;连接超时&lt;/td&gt;&lt;td&gt;防火墙丢包/路由不可达&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (35) SSL connect error&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SSL/TLS 握手失败&lt;/td&gt;&lt;td&gt;证书问题/协议版本不匹配&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (52) Empty reply from server&lt;/code&gt;&lt;/td&gt;&lt;td&gt;服务端断开连接&lt;/td&gt;&lt;td&gt;服务崩溃/负载均衡异常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl: (56) Recv failure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;接收数据失败&lt;/td&gt;&lt;td&gt;服务端异常关闭连接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTP 403&lt;/td&gt;&lt;td&gt;禁止访问&lt;/td&gt;&lt;td&gt;权限/WAF 拦截&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTP 502&lt;/td&gt;&lt;td&gt;网关错误&lt;/td&gt;&lt;td&gt;上游服务不可用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTP 503&lt;/td&gt;&lt;td&gt;服务不可用&lt;/td&gt;&lt;td&gt;服务过载/维护中&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q6：生产环境如何快速定位网络问题？&lt;a href=&quot;#q6生产环境如何快速定位网络问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;答案（三板斧）&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;斧一：curl -v（详细模式）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://目标地址:端口/路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;能看到：DNS 解析 → TCP 连接 → TLS 握手 → HTTP 请求/响应 的每一步，卡在哪一目了然。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;斧二：tcpdump（抓包分析）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 客户端抓包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tcpdump&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标端口&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-nn&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务端抓包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tcpdump&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;客户端IP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;服务端口&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-nn&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;客户端有 SYN，服务端没收到 → 中间网络丢包&lt;/li&gt;
&lt;li&gt;服务端收到 SYN 但没回 SYN-ACK → 防火墙拦截&lt;/li&gt;
&lt;li&gt;三次握手完成但数据传输异常 → 应用层问题&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;斧三：mtr（持续链路追踪）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mtr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rwbz&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;目标IP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;集成了 traceroute + ping，能看到每一跳的丢包率和延迟，定位问题节点。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、面试加分项&lt;a href=&quot;#三面试加分项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 画一张排查流程图&lt;a href=&quot;#1-画一张排查流程图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;服务不通&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├─ ping 通？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    ├─ 是 → ICMP 可达，问题在 TCP/应用层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    │         ├─ telnet/nc 测端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    │         │    ├─ 通 → 服务本身问题（日志/配置/代码）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    │         │    └─ 不通 → 防火墙/安全组/服务未启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    │         └─ curl -v 看具体卡在哪步&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│    └─ 否 → ICMP 也不通&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│              ├─ ping 网关通？→ 路由问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│              ├─ ping IP 通但域名不通？→ DNS 问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│              ├─ traceroute 看卡在哪跳 → 中间网络问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│              └─ 确认 ICMP 是否被禁（curl/telnet 测端口）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ 记住：永远以 TCP 连通性为准，ICMP 只是辅助&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 云环境特殊注意点&lt;a href=&quot;#2-云环境特殊注意点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全组&lt;/strong&gt;：入方向规则必须放行对应端口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络 ACL&lt;/strong&gt;：子网级别的访问控制，比安全组优先级更高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAT 网关&lt;/strong&gt;：影响出方向访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负载均衡&lt;/strong&gt;：健康检查失败会导致后端被摘除，curl 返回 502/503&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN&lt;/strong&gt;：缓存/回源问题可能导致部分节点不通&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 一句话总结（面试收尾用）&lt;a href=&quot;#3-一句话总结面试收尾用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;“排查网络问题的核心思路是&lt;strong&gt;分层排查&lt;/strong&gt;——从物理层到应用层逐层验证，用 curl -v 定位卡点，用 tcpdump 确认包是否到达，用 mtr 追踪链路。ping 只是辅助工具，生产环境以 TCP 端口连通性为准。“&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、速记口诀&lt;a href=&quot;#四速记口诀&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping 通 curl 不通 → 端口没开 / 防火墙拦 / 监听 127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping 不通 curl 通 → ICMP 被禁（正常现象）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;都不通 → 分层查：本机→网关→DNS→路由→防火墙→服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Connection refused → 服务端没监听&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Connection timeout → 防火墙/路由问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -v 是万能第一步&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>DS2API 部署使用指南</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-ds2api-%E9%83%A8%E7%BD%B2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-ds2api-%E9%83%A8%E7%BD%B2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid><description># ds2api 部署使用指南 &gt; 将 DeepSeek Web 对话能力转换为 OpenAI、Claude、Gemini 兼容 API 的中间件。 &gt; 项目地址：https://github.com/CJackHwang/ds2api （</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;ds2api 部署使用指南&lt;a href=&quot;#ds2api-部署使用指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;将 DeepSeek Web 对话能力转换为 OpenAI、Claude、Gemini 兼容 API 的中间件。
项目地址：&lt;a href=&quot;https://github.com/CJackHwang/ds2api&quot; target=&quot;_blank&quot;&gt;https://github.com/CJackHwang/ds2api&lt;/a&gt; （v4.6.1，已归档只读）&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、项目简介&lt;a href=&quot;#一项目简介&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ds2api 是一个用 &lt;strong&gt;Go&lt;/strong&gt; 编写的 DeepSeek Web → OpenAI 兼容 API 代理。它通过模拟 DeepSeek 网页端的对话流程，把网页能力转为标准 API 接口，支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;OpenAI &lt;code&gt;/v1/chat/completions&lt;/code&gt;（含流式响应）&lt;/li&gt;
&lt;li&gt;Claude &lt;code&gt;/v1/messages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gemini &lt;code&gt;/v1beta/models/.../generateContent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;WebUI 管理台（React 前端）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;与 qoder-cn-proxy 的区别：&lt;/strong&gt; qoder-cn-proxy 调用的是 Qoder CN 官方 API（需要 PAT Token）；ds2api 模拟的是 DeepSeek &lt;strong&gt;网页端&lt;/strong&gt;对话（需要 DeepSeek 账号密码）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、部署环境要求&lt;a href=&quot;#二部署环境要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;要求&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;操作系统&lt;/td&gt;&lt;td&gt;Alpine Linux（proot 环境）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Go&lt;/td&gt;&lt;td&gt;&amp;gt;= 1.26.0（Alpine 自带的 1.23 不够）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;架构&lt;/td&gt;&lt;td&gt;ARM64（手机 CPU）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DeepSeek 账号&lt;/td&gt;&lt;td&gt;邮箱+密码 或 手机号+密码&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、部署步骤&lt;a href=&quot;#三部署步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 安装 Go 1.26.0&lt;a href=&quot;#1-安装-go-1260&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Alpine 自带的 Go 1.23 版本太低，需要手动安装 Go 1.26：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 用 Python 下载并解压（比 curl 在 proot 中更稳定）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import urllib.request, tarfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;url = &apos;https://dl.google.com/go/go1.26.0.linux-arm64.tar.gz&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;out = &apos;/tmp/go1.26.0.linux-arm64.tar.gz&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(&apos;下载 Go 1.26.0...&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;req = urllib.request.Request(url, headers={&apos;User-Agent&apos;: &apos;curl/7.0&apos;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;data = urllib.request.urlopen(req, timeout=600)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;with open(out, &apos;wb&apos;) as f:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;total = 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;while True:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunk = data.read(1048576)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if not chunk: break&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f.write(chunk)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;total += len(chunk)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(f&apos;下载完成: {total/1048576:.1f} MB&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(&apos;解压...&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;with tarfile.open(out, &apos;r:gz&apos;) as tar:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tar.extractall(&apos;/usr/local&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(&apos;完成&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/usr/local/go/bin/go&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# → go version go1.26.0 linux/arm64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;code&gt;dl.google.com&lt;/code&gt; 在 proot 环境中 TLS 连接比 &lt;code&gt;go.dev&lt;/code&gt; 更稳定。如果下载失败，多试几次或换网络。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 获取源码&lt;a href=&quot;#2-获取源码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 方式 A：Git 克隆（可能遇到 TLS 错误）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/CJackHwang/ds2api.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 方式 B：下载 Release 源码包（更可靠）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api-v4.6.1.tar.gz&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://github.com/CJackHwang/ds2api/archive/refs/tags/v4.6.1.tar.gz&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xzf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api-v4.6.1.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api-4.6.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api-v4.6.1.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 编译&lt;a href=&quot;#3-编译&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/usr/local/go/bin:&lt;/span&gt;&lt;span&gt;$PATH&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/ds2api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用 goproxy.cn 国内镜像加速依赖下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GONOSUMCHECK&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GONOSUMDB&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GOPROXY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;https://goproxy.cn,direct&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;go&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ds2api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./cmd/ds2api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;编译成功后生成 &lt;code&gt;/workspace/ds2api/ds2api&lt;/code&gt;（约 25MB，ARM64 ELF）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 配置&lt;a href=&quot;#4-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;复制示例配置并编辑：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.example.json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑 &lt;code&gt;config.json&lt;/code&gt;，关键字段：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;keys&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;你的API密钥&quot;&lt;/span&gt;&lt;span&gt;],           &lt;/span&gt;&lt;span&gt;// 客户端调用时用的 API Key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;api_keys&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;key&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;你的API密钥&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;主 API Key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;remark&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;本地使用&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;accounts&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;主账号&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;email&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;你的DeepSeek邮箱&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;password&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;你的DeepSeek密码&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// 或用手机号登录：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// &quot;phone&quot;: &quot;你的手机号&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// &quot;phone_code&quot;: &quot;国际区号如+86&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;model_aliases&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;gpt-4o&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;deepseek-v4-flash&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;gpt-5.5&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;deepseek-v4-flash&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;o3&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;deepseek-v4-pro&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ... 其他配置保持默认即可&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 启动&lt;a href=&quot;#5-启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/workspace/ds2api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./ds2api&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;启动后监听 &lt;code&gt;http://0.0.0.0:8080&lt;/code&gt;（端口见启动日志）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;首次启动注意：&lt;/strong&gt; 如果提示 &lt;code&gt;[webui] static files missing, running npm build&lt;/code&gt;，说明 WebUI 前端静态文件未构建，会自动尝试用 npm 构建。如不需要 WebUI，可忽略此提示。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;后台运行（保活）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nohup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./ds2api&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/workspace/ds2api/ds2api.log&lt;/span&gt;&lt;span&gt; 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;或使用 Omnibot 的终端持久会话运行。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、API 使用&lt;a href=&quot;#四api-使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;基本信息&lt;a href=&quot;#基本信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置项&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;API Base URL&lt;/td&gt;&lt;td&gt;&lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;（手机 App 用 localhost）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API Key&lt;/td&gt;&lt;td&gt;config.json 中设置的 key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;默认模型&lt;/td&gt;&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;（可通过 model_aliases 映射）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;支持的端点&lt;a href=&quot;#支持的端点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;POST&lt;/td&gt;&lt;td&gt;&lt;code&gt;/v1/chat/completions&lt;/code&gt;&lt;/td&gt;&lt;td&gt;OpenAI 聊天补全（支持流式）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;POST&lt;/td&gt;&lt;td&gt;&lt;code&gt;/v1/messages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Claude 消息格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;POST&lt;/td&gt;&lt;td&gt;&lt;code&gt;/v1beta/models/.../generateContent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Gemini 格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GET&lt;/td&gt;&lt;td&gt;&lt;code&gt;/v1/models&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列出可用模型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GET&lt;/td&gt;&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;WebUI 管理台&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;请求示例&lt;a href=&quot;#请求示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;OpenAI 格式（流式）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:8080/v1/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer 你的API密钥&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;deepseek-v4-flash&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好&quot;}],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;stream&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;非流式：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:8080/v1/chat/completions&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Authorization: Bearer 你的API密钥&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;model&quot;: &quot;deepseek-v4-flash&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好&quot;}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;客户端配置&lt;a href=&quot;#客户端配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 ChatGPT 兼容客户端（如 ChatBox、NextChat 等）中：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API 类型：&lt;/strong&gt; OpenAI Compatible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Base URL：&lt;/strong&gt; &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Key：&lt;/strong&gt; config.json 中设置的 key&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model：&lt;/strong&gt; &lt;code&gt;deepseek-v4-flash&lt;/code&gt; 或 &lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;五、可用模型&lt;a href=&quot;#五可用模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模型名&lt;/th&gt;&lt;th&gt;别名&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;快速模型，适合日常对话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;o3&lt;/code&gt;, &lt;code&gt;gpt-5.3-codex&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高级模型，适合复杂推理&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;可通过 &lt;code&gt;model_aliases&lt;/code&gt; 字段自定义别名映射。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;六、目录结构&lt;a href=&quot;#六目录结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/workspace/ds2api/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── ds2api              # 编译后的二进制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── config.json         # 运行配置（需手动创建）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── config.example.json # 配置示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── cmd/ds2api/main.go  # 入口代码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── api/                # API 路由&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── app/                # 应用逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── internal/           # 内部包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── webui/              # React 前端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── start.mjs           # Node.js 启动菜单脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── go.mod              # Go 模块定义&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── go.sum              # Go 依赖校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;七、常见问题&lt;a href=&quot;#七常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q: 启动报错 TLS 连接失败？&lt;a href=&quot;#q-启动报错-tls-连接失败&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: DeepSeek 需要通过网络访问其 Web 服务。确保手机网络正常。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q: 编译时 &lt;code&gt;go: go.mod requires go &amp;gt;= 1.26.0&lt;/code&gt;？&lt;a href=&quot;#q-编译时-go-gomod-requires-go--1260&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: Alpine 自带的 Go 版本太低（1.23）。需要手动安装 Go 1.26（见步骤 1）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q: &lt;code&gt;GOTOOLCHAIN=auto&lt;/code&gt; 下载 Go 时 Segmentation fault？&lt;a href=&quot;#q-gotoolchainauto-下载-go-时-segmentation-fault&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: proot 环境下 Go 自动工具链下载不稳定。改用手动下载 tar.gz 包安装。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q: Git clone 报 TLS 错误？&lt;a href=&quot;#q-git-clone-报-tls-错误&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 改用下载 Release 源码包的方式获取代码（方式 B）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q: 与 qoder-cn-proxy 有什么区别？&lt;a href=&quot;#q-与-qoder-cn-proxy-有什么区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: &lt;strong&gt;qoder-cn-proxy&lt;/strong&gt; 调用 Qoder CN 官方 API，需要 PAT Token。&lt;strong&gt;ds2api&lt;/strong&gt; 模拟 DeepSeek 网页端对话，需要 DeepSeek 账号密码。两者是不同的 API 代理方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q: 手机浏览器访问 127.0.0.1:8080 超时？&lt;a href=&quot;#q-手机浏览器访问-1270018080-超时&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 在手机浏览器中用 &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;（不要用局域网 IP）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;八、技术架构&lt;a href=&quot;#八技术架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;客户端 (OpenAI/Claude/Gemini 格式请求)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ds2api (Go 后端, 端口 8080)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓ 模拟 DeepSeek Web 协议&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DeepSeek Web 服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回响应 → 转为标准 API 格式返回给客户端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;ds2api 本质上是一个 &lt;strong&gt;Web 协议适配层&lt;/strong&gt;，把 DeepSeek 的网页对话协议转换为标准的 OpenAI/Claude/Gemini API 格式，让任何兼容的客户端都能使用 DeepSeek 的能力。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Obsidian标签问题解决方案</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-obsidian%E6%A0%87%E7%AD%BE%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-obsidian%E6%A0%87%E7%AD%BE%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid><description># Obsidian 标签问题解决方案 ## 问题描述 在使用 Obsidian 查看小万工作间目录下的文档时，发现两类问题： 1. 十六进制颜色代码（如 `#3B82F6`、`#2563EB`）被 Obsidian 误识别为标签 2. 小</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;Obsidian 标签问题解决方案&lt;a href=&quot;#obsidian-标签问题解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;问题描述&lt;a href=&quot;#问题描述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在使用 Obsidian 查看小万工作间目录下的文档时，发现两类问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;十六进制颜色代码（如 &lt;code&gt;#3B82F6&lt;/code&gt;、&lt;code&gt;#2563EB&lt;/code&gt;）被 Obsidian 误识别为标签&lt;/li&gt;
&lt;li&gt;小红书笔记自带的标签（如 &lt;code&gt;#互联网大厂 #agent&lt;/code&gt;）被 Obsidian 误识别为标签&lt;/li&gt;
&lt;/ol&gt;&lt;section&gt;&lt;h3&gt;问题表现&lt;a href=&quot;#问题表现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Obsidian 标签统计中出现大量十六进制颜色代码标签&lt;/li&gt;
&lt;li&gt;Obsidian 标签统计中出现大量小红书笔记标签&lt;/li&gt;
&lt;li&gt;标签数量统计异常：如 &lt;code&gt;3B82F6&lt;/code&gt; 出现 10 次、&lt;code&gt;2563EB&lt;/code&gt; 出现 10 次等&lt;/li&gt;
&lt;li&gt;影响标签分类和管理体验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题根源&lt;a href=&quot;#问题根源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Obsidian 会将 Markdown 文档中所有以 &lt;code&gt;#&lt;/code&gt; 开头的内容识别为标签，包括：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;表格中的颜色代码&lt;/li&gt;
&lt;li&gt;代码块中的配置值&lt;/li&gt;
&lt;li&gt;普通文本中的颜色描述&lt;/li&gt;
&lt;li&gt;小红书笔记自带的标签列表&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;解决方案&lt;a href=&quot;#解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;方案一：批量修复脚本（推荐）&lt;a href=&quot;#方案一批量修复脚本推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建 Python 脚本自动修复所有 Markdown 文件中的颜色代码问题。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;脚本功能&lt;a href=&quot;#脚本功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;自动扫描所有 &lt;code&gt;.md&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;识别十六进制颜色代码（3、4、6 或 8 位）&lt;/li&gt;
&lt;li&gt;将未被反引号包裹的颜色代码用反引号包裹&lt;/li&gt;
&lt;li&gt;避免重复包裹已处理的代码&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;修复示例&lt;a href=&quot;#修复示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;修复前：&lt;code&gt;#3B82F6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修复后：&lt;code&gt;`#3B82F6`&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方案二：小红书笔记标签修复&lt;a href=&quot;#方案二小红书笔记标签修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;针对小红书笔记自带的标签格式，采用以下修复方法：&lt;/p&gt;&lt;section&gt;&lt;h4&gt;修复格式&lt;a href=&quot;#修复格式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;将 &lt;code&gt;**标签[[**：#互联网大厂 #agent #后端开发 #大厂 #程序员 #面试求职 #大模型 #春招 #校招 #java]]&lt;/code&gt; 格式修改为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**标签**：互联网大厂、agent、后端开发、大厂、程序员、面试求职、大模型、春招、校招、java&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;修复原则&lt;a href=&quot;#修复原则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;去掉 &lt;code&gt;#&lt;/code&gt; 号，避免被 Obsidian 识别为标签&lt;/li&gt;
&lt;li&gt;用顿号（、）分隔标签，保持可读性&lt;/li&gt;
&lt;li&gt;保留标签信息，只是改变显示格式&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方案三：手动修复&lt;a href=&quot;#方案三手动修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在文档中手动将颜色代码用反引号包裹：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;正确写法：&lt;code&gt;`#3B82F6`&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;错误写法：#3B82F6&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方案四：Obsidian 设置调整&lt;a href=&quot;#方案四obsidian-设置调整&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;虽然 Obsidian 本身没有直接排除颜色代码标签的设置，但可以通过以下方式优化：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;使用标签过滤插件&lt;/li&gt;
&lt;li&gt;手动隐藏不需要的标签&lt;/li&gt;
&lt;li&gt;在文档中统一使用反引号包裹颜色代码&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;修复效果&lt;a href=&quot;#修复效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;修复统计&lt;a href=&quot;#修复统计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;扫描文件：339 个 Markdown 文件&lt;/li&gt;
&lt;li&gt;修复文件：20 个文件（颜色代码修复）+ 2 个文件（小红书标签修复）&lt;/li&gt;
&lt;li&gt;修复内容：
&lt;ol&gt;
&lt;li&gt;所有未被反引号包裹的十六进制颜色代码&lt;/li&gt;
&lt;li&gt;小红书笔记自带的标签格式&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;修复文件列表&lt;a href=&quot;#修复文件列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;颜色代码修复&lt;a href=&quot;#颜色代码修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;主要修复了 &lt;code&gt;项目库/guanlan-sina-main/&lt;/code&gt; 下的文档，包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LOGO-THEME-UPDATE.md&lt;/code&gt; - 前端组件主题更新文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YikongLogo-README.md&lt;/code&gt; - LOGO 组件说明文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;part1_optimization.py&lt;/code&gt; - 天筹算法设计文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;项目结构信息.md&lt;/code&gt; - 项目目录结构说明&lt;/li&gt;
&lt;li&gt;其他配置和文档文件&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;小红书标签修复&lt;a href=&quot;#小红书标签修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;修复了 &lt;code&gt;面经库/&lt;/code&gt; 下的小红书笔记文档：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;10-滴滴AI全栈开发一面.md&lt;/code&gt; - 滴滴面试文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;11-Agent八股-记忆检索RAG.md&lt;/code&gt; - RAG 八股文文档&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;预防措施&lt;a href=&quot;#预防措施&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;文档编写规范&lt;a href=&quot;#文档编写规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;颜色代码使用规范&lt;/strong&gt;：在 Markdown 文档中使用颜色代码时，始终用反引号包裹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码块规范&lt;/strong&gt;：在代码块中使用颜色代码时，确保正确格式化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档审核&lt;/strong&gt;：定期检查文档中的颜色代码格式&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;自动化检查&lt;a href=&quot;#自动化检查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以创建预提交钩子或文档检查脚本，自动检测未正确格式化的颜色代码。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;技术细节&lt;a href=&quot;#技术细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;正则表达式匹配&lt;a href=&quot;#正则表达式匹配&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 匹配十六进制颜色代码的正则表达式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;color_pattern &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;#&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0-9A-Fa-f&lt;/span&gt;&lt;span&gt;&lt;span&gt;]{3}&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0-9A-Fa-f&lt;/span&gt;&lt;span&gt;&lt;span&gt;]{4}&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0-9A-Fa-f&lt;/span&gt;&lt;span&gt;&lt;span&gt;]{6}&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0-9A-Fa-f&lt;/span&gt;&lt;span&gt;]{8}&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\b&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;替换逻辑&lt;a href=&quot;#替换逻辑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;replace_color&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;full_match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match.&lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match.&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 检查前面是否有反引号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; start &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; content[start&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;`&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; full_match&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 检查后面是否有反引号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; end &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;(content) &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; content[end] &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;`&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; full_match&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 如果不在代码块内，则用反引号包裹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;`&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;full_match&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;相关工具&lt;a href=&quot;#相关工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;修复脚本&lt;a href=&quot;#修复脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;路径：&lt;code&gt;/workspace/小万工作间/fix_color_tags.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;功能：批量修复 Markdown 文件中的颜色代码问题&lt;/li&gt;
&lt;li&gt;使用：&lt;code&gt;python3 fix_color_tags.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;手动修复&lt;a href=&quot;#手动修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用 Obsidian 的查找和替换功能&lt;/li&gt;
&lt;li&gt;搜索正则表达式：&lt;code&gt;#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})\b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;替换为：&lt;code&gt;`$1`&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过批量修复脚本和手动修复，成功解决了 Obsidian 中两类标签误识别问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;十六进制颜色代码被误识别为标签&lt;/li&gt;
&lt;li&gt;小红书笔记自带的标签被误识别为标签&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;修复后，标签统计将只包含真正的标签，提高了 Obsidian 的使用体验。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;预防措施总结&lt;a href=&quot;#预防措施总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;颜色代码&lt;/strong&gt;：在 Markdown 文档中使用颜色代码时，始终用反引号包裹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小红书标签&lt;/strong&gt;：将 &lt;code&gt;**标签[[**：#标签1 #标签2]]&lt;/code&gt; 格式改为 &lt;code&gt;**标签**：标签1、标签2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档审核&lt;/strong&gt;：定期检查文档中的标签格式，确保不会被 Obsidian 误识别&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;建议在以后的文档编写中，始终遵循这些规范，避免类似问题再次发生。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Qoder cn proxy 部署指南</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-qoder-cn-proxy-%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-qoder-cn-proxy-%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</guid><description>qoder-cn-proxy 部署指南适用场景在 Android 手机上用 Alpine Linux 运行 qoder-cn-proxy，把手机变成 Qoder CN API 的本地代理，供手机 App、浏览器或 OpenAI 兼容客户端使</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;qoder-cn-proxy 部署指南适用场景在 Android 手机上用 Alpine Linux 运行 qoder-cn-proxy，把手机变成 Qoder CN API 的本地代理，供手机 App、浏览器或 OpenAI 兼容客户端使用。前置要求•Node.js v18+（推荐 v22）•Qoder CN CLI：npm install -g @qoder-ai/qoder-cli-cn•Qoder CN PAT Token：从 &lt;a href=&quot;https://qoder.cn/settings/tokens&quot; target=&quot;_blank&quot;&gt;https://qoder.cn/settings/tokens&lt;/a&gt; 获取部署步骤1. 克隆项目cd /workspace
git clone &lt;a href=&quot;https://github.com/avaritiachaos/qoder-cn-proxy.git&quot; target=&quot;_blank&quot;&gt;https://github.com/avaritiachaos/qoder-cn-proxy.git&lt;/a&gt;
cd qoder-cn-proxy2. 配置 Tokencp .env.example .env编辑 .env，填入 PAT：QODER_CN_PAT=你的PAT3. 安装依赖npm install —silent4. 启动服务cd /workspace/qoder-cn-proxy
export PATH=“/root/.npm-global/bin:$PATH”
node clean/server.js默认监听 &lt;a href=&quot;http://0.0.0.0:3000%EF%BC%8C%E5%90%AF%E5%8A%A8%E5%90%8E%E8%BE%93%E5%87%BA%EF%BC%9AQoder&quot; target=&quot;_blank&quot;&gt;http://0.0.0.0:3000，启动后输出：Qoder&lt;/a&gt; CN clean proxy listening on &lt;a href=&quot;http://0.0.0.0:30005&quot; target=&quot;_blank&quot;&gt;http://0.0.0.0:30005&lt;/a&gt;. 保活用持久化终端会话运行，或放后台：nohup node clean/server.js &amp;gt; /workspace/qoder-cn-proxy/proxy.log 2&amp;gt;&amp;amp;1 &amp;amp;客户端使用配置项值API Base URLhttp://手机局域网IP:3000（如 &lt;a href=&quot;http://192.168.10.251:3000%EF%BC%89API&quot; target=&quot;_blank&quot;&gt;http://192.168.10.251:3000）API&lt;/a&gt; Key任意值或留空Modelqoder-cn、auto、qwen3.7-max、deepseek-v4 等可用端点方法路径说明GET/服务状态GET/health健康检查GET/v1/models列出模型POST/v1/chat/completionsOpenAI 聊天补全（支持流式）POST/v1/messagesAnthropic 消息格式测试验证# 服务状态
curl &lt;a href=&quot;http://127.0.0.1:3000/&quot; target=&quot;_blank&quot;&gt;http://127.0.0.1:3000/&lt;/a&gt;
→ {“ok”,“name”:“qoder-cn-proxy”,“mode”:“clean”}&lt;/p&gt;
&lt;p&gt;聊天补全
curl &lt;a href=&quot;http://127.0.0.1:3000/v1/chat/completions&quot; target=&quot;_blank&quot;&gt;http://127.0.0.1:3000/v1/chat/completions&lt;/a&gt; &lt;br /&gt;
-H “Content-Type: application/json” &lt;br /&gt;
-d ’{“model”:“auto”,“messages”:[{“role”:“user”,“content”:“你好”}]}‘注意事项•服务监听 0.0.0.0:3000，未配置 HTTPS•首次启动会自动下载 Qoder CN runner（约 200MB），确保网络畅通•Android App 用 &lt;a href=&quot;http://127.0.0.1:3000&quot; target=&quot;_blank&quot;&gt;http://127.0.0.1:3000&lt;/a&gt; 访问，外部设备用局域网 IP&lt;/p&gt;</content:encoded></item><item><title>技能列表</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%8A%80%E8%83%BD%E5%88%97%E8%A1%A8/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%8A%80%E8%83%BD%E5%88%97%E8%A1%A8/</guid><description># 小万当前技能列表 更新时间：2026-06-07 ## 当前保留的 Skills 1. **bosszhipin** - 功能：BOSS 直聘操作 2. **business-contact-social-links-skill** -</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;小万当前技能列表&lt;a href=&quot;#小万当前技能列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;更新时间：2026-06-07&lt;/p&gt;&lt;section&gt;&lt;h2&gt;当前保留的 Skills&lt;a href=&quot;#当前保留的-skills&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;bosszhipin&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：BOSS 直聘操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;business-contact-social-links-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：社交账号查找&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;find-install-skills&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：搜索安装新 skill&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;google-image-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：Google 图片数据提取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;google-search-serp&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：Google 搜索结果提取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;grill-with-docs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：文档校验与更新&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;hatch-pet&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：自定义宠物创建&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;industry-resume-toolkit&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：简历方法论&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;interview-q-master&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：输入知识点，输出高频面试题及答案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;rednote-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：小红书操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;resume-master&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：HTML → PDF 简历生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;resume-optimizer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：简历审计与优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;self-improving-agent&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：自我改进循环&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;skill-creator&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：Skill 创建指导&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;web-research-assistant&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：AI 网页研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;web-search-scraper-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：网页内容抓取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;wechat-article-search-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：微信公众号文章提取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;x-tweet-search&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：X / Twitter 推文搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;youtube-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：YouTube 搜索与视频提取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;youtube-video-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：YouTube 视频详情提取&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;zhihu-search-api-skill&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能：知乎搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;已删除的 Skills（本次清理）&lt;a href=&quot;#已删除的-skills本次清理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;amazon-product-api-skill&lt;/li&gt;
&lt;li&gt;amazon-product-search-api-skill&lt;/li&gt;
&lt;li&gt;browser-act-skill-forge&lt;/li&gt;
&lt;li&gt;social-media-finder-skill&lt;/li&gt;
&lt;li&gt;youtube-batch-transcript-extractor-api-skill&lt;/li&gt;
&lt;li&gt;youtube-channel-api-skill&lt;/li&gt;
&lt;li&gt;youtube-comments-api-skill&lt;/li&gt;
&lt;li&gt;youtube-influencer-finder-api-skill&lt;/li&gt;
&lt;li&gt;youtube-search-api-skill&lt;/li&gt;
&lt;li&gt;youtube-transcript-analysis-api-skill&lt;/li&gt;
&lt;li&gt;youtube-transcript-extractor-api-skill&lt;/li&gt;
&lt;li&gt;google-maps-api-skill&lt;/li&gt;
&lt;li&gt;google-maps-reviews-api-skill&lt;/li&gt;
&lt;li&gt;google-maps-search-api-skill&lt;/li&gt;
&lt;li&gt;google-news-api-skill&lt;/li&gt;
&lt;li&gt;github-project-contributor-finder-api-skill&lt;/li&gt;
&lt;li&gt;industry-key-contact-radar-api-skill&lt;/li&gt;
&lt;li&gt;linkedin-jobs-search&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;说明&lt;a href=&quot;#说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文档保存的是当前精简后的 skill 列表。&lt;/li&gt;
&lt;li&gt;后续新增或删除 skill 时，建议同步更新本文件。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>抓取linux.do帖子指南</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%8A%93%E5%8F%96linux-do%E5%B8%96%E5%AD%90%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%8A%93%E5%8F%96linux-do%E5%B8%96%E5%AD%90%E6%8C%87%E5%8D%97/</guid><description># 抓取 linux.do（LINUX DO）帖子指南 &gt; 适用场景：用户发来 linux.do 帖子链接，要求抓取帖子内容和评论并保存。 --- ## 背景 linux.do 是 **Discourse 论坛**，部署在 **Cloudf</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;抓取 linux.do（LINUX DO）帖子指南&lt;a href=&quot;#抓取-linuxdolinux-do帖子指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;适用场景：用户发来 linux.do 帖子链接，要求抓取帖子内容和评论并保存。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;背景&lt;a href=&quot;#背景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;linux.do 是 &lt;strong&gt;Discourse 论坛&lt;/strong&gt;，部署在 &lt;strong&gt;Cloudflare&lt;/strong&gt; 后面。直接用 curl 访问会返回 403，浏览器打开也会卡在 “Just a moment…” 验证页。&lt;/p&gt;&lt;p&gt;Discourse 论坛有内置 JSON API：&lt;code&gt;https://linux.do/t/&amp;lt;topic_id&amp;gt;.json&lt;/code&gt;，可以拿到完整帖子数据（HTML、用户名、时间、点赞数等），但 Cloudflare 同样拦截。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;核心流程（已验证可行）&lt;a href=&quot;#核心流程已验证可行&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. navigate → linux.do 帖子页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. set_user_agent → desktop_safari（关键！触发 Cloudflare 自动验证）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. wait_for_selector → #main-outlet（确认验证通过，等 5-15 秒）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. fetch → /t/&amp;lt;topic_id&amp;gt;.json（获取 Discourse API JSON，50-100KB）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. Python 解析 cooked HTML → strip 标签 → 生成 Markdown&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6. file_write 保存到目标目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;第 1 步：打开帖子页面&lt;a href=&quot;#第-1-步打开帖子页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;browser_use → navigate → https://linux.do/t/topic/&amp;lt;id&amp;gt;/&amp;lt;page&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;页面会卡在 Cloudflare “请稍候…” 验证页，这是正常的。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 2 步：切换桌面 UA（关键步骤）&lt;a href=&quot;#第-2-步切换桌面-ua关键步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;browser_use → set_user_agent → desktop_safari&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这一步是绕过 Cloudflare 的关键&lt;/strong&gt;。切换 UA 后 Cloudflare 验证会在数秒内自动通过，页面标题变成帖子标题即表示成功。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ mobile_safari 不行，必须 desktop_safari。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 3 步：确认验证通过&lt;a href=&quot;#第-3-步确认验证通过&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;browser_use → wait_for_selector → #main-outlet（timeout 15000）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果 &lt;code&gt;found=true&lt;/code&gt; 说明验证通过；如果超时，可以截图检查页面状态，或重复步骤 2。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 4 步：获取 Discourse JSON API 数据&lt;a href=&quot;#第-4-步获取-discourse-json-api-数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;browser_use → fetch → https://linux.do/t/&amp;lt;topic_id&amp;gt;.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;必须用 &lt;code&gt;fetch&lt;/code&gt; 动作&lt;/strong&gt;（不是 navigate，不是 curl，不是 execute_js），因为 fetch 会复用浏览器的 session 和 cookies。&lt;/p&gt;&lt;p&gt;返回的 JSON 包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;：帖子标题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;views&lt;/code&gt;、&lt;code&gt;like_count&lt;/code&gt;、&lt;code&gt;posts_count&lt;/code&gt;：统计数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created_at&lt;/code&gt;、&lt;code&gt;tags&lt;/code&gt;、&lt;code&gt;category_id&lt;/code&gt;：元信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post_stream.posts[]&lt;/code&gt;：帖子列表
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;、&lt;code&gt;name&lt;/code&gt;：作者&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cooked&lt;/code&gt;：帖子 HTML 内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created_at&lt;/code&gt;：发布时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;like_count&lt;/code&gt;：点赞数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post_number&lt;/code&gt;：楼层号&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;JSON 文件会自动保存到 workspace 的 offload 目录，工具返回中包含 &lt;code&gt;artifactUri&lt;/code&gt; 路径。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 5 步：Python 解析&lt;a href=&quot;#第-5-步python-解析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; json, html, re&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&amp;lt;artifactUri 路径&amp;gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; f:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; json.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(f)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;posts &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; data.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;post_stream&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, {}).&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;posts&apos;&lt;/span&gt;&lt;span&gt;, [])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; p &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; posts:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cooked &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;cooked&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&apos;&amp;lt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;]+&lt;/span&gt;&lt;span&gt;&amp;gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;, cooked)  &lt;/span&gt;&lt;span&gt;# strip HTML&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; html.&lt;/span&gt;&lt;span&gt;unescape&lt;/span&gt;&lt;span&gt;(text).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&apos;\s&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos; &apos;&lt;/span&gt;&lt;span&gt;, text)  &lt;/span&gt;&lt;span&gt;# 合并空白&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# text 就是纯文本内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 6 步：保存&lt;a href=&quot;#第-6-步保存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用 &lt;code&gt;file_write&lt;/code&gt; 生成结构化 Markdown 保存到目标目录。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;踩坑记录&lt;a href=&quot;#踩坑记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;❌ curl 直接请求 → 403&lt;a href=&quot;#-curl-直接请求--403&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://linux.do/t/2303618.json&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-H&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Cookie: cf_clearance=xxx&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 返回 403，即使带了 cf_clearance cookie&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Cloudflare 的 cf_clearance cookie &lt;strong&gt;绑定 IP&lt;/strong&gt;。浏览器的 IP 和 Alpine 终端（proot）的出口 IP 不同，cookie 无法跨 IP 复用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：不要尝试用 curl，必须通过浏览器完成所有请求。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;❌ 浏览器内 execute_js → 返回 null&lt;a href=&quot;#-浏览器内-execute_js--返回-null&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 这些在 linux.do 页面上都返回 null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;querySelectorAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;.cooked&apos;&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;span&gt;// null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/t/2303618.json&apos;&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;span&gt;// null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：linux.do 页面的 CSP 或 Discourse 框架限制，导致 execute_js 的返回值无法正常序列化。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：不用 execute_js 提取内容，用 &lt;code&gt;fetch&lt;/code&gt; 动作获取 JSON API 数据再用 Python 解析。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;❌ Google 缓存 / Wayback Machine&lt;a href=&quot;#-google-缓存--wayback-machine&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Google 缓存：触发 Google 自己的验证，同样不可用&lt;/li&gt;
&lt;li&gt;Wayback Machine：抓取的是旧版本，可能不包含最新评论&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;❌ navigate 到 API URL&lt;a href=&quot;#-navigate-到-api-url&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;browser_use → navigate → https://linux.do/t/2303618.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 会触发新的 Cloudflare 验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：navigate 会改变当前页面，可能触发新的验证流程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：先 navigate 到帖子页面，通过验证后再用 &lt;code&gt;fetch&lt;/code&gt; 请求 API。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;分页处理&lt;a href=&quot;#分页处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;默认 JSON API 返回前 &lt;strong&gt;20 条帖子&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;超过 20 条时，用 &lt;code&gt;?page=1&lt;/code&gt;、&lt;code&gt;?page=2&lt;/code&gt; 参数获取更多（但实测 21 条帖子只返回了 20 条）&lt;/li&gt;
&lt;li&gt;用户链接 &lt;code&gt;/t/topic/2303618/8&lt;/code&gt; 中的 &lt;code&gt;/8&lt;/code&gt; 表示跳转到第 8 楼，不影响 API 获取&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;用户链接格式&lt;a href=&quot;#用户链接格式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;格式&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;topic_id&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;linux.do/t/topic/2303618&lt;/code&gt;&lt;/td&gt;&lt;td&gt;帖子首页&lt;/td&gt;&lt;td&gt;2303618&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;linux.do/t/topic/2303618/8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跳转到第 8 楼&lt;/td&gt;&lt;td&gt;2303618&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;linux.do/t/topic/2303618/20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跳转到第 20 楼&lt;/td&gt;&lt;td&gt;2303618&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;API 请求统一用 &lt;code&gt;https://linux.do/t/2303618.json&lt;/code&gt;（去掉 &lt;code&gt;/topic/&lt;/code&gt; 和楼层号）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;完整示例（实际成功案例）&lt;a href=&quot;#完整示例实际成功案例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2026-06-05 抓取帖子 2303618「老哥们 新改了一版简历 这次有啥大毛病吗」：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;577 浏览 · 26 赞 · 21 条回复&lt;/li&gt;
&lt;li&gt;JSON 大小 54KB&lt;/li&gt;
&lt;li&gt;全部 20 条评论成功提取&lt;/li&gt;
&lt;li&gt;保存到 &lt;code&gt;/workspace/小万工作间/L站精华/简历优化建议_L站帖子2303618.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;最后更新：2026-06-05&lt;/em&gt;
&lt;em&gt;来源：实际抓取 linux.do 帖子 2303618 的完整过程&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>文字生成博客插图流程指南</title><link>https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%96%87%E5%AD%97%E7%94%9F%E6%88%90%E5%8D%9A%E5%AE%A2%E6%8F%92%E5%9B%BE%E6%B5%81%E7%A8%8B%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://estars-blog.pages.dev/posts/%E8%88%AA%E6%B5%B7%E5%9B%BE-%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E6%96%87%E5%AD%97%E7%94%9F%E6%88%90%E5%8D%9A%E5%AE%A2%E6%8F%92%E5%9B%BE%E6%B5%81%E7%A8%8B%E6%8C%87%E5%8D%97/</guid><description># 文字生成博客插图流程指南 这份文档总结了：如何把一段文字整理成适合博客展示的图片，尤其是流程图、结构图、示意图；以及如何避免生成出来的图不好看、空白太多、说明文字过多等问题。 --- ## 一、适用场景 这套流程最适合以下内容： - 技</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;文字生成博客插图流程指南&lt;a href=&quot;#文字生成博客插图流程指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;这份文档总结了：如何把一段文字整理成适合博客展示的图片，尤其是流程图、结构图、示意图；以及如何避免生成出来的图不好看、空白太多、说明文字过多等问题。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h2&gt;一、适用场景&lt;a href=&quot;#一适用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这套流程最适合以下内容：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;技术流程图&lt;/li&gt;
&lt;li&gt;AI Agent 工作流图&lt;/li&gt;
&lt;li&gt;系统结构图&lt;/li&gt;
&lt;li&gt;文章配图&lt;/li&gt;
&lt;li&gt;经验总结图&lt;/li&gt;
&lt;li&gt;概念关系图&lt;/li&gt;
&lt;li&gt;步骤型教程图&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你已经有一段文字描述，但没有现成图片，就可以用这套流程把文字变成图。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;二、核心思路&lt;a href=&quot;#二核心思路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;文字生成图片，不是简单“把原文塞给模型”。&lt;/p&gt;&lt;p&gt;更稳定、效果更好的方式是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先提炼结构&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再确定图类型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再确定视觉风格&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后生成图片&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成后再做一轮精修&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;也就是说，最好的流程不是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;原文 → 直接出图&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;而是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;原文 → 信息提炼 → 图结构设计 → 风格设计 → 出图 → 二次精修&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;三、标准工作流&lt;a href=&quot;#三标准工作流&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;第一步：明确图片要表达什么&lt;a href=&quot;#第一步明确图片要表达什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先问自己一句：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;这张图最重要的用途是什么？&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;常见用途：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;帮读者快速理解流程&lt;/li&gt;
&lt;li&gt;把长段文字压缩成视觉摘要&lt;/li&gt;
&lt;li&gt;给博客增加更直观的插图&lt;/li&gt;
&lt;li&gt;展示系统模块之间的关系&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果用途不清楚，图就容易画得又杂又乱。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：把原始文字整理成“图用文案”&lt;a href=&quot;#第二步把原始文字整理成图用文案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;原始文字通常比较长，不适合直接拿来画图。&lt;/p&gt;&lt;p&gt;要先整理成：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;标题&lt;/li&gt;
&lt;li&gt;主流程 / 主结构&lt;/li&gt;
&lt;li&gt;节点顺序&lt;/li&gt;
&lt;li&gt;分层信息（可选）&lt;/li&gt;
&lt;li&gt;强调点（可选）&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h4&gt;示例&lt;a href=&quot;#示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;原始文字：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;用户消息进入通道适配器，然后经过网关服务器、会话路由器、智能体运行器、模型解析器、系统提示词构建器、历史加载器、会话、任务通道队列、上下文窗口防护机制、大语言模型 API、智能体循环、反馈通路、通道适配器，最终输出文本。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;整理后：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;标题：OpenClaw 从发送消息到完整反馈的流程&lt;/li&gt;
&lt;li&gt;主链路：
&lt;ol&gt;
&lt;li&gt;用户消息&lt;/li&gt;
&lt;li&gt;通道适配器&lt;/li&gt;
&lt;li&gt;网关服务器&lt;/li&gt;
&lt;li&gt;会话路由器&lt;/li&gt;
&lt;li&gt;智能体运行器&lt;/li&gt;
&lt;li&gt;模型解析器&lt;/li&gt;
&lt;li&gt;系统提示词构建器&lt;/li&gt;
&lt;li&gt;历史加载器&lt;/li&gt;
&lt;li&gt;会话&lt;/li&gt;
&lt;li&gt;任务通道队列&lt;/li&gt;
&lt;li&gt;上下文窗口防护机制&lt;/li&gt;
&lt;li&gt;大语言模型 API&lt;/li&gt;
&lt;li&gt;智能体循环&lt;/li&gt;
&lt;li&gt;反馈通路&lt;/li&gt;
&lt;li&gt;通道适配器&lt;/li&gt;
&lt;li&gt;最终文本&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：确定图类型&lt;a href=&quot;#第三步确定图类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;不同文字适合不同图。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;1. 流程图&lt;a href=&quot;#1-流程图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;有明显先后顺序&lt;/li&gt;
&lt;li&gt;强调“从 A 到 B 到 C”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户请求处理链路&lt;/li&gt;
&lt;li&gt;RAG 流程&lt;/li&gt;
&lt;li&gt;Agent 工作流&lt;/li&gt;
&lt;li&gt;部署步骤&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 结构图&lt;a href=&quot;#2-结构图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;强调模块关系&lt;/li&gt;
&lt;li&gt;强调系统分层&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;前后端架构&lt;/li&gt;
&lt;li&gt;多模块系统关系图&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 对比图&lt;a href=&quot;#3-对比图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;方案 A vs 方案 B&lt;/li&gt;
&lt;li&gt;新旧流程对比&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. 脑图 / 分支图&lt;a href=&quot;#4-脑图--分支图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;一个主题拆成多个要点&lt;/li&gt;
&lt;li&gt;经验总结、知识地图&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;博客里最常用的是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;流程图 + 结构图&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;四、适合博客的风格选择&lt;a href=&quot;#四适合博客的风格选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 手绘风（Excalidraw 风格）&lt;a href=&quot;#1-手绘风excalidraw-风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最适合博客插图。&lt;/p&gt;&lt;p&gt;特点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;看起来更轻松&lt;/li&gt;
&lt;li&gt;比工程图更有阅读感&lt;/li&gt;
&lt;li&gt;不容易显得太生硬&lt;/li&gt;
&lt;li&gt;很适合 AI、技术、经验总结类文章&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;工作流图&lt;/li&gt;
&lt;li&gt;系统流程图&lt;/li&gt;
&lt;li&gt;教程配图&lt;/li&gt;
&lt;li&gt;文章插图&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 彩色博客插图版&lt;a href=&quot;#2-彩色博客插图版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在手绘风基础上再增加：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;轻量配色&lt;/li&gt;
&lt;li&gt;模块分组色块&lt;/li&gt;
&lt;li&gt;阴影&lt;/li&gt;
&lt;li&gt;层次感&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;优点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;更适合博客正文插图&lt;/li&gt;
&lt;li&gt;比纯黑白图更吸引读者&lt;/li&gt;
&lt;li&gt;更容易表现“分层”与“分组”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;适合：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;长文章中的核心示意图&lt;/li&gt;
&lt;li&gt;作为文章中的视觉重点&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 纯工程图风格&lt;a href=&quot;#3-纯工程图风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;特点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;更严谨&lt;/li&gt;
&lt;li&gt;更文档化&lt;/li&gt;
&lt;li&gt;更适合系统设计说明&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;缺点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;放博客里容易显得太硬&lt;/li&gt;
&lt;li&gt;没有手绘风亲和&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果是写博客，一般不优先。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;五、图片要怎么做得更好看&lt;a href=&quot;#五图片要怎么做得更好看&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是最关键的部分。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;原则 1：视觉上先简后繁&lt;a href=&quot;#原则-1视觉上先简后繁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;优先保证：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;节点清楚&lt;/li&gt;
&lt;li&gt;箭头清楚&lt;/li&gt;
&lt;li&gt;顺序清楚&lt;/li&gt;
&lt;li&gt;颜色清楚&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不要一开始就堆很多装饰。&lt;/p&gt;&lt;p&gt;读者首先要看懂图，不是先被装饰吸引。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原则 2：每个框里的字不要太多&lt;a href=&quot;#原则-2每个框里的字不要太多&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;一个节点最好控制在：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;2~8 个字&lt;/li&gt;
&lt;li&gt;最多一行半或两行&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果一个框里塞一整句话，图就会显得拥挤。&lt;/p&gt;&lt;p&gt;错误示例：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;把长段说明直接放进节点框中&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;正确方式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;只放核心词&lt;/li&gt;
&lt;li&gt;详细解释放正文里写&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原则 3：颜色要少而稳&lt;a href=&quot;#原则-3颜色要少而稳&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;推荐策略：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;白底&lt;/li&gt;
&lt;li&gt;黑/深灰线条&lt;/li&gt;
&lt;li&gt;3~6 个柔和辅助色&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;黄：入口层&lt;/li&gt;
&lt;li&gt;蓝：接入层&lt;/li&gt;
&lt;li&gt;紫：调度层&lt;/li&gt;
&lt;li&gt;绿：上下文层&lt;/li&gt;
&lt;li&gt;红：执行层&lt;/li&gt;
&lt;li&gt;粉：模型层&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不要用太饱和、太刺眼的颜色。&lt;/p&gt;&lt;p&gt;博客图更适合：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;低饱和 + 清晰分组&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原则 4：箭头一定要明确&lt;a href=&quot;#原则-4箭头一定要明确&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;流程图里最容易出问题的是箭头。&lt;/p&gt;&lt;p&gt;需要注意：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;起点终点明确&lt;/li&gt;
&lt;li&gt;不要交叉太多&lt;/li&gt;
&lt;li&gt;尽量让阅读方向一致&lt;/li&gt;
&lt;li&gt;行与行之间的连接要自然&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;推荐阅读方向：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;从左到右&lt;/li&gt;
&lt;li&gt;或从上到下&lt;/li&gt;
&lt;li&gt;如果多行排列，最好用“蛇形流动”并保持清晰&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原则 5：标题保留，但说明文字要克制&lt;a href=&quot;#原则-5标题保留但说明文字要克制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;适合保留：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;一句主标题&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不适合过多保留：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“阅读方式引导”&lt;/li&gt;
&lt;li&gt;“彩色博客插图版”&lt;/li&gt;
&lt;li&gt;“流程总览”&lt;/li&gt;
&lt;li&gt;大量注释说明&lt;/li&gt;
&lt;li&gt;重复解释型小字&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;博客插图不是 PPT，不要让图里有太多辅助说明文字。&lt;/p&gt;&lt;p&gt;最好的状态是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;标题 + 流程主体 + 少量必要标签&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;六、如何避免图片里出现大面积空白&lt;a href=&quot;#六如何避免图片里出现大面积空白&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是博客插图特别重要的一点。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;原因&lt;a href=&quot;#原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大面积空白通常来自：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;画布太大&lt;/li&gt;
&lt;li&gt;内容排得太散&lt;/li&gt;
&lt;li&gt;节点数量不多但用了过宽画布&lt;/li&gt;
&lt;li&gt;图已经画完，但没有按内容重新裁边&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;解决方法&lt;a href=&quot;#解决方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;方法 1：先按内容布局，再决定画布大小&lt;a href=&quot;#方法-1先按内容布局再决定画布大小&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;不要先固定一个很大的画布。&lt;/p&gt;&lt;p&gt;正确顺序：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;先算节点范围&lt;/li&gt;
&lt;li&gt;再根据节点整体范围加少量边距&lt;/li&gt;
&lt;li&gt;最后生成画布尺寸&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而不是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;先定一个 2000+ 宽的画布&lt;/li&gt;
&lt;li&gt;再把内容放中间&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方法 2：边距要“小而够用”&lt;a href=&quot;#方法-2边距要小而够用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;推荐：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;左右边距：40~60 px&lt;/li&gt;
&lt;li&gt;上边距：给标题留 50~80 px&lt;/li&gt;
&lt;li&gt;下边距：30~50 px&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;只留“呼吸感”，不要留“旷野感”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方法 3：输出前做一次裁紧&lt;a href=&quot;#方法-3输出前做一次裁紧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;最终输出前，要检查：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;最左节点到左边缘的距离&lt;/li&gt;
&lt;li&gt;最右节点到右边缘的距离&lt;/li&gt;
&lt;li&gt;最下节点到下边缘的距离&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果某一边空白明显大于其他边，就要重新裁紧。&lt;/p&gt;&lt;p&gt;博客图更适合：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;紧凑画布 + 统一留白&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;而不是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;一边空很多，一边很挤&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;七、如何避免图片里出现过多无关说明文字&lt;a href=&quot;#七如何避免图片里出现过多无关说明文字&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;应删掉的内容&lt;a href=&quot;#应删掉的内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这些通常不应该出现在最终博客图中：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“阅读方式引导”&lt;/li&gt;
&lt;li&gt;“彩色博客插图版”&lt;/li&gt;
&lt;li&gt;“流程总览”&lt;/li&gt;
&lt;li&gt;“这是一个示意图”&lt;/li&gt;
&lt;li&gt;“循环执行 / 迭代推理”这类非必要提示&lt;/li&gt;
&lt;li&gt;大段解释句&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些说明如果真的需要，应该放在：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;图片下方正文&lt;/li&gt;
&lt;li&gt;图注&lt;/li&gt;
&lt;li&gt;图片前后的文章段落&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而不是塞进图里。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;该保留什么&lt;a href=&quot;#该保留什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通常保留：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;主标题&lt;/li&gt;
&lt;li&gt;节点名&lt;/li&gt;
&lt;li&gt;必要的分层标签（如果确实有用）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;可选保留：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;极少量的阶段标签&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果图已经能看懂，就尽量不要加额外文字。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;八、一个推荐的出图流程模板&lt;a href=&quot;#八一个推荐的出图流程模板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以后要从文字生成博客插图，可以直接照这个模板走：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;输入模板&lt;a href=&quot;#输入模板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;主题：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用途：博客插图 / 流程图 / 结构图&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;风格：Excalidraw 手绘风 / 彩色博客插图版&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;主流程：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;分层（可选）：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 入口层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 调度层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 执行层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 不要太多说明文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 不要大面积空白&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 适合博客展示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;Show more&lt;/span&gt;&lt;span&gt;Show less&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;输出步骤&lt;a href=&quot;#输出步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;提炼节点&lt;/li&gt;
&lt;li&gt;确认节点顺序&lt;/li&gt;
&lt;li&gt;确认图类型&lt;/li&gt;
&lt;li&gt;确认风格（手绘 / 彩色 / 极简）&lt;/li&gt;
&lt;li&gt;生成第一版图&lt;/li&gt;
&lt;li&gt;精修：
&lt;ul&gt;
&lt;li&gt;去掉无关说明字&lt;/li&gt;
&lt;li&gt;压缩空白&lt;/li&gt;
&lt;li&gt;调整颜色&lt;/li&gt;
&lt;li&gt;调整节点间距&lt;/li&gt;
&lt;li&gt;检查在博客里是否协调&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最终插入文章&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;九、博客落地建议&lt;a href=&quot;#九博客落地建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果图片最终要放进博客，建议统一这样做：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;文件放置位置&lt;a href=&quot;#文件放置位置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;放到文章所属目录或博客静态资源目录，例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;public/uploads/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;或信息库文档同目录&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;文件命名建议&lt;a href=&quot;#文件命名建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;尽量：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;英文 / 拼音 / 连字符&lt;/li&gt;
&lt;li&gt;不要太长&lt;/li&gt;
&lt;li&gt;语义清楚&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openclaw-message-flow-tight.svg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rag-workflow-handdrawn.svg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent-loop-diagram.png&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;图片引用方式&lt;a href=&quot;#图片引用方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Markdown 中：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;![&lt;/span&gt;&lt;span&gt;OpenClaw 流程图&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/openclaw-message-flow-tight.svg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果是博客站点内的 &lt;code&gt;public/&lt;/code&gt; 目录，也建议统一用绝对路径引用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;十、最终经验总结&lt;a href=&quot;#十最终经验总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;把文字变成博客图片，最重要的不是“让模型乱画”，而是：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 先整理结构&lt;a href=&quot;#1-先整理结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;没有结构的文字，出不了好图。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 博客图要重可读性&lt;a href=&quot;#2-博客图要重可读性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先让读者看懂，再考虑装饰。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 说明文字越少越高级&lt;a href=&quot;#3-说明文字越少越高级&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;图里只保留必须的字。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 画布一定要裁紧&lt;a href=&quot;#4-画布一定要裁紧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;不要让图片一侧出现大片空白。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 精修非常重要&lt;a href=&quot;#5-精修非常重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;第一版通常只是“能看”，第二版、第三版才是“适合放博客”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;十一、推荐默认规则（可直接复用）&lt;a href=&quot;#十一推荐默认规则可直接复用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果以后没有特别说明，默认按以下规则生成博客插图：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;风格：Excalidraw 手绘风&lt;/li&gt;
&lt;li&gt;版本：彩色博客插图版&lt;/li&gt;
&lt;li&gt;画布：按内容裁紧，避免大面积空白&lt;/li&gt;
&lt;li&gt;字数：节点内尽量短&lt;/li&gt;
&lt;li&gt;说明文字：只保留主标题，去掉多余说明&lt;/li&gt;
&lt;li&gt;配色：低饱和分层色&lt;/li&gt;
&lt;li&gt;目标：适合博客插图，而不是 PPT 或海报&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;十二、一句话版本&lt;a href=&quot;#十二一句话版本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;文字生成博客图片的最佳流程是：先提炼结构，再选图类型，再选手绘/彩色风格，生成后重点精修“说明文字”和“画布留白”，最终做成紧凑、清晰、适合博客阅读的插图。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item></channel></rss>