大模型应用:LlamaIndex、LangChain 与 LangGraph 细节深度、协同应用.24

一、引言

在大模型应用开发中,如何高效地利用私有数据、编排复杂任务以及管理多轮对话状态是三个核心挑战。LlamaIndex、LangChain和LangGraph分别针对这三个挑战提供了专业解决方案。今天我们将深度解析这三个框架的架构设计、核心细节,并通过实战案例展示如何协同使用它们构建强大的LLM应用。

在 LLM 应用开发链路中,LlamaIndex、LangChain 与 LangGraph 形成了 "数据处理 - 基础编排 - 复杂流程" 的全链路支撑体系,三者互补共生而非替代关系:

  • LlamaIndex:聚焦私有数据接入LLM的数据层,核心价值是让 LLM 高效、精准地访问和理解私有文档、数据库等非结构化/结构化数据,是 LLM 的私有数据引擎;
  • LangChain:定位通用 LLM 应用开发框架,覆盖从输入处理、工具调用到输出生成的全链路基础能力,核心价值是整合LLM与各类工具/组件,是LLM应用的基础脚手架;
  • LangGraph:作为 LangChain 生态的子项目,专注有状态、可循环的复杂流程编排,核心价值是解决多智能体协作、任务重试、状态持久化等高级场景需求,是 LangChain 基础编排能力的进阶引擎。

三者协同逻辑可概括为:LlamaIndex 解决LLM 如何获取私有数据,LangChain 解决LLM 如何整合基础工具与流程,LangGraph 解决LLM 如何完成复杂、可控的业务流程,共同构成从数据接入到业务落地的完整技术闭环。

二、三大框架概述

1. LlamaIndex

基础概念: 数据连接专家,专注于数据索引和检索,为LLM提供外部知识接入能力。
核心理念: 解决"LLM知识断层"问题,专注于构建外部知识到LLM的桥梁。
设计原则:

  • 以数据为中心:一切围绕如何高效组织、索引和检索数据
  • 检索优化导向:强调召回率和准确率的平衡
  • 查询模式多样化:支持语义检索、关键词检索、混合检索等
  • 轻量级封装:对LLM保持透明,不强制绑定特定模型

2. LangChain

基础概念: 编排协调大师,提供模块化组件和链式编排,简化LLM应用的开发流程。
核心理念: 解决"AI能力碎片化"问题,提供统一的组件化编程接口。
设计原则:

  • 模块化设计:每个功能独立封装,可插拔替换
  • 链式组合:通过管道式连接实现复杂逻辑
  • 工具优先:将外部能力(API、数据库、函数)工具化
  • 标准化接口:统一输入输出格式,降低集成成本

3. LangGraph

基础概念: 状态流程管家,基于状态图的工作流管理,特别适合多轮对话和复杂任务。
核心理念: 解决"复杂工作流管理"问题,将状态驱动与图计算结合。
设计原则:

  • 显式状态管理:所有状态变化可见、可追踪
  • 图结构思维:将业务流程建模为有向图
  • 循环与分支:原生支持条件判断和迭代优化
  • 持久化优先:内置检查点、恢复和版本管理

三、LlamaIndex详解

1. 架构设计

LlamaIndex的核心目标是将私有数据与LLM连接。其架构分为以下几个层次:

  • 数据连接层:支持多种数据源(文档、数据库、API等)的数据加载。
  • 索引层:将原始数据转换为结构化索引,便于快速检索。
  • 检索层:根据查询从索引中提取相关上下文。
  • 查询接口层:将检索到的上下文与用户查询结合,生成LLM可理解的提示。

核心定位不是数据工具,而是帮 LLM 搭建专属知识库的管理员。

  • 解决痛点:LLM 自带 "公共知识",但对你的 PDF、企业文档等私有数据一无所知。
  • 核心逻辑:把零散数据(文档、数据库等)整理成 "索引目录",当 LLM 需要回答相关问题时,快速找出对应的 "参考书页码",让 LLM 基于这些私有信息作答。
  • 关键动作:只做 "数据加载→分割→建索引→精准检索",不涉及复杂逻辑编排,专注把 "私有数据" 变成 LLM 能直接用的 "上下文素材"。

