LangChain与LangGraph入门:构建AI工作流实战指南
1. LangChain与LangGraph入门指南构建AI工作流的基础刚接触AI应用开发时我常常遇到这样的困境每个模型都像一座孤岛数据流转需要手动拼接业务逻辑散落在各处脚本里。直到发现了LangChain和LangGraph这对组合才真正实现了从拼凑脚本到设计工作流的转变。这篇文章将带你从零开始用最直接的方式掌握这两个工具的核心用法。2. 核心工具解析与开发环境搭建2.1 LangChain的核心价值LangChain本质上是一个AI应用的胶水框架它解决了三个关键问题组件标准化将提示词模板、模型调用、输出解析等操作封装成可复用的模块流程编排通过Chain的概念串联多个步骤比如先检索文档再生成摘要上下文管理自动维护对话历史、工具调用结果等上下文信息典型使用场景包括构建带记忆的对话机器人实现基于文档的QA系统创建多模型协作的复杂流程2.2 LangGraph的独特优势LangGraph在LangChain基础上增加了循环执行支持while-loop等控制结构条件分支根据模型输出动态选择执行路径并行处理多个节点可以并发执行状态管理全局状态机跟踪流程进度这种能力使得开发以下应用成为可能带自动纠错的对话系统多专家协作的决策流程自适应的内容生成管道2.3 开发环境配置实操推荐使用Python 3.10环境# 创建虚拟环境 python -m venv langchain-env source langchain-env/bin/activate # Linux/Mac langchain-env\Scripts\activate # Windows # 安装核心包 pip install langchain langgraph openai关键配置项import os os.environ[OPENAI_API_KEY] sk-... # 替换为你的API密钥注意实际项目中应该使用环境变量或密钥管理服务不要硬编码在代码中3. 从零构建第一个AI工作流3.1 基础Chain实现让我们实现一个带格式校验的天气查询工具from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI # 定义提示词模板 prompt PromptTemplate( input_variables[city], template请用JSON格式返回{city}的当前天气情况包含temperature、condition和wind_speed字段 ) # 创建Chain llm ChatOpenAI(modelgpt-3.5-turbo) weather_chain LLMChain(llmllm, promptprompt) # 执行Chain result weather_chain.run(北京) print(result)3.2 升级为LangGraph工作流现在扩展为带错误处理的工作流from langgraph.graph import Graph from langchain.schema import StrOutputParser # 定义节点 def fetch_weather(state): try: return weather_chain.run(state[city]) except Exception as e: return {error: str(e)} def validate_output(state): import json try: data json.loads(state[weather]) required [temperature, condition, wind_speed] if all(k in data for k in required): return {status: valid, data: data} return {status: invalid} except: return {status: invalid} # 构建图 workflow Graph() workflow.add_node(fetcher, fetch_weather) workflow.add_node(validator, validate_output) workflow.add_edge(fetcher, validator) workflow.set_entry_point(fetcher) workflow.set_finish_point(validator) # 执行工作流 app workflow.compile() result app.invoke({city: 上海})3.3 调试技巧实录可视化工作流使用workflow.get_graph().draw_mermaid()输出流程图中间结果检查在节点函数中添加print(state)调试错误重试机制用tenacity库添加自动重试逻辑4. 高级模式与性能优化4.1 条件分支实现构建智能路由工作流from langgraph.graph import Graph from langchain.prompts import ChatPromptTemplate classify_prompt ChatPromptTemplate.from_template( 判断用户问题类型仅返回以下选项之一 - weather: 天气相关问题 - news: 新闻咨询 - other: 其他问题 用户输入{input} ) router_chain classify_prompt | ChatOpenAI() | StrOutputParser() def route_based_on_type(state): question_type router_chain.invoke({input: state[query]}) if weather in question_type.lower(): return weather_flow elif news in question_type.lower(): return news_flow else: return general_flow workflow Graph() workflow.add_node(classifier, router_chain) workflow.add_conditional_edges( classifier, route_based_on_type, { weather_flow: weather_chain, news_flow: news_chain, general_flow: general_chain } )4.2 并行执行优化同时处理多个独立任务from langgraph.graph import Graph from concurrent.futures import ThreadPoolExecutor def parallel_fetch(sources): with ThreadPoolExecutor() as executor: return list(executor.map(fetch_data, sources)) workflow Graph() workflow.add_node(gather, parallel_fetch)4.3 性能优化技巧模型选择简单任务用gpt-3.5-turbo复杂分析用gpt-4缓存机制对相同输入缓存模型响应批量处理合并相似请求减少API调用次数5. 生产环境最佳实践5.1 错误处理模式健壮的生产级工作流需要def safe_execute(node_func): def wrapper(state): try: return node_func(state) except Exception as e: print(fError in {node_func.__name__}: {str(e)}) return {error: str(e), node: node_func.__name__} return wrapper workflow.add_node(safe_step, safe_execute(risky_operation))5.2 监控与日志关键指标需要记录每个节点的执行时间模型调用的token消耗异常发生频率推荐集成from prometheus_client import start_http_server, Counter api_errors Counter(api_errors, Number of API errors) def monitored_node(state): try: # ...业务逻辑 except: api_errors.inc()5.3 部署方案选择根据场景选择轻量级FastAPI Uvicorn高可用Kubernetes Redis队列ServerlessAWS Lambda DynamoDB6. 典型问题排查指南6.1 常见错误代码表错误现象可能原因解决方案JSON解析失败模型输出不符合规范加强提示词约束或添加输出解析器节点卡住循环缺少终止条件设置max_iterations参数内存泄漏大文件未及时释放使用with语句管理资源6.2 调试工作流技巧简化复现用最小化输入测试隔离测试单独运行问题节点日志分析检查中间状态变化6.3 性能瓶颈定位使用cProfile工具import cProfile profiler cProfile.Profile() profiler.runcall(app.invoke, {input: test}) profiler.print_stats(sortcumtime)7. 进阶学习路径建议深入LangChain组件文档加载器PDF/HTML/Markdown向量数据库集成工具调用Tool use探索LangGraph高级特性持久化工作流状态动态节点注册分布式执行性能优化专项模型量化预计算优化缓存策略我在实际项目中发现最有效的学习方式是从一个具体需求出发比如构建一个能自动续写的故事生成器然后逐步引入更复杂的控制逻辑和错误处理机制。