aiac

GitHub
3.8k 295 简单 1 次阅读 4天前Apache-2.0开发框架图像Agent语言模型
AI 解读 由 AI 自动生成,仅供参考

aiac 是一款基于大语言模型(LLM)的智能基础设施即代码(IaC)生成器。它旨在解决开发者在编写云资源模板、配置文件及运维脚本时耗时费力且易出错的痛点,通过自然语言指令自动产出高质量代码。

无论是需要快速构建 AWS EC2 的 Terraform 模块、生成安全的 Nginx Dockerfile,还是编写复杂的 CI/CD 流水线与数据库查询语句,用户只需输入如“为高可用 EKS 生成 Terraform 代码”之类的提示词,aiac 即可调用 OpenAI、Amazon Bedrock 或本地 Ollama 等模型,瞬间生成并输出对应的代码文件。

这款工具特别适合云原生工程师、DevOps 专家及后端开发人员使用,能显著降低重复性编码工作的门槛,提升基础设施搭建效率。其独特亮点在于支持灵活配置多种 LLM 后端,既兼容云端强大模型,也支持本地私有化部署,兼顾了生成的智能性与数据的安全性。作为命令行工具与开发库的双重形态,aiac 能无缝融入现有的自动化工作流,让基础设施管理变得更加敏捷直观。

使用场景

某初创公司的 DevOps 工程师需要在周五下班前紧急搭建一套高可用的 AWS EKS 集群,并配置相应的 CI/CD 流水线以支持下周的产品发布。

没有 aiac 时

  • 文档检索耗时:工程师需在 Terraform 官方文档、AWS 指南和 GitHub 示例间反复切换,花费数小时拼凑基础架构代码。
  • 配置易出错:手动编写复杂的 Kubernetes Manifest 和安全组策略时,极易因缩进错误或参数遗漏导致部署失败。
  • 脚本开发缓慢:为验证环境编写的网络扫描 Python 脚本和清理会话的 Bash 脚本需从零开始编码,占用大量核心工作时间。
  • 标准化难统一:不同成员编写的 IaC 模板风格各异,缺乏统一的代码规范,增加了后续维护和技术审查的难度。
  • 响应突发需求慢:面对临时增加的监控查询或策略变更(如 OPA 策略),无法快速生成可用代码,拖慢整体交付节奏。

使用 aiac 后

  • 一键生成模板:只需输入"aiac terraform for a highly available eks",几秒钟即可获得完整且经过优化的基础设施代码。
  • 自动修正语法:aiac 直接生成格式正确的 Dockerfile 和 K8s 配置文件,消除了手动编码带来的低级语法错误。
  • 即时获取工具脚本:通过"aiac python code that scans all open ports"等指令,瞬间得到可执行的工具脚本,无需手动编写。
  • 代码风格统一:无论生成何种语言或框架的代码,aiac 均输出符合最佳实践的标准格式,确保团队代码库的一致性。
  • 敏捷应对变更:面对新的查询需求或策略调整,利用 aiac 的查询构建器功能即刻生成 SQL 或 OPA 策略,大幅缩短响应时间。

aiac 将原本需要数天的基础设施编码工作压缩至分钟级,让工程师从繁琐的样板代码中解放出来,专注于架构优化与业务创新。

运行环境要求

操作系统
  • Linux
  • macOS
GPU

未说明

内存

未说明

依赖
notes该工具是基于 Go 语言开发的命令行工具和库,并非本地运行的 AI 模型,因此无需 GPU 或特定显存。它通过 API 调用外部大模型服务(如 OpenAI、Amazon Bedrock)或本地 Ollama 服务来生成代码。安装方式支持 Homebrew、Docker、Go install 或源码编译。使用前需配置 TOML 文件以设置后端服务的 API Key 或连接地址。
python未说明
Go (用于编译/安装)
Docker (可选)
aiac hero image

快速开始

AIAC AIAC

人工智能 基础设施即代码 生成器。

demo

描述

aiac 是一个库和命令行工具,用于通过 LLM 提供商(如 OpenAIAmazon BedrockOllama)生成 IaC(基础设施即代码) 模板、配置、实用工具、查询等。

CLI 允许您请求模型为不同场景生成模板(例如,“为 AWS EC2 获取 Terraform”)。它会向所选提供商组成适当的请求,并将生成的代码存储到文件中,和/或打印到标准输出。

用户可以使用简单的配置文件定义多个“后端”,以针对不同的 LLM 提供商和环境。

用例与示例提示

生成 IaC

  • aiac terraform for a highly available eks
  • aiac pulumi golang for an s3 with sns notification
  • aiac cloudformation for a neptundb

