本文转载自互联网，已在文末注明来源。第一节：Prompt定义及基本框架一、 什么是Prompt大模型 prompt 指在大语言模型应用中，用于 “提示” 模型唤起特定能力以解决实际问题的提问方式。早期它被称作 “输入形式” 或 “输入模板”，后来 “prompt”（提示）这一叫法因契合大语言模型语境，能准确体现其在调用模型能力方面的关键作用，成为公认术语。大模型多数核心能力在预训练阶段形成，prompt 就像钥匙，引导模型从预训练积累的海量信息中，精准唤起如理解复杂文本、总结信息、生成内容、逻辑推理等能力，满足用户实际需求。它并非把模型当作单纯知识库，而是高效调用其能力，实现类似人类运用智能解决复杂问题的效果，是 prompt 工程的核心，对用好大语言模型意义重大。二、 撰写Prompt的基本框架1、Prompt包含的要素● 指令：想要模型执行的特定任务或指令。● 上下文：包含外部信息或额外的上下文信息，引导语言模型更好地响应。● 输入数据：用户输入的内容或问题。● 输出指示：指定输出的类型或格式。2、Prompt五大框架2.1 RTF框架RTF框架是一个非常简单通用的Prompt提示框架，我们和任意大模型对话场景下都可以使用该规范进行改进输出。● R-Role角色：指定大模型担当固定角色程序员、数据分析师、讲解员、记者等等● T-Task任务: 任务，告诉大模型需要为我们做的事情● F-Format格式：大模型最终结果的返回格式比如：表格、、英文等等主要优点：● 简单、方便。● 指定Role角色，可以让大模型在当前的角色范围内回答知识，这在一些特定的领域中非常有效。● 指定Role角色也能让工程上检索知识能够确定边界范围，配合元数据所发挥的威力会更强。● 如果结合RAG知识内容检索，那么上下文回答的内容会让用户感觉更加是顺畅。2.2 思考链模式通过这种模式来逐步改善大模型的推理能力，非常适合一些复杂的任务处理。例如：● 分析型或者逻辑推理型的任务● 决策● 解决问题比如程序员根据错误日志找而要使用这种模式，只需要在末尾添加”让我们逐步思考”即可。例如：# 数据源（与指令区分） user_datasource = """XXX……""" prompt1 = """分析一下在人工客服服务场景下，'''{user_datasource}'''中客户有哪些诉求。用一句话概括。""" prompt2 = """分析一下在人工客服服务场景下，'''{user_datasource}'''中客户有哪些诉求。用一句话概括。让我们逐步思考。""" # 模型输出结果 output1：在人工客服服务场景下，客户主要诉求为：微信账号存在安全风险导致无法添加好友、单点拦截、下载安装微信出现问题等，寻求客服协助解决问题。 output2：在人工客服服务场景下，客户主要诉求为：微信账号存在安全风险导致无法添加好友，以及因违规行为被限制登录，客户希望客服能够尽快处理这些问题。 # 分析结果 output1中的”单点拦截”并不是用户的诉求，而output2显然更加正确Python复制2.3 RISEN框架● R-Role:大模型扮演的角色● I-Instructions: 指示命令，和Task-任务差不多● S-Steps: 步骤● E-End Goal: 最终目标● N-Narrowing: 缩小范围约束条件，和RTF框架中的Format有异曲同工之妙，一个是格式的约束，而这里的约束可以是任意方面，比如回答的内容特定领域、字数限制等等方面该框架主要适合：● 撰写具有特定约束的任务例如博客文章● 有明确指导方针的任务（例如商业计划）2.4 RODES框架● R-Role: 角色● O - Objective: 目标● D - Details: 详细的细节● E - Examples: 示例● S - Sense Check: 感官检查2.5 密度链模式密度链模式Prompt是Salesforce、麻省理工学院和哥伦比亚大学的研究人员推出的一种新提示，它非常的高效，使用递归来创建越来越好的输出的提示，与普通提示生成的 GPT-4 摘要相比，它生成的摘要更加密集且更适合人们理解。适合：● 总结● 改进您最喜欢的提示● 通过递归生成可用的长格式内容感兴趣的同学可以自己检索一下第二节：打造高效Prompt的两大核心原则在Prompt工程领域，掌握精妙的撰写策略是释放语言模型强大潜力的关键。本节将深入探讨prompt撰写的两大核心策略，为您揭示如何通过优化指令，引导模型生成更贴合需求、更具质量的输出。一、原则一：编写明确和具体的指令为了让模型精准理解我们的意图，编写清晰、明确且具体的指令至关重要。这不仅能避免模型产生误解，还能显著提升输出结果的相关性和准确性。策略1：使用分隔符清晰界定输入部分在构建prompt时，使用分隔符将特定文本部分与提示的其他部分清晰隔开，能有效避免提示词冲突。任何能让模型识别出单独部分的符号都可作为分隔符，常见的包括：● 章节标题：通过不同层级的标题区分不同内容模块。● 三重双引号：""" ，在代码编写中常用于包裹较长的文本字符串。● 三重单引号：''' ，功能与三重双引号类似，适用于不同的语法环境。● 三重破折号：--- ，在文本中起到明显的分隔作用。● 角括号：<> ，常被用于标记特定元素。● XML标签：，利用结构化的标签形式区分不同内容。示例1：假设我们需要对一段产品描述进行总结，可通过如下方式使用分隔符： product_description = f"""这是一款全新的智能手表，具备心率监测、睡眠追踪等健康功能，还支持多种运动模式记录，拥有高清显示屏和长达7天的续航能力。""" prompt = f"""请总结以下产品描述：'''{product_description}'''""" 示例2：如果要让模型对一段用户评论进行情感分析，示例如下： user_comment = f"""这款手机的拍照效果真的太棒了，色彩还原度高，夜景模式也很出色，唯一不足的是电池续航有点短。""" prompt = f"""分析以下用户评论的情感倾向：''' {user_comment}''' """Python复制这种方式能够确保模型明确区分指令和待处理文本，避免因指令混淆而产生错误输出。策略2：要求结构化输出为了便于后续对模型输出进行解析和处理，我们可以要求模型以特定的结构化格式输出，如HTML或JSON。这种方式能极大提高数据处理的效率，尤其是在Python编程环境中，结构化输出可直接读入字典或列表中，方便进一步的分析与操作。示例 1：要求模型以 JSON 格式输出。prompt = "请以json格式列出每个nodeType所体现的用户诉求、客服方案。每一个json-value不超过20个字" # 数据源（与指令区分） user_datasource = """XXX……""" # 模型输出 { "IVR": { "用户诉求": "微信使用问题求助", "客服方案": "引导正常使用或自助处理" }, "ASYNC": { "用户诉求": "账号封禁等相关申诉", "客服方案": "按规则处理或引导自助" }, "AI": { "用户诉求": "支付相关问题咨询", "客服方案": "要求用户详细描述问题" } }Python复制示例2：以HTML格式输出一个简单的书籍。prompt = "请以HTML格式列出三本你推荐的科幻小说及其作者。" # 模型输出 《三体》 - 刘慈欣 《基地》 - 艾萨克·阿西莫夫 《银河帝国：机器人五部曲》 - 艾萨克·阿西莫夫 Python复制策略3：要求模型检查条件是否满足在面对复杂任务时，如果在一些假设条件，而这些条件并非总是成立，那么我们需要引导模型首先对这些假设进行检查。若条件不满足，模型应明确指示并停止继续执行任务，以避免无效计算和错误结果。同时，考虑潜在的边缘情况，并为模型设定相应的处理规则，能够有效减少意外错误，确保模型输出的稳定性和可靠性。示例：假设我们要求模型计算一个数学表达式，但前提是表达式所有都为正数。 expression = "5 + 3 - (-2)" prompt = f"""首先检查表达式 '{expression}' 中的所有数字是否都为正数。如果是，请计算该表达式的值；如果不是，请输出'表达式中存在非正数，无法计算'。"""Python复制模型输出表达式中存在非正数，无法计算策略4：Few-shot prompting（少样本提示）在要求模型执，提供成功完成任务的示例，能够帮助模型更好地理解任务要求和期望输出的格式。通过这些示例，模型可以学习到任务的模式和规律，从而在处理实际输入时生成更符合预期的结果。少样本提示尤其适用于处理一些复杂或具有特定格式要求的任务，能够显著提升模型的表现。示例：要求模型按照特定格式将中文词汇翻译成英文并造句。prompt = """ 示例1： 中文词汇：苹果 翻译：apple 造句：I like to eat apples.Python复制示例2：中文词汇：学校 翻译：school 造句：I go to school every day. 中文词汇：图书馆 翻译： 造句： """ # 模型输出 翻译：library 造句：I often read books in the library.Python复制二、原则二：给予模型充足的思考时间当模型因急于得出结论而出现推理错误时，我们需要通过优化式，为模型提供更清晰的推理路径，引导其进行更深入、全面的思考。策略1：明确完成任务所需的步骤为模型详细指定完成任务所需遵循的步骤，能够帮助模型有条不推理和计算。通过这种方式，模型可以更清晰地理解任务的逻辑结构，避免因思路混乱而产生错误。例如，要求模型按照特定格式输出，能够引导其在处理过程中注重信息的组织和呈现方式。示例：要求模型分析一首古诗，格式为“诗歌主题 - 主要意象 - 表达情感”。poem = "床前明月光，疑是地上霜。举头望明月，低头思故乡。" prompt = f"""请按照“诗歌主题 - 主要意象 - 表达情感”的格式分析这首诗：{poem}""" # 模型输出 思乡之情 - 明月 - 对故乡的深切思念 ### 策略2：引导模型在得出结论前充分思考方案 明确指示模型在得出最终结论前，先进行充分的推理和分析，往往能获得更优的结果。这种方式能够促使模型深入挖掘问题的本质，综合考虑各种因素，从而避免因片面或仓促的判断而导致的错误。Python复制示例：问模型“如何提高公司的员工满意度”。prompt = "在回答如何提高公司的员工满意度之前，请先思考至少三个方面的因素，然后综合这些因素给出全面的建议。" # 模型输出 首先，从薪酬福利方面，可适当提高薪资水平、完善福利体系，如增加带薪休假天数等；其次，从职业发展角度，为员工提供更多培训机会和晋升通道；再者，从工作环境来看，营造舒适、和谐的办公氛围，加强团队建设活动。综合这些方面，提高公司员工满意度可以从优化薪酬福利、提供职业发展机会以及改善工作环境等措施入手。Python复制三、模型的局限性与应对策略尽管语言模型在大量数据的训练下展现出强大的能力，但它们并非完美无缺。其中，“幻觉”现象是模型面个重要挑战。模型“幻觉”即使模型在训练过程中接触了海量知识，但它并不能完美记住所有信息，也难以精准把握自身知识的边界。这就导致在面对晦涩主题的问题时，模型可能会编造出看似合理但实际上错误的内容，这就是所谓的“幻觉”。解决幻觉的一种策略为了有效应对幻觉问题，我们可以要求模型在回答问题前，首先从给定文本中寻找相关引用，并依据这些引用来构建答这种方式，模型的回答将基于可靠的信息来源，而非凭空臆测，从而大大提高回答的准确性和可信度。同时，这种方法还能够实现答案的可追溯性，便于对模型输出进行验证和审查。示例：给定一段关于历史事件的文本，要求模型回答相关问题。text = """1861年，美国爆发了南北战争，这场战争是美国历史上的重要转折点，它主要围绕奴隶制的存废问题展开，北方主张废除奴隶制，南方则坚持保留。最终北方取得了胜利，为美国的工业化发展铺平了道路。""" prompt = f"""请从上述文本中找出相关信息，回答南北战争主要围绕什么问题展开？""" # 模型输出 南北战争主要围绕奴隶制的存废问题展开，北方主张废除奴隶制，南方则坚持保留。Python复制第三节：Prompt技术剖析与应用在深入探索 prompt 技术的征程中，我们将逐一解析多种关键技术，助力您精准把握其核心要点与应用场景，切实提升应用能力。一、零样本提示（Zero-Shot Prompting）零样本提示是一种让模型在没有特定任务示例展示的情况下直接处理任务的技术。其原理在于模型经过大量数据训练和指令调整后，自身具备了一定的通用知识和任务理解能力。例如：prompt = "判断此文本的情感倾向为积极、消极或中性：这部电影情节紧凑，特效惊人。情感：" # 模型会依据自身预训练知识对这个提示进行处理并输出结果Python复制模型能依据自身预训练知识输出“积极”。然而，由于缺乏具体示例引导，对于复杂任务，其效果可能受限。二、少样本提示（Few-Shot Prompting）少样本提示在零样本提示效果不佳时发挥作用。它通过为模型提供少量任务示例，帮助模型学习任务模式和规律。例如：prompt = """“whatpu”是坦桑尼亚的一种小型毛茸茸的动物。一个使用 whatpu 这个词的句子的例子是：我们在非洲旅行时看到了这些非常可爱的whatpus。“farduddle”是指快速跳上跳下。一个使用 farduddle 这个词的句子的例子是：""" # 模型会根据前面的示例学习并生成新的句子Python复制通过提供如上述新词汇造句的示例，模型能够模仿示例的结构和逻辑生成新的内容。不过在复杂推理任务中，仍需进一步优化。三、思维链提示（Chain-of-Thought Prompting）思维链提示旨在为模型提供清晰的推理步骤引导，从而显著提升其在复杂推理任务中的表现。它通过在提示中展示详细的推理过程，让模型学习如何逐步分析和解决问题。比如：prompt = """Roger 有 5 个网球，他又买了 2 罐网球，每罐有 3 个球，他现在共有多少球？ Roger 一开始有 5 个球。 2 罐网球，每罐 3 个，共 6 个球。 5 + 6 = 11。 答案是 11。""" # 模型按照提示中的推理步骤进行计算和回答Python复制此技术可与少样本提示结合，增强效果，尤其适用于算术、常识推理等任务，帮助模型更有条理地处理问题。四、自我一致性（Self-Consistency）自我一致性技术主要用于优化思维链提示中的推理路径选择。其核心思想是通过提供多个少样本推理示例，让模型从多样的推理结果中筛选出最一致的答案，增强模型在算术和常识推理任务中的可靠性。比如：prompt = """Q：林中有 15 棵树。林业工人今天将在林中种树。完成后，将有 21 棵树。林业工人今天种了多少棵树？ A：我们从 15 棵树开始。后来我们有 21 棵树。差异必须是他们种树的数量。因此，他们必须种了 21 - 15 = 6 棵树。答案是 6。 Q：停车场有 3 辆汽车，又来了 2 辆汽车，停车场有多少辆汽车？ A：停车场已经有 3 辆汽车。又来了 2 辆。现在有 3 + 2 = 5 辆汽车。答案是 5。 Q：当我 6 岁时，我的妹妹是我的一半年龄。现在我 70 岁了，我的妹妹多大？ A：""" # 模型会参考前面的推理示例对最后一个问题进行回答，并从多个可能的回答中选择最一致的答案Python复制五、生成知识提示（Generated Knowledge Prompting）生成知识提示主要用于解决模型在处理需要额外知识的任务时出现的局限性。它的操作方式是先让模型生成与任务相关的知识，再整合这些知识得出准确答案。比如：prompt = """输入：高尔夫球的一部分是试图获得比其他人更高的得分。 知识：高尔夫球的目标是以最少的杆数打完一组洞。一轮高尔夫球比赛通常包括 18 个洞。每个洞在标准高尔夫球场上一轮只打一次。每个杆计为一分，总杆数用于确定比赛的获胜者。 解释和答案：""" # 模型根据生成的知识对问题进行回答Python复制像这样先生成相关知识，再整合知识得出准确答案“不是，高尔夫球的目标是以最少杆数完成比赛，而非追求更高得分”，有效提升模型在常识推理任务的准确性。六、链式提示（Prompt Chaining）链式提示是将复杂任务拆解为多个子任务，通过逐个子任务生成提示并传递结果的方式来实现复杂任务的有序处理。以文档问答为例：# 第一个提示用于提取相关引文 prompt1 = """你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文，由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文，请回应“未找到相关引文！”。#### {{文档}} ####""" # 假设这里有一个文档变量 doc，将其代入提示中进行处理 # 处理后得到引文列表，假设为 quotes_list # 第二个提示根据引文和文档生成回答 prompt2 = """根据从文档中提取的相关引文（由<quotes></quotes>分隔）和原始文档（由####分隔），请构建对问题的回答。请确保答案准确、语气友好且有帮助。#### {{文档}} #### <quotes>{quotes_list}</quotes>""" # 模型根据第二个提示生成最终回答Python复制这种方式提高了任务处理的准确性与可靠性，使得模型能够逐步深入地处理复杂问题。七、思维树（ToT）思维树框架是为了帮助模型应对复杂的探索性任务而设计的。它通过维护一棵思维树，让模型在解决问题时能够生成和评估中间思维步骤，并结合搜索算法进行系统性探索。示例如下：# 假设给定数字为 4、9、10、13 prompt = """输入: 4 9 10 13 4 + 9 = 13 (left 10 13 13) 10 - 4 = 6 (left 6 9 13) 13 - 6 = 7 13 - 9 = 4 4 + 6 = 10 (left 7 9 4 * 6 = 24 (left 4 6) 评估是否能得到 24: sure """ # 模型按照思维树的步骤进行推理和计算，并根据评估结果继续搜索或得出答案Python复制八、检索增强生成（RAG）检索增强生成（RAG）技术将信息检索与文本生成相结合，专门用于处理知识密集型任务。它通过检索相关文档来为模型提供额外的知识支持，从而缓解模型的“幻觉”问题。例如：# 假设这里有一个检索函数 retrieve_documents 和一个生成答案的函数 generate_answer question = "谁是首次登上月球的人？" documents = retrieve_documents(question) prompt = "根据以下文档回答问题：" + str(documents) + " 问题是：" + question answer = generate_answer(prompt) # 最终得到的 answer 即为模型结合检索结果生成的答案Python复制这有效确保答案基于可靠知识源，在自然问题、事实验证等基准测试中表现卓越。九、自动推理并使用工具（ART）自动推理并使用工具（ART）技术使模型能够自动生成包含推理步骤的程序，并在需要时调用外部工具。例如：prompt = """计算 16 个苹果平均分给 4 个人，每人几个，再加上 3 是多少？ 请生成解决这个问题的程序步骤。""" # 模型会生成类似下面的程序步骤 # result = (16 / 4) + 3 # 然后可以在代码中执行这个程序步骤得到最终答案Python复制在 BigBench 和 MMLU 基准测试中，ART 在多种任务上表现突出，显著超越少样本提示和自动 CoT 等方法，提升了模型解决问题的能力和效率。十、自动提示工程师（APE）自动提示工程师（APE）技术能够自动生成和筛选任务指令。它通过利用大型语言模型生成指令候选项，再依据评估分数选择最佳指令，从而提升提示生成的效率与效果。比如：# 假设这里有一个生成指令候选项的函数 generate_candidates 和一个选择最佳指令的函数 select_best_instruction article = "这里是一篇新闻文章的内容" candidates = generate_candidates(article) prompt = select_best_instruction(candidates) + " " + article # 模型根据最终的 prompt 生成文章总结Python复制例如总结新闻文章时，它先利用大型语言模型生成如“提取文章关键人物、事件和时间”“概括文章主要内容并突出重点”等指令候选项，再依据评估分数选择最佳指令，指导模型生成高质量总结。十一、Active-PromptActive-Prompt 技术主要用于解决思维链示例有效性的问题。它通过先查询模型生成多个答案，计算不确定度后挑选最不确定的问题由人类注释示例，再用新示例推断其他问题，从而优化模型对不同任务的适应性。比如：# 假设这里有一个查询模型生成答案的函数 query_model 和一个计算不确定度的函数 calculate_uncertainty prompt = "对以下文本进行分类：这是一篇科技类文章。" answers = query_model(prompt, num_answers=5) # 生成 5 个答案 uncertainty = calculate_uncertainty(answers) if uncertainty > threshold: # 如果不确定度大于设定阈值 # 选择最不确定的问题由人类注释示例，然后更新提示并重新查询模型 new_prompt = update_prompt_with_annotated_example(prompt) final_answer = query_model(new_prompt) else: final_answer = select_most_consistent_answer(answers) # 最终得到的 final_answer 即为经过 Active-Prompt 处理后的答案Python复制通过这种方式，能够提高模型在文本分类等任务中的准确性。十二、方向性刺激提示（Directional Stimulus Prompting）方向性刺激提示通过训练策略 LM 生成引导提示，增强对模型生成结果的掌控力。例如文本摘要任务：article = "这里是一篇文章的内容" prompt = "请根据文章内容生成一个引导提示，重点关注文章的主要事件和结果。" # 策略 LM 会根据这个提示生成如“重点提取文章中事件的主体、发生的时间和最终结果”的引导提示 # 然后可以将这个引导提示用于后续的文本摘要任务中Python复制在文本摘要任务中，策略 LM 依据文章主题、关键信息等生成引导提示，指导模型生成符合需求的摘要，提升摘要质量。十三、PAL（程序辅助语言模型）PAL（程序辅助语言模型）技术让模型生成程序来解决问题，借助编程运行时提升解决复杂问题的能力。以日期计算问题为例：question = "今天是 2023 年 2 月 27 日，我出生于 25 年前，我的出生日期是多少？" prompt = """ import datetime from dateutil.relativedelta import relativedelta # Q: 2015 年在 36 小时后到来。从今天起一周后的日期是多少（格式为 MM/DD/YYYY）？ # 如果 2015 年在 36 小时后到来，那么今天是 36 小时前。 today = datetime(2015, 1, 1) - relativedelta(hours=36) # 从今天起一周后， one_week_from_today = today + relativedelta(weeks=1) # 格式化后的答案 one_week_from_today.strftime('%m/%d/%Y') # Q: 今天是 2023 年 2 月 27 日，我出生于 25 年前，我的出生日期是多少？ """ # 模型会生成类似下面的代码 # today = datetime(2023, 2 27) # born = today - relativedelta(years=25) # born.strftime('%m/%d/%Y') # 然后可以在代码中执行模型生成的代码得到最终答案Python复制十四、ReAct 框架ReAct 框架使模型交错生成推理轨迹和操作，提升答案的可靠性与可解释性。以回答问题为例：question = "除苹果遥控器外，哪些设备可控制其设计交互的程序？" prompt = """问题：除苹果遥控器外，哪些设备可控制其设计交互的程序？ 思考 1：我需要搜索苹果遥控器相关程序及可替代控制设备。 操作 1：搜索 [苹果遥控器 可替代控制设备] 观察 1：搜索结果为…… 思考 2：根据搜索结果，分析哪些设备符合要求。 操作 2：筛选 [符合要求的设备] 观察 2：筛选结果为…… 思考 3：整理最终答案。 操作 3：整理 [最终答案] """ # 模型会按照提示中的推理轨迹和操作步骤进行处理，并最终得出答案Python复制在知识密集型和决策任务中表现良好，通过与外部环境交互获取信息来辅助推理。十五、自我反思（Reflexion）自我反思框架包含参与者、评估者和自我反思三个模型，旨在帮助模型从错误中学习并提升性能。模拟编程任务的示例如下：# 假设这里有参与者模型 actor、评估者模型 evaluator 和自我反思模型 reflexion code = "这里是一段初始代码" # 参与者模型生成尝试解决问题的代码和动作 result = actor(code) # 评估者模型评价输出 score = evaluator(result) # 自我反思模型根据评价结果生成改进建议 reflection = reflexion(score, result) # 将改进建议应用到下一次的代码生成中，实现自我学习和提升Python复制如代码出现语法错误，自我反思模型会提示可能错误原因及修正方向，帮助模型快速学习。附录一、术语表Prompt：在大语言模型应用中，用于“提示”模型唤起特定能力以解决实际问题的提问方式，是prompt工程的核心。RTF框架：Role - Task - Format框架，通过指定角色、任务和格式规范大模型输出，简单通用。思考链模式：在提示末尾添加“让我们逐步思考”，引导大模型逐步分析复杂任务，改善推理能力。RISEN框架：包含角色、指示命令、步骤、最终目标和缩小范围（约束条件），适合特定约束或明确指导方针的任务。RODES框架：涵盖角色、目标、详细细节、示例和感官检查的提示框架。密度链模式：利用递归创建更好输出的提示，生成的摘要更密集且适合理解，适用于总结等任务。少样本提示（Few - shot prompting）：为模型提供少量任务示例，帮助其学习任务模式和规律，提升在复杂或特定格式任务中的表现。零样本提示（Zero - Shot Prompting）：模型在无特定任务示例展示下，依靠自身预训练知识和任务理解能力直接处理任务。思维链提示（Chain - of - Thought Prompting）：为模型展示详细推理过程，提升其在复杂推理任务中的表现，可与少样本提示结合。自我一致性（Self - Consistency）：通过提供多个少样本推理示例，让模型筛选最一致答案，增强在算术和常识推理任务中的可靠性。生成知识提示（Generated Knowledge Prompting）：先让模型生成与任务相关知识，再整合知识得出准确答案，解决模型处理需额外知识任务的局限性。链式提示（Prompt Chaining）：将复杂任务拆分为多个子任务，逐个子任务生成提示并传递结果，提高任务处理准确性与可靠性。思维树（ToT）：通过维护思维树，让模型生成和评估中间思维步骤，结合搜索算法应对复杂探索性任务。检索增强生成（RAG）：将信息检索与文本生成结合，检索相关文档为模型提供知识支持，缓解“幻觉”问题。自动推理并使用工具（ART）：使模型自动生成包含推理步骤的程序，并在需要时调用外部工具，提升解决问题能力和效率。自动提示工程师（APE）：利用大型语言模型生成指令候选项，依据评估分数选择最佳指令，提升提示生成效率与效果。Active - Prompt：先查询模型生成多个答案，计算不确定度后挑选最不确定问题由人类注释示例，优化模型对不同任务的适应性。方向性刺激提示（Directional Stimulus Prompting）：训练策略LM生成引导提示，增强对模型生成结果的掌控力，提升文本摘要等任务的质量。PAL（程序辅助语言模型）：让模型生成程序来解决问题，借助编程运行时提升解决复杂问题的能力。ReAct框架：使模型交错生成推理轨迹和操作，提升答案的可靠性与可解释性，在知识密集型和决策任务中表现良好。自我反思（Reflexion）：包含参与者、评估者和自我反思三个模型，帮助模型从错误中学习并提升性能。二、常见问题解答1.如何选择合适的Prompt框架？根据任务类型和需求选择。如简单对话场景可选用RTF框架；复杂分析任务可考虑思考链模式或RISEN框架；对输出格式有严格要求的，可在RTF、RISEN框架中关注格式或约束条件设定；进行总结类任务，密度链模式可能更合适。2.为什么模型会出现“幻觉”现象？模型虽经大量数据训练，但无法完美记住所有知识，也难以精准把握知识边界，面对复杂或生疏主题问题时，就可能编造看似合理但错误的内容。3.如何利用少样本提示提升模型性能？提供与任务相关、格式规范的成功示例，示例要涵盖任务的关键要素和模式，让模型学习示例中的规律和逻辑，从而在处理实际输入时生成更符合预期的结果。尤其适用于复杂任务或对输出格式有特定要求的情况。4.链式提示在实际应用中有哪些优势？将复杂任务拆解为子任务，使模型处理过程更清晰、有序，逐步深入解决问题，提高了任务处理的准确性与可靠性，避免模型在处理复杂问题时因任务过于复杂而出现混乱或错误。原文地址：大模型Prompt技巧全解析 - Anoyer - 三流痞子
本文转载自互联网，已在文末注明来源。文档描述本文记录了一些技术教程及前沿科技相关信息建议在 PC 端打开博客文章，可显示目录（TOC）01. 大语言模型卷国产主流 LLM：DeepSeek、Kimi、腾讯元宝、豆包、通义千问、天工AI、智谱清言、文心一言国外主流 LLM：Microsoft Copilot、ChatGPT、Claude、Gemini、Grok、Llama [CN]免魔法使用 ChatGPT：RawChat、SharedChat、ChatK [G] [O]支持多个 AI 模型的平台：Poe、Vercel、Coze、在问耕读：收集免费使用 ChatGPT-4o、Gemini Pro 等 AI 服务的列表更多替代方案见：[1] [2] [3] [4]DeepSeek 免费 API：火山方舟、阿里云百炼、魔塔社区、SiliconFlow、Serverless APICursor：集成了 LLM 的类 vscode 的 AI 辅助编程助手 [免费续杯]，同类的 Trae 简洁易懂好上手AI 写作助手：帮助用户组织写作风格提示词，并通过 LLM 生成高质量内容02. 图像处理AI集Gemini 2.0 Flash：上传图片，输入指令，让 AI 帮你 PS2.1 开箱即用可以直接上手的在线 or 离线生成式 AI 工具Recraft：通过文本描述生成位图（Raster）与矢量图（Vector），可上传图像自定义风格；同时支持生成式填充、去除/改变背景、区域消除、图形拼接等IOPaint：擦除、修改/替换、添加新对象、图形补全（外画）等，可离线使用Clipdrop：Stable Diffusion 旗下工具，支持文字生成图像、生成式填充、图像补全、背景移除、对象消除、草图转真实图等Microsoft Designer：支持以文生图、去除背景、消除对象、改变图像风格等Adobe Firefly：文字生成图像、生成式填充、生成矢量图、重新着色等 [去水印]Image-fx：Google 的以文生图模型2.2 以文生图获取 AI 模型整合包：@秋葉aaaki、@万能君的软件库结合手绘内容以文生图：Dynamic、ImgPilot、Drawfast （基于LCM模型）Flux.1：Stable Diffusion 原始团队推出的文生图模型套件（效果远超 SD 3 及 MJ v6）[1] [2]Fooocus：AI 画图工具，结合了 Stable Diffusion 和 Midjourney 的优点，开箱即用Invoke AI：用于 Stable Diffusion 等模型的AI绘画可视化工具 [52]2.3 P图的 AIAI 抠图模型：U2-Net、飞桨、ReplaceAnything、Background Remover、PBRem Tool、Transparent BackgroundIOPaint：全能图像工具箱，支持图像消除、对象替换、文字绘制和图像扩展等 [52]AnyText：在图像中修改或生成高度融合的文本DeepMosaics：自动去除图像和视频中的马赛克，同时支持添加马赛克Edit Anything：编辑和生成图像中的任何内容LiYing：证件照后期自动处理程序，可以完成人体、人脸自动识别，角度自动纠正，自动更换任意背景色，任意尺寸证件照自动裁切，并自动排版HivisionIDPhotos：轻量级证件照AI，支持抠图、生成不同尺寸的标准证件照、六寸排版照、美颜、智能换正装Text Behind Image：在图像主体背后添加文本2.4 大厂专区腾讯ARC（Applied Research Center）GFPGAN：老照片人脸修复、着色PhotoMaker：基于上传的人像生成各种风格的逼真照片T2I-Adapter：基于手绘内容与文本描述生成图片03. 音视频模型区3.1 直接上手国内团队自研打造的文生视频、文生图大模型：即梦、可灵、通义万象、腾讯混元文生视频Pi：用英文母语者的口音与你聊天的 AI （练习英语听力）MagicMirror：一键 AI 换脸、发型、穿搭3.2 视频换脸视频AI换脸：DeepFaceLab[中文论坛]、DeepFaceLive、RopeDeep-Live-Cam：只需要一张图片就可以将视频中的人脸实时（直播可用）替换成目标人脸AniTalker：通过音频和静态人像生成逼真的说话视频 [MyVoiceYourFace]SadTalker-Video-Lip-Sync：为视频人像生成流畅、真实、自然的唇形3.3 音声合成DiffSinger：堪比真人的歌声合成模型 [AI本兮]AI音色克隆：GPT-SoVITS [介绍]、RVC-WebUI、AI歌曲生成：Suno[Bark]、Uido、Stable Audio、Sonauto 、网易天音、海绵音乐Reecho睿声®：在数秒内克隆任意声音、创建与真人无异的文本配音、或是仅通过文本描述来生成任意音效AnyVoice：超真实的文本转语音(TTS)，配备即时声音克隆技术，免费无限下载3.4 剪辑后期Subtitle Hub：影视字幕工具一站式导航平台Video subtitle extractor：将视频中硬字幕提取为外挂字幕文件 .srt 的工具视频翻译和配音工具：AI 视频翻译、配音、字幕生成等一站式处理Video subtitle master：批量为视频生成字幕，并可将字幕翻译成其它语言YouDub：融合了语音识别、大型语言模型翻译，以及 AI 声音克隆技术，提供与原视频相似的中文配音，旨在将 YouTube 和其他平台上的高质量视频翻译和配音成中文版本VideoLingo：一站式视频翻译本地化配音工具，旨在生成 Netflix 级别的高质量字幕，还能加上高质量的配音KrillinAI：基于 AI 大模型的视频翻译和配音工具,支持配音克隆ProPainter：移除视频中的对象、移除视频水印并填充被遮盖部分Video subtitle remover：无损分辨率将视频中的硬字幕去除，生成去除字幕后的文件04. 优秀开源游戏4.1 棋类引擎Leela：安装即玩的围棋软件，新手友好型围棋 AISabaki：可以搭载 Leela Zero 等多种支持 GTP 协议的围棋 AI 引擎的围棋 GUI 软件BadukMegapack：傻瓜式安装多种开源围棋 AI 软件Banksia GUI：国际象棋 GUI 软件,内置强大的支持 UCI 协议的国际象棋 AI 引擎 StockfishPikafish：棋力最强的象棋引擎，基于最新的 NNUE 神经网络，永久免费开源Andriod 阿Q围棋 Lite、象棋巫师、棋路-中国象棋4.2 其他游戏Unciv：“文明5”的低配版像素游戏 <100MBHabitica：完成你的待办事项后，会升级解锁更多游戏玩法CorsixTH：Theme Hospital 游戏的开源复刻版05. 实用开源工具原则上，现在的手机选择 arm64-v8a 版本架构；虚拟机选择 x86_64 或 x86 架构；一些比较旧的手机，选择armeabi-v7a [1] [2]5.1 功能软件自动跳过APP开屏广告：李跳跳、Android-Touch-Helper、GKD [订阅规则]、SKIP、TapClick12306 抢票专用：py12306 购票助手、分流抢票广告滚蛋：删除 Win11 各处广告的小工具，OFGB 的汉化版WeChatExtension-ForMac：Mac 微信功能拓展/微信插件/微信小助手Wx-Dump-4J：支持导出微信各类记录(聊天记录，联系人，群聊等)，并提供全面的数据整合与分析解决方案 [MemoTrace] [wechatDataBackup]EasySpide：无代码可视化设计和执行爬虫任务的软件Pintree：将浏览器书签转换成一个美观且易用的导航页面RTranslator：开源、免费且离线的 Android 实时翻译应用程序GoGoGo：基于 Android 调试 API + 百度地图实现的虚拟定位工具HackBrowserData：解密和导出浏览器数据（密码、历史记录、Cookies、书签、信用卡、下载历史、localStorage 和扩展）FadCam：支持在锁屏、后台或使用其他应用时持续录制视频OP Auto Clicker：鼠标自动点击工具，同时支持 PC 与 AndroidMyKeymap：一款基于 AutoHotkey 的键盘映射工具 [1]5.2 娱乐软件Android本地音乐播放器：椒盐音乐、Retro Music Player、MetroAndroid本地视频播放器：VLC、Kodi、NOVA、MPVLegado/阅读：安卓端最好的网络小说阅读器，支持自定义书源[1] [2] [3] [4]内置多个动漫源的追番 APP：Anime、纯纯看番播放全网免费音乐：LX Music [1] [2]-TG [3]、NOS 五音助手 [1]、MusicFree [1] [2]京墨：中华文化宝典 APP，诗（词）文（名句）、汉字、成语、词语、歇后语、绕口令、传统节日、传统色、节气、人物等06. 第三方客户端解锁本地会员权限，如去广告、离线下载等YouTube Music：ViMusic、InnerTune、Musify、SimpMusic、SpMpYouTube：RV YT、LibreTube、NewPipe、YouTube ReVancedBiliBili：PiliPlus、PiliPala、哔哩喵、TV BV、TV BBLLSpotify：Spotube、BlockTheSpot、SpotX patcher、xManagerPixiv：PixEz Flutter、Shaft、PixevalTikTok 免拔卡安卓版本、Hydrogen-知乎极简版、贴吧 Lite [TG]网易云音乐：YesPlayMusic、SPlayer、bujuan、Music You拷贝漫画：Copymanga、CopyMangaJava、kobi、PasteMangaX07. 语音文字转换Alibaba FunAudioLLM：CosyVoice-语音生成 [整合包]、SenseVoice-语音识别7.1 文字转语音开箱即用：TTSMaker、Text to Speech、AudioTextHub、TTS Online、淘金阁、Balabolka、智影TTS-Vue：调用微软官方语音合成接口进行文字转语音 [1]Fish Speech：基于原神/崩坏星穹铁道/BlueArchive角色的，支持中/日/英三语合成ChatTTS：专为 LLM 助手等对话场景设计的文本转语音模型 [webUI]EmotiVoice：支持中英文双语，包含2000多种不同的音色，以及特色的情感合成功能EasyVoice：完全免费，一键生成语音和字幕、小说一键转为有声书电子书转有声读物ebook2audiobook：使用 Calibre、ffmpeg、XTTSv2、Fairseq 等将电子书转有声读物，支持声音克隆和 1124 种语言Android MultiTTS：离线朗读配音软件 [语音包合集] [入门教程] [国内网盘]7.2 语音转文字开箱即用：Whisper、飞书妙记、剪映、通议听悟、音视频取文本工具（带时间轴）FunASR：阿里达摩院的语音识别工具包，结合了语音端点检测、语音识别、标点预测、时间戳预测、说话人区分等模型 [CapsWriter]zh_recogn：将音频或视频中的中文语音识别并导出为 srt 字幕，基于魔塔社区 Paraformer 模型AsrTools：智能语音转字幕文本工具，内置大厂 ASR 服务，无需 GPU 和繁琐的本地配置，小白也能轻松使用08. GitHub收集盒Github热门榜、标星榜、用户榜、中文榜、英文榜8.1 人工智能国内外大模型综合性多维度中文能力评测榜单：CLiB、SuperCLUE开源大模型食用指南：围绕开源大模型、针对国内初学者、基于 Linux 平台的中国宝宝专属大模型教程Open Source Team：国内顶尖团队的开源项目地址列表收集与人工智能相关的实用程序：Awesome AI Tools [2]、AI Product HomeAiMonneyHunter：这是一个 AI 副业赚钱资讯信息的大合集Awesome LLM resourses：全世界最好的LLM资料总结（数据处理、模型训练、模型部署、o1 模型、小语言模型、视觉语言模型）Awesome LLMs In China：全面收集有明确来源的中国大模型情况，包括机构、来源信息和分类等Awesome Chinese LLM：收集和梳理中文 LLM 相关的开源模型、应用、数据集及教程等资料Awesome Virtual Try-on：与虚拟试穿相关的研究论文、项目、代码、数据集、研讨会等的精选列表Awesome Generative AI Guide：生成式 AI 研究论文、访谈材料、教程、笔记等更新的综合中心Awesome 0pen GPT：GPT 相关开源项目合集精选8.2 应用软件TVapk：收集各大 AndroidTV 的 apk 应用，可免费看 VIP 和国外电影电视绝版游戏保护工程：收录 DOS 游戏，红白机，SFC/MD 等主机游戏机Awesome Mac：收集各种好用的 Mac 软件，包括但不限于开源、免费软件Awesome macOS OS Apps：适用于 macOS 的出色开源应用程序列表Best App：免费及付费的 iOS/macOS App 作品推荐列表Awesome Bilibili Extra：收集一些让我们在使用 B 站时更加方便的浏览器扩展/脚本/程序Awesome Privacy：专注于隐私和安全的软件和服务商的精选列表Awesome Free Apps：免费的 PC 和 移动端应用收集Wotaku：为二次元用户打造的开源索引平台，汇集了软件、网站、工具等资源8.3 其他收集Awesome OSINT：开源情报（OSINT）收集工具和信息来源的精选列表中国独立开发者项目列表：聚合所有中国独立开发者的项目国内开源镜像站点汇总：分企业站、教育站等收录中文独立博客的项目，提供 RSS 订阅地址：中文博客琅琊榜、中文独立博客列表ChineseBQB：中文表情包博物馆，相关在线搜图斗图工具404StarLink：推荐优质、有意义、有趣、坚持维护的安全领域开源项目Public API Lists：用于软件和 Web 开发的免费 API 的集合列表Awesome Terminals：收集各类终端模拟器，还整理了各类 shellProxy-client-collection：各平台代理软件收集处09. 技术极客论坛BL List：各大手机厂商的 Bootloader 解锁、内核开源、保修政策对比系统封装重装系统：远景论坛、无忧启动、小鱼儿yr系统技术开发交流社区：鱼C工作室、菜鸟技术教程、看雪论坛、V2EX、LINUX DO、批处理之家网络安全杀软讨论：精睿论坛、卡饭论坛最新动态想要及时查看 DMUCD 的更新内容请移步 小红书原文地址：科技最前沿 - DMUCD
解决宝塔面板安装 Nginx 失败：cmake command not found 及 apt lock 错误深度解析
本文由AI辅助撰写，可能存在不准确之处，请读者注意甄别！宝塔安装nginx遇到问题：解决方案：在服务器运维中，宝塔面板因其便捷性广受青睐。但即使是自动化工具，也难免遇到依赖问题。本文将深入解析一种常见的宝塔面板安装错误：在 Ubuntu 22.04.5 LTS 上安装 Nginx 1.28.0 时，因缺少 cmake 工具而导致的失败。同时，我们还会解决随之而来的 apt 锁文件冲突和“cmake 无安装候选”的问题。错误现象当你尝试通过宝塔面板安装 Nginx 时，系统可能会抛出类似如下的错误日志：www server panel install public sh line 157 cmake command not found Ubuntu 22.04 5 LTS l Bit 64 Mem 3868M Core 4 gcc cmake Linux 6.8 0 40 generic x86_64 ERROR nginx 1.28 0 installation failed 安装失败 请截图以上报错信息发帖至论坛www bt cn bbs求助这个错误的核心在于 cmake command not found，意味着系统找不到 Nginx 编译所需的 cmake 工具。问题分析这个安装失败的问题背后，通常隐藏着多个相互关联的系统问题：缺少编译依赖：宝塔面板在安装某些软件时，会调用编译源码的方式。Nginx 的安装过程需要 cmake 作为编译工具。如果系统环境中没有安装 cmake，安装自然无法完成。apt 进程冲突：当你尝试使用 apt 命令安装 cmake 时，可能会遇到“Could not get lock”的错误。这是因为系统后台有其他 apt 进程（比如自动更新）正在运行，占用了包管理器的锁文件，导致新命令无法执行。软件源配置问题：在处理完锁文件问题后，如果你仍然无法安装 cmake，并收到“Package 'cmake' has no installation candidate”的错误，这通常意味着你的软件源（/etc/apt/sources.list）配置不正确或不完整，导致 apt 无法找到 cmake 包。解决方案：分步解决三合一问题我们将分步解决这些问题，确保宝塔面板能够顺利安装 Nginx。步骤1：处理 apt 锁文件冲突首先，我们需要释放被占用的 apt 锁。查找并终止进程：通过 ps aux | grep -i apt 命令找到正在运行的 apt 进程。root@ship-virtual-machine:~# ps aux | grep -i apt root 29764 0.0 0.2 27440 8704 ? S 15:14 0:00 apt-get update -y # ... 其他apt相关进程 ...请谨慎使用此类代码。在上面的输出中，进程ID为 29764 的 apt-get update -y 是罪魁祸首。使用 kill 命令终止它。sudo kill 29764 # 如果无法终止，使用强制终止 sudo kill -9 29764请谨慎使用此类代码。删除残留的锁文件：进程终止后，一些锁文件可能仍然存在。删除它们以确保包管理器状态干净。sudo rm /var/lib/apt/lists/lock sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock请谨慎使用此类代码。重新配置包：修复任何可能因中断而损坏的包状态。sudo dpkg --configure -a请谨慎使用此类代码。步骤2：修复软件源（如果遇到“无安装候选”）如果执行完上一步后，仍然提示“Package 'cmake' has no installation candidate”，则需要修复软件源文件。备份并编辑软件源： 首先备份当前的软件源文件。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak请谨慎使用此类代码。然后使用 nano 等编辑器打开文件。sudo nano /etc/apt/sources.list请谨慎使用此类代码。替换为正确的软件源：将文件内容替换为正确的 Ubuntu 22.04 (Jammy) 软件源。例如，使用阿里云的镜像：deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse # 如果需要，可以添加源码源 deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse保存并更新：保存更改，然后重新运行 apt update 以刷新软件包列表。sudo apt update请谨慎使用此类代码。步骤3：安装 cmake现在，apt 的所有障碍都已清除，可以正常安装 cmake 了。sudo apt install cmake请谨慎使用此类代码。验证安装：安装完成后，可以通过 cmake --version 命令来验证是否成功。cmake --version请谨慎使用此类代码。如果命令返回了 cmake 的版本号，则说明安装成功。步骤4：在宝塔面板重新安装 Nginx回到宝塔面板界面，再次尝试安装 Nginx 1.28.0。有了正确的 cmake 工具，安装过程将能够顺利完成。总结当宝塔面板安装失败时，详细的错误日志是解决问题的关键。通过对 cmake command not found 错误的层层分析，我们不仅解决了核心的依赖缺失问题，还顺带处理了由它引发的 apt 锁冲突和软件源配置不当等常见服务器运维问题。掌握这些技巧，将帮助你更高效地管理你的服务器。解决成功：
Ubuntu OpenSSH 升级权威指南：修复 CVE-2024-6387 漏洞（含手动与自动化脚本）
本文由AI辅助撰写，可能存在不准确之处，请读者注意甄别！前言近期，OpenSSH 披露了一个严重的安全漏洞 CVE-2024-6387，该漏洞可能导致未经身份验证的远程攻击者执行任意代码，对服务器安全构成巨大威胁。作为 Linux 系统中最核心的远程管理服务，确保 OpenSSH 的安全是每位系统管理员的首要任务。本文旨在提供一份详尽且权威的操作指南，帮助您将 Ubuntu 服务器上的 OpenSSH 升级到安全的 9.9p2 或更高版本。我们将提供两种升级策略：手动分步执行：适合希望理解每一个步骤背后原理的管理员。一键自动化脚本：适合需要在多台服务器上进行快速、标准化部署的场景。准备工作：升级前的检查清单在开始之前，请务必完成以下准备工作，以确保升级过程平稳、安全。1. 权限与环境操作系统: 本指南适用于 Ubuntu 18.04, 20.04, 22.04 及更高版本。用户权限: 您需要拥有 sudo 或 root 权限来执行系统级操作。2. !! 最重要的安全提醒 !!在整个升级过程中，请务必保持当前的 SSH 连接窗口不要关闭！因为操作会重启 SSH 服务，一旦配置失败，您可能会失去对服务器的访问权限。完成所有步骤后，请打开一个新的终端窗口尝试登录，确认新连接成功后，再关闭旧的连接窗口。3. 网络代理设置 (如果需要)如果您的服务器位于需要通过代理才能访问外部网络的环境，请先在终端中设置以下环境变量：# 将地址和端口替换为您的实际代理 export http_proxy="http://your-proxy-address:port" export https_proxy="http://your-proxy-address:port"注意：后续 sudo 命令需要添加 -E 参数以继承这些环境变量。策略一：手动分步升级（深入理解原理）此方法将引导您完成从编译到替换的每一个步骤，让您清晰地了解底层发生了什么。第1步：安装编译依赖首先，我们需要安装编译 OpenSSH 源码所必需的工具和库文件。# 更新软件包列表 sudo -E apt-get -y update # 安装编译工具和依赖库 sudo -E apt-get install -y build-essential zlib1g-dev libssl-dev第2步：下载、解压并编译源码我们将从 OpenSSH 官方站点下载 9.9p2 版本的源码，并进行编译安装。# 下载源码包 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz # 解压缩 tar -xzf openssh-9.9p2.tar.gz cd openssh-9.9p2 # 配置、编译和安装 (默认会安装到 /usr/local 目录) ./configure make sudo make install第3步：替换系统默认的 OpenSSH (核心)新版本已安装到 /usr/local 目录，但系统默认使用的仍是 /usr/bin 和 /usr/sbin 下的旧版本。我们需要手动替换它们。# 1. 停止当前 SSH 服务 sudo systemctl stop ssh # 2. 备份系统自带的 sshd (服务端) 和 ssh (客户端) 程序 sudo mv /usr/sbin/sshd /usr/sbin/sshd.bak sudo mv /usr/bin/ssh /usr/bin/ssh.bak # 3. 将新编译的程序复制到系统默认路径 sudo cp /usr/local/sbin/sshd /usr/sbin/sshd sudo cp /usr/local/bin/ssh /usr/bin/ssh第4步：更新 Systemd 服务配置为确保系统服务能正确调用新版本的 sshd，我们需要更新服务文件中的路径。sudo sed -i 's|/usr/sbin/sshd|/usr/local/sbin/sshd|g' /lib/systemd/system/ssh.service第5步：重启服务并验证最后，重新加载配置，启动服务，并验证版本号。# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动 SSH 服务 sudo systemctl start ssh # 检查服务状态，确保 active (running) sudo systemctl status ssh # 验证版本号 ssh -V如果一切顺利，您应该能看到 OpenSSH_9.9p2 的输出。策略二：一键自动化脚本（高效部署）对于需要快速部署或管理多台服务器的管理员，此脚本将所有手动步骤封装起来，实现一键式升级。使用方法将下面的脚本内容完整复制并保存到一个文件，例如 upgrade_openssh.sh。给脚本添加执行权限：chmod +x upgrade_openssh.sh。执行脚本：./upgrade_openssh.sh。自动化脚本#!/bin/bash # ================================================================================== # OpenSSH 9.9p2 强制升级脚本 # ================================================================================== # 设置脚本在遇到错误时立即退出 set -euo pipefail # --- 定义一些颜色输出，方便观察 --- GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo -e "${GREEN}--- 开始执行 OpenSSH 9.9p2 强制升级脚本 ---${NC}" # --- 步骤 1: 清理旧的源码文件 --- echo -e "\n${YELLOW}>>> 步骤 1: 清理旧的源码文件...${NC}" rm -rf openssh-9.9p2 openssh-9.9p2.tar.gz echo "清理完成。" # --- 步骤 2: 安装编译依赖 --- echo -e "\n${YELLOW}>>> 步骤 2: 更新软件包列表并安装编译依赖...${NC}" sudo -E apt-get -y update sudo -E apt-get install -y build-essential zlib1g-dev libssl-dev echo "依赖安装完成。" # --- 步骤 3: 下载、解压并编译 OpenSSH 9.9p2 --- echo -e "\n${YELLOW}>>> 步骤 3: 下载并编译 OpenSSH 9.9p2...${NC}" wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz tar -xzf openssh-9.9p2.tar.gz cd openssh-9.9p2 echo "正在配置..." ./configure echo "正在编译 (这可能需要几分钟)..." make echo "正在安装..." sudo make install cd .. echo "编译安装完成。" # --- 步骤 4: 替换系统默认的 OpenSSH --- echo -e "\n${YELLOW}>>> 步骤 4: 停止服务并替换系统默认 OpenSSH 文件...${NC}" sudo systemctl stop ssh if [ -f /usr/sbin/sshd ]; then echo "备份 /usr/sbin/sshd -> /usr/sbin/sshd.bak" sudo mv /usr/sbin/sshd /usr/sbin/sshd.bak fi if [ -f /usr/bin/ssh ]; then echo "备份 /usr/bin/ssh -> /usr/bin/ssh.bak" sudo mv /usr/bin/ssh /usr/bin/ssh.bak fi echo "复制新版 OpenSSH 文件到系统目录..." sudo cp /usr/local/sbin/sshd /usr/sbin/sshd sudo cp /usr/local/bin/ssh /usr/bin/ssh echo "更新 systemd 服务配置文件..." sudo sed -i 's|/usr/sbin/sshd|/usr/local/sbin/sshd|g' /lib/systemd/system/ssh.service echo "文件替换完成。" # --- 步骤 5: 重新加载服务并验证 --- echo -e "\n${YELLOW}>>> 步骤 5: 重启服务并进行最终验证...${NC}" sudo systemctl daemon-reload sudo systemctl start ssh echo -e "\n--- 验证 SSH 服务状态 ---" sudo systemctl status ssh --no-pager echo -e "\n--- 验证 OpenSSH 版本 ---" ssh -V echo -e "\n${GREEN}=====================================================${NC}" echo -e "${GREEN}脚本执行完毕！${NC}" echo -e "${YELLOW}请立即打开一个新的终端窗口尝试SSH登录，以确认一切正常！${NC}" echo -e "${GREEN}=====================================================${NC}"升级后最终确认与回滚策略最终确认脚本或手动步骤执行完毕后，请务必从另一台机器或打开一个新的终端窗口，发起新的 SSH 连接。ssh user@your_server_ip如果登录成功，并再次通过 ssh -V 确认版本为 9.9p2，则表示升级圆满成功。紧急回滚策略如果新版本导致无法登录，您可以通过云服务商的控制台或物理访问进入服务器，执行以下命令回滚到之前的版本：# 停止服务 sudo systemctl stop ssh # 恢复备份的旧版本文件 sudo mv /usr/sbin/sshd.bak /usr/sbin/sshd sudo mv /usr/bin/ssh.bak /usr/bin/ssh # 重新启动服务 sudo systemctl start ssh这将使您的 SSH 服务恢复到升级前的状态。总结定期更新 OpenSSH 是保障服务器安全的关键措施之一。通过本文提供的手动或自动化方法，您可以有效地将系统 OpenSSH 升级到安全版本，从而抵御潜在的严重漏洞威胁。在操作时，请始终牢记安全第一，做好备份，并遵循警告提示，确保万无一失。参考资料：Ubuntu升级OpenSSH - 明心镜
本文转载自互联网，已在文末注明来源。acm-template 模板编写规范说明使用markdown语法（便于赛前打印和生成目录）所有的算法模板都写在这一个md文件中代码名称需要有接口说明（可以看下面示例）代码最小原则，不添加任何不必要的变量和函数（最小不意味着最少，不要为了减短代码而去减短代码）代码块要使用如下的markdown包裹 your code 其他细则在实践过程中添加快速幂简介:介绍算法干啥，哪些情况用的上非递归版算法描述: 简要描述算法实现框架（便于找错）。 /* Version: 1.0 Author: 徐祥昊 Date: 2018.7.27 Function List: 1.q_pow(__int64 a,__int64 b) a:这里是a参数的说明; b:这里是b参数的说明; ret:这里是返回值的说明; 2.some else func 3.some else func */ bool q_pow(__int64 a,__int64 b) { __int64 res=1,mod=b,carry=a; while(b) { if(b%2) { res=res*a%mod; } a=a*a%mod; b>>=1; } if(res == carry)return true; else return false; }O(log(n)) 素数判定目前已知的最快的单个素数判定方法/* Version: 1.0 Author: 王峰 Date: 2018.8.26 Function List: isPrime(long long n) 返回值为n是否是质数 */ #include <iostream> #include <cmath> long long pow_mod(int a, long long d, long long mod) { long long res = 1, k = a; while(d) { if(d & 1) res = (res * k) % mod; k = k * k % mod; d >>= 1; } return res; } bool test(long long n, int a, long long d) { if(n == 2) return true; if(n == a) return true; if((n & 1) == 0) return false; while(!(d & 1)) d = d >> 1; long long t = pow_mod(a, d, n); while((d != n - 1) && (t != 1) && (t != n - 1)) { t = t * t % n; d <<= 1; } return (t == n - 1 || (d & 1) == 1); } bool isPrime(long long n) { if(n < 2LL) return false; int a[] = {2, 3, 61}; for (int i = 0; i <= 2; ++i) if(!test(n, a[i], n - 1)) return false; return true; } 欧拉筛法求素数表时间复杂度 O(n)/* Version: 1.0 Author: 王峰 Date: 2018.8.26 Function List: get_prime() check[i]表示i是否为合数 prime[i]表示第i个质数,i从0开始计数 */ #include<cstdio> #include<cstring> const int MAXN = 10000001; const int MAXL = 10000001; int prime[MAXN]; int check[MAXL]; int get_prime() { int tot = 0; memset(check, 0, sizeof(check)); for (int i = 2; i < MAXL; ++i) { if (!check[i]){ prime[tot++] = i; } for (int j = 0; j < tot; ++j) { if (i * prime[j] > MAXL) { break; } check[i*prime[j]] = 1; if (i % prime[j] == 0) { break; } } } return tot; }ST表用于快速查询RMQ问题 建表时间复杂度O(log(n))空间复杂度O(log(n)) 查询时间复杂度O(1) 不可动态更改/* Version: 1.0 Author: 王峰 Date: 2018.8.27 Function List: init_table(n) n为原数组a的长度 query_table(L, R) 查询原数组内区间[L,R]的最值 */ #include <cstdio> #include <algorithm> using std::min; const int N = 1000010; int table[N][100]; int lg[N]; int a[N]; void init_table(int n) { for(int i=0; i<n; i++) table[i][0]=a[i]; for(int j=1; (1<<j)<=n; j++) { for(int i=0; i+(1<<j)-1<n; i++) { table[i][j] = min(table[i][j-1],table[i+(1<<(j-1))][j-1]); } } for(int i=2, k=0; i<=n; i++) { if(i>(1<<k)) k++; lg[i] = k-1; } } int query_table(int L, int R) { int k = lg[R-L+1]; return min(table[L][k],table[R-(1<<k)+1][k]); }树状数组（二叉索引树）模板用于求可单点更新的前缀和，时间复杂度O(log(n))/* Version: 1.0 Author: 王峰 Date: 2018.8.27 Function List: add(k, v) 将数组中的第k个元素的值+v，注意k从1开始计数 query(k) 查询profix[k] */ #include <cstdio> const int N = 1000010; int n; //实际数组的长度 long long tree[4*N]; void add(int k, long long v) { while(k<n){ tree[k]+=v; k+=(k&-k); } } long long query(int k) { long long ans = 0; while(k>0) { ans+=tree[k]; k-=k&-k; } return ans; }求和线段树模板RMQ线段树小改即可/* Function List: Build(1,n,1); 建树 Add(L,C,1,n,1); 点更新 Update(L,R,C,1,n,1); 区间更新 ANS=Query(L,R,1,n,1); 区间查询 */ typedef long long LL; const int MAXN=1e5+7; LL a[MAXN],ans[MAXN<<2],lazy[MAXN<<2]; void PushUp(int rt) { ans[rt]=ans[rt<<1]+ans[rt<<1|1]; } void Build(int l,int r,int rt) { if (l==r) { ans[rt]=0; return; } int mid=(l+r)>>1; Build(l,mid,rt<<1); Build(mid+1,r,rt<<1|1); PushUp(rt); } void PushDown(int rt,LL ln,LL rn) { if (lazy[rt]) { lazy[rt<<1]+=lazy[rt]; lazy[rt<<1|1]+=lazy[rt]; ans[rt<<1]+=lazy[rt]*ln; ans[rt<<1|1]+=lazy[rt]*rn; lazy[rt]=0; } } void Add(int L,int C,int l,int r,int rt) { if (l==r) { ans[rt]+=C; return; } int mid=(l+r)>>1; //PushDown(rt,mid-l+1,r-mid); 若既有点更新又有区间更新，需要这句话 if (L<=mid) Add(L,C,l,mid,rt<<1); else Add(L,C,mid+1,r,rt<<1|1); PushUp(rt); } void Update(int L,int R,long long C,int l,int r,int rt) { if (L<=l&&r<=R) { ans[rt]+=C*(r-l+1); lazy[rt]+=C; return; } int mid=(l+r)>>1; PushDown(rt,mid-l+1,r-mid); if (L<=mid) Update(L,R,C,l,mid,rt<<1); if (R>mid) Update(L,R,C,mid+1,r,rt<<1|1); PushUp(rt); } LL Query(int L,int R,int l,int r,int rt) { if (L<=l&&r<=R) return ans[rt]; int mid=(l+r)>>1; PushDown(rt,mid-l+1,r-mid); LL ANS=0; if (L<=mid) ANS+=Query(L,R,l,mid,rt<<1); if (R>mid) ANS+=Query(L,R,mid+1,r,rt<<1|1); return ANS; }主席树主席树：可持久化线段树, 在nlog(n)空内维护多个权值线段树 离线数据结构不支持修改#include <cstdio> #include <vector> #include <algorithm> /* Version: 1.0 Author: 王峰 Date: 2018.9.25 Function List: 本例为查询区间第K大,有一个基于排序去重的哈希,有时间分离出来单独成板. */ using std::lower_bound; using std::vector; const int maxn = 1e5+6; int cnt, root[maxn], a[maxn]; struct node{ int l, r, sum; }T[maxn*40]; vector<int > v; int getid(int x) { return lower_bound(v.begin(), v.end(),x)-v.begin()+1; } void update(int l, int r, int &x, int y, int pos) { T[++cnt]=T[y],T[cnt].sum++,x=cnt; if(l==r)return ; int mid=(l+r)/2; if(mid>=pos)update(l, mid, T[x].l, T[y].l, pos); else update(mid+1, r, T[x].r, T[y].r, pos); } int query(int l, int r, int x, int y, int k) { if(l==r) return l; int mid = (l+r)/2; int sum = T[T[y].l].sum - T[T[x].l].sum; if(sum>=k)return query(l, mid, T[x].l, T[y].l, k); else return query(mid+1, r, T[x].r, T[y].r, k-sum); } int main() { int n, q; scanf("%d%d", &n, &q); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); v.push_back(a[i]); } sort(v.begin(), v.end()),v.erase(unique(v.begin(), v.end()), v.end()); for(int i=1; i<=n; i++) update(1, n, root[i], root[i-1], getid(a[i])); for(int i=1; i<=q; i++) { int x, y, k; scanf("%d%d%d", &x, &y, &k); printf("%d\n", v[query(1,n,root[x-1],root[y],k)-1]); } return 0; } dijkstra+priority_queue用于求单源最短路径，不能处理负环/* Version: 1.0 Author: 王峰 Date: 2018.9.3 Function List: init(int n) 将带n个点的图初始化 addEdge(int from, int to, int dist) 增加一条单向边 dijkstra(int s) 求s为源点的最短路 print(t, s) 打印从s为源点t为终点的一条路径 */ #include <cstdio> #include <vector> #include <queue> #include <cstring> using std::vector; using std::priority_queue; const int maxn = 1e6+7; const int INF = 0x3f3f3f3f; struct Edge { int from, to, dist; }; struct HeapNode { int d, u; bool operator < (const HeapNode& rhs) const { return d > rhs.d; } }; struct Dijkstra { int n, m; //点数和边数 vector<Edge> edges; //边列表 vector<int> G[maxn]; //每个节点出发的边编号， 从0开始编号 bool vis[maxn]; //是否已经标记 int d[maxn]; //s到各个点的距离 //int p[maxn]; //最短路的上一条边 void init(int n) { this->n = n; for(int i=0; i<=n; i++) { G[i].clear(); } edges.clear(); } /* void print(int t, int s) { int pre = edges[p[t]].from; if(t==s) { printf("%d ", s); return ; }else{ print(pre,s); printf("%d ", t); } } */ void addEdge(int from, int to, int dist) { edges.push_back((Edge){from, to, dist}); m = edges.size(); G[from].push_back(m-1); } void dijkstra(int s) { priority_queue<HeapNode> Q; for(int i=0; i<=n; i++) d[i] = INF; d[s]=0; memset(vis, 0, sizeof(vis)); Q.push((HeapNode){0, s}); while(!Q.empty()) { HeapNode x = Q.top(); Q.pop(); int u = x.u; if(vis[u]) continue; vis[u] = true; for(int i=0; i<G[u].size(); i++) { Edge & e = edges[G[u][i]]; if(d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; //p[e.to] = G[u][i]; Q.push((HeapNode){d[e.to], e.to}); } } } } }D;Bellman-Ford单源最短路-可以判负环 队列实现，时间复杂度O(玄学)/* Version: 1.0 Author: 王峰 Date: 2018.9.30 Function List: the same as dijkstra algorithm */ #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn = 1e5+7; struct Edge { int from, to; double dist; }; struct BellmanFord { int n, m; vector<Edge> edges; vector<int> G[maxn]; bool inq[maxn]; double d[maxn]; int p[maxn]; int cnt[maxn]; void init(int n) { this->n = n; for(int i=0; i<=n; i++) { G[i].clear(); } edges.clear(); } void AddEdge(int from, int to, double dist) { edges.push_back((Edge){from, to, dist}); m = edges.size(); G[from].push_back(m-1); } bool negativeCycle() { queue<int> Q; memset(inq, 0, sizeof(inq)); memset(cnt, 0, sizeof(cnt)); for(int i=1; i<=n; i++) { d[i]=0; inq[0]=true; Q.push(i); } while(!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = false; for(int i=0; i<G[u].size(); i++) { Edge & e = edges[G[u][i]]; if(d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; p[e.to] = G[u][i]; if(!inq[e.to]) { Q.push(e.to); inq[e.to] = true; if(++cnt[e.to] > n) return true; } } } } return false; } };hlpp最大流-最强算法，时间复杂度Ｏ(|E|^2*sqrt(|V|))最高标号预流推进算法High Level Preflow Push/* copy from https://blog.csdn.net/KirinBill/article/details/60882828 有时间的话参照算法自己实现一遍 */ #include <cstdio> #include <queue> #include <cstring> using namespace std; #define min(a,b) (a>1; int cnt,head[MAXN]; bool vis[MAXN]; struct line{ int to,next,cap; line(){ next=-1; } }edge[MAXM]; struct data{ int x,h,ef; friend bool operator< (const data &a,const data &b){ return a.h<b.h; } }node[MAXN]; priority_queue q; queue<int> tmpq; inline void add(int u,int v,int w){ edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w; ++cnt; } void bfs(int t){ tmpq.push(t); vis[t]=true; int u,v; while(tmpq.size()){ u=tmpq.front(); for(int i=head[u];i!=-1;i=edge[i].next){ v=edge[i].to; if(!vis[v]){ node[v].h=node[u].h+1; tmpq.push(v); vis[v]=true; } } tmpq.pop(); } } int hlpp(int n,int s,int t){ for(int i=1;i<=n;++i) node[i].x=i; bfs(); data tmp; int u,v,f,tmph; for(int i=head[s];i!=-1;i=edge[i].next){ v=edge[i].to; edge[i^1].cap+=edge[i].cap; node[v].ef+=edge[i].cap; edge[i].cap=0; q.push(node[v]); } node[s].h=n; while(q.size()){ tmp=q.top(); q.pop(); u=tmp.x; tmph=INF; for(int i=head[u];i!=-1 && node[u].ef;i=edge[i].next){ v=edge[i].to; if(edge[i].cap){ if(node[u].h==node[v].h+1){ if(v!=s && v!=t && node[v].ef==0) q.push(node[v]); f=min(edge[i].cap,node[u].ef); edge[i].cap-=f; edge[i^1].cap+=f; node[u].ef-=f; node[v].ef+=f; } else tmph=min(tmph,node[v].h); } if(node[u].ef){ node[u].h=tmph+1; q.push(node[u]); } } return node[t].ef; } int main(){ memset(head,-1,sizeof(head)); int n,m,s,t,tmpu,tmpv,tmpw; scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;++i){ scanf("%d%d%d",&tmpu,&tmpv,&tmpw); add(tmpu,tmpv,tmpw); add(tmpv,tmpu,tmpw); } printf("%d",hlpp(n,s,t)); return 0; }C组合数板子时间复杂度O(2^n)/* Version: 1.0 Author: 王峰 Date: 2018.9.17 */ C[1][0] = C[1][1] = 1; for (int i = 2; i < N; i++){ C[i][0] = 1; for (int j = 1; j < N; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]); }容斥原理时间复杂度O(n^2)ll ans = 0; for(int i=0; i<(1<<tot); i++) { int cnt = 0; for(int j=0; j<tot; j++) { if(i&(1<<j)) cnt++; } ll tmp = 0; /* 得到当前状态下的贡献值 */ if(cnt&1) { ans ++ tmp; } else { ans -= tmp; } }原文地址：GitHub - binjie09/acm-template: 算法模板
首先到官网下载最新版本：Download VMware Workstation Pro由于VMware已经被博通收购了，现在官网已经下载不了，只能进博通官网下载：Home - Support Portal - Broadcom support portal博通需要注册登录，觉得麻烦的百度网盘下载链接：https://pan.baidu.com/s/1gRF4Rtxbqk8C-3Jt7stfcQ 提取码：ffff个人用途是免费使用的，以下是商业用途激活码（全部已测可用）：pro 17密钥：MC60H-DWHD5-H80U9-6V85M-8280Dpro 17密钥：4A4RR-813DK-M81A9-4U35H-06KND（备用）pro 17密钥：NZ4RR-FTK5H-H81C1-Q30QH-1V2LA（备用）pro 17密钥：JU090-6039P-08409-8J0QH-2YR7F（备用）pro 17密钥：4Y09U-AJK97-089Z0-A3054-83KLA（备用）pro 17密钥：4C21U-2KK9Q-M8130-4V2QH-CF810（备用）pro 17密钥：MC60H-DWHD5-H80U9-6V85M-8280D（备用）这样就可以使用了：VMware Workstation Pro 16版本的：pro 16版本下载链接：https://pan.baidu.com/s/1HomqVQ39iBDODnzV_dXcCA 提取码：ffffpro 16 密钥：ZF3R0-FHED2-M80TY-8QYGC-NPKYFpro 16 密钥：YF390-0HF8P-M81RQ-2DXQE-M2UT6（备用）pro 16 密钥：ZF71R-DMX85-08DQY-8YMNC-PPHV8（备用）原文链接：VMware Workstation Pro 17 安装教程 (超详细-附16版本) - 知乎 (zhihu.com)
关于 git 配置大小写敏感问题的复现与解决方案
本文转载自互联网，已在文末注明来源。1.查看当前 git 大小写敏感配置信息$ git config --global core.ignorecase true当前配置信息为：全局大小写不敏感2.项目 A 中文件夹命名为 HomeViews，已经提交到 gitlab 仓库中，由于项目规范化需求，需要将文件夹采用小驼峰命名为 homeViews，现在我们修改文件夹名称为 homeViews 后查看分支状态：我们发现虽然修改了文件夹名称的大小写，但是由于 git 对大小写不敏感的配置，导致无法发现差异$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean3.配置 git 全局大小写敏感。此时 git status 仍然无法监听到文件夹名称大小写的变动$ git config --global core.ignorecase false $ git config --global core.ignorecase false4.使用 mv 命令进行重命名， Git尝试重命名文件夹的名称仅更改大小写，但操作系统不允许直接修改大小写$ git mv src/HomeViews src/homeViews fatal: renaming 'src/HomeViews' failed: Invalid argument5.采取重命名为其它临时名称的方式进行修改$ git mv src/HomeViews src/homeViewsTemp $ git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git restore --staged <file>..." to unstage) renamed: src/HomeViews/HomePage.txt -> src/homeViewsTemp/HomePage.txt $ git mv src/homeViewsTemp src/homeViews $ git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git restore --staged <file>..." to unstage) renamed: src/HomeViews/HomePage.txt -> src/homeViews/HomePage.txt $ git commit -m "Rename HomeViews to homeViews" [master 922ef05] Rename HomeViews to homeViews 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{HomeViews => homeViews}/HomePage.txt (100%) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 12 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 325 bytes | 325.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To https://git.henau.edu.cn/leesong/testproject.git c2cbbf3..922ef05 master -> master 6.此时在远程仓库可以看到名称已修改原文地址：关于 git 配置大小写敏感问题的复现与解决方案 - 明心镜Git 文件名称大小写的天坑之前是知道 git 可以设置对文件名称大小写是否敏感的。但是一直没有遇到这方面的问题，直到前 - 掘金
本文转载自互联网，已在文末注明来源。目前优化后的效果已应用到：百宝箱->soarli二维码qrcode.js生成的二维码是不带边框留白的，经过研究代码，发现稍微修改一下，就可以实现保存的图片带边框留白：效果如下代码修改如下：1、HTML页面：2、qrcode.js：原文地址：qrcode.js实现二维码生成---带边框_qrcodejs二维码边距_淡漠憂傷的博客-CSDN博客
前言近期由于特殊原因，频繁用到了为Git环境配置代理、取消代理、切换代理的场景，在此把相关命令总结下来以供温习CV。经过测试，此方法适用于Windows/Linux系统。命令配代理：git config --global http.proxy http://xxx.xxx.xxx git config --global https.proxy http://xxx.xxx.xxx去代理：git config --global --unset http.proxy git config --global --unset https.proxy查看当前代理：git config --global --get http.proxy git config --global --get https.proxy参考资料：New Bing
Bat命令批量删除文件名中特定字符串
本文转载自互联网，已在文末注明来源。@echo off Setlocal Enabledelayedexpansion set "str=想要去掉的字符串" for /f "delims=" %%i in ('dir /b *.*') do ( set "var=%%i" & ren "%%i" "!var:%str%=!") 原文地址：小技巧：Bat命令批量删除文件名中特定字符串_Zeal Young的博客-CSDN博客