news 2026/9/7 3:43:30

Agent Skills开发实战:大模型应用中的技能封装与工具调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Agent Skills开发实战:大模型应用中的技能封装与工具调用

现在很多做 AI 应用的人都有同一个感受:大模型调用不复杂,复杂的是把模型真正接进业务、让流程完整跑起来。写 Prompt 只是第一步,后面还有工具调用、上下文管理、步骤编排、结果校验这些工作要做。Agent Skills 就是针对这一整段链路出现的一套能力组织方式,核心思路是把“技能”作为可复用、可组合、可独立开发的最小功能单元,让 Agent 不再停留在单轮问答,而是能像工具库一样按需调用技能完成实际任务。

这篇文章不绕弯子,直接围绕 Agent Skills 做一次从入门到代码实战的完整拆解:先解决它到底是什么、解决了什么问题,再给出一套可以在本地环境复现的最小示例,最后落到批量任务和接口集成等工程化方向。如果你正在做 Agent 应用开发,或者准备把大模型能力接到自己的工具链里,这篇文章刚好覆盖从概念到代码的全过程,建议收藏备查。

1. Agent Skills 核心能力速览

在开始写代码之前,先对 Agent Skills 建立一个整体认识。很多资料把它描述得很抽象,实际看下来,它更像是一套“可编排的技能包规范”:

能力项说明
基本概念Agent Skills 是一组可复用的功能模块,定义了 Agent 如何调用外部工具、如何组织多步骤任务、如何返回结构化结果
核心价值把某一类能力封装成标准模块,用自然语言就能调度,减少重复开发
适合人群正在做 Agent 应用、自动化流程、业务系统集成的开发者
主要功能技能注册、工具调用、任务编排、批量执行、结果解析、异常处理
运行模式本地脚本、命令行、API 服务、工作流引擎均可接入
硬件门槛纯代码验证阶段 CPU 即可运行;接入本地大模型时推荐独立 GPU,但也可以用云端模型接口
是否支持批量任务支持,通过任务队列和批量调度即可实现
是否支持接口 API支持,本地起服务后可通过 HTTP 调用
是否支持 50 系显卡与 Agent Skills 本身无关,取决于底层推理模型是否适配新显卡驱动
开源程度框架与示例代码均已公开,可自行扩展到业务场景

从这张表可以快速得到结论:Agent Skills 不是一个具体的单一模型,也不是某个固定软件,而是一套开发范式加运行框架。真正评估它能不能用在自己的项目里,关键看三件事:第一,能否定义技能并注册;第二,能否通过自然语言或结构化指令调度技能;第三,能否把技能执行结果接入现有业务。

2. 适用场景与使用边界

Agent Skills 适合解决的问题,基本上属于“需要模型完成多个步骤、调用多个工具、输出结构化结果”的场景。

2.1 适合的场景

第一类是信息处理自动化。比如你有一批网页、文档或表格,希望 Agent 自动抓取关键字段、做摘要、整理成固定格式输出。过去需要写很多解析脚本,现在可以先定义一个“网页信息提取”技能,让 Agent 按规则执行。

第二类是工具链编排。比如本地有一堆命令行工具、Python 脚本、数据库查询接口,Agent 可以通过技能模块依次调用它们并汇总结果。这种方式特别适合做自动化运维、测试数据准备和数据清洗。

第三类是内容生产流水线。比如先生成文章大纲,再逐节扩写,再统一格式转成 Markdown。每个步骤都可以封装成一个独立技能,步骤之间通过上下文传递数据。相比一个巨大的 Prompt,技能拆分让每一段逻辑都更容易调试和替换。

2.2 不适合的场景

实时性要求极高的操作不太适合直接放在 Agent Skills 里,因为多步骤编排一定会带来额外延迟,与其交给 Agent 推理,不如直接用普通函数调用。

强状态交互也不适合,比如需要长时间保存用户会话状态的业务系统,Agent Skills 更偏“无状态技能调用”,状态管理需要业务层单独设计。

2.3 使用边界与合规提醒

如果 Agent Skills 接入的是本地文档、企业内部数据或个人隐私信息,必须先确认数据和内容来源已获得合法授权,并且不能把敏感信息随意传给第三方模型接口。

如果涉及人脸、声音、肖像或版权素材,必须在测试阶段就明确授权链,不能拿未授权素材做自动化处理。商用之前,需要用真实业务数据做效果复核,检查输出是否存在信息误读或错误引用。

