返回学习路线
AI 学习路线 · 深入
Part 12 · LlamaIndex
站 5~7 你用了 LangChain 做 RAG。LlamaIndex 是另一条专攻"数据 + LLM"的路线。
Section 1 · LlamaIndex 是什么 + 装环境
Subsection 1 · 概念
LlamaIndex = 专为"让 LLM 读懂你的数据"设计的框架 - 加载各种数据(PDF/网页/DB/API) - 建索引(Index) - 用查询引擎(Query Engine)问答一句话:LangChain 重"链/Agent 编排",LlamaIndex 重"数据接入/索引检索"Subsection 2 · 装库
cmd:pip install llama-index
Subsection 3 · 跑最小例
新建 li_first.py:
python
import osfrom dotenv import load_dotenvload_dotenv()os.environ["OPENAI_API_KEY"] = os.getenv("DEEPSEEK_API_KEY")os.environ["OPENAI_API_BASE"] = "https://api.deepseek.com"os.environ["OPENAI_MODEL"] = "deepseek-chat"from llama_index.core import VectorStoreIndex, SimpleDirectoryReader# 读文件夹里的文档docs = SimpleDirectoryReader("rag_data").load_data()index = VectorStoreIndex.from_documents(docs)query_engine = index.as_query_engine()print(query_engine.query("迟到会怎么样?"))- 预期看到:基于 company.md 的回答。
- 注意:LlamaIndex 通过 OPENAI_ 环境变量兼容 DeepSeek(OpenAI 兼容协议)。
过关:最小例跑通 = Section 1 完成。
Section 2 · 理解 Index(索引)
Subsection 1 · 跑并打印索引结构
新建 li_index.py:
python
import osfrom dotenv import load_dotenvload_dotenv()os.environ["OPENAI_API_KEY"] = os.getenv("DEEPSEEK_API_KEY")os.environ["OPENAI_API_BASE"] = "https://api.deepseek.com"os.environ["OPENAI_MODEL"] = "deepseek-chat"from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.core.node_parser import SimpleNodeParserdocs = SimpleDirectoryReader("rag_data").load_data()print("原始文档数:", len(docs))# LlamaIndex 把文档切成"节点 Node"(它叫法不同,本质=chunk)nodes = SimpleNodeParser.from_defaults(chunk_size=200).get_nodes_from_documents(docs)print("切出的节点数:", len(nodes))for n in nodes[:3]: print("-", n.get_text()[:30])- 预期看到:文档被切成节点列表。
- LlamaIndex 术语:Document → Node(带索引)→ VectorStoreIndex。
过关:能说出 Document/Node/Index 关系 = Section 2 完成。
Section 3 · 查询引擎与检索器
Subsection 1 · 拆开看查询流程
新建 li_query.py:
python
import osfrom dotenv import load_dotenvload_dotenv()os.environ["OPENAI_API_KEY"] = os.getenv("DEEPSEEK_API_KEY")os.environ["OPENAI_API_BASE"] = "https://api.deepseek.com"os.environ["OPENAI_MODEL"] = "deepseek-chat"from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderindex = VectorStoreIndex.from_documents(SimpleDirectoryReader("rag_data").load_data())# 1) 只用检索器,看召回什么retriever = index.as_retriever(similarity_top_k=2)nodes = retriever.retrieve("迟到怎么处理")print("召回节点:")for n in nodes: print("-", n.node.get_text()[:40], f"分:{n.score:.3f}")# 2) 完整问答print("\n回答:", index.as_query_engine().query("迟到怎么处理").response)- 预期看到:先召回相关节点,再给出回答。
- 和Part 5 一样:检索 → 生成,只是 LlamaIndex 把索引/检索封装得更"数据友好"。
过关:能拆出"检索器 + 问答"两步 = Section 3 完成。
Section 4 · 换数据源(PDF / 网页)
Subsection 1 · 加载 PDF
cmd:pip install pypdf
新建 li_pdf.py:把任意一个 PDF 放到 rag_data 里,然后:
python
import osfrom dotenv import load_dotenvload_dotenv()os.environ["OPENAI_API_KEY"] = os.getenv("DEEPSEEK_API_KEY")os.environ["OPENAI_API_BASE"] = "https://api.deepseek.com"os.environ["OPENAI_MODEL"] = "deepseek-chat"from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderdocs = SimpleDirectoryReader("rag_data", required_exts=[".pdf"]).load_data()index = VectorStoreIndex.from_documents(docs)print(index.as_query_engine().query("这份PDF讲了什么?").response)- 预期看到:能回答 PDF 内容。
- LlamaIndex 支持几十种数据源(PDF/网页/Notion/数据库),换数据源几乎不改代码。
过关:PDF 问答跑通 = Section 4 完成。
Section 5 · 对比 + 站 10 验收
Subsection 1 · 写对比笔记
LangChain LlamaIndex擅长 链/Agent/编排 数据加载/索引/检索学习曲线 陡(概念多) 平(面向数据)生态 最大 专注 RAG选谁 要 Agent/工具 → 它 纯数据问答/知识库 → 它结论 两者可混用,不必二选一Subsection 2 · Part 12 验收勾选
- li_first.py 跑通
- 能说出 Document / Node / Index 关系
- 能拆出"检索器 + 问答"
- PDF 数据源问答跑通
- 对比笔记写完
全勾选 = Part 12 通过 → 进入下一站 Part 13 · Transformer 深入,10 天,手写注意力)。
