LlamaIndex 完全入门指南

107 阅读12分钟

🦙 LlamaIndex 完全入门指南

写给小白的RAG框架教程


📖 目录

  1. 从一个生活问题开始
  2. 什么是LlamaIndex
  3. 核心原理:图书馆的故事
  4. 五大核心组件详解
  5. 实战教程:10分钟上手
  6. 进阶技巧
  7. 常见问题解答

🤔 从一个生活问题开始

想象一下这个场景:

你的老板给了你1000份公司的技术文档,然后问你:"去年Q3我们的销售策略是什么?"

你会怎么做?

  • ❌ 一份一份手动翻看?(估计要找一整天)
  • ❌ 用Ctrl+F搜关键词?(可能遗漏相关信息)
  • 用LlamaIndex!(几秒钟搞定)

这就是LlamaIndex的价值——让AI帮你从海量文档中快速找到答案


🦙 什么是LlamaIndex?

简单定义

LlamaIndex = 智能文档管理员 + 知识检索专家 + AI回答助手

它是一个Python框架,专门用来:

  1. 把你的文档(PDF、Word、网页...)整理成"可搜索的知识库"
  2. 当你提问时,快速找到相关内容
  3. 用AI(如ChatGPT)把找到的内容整理成答案

核心概念:RAG

RAG = Retrieval-Augmented Generation(检索增强生成)

传统AI对话               →  只能回答训练时学到的知识
RAG系统(LlamaIndex)    →  能回答你自己文档里的内容!

生活比喻

  • 普通ChatGPT = 博学的朋友(但不知道你公司的事)
  • LlamaIndex + ChatGPT = 看过你所有公司文档的秘书

📚 核心原理:图书馆的故事

让我们用图书馆来理解LlamaIndex的工作流程:

🏛️ 完整流程图解

┌─────────────────────────────────────────────────────────────┐
│                    LlamaIndex 工作流程                       │
└─────────────────────────────────────────────────────────────┘

第一步:收集书籍(数据加载)
┌─────────┐  ┌─────────┐  ┌─────────┐
│ PDF文档 │  │ Word文档│  │  网页   │
└────┬────┘  └────┬────┘  └────┬────┘
     │            │            │
     └────────────┼────────────┘
                  ↓
         ┌────────────────┐
         │  数据连接器    │  ← 图书馆采购部
         └────────┬───────┘
                  ↓
         【原始文档数组】


第二步:整理编目(文档切片)
         ┌────────────────┐
         │  长文档        │
         │ (5000字)      │
         └────────┬───────┘
                  ↓
         ┌────────────────┐
         │   文本分割器   │  ← 图书馆编目员
         └────────┬───────┘
                  ↓
    ┌──────┐ ┌──────┐ ┌──────┐
    │片段1 │ │片段2 │ │片段3 │  ← 把大书拆成章节
    │500字│ │500字│ │500字│
    └──────┘ └──────┘ └──────┘


第三步:建立索引(向量化)
    ┌──────────────────────────────┐
    │  片段1:"产品A在去年销售..."  │
    └──────────┬───────────────────┘
               ↓
    ┌──────────────────────────┐
    │  嵌入模型(Embedding)    │  ← 把文字变成数字密码
    └──────────┬───────────────┘
               ↓
    [0.23, -0.45, 0.67, ...]  ← 向量(512维数字)
               ↓
    ┌──────────────────────────┐
    │    向量索引数据库         │  ← 图书馆索引卡片柜
    │  存储所有向量+原文        │
    └──────────────────────────┘


第四步:用户提问(查询)
         ┌────────────────┐
         │ 用户问题:      │
         │ "去年销售如何?"│
         └────────┬───────┘
                  ↓
         ┌────────────────┐
         │  问题也向量化   │
         └────────┬───────┘
                  ↓
         [0.21, -0.43, ...]  ← 问题的向量


第五步:相似度匹配(检索)
    ┌─────────────────────────────────┐
    │      向量索引数据库             │
    │                                 │
    │  片段1向量: [0.23, -0.45, ...]  │ ← 相似度: 92%  ✓
    │  片段2向量: [0.11, 0.32, ...]   │ ← 相似度: 15%  ✗
    │  片段3向量: [0.22, -0.41, ...]  │ ← 相似度: 88%  ✓
    └─────────────────────────────────┘
                  ↓
         找到最相关的2个片段


