掘金 人工智能 16小时前
LangGraph实践-构建AI工作流:创建一本大模型应用开发书籍
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了LangGraph这一强大的开源框架,它专为构建复杂、有状态的多智能体AI应用而设计,通过图结构协调AI任务。文章详细介绍了LangGraph的核心特性,如图结构、状态管理、循环与分支、人类在环以及多智能体协作,并与Dify、Coze、n8n等低代码平台进行了对比,提供了选型建议。最后,通过一个实战案例,展示了如何利用LangGraph结合Ollama和LangSmith,自动化生成一本关于大模型应用开发的书籍,从章节构思到内容填充,再到Markdown格式输出,展现了其在AI工作流构建中的灵活性和效率。

💡 **LangGraph的核心优势在于其灵活的图结构和强大的状态管理能力**:与传统的线性链式AI应用不同,LangGraph采用有向图模型,由节点和边构成,能够高效处理复杂的动态流程,如多轮对话、迭代优化和多智能体协作。其全局共享状态和断点续跑机制,为构建需要持久化状态和异常恢复能力的AI应用提供了坚实基础。

🔄 **LangGraph支持强大的循环与条件分支,实现动态工作流**:该框架允许AI代理根据中间结果动态调整执行路径,例如通过循环优化答案直至满足特定条件。这使得LangGraph特别适用于检索增强生成(RAG)、代码优化、多轮决策等需要灵活流程控制的场景。

🧑‍🤝‍🧑 **多智能体协作与人类干预是LangGraph的关键应用场景**:LangGraph能够构建分工明确的AI代理团队,实现高效协作。同时,它支持“人类在环”的模式,允许人工干预AI决策过程,这在医疗、法律等对决策准确性和可解释性要求极高的专业领域具有重要价值。

📊 **LangGraph与其他AI工作流工具的对比与选型建议**:文章对比了LangGraph与Dify、Coze、n8n等平台在架构、状态管理、使用场景、学习成本和开源情况等方面的差异。LangGraph适用于需要高度自定义和复杂AI工作流的场景,而Dify、Coze、n8n则更侧重于低代码或零代码的快速应用开发。

🚀 **实战演示:利用LangGraph自动化生成书籍内容**:文章通过一个具体的案例,展示了如何使用LangGraph构建一个自动化书籍生成工作流。该工作流包括章节生成、学习对象定义、内容增强(调用Ollama生成详细内容)以及最终的Markdown文件输出,清晰地演示了LangGraph在自动化内容创作领域的强大能力。

原文

LangGraph实践-构建AI工作流:创建一本大模型应用开发书籍

如果你想使用dify,coze以及n8n构建你的工作流,那基本上非常轻松,拖拽组件即可完成,但是因为基本上都是低代码平台,因此你可以操作的空间非常小,当然据我了解n8n是可以支持js或者python添加节点的,这为工作流的灵活性开了窗口,使可以会写代码的人有了自由发挥的空间,但是如果全流程想要代码实现,那就得用LangGraph这样的框架去实现了。

LangGraph 是由 LangChain 团队开发的一个开源框架,专为构建有状态、多智能体(Multi-Agent)的 AI 应用而设计。它通过图结构(Graph)来定义和协调复杂的工作流,特别适合需要循环、分支、持久化状态管理和人工干预的场景。

LangGraph 的核心特点

1、图结构(Graph-Based)
2、状态管理(State Management)
3、循环与分支(Loops & Conditional Flows)
4、人类在环(Human-in-the-Loop)
5、多智能体协作(Multi-Agent Systems)
6、与 LangChain 无缝集成

LangGraph 的典型应用场景

LangGraph vs. Dify/Coze/n8n

