news 2026/9/6 4:37:11

AIAgent智能体开发实战:从零搭建到项目封装全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AIAgent智能体开发实战:从零搭建到项目封装全指南

在过去的开发与学习过程中,我一直觉得“AI 应用开发”这件事被很多资料讲复杂了。尤其是 Agent(智能体)这个概念,网上有大量资料,但真正能让人从零开始、不靠碎片化拼凑就能完整跑通一套项目的教程并不算多。本文基于一套完整的 AIAgent 智能体学习路径,整理成一篇系统性的实战教程。内容覆盖核心概念、架构拆解、环境准备、从零搭建一个可用智能体、封装成项目、常见报错与最佳实践。无论你是刚接触 AI 开发的新手,还是有一定后端基础想切入智能体方向的开发者,都可以把本文作为第一份“少走弯路清单”。

1. AIAgent 是什么:先搞懂概念,再谈开发

1.1 从“大模型”到“智能体”

我们先从最基础的场景说起。你大概率已经用过类似 ChatGPT 这类对话产品,你输入一段文字,它给你一段回答。这是“大语言模型”的基础用法:单轮或多轮对话,模型根据上下文生成文本。

但“智能体”和普通的“对话机器人”有一个本质区别:

智能体不只是“会说话”,而是“会做事”。

什么叫“会做事”?

举个例子:你让普通聊天机器人“帮我查一下明天北京到上海的机票”,它可能会告诉你一个通用的查询方法,甚至直接说“我无法实时获取信息”。但一个真正的智能体,会主动调用机票查询接口、读取返回数据、筛选合适航班,然后给你一句话结论。整个过程里,智能体需要自己决定“要调用哪个工具”,而不是每次都由人来指定。

所以在 AIAgent 开发里,核心关键词是:

  • 感知:接收用户意图。
  • 决策:判断接下来该做什么。
  • 调用:选择并执行某个工具或 API。
  • 反馈:把执行结果整理成自然语言,返回给用户。

这也是为什么智能体会被拆成多个模块,而不是一个大模型直接输出。模型的职责是“思考”,工具调用的职责是“行动”,两者结合,才是一个完整 Agent。

1.2 AIAgent 的常见应用场景

从实际工程角度看,AIAgent 并不是只存在于实验室,它已经被广泛用在多个领域:

  • 自动化客服:根据用户问题查询订单、退换货规则、物流信息。
  • 数据分析助手:连接数据库,用户用自然语言提问,Agent 帮你写 SQL、执行查询、把结果转成图表描述。
  • 个人助理:管理日历、发送邮件、抓取网页内容。
  • 代码辅助:根据 Issue 描述,自动读取仓库代码、定位文件、提出修改方案。
  • 企业内部知识库问答:对接公司内部文档和权限系统。

这些场景有一个共同点:如果你只用对话模型,事情做不完;加上工具调用、任务拆解、流程控制之后,才能真正落地。

1.3 你需要掌握哪些前置知识

在开始 AIAgent 开发之前,并不要求你已经是算法工程师,但最好具备以下基础:

  • Python 基础语法:能写函数、类,会处理 dict、list 这类数据结构。
  • HTTP 与 API 基础:知道 GET、POST 是什么,看得懂 JSON 数据。
  • 基本的命令行操作:能在终端里安装依赖、运行脚本。

如果你的基础还不牢固,也可以边学边补。因为实际项目中,AIAgent 开发更侧重于“把现有模型能力、工具能力和代码逻辑串起来”,难度反而在工程整合上,而不是模型训练。

2. AIAgent 的核心架构与工作流程

2.1 一个 Agent 由哪些模块组成

一个典型的智能体系统,通常包含以下部分:

  1. 用户界面层(UI / 交互入口)
  2. Agent 调度核心(决定下一步做什么)
  3. 大语言模型(LLM,负责理解和生成)
  4. 工具层(Tools / API,Agent 可以调用的外部能力)
  5. 记忆与上下文管理(短期记忆、长期记忆)
  6. 外部数据存储(数据库、向量数据库、文件系统)

可以把 Agent 想象成一个“实习生”:

  • 大模型是他的大脑,负责思考。
  • 工具是他能使用的软件系统,比如 Excel、网页、公司内部后台。
  • 记忆是他笔记本,记录用户偏好和之前的操作。
  • 调度核心就是他的工作流,决定先做什么、再做什么。

2.2 Agent 的典型工作流程