2. 核心组件

  • **数据加载器(Loader):**支持 PDF、CSV、Notion、数据库等数百种数据源,核心接口为BaseLoader,开发者可通过自定义 Loader 适配特殊数据源,如医疗领域的专用文档格式。
  • **文档处理(Document Processing):**包含文本分割器(Text Splitter)与节点构建(Node Construction)。默认采用RecursiveCharacterTextSplitter按字符递归分割文本,支持自定义分割长度与重叠率,避免语义断裂;将分割后的文本块转化为 "节点(Node)",包含文本内容、元数据及关联信息,为后续检索优化提供基础。
  • 索引(Index): 核心是将节点数据转化为可高效检索的结构,支持多种索引类型:
    • 向量索引(VectorStoreIndex):最常用类型,将节点转化为向量存储(支持 Milvus、Chroma 等向量数据库),通过语义相似度匹配检索;
    • 树形索引(TreeIndex):适合文档摘要场景,按层级结构组织节点,支持自上而下的摘要生成;
    • 关键词索引(KeywordTableIndex):基于关键词匹配检索,适合精确匹配场景。
    • 通过VectorStoreIndex.from_documents(documents)快速构建向量索引,实现私有数据的语义检索。
  • **检索器(Retriever):**从索引中获取与查询相关的节点,核心参数similarity_top_k控制返回结果数量,如设置为 5 表示返回最相似的 5 个节点。支持自定义检索策略,如结合向量检索与关键词检索的混合检索模式,提升检索精准度。
  • **查询引擎(Query Engine):**端到端的 RAG 入口,整合检索器与 LLM,支持 "检索→提示词构建→LLM 生成" 的自动化流程。通过RetrieverQueryEngine可自定义检索器配置,满足不同场景的检索需求。

3. 工作流程

流程说明:

    1. 从原始数据开始,通过文档加载器转换为文档对象。
    1. 文档分割器将文档分割成更小的节点。
    1. 节点用于构建索引,索引可以持久化存储。
    1. 当收到查询时,检索器从索引中检索相关节点。
    1. 响应合成器将检索到的节点和查询组合,发送给LLM生成答案。

4. 索引类型

  • 向量存储索引:将节点转换为向量嵌入,使用相似度搜索进行检索。适用于语义搜索。
  • 列表索引:将节点存储为顺序列表,按顺序检索。适用于需要按顺序处理文档的场景。
  • 树状索引:将节点组织成树状结构,允许从粗粒度到细粒度的检索。适用于层次化文档。
  • 关键词表索引:提取关键词,建立倒排索引。适用于关键词检索。

5. 高级特性

  • 递归检索:先检索粗粒度节点,再进一步检索细粒度节点。
  • 响应合成模式:包括树总结、精炼、简单汇总等模式,控制如何将检索到的节点合成为答案。
  • 多模态索引:支持图像和文本的混合索引。
  • 检索优化:支持检索重排序,通过 Cross-Encoder 模型对初始检索结果二次排序;多索引融合,可以同时调用向量索引与树形索引,提升检索精准度;
  • 数据隐私保障:支持与本地向量数据库集成,或通过 Ollama 对接本地大模型,实现全链路私有化部署,避免数据泄露;
  • 轻量级集成:提供简洁的 API 接口,一行代码即可完成索引构建与查询,适合快速原型开发。

四、LangChain详解

1. 架构设计

LangChain是一个用于开发LLM应用的框架,通过提供模块化组件和链式编排,简化了LLM应用的开发。其核心设计理念是将LLM应用开发分解为多个可复用的组件,并通过链(Chain)将这些组件连接起来。

