Haystack(AI 应用框架)
deepset 开源的 AI 编排框架,用模块化管道构建 RAG、语义搜索和 Agent 应用。
专注于数据连接与检索的 LLM 数据框架,是构建 RAG 应用的核心工具。
内容摘要
LlamaIndex(原名 GPT Index)是一个专为大语言模型(LLM)设计的**数据框架(Data Framework)**。它解决的核心问题是:LLM 自身只知道训练数据里的内容,对你的私有数据一无所知——LlamaIndex 就是那座桥,把你的 PDF、数据库、网页等各类数据接入 LLM,让模型能"查阅"你的资料再回答问题。
LlamaIndex(原名 GPT Index)是一个专为大语言模型(LLM)设计的数据框架(Data Framework)。它解决的核心问题是:LLM 自身只知道训练数据里的内容,对你的私有数据一无所知——LlamaIndex 就是那座桥,把你的 PDF、数据库、网页等各类数据接入 LLM,让模型能"查阅"你的资料再回答问题。
与 LangChain 侧重"如何编排 Agent 工作流"不同,LlamaIndex 侧重"如何让 LLM 高效地使用你的数据"。它在数据加载、文档切分、索引构建、检索策略这条链路上做了大量优化,是构建 RAG(Retrieval-Augmented Generation,检索增强生成)应用时的首选工具。
| 要素 | 作用 |
|---|---|
| Data Connectors(数据连接器) | 从 PDF、Word、数据库、API、网页等 160+ 数据源加载数据,统一转换为 Document 对象 |
| Index(索引) | 对文档进行结构化处理,构建向量索引、关键词索引等,决定后续的检索策略 |
| Retriever(检索器) | 根据用户查询,从索引中高效定位最相关的文档片段 |
| Query Engine(查询引擎) | 整合检索结果 + LLM,理解用户问题并生成最终回答 |
数据连接器负责"吃进"各种格式的数据,输出标准化的 Document 对象。每个 Document 包含文本内容和元数据(如来源文件名、页码等)。LlamaIndex 通过 LlamaHub 提供了 160+ 种现成的连接器,覆盖 PDF、Notion、Slack、SQL 数据库等主流数据源。
最常用的是 SimpleDirectoryReader——指定一个本地目录,它会自动识别目录下的 .txt、.pdf、.docx 等文件并加载。
索引是 LlamaIndex 的核心抽象。加载的文档会先被切分成小块(Node),然后按不同策略组织成索引结构:
不同索引类型适合不同查询场景,也可以组合使用。
检索器从索引中取出与用户问题最相关的 Node。可以调整 similarity_top_k 参数控制返回数量,也可以用 QueryFusionRetriever 同时调用多种检索器并融合结果(混合检索)。
查询引擎是用户交互的入口。它的工作流程:接收用户问题 -> 调用检索器获取相关片段 -> 将问题和片段一起发送给 LLM -> 返回最终回答。一行代码 index.as_query_engine() 即可创建。
数据从左到右流动:连接器加载数据 -> 切分成 Node -> 构建索引 -> 检索相关片段 -> LLM 生成回答。Embedding Model 负责将文本转为向量,LLM 负责最终的回答生成。
安装:
# 安装核心包(包含 llama-index-core 及一组默认集成)
pip install llama-index
如需调用 OpenAI 模型,再额外安装对应集成并设置 API Key:
pip install llama-index-llms-openai llama-index-embeddings-openai
export OPENAI_API_KEY="sk-your-api-key"
最小可运行示例(基于 llama-index==0.14.x 官方 API 写法验证,截至 2026-03):
"""
最小 RAG 问答:手动创建文档 -> 构建向量索引 -> 查询
使用 MockLLM + MockEmbedding,避免依赖 OpenAI API Key
"""
from llama_index.core import Document, MockEmbedding, Settings, VectorStoreIndex
from llama_index.core.llms import MockLLM
# 1. 配置无需联网的 Mock 模型
Settings.llm = MockLLM(max_tokens=128)
Settings.embed_model = MockEmbedding(embed_dim=1536)
# 2. 准备文档(实际项目中可改为用 SimpleDirectoryReader 加载本地文件)
documents = [
Document(text="公司年假政策:入职满一年享有5天带薪年假,满三年增至10天,满五年增至15天。"),
Document(text="报销流程:因公费用需在30天内提交申请,单笔超5000元需经理审批。"),
Document(text="考勤制度:标准工作时间为9:00-18:00,迟到超过30分钟按半天事假处理。"),
]
# 3. 构建向量索引
index = VectorStoreIndex.from_documents(documents)
# 4. 创建查询引擎并提问
query_engine = index.as_query_engine(similarity_top_k=3)
response = query_engine.query("年假最多能有多少天?")
print(response)
预期输出:
会输出一段基于已索引文档生成的回答;在这个示例里,答案会围绕“入职满五年后最多 15 天带薪年假”展开。
如需改用 OpenAI 作为 LLM 与 Embedding,可在设置好 OPENAI_API_KEY 后使用默认配置,或显式设置 Settings.llm / Settings.embed_model。
从本地目录加载文档的写法:
from pathlib import Path
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
# 先确保目录存在,并且里面至少有一个可读取文件(如 .txt / .md / .pdf)
data_dir = Path("./data")
if data_dir.exists():
documents = SimpleDirectoryReader(input_dir=str(data_dir)).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("你的问题")
print(response)
else:
print("请先创建 ./data 目录,并放入待索引文档后再运行示例。")
| 维度 | LlamaIndex | LangChain | Haystack |
|---|---|---|---|
| 核心定位 | 数据连接与索引,专注 RAG 链路 | 全栈 Agent 编排框架 | 企业级搜索与 RAG 系统 |
| 最擅长 | 多数据源接入、索引策略丰富、检索优化 | Agent 工作流编排、工具链串联 | 生产级文档检索、Pipeline 管理 |
| 索引类型 | 向量、摘要、关键词、知识图谱等多种 | 主要依赖向量存储 | Pipeline 组件式,可自定义 |
| 学习曲线 | 中等,API 直观,从 3 行代码起步 | 较陡,概念多且迭代快 | 中等,Pipeline 模式清晰 |
| 适合人群 | 需要快速构建知识问答 / RAG 应用的开发者 | 需要构建复杂 Agent 多步骤工作流的开发者 | 需要企业级可靠性和商业支持的团队 |
核心区别:
LlamaIndex 和 LangChain 经常配合使用:在 LangChain 的 Agent 节点里调用 LlamaIndex 的检索能力。
| 误区 | 准确理解 |
|---|---|
| LlamaIndex 就是 RAG | LlamaIndex 是实现 RAG 的工具之一。RAG 是一种技术方案,还涉及 LLM 选型、Prompt 设计、评估调优等多个环节 |
| 向量索引是唯一选择 | 向量索引擅长语义匹配,但关键词索引在精确查找时更有效。实际项目中混合检索(向量 + 关键词)往往效果最好 |
| 索引越大越好 | 索引要和 LLM 的 token 预算匹配。在有限的上下文窗口下,精准的小索引比塞满无关内容的大索引更高效 |
| 默认切分策略够用 | 默认的 chunk_size=1024 不一定适合你的数据。文档结构不同(代码 vs 法律文书 vs 对话记录),最优的切分大小和重叠量也不同 |
| 优势 | 劣势 |
|---|---|
| 160+ 数据连接器,几乎覆盖所有主流数据源 | 默认依赖 OpenAI API,离线场景需额外配置本地模型 |
| 多种索引类型可选,灵活适配不同检索需求 | 包拆分为 llama-index-core + 大量子包,依赖管理有一定复杂度 |
| 从 3 行代码到生产部署都有覆盖,学习曲线平滑 | Agent 编排能力不如 LangChain / LangGraph 成熟 |
| LlamaCloud 提供托管索引服务,降低运维负担 | 版本迭代快(v0.9 -> v0.10 -> v0.11 -> v0.12),API 变更较频繁 |
参考答案:
四者构成一条完整的数据流水线:加载 -> 索引 -> 检索 -> 回答。
参考答案:
单一向量检索擅长语义匹配("公司放假规定"能匹配到"年假政策"),但对精确关键词(如产品编号 "SKU-12345"、法条编号 "第三十七条")的匹配能力较弱。
适合混合检索的场景:
实现方式:用 QueryFusionRetriever 同时调用 VectorIndexRetriever 和 KeywordTableSimpleRetriever,自动融合两者的结果。
参考答案:
选择建议:
优先展示同分类且标签更接近的内容,方便继续串联学习。
deepset 开源的 AI 编排框架,用模块化管道构建 RAG、语义搜索和 Agent 应用。
开源 AI 原生向量数据库,内置向量化模块和生成模块,支持多模态搜索与混合检索。
轻量级开源向量数据库,pip 一装即用,专为 AI 应用的语义搜索和 RAG 场景设计。