LlamaIndex 的演进路线

LlamaIndex 起家于 RAG(检索增强生成),最初的定位是"连接你的数据与 LLM"。但随着 LLM 能力增强,单纯检索已经不够——用户需要 Agent 来动态决定何时检索、如何检索、检索后做什么

版本阶段核心能力定位
0.9 之前Index + Query EngineRAG 框架
0.10+LlamaHub + Workflows数据连接 + 工作流
当前Data Agent + AgentWorkflowRAG + Agent 融合

0.10 是分水岭——LlamaIndex 重构了整个包结构,引入了 Workflow(事件驱动工作流)和 Data Agent,正式从 RAG 框架进化为 Agent 框架。

Data Agent:带检索能力的智能体

LlamaIndex 的 Data Agent = LLM + Tools + 检索能力:

from llama_index.core.agent import FunctionAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.tools import FunctionTool, QueryEngineTool

llm = OpenAI(model="gpt-4o")

# 工具1:网络搜索
def search_web(query: str) -> str:
    """搜索互联网获取最新信息"""
    from llama_index.tools.tavilyi import TavilyToolSpec
    return TavilyToolSpec().search(query)

web_tool = FunctionTool.from_defaults(fn=search_web)

# 工具2:RAG 查询(复用现有索引)
from llama_index.core import VectorStoreIndex

index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=5)

rag_tool = QueryEngineTool.from_defaults(
    query_engine=query_engine,
    name="knowledge_base",
    description="查询内部知识库,包含产品文档和技术规范"
)

# 创建 Data Agent
agent = FunctionAgent(
    tools=[web_tool, rag_tool],
    llm=llm,
    system_prompt="你是一个研究助手。先查内部知识库,找不到再搜网络。"
)

response = await agent.run("我们的API限流策略是什么?和业界最佳实践比如何?")
# Agent会: 1. 先用rag_tool查内部  2. 再用web_tool搜业界实践  3. 综合回答

这是 LlamaIndex 的差异化优势:RAG 不是外部组件,而是 Agent 的原生能力。在 LangChain 里你要手动把 Retriever 包装成 Tool,在 LlamaIndex 里这是内建的。

Agent Worker 与 Agent Runner

LlamaIndex 把 Agent 执行拆为两层:

AgentRunner(外层控制)
  └── AgentWorker(执行单元)
  • AgentRunner:管理 Agent 的执行循环、状态、记忆
  • AgentWorker:负责单步推理——决定下一步动作、执行工具调用
from llama_index.core.agent import ReActAgent

# ReActAgent = AgentRunner + ReActAgentWorker
agent = ReActAgent.from_tools(
    tools=[search_tool, rag_tool, calculator_tool],
    llm=llm,
    verbose=True,
    max_iterations=10,
    # 自定义 AgentWorker 行为
    react_chat_history=True
)

# 也可以分别使用
from llama_index.core.agent import AgentRunner
from llama_index.core.agent import ReActAgentWorker

worker = ReActAgentWorker.from_tools(
    tools=[search_tool, rag_tool],
    llm=llm,
    max_iterations=10
)
agent = AgentRunner(worker)

response = agent.chat("分析我们产品文档中提到的所有API,给出分类表")

这种分离设计的好处:你可以自定义 AgentWorker(如用不同的推理策略),同时复用 AgentRunner 的状态管理和执行循环。

AgentWorkflow:事件驱动工作流

0.10+ 引入的 Workflow 是事件驱动的,类似 LangGraph 的图但用事件机制:

from llama_index.core.workflow import (
    Workflow, step, Event, Context
)

class ResearchEvent(Event):
    query: str

class DraftEvent(Event):
    research_data: str

class ReviewEvent(Event):
    draft: str

class ResearchWorkflow(Workflow):
    @step
    async def research(self, ctx: Context, ev: ResearchEvent) -> DraftEvent:
        results = await rag_tool.run(ev.query)
        web_results = await search_tool.run(ev.query)
        combined = f"内部知识: {results}\n网络资料: {web_results}"
        return DraftEvent(research_data=combined)
    
    @step
    async def draft(self, ctx: Context, ev: DraftEvent) -> ReviewEvent:
        draft = await llm.acomplete(f"基于以下资料写报告:\n{ev.research_data}")
        return ReviewEvent(draft=draft.text)
    
    @step
    async def review(self, ctx: Context, ev: ReviewEvent) -> str:
        review = await llm.acomplete(f"审核以下报告,给出修改意见或通过:\n{ev.draft}")
        return review.text

workflow = ResearchWorkflow(timeout=120)
result = await workflow.run(ResearchEvent(query="AI Agent框架对比分析"))

RAG + Agent 融合模式