核心定位不是框架,而是给 LLM 配 "手脚" 和 "简单工作流程" 的平台。

  • 解决痛点:LLM 只会想和说,不会主动用计算器、查 API、读数据库,也不会按步骤完成多任务。
  • 核心逻辑:一方面封装了各种 "工具"(搜索、数据库、API 等),让 LLM 能调用;另一方面提供 "流水线"(Chain),把 "调用工具→处理结果→生成回答" 等步骤串起来,让 LLM 按固定逻辑干活。
  • 关键动作:不专注某一环节,而是做 "组件整合"

2. 核心组件

  • **模型(Models):**封装各类 LLM,如主流的OpenAI、Qwen、Llama3、嵌入模型OpenAI Embeddings、BERT 等与输出解析器。支持本地模型集成,如通过 Ollama 调用 Llama3.1,适配私有化部署场景。
  • **提示词(Prompts):**提供提示词模板(Prompt Template)、示例选择器(Example Selector)等工具,支持动态注入上下文与参数。例如参考案例中通过ChatPromptTemplate定义智能客服的系统提示词,动态传入检索到的知识库内容。
  • 链(Chains): 将多个组件串联为执行流程,核心类型包括:
    • 顺序链(SequentialChain):按固定顺序执行组件;
    • 检索链(RetrievalQAChain):整合检索器与 LLM,实现基础 RAG 能力;
    • 自定义链(Custom Chain):通过Runnable接口组合组件,支持复杂逻辑编排。参考案例中通过RunnablePassthrough传递用户输入,将 LlamaIndex 的检索结果与 LLM 调用串联为完整链路。
  • **代理(Agents):**让 LLM 自主决策调用工具,核心基于 ReAct 框架(思考 - 行动 - 观察)。支持多种代理类型,如ChatConversationalAgent,可对接数千种第三方工具,如搜索引擎、数据库、API 等。
  • **记忆(Memory):**维护对话上下文或任务状态,核心类型包括ConversationBufferMemory(保存完整对话历史)、ConversationSummaryMemory(保存对话摘要)等,支持多轮对话场景。
  • **工具(Tools):**封装外部系统能力,开发者可通过BaseTool接口自定义工具,如对接企业内部订单查询 API。可以通过自定义工具将 LlamaIndex 的检索能力集成到 LangChain 的代理流程中。

3. 工作流程

流程说明:

    1. 用户输入进入检索器,检索相关文档。
    1. 检索到的文档与用户输入一起填入提示模板。
    1. 填充后的提示发送给LLM。
    1. LLM的响应经过输出解析器处理,得到结构化答案。

4. 链式编排

LangChain的核心是链(Chain),它允许将多个组件连接起来。链可以是简单的线性链,也可以是复杂的分支链。

python 复制代码
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

prompt = PromptTemplate(
    input_variables=["product"],
    template="为以下产品写一个广告语:{product}",
)

chain = LLMChain(llm=OpenAI(), prompt=prompt)
chain.run("智能手机")

5. 代理和工具

代理使用LLM来决定采取哪些行动,行动可以是使用工具、观察结果,然后重复直到完成。

python 复制代码
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("今天北京的天气怎么样?")

6. 技术特点

  • 生态兼容性:支持与主流向量数据库(Milvus、Pinecone、Chroma)、图数据库(Neo4j)、大模型管理工具(Ollama)等集成,覆盖各类技术栈;
  • 低代码开发:提供大量开箱即用的组件与模板,降低复杂 LLM 应用的开发门槛;
  • 多场景适配:支持云部署与本地部署,兼顾商业应用与隐私敏感场景,如医疗、金融。

五、LangGraph详解

1. 架构设计

LangGraph是建立在LangChain之上的一个库,用于构建有状态、多参与者的工作流。其核心概念是图(Graph),图中的节点代表步骤,边代表步骤之间的流转。LangGraph特别适合需要循环、多轮对话和复杂状态管理的应用。