3. Agent Skills 入门核心概念拆解

看代码之前,先花一点篇幅把基础概念讲清楚。网上讲 Agent 的文章很多,但经常混用几个名词,导致新手越看越乱。

3.1 Agent 与 Agent Skills 的关系

Agent 是运行的实体,它接收任务、维护上下文、决定下一步要调用什么。Agent Skills 则是 Agent 可以使用的“能力包”,当 Agent 收到任务后,会判断哪个技能适合处理,再把它拉起来执行。

可以理解为:Agent 是大脑和调度器,Agent Skills 是它手里的工具箱。箱子里的工具各有分工,Agent 按需选择。

3.2 技能的定义方式

一个技能通常由三部分组成:触发条件、执行逻辑、返回格式。

触发条件定义了在什么任务下启用这个技能,可以是关键词,也可以是结构化指令。执行逻辑是实际完成任务的代码,可能是一个 Python 函数、一个外部 CLI 命令,也可能是一次大模型调用。返回格式是技能结束后的输出结构,统一用 JSON 或 Markdown 返回,方便 Agent 继续处理。

3.3 技能注册与发现

框架启动时会把所有已注册技能的名称、描述、参数 schema 集中管理。Agent 在调度时相当于先看一遍“技能目录”,再决定调用哪个。这一步非常重要,后续做批量任务时,技能描述的质量直接影响调度准确率。

4. Agent Skills 本地开发环境准备

动手之前先准备环境。以下配置不限定具体版本号,以稳定可用为原则。

4.1 Python 环境

建议使用 Python 3.10 及以上版本,原因是一些异步框架和类型注解特性在低版本上支持不完整。

# 查看当前 Python 版本 python --version # 创建独立虚拟环境,避免污染系统环境 python -m venv agent_skills_env # 激活虚拟环境 # Windows agent_skills_env\Scripts\activate # Linux / macOS source agent_skills_env/bin/activate

4.2 安装依赖

Agent Skills 实验环境需要几个基础库:FastAPI 用于提供接口服务,requests 用于发送 HTTP 请求,pydantic 用于参数校验。如果你的技能逻辑里用到了大模型推理,还需要安装对应模型客户端。

pip install fastapi uvicorn requests pydantic

如果后续要接 OpenAI 兼容接口,可以安装 openai 库:

pip install openai

4.3 大模型推理可选方案

Agent Skills 本身不强制绑定某个大模型。你可以用远端模型接口,也可以在本地启动一个支持 OpenAI 兼容协议的推理服务。如果本地有 GPU,可以尝试通过 llama.cpp、Ollama 或 vLLM 启动模型服务,然后把 base_url 指向本地地址。显存占用取决于模型体积和推理参数,没有统一的数值,需要按实际模型版本测试。

5. Agent Skills 代码实战:最小可用示例

下面进入正式开发。这里用一个完整示例来展示 Agent Skills 的创建工作流:定义技能、注册技能、调用技能、返回结构化结果。

5.1 项目结构设计

先建立一套清晰的目录结构,方便后续扩展和批量任务处理:

agent_skills_demo/ ├── main.py ├── skills/ │ ├── __init__.py │ ├── base.py │ ├── text_summary.py │ └── data_query.py ├── inputs/ ├── outputs/ ├── requirements.txt └── config.json

inputs 目录放输入素材,outputs 目录放执行结果,skills 目录集中存放技能实现文件。这种划分在项目变大后特别重要。

5.2 技能基类定义

先定义一个技能基类,统一技能的接口格式。后续每个技能都继承这个基类,保证调度方式一致。

# skills/base.py from abc import ABC, abstractmethod from typing import Any, Dict class Skill(ABC): name: str = "unnamed" description: str = "no description" def __init__(self) -> None: self.context: Dict[str, Any] = {} def set_context(self, context: Dict[str, Any]) -> None: self.context = context @abstractmethod def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: """执行技能逻辑,返回统一格式的结果""" pass

这个基类做的事情很简单:定义技能名称和描述,提供一个带 context 的调用方式。为什么需要 context?因为 Agent 的任务可能是多步骤的,前一个技能的输出可能需要作为后一个技能的输入,context 就是用来传递这些中间状态的。

5.3 文本摘要技能实现

第一个技能实现文本摘要功能。为了不依赖外部模型,这里先用简单统计规则做演示,实际项目中可替换为大模型调用。