一次完整的 Agent 调用流程,大致可以拆成这样:

用户输入问题 ↓ Agent 接收输入,整理上下文 ↓ LLM 思考:判断需要调用哪个工具(或不调用) ↓ 生成结构化指令(例如 JSON 格式的 tool_call) ↓ Agent 执行工具调用,拿到返回结果 ↓ 把工具结果交给 LLM,生成最终回复 ↓ 返回给用户

这里最关键的一步是:“LLM 判断需要调用哪个工具”。它并不是靠预写死的 if-else 决定的,而是模型根据你描述的工具名称、参数说明、当前用户意图进行判断。

所以在 AIAgent 开发中,工具描述(Function Description)写得清不清楚,直接影响 Agent 表现

2.3 单 Agent 与多 Agent 的区别

2026 年前后,Agent 开发逐渐分成了两条路线:

  • 单 Agent 模式:一个 Agent 同时负责对话理解、工具调用、回复生成。适合任务链路清晰的小项目。
  • 多 Agent 模式:多个 Agent 分别负责不同角色,比如一个负责理解用户,一个负责操作数据库,一个负责生成报告。它们之间通过消息队列或特定协议协作。

对于刚接触 AIAgent 的开发者,建议先掌握单 Agent 的开发体系,跑通一个完整项目后,再向多 Agent 协作方向深入。

3. AIAgent 开发环境准备

3.1 语言与框架选型

目前 AIAgent 开发的生态相对集中在 Python 语言上,主要原因有两个:

  • 主流 AI 框架(如 Pydantic AI、LangChain、LlamaIndex 等)对 Python 支持最完善。
  • AI/机器学习相关工具链天然偏向 Python。

如果你的项目里有 Web 前端部分,现在也很流行前后端分离式开发:后端用 Python 起一个 Agent 服务,前端用 Vue 或 React 构建交互界面。这也就是大家常说的“aiagent react”组合方案。

3.2 推荐环境版本

因为 AI 工具链更新非常快,实际开发时一定要锁定自己项目的版本组合。下面给出一套比较常用的示例组合:

  • 操作系统:Windows 10/11、macOS、Linux(Ubuntu 22.04)均可
  • Python:3.10 或 3.11(建议至少 3.10 以上)
  • 包管理工具:pip 或 poetry
  • 大模型接入方式:通过各大模型厂商的开放 API 调用
  • 可选框架:可以用 Pydantic AI 这类轻量框架入门,也可以直接用原生代码实现工具调用逻辑

版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。

3.3 大模型 API 的获取与配置

AI Agent 开发中,模型 API 是最核心的“大脑”。你需要准备一个可调用的大模型服务。无论是国内还是国外的服务商,基本流程都是:

  1. 注册并登录开放平台。
  2. 创建 API Key。
  3. 账户充值或领取免费额度。
  4. 查看对应模型的 API 调用地址和模型名称。

获取到 API Key 之后,建议不要直接硬编码在代码里,而是通过环境变量或配置文件管理。后面的项目示例中,我统一采用环境变量方式加载,方便在不同环境里隔离密钥信息。

export LLM_API_KEY="你的API密钥"

窗口关闭后环境变量会失效。如果想长期生效,可以写入 shell 配置文件(如~/.bashrc~/.zshrc),或者使用 .env 文件管理。

注意:API Key 是你的身份凭证,牵扯到费用和调用权限。不要提交到公开代码仓库,不要把 Key 明文写在前后端代码里。更好的方式是用密钥管理服务或后端环境注入。

3.4 项目结构规划

为了后面实战环节不混乱,建议先建立一个清晰的项目结构。我们可以用一个名为ai_agent_project的目录来放整个项目:

ai_agent_project/ ├── .env # 存放 API Key 等敏感配置 ├── requirements.txt # 项目依赖 ├── agent/ │ ├── __init__.py │ ├── core.py # Agent 核心调度逻辑 │ ├── tools.py # 工具定义 │ └── memory.py # 记忆与上下文管理 ├── app.py # 入口文件 └── test_agent.py # 简单测试脚本

这里面,agent/core.py是重点文件,负责组织整个 Agent 的调度流程。

4. 从零搭建一个可运行的 AIAgent 示例

4.1 明确示例需求

为了把核心原理讲透,我们做一个非常实用的示例:

用户输入城市名称,Agent 自动判断用户意图,调用天气查询工具,返回该城市当前天气情况。