核心定位不是Chain的升级版,而是给 LLM 配决策大脑,应对需要 "循环、协作、回溯" 的复杂场景。

  • 解决痛点:LangChain 的流水线是线性的,遇到需要 "重试(比如检索结果不好重新查)、多角色分工(比如检索员 + 审核员)、长期跟踪(比如客户工单处理)" 的场景就失灵。
  • 核心逻辑:把任务拆成多个角色节点,比如检索节点、评估节点、生成节点,用图结构定义节点间的跳转规则,比如评估不通过就回退到检索节点,让 LLM 能像项目经理一样指挥流程推进。
  • 关键动作:不新增基础组件,而是复用LangChain的工具和LlamaIndex的检索能力,只负责复杂流程的编排与状态管理。

2. 核心概念

  • **状态(State):**存储流程执行过程中的所有数据,如用户问题、检索结果、中间生成内容,支持自定义状态结构。通过状态快照机制,在每个节点执行前创建状态快照,防止状态污染;每个节点仅能访问其声明的状态字段,实现节点级状态隔离。与传统集中式状态管理相比,LangGraph 的状态管理更灵活,扩展性更强,无需额外同步机制即可保障状态一致性。
  • **节点(Node):**流程的执行单元,可封装 LLM 调用、工具调用、数据处理等逻辑,如检索节点、生成节点、评估节点。支持自定义节点函数,接收状态输入并输出更新后的状态。
  • 边(Edge): 定义节点间的跳转规则,支持固定跳转、条件跳转与动态跳转:
    • 固定跳转:从一个节点直接跳转到另一个节点,如检索节点到评估节点;
    • 条件跳转:根据状态内容动态决定跳转路径,如评估节点根据检索结果是否足够,跳转到生成节点或调整检索节点;
    • 动态跳转:通过 LLM 决策生成跳转路径,如多智能体场景中,由 LLM 决定下一个执行节点。
  • **图(Graph):**将节点与边的定义编译为可执行流程,支持异步执行与并发控制。在编译阶段,系统会分析状态依赖关系并优化执行路径,避免状态冲突。

3. 工作流程

流程说明:

    1. 从开始节点,接收用户输入。
    1. 将用户输入添加到对话历史中。
    1. 调用LLM,根据对话历史生成响应。
    1. 判断是否需要更多信息,如果需要,则进入澄清节点,然后回到接收输入;如果不需要,则生成回答。
    1. 更新状态,结束本轮对话。

4. 状态管理

LangGraph中的状态是一个字典,可以在节点之间传递和修改。状态的设计是灵活的,可以根据应用需求定义。

python 复制代码
from typing import TypedDict, List

class ConversationState(TypedDict):
    messages: List[str]
    needs_clarification: bool
    clarification_question: str

5. 循环和条件边

LangGraph支持循环,通过条件边(conditional edge)来实现。条件边根据当前状态决定下一个节点。

python 复制代码
from langgraph.graph import StateGraph, END

# 定义状态
class State(TypedDict):
    value: int

# 定义节点
def increment(state: State):
    return {"value": state["value"] + 1}

# 定义条件边函数
def should_continue(state: State):
    if state["value"] < 5:
        return "increment"
    else:
        return END

# 构建图
workflow = StateGraph(State)
workflow.add_node("increment", increment)
workflow.set_entry_point("increment")
workflow.add_conditional_edges("increment", should_continue)

# 编译
app = workflow.compile()

6. 技术特点

  • 流程可控性:支持循环、重试、回退等复杂流程逻辑,如检索结果不足时重新调整检索条件并再次检索,解决了 LangChain 原生 Chain 无法处理的非线性流程问题;
  • 多智能体协作:通过多节点分工,如 "检索员节点 + 分析师节点 + 审核员节点",实现多智能体的协同工作,适配复杂业务场景;
  • 状态持久化:支持将状态存储到外部数据库,实现流程中断后恢复、跨会话状态共享等高级需求;
  • 完全兼容 LangChain:可直接复用 LangChain 的模型、工具、记忆等组件,无需重复开发。

六、协调示例:企业知识库智能助手构建

1. 需求场景

构建支持多轮对话的企业知识库智能助手,具备以下能力:

  • 检索企业私有文档(PDF、Word);
  • 记忆对话上下文;
  • 检索结果不足时自动调整检索条件重试;
  • 生成回答前进行准确性审核。