LlamaIndex 最强的场景是 RAG 和 Agent 的深度融合:

模式1:Agentic RAG

传统 RAG 是"检索 → 生成"的单步流程。Agentic RAG 让 Agent 决定检索策略

# Agent 自主决定是否需要检索、检索几次、如何组合结果
agent = FunctionAgent(
    tools=[rag_tool_multi_index],  # 多个知识库索引
    llm=llm,
    system_prompt="""你是知识库研究助手。
对每个问题:
1. 先判断需要查哪些知识库
2. 分别检索,评估结果质量
3. 如果信息不足,换关键词重新检索
4. 综合所有信息回答"""
)

模式2:多索引路由

from llama_index.core.tools import QueryEngineTool

# 三个不同领域的索引
product_index = VectorStoreIndex.from_documents(product_docs)
api_index = VectorStoreIndex.from_documents(api_docs)
faq_index = VectorStoreIndex.from_documents(faq_docs)

tools = [
    QueryEngineTool.from_defaults(
        query_engine=product_index.as_query_engine(),
        name="product_docs",
        description="产品功能文档和用户指南"
    ),
    QueryEngineTool.from_defaults(
        query_engine=api_index.as_query_engine(),
        name="api_docs", 
        description="API参考文档,含请求/响应格式"
    ),
    QueryEngineTool.from_defaults(
        query_engine=faq_index.as_query_engine(),
        name="faq",
        description="常见问题解答"
    ),
]

agent = FunctionAgent(
    tools=tools,
    llm=llm,
    system_prompt="根据问题选择合适的知识库查询,可同时查多个。"
)

模式3:迭代检索

def iterative_research(query: str, max_rounds: int = 3) -> str:
    """Agent 迭代检索:每轮根据前一轮结果决定下一步"""
    agent = FunctionAgent(
        tools=[rag_tool, web_tool],
        llm=llm,
        system_prompt=f"""执行迭代研究,最多{max_rounds}轮:
每轮:1.回顾已知信息 2.找出信息缺口 3.检索补充 4.判断是否足够
信息足够时输出 FINAL: 答案"""
    )
    return agent.chat(query)

与 LangChain 对比

维度LlamaIndexLangChain
RAG 能力原生,索引/检索/后处理完善需组合 Retriever + Chain
Agent 能力FunctionAgent/ReActAgentAgentExecutor/LangGraph
工作流Workflow(事件驱动)LangGraph(图结构)
数据连接LlamaHub 300+ 数据源Loader 数量更多
Agent+RAG原生融合,QueryEngineTool需手动包装
控制流事件驱动,中等灵活LangGraph 最灵活
社区中等最大

LlamaIndex 的优势

  1. RAG 最成熟:从文档解析到索引构建到检索后处理,全链路覆盖
  2. Agent-RAG 融合自然:QueryEngineTool 让 RAG 成为 Agent 的原生能力
  3. LlamaHub 生态:300+ 数据连接器,企业数据接入方便
  4. Workflow 简洁:事件驱动比图结构更容易理解

LlamaIndex 的劣势

  1. Agent 控制流不如 LangGraph 精细:条件分支、循环、检查点
  2. 没有内置检查点:长流程无法恢复
  3. Human-in-the-loop 支持弱:没有 LangGraph 的 interrupt 机制
  4. 版本稳定性:0.10 重构后 API 变化大,早期代码需要迁移

实战建议

  1. RAG 为主 + 轻量 Agent → LlamaIndex:如果核心需求是智能检索,Agent 只是辅助
  2. 复杂 Agent 工作流 → LangGraph:如果需要精确控制流、检查点、Human-in-loop
  3. 混合使用:LlamaIndex 做 RAG 层,LangGraph 做 Agent 编排层
# 混合方案:LangGraph 编排 + LlamaIndex 检索
from llama_index.core import VectorStoreIndex
from langgraph.graph import StateGraph

# LlamaIndex 负责检索
index = VectorStoreIndex.from_documents(docs)
retriever = index.as_retriever()

# LangGraph 负责编排
def retrieve_node(state):
    docs = retriever.retrieve(state["query"])
    return {"context": [d.text for d in docs]}

def generate_node(state):
    response = llm.invoke(f"Context: {state['context']}\nQ: {state['query']}")
    return {"answer": response.content}

结论

LlamaIndex 是 RAG-Agent 融合场景的最佳选择。如果你的应用核心是"让 AI 基于你的数据做事",LlamaIndex 的体验比 LangChain 更顺滑。但如果 Agent 控制流是主要复杂度来源,LangGraph 更合适。

一句话:LlamaIndex 把 RAG 做到了极致,然后自然地延伸到 Agent——它让检索成为 Agent 的本能,而不是外加的技能。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。