生成配置文件

  • aiac dockerfile for a secured nginx
  • aiac k8s manifest for a mongodb deployment

生成 CI/CD 流水线

  • aiac jenkins pipeline for building nodejs
  • aiac github action that plans and applies terraform and sends a slack notification

生成策略即代码

  • aiac opa policy that enforces readiness probe at k8s deployments

生成实用工具

  • aiac python code that scans all open ports in my network
  • aiac bash script that kills all active terminal sessions

命令行构建器

  • aiac kubectl that gets ExternalIPs of all nodes
  • aiac awscli that lists instances with public IP address and Name

查询构建器

  • aiac mongo query that aggregates all documents by created date
  • aiac elastic query that applies a condition on a value greater than some value in aggregation
  • aiac sql query that counts the appearances of each row in one table in another table based on an id column

使用说明

在安装/运行 aiac 之前,您可能需要配置您的 LLM 提供商或收集一些信息。

对于 OpenAI,您需要一个 API 密钥才能使 aiac 正常工作。有关更多信息,请参阅 OpenAI 的定价模型。如果您未使用 OpenAI 托管的 API(例如,您可能正在使用 Azure OpenAI),则还需要提供 API URL 端点。

对于 Amazon Bedrock,您需要一个启用了 Bedrock 的 AWS 账户,并且能够访问相关模型。有关更多信息,请参阅 Bedrock 文档

对于 Ollama,您只需要本地 Ollama API 服务器的 URL,包括 /api 路径前缀。默认值为 http://localhost:11434/api。Ollama 不提供身份验证机制,但在使用代理服务器的情况下可能会有身份验证机制。目前 aiac 尚不支持此场景。

安装

通过 brew

brew tap gofireflyio/aiac https://github.com/gofireflyio/aiac
brew install aiac

使用 docker

docker pull ghcr.io/gofireflyio/aiac

使用 go install

go install github.com/gofireflyio/aiac/v5@latest

或者,您可以克隆仓库并从源代码构建:

git clone https://github.com/gofireflyio/aiac.git
go build

aiac 也已在 Arch Linux 用户仓库 (AUR) 中提供,分别为 aiac(从源代码编译)和 aiac-bin(下载已编译的可执行文件)。

配置

aiac 通过 TOML 配置文件进行配置。除非特别指定路径,否则 aiac 会在用户的 XDG_CONFIG_HOME 目录中查找配置文件,具体路径为 ${XDG_CONFIG_HOME}/aiac/aiac.toml。在类 Unix 操作系统上,默认路径为 ~/.config/aiac/aiac.toml。如果您想使用其他路径,请使用 --config-c 标志指定文件路径。

配置文件定义了一个或多个命名后端。每个后端都有一个类型,用于标识 LLM 提供商(例如,“openai”、“bedrock”、“ollama”),以及与该提供商相关的各种设置。可以配置同一 LLM 提供商的多个后端,例如用于“staging”和“production”环境。

以下是一个示例配置文件:

default_backend = "official_openai"   # 当未选择后端时的默认后端

[backends.official_openai]
type = "openai"
api_key = "API KEY"
# Or

# api_key = "$OPENAI_API_KEY"
default_model = "gpt-4o"              # 此后端默认使用的模型

[backends.azure_openai]
type = "openai"
url = "https://tenant.openai.azure.com/openai/deployments/test"
api_key = "API KEY"
api_version = "2023-05-15"            # 可选
auth_header = "api-key"               # 默认为 "Authorization"
extra_headers = { X-Header-1 = "one", X-Header-2 = "two" }

[backends.aws_staging]
type = "bedrock"
aws_profile = "staging"
aws_region = "eu-west-2"

[backends.aws_prod]
type = "bedrock"
aws_profile = "production"
aws_region = "us-east-1"
default_model = "amazon.titan-text-express-v1"

[backends.localhost]
type = "ollama"
url = "http://localhost:11434/api"     # 这是默认值

注意事项:

  1. 每个后端都可以设置一个默认模型(通过配置键 default_model)。如果未提供,默认情况下,未指定模型的调用将会失败。
  2. 类型为 "openai" 的后端可以通过设置 auth_header 来更改用于授权的头部字段。默认为 "Authorization",但 Azure OpenAI 使用的是 "api-key"。当头部字段为 "Authorization" 或 "Proxy-Authorization" 时,请求中的值会是 "Bearer API_KEY";如果是其他值,则直接使用 "API_KEY"。
  3. 类型为 "openai" 和 "ollama" 的后端支持通过 extra_headers 设置向 aiac 发出的每个请求添加额外的头部信息。

