智能体技能开发实战:从工具调用到系统架构的完整指南

news2026/5/10 14:46:57
1. 项目概述与核心价值最近在探索智能体Agent开发时我发现了一个宝藏仓库heilcheng/awesome-agent-skills。这不仅仅是一个简单的列表而是一个由社区驱动的、关于智能体“技能”的精选知识库。简单来说它回答了一个核心问题一个真正有用的智能体除了基础的对话到底还能“会”些什么在AI应用开发特别是基于大语言模型LLM构建自主智能体的浪潮中我们常常陷入一个困境模型本身很强大能说会道但让它去实际“做事”时却显得笨拙而低效。比如你希望你的智能体能帮你分析一份财报PDF、自动整理会议纪要并发送邮件、或者监控某个网页的更新并通知你。这些都不是单靠模型“想一想”就能完成的它们需要一系列具体的、可执行的“技能”来支撑。awesome-agent-skills这个项目正是为了解决这个问题而生。它系统地收集、分类和展示了当前社区中各种成熟的、实验性的智能体技能实现为开发者提供了一个现成的“技能工具箱”和灵感源泉。无论你是刚入门智能体开发的新手想了解这个领域到底在玩什么还是资深开发者正在为你下一个项目寻找一个现成的“文件解析”或“网络搜索”模块这个仓库都能提供极大的价值。它节省了你大量在GitHub、论文和博客中搜寻和筛选的时间直接呈现了经过社区初步验证的思路与方案。2. 仓库结构深度解析与使用指南初次打开heilcheng/awesome-agent-skills仓库你可能会被其相对简洁的README和结构所迷惑认为这只是一个链接合集。但恰恰是这种简洁的结构蕴含了高效的信息组织逻辑。理解这个结构是你高效利用这个仓库的第一步。2.1 核心目录与分类逻辑仓库的核心是README.md文件它通常按照技能的功能领域进行分类。一个典型的分类可能包括信息获取与处理类技能这是智能体的“眼睛”和“耳朵”。例如网络搜索如何让智能体安全、有效地使用搜索引擎API如Serper、SearXNG获取实时信息。网页抓取与解析超越简单的搜索如何让智能体读取特定网页内容并提取结构化信息如价格、新闻、产品描述。这里会涉及BeautifulSoup、Playwright等工具的使用技巧。文档处理处理PDF、Word、Excel、PPT、Markdown、TXT等各类文档。重点在于如何从不同格式中无损或高保真地提取文本、表格甚至图像中的文字信息供LLM分析。PyPDF2、pdfplumber、python-docx、pandas等都是常客。工具调用与自动化类技能这是智能体的“手”和“脚”。例如代码执行在沙箱环境中安全地运行Python、JavaScript等代码片段以进行数学计算、数据处理或调用特定库。Docker沙箱、E2B等安全方案是关键。API调用如何让智能体理解API文档OpenAPI Spec并构造正确的HTTP请求来操作外部服务如发送邮件SMTP/SendGrid、管理日历Google Calendar API、操作数据库等。操作系统交互有限度地执行文件操作读、写、移动、运行系统命令等。这部分需要极高的安全考量通常只在受控环境下使用。推理与决策类技能这是智能体的“大脑”进阶能力。例如复杂任务分解将一个模糊的用户指令如“帮我策划一次旅行”分解为“查询目的地天气”、“查找航班”、“预订酒店”、“生成行程单”等一系列可执行子任务。反思与纠错让智能体检查自身或工具执行的结果判断是否合理并在失败时尝试替代方案。例如代码执行报错后能分析错误日志并尝试修复代码。多智能体协作设计多个具有不同技能的智能体让它们通过通信协作完成更复杂的任务。例如一个“研究员”智能体负责搜索资料一个“写手”智能体负责整理成文一个“评审”智能体负责检查质量。专业领域类技能针对特定垂直领域的技能包。例如金融分析连接财经数据API如Yahoo Finance, Alpha Vantage进行基本面分析、技术指标计算。法律咨询辅助法律条文检索、案例摘要生成、合同关键条款提取。学术研究arXiv论文摘要、跨文献引用分析、实验数据图表解读。注意仓库的具体分类可能会随社区贡献而更新。你的首要任务是浏览README顶部的目录快速建立对技能全景图的认知而不是一头扎进某个具体链接。2.2 如何高效“食用”这个仓库面对海量的链接和项目盲目点开每一个是低效的。我建议采用以下步骤明确需求按图索骥先想清楚你当前要解决的智能体能力短板是什么。是缺“数据获取”能力还是缺“自动操作”能力然后直接去对应的分类下寻找。优先考察“星标”与“最近更新”在每个技能条目下通常会列出多个实现项目或库。优先查看GitHub星标Star数高、最近有提交Recent Commit的项目。这通常是社区活跃度和项目成熟度的双重指标。深入代码而非只看描述点击进入一个感兴趣的项目后不要只看README。直接去看它的examples/目录或核心的源代码文件比如一个tool.py或skill.py。看它是如何定义工具接口、如何处理输入输出、如何管理错误的。这才是精华所在。理解原理而非复制粘贴很多技能的实现原理是相通的。例如多个网页抓取技能可能都用了Playwright但封装方式不同。你的目标是理解“为什么用这个库”、“如何解决反爬”、“如何提取内容”的核心逻辑然后将其适配到自己的智能体框架如LangChain、LlamaIndex、AutoGen或自定义框架中。参与贡献反哺社区如果你在使用某个技能时发现了更好的实现方法或者成功地将某个学术论文中的想法工程化了非常鼓励你向这个仓库提交Pull RequestPR。添加链接、完善描述、修正错误都是宝贵的贡献。这能让这个生态持续保持活力。3. 核心技能模块的实战拆解与集成了解了仓库的全貌和使用方法后我们深入到具体技能层面。我会选取几个最具代表性、最常用的技能类别结合仓库中可能收录的优秀项目拆解其实现细节并讨论如何将其集成到你自己的智能体系统中。3.1 信息获取基石安全高效的网页抓取技能几乎所有需要外部信息的智能体都离不开网页抓取。但直接让LLM输出一段抓取代码是危险且低效的。一个成熟的网页抓取技能应该是一个封装好的、安全的工具。实现要点工具选择Playwright或Selenium是首选因为它们能处理现代JavaScript渲染的页面。仓库中可能会推荐adwerx/playwright-stealth这类项目来应对一些简单的反爬措施。输入设计工具应接受两个核心参数url目标网址和instruction提取指令如“获取商品标题和价格”。指令让LLM能更精确地告诉工具要做什么。安全隔离抓取操作应在独立的、有时间限制的进程或容器中运行防止恶意脚本或无限循环对主程序造成影响。内容提取与返回抓取到HTML后不是直接扔给LLM可能超出上下文长度。应先用BeautifulSoup或lxml进行初步清洗和提取或者使用LLM本身进行摘要和结构化例如先用工具获取HTML再调用另一个LLM函数来提取关键信息。错误处理必须处理网络超时、页面不存在、元素未找到等异常并返回结构化的错误信息供智能体进行反思或重试。集成示例伪代码思路# 假设我们使用LangChain框架 from langchain.tools import BaseTool from playwright.sync_api import sync_playwright import bs4 class WebScraperTool(BaseTool): name “web_scraper” description “Useful for fetching and extracting specific information from a live webpage. Input should be a JSON string with ‘url‘ and ‘instruction‘ keys.” def _run(self, input_str: str): import json try: data json.loads(input_str) url data[“url”] instruction data.get(“instruction”, “Extract the main article text.”) except: return “Invalid input format. Please provide JSON with ‘url‘ and ‘instruction‘.” with sync_playwright() as p: browser p.chromium.launch(headlessTrue) page browser.new_page() try: page.goto(url, timeout15000) # 等待可能的内容加载 page.wait_for_load_state(“networkidle”) html page.content() except Exception as e: browser.close() return f“Failed to fetch page: {str(e)}” finally: browser.close() # 初步内容提取 soup bs4.BeautifulSoup(html, ‘html.parser’) # 移除脚本、样式等噪音 for script in soup([“script”, “style”]): script.decompose() text soup.get_text(separator“\n”, stripTrue) # 这里可以加入更复杂的基于instruction的提取逻辑 # 例如如果instruction包含“price”则用正则或特定选择器查找价格 # 为简化这里返回清理后的文本前2000字符 return text[:2000] (“...” if len(text) 2000 else “”) # 将这个工具加入到你的智能体工具列表中 agent_tools.append(WebScraperTool())实操心得对于需要登录的网站或反爬严重的站点单纯的Playwright可能不够。仓库里可能会提到使用代理IP池、模拟用户行为随机滚动、延迟等进阶方案。但在大多数情况下清晰标注你的抓取工具为“用于公开信息获取”并设置合理的请求频率和超时时间是更可持续的做法。3.2 能力扩展核心代码执行与沙箱安全让智能体写代码并执行是其解决复杂计算和数据处理问题的杀手锏。但“执行任意代码”也是最大的安全噩梦。因此代码执行技能的核心在于“沙箱”。实现要点沙箱技术选型Docker容器最彻底的隔离。每个代码执行任务启动一个全新的、无网络、无额外权限的临时容器任务结束后立即销毁。安全性最高但启动开销较大。仓库中可能会引用像E2Be2b.dev这样的专门为AI智能体设计的安全沙箱服务。操作系统级别隔离使用seccomp、namespaces、cgroups等Linux特性创建轻量级沙箱如PySandbox。性能开销小但配置复杂安全性略低于Docker。语言解释器限制对于Python可以使用restrictedpython或自定义__builtins__来禁用危险模块如os,subprocess,sys的部分功能。这是最轻量但也是最容易被绕过的方式仅适用于可信环境。资源限制必须在沙箱内严格限制CPU时间、内存使用量、执行时间和磁盘写入。防止无限循环或内存爆炸攻击。输入输出设计工具应接受code代码字符串和language如“python”参数。输出应包括stdout、stderr、result如果代码最后是一个表达式以及execution_time。预装依赖管理沙箱镜像中应预装智能体常用库如numpy、pandas、matplotlib、requests等。这需要维护一个基础Dockerfile。集成示例基于Docker的思路import docker import uuid import os class CodeExecutionTool(BaseTool): name “code_interpreter” description “A secure Python code interpreter. Input should be a string of valid Python code. It can do math, data analysis, and generate plots.” def __init__(self): self.client docker.from_env() # 预构建一个包含常用科学计算库的镜像 self.image_name “my-agent/python-sandbox:latest” def _run(self, code: str): # 为本次执行创建唯一目录和文件 exec_id uuid.uuid4().hex host_dir f“/tmp/sandbox_{exec_id}” os.makedirs(host_dir, exist_okTrue) code_file os.path.join(host_dir, “user_code.py”) with open(code_file, ‘w’) as f: f.write(code) # 准备容器运行命令限制资源无网络只读文件系统除了/tmp container None try: container self.client.containers.run( imageself.image_name, commandf“timeout 30 python /workspace/user_code.py”, # 限制30秒 volumes{host_dir: {‘bind’: ‘/workspace’, ‘mode’: ‘ro’}}, network_mode“none”, # 禁用网络 mem_limit“100m”, # 限制100MB内存 cpu_period100000, cpu_quota50000, # 限制50% CPU working_dir“/workspace”, detachTrue, stdoutTrue, stderrTrue ) result container.wait(timeout35) # 等待容器结束 stdout container.logs(stdoutTrue, stderrFalse).decode(‘utf-8’) stderr container.logs(stdoutFalse, stderrTrue).decode(‘utf-8’) exit_code result[“StatusCode”] output f“Exit Code: {exit_code}\n” if stdout: output f“Stdout:\n{stdout}\n” if stderr: output f“Stderr:\n{stderr}\n” return output except docker.errors.ContainerError as e: return f“Container error: {str(e)}” except Exception as e: return f“Execution failed: {str(e)}” finally: if container: try: container.remove(forceTrue) except: pass # 清理主机目录 import shutil shutil.rmtree(host_dir, ignore_errorsTrue)注意事项自建Docker沙箱对运维有一定要求。对于大多数个人开发者或初创项目直接使用E2B、Replit的Nixys等成熟的云沙箱API可能是更快捷、更安全的选择。仓库中列出的项目往往会给出这些服务的集成示例。3.3 智能体的“记忆”与“思考”复杂任务分解与反思这是让智能体从“简单工具调用者”升级为“复杂问题解决者”的关键。awesome-agent-skills仓库中会收录像ReAct、Plan-and-Execute、Reflexion等范式的实现。任务分解技能要点范式选择ReAct (Reasoning Acting)让智能体在思考链Chain-of-Thought中穿插工具调用。格式通常是“Thought: ... Action: ... Observation: ...”。这需要LLM有能力生成严格的格式化输出。LangChain的Agent模块内置了对ReAct的支持。Plan-and-Execute先让一个“规划者”LLM制定详细的步骤计划Plan再由一个“执行者”LLM或同一个LLM按步骤调用工具执行。这适合步骤清晰、无需中途大幅调整计划的任务。AutoGen的多智能体协作很适合这种模式。计划表示计划可以是简单的文本列表也可以是更结构化的JSON包含步骤ID、描述、依赖关系、所需工具等。结构化的计划更容易被后续步骤解析。动态调整计划不是一成不变的。当某个步骤执行失败或得到意外结果时智能体应能评估是否需调整后续计划。这需要“反思”技能。反思技能要点触发条件在哪些情况下需要反思常见的有工具执行返回错误码、用户对结果表示不满意、智能体自身对结果置信度低、多步骤任务中前后结果矛盾等。反思内容反思不是简单的“我错了”。它应该分析失败的根本原因是什么是工具选择不当、输入参数有误、还是任务本身描述不清基于分析提出具体的纠正措施比如“改用另一个工具”、“调整查询参数”、“向用户请求澄清”。实现方式通常通过一个独立的“反思”提示词Prompt来实现。在执行完一步或一系列步骤后将历史记录用户指令、已执行步骤、工具输出喂给LLM要求其进行反思并输出建议。集成示例ReAct范式思路你不需要从头实现ReAct利用LangChain可以快速搭建from langchain.agents import initialize_agent, AgentType from langchain.llms import OpenAI # 或任何其他LLM from langchain.memory import ConversationBufferMemory # 假设我们已经有了之前定义的 WebScraperTool 和 CodeExecutionTool tools [WebScraperTool(), CodeExecutionTool()] llm OpenAI(temperature0) # 使用低temperature以获得更确定性的输出 memory ConversationBufferMemory(memory_key“chat_history”) agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用ReAct范式 verboseTrue, # 打印出Thought/Action/Observation过程便于调试 memorymemory, handle_parsing_errorsTrue # 处理LLM输出格式错误 ) # 现在这个agent就具备了在思考中调用工具的能力 result agent.run(“请去维基百科首页看看今天有什么特色文章然后把文章标题里的单词数量算出来告诉我。”) # Agent内部会自行产生类似以下的思考链 # Thought: 我需要先获取维基百科首页的内容。 # Action: 使用 web_scraper 工具url是“https://www.wikipedia.org/”指令是“提取‘特色文章’部分的标题”。 # Observation: (工具返回标题文本比如“The Great Gatsby”) # Thought: 我得到了标题“The Great Gatsby”。现在需要计算这个标题中的单词数量。 # Action: 使用 code_interpreter 工具代码是“title ‘The Great Gatsby’; word_count len(title.split()); print(word_count)”。 # Observation: 3 # Thought: 我算出来单词数量是3。现在可以回答用户了。 # Final Answer: 今天维基百科的特色文章标题包含3个单词。实操心得ReAct范式对LLM的指令跟随和格式输出能力要求很高。如果发现LLM经常不按格式输出导致解析失败可以尝试1使用更强大的模型如GPT-42在提示词中提供更详细的格式示例Few-shot3使用LangChain的OutputFixingParser或RetryOutputParser来自动修复小错误。任务分解的粒度很重要步骤太粗智能体可能不会调用工具步骤太细又会导致效率低下需要在实践中反复调整提示词。4. 从技能到智能体架构设计与工程化实践收集和理解了单个技能后下一步就是将它们组装成一个真正能运行的智能体系统。awesome-agent-skills提供了“砖块”而你需要设计“建筑蓝图”。4.1 智能体系统核心组件设计一个可维护、可扩展的智能体系统通常包含以下层次技能层Skills/Tools Layer即我们从awesome-agent-skills中汲取并封装好的各种工具。每个工具都应具有清晰的接口统一的run或_execute方法。完备的描述name和description必须准确因为LLM主要靠描述来决定使用哪个工具。健壮的错误处理返回可读的错误信息而不是抛出异常导致智能体崩溃。适度的功能一个工具最好只做一件事单一职责原则。例如“搜索网页”和“解析网页内容”可以是两个工具这样更灵活。规划与执行层Orchestration Layer这是智能体的“大脑”。它负责理解用户意图通过提示词工程或微调将自然语言指令转化为内部表示。任务规划与分解采用前述的ReAct、Plan-and-Execute等模式。工具选择与调用根据当前状态和工具描述决定下一步调用哪个工具并生成正确的输入参数。状态管理维护对话历史、中间结果、执行上下文。反思与纠错在关键节点评估进展决定继续、重试还是转向。记忆层Memory Layer智能体不能是“金鱼脑”。记忆分为短期记忆/对话历史保存当前会话的交互记录通常有长度限制。长期记忆/向量数据库将过去的重要交互、学到的知识、用户偏好等编码成向量存入如Chroma、Pinecone、Weaviate等向量数据库供后续检索。这使智能体能够“记住”你之前说过的话。接口层Interface Layer如何与用户交互可以是命令行界面CLI快速测试。Web APIFastAPI/Flask供其他服务调用。聊天界面Gradio/Streamlit提供直观的交互。消息平台集成Slack/Discord/微信机器人在常用场景中部署。4.2 框架选型与集成策略你不必从零开始造轮子。现有的框架可以极大加速开发LangChain/LangGraph生态最丰富文档最全提供了从工具定义、链式调用到智能体编排的全套高阶抽象。适合快速原型开发和大多数应用场景。LangGraph特别适合构建有复杂状态流转的智能体。AutoGen由微软推出专注于多智能体对话。非常擅长模拟多个专家角色程序员、产品经理、测试员通过对话协作解决任务。如果你要构建的是一个协作型系统AutoGen是首选。LlamaIndex最初专注于RAG检索增强生成现在也提供了强大的智能体框架。如果你的智能体核心能力是深入理解和处理私有数据文档、知识库LlamaIndex的数据连接和检索能力是巨大优势。自定义框架如果你有极致的性能要求、独特的控制逻辑或者作为学习项目可以从底层开始基于OpenAI API的函数调用Function Calling或Anthropic的Claude工具使用特性来构建。集成策略建议对于初学者从LangChain开始是最平滑的。你可以轻松地将从awesome-agent-skills学到的技能包装成LangChain Tool然后利用其丰富的AgentType进行组装。随着复杂度提升再考虑引入LangGraph来管理更复杂的工作流。4.3 性能优化与成本控制当你的智能体开始处理真实任务时性能和成本会成为关键问题。提示词优化精简系统提示移除不必要的背景说明保持指令清晰、简洁。使用消息角色正确使用system、user、assistant、tool角色帮助模型理解上下文结构。结构化输出要求LLM以JSON等格式输出减少解析错误有时还能降低token消耗。上下文管理选择性记忆不要将整个对话历史都塞进上下文。总结之前的对话或只保留最近几轮。向量检索对于长期记忆使用向量检索只召回与当前问题最相关的片段而不是全部加载。Token计数与截断实时监控上下文token数在接近模型上限时主动总结或移除最早的信息。工具调用优化并行工具调用如果多个工具之间没有依赖关系可以尝试让LLM规划并行执行然后用代码实现并行调用显著减少总耗时。工具结果缓存对于耗时较长或结果稳定的工具调用如查询某个静态API可以引入缓存机制避免重复执行。模型选择大小模型协同用大模型如GPT-4负责复杂的规划与反思用小模型如GPT-3.5-Turbo或本地模型处理简单的工具调用结果解析和响应生成。这能有效降低成本。本地模型部署对于数据敏感或长期成本考量可以探索部署Llama、Qwen、DeepSeek等开源模型。虽然规划能力可能稍弱但在特定领域微调后结合清晰的提示词和工具设计也能达到不错的效果。5. 常见陷阱、调试技巧与演进方向即使有了awesome-agent-skills的指引和强大的框架在实际开发中你依然会踩坑。下面分享一些我实践中积累的经验。5.1 智能体开发中的典型陷阱工具描述模糊不清这是最常见的问题。如果工具的description写得太笼统如“处理数据”LLM就无法准确判断何时该调用它。描述必须具体包含典型输入输出示例。例如“将一段自然语言描述的时间如‘下周五下午三点’转换为ISO 8601格式的字符串。输入应为纯文本时间描述。”无限循环与幻觉调用智能体可能陷入“思考-调用-失败-再思考”的死循环或者调用一个不存在的工具。必须在代码中设置最大迭代次数如10步并在检测到循环或无效调用时强制终止或要求用户干预。上下文窗口爆炸随着对话和工具调用记录变长上下文token数迅速增长导致成本飙升、速度变慢甚至超出限制。必须实施严格的上下文窗口管理和总结策略。工具执行副作用特别是文件操作、数据库写入、发送邮件等工具如果没有做好权限控制和确认机制智能体可能会在错误的理解下执行危险操作。对于有副作用的工具设计上可以加入“模拟运行”或“二次确认”步骤。对LLM过度依赖试图用LLM理解一切、生成一切。对于有明确规则、结构化强的任务如数据验证、格式转换应优先使用确定性代码实现而不是让LLM去“猜”。5.2 实用调试技巧开启详细日志在开发阶段务必让框架打印出智能体的完整思考过程如LangChain的verboseTrue。这是你理解智能体“脑回路”的唯一途径。构建最小可复现案例当智能体行为异常时不要在大而全的对话中调试。构造一个最简单的、能触发该问题的用户输入进行隔离测试。人工扮演“工具”在工具集成初期可以先将工具函数替换为一个打印输入并返回固定值的“模拟工具”。这可以验证智能体的规划逻辑是否正确而无需担心工具本身的实现错误。使用评估框架对于核心流程可以编写自动化测试。使用像LangSmith这样的平台可以追踪每次运行的链式调用、输入输出和成本方便进行回归测试和性能分析。提示词A/B测试微调系统提示词中的几个字可能对智能体行为产生巨大影响。对关键任务可以设计不同的提示词版本进行对比测试选择效果最好的一个。5.3 技能仓库的演进与智能体的未来heilcheng/awesome-agent-skills本身也是一个活的项目它的价值在于社区的持续贡献。作为使用者你也是潜在的贡献者。当你研发出一个新技能或发现一个更好的实现方式时考虑回馈社区。展望未来智能体技能的发展可能呈现以下趋势技能标准化与互操作性可能出现类似“工具描述标准”如OpenAI的Function Calling规范成为事实标准让不同框架开发的技能能更容易地互相调用。技能的市场与发现可能会出现集中的“技能市场”开发者可以发布、共享、甚至交易高质量的智能体技能用户可以通过自然语言描述来搜索和组合所需技能。自主技能学习与创建最前沿的研究是让智能体能够通过观察人类操作、阅读文档或试错自行学习并创建新的工具技能。这将是实现通用人工智能AGI的关键一步。对于现在的我们而言脚踏实地地利用好awesome-agent-skills这样的资源理解每一个技能背后的原理精心设计自己智能体的架构解决一个个真实世界的问题就是在为那个更智能的未来添砖加瓦。从模仿和集成开始逐步走向创新和创造这正是开源社区和项目如heilcheng/awesome-agent-skills带给开发者的最大礼物。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2558206.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…