第六步:生成答案(LLM回答)
    ┌─────────────────────────────────┐
    │   大语言模型(如ChatGPT)        │
    │                                 │
    │  输入:                         │
    │  - 用户问题                     │
    │  - 相关文档片段1                │
    │  - 相关文档片段2                │
    │                                 │
    │  输出:                         │
    │  "根据文档,去年销售额增长了..."│
    └─────────────────────────────────┘

🎯 关键要点

步骤做什么生活比喻
数据加载读取各种文档图书馆进货新书
文档切片把长文档切成小段把厚书拆成章节
向量化把文字变成数字给每本书编号分类
建索引存储到数据库建立索引卡片柜
查询问题也转成数字读者来找书
检索找相似的片段查卡片找到书架位置
生成答案AI整理成回答图书管理员总结给你听

🔧 五大核心组件详解

1️⃣ 数据连接器(Data Connectors)

作用:把各种格式的文件读进来

生活比喻:就像快递员,不管你买的是书、衣服还是电子产品,都能送到你家门口。

# 示例:从文件夹读取所有文档
from llama_index.core import SimpleDirectoryReader

# 一行代码读取整个文件夹!
documents = SimpleDirectoryReader('我的文档文件夹').load_data()

支持的格式

  • 📄 文本文件:.txt, .md
  • 📑 办公文档:.pdf, .docx, .pptx
  • 🌐 网页:HTML
  • 📊 表格:.csv, .xlsx
  • 💾 数据库:SQL, MongoDB
  • 🔗 在线服务:Google Docs, Notion, 维基百科...

2️⃣ 文档节点(Nodes)

作用:把长文档切成小块

为什么要切

  • ❌ 整篇文章太长,AI看不过来
  • ✅ 切成小段,精准定位相关部分

生活比喻:就像吃大西瓜,你不能一口吃掉,要切成小块才好入口。

from llama_index.core.node_parser import SimpleNodeParser

# 创建切片器:每500字切一段
parser = SimpleNodeParser.from_defaults(chunk_size=500, chunk_overlap=50)

# 切片!
nodes = parser.get_nodes_from_documents(documents)

关键参数

  • chunk_size=500:每块500字
  • chunk_overlap=50:相邻块重叠50字(避免切断上下文)
示意图:
┌────────────────────────────────────────┐
│  原文(1000字)                        │
└────────────────────────────────────────┘
           ↓ 切片
┌──────────────┐
│  块1 (500字) │
└──────────────┘
        ┌──────────────┐
        │  块2 (500字) │  ← 和块1重叠50字
        └──────────────┘

3️⃣ 索引结构(Indexes)

作用:组织数据,让检索更快

核心类型对比

索引类型原理速度适用场景生活比喻
VectorStoreIndex语义相似度⭐⭐⭐⭐⭐最常用,适合问答智能书架,自动把相关书放一起
ListIndex线性扫描文档少时书堆成一摞
TreeIndex树形结构⭐⭐⭐长文档总结目录树
KeywordTableIndex关键词匹配⭐⭐⭐⭐精确搜索按关键词索引的卡片

推荐使用VectorStoreIndex(90%的场景都够用)

from llama_index.core import VectorStoreIndex

# 构建向量索引(最智能!)
index = VectorStoreIndex.from_documents(documents)

4️⃣ 检索器(Retrievers)

作用:根据问题找到最相关的文档片段

工作原理

你的问题:"去年销售情况如何?"
      ↓ 转成向量
[0.21, -0.43, 0.65, ...]
      ↓ 在索引中比对
找到相似度最高的3个片段:
  1. "2023年Q4销售额..." (相似度: 95%)
  2. "去年全年销售..." (相似度: 88%)
  3. "销售部门报告..." (相似度: 82%)
# 创建检索器,只返回最相关的2个片段
retriever = index.as_retriever(similarity_top_k=2)

# 检索!
nodes = retriever.retrieve("去年销售情况如何?")

5️⃣ 查询引擎(Query Engines)

作用:整合检索+生成,直接返回答案

三种模式

