2026/2/24 20:30:40
网站建设
项目流程
四大商业网站,十大平面设计公司,dede网站建站教程,互联网创业项目什么赚钱前言
上期内容 [LangGraph1.0速通指南#xff08;二#xff09;—— LangGraph1.0 条件边、记忆、人在回路]分享了条件边、智能体记忆和人在回路等核心机制。通过点、边、条件边的组合#xff0c;大家已经能够搭建起具备记忆能力并支持人工介入的智能体工作流。为了帮助大家…前言上期内容 [LangGraph1.0速通指南二—— LangGraph1.0 条件边、记忆、人在回路]分享了条件边、智能体记忆和人在回路等核心机制。通过点、边、条件边的组合大家已经能够搭建起具备记忆能力并支持人工介入的智能体工作流。为了帮助大家更熟练地掌握这些概念并体会其在真实场景中的应用本期笔者将把前两期所学的知识——包括状态、节点、边、条件路由、记忆与中断机制——融会贯通动手构建一个自动邮件处理智能体项目。LangGraph1.0 与先前版本变动不大预计花费三节左右的时间讲解同时也要说明笔者的专栏[《深入浅出LangChainLangGraph AI Agent 智能体开发》]适合所有对 LangChain 感兴趣的学习者无论之前是否接触过 LangChain。该专栏基于笔者在实际项目中的深度使用经验系统讲解了使用LangChain/LangGraph如何开发智能体目前已更新 33 讲并持续补充实战与拓展内容。欢迎感兴趣的同学关注笔者的微信公众号大模型真好玩每期分享涉及的代码均可在公众号私信:LangChain智能体开发免费获取。PS:鉴于后台私信越来越多我建了一些大模型交流群大家在日常学习生活工作中遇到的大模型知识和问题都可以在群中分享出来大家一起解决如果大家想交流大模型知识可以关注我并回复加群。一、电子邮件智能体场景分析1.1 需求分析作为一名开发者笔者每天都需要处理大量的工作邮件——包括问题咨询、Bug 报告、账单通知、功能请求等。邮件不仅类型多样紧急程度也各不相同手动分类、回复耗时耗力尤其在忙碌时更容易遗漏或延迟处理。为此笔者希望构建一个自动邮件处理智能体它能够自动分类识别邮件的类型如问题、Bug、账单、功能请求等与紧急程度。智能处理根据邮件类型执行相应操作如为 Bug 创建跟踪工单为其他问题搜索内部文档获取解答。自动生成回复基于分类与处理结果生成有针对性的回复内容。审核机制在必要时如涉及重要决策或复杂问题暂停流程引入人工审核确保回复准确性与安全性。该智能体将帮助笔者提升邮件处理效率同时通过“人在回路”保证对自动回复的可控制。1.2 根据需求分析设计图基于以上需求笔者设计的智能体将具备以下核心功能流程邮件提取与解析从收件箱获取原始邮件提取关键内容发件人、主题、正文等。自动分类与路由对邮件内容进行分类并依据类别决定后续处理路径。内容处理与生成若为Bug 报告在错误跟踪系统中说明已经收到并跟踪错误若为其他类别如问题咨询则在内部知识库中检索相关答案。回复生成与审核根据处理结果生成回复草稿依据邮件类别与紧急程度决定是否发送至人工审核节点审核通过后自动发送邮件或由人工修订后发出。整体流程可通过以下示意图概括二、项目代码编写2.1 定义智能体状态1. 环境配置与模型初始化首先配置项目环境并初始化大语言模型本次同样使用deepseek模型需要提前执行pip install langchain-deepseek安装相关的依赖包并在项目文件夹下新建.env文件将注册的DeepSeek API填入该文件中。import uuid import os from typing import Literal, TypedDict from dotenv import load_dotenv from langchain_deepseek import ChatDeepSeek from langgraph.types import Command, interrupt from langgraph.graph import END, START, StateGraph from langgraph.checkpoint.memory import InMemorySaver load_dotenv() llm ChatDeepSeek( modeldeepseek-chat, )2. 定义状态数据结构智能体的状态设计需要与工作流节点相匹配确保每个节点的输入输出都有明确的数据结构。EmailAgentState的设计从上到下分别是读取邮件节点、分类节点、bug追踪节点、文档查询节点、自动撰写节点的相关内容。本项目处理的是单封邮件的独立流程因此未使用笔者在《LangGraph1.0速通指南一—— 核心概念、点、边》中介绍的reducer进行状态聚合。但在需要处理连续对话或多轮交互的场景中reducer机制将是管理状态演进的关键工具。# 1. 定义图状态State class EmailClassification(TypedDict): # 分类包括问题、错误、账单、功能, 不属于这些功能就分类为复杂 intent: Literal[question, bug, billing, feature, complex] # 紧急程度 低、中、高、关键 urgency: Literal[low, medium, high, critical] # 邮件主题 topic: str # 邮件摘要 summary: str class EmailAgentState(TypedDict): # 储存读取邮件内容, 发件人邮件地址邮件ID email_content: str sender_email: str email_id: str # 分类意图节点的结果 classification: EmailClassification # Bug tracking 错误处理系统只需要查询一些API 这里就存储一个工单ID即可 ticket_id: str | None # 搜索文档结果 search_results: list[str] | None # 客户历史客户历史是一个字典键是客户的电子邮件值是与该客户相关的任何搜索结果 customer_history: dict | None # 生成内容: draft_response: str | None2.2 定义智能体节点1. 邮件读取与分类节点首先明确读取节点与分类节点的功能。在实际生产环境下读取节点通常通过调用特定邮箱的 API 实现但为简化流程笔者在此略过该节点直接将邮件内容输入至后续分类节点。分类节点通过预设提示词调用 DeepSeek 大模型对邮件进行分类。LangChain1.0 支持便捷的大模型结构化输出具体方法笔者不再展开如需深入了解可参考此前分享LangChain1.0速通指南一——LangChain1.0核心升级。def read_email(state: EmailAgentState) - EmailAgentState: 实际生产中这一步要从邮箱提供的api中提取电子邮件这里仅仅是演示 会将电子邮件直接传给分类节点该函数简写 pass def classify_intent(state: EmailAgentState) - EmailAgentState: 用大模型进行节点分类和紧急程度识别然后依据结果路由 structured_llm llm.with_structured_output(EmailClassification) classification_pormpt f 分析用户输入的邮件并进行分类 邮件: {state[email_content]} 来自: {state[sender_email]} 提供分类、紧急程度、主题和内容摘要 classication structured_llm.invoke(classification_pormpt) return { classification: classication }2. 知识库搜索节点目前搜索节点仅为功能模拟在实际部署时可替换为对接真实知识库的检索接口。该节点接收并依据上一节点即分类节点输出的状态信息从中提取邮件意图与主题进而模拟在内部知识库中执行检索的过程。def search_documentation(state: EmailAgentState) - EmailAgentState: 查询知识库节点这里模拟操作 classification state.get(classification, {}) query f{classification.get(intent, )} {classification.get(topic, )} try: # 模拟查询的逻辑 search_results [ search_result_1, search_result_2, search_result_3 ] except Exception as e: search_results [f搜索接口不可用] return {search_results: search_results}3. Bug跟踪节点模拟跟踪的内容创建跟踪工单def bug_tracking(state: EmailAgentState) - EmailAgentState: 模拟bug修复的相关内容 ticket_id fBug-{uuid.uuid4()} fixed return {ticket_id: ticket_id}4. 回复生成节点节点接收来自搜索节点的信息如原始检索结果、以换行符连接的客户历史记录等并将其作为上下文参考指导大模型的回复生成。大模型基于邮件分类、紧急程度及所附的参考信息生成拟回复的邮件内容。除了生成回复内容该节点还会输出一个****处理命令。该命令将根据邮件的类别与紧急程度自动判断下一步应执行的操作——例如“直接发送回复”或“转交人工审核”。def write_response(state: EmailAgentState) - Command[Literal[human_review, send_reply]]: 根据分类结果、搜索结果等中间结果生产报告 classification state.get(classification, {}) context_sections [] if state.get(search_results): formatted_docs \n.join([f- {doc} for doc in state[search_results]]) context_sections.append(f相关内容:\n{formatted_docs}) if state.get(customer_history): context_sections.append(fCustomer tier: {state[customer_history].get(tier, standard)}) # 构建提示词 draft_prompt f 撰写50字邮件回复: 邮件内容: {state.get(email_content)} 邮件分类: {classification.get(intent, unkown)} 紧急程度: {classification.get(urgency, medium)} {chr(10).join(context_sections)} response llm.invoke(draft_prompt) # 根据紧急程度决定是否需要人类审核 needs_review ( classification.get(urgency) in [high, critical] or classification.get(intent) complex ) if needs_review: goto human_review print(需要人工审核) else: goto send_reply return Command( update{draft_response: response.content}, gotogoto )5. 人工审核节点和回复节点流程执行至该节点时系统将自动暂停并等待人工输入。只有在邮件紧急程度为紧急或分类结果为复杂情况下才会进入工作节点来人工确认。该节点采用中断机制根据人工反馈的指令节点将返回相应的路由命令引导流程走向“结束”或“发送回复”分支。回复节点笔者这里只模拟自动发送邮件。def human_review(state: EmailAgentState) - Command[Literal[send_reply, END]]: 人类审查节点审查结束后决定是否要回复该邮件 classification state.get(classification, {}) human_decision interrupt({ 邮件ID: state[email_id], 原始邮件内容: state[email_content], 自动回复内容: state[draft_response], 紧急程度: classification[urgency], 分类: classification[intent], 下一步: 请审核是否同意发送该邮件 }) if human_decisionapproved: return Command( update{}, gotosend_reply ) else: return Command( update{}, gotoEND ) def send_reply(state: EmailAgentState): print(---成功发送---)2.3 构建智能体图具备以上节点函数后通过边将节点函数相连接构造智能体。智能体定义遵循 LangGraph1.0速通指南一—— LangGraph1.0 核心概念、点、边讲解的三步骤定义状态、添加节点、添加边。同时由于需要使用中断机制还需要添加内存检查点。builder StateGraph(EmailAgentState) builder.add_node(read_email, read_email) builder.add_node(classify_intent, classify_intent) builder.add_node(search_documentation,search_documentation) builder.add_node(bug_tracking, bug_tracking) builder.add_node(write_response, write_response) builder.add_node(human_review,human_review) builder.add_node(send_reply, send_reply) builder.add_edge(START, read_email) builder.add_edge(read_email,classify_intent) builder.add_edge(classify_intent,search_documentation) builder.add_edge(classify_intent,bug_tracking) builder.add_edge(search_documentation,write_response) builder.add_edge(bug_tracking,write_response) builder.add_edge(send_reply,END) memoryInMemorySaver() app builder.compile(checkpointermemory)三、 智能体测试与验证为了验证笔者构建的邮件处理智能体是否按预期工作下面通过两个典型场景进行测试高紧急度Bug报告和常规问候邮件。3.1 Bug报告处理测试测试一个需要人工审核的高优先级Bug报告预期的处理流程如下由于邮件内容包含紧急Bug分类节点会将其识别为intent: bug且urgency: critical工作流会创建Bug工单然后进入human_review节点等待审核系统会打印中断信息并等待人工输入根据人工决策邮件将被发送或终止initial_state { email_content: 我遇到了一个紧急bug, 有客户重复订阅了一个产品, sender_email: test163.com, email_id: email_123 } config {configurable: {thread_id: customer_123}} result app.invoke(initial_state, configconfig) print(f准备审核的回复内容:{result[draft_response]}...\n) if __interrupt__ in result: print(fInterrupt:{result}) msg result[__interrupt__][-1].value print(msg) human input(f请输入: ) human_response Command( resumehuman ) final_result app.invoke(human_response, config)从运行结果来看工作流成功识别出紧急Bug创建了工单并生成了回复草稿。由于紧急程度为critical系统正确触发了人工审核中断3.2常规问候处理流程测试一个无需审核的普通问候邮件预期结果如下:问候邮件会被分类为intent: question且urgency: low工作流将跳过人工审核节点直接生成并发送回复整个过程完全自动化无需人工干预initial_state { email_content: 你好呀我是新同事苍井空, sender_email: test163.com, email_id: email_123 } config {configurable: {thread_id: customer_123}} result app.invoke(initial_state, configconfig) print(f准备审核的回复内容:{result[draft_response]}...\n) if __interrupt__ in result: print(fInterrupt:{result}) msg result[__interrupt__][-1].value print(msg) human input(f请输入: ) human_response Command( resumehuman ) final_result app.invoke(human_response, config)从运行结果可以看出系统正确识别出低优先级问候邮件自动生成友好回复并直接发送无需人工介入完整代码大家可以关注笔者的微信公众号大模型真好玩并私信:LangChain智能体开发免费获取。四、总结本文通过构建自动邮件处理智能体系统演示了LangGraph1.0的状态管理、条件路由、人在回路等核心机制在实战中的应用。相信大家经过实战能更加掌握LangGraph1.0编写智能体的核心技巧。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】