这个例子虽然小,但覆盖了 Agent 开发的核心链路:

  • 用户输入自然语言。
  • 模型判断意图。
  • 模型输出结构化工具调用指令。
  • 程序执行真实的工具函数。
  • 模型结合工具输出生成回复。

4.2 安装依赖

在项目目录下创建虚拟环境并安装依赖:

python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activate pip install openai pydantic python-dotenv httpx

说明一下这些库的用途:

  • openai:用于调用支持 OpenAI 协议的大模型 API。
  • pydantic:用于定义结构化输出,实现工具参数校验。
  • python-dotenv:用于加载 .env 文件。
  • httpx:用于发起外部 HTTP 请求。

4.3 编写工具函数

agent/tools.py中,我们定义一个天气查询工具。为了避免依赖第三方收费 API,这里做成一个模拟工具:传入城市名,返回一份固定格式的天气数据。真实项目中,你只需要把函数内部换成真实 API 调用即可。

# 文件路径:agent/tools.py """ 工具层:这里定义 Agent 可以调用的所有外部能力。 每个工具函数都是普通 Python 函数。 """ def get_weather(city: str) -> str: """ 查询指定城市当前的天气情况。 在实际项目中,这个函数内部可以调用真实天气 API。 这里为了演示,使用模拟数据返回。 Args: city: 城市名称,例如 "北京"。 Returns: 城市天气信息的 JSON 字符串。 """ weather_data = { "北京": {"temperature": 25, "condition": "晴", "wind": "东南风 2 级"}, "上海": {"temperature": 28, "condition": "多云", "wind": "东风 3 级"}, "广州": {"temperature": 30, "condition": "雷阵雨", "wind": "南风 2 级"}, } data = weather_data.get(city) if data is None: return f"未找到 {city} 的天气数据" return f"{city}:{data['temperature']}℃,{data['condition']},{data['wind']}"

这个函数虽然简单,但它代表了 Agent 开发中“工具(Tool)”的最基本形态:一段具体的业务逻辑代码,接收参数,返回结果。

为了让大模型知道这个工具的作用和参数要求,我们还需要给它一份“工具描述”。这里用 JSON 格式描述:

{ "type": "function", "function": { "name": "get_weather", "description": "查询指定城市当前的天气情况", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,例如 北京" } }, "required": ["city"] } } }

在真实的 API 调用中,这份 JSON 会直接传给大模型,模型根据描述决定是否调用、以及如何填写参数。

4.4 编写 Agent 核心调度逻辑

接下来是项目核心文件agent/core.py。这个文件负责:

  1. 加载环境变量。
  2. 构建消息上下文。
  3. 把工具描述传给模型。
  4. 接收模型返回的工具调用指令。
  5. 执行工具并回传结果。
  6. 让模型生成最终回答。

由于不同大模型 API 的 SDK 可能在细节上有差异,下面的示例以常见的 OpenAI 兼容协议为例。实际使用时,请根据你选择的模型服务商调整base_url和模型名。

# 文件路径:agent/core.py import json import os from dotenv import load_dotenv from openai import OpenAI from agent.tools import get_weather # 加载 .env 文件中的环境变量 load_dotenv() # 初始化模型客户端 client = OpenAI( api_key=os.getenv("LLM_API_KEY"), base_url=os.getenv("LLM_BASE_URL", "https://api.openai.com/v1"), ) MODEL_NAME = os.getenv("LLM_MODEL_NAME", "gpt-4o-mini") # 工具描述列表,传给模型 TOOLS = [ { "type": "function", "function": { "name": "get_weather", "description": "查询指定城市当前的天气情况", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,例如 北京" } }, "required": ["city"] } } } ] def run_agent(user_input: str) -> str: """ 运行 Agent 主流程。 Args: user_input: 用户输入的自然语言内容。 Returns: Agent 的最终回复内容。 """ # 1. 构建初始消息 messages = [ { "role": "system", "content": "你是一个智能助手,可以根据用户需求调用工具来回答问题。" }, { "role": "user", "content": user_input } ] # 2. 第一次调用模型,传入工具描述 response = client.chat.completions.create( model=MODEL_NAME, messages=messages, tools=TOOLS, ) # 3. 判断模型是否要求调用工具 message = response.choices[0].message # 如果没有工具调用,直接返回内容 if not message.tool_calls: return message.content # 4. 有工具调用,先把 assistant 消息加入上下文 messages.append(message) # 5. 逐个执行工具调用 for tool_call in message.tool_calls: tool_name = tool_call.function.name tool_args = json.loads(tool_call.function.arguments) # 根据工具名分发执行 if tool_name == "get_weather": tool_result = get_weather(**tool_args) else: tool_result = f"未知工具:{tool_name}" # 6. 把工具执行结果以 tool 角色消息加入上下文 messages.append( { "role": "tool", "tool_call_id": tool_call.id, "content": str(tool_result), } ) # 7. 再次调用模型,让它结合工具结果生成最终回复 second_response = client.chat.completions.create( model=MODEL_NAME, messages=messages, tools=TOOLS, ) return second_response.choices[0].message.content

这个run_agent函数是整个智能体的核心调度代码。简单总结就是:先让模型思考一次,看它要不要工具;要的话执行工具,把结果回传模型,再让模型生成答案

4.5 编写入口文件

入口文件app.py负责接收命令行输入,并把结果打印给用户。

# 文件路径:app.py from agent.core import run_agent def main(): print("AI Agent 示例已启动,输入内容后回车即可。退出请按 q") while True: user_input = input("你:") if user_input.lower() == "q": break reply = run_agent(user_input) print("Agent:", reply) if __name__ == "__main__": main()

4.6 配置环境变量

在项目根目录创建.env文件:

LLM_API_KEY=你的API密钥 LLM_BASE_URL=https://api.openai.com/v1 LLM_MODEL_NAME=gpt-4o-mini

根据你实际使用的模型服务商,修改LLM_BASE_URLLLM_MODEL_NAME

4.7 运行与验证

在项目目录下执行:

python app.py

然后输入:

你:北京今天天气怎么样?

如果一切正常,Agent 会输出类似结果:

Agent:北京今天 25℃,晴,东南风 2 级。

这个过程看起来很简单,但是里面已经发生了两次模型调用和一次真实的工具调用。这正是 AIAgent 工作流程的精髓:模型负责决策“调什么”,代码负责执行“怎么调”

5. 用 FastAPI 把 Agent 封装成服务

命令行脚本能帮我们验证逻辑,但在实际项目中,Agent 往往需要作为一个后端服务运行,对外提供 HTTP 接口,供网页端或移动端调用。

5.1 安装 FastAPI 与 uvicorn

pip install fastapi uvicorn

5.2 创建 Web 服务文件

在项目根目录创建server.py

# 文件路径:server.py from fastapi import FastAPI from pydantic import BaseModel from agent.core import run_agent app = FastAPI(title="AIAgent Demo Service") class ChatRequest(BaseModel): message: str class ChatResponse(BaseModel): reply: str @app.post("/api/chat", response_model=ChatResponse) async def chat(req: ChatRequest): """ 对话接口:接收用户消息,返回 Agent 回复。 """ reply = run_agent(req.message) return ChatResponse(reply=reply) @app.get("/health") async def health(): return {"status": "ok"}

5.3 启动服务

uvicorn server:app --host 0.0.0.0 --port 8000

启动后,打开浏览器访问http://localhost:8000/docs,可以看到 FastAPI 自动生成的接口文档页面。

在 Swagger UI 页面里,你可以直接点击/api/chat接口,用 JSON 格式传入测试数据:

{ "message": "上海今天天气怎么样?" }

返回结果:

{ "reply": "上海今天 28℃,多云,东风 3 级。" }

到此,一个最简单的 Agent 后端服务就跑通了。

6. 前端接入:React 项目如何对接 Agent 接口

很多 AIAgent 项目最终都要有一个可视化对话界面。如果采用前后端分离架构,前端常用 React+Vite 构建,后端就是我们上面写的 FastAPI 服务。

6.1 创建 React 工程

如果你本机有 Node.js 环境,可以使用 Vite 快速创建项目:

npm create vite@latest agent-web -- --template react-ts cd agent-web npm install

如果你不熟悉 React,也可以用最基础的 HTML 页面先做测试,原理是一样的。

6.2 前端调用接口

在 React 组件中,调用后端接口的核心代码非常简单:

// 文件路径:src/App.tsx(核心片段) import { useState } from "react"; function App() { const [message, setMessage] = useState(""); const [reply, setReply] = useState(""); const sendMessage = async () => { const res = await fetch("http://localhost:8000/api/chat", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ message }), }); const data = await res.json(); setReply(data.reply); }; return ( <div style={{ padding: 24 }}> <h1>AI Agent 对话测试</h1> <input value={message} onChange={(e) => setMessage(e.target.value)} placeholder="请输入问题" style={{ width: 300, padding: 8 }} /> <button onClick={sendMessage} style={{ marginLeft: 8 }}> 发送 </button> <p>回复:{reply}</p> </div> ); } export default App;

启动 React 项目:

npm run dev

浏览器访问http://localhost:5173,输入问题即可看到 Agent 回复。

6.3 注意跨域问题

前端地址是localhost:5173,后端地址是localhost:8000,直接访问会遇到跨域问题。解决方式通常有两种:

  1. 在后端 FastAPI 中配置跨域中间件。
  2. 在前端 Vite 配置代理。

推荐在后端配置跨域,代码片段如下:

# server.py 中新增 from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )

这样改动简单,方便本地调试。如果上线生产环境,建议把allow_origins换成具体的域名,而不是使用通配符。

7. AIAgent 开发的常见问题与排查思路

在实际开发智能体的过程中,你会遇到各种奇怪的问题。下面整理几种高频场景和排查思路。

7.1 模型返回空内容或返回“拒绝回答问题”

问题现象常见原因解决思路
模型回答为空系统提示词不当,模型认为无需回答检查 system prompt,明确告知模型可以调用工具完成用户需求
模型一直不调用工具工具描述不够清晰优化工具名称和参数描述,必要时在描述中加入使用示例
模型调用工具后说“无法获取信息”工具执行结果没有成功回传检查 messages 中是否以 tool 角色追加了结果,以及 tool_call_id 是否正确

7.2 工具参数格式错误

模型返回的工具调用参数是 JSON 字符串格式,代码里用json.loads解析。如果模型返回的内容不符合 JSON 格式,就会抛出异常。

解决方法:

  • 给模型更严格的工具参数描述,把每个字段类型说明白。
  • 在解析时增加异常捕获,解析失败时通知模型重新生成。
try: tool_args = json.loads(tool_call.function.arguments) except json.JSONDecodeError: tool_args = {}

7.3 上下文越来越长,导致费用变高、响应变慢

Agent 每执行一次工具调用,都会向 messages 中添加新的消息。如果任务链路长,上下文就会很大。

解决思路:

  • 对历史消息做截断或摘要。
  • 工具执行结果只保留关键信息。
  • 把长期记忆放到外部存储(比如向量数据库),而不是全部塞进上下文。

7.4 API 报错 401 或 429

  • 401:API Key 无效或权限不足。
  • 429:请求频率超限或余额不足。

排查顺序:先确认环境变量是否加载成功,再确认 Key 所属账号是否有权限调用当前模型。

7.5 Agent 明明调用了工具,但返回值不理想

这种情况很常见。原因往往是:

  • 工具返回的数据结构复杂,模型没有理解关键字段。
  • 你没有告诉模型“最终回复时要提炼哪些信息”。

优化方式是在工具返回结果前,先做一次格式化处理,把关键信息压缩成简洁文本再回传给模型。

8. AIAgent 开发的最佳实践与工程建议

8.1 工具设计要“小而专”

不要把一个大功能全塞进一个工具函数里。例如,不要写一个process_all函数,里面又查天气又订机票又发邮件。更好的做法是拆成get_weathersearch_flightsend_email多个独立工具。这样模型更容易判断该调用谁,参数校验也更简单。

8.2 工具描述要写“人话”

写工具描述时,可以想象你在向一个新同事解释这个功能的用途。例如:

  • 错误的描述:这是一个天气函数。
  • 正确的描述:查询指定城市当前实时天气情况,返回内容包括温度、天气状况和风力。当用户询问天气时使用此工具。

模型对描述的理解,直接决定它能否准确选对工具。

8.3 密钥管理必须严格

开发阶段可以借助 .env 文件管理密钥,但一定不要把 .env 文件提交到 Git 仓库。建议在.gitignore中加上.env。生产环境建议使用密钥管理服务或环境变量注入。

8.4 可观测性与日志

智能体项目比普通 Web 项目更难调试,因为你不清楚模型内部为什么这样决策。所以一定要记录:

  • 用户原始输入。
  • 模型每一次返回的完整消息。
  • 工具调用的名称、参数、结果。
  • 模型最终输出。

有了完整日志,才能快速定位是模型问题还是工具问题。

8.5 不要让 Agent 无限循环调用

在某些场景下,Agent 可能出现“不断调用工具”的死循环。必须在代码中加入调用次数限制。

MAX_TOOL_CALLS = 5 tool_call_count = 0 while tool_call_count < MAX_TOOL_CALLS: # 调用模型判断是否还需要工具 ... if not message.tool_calls: break tool_call_count += 1

一旦次数超限,就强制返回当前结果并提示用户稍后再试。

8.6 保存会话状态

用户有可能连续提出多个问题,比如先问“北京天气”,再问“那上海呢”。如果希望 Agent 记住上下文,需要把对话历史持久化到数据库或缓存中。每次请求都带着完整的会话历史。

会话设计上,通常是给每个会话分配一个conversation_id,服务端用这个 ID 存取 messages 列表。

8.7 模型版本不稳定怎么办

不同时期模型服务商可能会升级模型名称,或者下线旧版模型。建议把模型名称配置化,不要硬编码在代码里。这样当模型版本调整时,只需要修改配置文件,不需要重新上线代码。

8.8 从单 Agent 到多 Agent 的演进建议

当你已经能稳定开发单 Agent 后,遇到下面的场景再考虑引入多 Agent 协作:

  • 单个 Agent 的 prompt 太长,互相冲突。
  • 不同任务需要不同的模型策略。
  • 业务流程中,不同环节需要隔离的权限或错误处理。

多 Agent 架构会显著增加开发成本,不是一个需要一上来就用重的方案。

9. 总结与下一步学习路线

本文从 AIAgent 的核心概念出发,讲清楚了 Agent 与大模型对话机器人的本质区别,拆解了一个完整智能体的工作流程,然后带着大家从零写了一个最小的天气查询 Agent,并把它封装成了 FastAPI 服务,还实现了 React 前端对接。

把这篇内容完整跟下来,你应该掌握了以下核心能力:

  • 理解 Agent 的工作原理,知道模型、工具、上下文三者如何配合。
  • 会定义工具函数和工具描述。
  • 能写一个支持工具调用的 Agent 调度核心。
  • 能通过 HTTP 接口对外提供服务。
  • 会排查工具调用和 API 接入中的常见问题。
  • 具备继续深入多 Agent 开发的工程基础。

下一步如果你想继续往深走,可以围绕这几个方向展开:

  • 学习记忆机制,把对话历史接入 Redis 或 PostgreSQL。
  • 引入向量数据库,让 Agent 能检索知识库内容。
  • 学习主流 Agent 框架的高级用法,理解它们的内部封装原理。
  • 研究多 Agent 协作与工作流编排,实现更复杂的自动化任务。
  • 把 Agent 嵌入到实际业务系统中,结合权限控制、审计日志和定时触发机制。

如果未来有机会,我会再写一篇关于多 Agent 协作和知识库检索的进阶实战笔记。你可以把本文收藏起来,作为自己 AIAgent 开发路上的第一份落地参考。

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

台风“白海豚”实测:海上工业视频监控部署与防抖防水全解析

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

作者头像 李华
网站建设 2026/9/6 4:35:00

Harness Engineering:如何构建不会崩溃的AI Agents

大多数人面对失职的代理人会通过改变提示来应对。 然后他们改变了模型 然后他们添加了一个更大的上下文窗口 代理人仍然会忘记决定 它仍然使用错误的工具 它仍然跳过验证 它仍然陷入同样的​​循环 问题并不总是出在智力上。 问题出在它周围的环境上。 那种环境就是束…

作者头像 李华
网站建设 2026/9/6 4:32:45

大1.5匹空调怎么选?超一级能效与省电逻辑全解析

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

作者头像 李华
网站建设 2026/9/6 4:25:53

为什么有的2D横版游戏角色动画要做上下半身拆分?

什么时候拆分成上下半身移动同时可以射击/挥武器 下半身播放走路、奔跑、跳跃&#xff1b;上半身独立做瞄准、开枪、挥刀。不拆分就要做大量组合动画&#xff0c;素材工作量暴增。上半身需要跟随鼠标旋转瞄准 射击类游戏&#xff0c;上身旋转瞄准&#xff0c;腿部只处理行走逻辑…

作者头像 李华
网站建设 2026/9/6 4:25:20

智能编程助手小红帽:从安装配置到项目实战全解析

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

作者头像 李华