# ① 标准问答模式(最常用)
query_engine = index.as_query_engine()
response = query_engine.query("去年销售如何?")
print(response)  # → AI整理好的完整答案

# ② 聊天模式(支持多轮对话)
chat_engine = index.as_chat_engine()
chat_engine.chat("你好!")
chat_engine.chat("去年销售如何?")  # ← 能记住上下文
chat_engine.chat("那今年呢?")      # ← 知道你在问销售

# ③ 智能代理模式(能调用工具)
from llama_index.core.agent import ReActAgent
agent = ReActAgent.from_tools(tools, llm=llm)
agent.chat("帮我分析销售数据并生成图表")  # ← 能自动调用计算器、画图工具等

🚀 实战教程:10分钟上手

前置准备

# 1. 安装LlamaIndex
pip install llama-index

# 2. 安装OpenAI库(默认使用GPT)
pip install openai

# 3. 设置API密钥
export OPENAI_API_KEY='你的密钥'  # Mac/Linux
set OPENAI_API_KEY=你的密钥      # Windows

案例:建立公司文档问答系统

目录结构

my_project/
├── data/              # 存放你的文档
│   ├── 产品手册.pdf
│   ├── 销售报告.docx
│   └── 技术文档.txt
└── main.py           # 主程序

📝 完整代码(含详细注释)

# main.py

# ==================== 第1步:导入库 ====================
from llama_index.core import (
    SimpleDirectoryReader,  # 文档加载器
    VectorStoreIndex,       # 向量索引
    Settings               # 全局设置
)
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI

# ==================== 第2步:配置模型 ====================
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# ==================== 第3步:加载文档 ====================
print("📖 正在加载文档...")
documents = SimpleDirectoryReader('data').load_data()
print(f"✅ 成功加载 {len(documents)} 份文档")

# ==================== 第4步:构建索引 ====================
print("🔨 正在构建索引(第一次会慢一点)...")
index = VectorStoreIndex.from_documents(documents, show_progress=True)
print("✅ 索引构建完成!")

# ==================== 第5步:创建查询引擎 ====================
query_engine = index.as_query_engine(
    similarity_top_k=3,  # 返回最相关的3个片段
    response_mode="compact"  # 紧凑模式,答案更简洁
)

# ==================== 第6步:开始提问 ====================
print("\n" + "="*50)
print("🤖 AI助手已就绪!输入'退出'结束对话")
print("="*50 + "\n")

while True:
    question = input("👤 你的问题: ")
    
    if question.lower() in ['退出', 'quit', 'exit']:
        print("👋 再见!")
        break
    
    print("🤔 思考中...")
    response = query_engine.query(question)
    
    print(f"\n🤖 AI回答:\n{response}\n")
    print("-"*50 + "\n")

🎯 运行效果

📖 正在加载文档...
✅ 成功加载 3 份文档

🔨 正在构建索引...
100%|████████████████████| 3/3 [00:02<00:00]
✅ 索引构建完成!

==================================================
🤖 AI助手已就绪!输入'退出'结束对话
==================================================

👤 你的问题: 我们公司主要产品是什么?

🤔 思考中...

🤖 AI回答:
根据产品手册,公司主要产品包括:
1. 企业级管理软件(占比45%)
2. 数据分析平台(占比30%)
3. 云存储服务(占比25%)

--------------------------------------------------

👤 你的问题: 去年销售额多少?

🤔 思考中...

🤖 AI回答:
根据销售报告显示,2023年全年销售额为2.3亿元,
同比增长18%,其中Q4单季度突破7000万元。

--------------------------------------------------

🎓 进阶技巧

技巧1:持久化索引(避免重复构建)

# 第一次:构建并保存
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir="./storage")  # 保存到本地

# 之后:直接加载(超快!)
from llama_index.core import StorageContext, load_index_from_storage

storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)

技巧2:自定义切片策略

from llama_index.core.node_parser import SentenceSplitter

# 按句子切分,每块3个句子
splitter = SentenceSplitter(chunk_size=3, chunk_overlap=1)
nodes = splitter.get_nodes_from_documents(documents)

技巧3:使用本地模型(免费!)

from llama_index.llms.ollama import Ollama
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# 使用本地Ollama(需先安装Ollama)
Settings.llm = Ollama(model="llama2")