# skills/text_summary.py import re from typing import Dict, Any from collections import Counter from .base import Skill class TextSummarySkill(Skill): name = "text_summary" description = "对输入文本进行关键词统计和摘要生成" def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: text = params.get("text", "") if not text: return {"status": "error", "message": "no text input"} sentences = re.split(r"[。!?!?]", text) sentences = [s.strip() for s in sentences if s.strip()] word_counter = Counter(re.findall(r"[\w\u4e00-\u9fa5]+", text)) top_words = word_counter.most_common(5) return { "status": "success", "summary": sentences[0] if sentences else "", "top_keywords": top_words, "total_sentences": len(sentences), "total_chars": len(text) }

这个技能接收一段文本,统计总字符数、句子数、高频关键词,并把第一句作为摘要。虽然比较简单,但足够说明技能的基本结构。

5.4 数据查询技能实现

第二个技能演示数据查询能力。数据源可以用一个简单的 JSON 文件代替数据库,重点是展示 Agent 如何通过技能模块访问外部资源。

# skills/data_query.py import json from typing import Dict, Any from pathlib import Path from .base import Skill class DataQuerySkill(Skill): name = "data_query" description = "从 JSON 数据源中查询记录" def execute(self, params: Dict[str, Any]) -> Dict[str, Any]: query_key = params.get("key", "") data_file = params.get("data_file", "data.json") data_path = Path(data_file) if not data_path.exists(): return {"status": "error", "message": f"data file {data_file} not found"} with open(data_path, "r", encoding="utf-8") as f: data = json.load(f) if query_key in data: return {"status": "success", "result": data[query_key]} return {"status": "not_found", "message": f"key {query_key} not found"}

实际项目中,data_query 技能可以换成数据库查询,比如连接 MySQL 或 PostgreSQL,但接口格式保持一致,业务层不需要跟着改。

5.5 技能注册中心

技能注册中心负责收集所有技能,并在外部调用时按照技能名分发给对应实现。

# skills/__init__.py from .text_summary import TextSummarySkill from .data_query import DataQuerySkill SKILL_REGISTRY = { "text_summary": TextSummarySkill, "data_query": DataQuerySkill, } def get_skill(name: str): skill_cls = SKILL_REGISTRY.get(name) if skill_cls is None: return None return skill_cls()

这个注册表其实可以做得更动态,比如扫描目录自动加载所有继承 Skill 的类,但在一开始先把注册表写明确,能帮助理解整个调度链路。

5.6 Agent 调度核心逻辑

Agent 的调度逻辑在 main.py 中实现。这里做了一个简单的意图路由:如果用户输入包含“总结”或“摘要”,就走 text_summary 技能;如果输入以“query:”开头,就走 data_query 技能。真实项目中这一块会换成大模型做意图识别,但路由思想是一样的。

# main.py import json from skills import get_skill def run_agent(user_input: str, context: dict = None) -> dict: context = context or {} if user_input.startswith("query:"): skill_name = "data_query" query_key = user_input.replace("query:", "").strip() params = {"key": query_key, "data_file": "data.json"} else: skill_name = "text_summary" params = {"text": user_input} skill = get_skill(skill_name) if skill is None: return {"status": "error", "message": f"skill {skill_name} not found"} skill.set_context(context) result = skill.execute(params) result["skill_used"] = skill_name return result if __name__ == "__main__": test_cases = [ "今天天气不错,我们准备下午去公园,然后晚上一起吃饭,最后回家写代码。", "query:user_name" ] for case in test_cases: result = run_agent(case) print(json.dumps(result, ensure_ascii=False, indent=2))

5.7 测试数据准备

创建一个 data.json 文件,供 data_query 技能读取:

{ "user_name": "agent-skills-demo", "version": "0.1.0", "api_status": "ok" }

5.8 运行验证

在项目根目录执行:

python main.py

预期结果中,第一条测试会返回文本统计信息和关键词列表,第二条测试会返回 user_name 对应的值。判断标准是:状态码为 success,且返回的 JSON 中包含技能名称字段。如果技能名对不上,说明注册表或路由逻辑有问题,按报错信息逐行排查即可。

6. Agent Skills 接口 API 与批量任务封装

上面这个命令行示例证明了技能框架可以跑通,但距离实际项目还有两步:一是通过 HTTP 接口对外提供服务,二是支持批量任务,避免一份份手工调用。

