一文读懂LangChain/LangGraph

一文读懂LangChain/LangGraph
引言为什么需要LangChain和LangGraph在人工智能快速发展的今天大语言模型LLM已成为开发者构建智能应用的核心工具。然而直接将LLM接入应用会遇到诸多挑战如何管理复杂的对话流程如何处理多步骤任务如何集成外部工具和数据源LangChain和LangGraph正是为解决这些问题而生的框架。LangChain是一个用于开发由语言模型驱动的应用程序的框架而LangGraph则是构建在LangChain之上的状态机库专门用于创建复杂、有状态的对话和工作流。本文将带你全面了解这两个框架的核心概念、使用场景和实际应用。什么是LangChain核心概念LangChain是一个开源框架旨在简化基于大语言模型的应用程序开发。它提供了一套标准化的接口和组件让开发者能够更轻松地构建复杂的LLM应用。主要组件包括模型Models支持多种LLM提供商OpenAI、Anthropic、Google等提示词Prompts模板化和管理提示词链Chains将多个LLM调用组合成序列记忆Memory在对话中保持状态索引Indexes与外部数据源集成代理Agents让LLM决定使用哪些工具基本使用示例fromlangchain.llmsimportOpenAIfromlangchain.promptsimportPromptTemplatefromlangchain.chainsimportLLMChain# 初始化LLMllmOpenAI(temperature0.7)# 创建提示词模板promptPromptTemplate(input_variables[product],template为{product}写一段营销文案突出其三个主要特点。)# 创建链chainLLMChain(llmllm,promptprompt)# 运行链resultchain.run(智能手表)print(result)什么是LangGraph从LangChain到LangGraph虽然LangChain的链Chains可以处理简单的线性流程但在面对复杂、有分支、有循环的工作流时显得力不从心。LangGraph应运而生它引入了图Graph的概念让开发者能够构建任意复杂度的状态机。LangGraph的核心优势支持循环和条件分支明确的状态管理可视化工作流更好的错误处理和重试机制状态机概念在LangGraph中每个节点代表一个处理步骤边代表状态转移。这种设计模式特别适合多轮对话系统复杂决策流程需要外部工具调用的任务需要人工干预的工作流LangGraph的核心组件1. 状态State状态是一个字典在整个图执行过程中传递和更新。你可以定义状态的类型注解来获得更好的类型检查。fromtypingimportTypedDict,Annotatedfromtyping_extensionsimportTypedDictimportoperatorclassState(TypedDict):messages:Annotated[list,operator.add]# 消息列表topic:str# 当前话题step:int# 当前步骤2. 节点Nodes节点是执行具体任务的函数接收状态作为输入返回更新后的状态。defgenerate_response(state:State)-State:生成AI回复的节点# 获取最新用户消息last_messagestate[messages][-1]# 调用LLM生成回复responsellm.invoke(f用户说{last_message}\n请回复)# 更新状态state[messages].append({role:assistant,content:response})state[step]1returnstate3. 边Edges边定义了节点之间的流转条件可以是固定的也可以是基于状态的动态条件。defshould_continue(state:State)-str:决定下一步走向哪个节点ifstate[step]5:returnend# 结束对话elif帮助instate[messages][-1][content]:returnhelp_node# 转到帮助节点else:returngenerate_response# 继续生成回复4. 图Graph将节点和边组合成完整的图结构。fromlanggraph.graphimportStateGraph,END# 创建图构建器workflowStateGraph(State)# 添加节点workflow.add_node(generate_response,generate_response)workflow.add_node(help_node,provide_help)workflow.add_node(human_input,get_human_input)# 设置入口点workflow.set_entry_point(generate_response)# 添加条件边workflow.add_conditional_edges(generate_response,should_continue,{end:END,help_node:help_node,generate_response:generate_response})# 添加固定边workflow.add_edge(help_node,generate_response)# 编译图appworkflow.compile()实际应用场景场景一智能客服系统fromlanggraph.graphimportStateGraph,ENDfromtypingimportTypedDict,AnnotatedimportoperatorclassChatState(TypedDict):messages:Annotated[list,operator.add]user_query:strcontext:listrequires_human:booldefclassify_intent(state:ChatState):分类用户意图# 使用LLM判断用户意图intentllm.classify(state[user_query])state[intent]intentreturnstatedefretrieve_knowledge(state:ChatState):检索相关知识ifstate[intent]technical:# 从知识库检索docsvectorstore.similarity_search(state[user_query])state[context]docsreturnstatedefgenerate_answer(state:ChatState):生成回答responsellm.generate_with_context(querystate[user_query],contextstate[context])state[messages].append({role:assistant,content:response})returnstatedefescalate_to_human(state:ChatState):转接人工state[requires_human]Truereturnstate# 构建客服图workflowStateGraph(ChatState)workflow.add_node(classify,classify_intent)workflow.add_node(retrieve,retrieve_knowledge)workflow.add_node(answer,generate_answer)workflow.add_node(escalate,escalate_to_human)workflow.set_entry_point(classify)workflow.add_edge(classify,retrieve)workflow.add_edge(retrieve,answer)workflow.add_edge(answer,END)# 条件边如果用户不满意转人工workflow.add_conditional_edges(answer,lambdas:escalateifs.get(dissatisfied,False)elseEND,{escalate:escalate,END:END})场景二数据分析工作流是否是否用户输入分析需求需求解析与澄清需求是否明确数据查询与获取进一步询问用户数据预处理分析执行结果可视化报告生成交付用户用户是否满意任务完成调整分析参数最佳实践1. 状态设计原则保持状态简洁只存储必要的信息使用类型注解提高代码可读性和可维护性考虑状态持久化对于长时间运行的工作流2. 错误处理defsafe_node_function(state:State):带错误处理的节点函数try:# 主要逻辑resultsome_operation(state)state[result]result state[error]NoneexceptExceptionase:# 错误处理state[error]str(e)state[should_retry]Truereturnstatedefretry_logic(state:State):重试逻辑ifstate.get(should_retry,False)andstate.get(retry_count,0)3:state[retry_count]state.get(retry_count,0)1returnprevious_node# 返回上一个节点重试else:returnerror_handler# 转到错误处理节点3. 性能优化并行执行对于独立的节点考虑并行处理缓存机制缓存昂贵的LLM调用结果流式输出对于长文本生成使用流式响应常见问题解答Q1: LangChain和LangGraph有什么区别LangChain更像是一个工具箱提供了构建LLM应用所需的各种组件。LangGraph则是一个专门用于构建复杂工作流的框架特别擅长处理有状态、多步骤、有分支的任务。Q2: 什么时候应该使用LangGraph当你需要多轮对话系统复杂决策流程需要循环或条件分支的任务可视化工作流更好的状态管理Q3: 学习曲线如何如果你已经熟悉Python和基本的LLM概念LangChain的学习曲线相对平缓。LangGraph需要理解状态机和图的概念但官方文档和示例非常丰富。Q4: 生产环境注意事项做好错误处理和重试机制监控和日志记录状态持久化考虑性能测试和优化