2. 分工协作

  • LlamaIndex:负责文档加载、索引构建与高精度检索,通过VectorStoreIndex构建企业知识库索引,VectorIndexRetriever实现语义检索;
  • LangChain:负责记忆管理与工具封装,通过ConversationBufferMemory维护对话上下文,自定义 Tool 封装 LlamaIndex 的检索能力;
  • LangGraph:负责复杂流程编排,构建 "检索→评估→生成→审核" 的非线性流程,支持检索重试与条件跳转。

3. 代码分解

3.1 LlamaIndex 构建知识库索引

python 复制代码
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.retrievers import VectorIndexRetriever

# 加载企业知识库文档(PDF/Word等)
documents = SimpleDirectoryReader("./knowledge").load_data()
# 构建向量索引
index = VectorStoreIndex.from_documents(documents)
# 初始化检索器(返回最相似的5个结果)
retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
  • 通过SimpleDirectoryReader加载本地文档,VectorStoreIndex将文档转化为向量存储,VectorIndexRetriever配置检索参数,为后续精准检索提供基础。

3.2 LangChain 封装工具与记忆组件

python 复制代码
from langchain_core.tools import Tool
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI

# 封装LlamaIndex检索器为LangChain工具
def retrieve_context(query):
    response = retriever.retrieve(query)
    return [doc.node.text for doc in response]

retrieval_tool = Tool(
    name="企业知识库检索",
    func=retrieve_context,
    description="用于回答关于公司制度、产品手册、业务流程的问题"
)

# 初始化记忆组件(维护对话上下文)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 初始化LLM(支持本地模型替换)
llm = ChatOpenAI(model="deepseek-v3")
  • 将 LlamaIndex 检索器封装为 LangChain 工具,便于 LangGraph 调用;
  • ConversationBufferMemory保存对话历史,支持多轮对话上下文关联。

3.3 LangGraph 构建复杂流程

python 复制代码
from langgraph.graph import StateGraph, END
from langchain_core.prompts import ChatPromptTemplate

# 定义流程状态结构
class GraphState(dict):
    question: str
    chat_history: list
    retrieval_results: list
    answer: str
    need_retry: bool

# 定义核心节点逻辑
# 节点1:检索节点(调用LlamaIndex检索工具)
def retrieve_node(state: GraphState):
    results = retrieve_context(state["question"])
    return {**state, "retrieval_results": results, "need_retry": False}

# 节点2:评估节点(判断检索结果是否足够)
def evaluate_node(state: GraphState):
    prompt = ChatPromptTemplate.from_messages([
        ("system", "判断检索结果是否足够回答用户问题,仅返回true/false"),
        ("user", "问题:{question}\n检索结果:{retrieval_results}")
    ])
    evaluation = llm.invoke(prompt.format(
        question=state["question"],
        retrieval_results=str(state["retrieval_results"])
    )).content
    return {**state, "need_retry": evaluation.lower() == "false"}

# 节点3:生成节点(基于检索结果生成回答)
def generate_node(state: GraphState):
    prompt = ChatPromptTemplate.from_messages([
        ("system", "基于检索结果和对话上下文回答问题,仅使用检索结果中的信息"),
        ("user", "上下文:{chat_history}\n问题:{question}\n检索结果:{retrieval_results}")
    ])
    answer = llm.invoke(prompt.format(
        chat_history=state["chat_history"],
        question=state["question"],
        retrieval_results=str(state["retrieval_results"])
    )).content
    return {**state, "answer": answer}

# 节点4:调整检索条件节点(重试用)
def adjust_retrieval_node(state: GraphState):
    prompt = ChatPromptTemplate.from_messages([
        ("system", "为用户问题扩展同义词,生成更精准的检索关键词"),
        ("user", "原问题:{question}")
    ])
    new_question = llm.invoke(prompt.format(question=state["question"])).content
    return {**state, "question": new_question}

# 构建图流程
graph_builder = StateGraph(GraphState)
graph_builder.add_node("retrieve", retrieve_node)
graph_builder.add_node("evaluate", evaluate_node)
graph_builder.add_node("generate", generate_node)
graph_builder.add_node("adjust_retrieval", adjust_retrieval_node)