使用方法

创建配置文件后,您就可以开始生成代码了,只需引用后端名称即可。您可以从命令行使用 aiac,也可以将其作为 Go 库来使用。

命令行

列出模型

在开始生成代码之前,您可以列出某个后端中所有可用的模型:

aiac -b aws_prod --list-models

这将返回所有可用模型的列表。请注意,根据 LLM 提供商的不同,此列表可能包含对该特定账户不可访问或未启用的模型。

生成代码

默认情况下,aiac 会将提取出的代码打印到标准输出,并打开一个交互式 shell,允许与模型对话、重试请求、将输出保存到文件、复制代码到剪贴板等操作:

aiac terraform for AWS EC2

这将使用配置文件中的默认后端以及该后端的默认模型(前提是已定义)。若要使用特定后端,请提供 --backend-b 标志:

aiac -b aws_prod terraform for AWS EC2

若要使用特定模型,请提供 --model-m 标志:

aiac -m gpt-4-turbo terraform for AWS EC2

您可以让 aiac 将生成的代码保存到指定文件中:

aiac terraform for eks --output-file=eks.tf

您还可以使用标志将完整的 Markdown 输出一并保存:

aiac terraform for eks --output-file=eks.tf --readme-file=eks.md

如果您希望 aiac 打印完整的 Markdown 输出而不是提取出的代码到标准输出,可以使用 -f--full 标志:

aiac terraform for eks -f

您也可以在非交互模式下使用 aiac,仅将生成的代码打印到标准输出,并可选择使用上述标志将其保存到文件,只需提供 -q--quiet 标志:

aiac terraform for eks -q

在静默模式下,您还可以通过提供 --clipboard 标志将生成的代码发送到剪贴板:

aiac terraform for eks -q --clipboard

请注意,在这种情况下,aiac 不会退出,直到剪贴板的内容发生变化。这是由于剪贴板的工作机制所致。

通过 Docker

所有相同的指令都适用,只是您需要运行一个 Docker 镜像:

docker run \
    -it \
    -v ~/.config/aiac/aiac.toml:~/.config/aiac/aiac.toml \
    ghcr.io/gofireflyio/aiac terraform for ec2

作为库

您也可以将 aiac 作为 Go 库来使用:

package main

import (
    "context"
    "log"
    "os"

    "github.com/gofireflyio/aiac/v5/libaiac"
)

func main() {
    aiac, err := libaiac.New() // 将加载默认配置路径。
                               // 您也可以指定路径:libaiac.New("/path/to/aiac.toml")
    if err != nil {
        log.Fatalf("创建 aiac 对象失败: %s", err)
    }

    ctx := context.TODO()

    models, err := aiac.ListModels(ctx, "后端名称")
    if err != nil {
        log.Fatalf("列出模型失败: %s", err)
    }

    chat, err := aiac.Chat(ctx, "后端名称", "模型名称")
    if err != nil {
        log.Fatalf("启动聊天失败: %s", err)
    }

    res, err := chat.Send(ctx, "为 eks 生成 Terraform 配置")
    res, err = chat.Send(ctx, "区域必须是 eu-central-1")
}

从 v4 升级到 v5

版本 5.0.0 根据社区反馈,对命令行和库形式的 aiac API 进行了重大更改。

配置的变化

在 v5 之前,没有配置文件或命名后端的概念。用户必须通过命令行参数或环境变量提供与特定 LLM 提供商通信所需的所有信息,而库则允许创建只能与一个 LLM 提供商对话的“客户端”对象。

现在,后端仅通过配置文件进行配置。有关说明,请参阅配置部分。诸如 --api-key--aws-profile 等特定于提供商的标志(以及相应的环境变量,如果有的话)已不再被接受。

自 v5 起,后端也有了名称。以前,--backend-b 标志指的是 LLM 提供商的名称(例如,“openai”、“bedrock”、“ollama”)。现在,它们指你在配置文件中定义的任何名称:

[backends.my_local_llm]
type = "ollama"
url = "http://localhost:11434/api"

在这里,我们配置了一个名为“my_local_llm”的 Ollama 后端。当你想使用这个后端生成代码时,将使用 -b my_local_llm 而不是 -b ollama,因为同一个 LLM 提供商可能有多个后端。

CLI 调用的变化

在 v5 之前,命令行分为三个子命令:getlist-modelsversion。由于 CLI 的这种层次结构,如果参数位于“错误的位置”,可能会不被接受。例如,--model 标志必须紧跟在“get”之后,否则不会被接受。而在 v5 中,不再有子命令,因此参数的位置不再重要。

