先把定位说清楚:LlamaIndex 不是一组模型权重,而是 run-llama 维护的文档智能体与检索框架,MIT 协议,GitHub 上 51.8k star、8.0k fork,LlamaHub 上挂着 300 多个集成包。你搜到的「LlamaIndex 需要多大显存」,答案永远不在框架本身——它编排的是别人的模型。还有个小坑值得先记下:文档站已经从 docs.llamaindex.ai 整体 301 跳到 developers.llamaindex.ai,老教程里的链接点过去会落到新路径上,路径结构也换了。
当前的版本格局跟很多人印象里的不一样。Workflows 已经从 core 里彻底拆出来,走独立版本线 llama-index-workflows 2.23.3,导入路径是 from workflows import Workflow, step,llama_index.core.workflow 只是保持 API 稳定的兼容层。原来的 workflows-py 仓库并入了 run-llama/llama-agents 单体仓库,品牌叫 LlamaAgents;服务化的活交给 llama-agents-server 0.7.1 加 llamactl 命令行,而老的 llama-deploy 把 llama-index-core 锁在 0.14.0 以下,跟今天的 0.14.24 直接冲突,新项目别再从那条线起步。
私有化部署的全部工作量,本质上就是把三个默认值换掉。llama_index.core.settings 里 Settings.llm 的默认解析是 resolve_llm("default"),它会直接 new 一个 OpenAI() 并校验 key,失败就抛「Could not load OpenAI model」;Settings.embed_model 默认落到 BAAI/bge-small-en,一个纯英文模型;Settings.context_window 默认常量是 3900。把这三个换成本地 vLLM 端点、bge-m3 和你模型真实的上下文长度,LlamaIndex 就完全离线了——剩下的只是给这三个模型找一张显存够用的卡。
01 —
当前在维护的版本线
六个包,六条独立版本线,对不上号就会互相锁死
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| llama-index 0.14.24 | 元包,只有 4 个直接依赖 | 框架 0GB,默认走 OpenAI API | Settings.context_window 默认 3900 | pip install llama-index 的起步包,会顺带把 llama-index-llms-openai 0.7.10 和 llama-index-embeddings-openai 装进来。想完全离线,这个包反而不该装。 |
| llama-index-core 0.14.24 | 纯核心,要求 Python ≥3.10 且 <4.0 | 0GB,模型全部外挂 | 由你注入的 LLM metadata 决定 | 私有化部署的真正起点。Settings、节点解析、检索器、FunctionAgent 与 AgentWorkflow 都在这里,不含任何云端 LLM 依赖。 |
| llama-index-workflows 2.23.3 | 事件驱动运行时,可独立安装 | 0GB,纯编排层 | 状态按 run id + namespace 分区持久化 | 已从 core 拆成独立版本线。支持 list[E] 的 fan-out/fan-in、@catch_error 兜住重试耗尽、快照回放续跑,agent 中途崩了不用从头再来。 |
| llama-agents-server 0.7.1 / llama-agents-client 0.3.12 | Starlette + uvicorn 服务壳 | 0GB,与推理进程分离 | 流式输出、人在回路、run 持久化 | 把任意 Workflow 包成 REST 服务,也能直接挂进你已有的 FastAPI 应用;配 llamactl 做 init/serve/deployments create 的完整链路。 |
| LlamaIndex.TS 0.12.1(npm) | TypeScript 实现,同为 MIT | 0GB,一般只做前端侧编排 | 跟随所接模型 | Node 与 Edge 运行时的对等实现,版本线跟 Python 完全独立,覆盖面不如 Python 全;重检索逻辑建议还是留在 Python 侧。 |
| llama-deploy 0.9.2(已被取代) | 依赖里锁死 llama-index-core <0.14.0 | 0GB | 仅支持旧版 Workflow 契约 | 它的 core 上限和现在的 0.14.24 直接打架,装上就会把 core 降级。迁到 llama-agents-server 加 llamactl,这是官方在推的那条路。 |
02 —
按你实际要跑的模型选卡
显存花在 embedding、reranker、LLM 三件套上,框架一分不占
只做灌库:批量 embedding + 重排,不跑生成
RTX 3090 24GB$0.193/卡·时
bge-m3 fp16 约 1.2GB、bge-reranker-v2-m3(5.68 亿参数)fp16 约 1.1GB,24GB 里剩下 20 多 GB 全能拿去堆 embed_batch_size,这是全站最便宜的算力单价。
单卡跑完整本地栈:Qwen3-8B 生成 + bge-m3 检索 + 重排
RTX 5090 32GB$0.723/卡·时
Qwen3-8B 实际 81.9 亿参数,bf16 权重约 16.4GB,再叠两个检索模型的 2.3GB 就逼近 19GB,24GB 卡留给 KV cache 的余量太薄,32GB 才跑得开长上下文。
FunctionAgent 要稳定调工具:Qwen3-32B AWQ-INT4 + 32K 以上上下文
RTX A6000 48GB$0.817/卡·时
327.6 亿参数量化到 INT4 后权重落在 20GB 上下,48GB 能同时喂下长 KV cache 和几路并发;工具调用的成功率比 8B 级模型高一个台阶,多 agent 交接才不会卡死。
AgentWorkflow 多 agent 交接,32B 级模型跑 bf16 不量化
A100 SXM4 80GB$1.088/卡·时
Qwen3-32B 光 bf16 权重就是 65.5GB,只有 80GB 级显存放得下;handoff 会把上下文越滚越长,KV 余量必须一次留够,中途 OOM 会把整条 workflow 的 run 状态打断。
03 —
四步把 LlamaIndex 搬进自己的卡
从空实例到一个能对外提供 REST 接口的本地 RAG 智能体
- 01
开实例,装最小可用的包集合
在 NexGPU 控制台选 PyTorch 或 vLLM 预置镜像开机,SSH 进去。别装 llama-index 元包——它会把 OpenAI 的 LLM 和 embedding 依赖一起拖进来。直接从 core 起步,按需补集成包,用 uv 装能避开 300 多个包之间的版本回退。
uv pip install "llama-index-core>=0.14.24" llama-index-llms-openai-like llama-index-embeddings-huggingface llama-index-postprocessor-flag-embedding-reranker llama-index-vector-stores-qdrant - 02
先把 vLLM 的 OpenAI 兼容端口拉起来
LlamaIndex 不负责推理,它只是个 HTTP 客户端。先让模型跑起来,注意一定要开工具调用解析,否则 FunctionAgent 拿不到结构化的 tool_calls,只能退化成让模型自己吐 JSON。gpu-memory-utilization 留出余量,因为同一张卡上还要塞 bge-m3 和 reranker。
vllm serve Qwen/Qwen3-8B --served-model-name qwen3-8b --max-model-len 32768 --gpu-memory-utilization 0.72 --enable-auto-tool-choice --tool-call-parser hermes --port 8000 - 03
改掉那三个会让你踩坑的默认值
OpenAILike 的 is_chat_model 和 is_function_calling_model 默认都是 False,context_window 默认继承 3900——三个开关不显式打开,你会得到一个既不会调工具、又把 32K 上下文截到 3900 的 agent。embedding 侧 device 虽然会自动推断到 CUDA,但 DEFAULT_EMBED_BATCH_SIZE 只有 10,不手动调大等于让 GPU 空转。
from llama_index.core import Settings from llama_index.llms.openai_like import OpenAILike from llama_index.embeddings.huggingface import HuggingFaceEmbedding Settings.llm = OpenAILike(model="qwen3-8b", api_base="http://127.0.0.1:8000/v1", api_key="EMPTY", context_window=32768, is_chat_model=True, is_function_calling_model=True) Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-m3", device="cuda", embed_batch_size=64) - 04
建索引、起 agent、包成服务
建查询引擎时记得把 similarity_top_k 从默认的 2 提上去——默认值只召回两个节点,中文长文档基本必漏。Memory 是现在的正统记忆类,ChatMemoryBuffer 已标记废弃。最后用 WorkflowServer 把 agent 包成带流式和人在回路的 REST 服务,其他服务用 llama-agents-client 调它就行。
from llama_index.core.agent.workflow import FunctionAgent from llama_index.core.memory import Memory from llama_agents.server import WorkflowServer query_tool = index.as_query_engine(similarity_top_k=8, node_postprocessors=[reranker]) agent = FunctionAgent(tools=[...], llm=Settings.llm, system_prompt="...") memory = Memory.from_defaults(session_id="u-1", token_limit=40000) server = WorkflowServer() server.add_workflow("rag", agent)
一次完整私有化验证的真实账单
算笔具体的账。一套两百万字的中文内规文档,第一步用 RTX 3090 24GB($0.193/卡·时)跑 bge-m3 灌库,embed_batch_size 调到 64,约 3 小时跑完全量索引:3 × 0.193 = $0.579。第二步换 RTX 5090 32GB($0.723/卡·时)挂 Qwen3-8B 做内部试用,每天开 8 小时、连开 5 天共 40 小时:40 × 0.723 = $28.92。索引、模型权重和向量库合计占 20GB 持久化存储,按 $0.414/GB·月 的中位价,一周约 20 × 0.414 × 7 ÷ 30 = $1.93。三项相加:0.579 + 28.92 + 1.93 ≈ $31.43,一周之内把 LlamaIndex 私有化的可行性彻底验证完。计费按秒计量、按小时计价,没有最低消费、没有开通费、不用提配额申请;实例一停,计算费用立刻停止,存储费用则会一直计到你把它销毁为止——所以验证跑完记得顺手清盘。
04 —
