<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post/681/</link>
<title><![CDATA[限时活动，免费白嫖Nano Banana Pro、Gemini3.0、GPT5.2等最新模型]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[资源共享]]></category>
<pubDate>Thu, 05 Feb 2026 03:55:27 +0000</pubDate> 
<guid>https://www.heckjj.com/post/681/</guid> 
<description>
<![CDATA[ 
	限时活动，免费白嫖Nano Banana Pro、Gemini3.0、GPT5.2等最新模型，在问AI出的活动，估计也是为了推广，白嫖付费ai，基本无限用gemini3.0pro，完全无限使用nanobanana和即梦4.0绘图。<br/><a href="https://www.heckjj.com/attachment.php?fid=268" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=268" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="https://www.zaiwenai.com?channel-code=69841486f2d7933d88f0b551" target="_blank">点此跳转注册</a><br/>邀请链接注册后，你我都可以获得99999点数，用来Ai文本对话或Ai绘图，你有体验无限时卡。
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/680/</link>
<title><![CDATA[编程初学者实用代码整洁入门指南]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Mon, 02 Feb 2026 05:14:32 +0000</pubDate> 
<guid>https://www.heckjj.com/post/680/</guid> 
<description>
<![CDATA[ 
	编写干净、易于理解且可维护的代码是每位开发者必须掌握的技能。我们将探讨提高代码质量的最重要原则，并为每个原则提供代码示例。<br/><br/>如何命名变量（以及其他事物）<br/><br/>我们不用内存地址而使用名称的原因是：名称更容易记忆。更重要的是，它们能提供更多关于变量的信息，以便其他人理解其意义。<br/><br/>找到一个好的名字可能需要一些时间，但这将在未来为你和你的团队节省更多时间。而且我确信大多数读者都遇到过这种情况：几个月后再次访问自己的代码时，很难理解之前做了什么。<br/><br/><br/>如何创建有意义的名字<br/>不要用注释来解释变量的用途。如果一个名字需要注释，那么你应该花时间重命名那个变量，而不是写注释。<br/><br/>差：<br/><br/>var d; // elapsed time in days<br/>我见过这种代码无数次。人们普遍认为应该用注释来隐藏代码的混乱，但这是一种常见的误解。除非有充分理由，否则不要使用 x、y、a 或 b 等字母作为变量名（循环变量除外）。<br/><br/>好：<br/><br/>var elapsedTimeInDays;<br/>var daysSinceCreation;<br/>var daysSinceModification;<br/>这些名称要好得多。它们告诉你被测量的内容以及该测量的单位。<br/><br/><br/><br/>避免错误信息<br/>注意那些有特定含义的词语。除非其类型确实是 List，否则不要将一组账户称为 accountList。这个词有特定的含义，可能会导致错误的结论。<br/><br/>即使类型是列表，accounts 也是一个更简单、更好的名称。<br/><br/>差：<br/><br/>var accountList = [];<br/>好：<br/><br/>var accounts = [];<br/><br/><br/>避免噪音词<br/>噪声词是指那些不提供任何关于变量额外信息的词。它们是冗余的，应该被删除。<br/><br/>一些常见的噪声词有：<br/><br/>The (prefix)<br/><br/>Info<br/><br/>Data<br/><br/>Variable<br/><br/>Object<br/><br/>Manager<br/><br/>如果你的类名是 UserInfo，你只需去掉 Info，直接用 User。将类名用 BookData 代替 Book 是毋庸置疑的，因为类本来就是为了存储数据而存在的。<br/><br/><br/>使用发音友好的名称<br/>如果你不会读一个名字，讨论它时就会显得很愚蠢。<br/><br/>差：<br/><br/>const yyyymmdstr = moment().format(&quot;YYYY/MM/DD&quot;);<br/>好：<br/><br/>const currentDate = moment().format(&quot;YYYY/MM/DD&quot;);<br/><br/><br/>使用可搜索的名称<br/>避免在代码中使用魔法数字。选择可搜索的、命名的常量。不要为常量使用单个字母的名称，因为它们可能出现在很多地方，因此不易搜索。<br/><br/>差：<br/><br/>if (student.classes.length &lt; 7) &#123;<br/>&nbsp;&nbsp; // Do something<br/>&#125;<br/>好：<br/><br/>if (student.classes.length &lt; MAX_CLASSES_PER_STUDENT) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Do something<br/>&#125;<br/>这样更好，因为 MAX_CLASSES_PER_STUDENT 可以在代码的许多地方使用。如果将来需要将其改为 6，我们只需更改常量即可。<br/><br/>糟糕的例子会在读者脑海中产生疑问，比如 7 的重要性是什么？<br/><br/>你也应该使用你语言的常量命名和声明约定，例如 Java 中的 private static final 或 JavaScript 中的 const。<br/><br/><br/>保持一致性<br/>遵循每个概念用一个词的规则。不要在不同的类中对同一操作使用 fetch、retrieve 和 get。选择其中一个并在整个项目中统一使用，这样维护代码库的人员或你的 API 客户可以轻松找到他们正在寻找的方法。<br/><br/><br/><br/>如何编写函数<br/>保持它们简短<br/>函数应该很小，真的很小。它们很少会是 20 行长。一个函数越长，它就越可能做很多事情并产生副作用。<br/><br/><br/><br/>确保它们只做一件事<br/>你的函数应该只做一件事情。如果你遵循这个规则，它们一定会很小。函数所做的一切都应该体现在它的名字中。<br/><br/>有时候很难从函数名来判断它是否做了多件事情。一个很好的检查方法是尝试提取一个具有不同名字的另一个函数。如果你能找到，那就意味着它应该是一个不同的函数。<br/><br/>这可能是本文中最重要的概念，需要一些时间来适应。但一旦你掌握了它，你的代码看起来会更加成熟，而且肯定会更容易重构、理解和测试。<br/><br/><br/><br/>将条件语句封装在函数中<br/>重构条件并将其放入命名函数中是使你的条件语句更易读的好方法。<br/><br/>这是我从学校项目里的一段代码。这段代码负责在 Connect4 游戏的棋盘上插入芯片。<br/><br/>isValidInsertion 方法负责检查列号的有效性，让我们可以专注于插入芯片的逻辑。<br/><br/>public void insertChipAt(int column) throws Exception &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (isValidInsertion(column)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertChip(column);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boardConfiguration += column;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentPlayer = currentPlayer == Chip.RED ? Chip.YELLOW : Chip.RED;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!columnExistsAt(column))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IllegalArgumentException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (isColumnFull(column - 1) &#124;&#124; getWinner() != Chip.NONE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new RuntimeException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>如果你感兴趣，这里是 isValidInsertion 的代码。<br/><br/>&nbsp;&nbsp;private boolean isValidInsertion(int column) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;boolean columnIsAvailable = column &lt;= NUM_COLUMNS &amp;&amp; column &gt;= 1 &amp;&amp; numberOfItemsInColumn[column - 1] &lt; NUM_ROWS;<br/>&nbsp;&nbsp;&nbsp;&nbsp;boolean gameIsOver = getWinner() != Chip.NONE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return columnIsAvailable &amp;&amp; !gameIsOver;<br/>&#125;<br/>如果没有方法，if 条件将如下所示：<br/><br/>if (column &lt;= NUM_COLUMNS<br/> &amp;&amp; column &gt;= 1<br/> &amp;&amp; numberOfItemsInColumn[column - 1] &lt; NUM_ROWS <br/> &amp;&amp; getWinner() != Chip.NONE)<br/>恶心，对吧？我同意。<br/><br/><br/><br/>减少参数<br/>函数应该有两个或更少的参数，越少越好。尽量避免有三个或更多参数。<br/><br/>参数使得函数更难阅读和理解。从测试的角度来看，它们甚至更难，因为它们需要为每个参数组合编写测试用例。<br/><br/><br/><br/>不要使用标志参数<br/>标志参数是一个传递给函数的布尔值参数。根据这个参数的值，会采取两种不同的操作。<br/><br/>例如，假设有一个负责预订音乐会门票的函数，并且有两种类型的用户：高级和普通。你可以编写如下代码：<br/><br/>public Booking book (Customer aCustomer, boolean isPremium) &#123;<br/>&nbsp;&nbsp;if(isPremium) <br/>&nbsp;&nbsp; // logic for premium book<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp; // logic for regular booking<br/>&#125;<br/>标志参数天然地违背了单一职责原则。当你看到它们时，应该考虑将函数拆分成两个。<br/><br/><br/><br/>不要有副作用<br/>副作用是你的代码的意外后果。它们可能是改变传递的参数，在按引用传递的情况下，或者可能改变一个全局变量。<br/><br/>关键点在于，它们承诺做另一件事，你需要仔细阅读代码才能注意到副作用。它们可能导致一些棘手的错误。<br/><br/>public class UserValidator &#123;<br/>&nbsp;&nbsp;private Cryptographer cryptographer;<br/>&nbsp;&nbsp;public boolean checkPassword(String userName, String password) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;User user = UserGateway.findByName(userName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (user != User.NULL) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String codedPhrase = user.getPhraseEncodedByPassword();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String phrase = cryptographer.decrypt(codedPhrase, password);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&quot;Valid Password&quot;.equals(phrase)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.initialize();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return false; <br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/>你能看到这个函数的副作用吗？<br/><br/>它在检查密码，但当密码有效时，它还会初始化会话，这是一个副作用。<br/><br/>你可以将函数的名称改为类似 checkPasswordAndInitializeSession，以使这种效果显式化。但当你这样做时，你应该注意到你的函数实际上在处理两件事，你不应该在这里初始化会话。<br/><br/><br/><br/>不要重复自己<br/>代码重复可能是软件中所有邪恶的根源。重复的代码意味着在逻辑发生变化时需要在多个地方进行修改，而且非常容易出错。<br/><br/>使用你的 IDE 的重构功能，每当遇到重复的代码片段时，提取一个方法。<br/><br/><br/><br/>其他<br/>不要在代码注释中留下代码<br/>请勿如此。这一点很严重，因为看到代码的其他人会因为不知道它是否有什么用而不敢删除它。那些被注释掉的代码会停留很长时间。然后当变量名或方法名改变时，它变得无关紧要，但仍然没有人删除它。<br/><br/>干脆删除它。即使它很重要，也有版本控制可以找回。<br/><br/><br/><br/>了解你语言的规范<br/>你应该了解你语言在空格、注释和命名方面的规范。许多语言都有可用的风格指南。<br/><br/>例如，你应该在 Java 中使用 camelCase，但在 Python 中使用 snake_case。在 C#中，你应该将开括号放在新行，但在 Java 和 JavaScript 中，你应该将它们放在同一行。<br/><br/>这些事情因语言而异，没有统一的标准。<br/><br/><br/>结论<br/>编写干净代码并非一蹴而就的技能，它是一种需要时刻牢记这些原则并在编写代码时加以应用的习惯。<br/><br/>感谢您抽出时间阅读，希望对您有所帮助。
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/679/</link>
<title><![CDATA[Sublime Text 激活注册方法]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[资源共享]]></category>
<pubDate>Thu, 29 Jan 2026 01:25:38 +0000</pubDate> 
<guid>https://www.heckjj.com/post/679/</guid> 
<description>
<![CDATA[ 
	Sublime Text V4200及以上版本激活注册方法另请参阅：<br/><a href="https://www.heckjj.com/post/678/" target="_blank">https://www.heckjj.com/post/678/</a><br/><br/>问题描述<br/>2025.01.20 Sublime Text更新了最新版本V4192，本文介绍该版本的激活注册方法<br/>本文激活注册方法同样适用于V4192及以下版本(已实测版本：V4180~V4192)<br/>激活过程无需使用第三方软件<br/><br/>下载地址<br/>官方网址：<a href="https://www.sublimetext.com" target="_blank">https://www.sublimetext.com</a><br/>更新日志：<a href="https://www.sublimetext.com/download" target="_blank">https://www.sublimetext.com/download</a><br/>下载地址(V4200 64位)：<a href="https://download.sublimetext.com/sublime_text_build_4192_x64_setup.exe" target="_blank">https://download.sublimetext.com/sublime_text_build_4192_x64_setup.exe</a><br/>未激活表现显示为unregisted<br/><br/><br/>激活方法<br/>找到Sublime Text安装路径<br/>右键快捷方式→打开文件所在的位置<br/>默认安装路径：C:&#92;Program Files&#92;Sublime Text<br/>找到sublime_text.exe，拷贝一份副本，使用Sublime Text打开副本文件<br/>也可以使用其它能够以十六进制打开exe文件的编辑软件<br/>另外推荐一个基于浏览器的在线十六进制编辑工具：https://hexed.it/<br/><br/><br/>使用快捷键Ctrl + H打开搜索替换功能<br/>查找以下十六进制字段<br/>8079 0500 0f94 c2<br/>替换为<br/>c641 0501 b200 90<br/><br/><br/><br/>替换完成后使用快捷键Ctrl + S保存并关闭<br/>移除原sublime_text.exe文件(或改为其它名称备份)，然后将编辑后的副本文件名称修改为sublime_text.exe<br/>激活后表现<br/>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/678/</link>
<title><![CDATA[Sublime Text 激活注册方法(同步更新：V4200 2026.01.28)]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[资源共享]]></category>
<pubDate>Tue, 27 Jan 2026 17:21:05 +0000</pubDate> 
<guid>https://www.heckjj.com/post/678/</guid> 
<description>
<![CDATA[ 
	Sublime Text V4192及以下版本激活注册方法另请参阅：<br/><a href="https://www.heckjj.com/post/679/" target="_blank">https://www.heckjj.com/post/679/</a><br/><br/>问题描述<br/>2025.05.21 Sublime Text更新了最新版本V4200，本文介绍该版本的激活注册方法<br/>激活过程无需使用第三方软件<br/><br/>下载地址<br/>官方网址：<a href="https://www.sublimetext.com" target="_blank">https://www.sublimetext.com</a><br/>更新日志：<a href="https://www.sublimetext.com/download" target="_blank">https://www.sublimetext.com/download</a><br/>下载地址(V4200 64位)：<a href="https://download.sublimetext.com/sublime_text_build_4200_x64_setup.exe" target="_blank">https://download.sublimetext.com/sublime_text_build_4200_x64_setup.exe</a><br/>未激活表现显示为unregisted<br/><br/>激活方法<br/>1、找到Sublime Text安装路径<br/>右键快捷方式→打开文件所在的位置<br/>默认安装路径：C:&#92;Program Files&#92;Sublime Text<br/>2、找到sublime_text.exe，拷贝一份副本，使用Sublime Text打开副本文件<br/>也可以使用其它能够以十六进制打开exe文件的编辑软件<br/>另外推荐一个基于浏览器的在线十六进制编辑工具：https://hexed.it/<br/><br/>使用快捷键Ctrl + H打开搜索替换功能<br/>查找以下十六进制字段<br/>0fb6 5105 83f2 01<br/>替换为(二选其一即可)<br/>c641 0501 b200 90<br/>或<br/>c641 0501 4885 c0<br/><br/>替换完成后使用快捷键Ctrl + S保存并关闭<br/>移除原sublime_text.exe文件(建议改为其它名称留作备份)，然后将编辑后的副本文件名称修改为sublime_text.exe<br/>激活后表现为无unregisted
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/677/</link>
<title><![CDATA[Win11系统如何跳过联网激活，新笔记本也适用无需登录微软账户]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[电脑技术]]></category>
<pubDate>Wed, 21 Jan 2026 05:44:11 +0000</pubDate> 
<guid>https://www.heckjj.com/post/677/</guid> 
<description>
<![CDATA[ 
	由于售后服务条款：已激活windows系统或Ofice的主机，不支持7天无理由退换货。由于windows系统联网时自动激活，请您确认需求后再激活使用。<br/><br/>在Windows 11安装或首次设置过程中跳过联网步骤，可通过命令提示符输入特定指令实现。‌核心方法是：在联网界面按 Shift + F10（笔记本需加 Fn）打开命令提示符，输入 oobe&#92;bypassnro 后回车，重启后选择“我没有Internet连接”选项即可‌。以下是详细步骤：‌‌‌<br/><br/><br/>操作步骤（通用方法）<br/>此方法适用于所有Windows 11版本（24H2及更早），成功率最高：<br/><br/>‌进入联网界面‌：在系统安装或首次开机设置时，到达“连接网络”页面（需输入Wi-Fi或网线连接）。‌<br/><br/>‌打开命令提示符‌：<br/>台式机：直接按 Shift + F10。<br/>笔记本：按 Fn + Shift + F10（部分机型需组合键）。‌<br/><br/>‌输入跳过指令‌：<br/>在弹出窗口中输入：oobe&#92;bypassnro（或 oobe&#92;bypassnro.cmd），按回车。‌<br/>或者先cd oobe再输入bypassnro.cmd回车<br/><br/><br/>系统自动重启（约1-2分钟）。‌<br/><br/>‌选择离线选项‌：<br/>重启后返回联网界面，点击底部 ‌“我没有Internet连接”‌。<br/>后续按提示设置本地账户（无需微软账号）。‌<br/><br/>注意事项<br/>‌网络断开建议‌：若在虚拟机或笔记本操作，提前断开Wi-Fi/网线可提高成功率（非必须）。‌<br/><br/>‌命令无效处理‌：若输入后未重启，检查拼写（如 bypassnro 非 BYPASSNRO），或改用任务管理器结束 OOBE Network Connection Flow 进程。‌<br/>‌后续影响‌：跳过联网后部分功能受限（如OneDrive同步），但基础使用无碍；进入桌面后可重新联网。‌
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/676/</link>
<title><![CDATA[win11家庭版升级到专业版/企业版教程]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[电脑技术]]></category>
<pubDate>Mon, 19 Jan 2026 13:56:19 +0000</pubDate> 
<guid>https://www.heckjj.com/post/676/</guid> 
<description>
<![CDATA[ 
	win11家庭版升级到专业版/企业版教程，专业版/企业版回退到家庭版也是一样的<br/><br/>准备工作<br/>资源都是网上获取的，网友分享出来的，不一定都有效，作者试的时候第一个专业版就可以使用。<br/><br/>win11专业版序烈号：<br/>D9W3G-NR2D7-6W3RK-WDD4J-7FR9G<br/>Y7DJH-BN6WF-BB3RV-82F8F-R3KTY<br/>Y4N7X-CF46G-92G6X-PW86V-VT9TT<br/>RWQ2G-NXBQJ-JRT27-WX36H-JQKTT<br/>H7HNM-BWTTC-4M99X-KM3Y3-B98XG<br/>RHNCY-6QJWF-WPHP7-2FP87-4C2KG<br/>win11家庭版序烈号：<br/>MNBKY-RCQKQ-HHC9Q-M99RP-D68K3<br/>NT7K-GCD4D-WYVCH-W6CRX-Y7TVD<br/>7WVY4-3N6D4-WRQBV-286XJ-7FQ3Q<br/>PNGPM-B8MVX-VV7MH-MJ9M7-MBGVD<br/>TFFXW-N6BG8-6WTBC-3Q4GY-CWD3Q<br/>D9YRN-B6QMK-XF7BY-6DM99-RM33Q<br/>win11教育版序烈号：<br/>RNXJ9-3R383-8HDD2-44K63-Y4G4V<br/>768RN-FVXXG-7DTYF-XGVJ3-XHJWB<br/>JFMNH-FY6TV-T2JCW-6R6P3-T6PJB<br/>V279K-24N46-KM9BG-VVMT8-JFG4V<br/>XGVPP-NMH47-7TTHJ-W3FW7-8HV2C<br/>win11企业版序烈号：<br/>WGGHN-J84D6-QYCPR-T7PJ7-X766F<br/>3KHY7-WNT83-DGQKR-F7HPR-844BM<br/>7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH<br/>PVMJN-6DFY6-9CCP6-7BKTT-D3WVR<br/>TX9XD-98N7V-6WMQ6-BX7FG-H8Q99<br/>PPBK3-M92CH-MRR9X-34Y9P-7CH2F<br/>可以用这两个序烈号试试看<br/>J8WVF-9X3GM-4WVYC-VDHQG-42CXT<br/>7Y64F-88DCY-Y6WTC-H33D2-64QHF<br/>开始<br/>1、打开系统设置，并选择激活<br/><br/>​2、选择更改产品秘钥；<br/><br/>备注：因为本人已经激活了，这里只是演示，真实操作方法也是这样；<br/><br/>3、在对话匡中输入你想要激活的windows 11版本<br/><br/>我用的是D9W3G-NR2D7-6W3RK-WDD4J-7FR9G；<br/><br/>完成后最好重启一下电脑；<br/><br/>再次查看<br/>再次进来后，如果电脑还是未激活状态，简单了，只要他是专业版了激活一下就好，可以再用上面的专业版激活码试试，还不行就看下面的方法。<br/><br/>关于专业版，企业版等降级到家庭版<br/>从降级这两个字就能知识，降级后一些功能没有了，所以更内容，必定做什么删除都比添加容易，照着上面的方法改一下就行了。<br/><br/>再次激活<br/>有的同学出现多次操作还是不能激活的情况，这里把方法说出来，本人也是这样解决的。<br/><br/>使用第三方软件<br/>目前来说使用第三方软件是最好的，主流的是KMS，推荐HEU KMS Activator，我记的有一篇文章还这样写着：<br/><br/>KMS激活 ≠ 盗版激活，没有“授权” = “盗版”激活。<br/><br/>KMS 激活并不像一些人误解的全是盗版。其本身是微软为企业、组织提供的批量激活方式，企业、组织通过像微软购买许可，架设 KMS 激活服务器就可供其成员激活 Windows 和 Office 。<br/><br/>KMS激活是什么？<br/>KMS全称：Key Management Service，是一种微软提供的激活方式，通常用于企业环境中。通过KMS，组织可以在内部搭建激活服务器，管理大量计算机的激活状态。激活原理：先在局域网内选择一台计算机作为KMS服务器（KMS Host），该服务器需要永久激活并始终保持开机和联网状态。其他计算机作为KMS客户端（KMS Client），向KMS服务器请求激活。当客户端请求激活后，服务器会向客户端注入激活信息。<br/><br/>这些第三方搭建KMS服务器的组件已经小到KB级别，例如：HEU KMS Activator ，”知彼而知己”的大神所开发的万能激活工具，此工具可以完美的激活Windows以及Office的VL版本，不需要联网也能一键激活。
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/675/</link>
<title><![CDATA[当你还在一个词一个词地调教 Prompt 时，硅谷的大佬们已经在布局上下文工程（Context Engineering）啦]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Thu, 17 Jul 2025 01:11:54 +0000</pubDate> 
<guid>https://www.heckjj.com/post/675/</guid> 
<description>
<![CDATA[ 
	当你还在一个词一个词地调教 Prompt 时，硅谷的大佬们已经在布局上下文工程（Context Engineering）了。<br/><br/>推特上的 AI 架构师 @HeyNina101 一针见血地指出：「提示词工程是给爱好者玩的，上下文工程（Context Engineering）才是专业生产力。」这条推文迅速引爆了硅谷技术圈，Shopify CEO Tobi Lutke 和前特斯拉 AI 总监 Andrej Karpathy 等大佬纷纷点赞。<br/><br/>Prompt vs 上下文<br/><br/>你在对话框里敲下的指令，就是 Prompt。<br/><br/>但一个能打的 AI 应用，需要的远不止 Prompt。还需要为模型构建整个世界观，这就是「上下文工程」。<br/><br/>上下文工程包括：<br/><br/>任务设定：明确告诉 AI 要干嘛<br/>案例示范：给它几个栗子学学<br/>外部文档：挂载知识库，让它变身专家<br/>对话历史：让 AI 拥有短期记忆<br/>工具输出：调用 API 后的结果反馈<br/>系统状态：应用当前的运行情况<br/>长期记忆：跨越对话周期的记忆<br/>信息压缩：在有限的上下文中高效传递信息<br/>多模态：不止文本，还有图片、声音等等<br/><br/>上下文给的太少，AI 就是人工智障；给的太多，系统就运行变慢、或者烧光你的预算。如何拿捏好这个平衡，不仅仅是简单的指令艺术，更是一个系统设计的挑战。<br/><br/>真正的LLM应用，远不止套壳<br/><br/>一个生产级的 LLM 应用，不仅仅是上面这些，还需要：<br/><br/>控制流：设计 AI 的思考和行动路径<br/>上下文打包：智能筛选、组合信息喂给模型<br/>模型路由：根据任务，自动切换最合适的模型<br/>UI 与生成验证：确保输出的内容能看、能用<br/>安全护栏、评估、预取、并行计算...<br/><br/>这个复杂的系统，我们称之为 LLM 软件工程，而「上下文」正是这个新世界的核心层。<br/><br/>到底是谁在控制 LLM？<br/><br/>Google DeepMind 的工程师 Philipp Schmid 用一张图给出了答案：真正决定 LLM 行为的，是一个由指令、用户输入、历史、文档、工具等共同构成的庞大上下文系统。<br/><br/>所以，别再只盯着那个小小的输入框了。<br/><br/>你认为上下文工程会是下一个风口吗？<br/>独立开发者如何抓住这个机会？<br/>评论区聊聊你的看法<br/><a href="https://www.heckjj.com/attachment.php?fid=264" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=264" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="400" height="400"/></a><a href="https://www.heckjj.com/attachment.php?fid=265" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=265" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="400" height="400"/></a><a href="https://www.heckjj.com/attachment.php?fid=266" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=266" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="400" height="400"/></a><a href="https://www.heckjj.com/attachment.php?fid=267" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=267" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="400" height="400"/></a><br/><br/>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/674/</link>
<title><![CDATA[一文搞懂Fine-tuning大模型微调]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Thu, 17 Jul 2025 01:11:49 +0000</pubDate> 
<guid>https://www.heckjj.com/post/674/</guid> 
<description>
<![CDATA[ 
	本篇文章深入分析了大型模型微调的基本理念和多样化技术，细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景，使得读者可以依据特定的应用要求和计算资源限制，挑选最适合的微调方案。<br/><br/>一、大型模型微调的基础理论<br/>大型语言模型(LLM)的训练过程通常分为两大阶段：<br/><br/>阶段一：预训练阶段<br/>在这个阶段，大型模型会在大规模的无标签数据集上接受训练，目标是使模型掌握语言的统计特征和基础知识。此期间，模型将掌握词汇的含义、句子的构造规则以及文本的基本信息和上下文。<br/>需特别指出，预训练实质上是一种无监督学习过程。完成预训练的模型，亦即基座模型(Base Model)，拥有了普遍适用的预测能力。例如，GLM-130B模型、OpenAI的四个主要模型均属于基座模型。<br/><br/>阶段二：微调阶段<br/>预训练完成的模型接下来会在针对性的任务数据集上接受更进一步的训练。这一阶段主要涉及对模型权重的细微调整，使其更好地适配具体任务。最终形成的模型将具备不同的能力，如gpt code系列、gpt text系列、ChatGLM-6B等。<br/><br/>那么，何为大型模型微调？<br/>直观上，大型模型微调即是向模型“输入”更多信息，对模型的特定功能进行“优化”，通过输入特定领域的数据集，使模型学习该领域知识，从而优化大模型在特定领域的NLP任务中的表现，如情感分析、实体识别、文本分类、对话生成等。<br/><br/><br/>为何微调至关重要？<br/>其核心理由是，微调能够“装备”大模型以更精细化的功能，例如整合本地知识库进行搜索、针对特定领域问题构建问答系统等。<br/>以VisualGLM为例，作为一个通用多模态模型，当应用于医学影像判别时，就需要输入医学影像领域的数据集以进行微调，以此提升模型在医学影像图像识别方面的表现。<br/>这与机器学习模型的超参数优化类似，只有在调整超参数后，模型才能更好地适应当前数据集；同时，大型模型可以经历多轮微调，每次微调都是对模型能力的优化，即我们可以在现有的、已经具备一定能力的大模型基础上进一步进行微调。<br/><br/>二、大型模型的经典网络结构<br/>以GPT系列中的Transformer为例，这种深度学习模型结构通过自注意力机制等技巧解决了相关问题。正是得益于Transformer架构，基于GPT的大型语言模型取得了显著的进展。<br/>Transformer模型架构包含了众多模块，而我们讨论的各种微调技术通常是对这些模块中的特定部分进行优化，以实现微调目的。<br/><br/>要深入理解各类微调手段，首先需要对网络架构有一个基本的认识。以下以Transformer为例，阐述各个模块的作用：<br/><br/>输入嵌入层（Input Embedding）<br/>输入（Inputs）：模型的输入环节，通常为单词或符号序列。<br/>输入嵌入（Input Embedding）：此步骤将输入序列（例如句中的每个单词）转化为嵌入表示，即能够表征单词语义信息的高维向量。<br/>位置编码（Positional Encoding）：鉴于Transformer不依赖序列，位置编码旨在提供序列中单词位置的信息，这些编码添加到输入嵌入中，确保模型即便同时处理输入也能够利用单词的顺序信息。<br/>编码器层（Encoder，左边）<br/>Nx：指示有N个相同的编码器层叠加而成。每个编码器层包括两个主要子层：多头自注意力机制和前馈神经网络。<br/>多头自注意力（Multi-Head Attention）：注意力机制允许模型在处理每个单词时考虑到输入序列中的所有单词。多头部分表示模型并行学习输入数据的不同表示。<br/>残差连接和归一化（Add &amp; Norm）：注意力层后面跟着残差连接和层归一化，有助于防止深层网络中的梯度消失问题，并稳定训练过程。<br/>前馈神经网络（Feed Forward）：全连接神经网络处理自注意力层的输出，包含两个线性变换和一个非线性激活函数。<br/>解码器层（Decoder，右侧）<br/>解码器亦包含多个相同的层，每层包括三个主要子层：掩蔽的多头自注意力机制、多头自注意力机制和前馈神经网络。<br/>掩蔽多头自注意力（Masked Multi-Head Attention）：与编码器的多头自注意力机制类似，但为确保解码顺序性，掩蔽操作确保预测仅依赖于之前的输出。<br/>前馈神经网络（Feed Forward）：与编码器相同，每个子层之后也有加法和归一化步骤。<br/>输出嵌入层和输出过程<br/>解码器端的嵌入层将目标序列转换为向量形式。<br/>线性层（Linear）和Softmax层：解码器的输出通过线性层映射到一个更大的词汇空间，Softmax函数将输出转换为概率分布。<br/><br/>三、大型模型微调的技术手段<br/><br/>大型模型的全面微调（Fine-tuning）涉及调整所有层和参数，以适配特定任务。此过程通常采用较小的学习率和特定任务的数据，可以充分利用预训练模型的通用特征，但可能需要更多计算资源。<br/><br/>参数高效微调（Parameter-Efficient Fine-Tuning，PEFT）旨在通过最小化微调参数数量和计算复杂度，提升预训练模型在新任务上的表现，从而减轻大型预训练模型的训练负担。<br/><br/>即使在计算资源受限的情况下，PEFT技术也能够利用预训练模型的知识快速适应新任务，实现有效的迁移学习。因此，PEFT不仅能提升模型效果，还能显著缩短训练时间和计算成本，使更多研究者能够参与到深度学习的研究中。<br/><br/>PEFT包括LoRA、QLoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)、提示调整(Prompt Tuning)、P-Tuning及P-Tuning v2等多种方法。<br/><br/>以下图表示了7种主流微调方法在Transformer网络架构中的作用位置及其简要说明，接下来将详细介绍每一种方法。<br/><br/>1、LoRA<br/>LoRA（Low-Rank Adaptation）是一种旨在微调大型预训练语言模型（如GPT-3或BERT）的技术。其核心理念在于，在模型的决定性层次中引入小型、低秩的矩阵来实现模型行为的微调，而无需对整个模型结构进行大幅度修改。<br/>这种方法的优势在于，在不显著增加额外计算负担的前提下，能够有效地微调模型，同时保留模型原有的性能水准。<br/>LoRA的操作流程如下：<br/><br/>确定微调目标权重矩阵：首先在大型模型（例如GPT）中识别出需要微调的权重矩阵，这些矩阵一般位于模型的多头自注意力和前馈神经网络部分。<br/>引入两个低秩矩阵：然后，引入两个维度较小的低秩矩阵A和B。假设原始权重矩阵的尺寸为dd，则A和B的尺寸可能为dr和r*d，其中r远小于d。<br/>计算低秩更新：通过这两个低秩矩阵的乘积AB来生成一个新矩阵，其秩（即r）远小于原始权重矩阵的秩。这个乘积实际上是对原始权重矩阵的一种低秩近似调整。<br/>结合原始权重：最终，新生成的低秩矩阵AB被叠加到原始权重矩阵上。因此，原始权重经过了微调，但大部分权重维持不变。这个过程可以用数学表达式描述为：新权重 = 原始权重 + AB。<br/>以一个具体实例来说，假设我们手头有一个大型语言模型，它通常用于执行广泛的自然语言处理任务。现在，我们打算将其微调，使其在处理医疗健康相关的文本上更为擅长。<br/>采用LoRA方法，我们无需直接修改模型现有的大量权重。相反，只需在模型的关键部位引入低秩矩阵，并通过这些矩阵的乘积来进行有效的权重调整。这样一来，模型就能更好地适应医疗健康领域的专业语言和术语，同时也避免了大规模权重调整和重新训练的必要。<br/><br/>2、QLoRA<br/>QLoRA（Quantized Low-Rank Adaptation）是一种结合了LoRA（Low-Rank Adaptation）方法与深度量化技术的高效模型微调手段。QLoRA的核心在于：<br/><br/>量化技术：QLoRA采用创新的技术将预训练模型量化为4位。这一技术包括低精度存储数据类型（4-bit NormalFloat，简称NF4）和计算数据类型（16-bit BrainFloat）。这种做法极大地减少了模型存储需求，同时保持了模型精度的最小损失。<br/>量化操作：在4位量化中，每个权重由4个比特表示，量化过程中需选择最重要的值并将它们映射到16个可能的值之一。首先确定量化范围（例如-1到1），然后将这个范围分成16个区间，每个区间对应一个4-bit值。然后，原始的32位浮点数值将映射到最近的量化区间值上。<br/>微调阶段：在训练期间，QLoRA先以4-bit格式加载模型，训练时将数值反量化到bf16进行训练，这样大幅减少了训练所需的显存。例如，33B的LLaMA模型可以在24 GB的显卡上进行训练。<br/>量化过程的挑战在于设计合适的映射和量化策略，以最小化精度损失对性能的影响。在大型模型中，这种方法可以显著减少内存和计算需求，使得在资源有限的环境下部署和训练成为可能。<br/><br/>3、适配器调整（Adapter Tuning）<br/>与LoRA技术类似，适配器调整的目标是在保留预训练模型原始参数不变的前提下，使模型能够适应新的任务。适配器调整的方法是在模型的每个层或选定层之间插入小型神经网络模块，称为“适配器”。这些适配器是可训练的，而原始模型的参数则保持不变。<br/><br/>适配器调整的关键步骤包括：<br/><br/>以预训练模型为基础：初始阶段，我们拥有一个已经经过预训练的大型模型，如BERT或GPT，该模型已经学习了丰富的语言特征和模式。<br/>插入适配器：在预训练模型的每个层或指定层中，我们插入适配器。适配器是小型的神经网络，一般包含少量层次，并且参数规模相对较小。<br/>维持预训练参数不变：在微调过程中，原有的预训练模型参数保持不变。我们不直接调整这些参数，而是专注于适配器的参数训练。<br/>训练适配器：适配器的参数会根据特定任务的数据进行训练，使适配器能够学习如何根据任务调整模型的行为。<br/>针对任务的调整：通过这种方式，模型能够对每个特定任务进行微调，同时不影响模型其他部分的通用性能。适配器有助于模型更好地理解和处理与特定任务相关的特殊模式和数据。<br/>高效与灵活：由于只有部分参数被调整，适配器调整方法相比于全模型微调更为高效，并且允许模型迅速适应新任务。<br/>例如，如果我们有一个大型文本生成模型，它通常用于执行广泛的文本生成任务。若要将其微调以生成专业的金融报告，我们可以在模型的关键层中加入适配器。在微调过程中，仅有适配器的参数会根据金融领域的数据进行更新，使得模型更好地适应金融报告的写作风格和术语，同时避免对整个模型架构进行大幅度调整。<br/><br/>LoRA与适配器调整的主要区别在于：<br/><br/>LoRA：在模型的权重矩阵中引入低秩矩阵来实现微调。这些低秩矩阵作为原有权重矩阵的修改项，在实际计算时对原有权重矩阵进行调整。<br/>适配器调整：通过在模型各层中添加小型神经网络模块，即“适配器”，来实现微调。适配器独立于模型的主体结构，仅适配器的参数在微调过程中更新，而模型的其他预训练参数保持不变。<br/>4、前缀调整（Prefix Tuning）<br/>与传统的微调范式不同，前缀调整提出了一种新的策略，即在预训练的语言模型（LM）输入序列前添加可训练、任务特定的前缀，从而实现针对不同任务的微调。这意味着我们可以为不同任务保存不同的前缀，而不是为每个任务保存一整套微调后的模型权重，从而节省了大量的存储空间和微调成本。<br/><br/>前缀实际上是一种连续可微的虚拟标记（Soft Prompt/Continuous Prompt），与离散的Token相比，它们更易于优化并且效果更佳。这种方法的优势在于不需要调整模型的所有权重，而是通过在输入中添加前缀来调整模型的行为，从而节省大量的计算资源，同时使得单一模型能够适应多种不同的任务。前缀可以是固定的（即手动设计的静态提示）或可训练的（即模型在训练过程中学习的动态提示）。<br/><br/>5、提示调整（Prompt Tuning）<br/>提示调整是一种在预训练语言模型输入中引入可学习嵌入向量作为提示的微调方法。这些可训练的提示向量在训练过程中更新，以指导模型输出更适合特定任务的响应。<br/><br/>提示调整与前缀调整都涉及在输入数据中添加可学习的向量，这些向量是在输入层添加的，但两者的策略和目的不同：<br/><br/>提示调整：旨在模仿自然语言中的提示形式，将可学习向量（通常称为提示标记）设计为模型针对特定任务生成特定类型输出的引导。这些向量通常被视为任务指导信息的一部分，倾向于使用较少的向量来模仿传统的自然语言提示。<br/>前缀调整：可学习前缀更多地用于提供输入数据的直接上下文信息，作为模型内部表示的一部分，可以影响整个模型的行为。<br/>以下是两者的训练示例，以说明它们的不同：<br/><br/>提示调整示例：<br/>输入序列: [Prompt1][Prompt2] “这部电影令人振奋。”<br/>问题: 评价这部电影的情感倾向。<br/>答案: 模型需要预测情感倾向（例如“积极”）<br/>提示: 没有明确的外部提示，[Prompt1][Prompt2]作为引导模型的内部提示，这里的问题是隐含的，即判断文本中表达的情感倾向。<br/>前缀调整示例：<br/>输入序列: [Prefix1][Prefix2][Prefix3] “I want to watch a movie.”<br/>问题: 根据前缀生成后续的自然语言文本。<br/>答案: 模型生成的文本，如“that is exciting and fun.”<br/>提示: 前缀本身提供上下文信息，没有单独的外部提示。<br/>6、P-Tuning<br/>P-Tuning（基于提示的微调）和提示调整都是为了调整大型预训练语言模型（如GPT系列）以适应特定任务而设计的技术。两者都利用预训练的语言模型执行特定的下游任务，如文本分类、情感分析等，并使用某种形式的“提示”或“指导”来引导模型输出，以更好地适应特定任务。<br/><br/>提示调整与P-Tuning的主要区别在于：<br/><br/>提示调整：使用静态的、可训练的虚拟标记嵌入，在初始化后保持固定，除非在训练过程中更新。这种方法相对简单，因为它只涉及调整一组固定的嵌入参数，在处理多种任务时表现良好，但可能在处理特别复杂或需要细粒度控制的任务时受限。<br/>P-Tuning：使用一个可训练的LSTM模型（称为提示编码器prompt_encoder）来动态生成虚拟标记嵌入，允许根据输入数据的不同生成不同的嵌入，提供更高的灵活性和适应性，适合需要精细控制和理解复杂上下文的任务。这种方法相对复杂，因为它涉及一个额外的LSTM模型来生成虚拟标记嵌入。<br/>P-Tuning中使用LSTM（长短期记忆网络）作为生成虚拟标记嵌入的工具，利用了LSTM的以下优势：<br/><br/>更好的适应性和灵活性：LSTM可以捕捉输入数据中的时间序列特征，更好地理解和适应复杂的、顺序依赖的任务，如文本生成或序列标注。<br/>改进的上下文理解：LSTM因其循环结构，擅长处理和理解长期依赖关系和复杂的上下文信息。<br/>参数共享和泛化能力：在P-Tuning中，LSTM模型的参数可以在多个任务之间共享，这提高了模型的泛化能力，并减少了针对每个单独任务的训练需求。而在提示调整中，每个任务通常都有其独立的虚拟标记嵌入，这可能限制了跨任务泛化的能力。<br/>这些特性使得LSTM特别适合处理复杂任务和需要细粒度控制的应用场景。然而，这些优势也伴随着更高的计算复杂度和资源需求，因此在实际应用中需要根据具体需求和资源限制来权衡使用LSTM的决策。<br/><br/>7、P-Tuning v2<br/>P-Tuning v2是P-Tuning的进一步改进版，在P-Tuning中，连续提示被插入到输入序列的嵌入层中，除了语言模型的输入层，其他层的提示嵌入都来自于上一层。这种设计存在两个问题：<br/><br/>第一，它限制了优化参数的数量。由于模型的输入文本长度是固定的，通常为512，因此提示的长度不能过长。<br/>第二，当模型层数很深时，微调时模型的稳定性难以保证；模型层数越深，第一层输入的提示对后面层的影响难以预测，这会影响模型的稳定性。<br/>P-Tuning v2的改进在于，不仅在第一层插入连续提示，而是在多层都插入连续提示，且层与层之间的连续提示是相互独立的。这样，在模型微调时，可训练的参数量增加了，P-Tuning v2在应对复杂的自然语言理解(NLU)任务和小型模型方面，相比原始P-Tuning具有更出色的效能。<br/><br/>除了以上PEFT，当前还存在PILL（Pluggable Instruction Language Learning）、SSF（Scaling &amp; Shifting Your Features）等其他类型的微调方法。<br/><br/>PILL是PEFT的一个特定实现，特别关注于如何通过插入可训练的模块或插件来提升模型的任务适应性。这些插件被设计为与原始模型协同工作，以提高模型在处理特定任务时的效率和效果。<br/><br/>SSF核心思想是对模型的特征（即模型层的输出）进行缩放（Scaling）和位移（Shifting）。简单来说，就是通过调整特征的比例和偏移量来优化模型的性能。<br/><br/>这种方法可以在改善模型对特定任务的响应时，不需要调整或重新训练模型中的所有参数，从而在节省计算资源的同时保持或提升模型性能。这对于处理大规模模型特别有效，因为它减少了训练和调整所需的资源和时间。<br/><br/>四、大模型的微调策略<br/><br/>综上所述，微调是一种强大的工具，它能够使大型预训练模型适应于特定的任务和应用场景。正确选择和应用微调策略对于实现高效且有效的模型性能至关重要。<br/><br/>1、微调与迁移学习：微调实际上是迁移学习的一个实例，其中预训练的模型（通常在大型通用数据集上训练）被用作特定任务的起点。这种方法使得即使是对于小数据集的任务，也可以实现高效的学习<br/><br/>2、选择微调策略：选择哪种微调方法取决于多个因素，包括任务的复杂性、可用的数据量、计算资源和期望的性能。<br/><br/>例如，对于需要细粒度控制的复杂任务，P-Tuning v2或LSTM基础的P-Tuning可能更适合。而对于计算资源有限的情况，可以选择LoRA或Adapter Tuning等方法。<br/><br/>3、微调与模型泛化能力：微调时需要注意的一个关键问题是保持模型的泛化能力。过度的微调可能会导致模型对特定训练数据过拟合，而忽略了其在实际应用中的泛化能力。
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/673/</link>
<title><![CDATA[Elasticsearch拼音分词]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Thu, 29 May 2025 02:57:48 +0000</pubDate> 
<guid>https://www.heckjj.com/post/673/</guid> 
<description>
<![CDATA[ 
	elasticsearch的分词器对于文本分析至关重要。对于中文等语言，合适的分词器可以显著提高搜索相关性和结果的准确性。拼音分词器不仅支持基于拼音的搜索，还能实现拼音自动补全等功能。本文将介绍如何在Elasticsearch中安装拼音分词器，以及如何配置和测试它。<br/><br/>分词器的三要素<br/>在Elasticsearch中，分词器（Analyzer）由以下三个主要部分组成：<br/><br/>Character Filters（字符过滤器）：在Tokenizer处理之前对文本进行预处理，如删除或替换特定字符。<br/>Tokenizer（分词器）：按照一定的规则将文本切分成词条（Term），例如ik_max_word就是智能切分中文。<br/>Token Filters（词条过滤器）：对Tokenizer输出的词条进行进一步处理，如转换为小写、同义词替换、拼音转换等。<br/>安装拼音分词器插件<br/>步骤1：下载插件<br/>访问<a href="https://release.infinilabs.com/analysis-pinyin/stable/" target="_blank">elasticsearch-analysis-pinyin</a> 下载页面，下载与您的Elasticsearch版本相匹配的插件。<br/><br/>步骤2：上传插件<br/>将下载的插件压缩包上传到Elasticsearch的plugins目录。<br/><br/>步骤3：检查插件列表<br/>curl -XGET &quot;http://localhost:9200/_cat/plugins?v&quot;<br/>预期输出：<br/>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version<br/>node-master analysis-pinyin 7.17.6<br/>包含 analysis-pinyin 插件。<br/><br/>步骤4：测试插件<br/>curl -XPOST &quot;http://localhost:9200/_analyze&quot; -H &quot;Content-Type: application/json&quot; -d&#039;<br/>&#123;<br/>&nbsp;&nbsp;&quot;analyzer&quot;: &quot;pinyin&quot;,<br/>&nbsp;&nbsp;&quot;text&quot;: &quot;姜军&quot;<br/>&#125;&#039;<br/>预期输出：<br/>&#123;<br/>&nbsp;&nbsp;&quot;tokens&quot;: [<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123; &quot;token&quot;: &quot;a&quot;, &quot;position&quot;: 0 &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123; &quot;token&quot;: &quot;li&quot;, &quot;position&quot;: 1 &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123; &quot;token&quot;: &quot;ba&quot;, &quot;position&quot;: 2 &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123; &quot;token&quot;: &quot;ba&quot;, &quot;position&quot;: 3 &#125;<br/>&nbsp;&nbsp;]<br/>&#125;<br/><br/>Easy-Es 中使用 pinyin 分词器<br/>确保实体类中正确引用 Analyzer.PINYIN：<br/>@IndexField(<br/>&nbsp;&nbsp;&nbsp;&nbsp;fieldType = FieldType.TEXT,<br/>&nbsp;&nbsp;&nbsp;&nbsp;analyzer = Analyzer.PINYIN,<br/>&nbsp;&nbsp;&nbsp;&nbsp;searchAnalyzer = Analyzer.PINYIN,<br/>&nbsp;&nbsp;&nbsp;&nbsp;fieldData = true<br/>)<br/>private String name;
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post/672/</link>
<title><![CDATA[Win11启用Telnet]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[电脑技术]]></category>
<pubDate>Fri, 28 Mar 2025 04:18:39 +0000</pubDate> 
<guid>https://www.heckjj.com/post/672/</guid> 
<description>
<![CDATA[ 
	按Win+R键并输入cmd。<br/><br/>右键单击命令提示符并选择以管理员身份运行。<br/><br/>在命令提示符窗口中，键入以下命令并按 Enter：<br/><br/>dism /online /Enable-Feature /FeatureName:TelnetClient<br/>命令提示符将开始启用该功能并显示操作成功完成的消息。<br/><br/>然后telnet,回车<br/><br/>如果需要禁用 Telnet，请键入以下命令并按 Enter：<br/><br/>dism /Online /Disable-Feature /FeatureName:TelnetClient<br/>等待成功消息。<br/><br/>键入 exit 并按 Enter 关闭命令提示符。<br/>
]]>
</description>
</item>
</channel>
</rss>