维度LangGraphDifyCozen8n
架构基于图结构(节点+边),支持循环/分支,专为多Agent协作设计低代码AI应用开发平台,支持RAG & 复杂工作流零代码对话式AI开发,拖拽式流程编排节点式工作流自动化,支持跨系统集成
状态管理全局State + 持久化存储,支持断点续跑会话级上下文管理对话状态跟踪无原生状态管理,需外部存储
使用场景复杂决策流(多轮优化、Agent协作)企业级AI应用(知识库/RAG)轻量级对话机器人(客服/社交)跨系统自动化(数据同步/API调用)
学习成本高(需Python编码,理解图结构)中(需技术背景,熟悉LLM)低(零代码,适合非技术用户)中(需API/逻辑理解)
开源/商业开源(MIT协议)开源(部分企业功能付费)部分开源(Apache 2.0)完全开源(可持续使用协议)
选型建议
    1. LangGraph
      • 适用:需要复杂AI工作流(如多Agent协作、动态路由、循环优化)的开发团队。• 优势:灵活性强,支持持久化状态,适合金融、医疗等专业领域。
    2. Dify
      • 适用企业级AI应用(如知识库问答、多模型集成),需私有化部署。• 优势:低代码开发,支持RAG,适合技术团队快速构建AI应用。
    3. Coze
      • 适用快速搭建对话机器人(如抖音/飞书集成),适合中小团队或个人开发者。• 优势:零代码体验,内置字节生态插件,部署简单。
    4. n8n
      • 适用非AI自动化(如数据同步、API调用),技术团队自托管需求。• 优势:开源免费,扩展性强,支持1000+第三方服务集成。
组合使用建议

如需更详细的功能对比或部署指南,可参考各平台的官方文档或社区讨论。

LangGraph实战

用LangGraph开发一个工作流,用于创建一本大模型应用的书籍。

要开始使用 LangGraph,首先需要安装必要的包:
pip install langchain langgraph langchain-community

如果你想使用可视化和监控功能,还需要安装 LangSmith:
pip install langsmith

然后就是登录https://smith.langchain.com/,创建一个项目,然后generate key,点击复制这个key,填到代码中对应这个key下os.environ["LANGCHAIN_API_KEY"] = "your_langsmith_api_key" # 替换为你的 API Key

最后就是下载安装ollama,然后通过ollama安装llama3.2模型:

  ~ ollama run llama3.2pulling manifestpulling dde5aa3fc5ff: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 2.0 GBpulling 966de95ca8a6: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.4 KBpulling fcc5a6bec9da: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.7 KBpulling a70ff7e570d9: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 6.0 KBpulling 56bb8bd477a5: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   96 Bpulling 34bb5ab01051: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  561 Bverifying sha256 digestwriting manifestsuccess>>>

安装完成之后,我们可以测试一下,那我的测试语句就是:

>>> who are youI'm an artificial intelligence model known as Llama. Llama stands for "Large Language Model Meta AI.">>>

证明模型是安装成功的,接下来开始写代码。

现在我贴出代码:

import osimport timeimport requestsfrom typing import Dict, List, Any, TypedDictfrom langgraph.graph import StateGraph# Ollama 配置OLLAMA_API_BASE = "http://localhost:11434/api" # ollama提供访问模型的地址DEFAULT_MODEL = "llama3.2" # 这就是我们刚才安装的llama模型,注意必须是3.2# LangSmith 配置os.environ["LANGCHAIN_TRACING_V2"] = "true"os.environ["LANGCHAIN_API_KEY"] = "your_langsmith_api_key"  # 替换为你的 API Keyos.environ["LANGCHAIN_PROJECT"] = "课程创建-LangGraph"# Ollama API 调用函数def generate_with_ollama(prompt, model=DEFAULT_MODEL, temperature=0.5, max_tokens=2000):    """使用 Ollama API 生成内容"""    try:        response = requests.post(            f"{OLLAMA_API_BASE}/generate",            json={                "model": model,                "prompt": prompt,                "temperature": temperature,                "stream": False            }        )                if response.status_code == 200:            result = response.json()            return result.get("response", "")        else:            print(f"Ollama API 返回错误状态码: {response.status_code}")            return f"API调用失败,状态码: {response.status_code}"    except Exception as e:        print(f"调用 Ollama API 出错: {e}")        return f"内容生成失败,请检查 Ollama 服务。错误: {e}"# 课程结构定义course_structure = {    "课程名称": "大模型应用开发从入门到放弃",    "章节": [        {            "章节名称": "大模型应用开发具备技术栈",            "简介": "介绍大模型应用开发必须掌握和了解的基础知识和工具",            "学习目标": ["理解大模型应用开发的基本概念", "掌握大模型应用的基础开发流程"]        },        {            "章节名称": "大模型应用实战",            "简介": "用大模型+LangGraph框架开发一个hello world示例",            "学习目标": ["夯实大模型的基础理论", "掌握大模型应用开发的基础框架"]        }    ]}# 提示词模板prompt_templates = {    "概念理解": """    你是一位大模型应用开发专家,正在为《{course_name}》课程的《{chapter_name}》章节创建概念理解学习材料。        章节介绍: {chapter_intro}    学习目标: {chapter_goals}        请创建一份全面的概念理解材料,包含核心概念定义、背景知识、相关概念联系等。    输出格式使用 Markdown,确保标题层级正确,内容应该全部使用中文。    """,        "实践应用": """    你是一位大模型应用开发专家,正在为《{course_name}》课程的《{chapter_name}》章节创建实践应用学习材料。        章节介绍: {chapter_intro}    学习目标: {chapter_goals}        请创建一份全面的实践应用材料,对大模型应用开发提供一个完整的实践案例。    输出格式使用 Markdown,确保标题层级正确,内容应该全部使用中文。    """,    "知识评估": """    你是一位大模型应用开发专家,正在为《{course_name}》课程的《{chapter_name}》章节创建知识评估学习材料。        章节介绍: {chapter_intro}    学习目标: {chapter_goals}        请创建一份全面的知识评估材料,对大模型应用查出的结果进行评估。    输出格式使用 Markdown,确保标题层级正确,内容应该全部使用中文。    """}# 1. 章节生成节点def chapter_generator(state: Dict[str, Any]) -> Dict[str, Any]:    """生成课程章节"""    print("章节生成节点开始执行...")    # 简化版:直接使用预定义的章节    chapters = course_structure["章节"]        # 返回更新后的完整状态    updated_state = state.copy()    updated_state["章节列表"] = chapters    print(f"章节生成完成,返回状态键: {list(updated_state.keys())}")    return updated_state# 2. 学习对象生成节点def learning_object_generator(state: Dict[str, Any]) -> Dict[str, Any]:    """为每个章节生成学习对象"""    print("学习对象生成节点开始执行...")    print(f"接收到的状态键: {list(state.keys())}")        chapters = state["章节列表"]    learning_objects = []        for chapter in chapters:        chapter_name = chapter["章节名称"]                # 创建基础学习对象        chapter_objects = {            "章节名称": chapter_name,            "学习对象": [                {"类型": "概念理解", "内容": f"本节介绍{chapter_name}的核心概念,帮助学习者建立基础认知。"},                {"类型": "实践应用", "内容": f"通过实际案例演示{chapter_name}的应用方法,提升实战能力。"},                {"类型": "知识评估", "内容": f"包含与{chapter_name}相关的自测题,帮助学习者检验学习效果。"}            ]        }                learning_objects.append(chapter_objects)        # 返回更新后的完整状态    updated_state = state.copy()    updated_state["章节学习对象"] = learning_objects    print(f"学习对象生成完成,返回状态键: {list(updated_state.keys())}")        return updated_state# 3. 内容增强节点def content_enhancer(state: Dict[str, Any]) -> Dict[str, Any]:    """使用 Ollama 生成详细内容"""    print("开始内容增强...")    print(f"当前状态键: {list(state.keys())}")        # 检查章节列表是否存在    if "章节列表" not in state:        print("错误: 状态中没有找到'章节列表'")        return state        chapter_list = state["章节列表"]    learning_objects_list = state.get("章节学习对象", [])        # 创建映射以便后续查找    learning_objects_map = {}    for lo in learning_objects_list:        chapter_name = lo.get("章节名称", "")        if chapter_name:            learning_objects_map[chapter_name] = lo.get("学习对象", [])        # 存储增强后的章节内容    enhanced_chapters = []        # 处理每个章节    for chapter in chapter_list:        try:            # 提取章节信息            chapter_name = chapter["章节名称"]            chapter_intro = chapter.get("简介", "无介绍")                        # 处理学习目标            chapter_goals = chapter.get("学习目标", [])            if isinstance(chapter_goals, list):                chapter_goals = "\n".join([f"- {goal}" for goal in chapter_goals])                        # 创建增强章节对象            enhanced_chapter = {                "章节名称": chapter_name,                "章节介绍": chapter_intro,                "学习目标": chapter_goals,                "学习对象": []            }                        # 获取学习对象类型            learning_objects = []            if chapter_name in learning_objects_map:                chapter_objects = learning_objects_map[chapter_name]                learning_objects = [obj["类型"] for obj in chapter_objects]                        # 如果没有定义学习对象,使用默认列表            if not learning_objects:                learning_objects = ["概念理解", "实践应用", "知识评估"]                        # 为每个学习对象生成内容            for obj_type in learning_objects:                # 创建提示词                prompt = prompt_templates.get(obj_type, "").format(                    course_name=course_structure["课程名称"],                    chapter_name=chapter_name,                    chapter_intro=chapter_intro,                    chapter_goals=chapter_goals                )                                # 使用 Ollama 生成内容                enhanced_content = generate_with_ollama(prompt)                                # 添加到章节对象                enhanced_chapter["学习对象"].append({                    "类型": obj_type,                    "内容": enhanced_content                })                        # 添加到增强章节列表            enhanced_chapters.append(enhanced_chapter)                    except Exception as e:            print(f"处理章节时发生错误: {e}")        # 更新状态    updated_state = state.copy()    updated_state["章节增强内容"] = enhanced_chapters        return updated_state# 4. Markdown 写入节点def markdown_writer(state: Dict[str, Any]) -> Dict[str, Any]:    """保存章节与学习对象到本地 Markdown 文件"""    course_name = course_structure["课程名称"]    enhanced_chapters = state.get("章节增强内容", [])        # 创建输出目录    output_dir = f"course_langgraph_chapter_1"    os.makedirs(output_dir, exist_ok=True)        # 创建索引文件    index_path = os.path.join(output_dir, "课程索引.md")    with open(index_path, "w", encoding="utf-8") as f:        f.write(f"# {course_name}\n\n")        f.write("## 课程章节\n\n")                for chapter in enhanced_chapters:            chapter_name = chapter["章节名称"]            chapter_intro = chapter["章节介绍"]            chapter_goals = chapter["学习目标"]                        # 写入章节信息            f.write(f"### {chapter_name}\n\n")            f.write(f"{chapter_intro}\n\n")            f.write("**学习目标**:\n")            if isinstance(chapter_goals, list):                for goal in chapter_goals:                    f.write(f"- {goal}\n")            else:                f.write(f"{chapter_goals}\n")                        # 创建章节目录            chapter_dir = os.path.join(output_dir, chapter_name)            os.makedirs(chapter_dir, exist_ok=True)                        # 添加学习对象链接            f.write("\n**学习内容**:\n")                        # 写入每个学习对象            for obj in chapter["学习对象"]:                obj_type = obj["类型"]                obj_content = obj["内容"]                                # 写入文件链接                obj_filename = f"{obj_type}.md"                obj_path = os.path.join(chapter_dir, obj_filename)                 f.write(f"- [{obj_type}](./{chapter_name}/{obj_filename})\n")                                # 创建学习对象文件                with open(obj_path, "w", encoding="utf-8") as obj_file:                    obj_file.write(f"# {chapter_name} - {obj_type}\n\n")                    obj_file.write(obj_content)                        f.write("\n")        return state# 创建工作流图builder = StateGraph(Dict[str, Any])# 添加节点builder.add_node("章节生成", chapter_generator)builder.add_node("学习对象生成", learning_object_generator)builder.add_node("内容增强", content_enhancer)builder.add_node("Markdown写入", markdown_writer)# 设置起点builder.set_entry_point("章节生成")# 添加边(连接节点)builder.add_edge("章节生成", "学习对象生成")builder.add_edge("学习对象生成", "内容增强")builder.add_edge("内容增强", "Markdown写入")# 编译图workflow = builder.compile(debug=True)# 执行工作流if __name__ == "__main__":    # 初始状态为空    state = {}        # 添加运行标识    run_id = f"run_{int(time.time())}"        print(f"开始执行课程生成流程,运行ID: {run_id}")    print(f"可在 LangSmith 查看详细执行记录: https://smith.langchain.com/projects/课程创建-LangGraph")        # 执行工作流    result = workflow.invoke(state)        print(f"执行完成! 课程内容已生成。")
结果展示

