Claude技能库开发指南:工具调用原理与模块化实践

news2026/5/18 18:47:17
1. 项目概述一个为Claude模型量身定制的技能库最近在探索如何让Claude这类大型语言模型更好地融入我的日常工作流时我遇到了一个非常有意思的项目——DhanushNehru/claude-skills。简单来说这是一个专门为Anthropic的Claude模型设计的“技能库”或“工具箱”。它的核心思想是让Claude能够像调用函数一样去执行一些它本身不擅长或无法直接完成的任务比如联网搜索、读取本地文件、进行复杂的数学计算甚至是调用外部API。这听起来可能有点抽象我打个比方。Claude本身就像一个知识渊博但“手无寸铁”的专家它知道很多但它的“手”被限制在了对话窗口里。而claude-skills项目就是为这位专家打造了一套趁手的工具。当Claude需要获取实时信息时它可以“拿起”搜索工具当需要分析一份本地文档时它可以“拿起”文件读取工具。这套工具集就是所谓的“技能”。这个项目之所以吸引我是因为它精准地戳中了当前使用LLM大语言模型的一个核心痛点如何让模型与真实世界进行安全、可控的交互。我们不再满足于让模型仅仅进行文本生成和对话而是希望它能成为我们真正的智能助手能主动获取信息、处理数据、执行任务。claude-skills正是朝着这个方向迈出的扎实一步。它通过一套清晰的架构将外部能力封装成Claude可以理解和调用的“技能”极大地扩展了Claude的应用边界。无论是开发者想要构建更强大的AI应用还是普通用户希望提升日常工作效率这个项目都提供了一个极具参考价值的实现范式。2. 核心架构与设计理念拆解2.1 技能Skill的本质可插拔的功能模块要理解claude-skills首先要搞清楚“技能”到底是什么。在这个项目的语境下一个“技能”就是一个独立、自包含的功能单元。每个技能都明确知道自己能做什么功能描述、需要什么输入参数、以及会输出什么结果。项目采用了一种非常清晰的模块化设计。每个技能都是一个独立的Python文件或类遵循统一的接口规范。例如一个“网络搜索”技能它的核心可能就是一个封装了Google Search API或Serper API调用的函数。这个函数会接收用户查询词作为输入调用外部API获取搜索结果然后将结构化的摘要和链接返回给Claude。这种设计的好处显而易见。首先是可维护性每个技能独立开发、测试和更新互不干扰。其次是可扩展性当你需要增加一个新能力时比如“发送邮件”你只需要按照规范编写一个新的技能模块然后将其注册到系统中即可无需改动核心框架。最后是安全性由于每个技能的执行边界是清晰的我们可以更容易地对敏感操作如文件写入、网络请求进行权限控制和审计。2.2 与Claude的集成机制工具调用Tool Use与系统提示词那么Claude是如何知道它拥有这些技能并学会使用它们的呢这背后依赖于Anthropic API提供的“工具调用”Tool Use功能以及精心设计的系统提示词System Prompt。工具调用是Claude模型的一项核心能力。开发者可以向Claude描述一系列可用的工具即我们的技能包括工具的名称、描述和参数格式。当Claude在对话中判断需要调用某个工具来完成用户的请求时它会在回复中返回一个结构化的“工具调用请求”指明要调用哪个工具并传入相应的参数。然后由我们的应用程序即claude-skills的后端来执行这个工具并将执行结果返回给Claude。Claude接收到结果后再将其整合到后续的回复中。系统提示词在这里扮演了“使用说明书”和“行为规范”的角色。我们会在对话开始时通过系统提示词告诉Claude“你是一个配备了多种工具的助手。以下是你可以使用的工具列表[工具1描述][工具2描述]… 当用户的问题需要用到这些工具时请主动调用它们。” 同时提示词还会规定Claude调用工具的格式、解释结果的逻辑甚至设定一些安全边界比如“未经用户明确同意不得使用文件写入技能”。claude-skills项目的核心工作之一就是构建一个“桥梁”——一个中间件或服务。这个服务负责三件事技能管理加载、注册所有可用的技能模块。对话协调接收用户消息连同可用的技能描述一起发送给Claude API解析Claude返回的工具调用请求找到对应的技能并执行将执行结果返回给Claude。上下文维护管理整个对话的历史记录确保Claude在调用工具前后能保持对话的连贯性。注意工具调用的触发完全由Claude模型自主决策。这意味着技能描述的质量至关重要。清晰、准确、无歧义的描述能帮助Claude更准确地判断何时该调用工具以及如何填写参数。模糊的描述则可能导致误调用或漏调用。2.3 项目结构窥探典型的模块化布局虽然我无法看到该私有仓库的完整代码但根据其公开描述和同类项目的常见模式我们可以推断出claude-skills项目的大致结构。一个设计良好的技能库通常会包含以下目录和文件claude-skills/ ├── skills/ # 核心技能目录 │ ├── __init__.py │ ├── web_search.py # 示例网络搜索技能 │ ├── file_reader.py # 示例文件读取技能 │ ├── calculator.py # 示例计算器技能 │ └── weather.py # 示例天气查询技能 ├── core/ # 核心框架 │ ├── skill_manager.py # 技能加载与管理器 │ ├── claude_client.py # 封装与Claude API的交互 │ └── conversation.py # 对话上下文管理 ├── config/ # 配置文件 │ └── config.yaml # API密钥、技能开关等配置 ├── app.py # 主应用入口可能是CLI或Web服务 ├── requirements.txt # Python依赖列表 └── README.md # 项目说明文档skills/目录这是项目的灵魂所在。每个.py文件实现一个具体的技能。它们会定义一个类或函数实现execute(**kwargs)之类的方法并可能提供get_schema()方法来返回该技能的工具描述符合Claude工具调用格式。core/目录包含项目的“发动机”。SkillManager负责扫描skills/目录动态加载所有技能并提供根据名称查找技能的接口。ClaudeClient负责处理与Anthropic API的所有通信包括组装请求、解析响应、处理工具调用循环。Conversation类则维护着对话的完整历史。app.py将以上所有部分组合起来。它初始化技能管理器、创建Claude客户端并启动一个交互循环可能是命令行界面或一个简单的Web服务器等待用户输入然后协调整个“用户提问 - Claude思考 - 调用工具 - 返回结果 - Claude总结”的流程。这种结构清晰地将业务逻辑技能、控制逻辑核心框架和配置分离开是构建可维护、可扩展应用的标准做法。3. 核心技能实现与关键技术细节3.1 技能开发范式统一的接口与描述开发一个claude-skills兼容的技能并非天马行空而是需要遵循一套约定俗成的“契约”。这套契约确保了技能管理器能够识别它Claude能够理解它。首先每个技能必须提供一个清晰的工具模式Tool Schema。这个模式本质上是一个JSON对象它定义了Claude眼中这个工具的样子。通常包含以下字段name: 工具的唯一标识符如web_search。description: 工具功能的自然语言描述。这是最关键的部分必须准确、简洁因为Claude完全依赖这个描述来决定是否以及如何调用它。例如“在互联网上搜索最新信息。适用于查询新闻、事实、定义等。”input_schema: 定义输入参数的类型和格式。这通常是一个遵循JSON Schema规范的对象。例如搜索技能可能需要一个query字符串参数。其次技能需要实现一个执行函数。这个函数接收来自Claude的工具调用请求中解析出的参数一个字典执行具体的操作如调用API、读写文件、运行计算并返回一个结果通常是字符串或字典。执行函数内部必须包含完整的错误处理逻辑确保任何异常都能被捕获并转化为对人类和Claude友好的错误信息返回。一个简单的技能示例伪代码# skills/basic_calculator.py import json import math class BasicCalculatorSkill: name “basic_calculator” description “执行基础数学运算包括加()、减(-)、乘(*)、除(/)、乘方(**)。” def get_schema(self): return { “name”: self.name, “description”: self.description, “input_schema”: { “type”: “object”, “properties”: { “expression”: { “type”: “string”, “description”: “数学表达式例如 ‘(5 3) * 2’” } }, “required”: [“expression”] } } def execute(self, expression: str) - str: try: # 警告直接使用eval有安全风险此处仅为示例。 # 生产环境应使用更安全的表达式求值库如 asteval。 result eval(expression, {“__builtins__”: {}}, {“math”: math}) return f“计算表达式 ‘{expression}’ 的结果是{result}” except Exception as e: return f“计算失败{str(e)}。请检查表达式格式是否正确。”实操心得在编写技能描述时要站在Claude的角度思考。避免使用内部术语用Claude能理解的通用语言。描述应尽可能覆盖技能的适用场景和限制。例如文件读取技能的描述可以加上“此技能可以读取文本文件如.txt, .md, .py和常见文档如.pdf, .docx中的文字内容。对于二进制文件或没有读取权限的文件操作将失败。”3.2 网络搜索技能的实现与优化网络搜索无疑是技能库中最常用、价值最高的技能之一。它的实现看似简单调用搜索API但要做好却有很多细节。1. API选型常见的选择有Serper API专门为AI应用设计的搜索API返回结构化的JSON数据直接包含答案摘要速度快成本较低非常适合LLM场景。Google Custom Search JSON API提供标准的谷歌搜索结果需要自己处理HTML抓取或依赖摘要片段配置稍复杂有每日免费额度。Bing Search API与Google类似是另一个可靠选择。claude-skills项目很可能会选择Serper或类似服务因为其输出格式对AI最友好。2. 实现要点参数处理除了基本的query可以考虑增加num_results返回结果数量、search_type通用搜索、新闻、图片等等参数让Claude能进行更精细的控制。结果处理API返回的原始结果可能很冗长。需要编写逻辑来提取标题、链接和最重要的摘要snippet并将其格式化为一段连贯、信息丰富的文本供Claude消化。例如可以按相关性排序并为每个结果添加编号。缓存机制对于相同的搜索查询可以考虑在短时间内缓存结果以避免重复调用API节省成本和时间。错误处理与降级处理API限流、网络超时等情况。当主要搜索API失败时是否有备选方案3. 提示词工程配合仅仅提供搜索技能还不够我们需要在系统提示词中引导Claude有效地使用它。可以加入这样的指引“当用户的问题涉及实时信息、最新事件、不确定的事实或需要外部验证的知识时你应该优先考虑使用网络搜索技能。在回复中引用搜索结果时请注明信息来源。”3.3 文件处理技能的安全与边界让AI读取甚至操作本地文件是一个功能强大但风险极高的技能。claude-skills在实现此类技能时安全性必须是首要考虑。1. 安全沙箱设计路径限制技能不应允许访问任意路径。可以通过配置一个或多个“允许访问的根目录”如~/Documents/ai_workspace所有文件操作都被限制在此目录下。任何试图访问此目录之外的路径如../../../etc/passwd的请求都应被立即拒绝。用户确认对于写操作或删除操作可以在执行前设计一个确认机制。例如当Claude请求写入文件时系统可以暂停并询问用户“Claude试图创建文件/path/to/file.txt内容为…是否允许” 但这会打断对话流需要权衡。操作日志所有文件操作无论成功失败都应被详细记录操作类型、路径、时间、触发指令便于审计和回溯。2. 文件格式支持文本文件直接读取。常见文档集成python-docx库处理.docxPyPDF2或pdfplumber处理.pdfopenpyxl处理.xlsx。这些库能提取文字内容但会丢失大部分格式。代码文件支持读取.py,.js,.java等并可以尝试进行简单的语法高亮或结构分析以便Claude更好地理解。结构化数据对于.csv,.json文件可以不仅读取原始文本还尝试解析成Python对象并将数据结构信息一并提供给Claude这对数据分析类问题帮助巨大。3. 实现示例安全读取# skills/file_reader.py import os from pathlib import Path import docx import pdfplumber class SecureFileReaderSkill: name “read_file” description “读取指定路径下文本文件或文档的内容。路径必须是允许访问的工作区内的相对或绝对路径。” def __init__(self, allowed_base_paths): self.allowed_base_paths [Path(p).resolve() for p in allowed_base_paths] def _is_path_allowed(self, file_path): requested_path Path(file_path).resolve() for base in self.allowed_base_paths: try: # 检查请求路径是否在任一允许的基路径下 requested_path.relative_to(base) return True except ValueError: continue return False def execute(self, file_path: str) - str: if not self._is_path_allowed(file_path): return f“错误无权访问路径 ‘{file_path}’。请确保文件位于允许的目录内。” if not os.path.exists(file_path): return f“错误文件 ‘{file_path}’ 不存在。” try: ext os.path.splitext(file_path)[1].lower() if ext ‘.txt’ or ext ‘.md’ or ext ‘.py’: with open(file_path, ‘r’, encoding‘utf-8’) as f: return f.read() elif ext ‘.docx’: doc docx.Document(file_path) return ‘\n’.join([para.text for para in doc.paragraphs]) elif ext ‘.pdf’: text “” with pdfplumber.open(file_path) as pdf: for page in pdf.pages: page_text page.extract_text() if page_text: text page_text “\n” return text else: return f“错误暂不支持读取 ‘{ext}’ 格式的文件。” except Exception as e: return f“读取文件 ‘{file_path}’ 时发生错误{str(e)}”这个实现展示了核心的安全检查逻辑和基本的格式支持。在生产环境中还需要考虑文件编码、大文件处理、内存使用等更多问题。4. 部署与集成实战指南4.1 本地开发环境搭建要让claude-skills跑起来你需要准备一个Python环境建议3.8以上和必要的API密钥。第一步获取依赖假设项目提供了requirements.txt安装过程很简单git clone repository-url # 如果项目开源 cd claude-skills pip install -r requirements.txt典型的依赖可能包括anthropic(官方SDK),requests(网络请求),python-dotenv(环境变量管理), 以及各种技能所需的库如pdfplumber,python-docx,openpyxl等。第二步配置密钥项目通常会使用一个.env文件或config.yaml来管理配置。你至少需要Anthropic API Key从Anthropic控制台获取。这是与Claude对话的通行证。搜索API Key如果你使用Serper等服务需要其API密钥。其他技能密钥例如如果包含发送邮件的技能可能需要SMTP配置或邮件服务API密钥。创建一个.env文件在项目根目录ANTHROPIC_API_KEYyour_anthropic_key_here SERPER_API_KEYyour_serper_key_here # 其他配置...并在代码中通过os.getenv()读取。第三步运行与测试根据项目设计启动方式可能是CLI模式运行python app.py或python cli.py进入一个交互式命令行对话。Web服务模式运行python web_app.py启动一个本地服务器如使用FastAPI然后通过浏览器或API客户端如Postman进行交互。启动后尝试问Claude一些需要技能的问题如“今天硅谷有什么科技新闻”或“请总结我~/docs/report.txt文件的主要内容”观察工具调用是否被触发和执行。4.2 与现有工作流的集成claude-skills的核心价值在于被集成而不是作为一个孤立的玩具。以下是几种常见的集成思路1. 作为后台服务集成到自定义应用 这是最强大的方式。你可以将claude-skills的核心逻辑技能管理、Claude客户端封装成一个Python库或一个独立的微服务例如使用FastAPI暴露RESTful接口。然后在你的主应用程序可能是一个Web应用、桌面应用或移动应用中调用这个服务。优势前后端分离技能服务可以独立部署、扩展和升级。前端可以提供更丰富的交互界面。示例构建一个智能文档分析助手。前端上传PDF调用技能服务服务使用文件读取技能获取内容然后让Claude进行分析总结最后将结果返回前端展示。2. 封装成命令行工具CLI 如果你和你的团队频繁使用命令行可以将常用技能组合封装成一条条命令。例如# 假设封装后的命令叫 ai-assistant ai-assistant “搜索关于Rust编程语言2024年发展趋势的文章并列出三个要点。” ai-assistant –file ./meeting_notes.md “提炼这份会议纪要中的行动项和负责人。”这需要编写一个包装脚本将用户输入和参数传递给claude-skills后端并美化输出。3. 与自动化平台如Zapier, n8n, Make结合 虽然这些平台通常直接与ChatGPT或Anthropic的官方API集成但你可以利用claude-skills构建一个更强大的“AI技能节点”。例如在n8n中你可以创建一个自定义节点这个节点内部调用你部署的claude-skills服务。这样就能在自动化流程中插入一个具备文件处理、专业搜索等高级能力的AI步骤。4. 作为IDE插件或编辑器扩展 对于开发者这是黄金场景。可以开发VSCode、JetBrains IDE或Vim/Neovim的插件。插件监听编辑器中的代码或注释通过快捷键或命令调用本地的claude-skills服务。例如选中一段代码问“如何优化这段SQL查询”技能服务会结合代码上下文和网络搜索给出建议。4.3 性能优化与成本控制当技能被频繁调用时性能和成本就成为必须考虑的问题。1. 性能优化技能懒加载不要在启动时加载所有技能而是按需加载。当Claude第一次请求某个技能时再动态导入对应的模块。对话上下文管理Claude API的收费和性能都与输入的Token数包括历史消息强相关。需要实现一个智能的上下文窗口管理。例如只保留最近N轮对话或者当对话历史过长时自动尝试总结之前的对话内容用总结摘要替代原始长历史以节省Token。技能执行异步化对于一些耗时的技能如处理大型文件、调用慢速API应使用异步执行asyncio避免阻塞主对话线程提升响应速度。结果缓存对于内容变化不频繁的查询如“Python的创始人是谁”可以将技能结果缓存一段时间如1小时下次相同查询直接返回缓存结果。2. 成本控制API调用审计与预算为每个技能、甚至每个用户的API调用设置监控和预算。记录每一次Claude API调用和第三方API如搜索调用的消耗。技能使用策略在系统提示词中引导Claude“节俭”地使用技能。例如“在调用网络搜索前请先尝试利用你已有的知识进行回答。如果必须搜索请尽量将多个相关问题合并到一个搜索查询中。”提供免费/低成本替代方案对于文件读取如果用户只是问文件类型或大小可以先用本地的os模块获取信息而不是直接让Claude去读整个文件。对于某些计算能直接用Python内置函数解决的就不要调用需要付费的数学计算API如果存在的话。使用更经济的模型Anthropic提供了不同能力和价格的模型如Claude 3 Haiku, Sonnet, Opus。对于不需要顶级推理能力的简单任务或技能执行后的总结可以考虑使用更便宜的Haiku模型。5. 常见问题排查与进阶技巧5.1 技能调用失败问题诊断在实际使用中你可能会遇到Claude不调用技能、调用错误技能或技能执行出错的情况。下面是一个排查指南问题现象可能原因排查步骤与解决方案Claude完全不调用技能1. 技能描述不够清晰或与用户问题不匹配。2. 系统提示词未正确引导Claude使用工具。3. Claude模型本身对工具调用的倾向性设置如temperature可能过低。1.检查技能描述用自然语言重写描述确保清晰说明了技能的用途、适用场景和输入格式。可以把自己当成Claude看描述是否能让你明白何时该用它。2.强化系统提示词在系统提示词中明确指令如“你必须在回答涉及实时信息的问题时使用搜索技能。”或给出几个调用范例。3.调整参数尝试稍微提高temperature参数如从0.2调到0.5让模型更有“创造力”去尝试调用工具。但注意不要太高以免输出不稳定。Claude调用了错误的技能1. 技能名称或描述相似导致混淆。2. 用户问题存在歧义。1.区分技能描述确保每个技能的name和description具有高度的区分度。避免使用“处理文件”这种模糊描述改用“读取文本文件内容”和“将文本内容写入新文件”等具体描述。2.优化用户输入如果是集成到自己的应用可以在将用户问题发送给Claude前进行简单的预处理或分类添加一些上下文提示。例如如果检测到用户上传了文件可以在问题前加上“关于你刚收到的文件用户问”。技能执行出错如API超时、文件不存在1. 技能内部代码错误或异常处理不完善。2. 外部服务API、数据库不可用。3. 参数格式不正确。1.查看技能日志确保每个技能都有完善的日志记录记录输入参数、开始时间、结束时间和错误信息。2.添加重试与降级对于网络API调用实现指数退避的重试机制。对于关键技能设计降级方案如搜索API挂了能否返回缓存的通用答案。3.参数验证在技能execute函数的最开始严格验证输入参数的类型、范围和格式给出友好的错误提示而不是让Python抛出晦涩的异常。技能调用循环或卡死1. 技能执行结果作为输入又触发Claude调用同一个或另一个技能形成循环。2. 技能执行时间过长导致整个请求超时。1.设置调用深度限制在对话上下文中记录工具调用的次数或深度。当超过一定阈值如5次时强制结束循环并返回提示“为防止无限循环已终止工具调用链。”2.实现超时控制为每个技能的execute方法设置执行超时如30秒。超时后立即中断返回“操作超时”信息。3.优化技能逻辑审查耗时技能的代码看是否有优化空间如分页处理大文件、异步操作。5.2 提升技能调用准确性的提示词工程Claude是否聪明地使用技能很大程度上取决于你如何“教导”它。以下是一些经过验证的提示词技巧1. 提供清晰的工具描述和范例 不要只写“这是一个搜索工具”。要详细说明工具名称web_search 描述当用户的问题需要最新的、实时的、或不在你训练数据截止日期2023年7月之后的信息时请使用此工具。它适用于查询新闻、股票价格、体育赛事比分、最新发布的科技产品信息、当前天气或验证某个具体事实。输入应为一个明确的搜索查询字符串。 示例查询[“OpenAI今天发布了什么新模型” “特斯拉当前股价是多少” “2024年巴黎奥运会开幕式时间”]在系统提示词中提供2-3个不同工具的成功调用范例展示从用户问题 - Claude思考决定调用工具- 工具调用 - 工具结果 - Claude最终回复的完整流程。2. 定义清晰的调用规则和优先级 在系统提示词中建立规则体系强制调用规则“如果用户明确要求‘搜索一下’、‘查查资料’或问题中包含‘最新’、‘今天’、‘当前’等时间关键词你必须使用web_search工具。”禁止调用规则“未经用户明确许可不得使用write_file或delete_file等文件写入/删除工具。”优先级规则“对于数学计算优先使用calculator工具而不是尝试心算或估算。”合并查询规则“如果用户连续问了几个可以一起搜索的问题请尝试将它们合并成一个更全面的搜索查询以减少API调用次数。”3. 引导Claude进行思考链Chain-of-Thought 鼓励Claude在回复中展示其决定是否调用工具、以及调用哪个工具的思考过程。这不仅能提高准确性也方便用户理解和调试。你可以在系统提示词中加入 “在决定是否使用工具前请简要分析用户的需求。如果你决定使用工具请在调用前用一句话说明原因例如‘用户想了解实时新闻我需要使用搜索工具。’”5.3 自定义技能开发进阶当你熟悉了基础技能开发后可以尝试开发更复杂、更强大的自定义技能。1. 技能组合Skill Chaining 一个复杂任务可能需要多个技能协作完成。例如用户问“分析我‘销售数据.xlsx’文件中Q3的趋势并搜索一下同期市场整体情况做对比。” 理想的流程是Claude调用read_file技能读取Excel文件。收到文件内容可能是结构化数据描述后Claude进行分析。然后Claude调用web_search技能搜索“Q3 2024 市场销售趋势”。最后Claude综合两份信息生成回答。 实现这种“链式调用”需要Claude具备较强的多步推理和规划能力。你可以在系统提示词中鼓励Claude进行任务分解并管理好每一步的输入输出上下文。2. 技能与长期记忆结合 让技能不仅能处理当前请求还能记住历史。例如开发一个save_to_memory技能允许Claude将重要的用户信息如“我的项目叫Apex使用Python开发”存储到一个简单的键值数据库或向量数据库中。再配套一个recall_from_memory技能用于在后续对话中查询这些信息。这相当于为Claude赋予了“记住用户是谁”的能力极大提升了对话的连贯性和个性化。3. 集成专业工具或API 这是技能库价值最大化的地方。将你工作流中的专业工具变成Claude的技能。数据库查询开发一个技能接收自然语言查询将其转换为SQL通过另一个小模型或规则执行查询并返回结果。代码仓库操作开发技能让Claude能git clone一个仓库、查看文件列表、读取特定提交的代码。内部系统查询连接公司内部的CRM、ERP系统让Claude能查询客户信息、订单状态务必注意权限和数据安全。 开发这类技能的关键在于输入输出的标准化和错误处理的鲁棒性。你需要将内部API的复杂参数映射为Claude能理解的简单参数并将可能复杂的API响应提炼成Claude能消化的简洁文本。4. 技能的动态配置与热更新 对于一个需要7x24小时运行的服务你不可能每次新增技能都重启服务。可以实现一个技能热加载机制。例如skills/目录下每个技能模块都实现一个版本号或哈希值。技能管理器定时扫描目录如果发现模块文件发生变化或新增就动态重新加载它并更新发送给Claude的工具列表。这需要谨慎处理确保在更新过程中正在进行的对话不受影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2622516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…