RAG 每日一技(十五):换个“引擎”看世界——以数据为中心的LlamaIndex
RAG框架不止LangChain!本文带你认识另一大巨头:以数据为中心的LlamaIndex。学习它与LangChain在哲学上的不同,并体验其极致的便捷性——只需3行核心代码,即可构建一个从数据加载到查询的完整RAG应用!
前情回顾
在上一篇文章中,我们见识了LangChain作为“编排框架”的强大之处。它像一个乐高桶,提供了无数标准化的零件和灵活的“链条”,让我们可以自由地组合出任何想要的LLM应用。
但如果我们的目标非常明确,就是且仅仅是构建一个顶级的RAG系统呢?我们是不是还需要自己去手动挑选和组装每一个零件?有没有一个框架,从诞生之初,就是为了RAG而生,把所有关于数据索引、查询的优化都做到了极致?
答案是肯定的。这位选手,就是LlamaIndex。
LangChain vs. LlamaIndex:两种哲学的碰撞
要理解LlamaIndex,最好的方式就是将它与LangChain进行对比:
-
LangChain:一个通用的LLM应用框架。
- 它的核心是“链(Chains)”和“智能体(Agents)”。它关心的是“如何将不同的工具和能力组合起来,完成一个复杂的任务”。RAG只是它能做的众多任务之一。它更像一个全功能的“应用层”**框架。
-
LlamaIndex:一个以数据为中心的LLM框架。
- 它的核心是“数据索引(Data Indexes)”和“查询引擎(Query Engines)”。它从一开始就专注于“如何最高效地将外部数据与LLM连接”。它在数据的索引结构、查询优化等方面做得极为深入。它更像一个专业的“数据层”**框架。
打个比方,如果说LangChain是一个功能齐全的通用IDE,那么LlamaIndex就是一个专门为数据密集型任务优化过的、内置了无数高级数据工具的专业数据IDE。
上手实战:三行核心代码构建一个RAG应用
LlamaIndex最大的魅力之一,就是它提供了极高层次的抽象,让构建一个基础的RAG应用变得异常简单。让我们来见识一下。
首先,安装必要的库:
pip install llama-index llama-index-llms-openai
注:从v0.10.0版本开始,LlamaIndex将库拆分成了多个包,llm的集成需要单独安装。
现在,看好了,我们将用三行核心代码,完成从加载数据到可查询的全过程。
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
# 设置你的OpenAI API Key
# os.environ["OPENAI_API_KEY"] = "sk-..."
# --- 准备工作 ---
# 在你的项目目录下创建一个名为 "data" 的文件夹
# 在 "data" 文件夹里,放入一个名为 "rag_intro.txt" 的文本文件
# 文件内容为:"LlamaIndex是一个以数据为中心的LLM框架,它专注于高效地将外部数据与LLM连接。"
# --- 核心代码开始 ---
# 1. 加载数据
# SimpleDirectoryReader会自动读取指定目录下所有支持的文件
documents = SimpleDirectoryReader("./data").load_data()
# 2. 构建索引 (这是最神奇的一步!)
# 这一行代码背后,LlamaIndex自动完成了:
# - 文本分块 (Chunking)
# - 向量化 (Embedding)
# - 构建索引结构 (Indexing)
index = VectorStoreIndex.from_documents(documents)
# 3. 创建查询引擎
# 查询引擎是与索引进行交互的高级接口
query_engine = index.as_query_engine()
# --- 核心代码结束 ---
# --- 现在,可以开始查询了! ---
response = query_engine.query("LlamaIndex是做什么的?")
print(response)
输出结果(示例):
LlamaIndex是一个以数据为中心的LLM框架,其主要目标是高效地将外部数据与大型语言模型(LLM)进行连接。
代码解读:
这简直不可思议!我们没有手动分块,没有手动初始化Embedding模型,没有手动创建向量数据库,只用了一行 VectorStoreIndex.from_documents(documents)
,LlamaIndex就为我们把这一切都处理好了。
然后通过 index.as_query_engine()
,我们立刻就得到了一个可以直接对话的查询引擎。这种“开箱即用”的体验,正是LlamaIndex以“数据为中心”的哲学所带来的巨大便利。它假设你的主要意图就是处理数据,所以把最常见的流程封装到了极致。
如何选择:LangChain还是LlamaIndex?
- 当你需要最大的灵活性,想要构建包含复杂工具调用、多步骤推理的智能体(Agent)时,LangChain 通常是更好的选择。
- 当你主要聚焦于构建一个高性能的RAG系统,希望利用各种高级的索引结构(如树状索引、关键词表索引)和查询策略时,LlamaIndex 会提供更专业、更便捷的工具。
值得一提的是,如今这两个框架正在深度融合,你完全可以在LangChain中调用LlamaIndex的查询引擎作为工具,也可以在LlamaIndex中集成LangChain的某些模块。最好的方式,是两者都学,根据场景取长补短。
总结与预告
今日小结:
- LlamaIndex 是一个以数据为中心的LLM框架,专为高性能RAG而生。
- 它与LangChain的通用应用框架哲学形成对比,提供了更高层次的抽象和更便捷的开箱即用体验。
- 只需
加载数据
->构建索引
->创建查询引擎
三步,就能快速搭建一个完整的RAG应用。
到今天为止,我们已经学习了从底层原理到高级策略,再到两大主流框架的丰富知识。可以说,理论和代码层面,你已经准备得非常充分了。
现在,只剩下最后一步,也是最能展示你学习成果的一步:如何把我们用代码实现的RAG系统,包装成一个普通用户也能交互的应用程序?
明天预告:RAG 每日一技(十六):终章序曲,为你的RAG穿上“外衣”——Gradio实战
明天,作为本系列核心篇章的最后一讲,我们将学习一个超简单的UI库Gradio,用它来为我们之前构建的RAG引擎制作一个漂亮的Web聊天界面。我们将亲手把代码变成一个可交互、可分享的Demo,为我们的RAG学习之旅画上一个完美的句号!
更多推荐
所有评论(0)