# 使用本地嵌入模型
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-zh-v1.5"  # 中文模型
)

技巧4:流式输出(像ChatGPT那样逐字显示)

query_engine = index.as_query_engine(streaming=True)

response = query_engine.query("介绍一下产品")

# 逐字打印
for text in response.response_gen:
    print(text, end="", flush=True)

技巧5:添加元数据过滤

from llama_index.core import Document

# 加载时添加元数据
doc1 = Document(text="...", metadata={"部门": "销售", "年份": 2023})
doc2 = Document(text="...", metadata={"部门": "技术", "年份": 2023})

# 查询时过滤
from llama_index.core.vector_stores import MetadataFilters, ExactMatchFilter

filters = MetadataFilters(filters=[
    ExactMatchFilter(key="部门", value="销售")
])

query_engine = index.as_query_engine(filters=filters)
response = query_engine.query("销售情况")  # 只在销售部门文档里找

🔥 性能优化建议

速度对比表

优化手段效果难度
持久化索引构建时间 100x ↓
减少chunk_size查询速度 2x ↑
使用本地嵌入模型成本 100% ↓⭐⭐
添加元数据过滤准确度 30% ↑⭐⭐
使用GPU加速向量化速度 10x ↑⭐⭐⭐

推荐配置

# 平衡配置(适合大多数场景)
Settings.chunk_size = 512        # 每块512字符
Settings.chunk_overlap = 50      # 重叠50字符
Settings.similarity_top_k = 3    # 返回3个相关片段

# 高速配置(牺牲一点准确度)
Settings.chunk_size = 256
Settings.similarity_top_k = 2

# 高精度配置(速度会慢一点)
Settings.chunk_size = 1024
Settings.chunk_overlap = 100
Settings.similarity_top_k = 5

❓ 常见问题解答

Q1: 文档太大怎么办?

A: 分批处理或使用元数据过滤

# 方法1:分批构建索引
from llama_index.core import SimpleDirectoryReader

docs_batch1 = SimpleDirectoryReader('data/2023').load_data()
docs_batch2 = SimpleDirectoryReader('data/2024').load_data()

index1 = VectorStoreIndex.from_documents(docs_batch1)
index2 = VectorStoreIndex.from_documents(docs_batch2)

# 方法2:查询时指定目录
query_engine = index1.as_query_engine()  # 只查2023年的

Q2: 答案不准确怎么办?

A: 调整以下参数

  1. 增加返回片段数similarity_top_k=5
  2. 减小chunk_size:更精细的切分
  3. 调整提示词
from llama_index.core import PromptTemplate

template = (
    "你是专业的文档分析助手。\n"
    "请根据以下内容回答问题,如果不确定就说不知道。\n\n"
    "文档内容:{context_str}\n\n"
    "问题:{query_str}\n\n"
    "答案:"
)

query_engine = index.as_query_engine(
    text_qa_template=PromptTemplate(template)
)

Q3: 支持中文吗?

A: 完全支持!推荐使用中文嵌入模型

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# 中文模型推荐
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-large-zh-v1.5"  # 最佳
    # 或 "shibing624/text2vec-base-chinese"  # 备选
)

Q4: 能处理PDF、Word吗?

A: 需要安装额外依赖

pip install pypdf          # PDF支持
pip install docx2txt       # Word支持
pip install llama-index-readers-file  # 文件读取器

Q5: 如何调试查看检索到的原文?

A: 查看source_nodes

response = query_engine.query("问题")

# 打印AI答案
print(response)

# 查看引用的原文片段
for i, node in enumerate(response.source_nodes, 1):
    print(f"\n片段{i}(相似度: {node.score:.2f}):")
    print(node.text[:200])  # 打印前200字

Q6: 花费多少钱?

A: 成本估算(使用OpenAI)

  • 嵌入(构建索引):$0.0001 / 1K tokens
    • 1万字文档 ≈ 15K tokens ≈ $0.0015(约¥0.01)
  • 生成答案:$0.002 / 1K tokens(GPT-3.5)
    • 每次查询 ≈ 2K tokens ≈ $0.004(约¥0.03)