list-models 子命令已被 --list-models 标志取代,version 子命令已被 --version 标志取代。

v5 之前:

aiac -b ollama list-models

自 v5 起:

aiac -b my_local_llm --list-models

在早期版本中,“get”实际上是一个子命令,并不是真正发送给 LLM 提供商的提示的一部分。自 v5 起,不再有“get”子命令,因此你不再需要在提示中添加这个词。

v5 之前:

aiac get terraform for S3 bucket

自 v5 起:

aiac terraform for S3 bucket

不过,添加“get”或“generate”这两个词并不会有任何问题,因为 v5 会在接收到这些词时将其直接移除。

模型使用和支持的变化

在 v5 之前,每个 LLM 提供商的模型都硬编码在每个后端实现中,且每个提供商都有一个硬编码的默认模型。这极大地限制了项目的可用性,每当有新模型被添加或弃用时,我们都必须更新 aiac。另一方面,我们可以手动从提供商文档中提取每个模型的上下文长度和类型等信息,从而提供更详细的信息。

自 v5 起,aiac 不再硬编码任何模型,包括默认模型。它不会再尝试验证你选择的模型是否真的存在。--list-models 标志现在会直接联系所选后端的 API,以获取支持的模型列表。在生成代码时设置模型,只是将模型名称原样发送给 API。此外,不再为每个后端硬编码默认模型,用户可以在配置文件中定义自己的默认模型:

[backends.my_local_llm]
type = "ollama"
url = "http://localhost:11434/api"
default_model = "mistral:latest"

在 v5 之前,aiac 同时支持完成模型和聊天模型。自 v5 起,它只支持聊天模型。由于没有任何 LLM 提供商的 API 会明确标注某个模型是完成模型还是聊天模型(甚至是否是图像或视频模型),--list-models 标志可能会列出一些实际上无法使用的模型,尝试使用这些模型会导致来自提供商 API 的错误。我们决定放弃对完成模型的支持,是因为完成模型需要为 API 设置最大令牌数来生成内容(至少在 OpenAI 中是这样),而我们无法在不知道上下文长度的情况下做到这一点。相比之下,聊天模型不仅更有用,而且没有这一限制。

其他变化

大多数 LLM 提供商的 API 在返回提示响应时,都会包含一个“停止原因”,说明为什么响应会在那里结束。通常,响应应该是因为模型完成了生成而结束,但有时响应可能会因为模型的上下文长度或用户的令牌使用量而被截断。当响应并非因生成完成而“停止”时,就被称为“截断”。在 v5 之前,如果 API 返回响应被截断,aiac 会返回错误。自 v5 起,不再返回错误,因为似乎有些提供商并没有返回准确的停止原因。相反,库会将停止原因作为输出的一部分返回,以便用户自行决定如何继续。

示例输出

命令行提示:

aiac dockerfile for nodejs with comments

输出:

FROM node:latest

# 创建应用目录
WORKDIR /usr/src/app

# 安装应用依赖
# 使用通配符确保无论是否有 package-lock.json,package.json 都会被复制过来(npm@5+)
COPY package*.json ./

RUN npm install
# 如果您正在为生产构建代码
# RUN npm ci --only=production

# 打包应用源代码
COPY . .

EXPOSE 8080
CMD [ "node", "index.js" ]

故障排除

你可能会遇到的大多数错误都来自 LLM 提供商的 API,例如 OpenAI 或 Amazon Bedrock。一些常见的错误包括:

  • “[insufficient_quota] 您已超出当前配额,请检查您的计划和账单详情”: 如说明部分所述,OpenAI 是一项付费 API,会提供一定数量的免费额度。此错误表示您已超出免费或付费配额。您需要充值才能继续使用。

  • “[tokens] 已达到速率限制...”: OpenAI API 采用速率限制机制,具体说明请参见此处aiac 只执行单独的请求,无法绕过或防止这些速率限制。如果你以编程方式使用 aiac,则需要自行实施限流措施。有关提示,请参阅这里

许可证

本代码根据Apache License 2.0条款发布。

版本历史

v5.3.02024/10/29
v5.2.12024/07/08
v5.2.02024/07/01
v5.1.12024/07/01
v5.1.02024/07/01
v5.0.12024/06/28
v5.0.02024/06/26
v4.3.02024/06/11
v4.2.02024/02/06
v4.1.02024/01/02
v4.0.02023/12/26
v2.5.02023/06/08
v2.4.02023/05/07
v2.3.02023/04/27
v2.2.02023/03/22
v2.1.02023/03/09
v2.0.02023/02/16
v1.0.02022/12/12

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架