# 定义流程跳转规则
graph_builder.set_entry_point("retrieve")
graph_builder.add_edge("retrieve", "evaluate")
# 条件跳转:检索结果不足则调整后重试,足够则生成回答
graph_builder.add_conditional_edges(
    "evaluate",
    lambda state: "adjust_retrieval" if state["need_retry"] else "generate",
    {"adjust_retrieval": "retrieve", "generate": END}
)

# 编译并运行流程
app = graph_builder.compile()
result = app.invoke({
    "question": "公司2025年年假制度有哪些调整?",
    "chat_history": memory.load_memory_variables({})["chat_history"],
    "retrieval_results": [],
    "answer": "",
    "need_retry": False
})
print("最终回答:", result["answer"])
  • 通过 LangGraph 构建非线性流程,实现 "检索→评估→重试 / 生成" 的闭环;
  • 状态对象全程跟踪流程数据,确保各节点间数据同步;
  • 条件跳转规则支持检索结果不足时的自动重试,提升回答的准确性。

七、协调选择

组合建议:

  • 仅需私有数据问答(无复杂流程):优先选择 LlamaIndex,开发成本低、检索精准度高,适合快速搭建知识库问答系统;
  • 需简单工具集成与线性流程:优先选择 LangChain,组件丰富、生态完善,适合构建基础的工具调用型应用(如单轮问答 + 天气查询);
  • 需复杂流程与多智能体协作:选择 LangChain+LangGraph,LangChain 提供基础组件,LangGraph 负责复杂流程编排,适合企业级复杂应用;
  • 需私有数据 + 复杂流程:选择 LlamaIndex+LangChain+LangGraph,LlamaIndex 处理数据检索,LangChain 管理工具与记忆,LangGraph 编排复杂流程,实现 "数据 - 工具 - 流程" 的全链路覆盖。

八、总结

LlamaIndex、LangChain 与 LangGraph 作为 LLM 应用开发的核心工具,分别聚焦 "数据处理""基础编排""复杂流程" 三大核心环节,形成了互补共生的技术体系。LlamaIndex 解决了 LLM 访问私有数据的核心痛点,LangChain 提供了灵活的组件化开发框架,LangGraph 则填补了复杂流程编排的能力空白。

在实际开发中,wom 需根据业务场景的复杂度选择合适的工具组合:

  • 简单场景可单独使用 LlamaIndex 或 LangChain;
  • 复杂企业级场景则需三者协同,充分发挥各自优势,构建从数据接入到业务落地的完整 LLM 应用系统。

随着 LLM 技术的不断发展,三者的生态将持续完善,为更广泛的业务场景提供支撑。

相关推荐
小程故事多_8015 小时前
LangChain 1.0智能体核心组件全解析:从架构到实战
架构·langchain
AI Echoes1 天前
构建一个LangChain RAG应用
数据库·python·langchain·prompt·agent
加载中3611 天前
LLM基础知识,langchainV1.0讲解(一)
人工智能·langchain
minhuan1 天前
大模型应用:TTA文本驱动音频:MusicGen大模型参数调优+音频情绪可视化.23
大模型应用·musicgen模型应用·tta·文本生成音频
默 语2 天前
Spring-AI vs LangChain4J:Java生态的AI框架选型指南
java·人工智能·spring·ai·langchain·langchain4j·spring-ai
leafff1232 天前
一文了解:智能体大模型LangChain 和 Dify有什么区别?
人工智能·架构·langchain
W_Meng_H2 天前
LangChain Agent - 火山引擎大模型推理与回答的完整流式输出
langchain·火山引擎
华东设计之美2 天前
muti-Agent+RAG+KnowledgeGraph构建智能问诊系统的可行性分析
人工智能·软件开发·rag·大模型应用·增强检索生成
Jack___Xue3 天前
LangChain实战快速入门笔记(三)--LangChain使用之Chains
人工智能·笔记·langchain