节省成本方法

  1. 使用本地模型(Ollama)→ 完全免费
  2. 持久化索引 → 避免重复构建
  3. 使用更小的嵌入模型

📊 架构全景图

┌───────────────────────────────────────────────────────────────┐
│                      LlamaIndex 完整架构                       │
└───────────────────────────────────────────────────────────────┘

                      【数据源层】
    ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐
    │   PDF    │  │   Word   │  │   网页   │  │  数据库  │
    └─────┬────┘  └─────┬────┘  └─────┬────┘  └─────┬────┘
          └─────────────┴──────────────┴─────────────┘
                            ↓
                  ┌──────────────────┐
                  │  数据连接器层     │
                  │ (Readers/Loaders)│
                  └─────────┬────────┘
                            ↓
                      【Document对象】
                            ↓
                  ┌──────────────────┐
                  │   文档解析器层    │
                  │  (Node Parsers)  │
                  │  - 文本切片       │
                  │  - 元数据提取     │
                  └─────────┬────────┘
                            ↓
                      【Node对象数组】
                            ↓
                  ┌──────────────────┐
                  │    嵌入模型层     │
                  │  (Embed Models)  │
                  │  - OpenAI        │
                  │  - HuggingFace   │
                  └─────────┬────────┘
                            ↓
                      【向量数组】
                            ↓
                  ┌──────────────────┐
                  │    索引存储层     │
                  │  (Vector Stores) │
                  │  - 内存          │
                  │  - Chroma        │
                  │  - Pinecone      │
                  └─────────┬────────┘
                            ↓
         ╔═══════════════════════════════════╗
         ║         【索引 Index】             ║
         ║    可持久化、可查询的知识库         ║
         ╚═══════════════════════════════════╝
                            ↓
         ┌──────────────────┴──────────────────┐
         ↓                                     ↓
   ┌──────────────┐                  ┌──────────────┐
   │ 检索器层     │                  │ 查询引擎层   │
   │ (Retrievers) │                  │(Query Engine)│
   │ - 向量检索   │                  │- QA模式      │
   │ - 关键词检索 │                  │- Chat模式    │
   │ - 混合检索   │                  │- Agent模式   │
   └──────┬───────┘                  └──────┬───────┘
          └────────────┬───────────────────┘
                       ↓
                 ┌──────────────┐
                 │  LLM层       │
                 │ (语言模型)   │
                 │ - OpenAI     │
                 │ - Ollama     │
                 └──────┬───────┘
                        ↓
                 【最终答案】

🎯 总结与学习路线

核心要点回顾

  1. LlamaIndex = 智能文档助手

    • 把你的文档变成可查询的知识库
    • 用AI理解问题并生成答案
  2. 三步走

    documents = SimpleDirectoryReader('data').load_data()  # 加载
    index = VectorStoreIndex.from_documents(documents)     # 索引
    response = index.as_query_engine().query("问题")       # 查询
    
  3. 核心技术

    • 向量化(把文字变数字)
    • 相似度检索(找最相关的内容)
    • LLM生成(整理成答案)

学习路线图

第1周:入门
  ├─ 理解RAG概念
  ├─ 跑通基础示例
  └─ 处理自己的文档

第2周:进阶
  ├─ 尝试不同索引类型
  ├─ 调整参数优化效果
  └─ 添加元数据过滤

第3周:实战
  ├─ 使用本地模型
  ├─ 持久化索引
  └─ 构建聊天界面

第4周:高级
  ├─ 自定义提示词
  ├─ 多索引查询
  └─ 接入生产环境

推荐资源


🎉 结语

恭喜你!现在你已经掌握了LlamaIndex的核心知识。

记住这个比喻

LlamaIndex = 智能图书馆系统

  • 你负责提供书籍(文档)
  • 它负责整理和检索
  • AI负责总结答案

从现在开始,你可以:

  • ✅ 把公司文档变成智能问答系统
  • ✅ 快速从论文中提取信息
  • ✅ 构建个人知识库助手
  • ✅ 开发行业垂直领域应用

最后的建议:不要只看教程,动手实践才是王道!

💡 立即行动:找3份你的文档,用10分钟跑通第一个示例吧!


📧 有问题?欢迎交流!

Made with ❤️ for AI Learners