做AI Agent开发的朋友应该都碰到过这个场景主Agent的System Prompt越堆越长几十个工具的说明塞进去还没等模型用起来Token就先爆了。就算勉强装下模型的高频调用动作和偶尔一次的冷门操作混在一起指令跟随质量也会肉眼可见地下降。我最近一直在折腾agent-skills这个项目慢慢摸清楚了一套把“模型能力”从“一次性提示词”里拆出来的办法。这篇就当作是阶段性的经验记录聊聊我踩过的坑以及几个从0搭建到落地可用的完整流程。如果你还没听过agent-skills可以把它理解成一套面向智能体的“技能包管理规范”。它不关心你用哪家的大模型也不绑定具体的Agent框架它的核心思路是把某个特定领域里的完整能力——包括执行步骤、判断规则、底层调用、输出模板——封装成一个独立的技能单元Skill。你在主Agent里只留一句话的索引等运行到需要的时候再动态加载对应的完整技能描述。这种“懒加载”模式既保留了主对话的清爽又让每次调用都有足够的上下文空间去发挥。我前前后后搭了三个技能包踩了不少坑也分别试过给文本处理、网页解析、数据分析这三个方向做过完整封装。接下来我把整个设计思路、实现细节、还有常见的翻车点全部摊开讲一遍里面所有的代码和配置都是改过能跑的版本。1. 为什么要把技能从提示词里拆出来1.1 提示词堆砌的隐性成本很多刚接触Agent开发的人第一反应是把所有指令塞进System Prompt。一开始只有两三条规则的时候问题不大但技能一多就开始出现连锁反应先说Token成本。现在主流模型每1K Token的输入价格虽然在下降但高频业务场景单日调用量上万次这个成本就很可观了。更关键的是上下文窗口你给主Prompt塞了6000个Token的描述每次调用这6000个Token都在烧钱更麻烦的是其中大量内容是当次任务根本用不到的。其次是指令跟随质量。我在实际测试中发现当System Prompt超过4000 Token以后模型对具体某一条指令的遵循率会出现明显波动。尤其是你在系统提示词里写了“必须用JSON输出”又在某个技能片段里写了“直接输出纯文本”模型会频繁在两个指令之间摇摆不定。最后是维护成本。你的技能规则迭代频率一般远高于主Prompt。如果全部混在一起每次改一行字都可能牵动全局稍微动一下某个技能描述其他技能的稳定性就跟着漂移。1.2 agent-skills的解决思路agent-skills的核心思想是“按需加载”或者说“分层上下文”Layered Context。它把技能拆成两个层级第一层是技能索引Index通常只有几十到一两百个Token存放在主System Prompt里。它只告诉模型“你有这些技能可用、每个技能是干嘛的、什么场景下应该触发”而不展开具体执行细节。第二层是技能包本体Skill Package它是一个独立的文件目录或代码模块包含完整的技能说明、参数约束、示例、底层工具函数。当主Agent通过索引判断当前任务需要某个技能时再把这个技能包的内容动态注入当前对话上下文。这样做的直接好处是日常每条非技能消息可能在上下文里只占了50个Token的索引位只有真正用到该技能时才加载完整描述。既解答了Token成本问题也避免了大段无关指令对模型主逻辑的干扰。1.3 适用场景和受众边界这套方案不是万能药。如果你只是写个几行代码的小工具、或是给一个单轮对话配固定模板直接用Prompt就完了没必要上skills这种重型方案。它真正适合的是这几种场景需要把Agent能力模块化的比如一个客服Agent同时具备订单查询、物流追踪、售后处理、优惠券计算四种能力每种能力的Prompt、工具、校验逻辑都相当复杂需要复用技能包的你在项目A里写好的PDF解析技能希望项目B也能直接装上去用而不是复制粘贴再改一遍需要让非开发者也参与维护的技能包里的说明文件和示例通常以Markdown存储运营或业务人员可以直接改文字描述而不会碰坏代码。2. 核心设计一个技能包到底包含什么2.1 技能包的标准目录结构我自己反复调整后最终稳定在下面这套结构skills/ └── web_search/ ├── SKILL.md ├── assets/ │ ├── search_api.py │ └── parse_results.py ├── examples/ │ ├── example_1.md │ └── example_2.md └── requirements.txtSKILL.md是技能包的核心入口它必须是Markdown格式名字也固定叫这个。因为解析器在加载技能包时会优先寻找这个文件作为技能说明。如果你改成了其他命名框架就识别不出来了。assets目录存放实际的执行代码。这里的“执行代码”不一定是你主服务里的代码它们可以在运行时被加载为脚本、被翻译成模型可调用的Function Schema甚至只是作为参考文档让Agent在推导时翻看。examples目录放的是“少样本示例”few-shot examples这对大模型特别重要。尤其当你的技能有特定输出格式要求时一个贴近真实任务的示例往往比你在描述里写规矩有效十倍。贵有贵的道理每个示例Token都不白花。requirements.txt记录这个技能包的Python依赖。加载技能时自动安装缺失依赖这能省掉大量环境同步问题。2.2 SKILL.md的语法设计SKILL.md其实遵循的是一个相对灵活的规范。我从实际测试中总结了一套稳定可用的写法核心分成两块YAML头Frontmatter和正文。YAML头用来给解析器和路由模块提供结构化元数据我看下来最少应该包含这些字段--- name: web_search description: 检索web内容返回规范化的搜索结果适合用于实时信息查询和新闻舆情监测。 version: 1.2.0 author: your_name tags: [search, web, information-retrieval] trigger: 用户需要了解实时信息、查找网页资料、做市场调研 models: - gpt-4o - claude-sonnet-4 ---这里尤其关键的是trigger字段。我后来做多技能路由时发现模型是否能在恰当的时候想起这个技能很大程度取决于trigger写得准不准。不要只在description里写“这是一个搜索工具”你要把具体的触发场景列出来模型对“触发场景清单”的匹配度显著高于对抽象描述的通用理解。正文部分就是给模型看的自然语言指令。我总结的高效结构分为五个段落任务目标一句话说明这个技能要达成什么结果执行步骤分步说明用有序列表每步尽量包括判断分支输入参数表列清楚每个参数的名称、类型、必填项、取值范围和示例输出格式规定模型返回结果的格式搭配最少一个示例注意事项负面清单告诉模型什么不能做比如“不要编造搜索结果搜不到就说搜不到”。2.3 技能索引如何嵌入主Agent索引设计是很多人在一开始最容易忽略的部分。索引不能把SKILL.md正文直接复制过来而是需要高度精炼控制在80-150个Token以内。下面是我在System Prompt里实际使用的格式可用技能 - web_search实时网页检索接入外部搜索引擎适合新闻、资料、舆情查询触发词搜索、查一下、最新消息 - pdf_parser本地PDF解析与表格抽取触发词读取PDF、提取表格、解析文档 - data_analyzer结构化数据分析与图表生成触发词统计、分析、可视化注意每条索引里面都包含“触发词”概念。这有点像一个函数调用的关键词路由但同时保留了自然语言理解的能力。模型看到触发词之后会自主判断是否包含该技能对应的意图包含则动态加载完整包。我在第一个版本里把索引写成了“技能名称一句话介绍”的极简模式结果模型经常漏触发。后来加上触发词列表之后触发准确率从大概70%提升到95%左右。如果你的技能数量超过6个触发词的设计会在很大程度上决定你的Agent是不是个“聪明但记忆差”的家伙。3. 实操从0搭建一个网页搜索技能包3.1 确定技能边界搭建第一个技能包时建议从边界清晰、工具链成熟的方向下手。我选的是网页搜索因为它的输入输出比较规范底层可以接外部的搜索API模型本身也具备从搜索结果中提炼摘要的能力容错率高。你定边界的时候要想清楚下面三个问题这个技能的输入端是什么用户输入一句话可能包含哪些信息比如“帮我查一下明天上海的天气”就需要从自由文本中抽取地点和日期这个技能的输出端是什么是纯文本摘要、结构化JSON、还是需要Markdown表格按我的经验最稳妥的方式是规定标准化JSON再由主Agent决定如何呈现给用户哪些事情是这个技能不该管的比如搜索技能不要做数据分析和报告生成那是data_analyzer的活儿。边界卡得越紧模型的调用准确率越好。3.2 编写SKILL.md下面这个版本是我实际在用的注释掉的部分是我后来觉得自己做对了的地方--- name: web_search description: 实时网页信息检索与摘要提取返回结构化搜索结果列表。 version: 2.0.0 tags: [search, web, realtime-info] trigger: 用户需要获取实时信息、查询最新资料、确认时效性事实、查找特定网页 --- # Web Search Skill ## 任务目标 根据用户查询调用底层搜索服务获取网页结果并以结构化JSON格式返回同时为每条结果生成一段不超过50字的中文摘要。 ## 执行步骤 1. 从用户消息中提取搜索关键词提取核心主体词去除语气助词和多余修饰。 2. 判断是否需要时间约束如查询中涉及“最新”“本周”“本月”等时间词则附加时间过滤参数。 3. 调用搜索API获取结果列表。 4. 对每条结果生成简洁摘要注意保留关键数据点和信息来源。 5. 以JSON数组格式输出。 ## 输入参数 | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | query | string | 是 | 无 | 搜索关键词 | | time_range | string | 否 | 无 | 时间过滤范围支持day/week/month | | top_k | integer | 否 | 5 | 返回结果条数范围1-10 | ## 输出格式 json { status: success, results: [ { title: 标题, url: 链接, snippet: 不超过50字的中文摘要, source: 来源站点 } ] }注意事项必须有真实搜索行为哪怕搜索结果不全也不能编造链接。搜索无结果时status返回“no_result”不要硬凑。当搜索意图包含明显的地域限定词时在query中保留地域词。这个版本我特意把“注意事项”做成了负面清单。对比过不带负面清单的版本模型编造URL的概率会降低不少。负面清单给模型画出的是明确的“不要做”边界语言模型在这种边界规则的约束下通常表现更稳。 ### 3.3 编写辅助代码 SKILL.md描述完逻辑之后还要有实际执行代码。这个代码的作用是给Agent提供底层能力支撑。很多框架支持把函数代码注册成模型可调用的Function或者在技能执行时直接由Agent进程调用。 我用一个轻量实现来示例。搜索API我用的是SerpAPI你可以替换成Bing Search API或博查等任何你能访问的搜索服务整个search_api.py核心逻辑大概长这样 python import os import requests import json def search(query: str, time_range: str None, top_k: int 5) - dict: 调用搜索API获取结果。 api_key os.getenv(SEARCH_API_KEY) if not api_key: return {status: missing_key, message: 缺少SEARCH_API_KEY配置} params { q: query, engine: google, api_key: api_key, num: top_k, } if time_range in (day, week, month): params[tbs] fqdr:{time_range[0].upper()} try: resp requests.get(https://serpapi.com/search.json, paramsparams, timeout15) resp.raise_for_status() data resp.json() except Exception as e: return {status: error, message: f搜索请求失败: {e}} results [] for item in data.get(organic_results, [])[:top_k]: results.append({ title: item.get(title, ), url: item.get(link, ), snippet: item.get(snippet, ), source: item.get(source, ), }) if not results: return {status: no_result, results: []} return {status: success, results: results}这里有几个细节值得展开第一API Key从环境变量读取不要硬编码在代码里。尤其是技能包如果要在多个项目里复用配置管理必须独立于代码。第二超时时间必须设置。我在测试时发现如果不加timeout参数搜索API偶尔会挂起直接拖死整条Agent链路。一个技能挂了可能导致整个任务失败所以网络请求必须有兜底。第三异常分支要返回结构化字段。之前我写的是让函数抛异常模型看到异常栈后经常手足无措。改为返回“status”: “error” message后模型可以基于错误信息自主调整策略比如换关键词重试。3.4 写示例的重要性在examples目录里放demo案例效果远超预期。我原来以为SKILL.md写清楚就够了但实际测试中发现空洞的描述经常让模型在具体场景中犯迷糊。比如搜索结果为空时模型可能还会一本正经地输出编造的“搜索结果”。后来我在examples里加了两组对比示例一组是正常搜索场景展示“输入一句用户问题 → 提取关键词 → 结构化结果”是怎么走的。另一组是“搜索无结果”场景展示正确的fallback写法——直接声明无法获取有效信息并给出建议动作。放上示例之后模型的行为稳定性有了质变。其实原理很简单少样本示例相当于给模型提供了一种“模仿模板”。模型在生成时会在隐空间里匹配最接近的示例模式然后用示例的输出风格来回答当前查询。这不神秘但它真的有效。3.5 技能注册与路由逻辑写完技能包之后怎么让主Agent“看得到”它一般的实现方式是在Agent初始化时读取所有技能的SKILL.md文件提取YAML head里的元数据构建一个索引列表并注入System Prompt。而实际运行中我建议在主循环里加一个判断函数def load_skill_if_needed(user_message: str, skill_index: dict) - str | None: 根据用户消息判断是否需要注入完整技能描述。 具体实现可用关键词匹配、分类模型或LLM自身判断。 for skill_name, meta in skill_index.items(): for trigger_word in meta.get(triggers, []): if trigger_word.strip() in user_message: return skill_name return None这段逻辑是“硬匹配”版本它适合技能数量少、触发词覆盖好的场景。如果你的技能数量多、用户语言场景灵活你需要改成“嵌入模型语义匹配”或“用LLM做路由判断”。但从成本与稳定性来说我建议从硬匹配起步先把基础能力跑通再考虑升级路由方案。4. 多技能协同当Agent同时拥有多个技能包4.1 技能调度的优先级设计当技能数量超过一定阈值一个自然出现的问题是用户一句话里同时涉及多个技能怎么办比如用户问“对比A公司和B公司近一个月的新闻并统计它们的发布时间分布。”这句话同时涉及web_search和data_analyzer两个技能。我的做法是引入两步调度机制第一层是“识别主导技能”。用LLM从用户消息中找出核心意图对应的唯一主技能。就上面这个例子主技能是web_search因为核心是获取新闻数据data_analyzer是附属技能。第二层是“技能链传递”。先加载主技能执行搜索拿到搜索结果之后再触发data_analyzer对结果做统计分析。实际实现时我会在技能描述的最后加上“本技能输出的数据可以作为以下技能的输入”形成一种显式的技能依赖关系。4.2 上下文平衡技巧同时加载多个技能完整描述可能又把Token顶上去。一个实用的平衡策略是这样的主技能加载完整SKILL.md正文、示例和函数定义副技能只加载输入输出格式部分和核心调用函数不加载完整正文和全部示例辅助技能仅保留能力描述一句话不加载任何正文。模型的上下文就像办公桌桌面只放当前任务要用的资料其他资料放文件柜里需要的时候再拿。这个类比放到Agent上下文管理上是完全成立的。我尝试过三种加载策略的效果差异策略单次调用Token消耗任务成功率延迟全部技能加载高高高仅索引加载低中低低索引按需加载中高中低按需加载在准确率和成本之间取得了最均衡的折中。实测中日常单次调用的Token开销比全量加载降低了差不多60%而任务成功率只损失了两三个百分点。这个账算下来是相当划算的。4.3 技能仓库的组织与分享当技能包数量多了以后你会需要一个跨项目的共享仓库。这个仓库本身可以就是一个Git仓库内部按技能名建目录agent-skills/ ├── web_search/ ├── pdf_parser/ ├── excel_processor/ ├── data_analyzer/ ├── email_writer/ ├── meeting_summarizer/ └── README.md每个技能包独立版本化别把所有技能放在一个大包里做版本管理。我之前吃过这个亏所有技能打成一个大包某次更新data_analyzer时把web_search的依赖也改了导致线上搜索服务开始报错。后来拆分成独立目录和独立版本互相之间完全隔离发布风险降了一个量级。README里建议写清楚每个技能的适用模型、依赖环境和已知限制方便团队其他成员按需安装。这虽然是个琐碎活儿但在多人协作时能省掉大量不必要的沟通成本。5. 常见问题与排查技巧实录5.1 模型不按技能格式输出这是我在初版里踩到的最头疼的坑。SKILL.md明明定义了JSON输出格式模型却频繁输出Markdown或夹带解释文字。排查思路分三层先确认技能描述里有没有“必须”类强指令词并且输出格式示例是否紧跟说明后面再确认是否是模型上下文过长导致格式指令被“稀释”这时候精简其他上下文把输出格式约束放在最后一段最后确认示例里有没有喝反面例子相对照我建议在examples里增加一个错误输出示例和正确输出的对照组模型能快速学到差异。一个额外的细节是如果你使用的是JSON模式response_format: json_object有些模型的JSON模式会强制输出合法JSON但内容不是你的Schema。你需要在描述里写清字段名和类型最好在提示词里带上“严格遵循以下JSON Schema”的字样。5.2 触发词不命中、技能被忽略模型明明有web_search技能用户说“搜一下XX”模型却回答“我无法获取实时信息”。这种问题的根源在触发词覆盖不够。我之前用“搜索”作为唯一触发词用户说“找找”“查一下”“看看最近”时就抓瞎。后来我把常见口语表达全部列进索引页技能触发率瞬间提升。给你的建议是至少花半小时把你做这个技能时会用到的所有同义表达全部列出来然后逐个测试。不要只依赖一两个关键词。5.3 多个技能同时触发导致指令冲突有一段时间我的Agent同时加载了web_search和pdf_parser用户问“搜索PDF里的内容”时两个技能都被触发模型行为变得不可预测。后来我在每个技能的trigger字段中加上了“必须同时满足”的条件比如web_search的触发条件是“需要实时信息”pdf_parser的触发条件是“涉及本地PDF文件”。同一个问句同时满足两个条件的情况少了很多。如果在你的场景里依然存在同触发场景那就需要引入优先级排序。给每个技能设置一个priority字段冲突时优先执行高优先级技能。5.4 技能上下文过大导致主逻辑漂移SKILL.md里我一开始塞了很多背景知识和多个示例导致单技能加载Token数到了4000多。模型在加载后变得“过度关注技能细节”反而忽视了用户本身的问题。我的解决思路是把SKILL.md限制在1200个Token以内详细背景和长示例都挪到assets目录里的reference.md文件。在技能描述里只保留最核心的步骤和输出要求模型需要参考详细内容时再加载reference.md。这跟主Agent和技能包的“索引-加载”模型是同一个思路在微观层面同样适用。5.5 问题排查速度总表症状最可能的原因快速处置技能未被调用触发词覆盖不足扩展trigger字段增加同义口语表达输出格式偏离Schema描述中缺少强指令或多示例增加对比示例描述末尾重复格式要求技能指令与主Prompt冲突字段优先级不清删除主Prompt中的冗余指令统一收敛到SKILL.md多技能同时触发触发条件重叠增加互斥条件设置priority字段排序Token超限全量加载或SKILL.md过长启用按需加载参考资源外置到reference.md模型编造结果缺少负面清单约束在注意事项中明确“不准编造”并追加反面示例6. 实操总结与经验心得6.1 一条简单有效的迭代原则从零开始做技能包不要一上来就追求面面俱到。我现在的原则是先让一个技能在单任务下正确率达到90%再扩展下一个。技能包之间互相独立一个技能的正确性不能依赖另一个技能的“顺带”行为。另外每次迭代技能包时必须配套做回归测试。我维护了一套最小测试集里面包含10到15个覆盖正常、边界和异常场景的测试用例。每次改完技能描述先跑一遍最小测试集确认不会引入新的偏差之后才发布新版本。6.2 记录每次“翻车”细节我在做这套东西最深的体会是模型的行为变化有时候并不遵循直观逻辑。你以为你写得更清楚了但模型在新版本上的输出反而更差了。所以我养成了一个习惯所有版本迭代都走一份简单实验记录。每个版本改了什么、在哪些用例上表现更好、在哪些用例上变差、大概是什么原因全部记在CHANGELOG.md里。这看起来像是在写增量开发日志实际上它是你与模型行为博弈时的最重要的参考依据。6.3 这个方向还能怎么扩展agent-skills这种做法的生命力在于它把原来模糊的“调Prompt”工作变成了结构化、可测试、可复用的“技能构建”工作。后续可以做的方向很多比如给技能包增加更细粒度的权限管理让某些技能只能由特定角色触发或者把技能包变成可视化的编排节点用拖拽方式组合一条自动化流程再或者给技能包加流式输出和中断恢复能力让它能处理更长时间跨度的复杂任务。我自己的下一步计划是给这套技能体系加上简单的监控日志。每次技能被触发、调用耗时、成功率、Token消耗都记录下来沉淀两周就能画出每个技能的真实使用情况。到那个时候优化就不是靠猜了而是靠数据说话。如果你也在折腾Agent开发强烈建议把技能和主Prompt彻底拆开亲手做一个技能包试试。感受一下从“调Prompt”升级到“建技能”的过程我相信你会回来感谢这个决定的。
企业数字化 ERP 产品动态
相关推荐
cua:一个零依赖的 Python 命令行命令管理工具 1. 为什么会有 cua:被日常重复命令逼出来的小工具1.1 一个让人烦躁到忍无可忍的场景做开发这行,最烦的往往不是写代码,而是每天反复敲那几十条记不全的破命令。Docker 清镜像、查端口占用、进服务器、拉测试数据、改下环境变量、跑一遍回归脚… · 2026/9/24 21:42:03
Agentic Awesome Skills 前端模式实战指南:从组件组合到性能优化的 React 开发范式 Agentic Awesome Skills 前端模式实战指南:从组件组合到性能优化的 React 开发范式 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and pl… · 2026/9/24 21:41:56
Python实现Excel批量转Word:从数据读取到模板渲染完整指南 上个月帮朋友处理一个挺急的需求:Excel 里有三百多条报名数据,要批量转成 Word 格式的参赛确认函,每行记录生成一份独立文档,抬头是固定的,正文里依次填姓名、单位、参赛项目、编号,下面还有一段组委会说明… · 2026/9/24 21:41:48
AI生图必学:用GPT Image 2.5打造真实运动模糊人群效果 1. 运动模糊人群效果:为什么这种“糊”反而最有感染力第一次在AI生图里尝试人群场景的时候,我踩过一个典型新手坑——拼命追求“每个路人都清晰、每张脸都完整”。生成出来的画面确实很“锐”,但怎么看怎么假,像是一个模型摆拍现场… · 2026/9/24 22:12:55
电子课本解析下载:5分钟拿到离线PDF教材 电子课本解析下载:5分钟拿到离线PDF教材 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目地址: https://git… · 2026/9/24 22:12:55
USACO Silver P3405 解析:用哈希表反向索引解决城市配对计数问题 做 USACO 的 Silver 组题时,P3405(USACO 2016 December Contest, Silver 组第二题 Cities and States S)是我每次给学生讲到“哈希表计数”时一定会拉出来当例子的题。题目表面上看是一堆城市和州的配对,实际上思路一转就是一个经… · 2026/9/24 22:12:55
软考网络工程师教程第六版核心解读与考点精析 我无法根据当前输入生成符合要求的博文。原因如下:项目正文为空:输入中项目正文: "",即没有任何实质性描述。而我的核心任务是基于“项目标题、项目正文、关键词和摘要描述”四要素进行深度拆解与延展。其中,项目正文是… · 2026/9/24 22:12:55
(Casein Kinase-2 substrate) ;RRREETEEE 基本信息中文名称:酪蛋白激酶 2 底物;精 - 精 - 谷 - 谷 - 谷 - 苏 - 谷 - 谷 - 谷三字母序列:Arg-Arg-Glu-Glu-Glu-Thr-Glu-Glu-Glu单字母序列:RRREETEEE分子式:C46H75N15O23分子量:1206.19结构特征&#… · 2026/9/24 22:12:48
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44