生成的章节目录结构图:

我们点击书籍索引文件:

随便点击一个章节下的小结,我们点击大模型应用开发具备技术栈章下面的概念理解小节:

然后我们再看下实践应用小节:

非常完美的实现了一个简化版本的AI工作流。

小结

LangGraph 是构建复杂、有状态AI工作流的强大工具,尤其适合需要循环、多智能体协作和人工干预的场景。相比 Dify/Coze/n8n,它更适合开发者需要精细化控制的AI应用。

希望接下来大家也尝试写出自己的AI工作流,助力工作提效或者个人成长!

 

历史大模型系列文章:

    DeepSeek大模型之本地部署体验提示工程(prompt engineering)大揭秘OpenAI:GPT提示词(prompt)六大策略之解读GPT prompt(提示词)实战,用李佳琪式的流行梗回复,有点意思提示词(prompt)那些事彻底理解推理模型和通用模型基于LangChain进行大模型应用开发-第一节基于LangChain进行大模型应用开发-第二节(检索器)基于LangChain进行大模型应用开发-第三节(对话检索器(聊天机器人))基于LangChain进行大模型应用开发-第四节(agent代理)基于LangChain进行大模型应用开发-第五节(LangServe服务开发)LangStudio构建nl2sql应用流,只要输入文字就可以转为sql执行并输出结果解密manus的神秘面纱-搜索JackMa演示多智能体(Agent)的强大无比camel-ai推出的OWL用于处理现实世界的自动化任务大模型怎么知道铁是导电的?LangStudio构建文件应用流,只要输入地址就可以转为你自己的知识库AI大模型学习框架基于百炼构建天气预报应用,非常简单基于MCP构建天气预报智能体《零代码+AI赋能!基于阿里云百炼MCP快速打造智能爬虫应用》AI时代的高效信息管家:基于MCP-Agent与通义千问的网页总结智能体实战manus终于开放啦在Mac上10分钟玩转LoRA微调模型揭秘Google A2A协议:赋能智能体协作的未来学习【北京大学】DeepSeek内部研讨系列: AI Agent与Agentic AI的原理和应用并做分享提示工程(Prompt Engineering)还没学明白,上下文工程(Context Engineering)又来了深度剖析Manus:如何打造低幻觉、高效率、安全可靠的Agentic AI系统大模型时代的三巨头—Grok、ChatGPT与Gemini深度解析深度解析AI Agent:从概念、原理到构建模式,一文彻底搞懂!打造一个微claude code来实现石头剪刀布游戏豆包新模型+PromptPilot体验测评Google Agent白皮书:深度解析生成式AI Agent

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangGraph AI工作流 大模型应用 多智能体 自动化
相关文章