
在大模型应用开发中,如何高效地利用私有数据、编排复杂任务以及管理多轮对话状态是三个核心挑战。LlamaIndex、LangChain和LangGraph分别针对这三个挑战提供了专业解决方案。今天我们将深度解析这三个框架的架构设计、核心细节,并通过实战案例展示如何协同使用它们构建强大的LLM应用。
在 LLM 应用开发链路中,LlamaIndex、LangChain 与 LangGraph 形成了 “数据处理 - 基础编排 - 复杂流程” 的全链路支撑体系,三者互补共生而非替代关系:
三者协同逻辑可概括为:LlamaIndex 解决LLM 如何获取私有数据,LangChain 解决LLM 如何整合基础工具与流程,LangGraph 解决LLM 如何完成复杂、可控的业务流程,共同构成从数据接入到业务落地的完整技术闭环。

基础概念:数据连接专家,专注于数据索引和检索,为LLM提供外部知识接入能力。 核心理念:解决"LLM知识断层"问题,专注于构建外部知识到LLM的桥梁。 设计原则:
基础概念:编排协调大师,提供模块化组件和链式编排,简化LLM应用的开发流程。 核心理念:解决"AI能力碎片化"问题,提供统一的组件化编程接口。 设计原则:
基础概念:状态流程管家,基于状态图的工作流管理,特别适合多轮对话和复杂任务。 核心理念:解决"复杂工作流管理"问题,将状态驱动与图计算结合。 设计原则:
LlamaIndex的核心目标是将私有数据与LLM连接。其架构分为以下几个层次:
核心定位不是数据工具,而是帮 LLM 搭建专属知识库的管理员。

流程说明:
LangChain是一个用于开发LLM应用的框架,通过提供模块化组件和链式编排,简化了LLM应用的开发。其核心设计理念是将LLM应用开发分解为多个可复用的组件,并通过链(Chain)将这些组件连接起来。
核心定位不是框架,而是给 LLM 配 “手脚” 和 “简单工作流程” 的平台。

流程说明:
LangChain的核心是链(Chain),它允许将多个组件连接起来。链可以是简单的线性链,也可以是复杂的分支链。
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("智能手机")代理使用LLM来决定采取哪些行动,行动可以是使用工具、观察结果,然后重复直到完成。
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("今天北京的天气怎么样?")LangGraph是建立在LangChain之上的一个库,用于构建有状态、多参与者的工作流。其核心概念是图(Graph),图中的节点代表步骤,边代表步骤之间的流转。LangGraph特别适合需要循环、多轮对话和复杂状态管理的应用。
核心定位不是Chain的升级版,而是给 LLM 配决策大脑,应对需要 “循环、协作、回溯” 的复杂场景。

流程说明:
LangGraph中的状态是一个字典,可以在节点之间传递和修改。状态的设计是灵活的,可以根据应用需求定义。
from typing import TypedDict, List
class ConversationState(TypedDict):
messages: List[str]
needs_clarification: bool
clarification_question: strLangGraph支持循环,通过条件边(conditional edge)来实现。条件边根据当前状态决定下一个节点。
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()构建支持多轮对话的企业知识库智能助手,具备以下能力:
3.1 LlamaIndex 构建知识库索引
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)3.2 LangChain 封装工具与记忆组件
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")3.3 LangGraph 构建复杂流程
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"])
组合建议:
LlamaIndex、LangChain 与 LangGraph 作为 LLM 应用开发的核心工具,分别聚焦 “数据处理”“基础编排”“复杂流程” 三大核心环节,形成了互补共生的技术体系。LlamaIndex 解决了 LLM 访问私有数据的核心痛点,LangChain 提供了灵活的组件化开发框架,LangGraph 则填补了复杂流程编排的能力空白。
在实际开发中,我们需根据业务场景的复杂度选择合适的工具组合:
随着 LLM 技术的不断发展,三者的生态将持续完善,为更广泛的业务场景提供支撑。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。