6.1 用 FastAPI 封装技能调用接口

直接用 FastAPI 把 run_agent 暴露成 HTTP 接口:

# api_server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel, Field from skills import get_skill import uvicorn app = FastAPI(title="Agent Skills API") class SkillRequest(BaseModel): skill_name: str = Field(..., description="技能名称") params: dict = Field(default_factory=dict, description="技能参数") class SkillResponse(BaseModel): status: str result: dict @app.post("/api/execute", response_model=SkillResponse) def execute_skill(req: SkillRequest): skill = get_skill(req.skill_name) if skill is None: raise HTTPException(status_code=404, detail=f"skill {req.skill_name} not found") try: result = skill.execute(req.params) result["skill_used"] = req.skill_name return SkillResponse(status="success", result=result) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000)

启动服务:

python api_server.py

看到 Uvicorn running on http://127.0.0.1:8000 就表示接口服务已经起来了。注意这里的端口是 8000,如果被占用,可以改成 8001 或 9000。启动后访问http://127.0.0.1:8000/docs即可看到 Swagger 文档。

6.2 用 curl 测试接口

打开新终端执行:

curl -X POST "http://127.0.0.1:8000/api/execute" \ -H "Content-Type: application/json" \ -d '{ "skill_name": "text_summary", "params": { "text": "Agent Skills 是一个很好的技术方向,它可以用来构建自动化流程,也可以用来处理批量数据任务。" } }'

预期返回中应包含 status、result 和 skill_used 字段。如果出现 404,检查技能名称是否与注册表完全一致;如果出现 500,回到 skills 目录检查技能实现是否有报错。

6.3 用 Python 调用接口

import requests url = "http://127.0.0.1:8000/api/execute" payload = { "skill_name": "data_query", "params": { "key": "version", "data_file": "data.json" } } response = requests.post(url, json=payload, timeout=30) print(response.status_code) print(response.json())

只要接口返回正常,后续就能把 Agent Skills 接入你自己的工具链,比如企业微信机器人、定时任务脚本或数据处理管道。

6.4 批量任务调度

批量任务的思路是:维护一个任务列表,循环调用技能接口,把结果写入 outputs 目录,并对失败任务做重试。下面是一个简单的批量处理模板:

# batch_runner.py import json import time from pathlib import Path from skills import get_skill def run_batch(skill_name: str, job_configs: list) -> dict: skill = get_skill(skill_name) if skill is None: return {"status": "error", "message": f"skill {skill_name} not found"} results = [] for idx, config in enumerate(job_configs): try: result = skill.execute(config) result["job_index"] = idx result["status"] = "success" except Exception as e: result = { "job_index": idx, "status": "failed", "error": str(e) } results.append(result) time.sleep(0.5) # 避免请求过快 return {"status": "done", "total": len(results), "results": results} if __name__ == "__main__": tasks = [ {"text": "第一条测试文本,用于验证技能是否正常工作。"}, {"text": "第二条测试文本,加上更多内容,观察关键词统计是否稳定。"}, {"text": "第三条测试文本,测试批量模式下的输出目录管理和结果记录。"} ] result = run_batch("text_summary", tasks) output_path = Path("outputs") output_path.mkdir(exist_ok=True) with open(output_path / "batch_result.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2) print(f"batch done, total: {result['total']}")

批量任务在执行过程中建议把每次任务的输入、输出、执行时间都记录下来。如果一个任务卡住,就需要检查是数据问题、技能逻辑问题,还是底层模型接口超时。框架层可以加超时控制,比如单任务超过 60 秒视为失败并记录原因。

7. Agent Skills 与 LLM 集成的进阶设计

如果只做规则匹配,还不完全算 Agent。真正的 Agent 应该能根据用户意图自动选择技能,而不是靠 if-else 路由。这一步通常由大模型完成。

7.1 用大模型做技能选择

思路是:把技能注册表里的名称和描述拼接成一段文本,作为 system prompt 的一部分,让模型输出用户最匹配的技能名称,然后代码再调用对应技能。

