基于Gemini CLI Blueprint框架构建AI命令行工具:从原理到实践

news2026/5/12 3:54:08
1. 项目概述与核心价值最近在折腾AI命令行工具发现了一个挺有意思的项目gplasky/gemini-cli-blueprint-extension。乍一看这个名字你可能觉得它就是个给某个AI模型Gemini做的命令行扩展。但如果你深入进去会发现它其实解决了一个非常具体且高频的痛点如何将AI大语言模型LLM的能力以一种标准化、可复用的方式无缝集成到你的命令行工作流中。简单来说这个项目提供了一个“蓝图”Blueprint框架让你可以基于Google的Gemini模型快速创建出功能强大、交互自然的命令行工具。它不是一个孤立的CLI工具而是一个“CLI工具生成器”的扩展套件。想象一下你经常需要处理一些重复性的文本分析、代码审查、日志摘要或者文件内容转换任务每次都要打开网页、复制粘贴、调整提示词非常繁琐。这个项目的目标就是让你把这些任务封装成一个简单的命令行命令比如my-ai-tool analyze-log /var/log/app.log然后直接获得结构化的输出。它的核心价值在于“扩展性”和“工程化”。它不是一个写死的脚本而是提供了一套标准化的接口和生命周期钩子让你可以像搭积木一样组合不同的功能模块输入处理、提示词模板、输出解析、后处理等快速构建出符合自己需求的AI驱动型命令行应用。这对于开发者、运维工程师、数据分析师甚至是内容创作者来说都是一个能显著提升效率的“利器”。接下来我就带你彻底拆解这个项目从设计思路到实操落地分享如何利用它来打造你自己的AI命令行工具箱。2. 项目架构与设计哲学解析2.1 什么是“Blueprint”要理解这个项目首先要明白“Blueprint”在这里的含义。在软件开发中Blueprint通常指一种设计模式或模板用于定义应用程序的结构和组件。在这个上下文中gemini-cli-blueprint-extension为基于Gemini模型的CLI工具定义了一套标准的“施工图”。这套施工图规定了几个关键部分命令定义你的CLI工具叫什么名字有哪些子命令和参数输入处理如何接收用户的输入是文件路径、管道传输的文本还是直接输入的字符串提示词工程如何将用户的输入和上下文构造成发给Gemini API的有效提示Prompt模型交互如何调用Gemini API包括模型选择、参数配置如temperature、top_p等输出解析与后处理如何将Gemini返回的文本解析成结构化的数据如JSON、列表或进行格式化输出生命周期管理在命令执行前、中、后可以插入哪些自定义逻辑如输入验证、缓存、日志记录这个项目的设计哲学是“约定优于配置”和“关注点分离”。它通过预设的目录结构、基类和接口让你只需要关注最核心的业务逻辑——也就是针对你的具体任务设计出最有效的提示词和处理流程而不需要从头去处理命令行参数解析、HTTP客户端、错误处理等繁琐的样板代码。2.2 核心组件拆解基于源码分析一个典型的Blueprint扩展通常包含以下核心组件扩展入口点通常是一个Python的setup.py或pyproject.toml文件声明这是一个CLI蓝图扩展并指定主要的模块入口。命令模块这是核心。里面定义了继承自某个BaseCommand或BlueprintCommand的类。这个类中你会重写诸如configure_parser定义命令行参数、handle核心处理逻辑等方法。提示词模板最佳实践是将提示词从代码中分离出来使用Jinja2或类似的模板引擎。模板文件里定义了如何将用户输入、系统指令、上下文信息拼接成最终的Prompt。例如一个代码审查的模板可能包含占位符{{ code_snippet }}和{{ language }}。配置管理如何管理你的Gemini API密钥、默认模型、超时时间等配置。项目通常会提供一个标准化的配置加载机制支持从环境变量、配置文件、命令行参数等多处读取并自动合并。输出格式化器定义如何将AI返回的Markdown或纯文本转换成适合命令行阅读的格式如高亮语法、表格对齐、颜色区分等或者直接提取关键信息输出为JSON供其他程序使用。这种架构的好处是清晰的可维护性和可测试性。你可以单独测试提示词模板的效果可以Mock模型交互来测试业务逻辑也可以很方便地替换底层模型API虽然这个扩展是针对Gemini的但良好的抽象使得未来适配其他模型成为可能。2.3 与普通AI CLI脚本的本质区别你可能会问我自己写个Python脚本用argparse解析参数然后调用google-generativeai库不也能实现吗确实可以但区别在于“可持续性”和“复用成本”。普通脚本功能单一提示词硬编码在代码里。想增加一个新功能比如从“总结”变成“翻译并总结”可能需要大幅修改代码逻辑或者直接复制一份再改导致代码冗余。Blueprint扩展每个功能都是一个独立的“命令”遵循相同的规范。添加新功能本质上是创建一个新的命令类和一个新的提示词模板。它们可以共享相同的配置、工具函数和基础设施。整个工具集可以像插件一样被管理和分发。这就好比手动组装一台电脑和购买一台品牌机的区别。Blueprint提供的是经过验证的主板、电源和机箱基础设施你只需要根据自己的需求选择并安装CPU、内存和硬盘业务逻辑即可。3. 从零开始构建你的第一个扩展3.1 环境准备与项目初始化假设你已经有了Python环境建议3.8和Gemini API密钥。我们开始动手创建一个名为ai-code-reviewer的扩展它的功能是对指定代码文件进行AI辅助审查。首先你需要安装Blueprint的核心框架假设它通过pip可安装具体包名需根据原项目确定这里以gemini-cli-blueprint为例pip install gemini-cli-blueprint接着使用项目提供的脚手架工具初始化你的扩展项目结构# 假设项目提供了 init 命令 gemini-blueprint init ai-code-reviewer cd ai-code-reviewer这个命令会生成一个标准的目录结构可能如下ai-code-reviewer/ ├── pyproject.toml # 项目声明和依赖 ├── README.md ├── ai_code_reviewer/ │ ├── __init__.py │ ├── commands/ # 存放所有命令模块 │ │ ├── __init__.py │ │ └── review.py # 我们的代码审查命令 │ ├── prompts/ # 存放提示词模板 │ │ └── code_review.j2 │ └── config.py # 配置管理 └── tests/注意原项目gplasky/gemini-cli-blueprint-extension本身可能就是一个具体的扩展实现或者是一个示例。我们的实操是基于其设计理念创建一个全新的、符合其规范的自定义扩展。理解规范比复制代码更重要。3.2 定义命令与参数打开commands/review.py我们来定义核心命令。一个最小的命令类可能长这样import argparse from pathlib import Path from blueprint.commands import BaseCommand from blueprint.utils import load_prompt_template, call_gemini_api class CodeReviewCommand(BaseCommand): AI-powered code review for a given file. name “review” # 子命令名称 def configure_parser(self, parser: argparse.ArgumentParser): # 定义命令行参数 parser.add_argument( “file”, typePath, help“Path to the source code file to review.” ) parser.add_argument( “—language”, “-l”, default“”, help“Programming language (e.g., python, javascript). Auto-detected if not specified.” ) parser.add_argument( “—focus”, “-f”, choices[“bug”, “performance”, “style”, “security”], default“bug”, help“Focus area of the review.” ) def handle(self, args): 核心业务逻辑 # 1. 读取代码文件 try: code_content args.file.read_text() except Exception as e: self.error(f“Failed to read file {args.file}: {e}”) return 1 # 2. 自动检测语言简单示例 language args.language or self._detect_language(args.file.suffix) # 3. 加载并渲染提示词模板 prompt_template load_prompt_template(“prompts/code_review.j2”) prompt prompt_template.render( codecode_content, languagelanguage, focusargs.focus ) # 4. 调用Gemini API self.echo(“ AI is reviewing your code...”, nlFalse) response call_gemini_api( promptprompt, model“gemini-1.5-pro”, # 可从配置读取 temperature0.2 # 低温度输出更确定 ) self.echo(“ Done!”) # 5. 输出结果 self.echo(“\n” “”*50) self.echo(response.text) self.echo(“”*50) return 0 def _detect_language(self, suffix: str) - str: # 简单的后缀映射 mapping {“.py”: “python”, “.js”: “javascript”, “.java”: “java”, “.go”: “go”} return mapping.get(suffix, “unknown”)关键点解析configure_parser方法这是你定义CLI“用户界面”的地方。使用标准的argparseBlueprint框架会自动将其集成到主命令中。handle方法这是命令执行的入口。args包含了所有解析好的参数。self.error和self.echo框架提供的辅助方法用于输出错误信息和普通信息保证了输出风格的一致性。返回码按照Unix惯例成功返回0错误返回非0。3.3 设计高效的提示词模板接下来是灵魂所在——提示词模板prompts/code_review.j2。将提示词分离到模板文件是极其重要的最佳实践方便迭代优化而无需改动代码。你是一个经验丰富的{{ language }}开发专家正在进行严格的代码审查。 请审查以下{{ language }}代码并重点关注{{ focus }}方面的问题。 【代码开始】 {{ code }} 【代码结束】 请按照以下格式输出你的审查报告 1. **总体评价**用一两句话概括代码质量。 2. **潜在问题**列出你发现的所有与{{ focus }}相关的问题。对于每个问题请说明 * **位置**行号或函数名。 * **问题描述**清晰说明是什么问题。 * **严重程度**[低/中/高]。 * **改进建议**提供具体的修改代码或建议。 3. **亮点**可选如果代码有写得好的地方也请指出。 4. **总结与建议**给出1-3条最重要的改进建议。 请确保你的回答专业、简洁且直接。这个模板的结构清晰指令明确并规定了输出格式这非常关键。大语言模型在遵循结构化指令方面表现更好这也有利于我们后续对输出进行解析如果需要的话。{{ focus }}参数让用户可以动态调整审查的侧重点增加了工具的灵活性。3.4 配置管理与API集成配置通常放在config.py或通过环境变量管理。框架应该提供一个统一的方式来加载配置。# config.py import os from typing import Optional from pydantic import BaseSettings class Settings(BaseSettings): gemini_api_key: str os.getenv(“GEMINI_API_KEY”) gemini_model: str “gemini-1.5-pro” request_timeout: int 30 default_temperature: float 0.2 class Config: env_file “.env” settings Settings()在handle方法中调用API时应使用从配置中心获取的参数# 在 commands/review.py 的 handle 方法中 from ..config import settings ... response call_gemini_api( promptprompt, modelsettings.gemini_model, temperaturesettings.default_temperature, api_keysettings.gemini_api_key, timeoutsettings.request_timeout )实操心得永远不要将API密钥硬编码在代码中务必使用环境变量或配置文件。在团队协作中可以将.env.example文件加入版本库而将真实的.env文件加入.gitignore。框架的配置管理机制应该支持这种模式。3.5 安装与运行在开发模式下你可以使用pip install -e .以可编辑模式安装你的扩展。安装后主CLI命令假设叫gemini-ai应该能自动发现你的扩展。# 安装扩展 pip install -e . # 查看帮助你的 review 命令应该出现在列表中 gemini-ai --help gemini-ai review --help # 运行代码审查 export GEMINI_API_KEY“your_api_key_here” gemini-ai review my_script.py —focussecurity至此一个最基本的、可工作的AI代码审查命令行工具就构建完成了。它具备了清晰的参数、可维护的提示词模板和安全的配置管理。4. 高级技巧与工程化实践4.1 实现流式输出与实时交互对于处理长文本或需要长时间思考的任务让用户干等着AI生成完所有内容再输出体验很差。Gemini API支持流式响应streaming我们可以利用这一点实现类似ChatGPT的打字机效果。修改handle方法中的API调用部分def handle(self, args): # ... 前面的代码读取文件、渲染提示词 ... self.echo(“ AI is reviewing your code...\n”) self.echo(“-” * 30) full_response “” # 假设 call_gemini_api 支持 streamTrue 参数并返回一个生成器 for chunk in call_gemini_api(promptprompt, streamTrue, …): # chunk 可能是文本片段 if hasattr(chunk, ‘text’): text_piece chunk.text full_response text_piece self.echo(text_piece, nlFalse) # nlFalse 表示不换行实现打字效果 sys.stdout.flush() # 立即刷新输出缓冲区 self.echo(“\n” “-” * 30) # 将完整响应保存下来或许可以用于后续处理或日志 self._last_response full_response return 0流式输出不仅能提升用户体验在遇到网络波动或处理超长内容时也能让用户更早地看到部分结果心理感受会好很多。4.2 添加缓存层以节省成本与时间AI API调用是按Token收费且有速率限制的。对于重复的、输入相同的查询比如对同一份稳定版本的代码进行审查使用缓存可以极大节省成本和时间。我们可以为命令添加一个简单的本地文件缓存。import hashlib import json from pathlib import Path class CodeReviewCommand(BaseCommand): # … 其他代码不变 … def handle(self, args): # 1. 读取代码 code_content args.file.read_text() language args.language or self._detect_language(args.file.suffix) # 2. 生成缓存键 cache_key_data f“{code_content}|{language}|{args.focus}|v1” # 加入版本号防止提示词更新导致缓存失效 cache_key hashlib.md5(cache_key_data.encode()).hexdigest() cache_file Path(f“.ai_cache/{cache_key}.json”) # 3. 检查缓存 if cache_file.exists(): self.echo(“ Loading from cache...”) with open(cache_file, ‘r’) as f: cached json.load(f) self.echo(cached[‘response’]) return 0 # 4. 未命中缓存正常调用API prompt_template load_prompt_template(“prompts/code_review.j2”) prompt prompt_template.render(codecode_content, languagelanguage, focusargs.focus) self.echo(“ AI is reviewing (live)...) response call_gemini_api(promptprompt, …) # 5. 保存到缓存 cache_file.parent.mkdir(parentsTrue, exist_okTrue) with open(cache_file, ‘w’) as f: json.dump({‘prompt’: prompt, ‘response’: response.text}, f, indent2) self.echo(response.text) return 0注意事项缓存是一把双刃剑。你需要考虑缓存失效策略什么时候该清除缓存可以基于时间TTL、基于代码文件的修改时间或者提供一个—no-cache命令行参数来强制刷新。缓存键的设计必须包含所有影响输出的变量代码内容、语言、审查焦点、甚至提示词模板的版本。像上面例子中加一个“v1”是简单的版本控制方法。缓存位置本地文件缓存简单但不适合团队共享。对于团队环境可以考虑使用Redis或数据库作为共享缓存后端。4.3 结构化输出与管道集成目前我们的输出是纯文本虽然可读但难以被其他命令行工具如grep,jq处理。我们可以增加一个—json选项让工具输出结构化的JSON数据。首先修改提示词模板明确要求AI以JSON格式输出。这需要更精确的提示和可能的后处理。修改后的提示词模板片段... 请以严格的JSON格式输出你的审查报告JSON结构如下 { “overall_evaluation”: “总体评价文字”, “issues”: [ { “location”: “行号或函数名”, “description”: “问题描述”, “severity”: “low/medium/high”, “suggestion”: “改进建议” } ], “highlights”: [“亮点1”, “亮点2”], “summary”: “总结与建议” } 请只输出JSON不要有任何其他解释性文字。然后在handle方法中解析响应并处理JSON输出def handle(self, args): # … 获取 response_text … if args.json: # 尝试从响应文本中提取JSON import json import re # 简单尝试找到第一个 ‘{‘ 和最后一个 ‘}’ 之间的内容 match re.search(r‘\{.*\}’, response_text, re.DOTALL) if match: try: json_output json.loads(match.group()) # 可以进一步清理或验证结构 print(json.dumps(json_output, indent2, ensure_asciiFalse)) return 0 except json.JSONDecodeError: self.error(“Failed to parse AI response as JSON.”) # 降级为输出原始文本 print(json.dumps({“raw_output”: response_text})) return 1 else: # 没有找到JSON封装原始输出 print(json.dumps({“raw_output”: response_text})) return 0 else: # 原始文本输出 self.echo(response_text) return 0这样用户就可以使用gemini-ai review file.py —json | jq ‘.issues[] | select(.severity “high”)’这样的命令来过滤高风险问题了极大地增强了工具的可用性和可集成性。4.4 错误处理与重试机制网络请求和AI服务天生具有不稳定性。健壮的生产级工具必须有完善的错误处理和重试逻辑。from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type import requests # 定义需要重试的异常类型 def is_transient_error(exception): return isinstance(exception, (requests.exceptions.Timeout, requests.exceptions.ConnectionError, # Gemini API可能返回的特定错误码如 429限流 500服务器内部错误 SomeGeminiAPIError)) retry( stopstop_after_attempt(3), # 最多重试3次 waitwait_exponential(multiplier1, min2, max10), # 指数退避等待 retryretry_if_exception_type(is_transient_error) ) def safe_call_gemini_api(prompt, …): # 这里是封装了重试逻辑的API调用函数 response call_gemini_api(prompt, …) # 检查响应中是否包含API错误如超过配额、内容安全拦截等 if response.has_error: raise SpecificGeminiError(response.error_message) return response # 在 handle 方法中使用 safe_call_gemini_api try: response safe_call_gemini_api(promptprompt, …) except SpecificGeminiError as e: self.error(f“Gemini API returned an error: {e}”) if “safety” in str(e).lower(): self.echo(“提示词可能触发了内容安全策略请调整你的输入。”) return 1 except Exception as e: self.error(f“An unexpected error occurred: {e}”) return 1使用tenacity这样的重试库可以优雅地处理临时性故障。同时对不同的错误类型网络超时、API限流、内容安全违规进行区分并给出有针对性的用户提示是专业工具的标志。5. 实战构建一个多功能AI CLI工具集掌握了单个命令的构建方法后我们可以扩展思路创建一个包含多个相关命令的完整工具集。假设我们想做一个面向开发者的“AI助手套件”除了代码审查还包含提交信息生成、日志分析、文档生成等功能。5.1 项目结构规划扩展后的项目结构可能如下dev-ai-suite/ ├── pyproject.toml ├── dev_ai_suite/ │ ├── __init__.py │ ├── commands/ │ │ ├── __init__.py │ │ ├── review.py # 代码审查 │ │ ├── commit.py # 生成Git提交信息 │ │ ├── log.py # 分析日志 │ │ └── doc.py # 生成函数文档 │ ├── prompts/ │ │ ├── code_review.j2 │ │ ├── commit_msg.j2 │ │ ├── log_analysis.j2 │ │ └── generate_doc.j2 │ ├── utils/ # 共享工具函数 │ │ ├── __init__.py │ │ ├── git_helper.py │ │ └── text_processor.py │ └── config.py └── tests/commands/目录下的每个文件都是一个独立的命令。utils/目录存放可复用的逻辑比如git_helper.py可以封装获取Git Diff、Staged文件等操作供commit.py和review.py命令调用。5.2 实现“智能提交信息生成”命令以commit.py为例展示如何利用现有工具函数和更复杂的交互逻辑。# commands/commit.py import subprocess from pathlib import Path from blueprint.commands import BaseCommand from ..utils.git_helper import get_staged_diff, get_repo_root from ..utils.text_processor import truncate_text class CommitMsgCommand(BaseCommand): Generate a conventional commit message based on staged changes. name “commit-msg” def configure_parser(self, parser): parser.add_argument( “—type”, “-t”, choices[“feat”, “fix”, “docs”, “style”, “refactor”, “test”, “chore”], help“Specify commit type. If not provided, AI will infer.” ) parser.add_argument( “—dry-run”, “-d”, action“store_true”, help“Print the generated message without actually committing.” ) def handle(self, args): # 1. 获取Git暂存区的差异 diff_text get_staged_diff() if not diff_text: self.error(“No changes staged for commit. Use ‘git add’ first.”) return 1 # 2. 如果差异太大进行截断并警告用户 if len(diff_text) 8000: # Token数限制的粗略估计 self.echo(“⚠️ Staged diff is large, truncating for AI analysis.”) diff_text truncate_text(diff_text, 8000) # 3. 渲染提示词 prompt_template load_prompt_template(“prompts/commit_msg.j2”) prompt prompt_template.render( diffdiff_text, commit_typeargs.type or ““ # 用户未指定则传空字符串让AI推断 ) # 4. 调用AI response call_gemini_api(promptprompt, temperature0.1) # 低随机性确保信息准确 # 5. 处理输出 generated_msg response.text.strip() if args.dry_run: self.echo(“\nGenerated commit message:\n”) self.echo(generated_msg) self.echo(“\n— End of dry run —”) else: # 实际执行 git commit -m “...” try: subprocess.run([“git”, “commit”, “-m”, generated_msg], checkTrue) self.echo(f“✅ Committed with message: {generated_msg}”) except subprocess.CalledProcessError as e: self.error(f“Git commit failed: {e}”) return 1 return 0对应的提示词模板prompts/commit_msg.j2需要精心设计以生成符合 Conventional Commits 规范的信息。5.3 共享配置与工具函数在config.py中集中管理所有命令的通用配置。在utils/中放置共享函数避免代码重复。# utils/git_helper.py import subprocess def get_staged_diff() - str: 返回暂存区stage的diff内容。 try: result subprocess.run( [“git”, “diff”, “—staged”, “—no-color”], capture_outputTrue, textTrue, checkTrue ) return result.stdout except subprocess.CalledProcessError: return “”通过这种方式各个命令模块可以保持简洁专注于自身的业务逻辑而将通用的、底层的操作委托给共享模块。6. 部署、分发与持续迭代6.1 打包与发布到PyPI当你觉得工具已经比较稳定希望分享给团队或社区时可以将其打包发布。确保你的pyproject.toml配置完整[build-system] requires [“setuptools”, “wheel”] build-backend “setuptools.build_meta” [project] name “dev-ai-suite-gemini” version “0.1.0” authors […] description “A suite of AI-powered developer tools using Gemini.” readme “README.md” requires-python “3.8” dependencies [ “gemini-cli-blueprint0.2.0”, # 声明对蓝图框架的依赖 “google-generativeai”, “tenacity”, “pydantic”, ] classifiers [ “Programming Language :: Python :: 3”, “License :: OSI Approved :: MIT License”, “Operating System :: OS Independent”, ] [project.scripts] # 定义入口点 dev-ai “dev_ai_suite.cli:main” # 假设你在 cli.py 中定义了主函数 [tool.setuptools.packages.find] where [“.”]然后使用build和twine进行打包和上传pip install build twine python -m build twine upload dist/*6.2 编写完善的文档与示例一个优秀的工具离不开清晰的文档。至少需要包含README.md: 项目简介、快速安装、API密钥配置、所有命令的使用示例。命令详解: 每个命令的—help输出应该清晰。可以考虑用argparse的description和epilog参数或者用sphinx等工具生成更详细的文档。示例仓库: 创建一个examples/目录存放典型的使用场景脚本或案例输出让用户能快速上手。6.3 迭代优化收集反馈与指标工具发布后迭代才刚刚开始。收集用户反馈在GitHub Issues或内部渠道鼓励用户报告问题或提出功能建议。加入匿名使用统计可选且需透明可以加入一个非常简单的、可选的统计功能用于收集哪些命令最常用、平均响应时间等必须符合隐私政策并允许用户禁用。这能帮你确定优化优先级。A/B测试提示词对于核心功能如代码审查可以维护两套略有不同的提示词模板通过特性开关或版本号让部分用户试用比较输出结果的质量持续优化你的“提示词工程”。监控与告警如果工具被重度使用需要监控API调用失败率、延迟和成本。可以集成简单的日志上报到监控系统。构建这样一个基于Blueprint的AI CLI扩展不仅仅是一次性的开发任务更是一个建立高效、个性化AI工作流的过程。从解决一个具体问题开始逐步扩展成一个工具集在这个过程中你对AI能力的应用、对工程化最佳实践的理解都会不断加深。最重要的是它最终会成为你日常工作中如臂使指的一部分真正把AI从“玩具”变成提升生产力的“利器”。

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