前情回顾

在上一篇文章中,我们见识了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学习之旅画上一个完美的句号!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