from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:8001/v1", # 本地模型服务地址,按实际环境替换 api_key="local-model-key" ) def select_skill_with_llm(user_input: str, skills_meta: str) -> str: prompt = f"""你是技能调度器。根据用户输入选择最合适的技能。 可用技能: {skills_meta} 只输出技能名称,不要输出任何其他内容。""" response = client.chat.completions.create( model="local-model", messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": user_input} ], temperature=0.1 ) return response.choices[0].message.content.strip()

前面注册技能时预设的 name 和 description 字段,在这一步就派上用场了。技能描述写得越具体,模型的选择准确率越高。

7.2 多技能组合执行

复杂任务往往不是单个技能能完成的,而是需要多个技能按顺序执行。可以设计一个 pipeline 机制:先把用户任务解析成技能序列,再把前一个技能输出写入 context,供下一个技能使用。

def run_pipeline(user_input: str, pipeline: list) -> dict: context = {"original_input": user_input} for step in pipeline: skill = get_skill(step["skill_name"]) if skill is None: return {"status": "error", "message": f"skill {step['skill_name']} not found"} skill.set_context(context) params = step.get("params", {}) result = skill.execute(params) context[step.get("output_key", "last_result")] = result return {"status": "success", "context": context}

这种组合方式非常实用。比如先调用 text_summary 技能提取摘要,再把摘要作为输入传给另一个技能做关键词提取,最后统一格式输出。整个链路拆分后,任何一段出现质量问题都能单独定位。

7.3 上下文管理注意事项

多技能组合时最容易出问题的是上下文数据格式不统一。建议在项目里约定一个统一的数据结构,所有技能都返回同样的字段格式,比如 status、result、meta。这样 pipeline 在传递数据时不需要处理各种特殊结构。

8. Agent Skills 资源占用与性能观察

Agent Skills 本身的资源占用非常低,因为技能只是一层调用和编排逻辑。实际压力来自底层模型服务和批量任务规模。

8.1 观察指标

建议重点观察三个指标:接口响应时间、单任务执行时间、任务失败率。接口响应时间可以通过 curl 的 time_total 观察,也可以直接在日志里记录。

curl -X POST -o /dev/null -s -w "time_total: %{time_total}s\n" \ "http://127.0.0.1:8000/api/execute" \ -H "Content-Type: application/json" \ -d '{"skill_name": "text_summary", "params": {"text": "test text"}}'

响应时间变长,优先排查两个方向:一是本地大模型服务是否达到吞吐上限,二是是否有任务在等待某个外部接口超时。

8.2 显存与内存

Agent Skills 中间层代码占用的内存通常在几百 MB 以内。显存占用完全取决于底层推理模型,如果接的是云端大模型接口,本地不看显存;如果接的是本地 7B 或 13B 模型,显存占用与模型参数量、上下文长度、并发数直接相关,数值变化范围较大,实际占用以本机测试为准。初学者建议先用远程接口跑通流程,再决定是否要上本地模型。

8.3 降低资源占用的方法

控制并发数是最直接的办法。在批量任务中加入信号量,限制同时执行的任务数:

import asyncio semaphore = asyncio.Semaphore(2) async def limited_task(task): async with semaphore: # 执行技能任务 pass

减小上下文长度也能明显降低模型显存和内存占用。在做长文档处理时,可以先做分段提取,再汇总结果,不要一次性把整个文档塞进模型。

9. Agent Skills 常见问题与排查方法

开发过程中一定会遇到问题。这里整理一份排错清单,按高频优先排列:

问题现象可能原因排查方式解决方案
技能名称找不到注册表未包含技能类检查 skills/init.py 中的注册项在注册表中补充技能类
接口返回 404请求路径或技能名写错查看 FastAPI 日志和 Swagger 文档对比注册表名称大小写
接口返回 500技能内部异常查看终端堆栈信息在 execute 方法中加 try/except,输出详细错误
批量任务部分失败单条数据格式不合法打印失败任务的输入参数在批量循环中捕获异常并记录任务索引
大模型调度不准确技能描述不清晰检查技能描述文本在描述中增加触发条件和典型输入示例
端口被占用上一次服务未正常退出检查端口占用换端口或结束占用进程
依赖安装失败网络源不稳定更换镜像源用国内 pip 镜像重装
结果输出格式不稳定大模型自由生成导致检查 prompt 输出约束用 format 参数或结构化输出限制格式

如果批量任务在执行中途卡住,不要直接杀掉进程。先把已完成任务的结果落盘,再针对卡住的任务单独复现。落盘检查是排查批量任务最有效的方法。

10. Agent Skills 最佳实践与工程化建议

结合开发经验,给出几条可以直接落地的建议。

10.1 先小规模验证再上批量任务

第一次测试 Agent Skills 时,不要一次性丢 1000 条任务进去。先用 3 到 5 条数据验证技能逻辑是否正确,确认输出格式符合预期后,再扩大到完整数据集。这个顺序能明显减少排查时间。

10.2 技能元信息按标准格式维护

给技能添加 name、description、input_params、output_format 四个基础字段。name 必须唯一,description 要说明技能能做什么、适合什么输入、不适合什么场景。这一步会直接影响后续大模型调度的准确性。

10.3 输入、输出、日志分目录管理

项目结构保持清晰:

inputs/ # 原始输入素材,只读 outputs/ # 任务结果,按时间戳或批次分目录 logs/ # 运行日志 models/ # 本地模型文件,按需加载

这样做的价值在于:批量任务失败时能快速定位,历史输出便于复核,模型文件与业务代码解耦。

10.4 批量任务必须加日志和失败重试

任何批量任务都需要考虑部分失败的情况。建议记录每个任务输入、输出、耗时、失败原因,并在失败时做指数退避重试。重试次数一般不建议超过 3 次,超过后标记为失败,等待人工检查。

10.5 接口服务要限制访问范围

本地 API 服务默认监听 127.0.0.1 时,只有本机能访问。如果部署在服务器上,务必用防火墙、访问密钥或内网策略限制可访问的 IP 范围,避免未授权调用造成资源浪费。

10.6 隐私、版权与授权检查

需要重点强调:使用 Agent Skills 处理文本、图片、音频或视频时,必须确认数据来源合法,且不侵犯第三方版权。对于涉及人脸、声音、肖像的内容,需要取得明确授权。输出结果在对外发布或商用前,需要人工复核,防止自动生成内容包含错误或不当信息。如果调用的是远程大模型接口,也不能把敏感数据直接发送到不受信任的平台。

11. 总结与下一步

这次从零开始把 Agent Skills 的思路完整过了一遍:核心概念、技能定义、注册中心、Agent 调度、HTTP 接口、批量任务,最后还补充了大模型自动选技能和 pipeline 组合执行的方式。

看完之后最容易上手的路径是:先复现第 5 节的最小示例,跑通命令行;再启动 FastAPI 服务,用接口调用一次;最后设计 3 到 5 个技能,用批量任务测试整体流程。这个顺序能验证你对 Agent Skills 的理解是否完整。

容易踩的坑主要集中在两处:技能注册表漏维护,导致 404;上下文格式不统一,导致 pipeline 传参出错。只要把这两个点处理好,基本可以顺畅完成大部分实验。

后续可以考虑三个方向:第一,把 Agent Skills 接到具体业务系统,比如工单自动处理、报告生成、数据清洗;第二,用本地大模型替换规则路由,实现真正的意图驱动技能调用;第三,把技能模块容器化,通过 Docker 部署到服务器,做成内部共享的 Agent 能力平台。

Agent Skills 的核心思路并不复杂,复杂的是如何在业务中把技能拆得清晰、组合得灵活。这篇内容可以作为起点,后面实际开发中遇到的问题,再针对性地逐步优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 3:43:15

微机原理与接口技术核心总结:从8086寻址到中断与接口芯片

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 3:42:00

Codex桌面版打不开?Windows环境手动排查修复指南

如果你的 Codex 桌面版双击之后完全没反应,或者好不容易弹出个窗口又秒退,这篇文章应该是你目前最需要的东西。我前前后后在 Windows 上修过很多次 Codex 桌面版,网上各种“一键修复脚本”也试过不少,最后发现一个扎心的事实&…

作者头像 李华
网站建设 2026/9/7 3:41:21

WebGPU + MobileNet:浏览器端实现以图搜图特征提取

我最早接触到“以图搜图”这个需求,是帮一个摄影社区做图库管理。当时第一反应是上服务端跑特征提取,模型用 MobileNet,最后一层截掉,拿 1024 维向量做余弦相似度。方案本身不复杂,真正让我头疼的是服务端的资源成本、…

作者头像 李华
网站建设 2026/9/7 3:40:35

整活短视频批量处理流水线:抽帧、OCR、TTS与FFmpeg合成实战

这次我们来看一个很容易被当成“纯梗标题”的需求:鲨鱼大招炸空气之后破防误吃麦的章鱼老头。先别纠结标题里的“星导晶”,那更像一个自用标签;真正有价值的是这串文字背后的处理需求。如果把这句话交给内容处理工具,它其实是一条…

作者头像 李华