【LLM实战|langgraph】langgrpah基础

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

langgraph 基础

1. Chatbot实现

# !pip install langchain
# !pip install langgraph
from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages# 定义 State
class State(TypedDict):# 状态变量 messages 类型是 list,更新方式是 add_messages# add_messages 是内置的一个方法,将新的消息列表追加在原列表后面messages: Annotated[list, add_messages]# 创建 Graph
graph_builder = StateGraph(State)
from langchain.chat_models import init_chat_model
# llm = init_chat_model("gpt-4o", model_provider="openai")
llm = init_chat_model("deepseek-chat", model_provider="deepseek")# 定义一个执行节点
# 输入是 State,输出是系统回复
def chatbot(state: State):# 调用大模型,并返回消息(列表)# 返回值会触发状态更新 add_messagesreturn {"messages": [llm.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()
Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[9], line 127 def chatbot(state: State):8     # 调用大模型,并返回消息(列表)9     # 返回值会触发状态更新 add_messages10     return {"messages": [llm.invoke(state["messages"])]}
---> 12 graph_builder.add_node("chatbot", chatbot)13 graph_builder.add_edge(START, "chatbot")14 graph_builder.add_edge("chatbot", END)File c:\Users\13010\miniconda3\envs\py12\Lib\site-packages\langgraph\graph\state.py:456, in StateGraph.add_node(self, node, action, defer, metadata, input_schema, retry_policy, cache_policy, destinations, **kwargs)454     raise RuntimeError455 if node in self.nodes:
--> 456     raise ValueError(f"Node `{node}` already present.")457 if node == END or node == START:458     raise ValueError(f"Node `{node}` is reserved.")ValueError: Node `chatbot` already present.
from IPython.display import Image, display# 可视化展示这个工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

from langchain.schema import AIMessage def stream_graph_updates(user_input: str):# 向 graph 传入一条消息(触发状态更新 add_messages)for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):for value in event.values():if "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)def run():# 执行这个工作流while True:user_input = input("User: ")if user_input.strip() == "":breakstream_graph_updates(user_input)
run()
Assistant: 你好!😊 很高兴见到你~有什么我可以帮你的吗?
Assistant: 我是DeepSeek Chat,由深度求索公司(DeepSeek)研发的智能AI助手!🤖✨ 我的使命是帮助你解答问题、提供信息、陪你聊天,甚至帮你处理各种文本和文件。无论是学习、工作,还是日常生活中的疑问,都可以来问我!😊  有什么我可以帮你的吗?

2. RAG

# !pip install -U langchain-community pymupdf
# !pip install dashscope
# !pip install faiss-cpu
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyMuPDFLoader# 加载文档
loader = PyMuPDFLoader("./data/deepseek-v3-1-4.pdf")
pages = loader.load_and_split()# 文档切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=200,length_function=len,add_start_index=True,
)texts = text_splitter.create_documents([page.page_content for page in pages[:2]]
)# 灌库
embeddings = DashScopeEmbeddings(model="text-embedding-v1")
db = FAISS.from_documents(texts, embeddings)# 检索 top-5 结果
retriever = db.as_retriever(search_kwargs={"k": 5})
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate# Prompt模板
template = """请根据对话历史和下面提供的信息回答上面用户提出的问题:
{query}
"""
prompt = ChatPromptTemplate.from_messages([HumanMessagePromptTemplate.from_template(template),]
)
def retrieval(state: State):user_query = ""if len(state["messages"]) >= 1:# 获取最后一轮用户输入user_query = state["messages"][-1]else:return {"messages": []}# 检索docs = retriever.invoke(str(user_query))# 填 prompt 模板messages = prompt.invoke("\n".join([doc.page_content for doc in docs])).messagesreturn {"messages": messages}
graph_builder = StateGraph(State)
graph_builder.add_node("retrieval", retrieval)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "retrieval")
graph_builder.add_edge("retrieval","chatbot")
graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()
from IPython.display import Image, display# 可视化展示这个工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

run()
Assistant: DeepSeek-V3 是一个大型混合专家模型(Mixture-of-Experts, MoE),总参数量为 **6710 亿(671B)**,其中每个 token 激活的参数量为 **370 亿(37B)**。

3. 加入分支:若找不到答案转人工

from langchain.schema import HumanMessage
from typing import Literal
from langgraph.types import interrupt, Command# 校验
def verify(state: State)-> Literal["chatbot","ask_human"]:message = HumanMessage("请根据对话历史和上面提供的信息判断,已知的信息是否能够回答用户的问题。直接输出你的判断'Y'或'N'")ret = llm.invoke(state["messages"]+[message])if 'Y' in ret.content:return "chatbot"else:return "ask_human"# 人工处理
def ask_human(state: State):user_query = state["messages"][-2].contenthuman_response = interrupt({"question": user_query})# Update the state with the human's input or route the graph based on the input.return {"messages": [AIMessage(human_response)]}
from langgraph.checkpoint.memory import MemorySaver# 用于持久化存储 state (这里以内存模拟)
# 生产中可以使用 Redis 等高性能缓存中间件
memory = MemorySaver()graph_builder = StateGraph(State)graph_builder.add_node("retrieval", retrieval)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("ask_human", ask_human)graph_builder.add_edge(START, "retrieval")
graph_builder.add_conditional_edges("retrieval", verify)
graph_builder.add_edge("ask_human", END)
graph_builder.add_edge("chatbot", END)# 中途会被转人工打断,所以需要 checkpointer 存储状态
graph = graph_builder.compile(checkpointer=memory)
from langchain.schema import AIMessage # 当使用 checkpointer 时,需要配置读取 state 的 thread_id
# 可以类比 OpenAI Assistants API 理解,或者想象 Redis 中的 key 
thread_config = {"configurable": {"thread_id": "my_thread_id"}}def stream_graph_updates(user_input: str):# 向 graph 传入一条消息(触发状态更新 add_messages)for event in graph.stream({"messages": [{"role": "user", "content": user_input}]},thread_config):for value in event.values():if isinstance(value, tuple):return value[0].value["question"]elif "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)return Nonereturn Nonedef resume_graph_updates(human_input: str):for event in graph.stream(Command(resume=human_input), thread_config, stream_mode="updates"):for value in event.values():if "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)
def run():# 执行这个工作流while True:user_input = input("User: ")if user_input.strip() == "":breakquestion = stream_graph_updates(user_input)if question:human_answer = input("Ask Human: "+question+"\nHuman: ")resume_graph_updates(human_answer)
from IPython.display import Image, display# 可视化展示这个工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

run()
Assistant: DeepSeek-V3 是一个大型混合专家模型(MoE),总参数量为 **6710亿(671B)**,其中每个 token 激活的参数量为 **370亿(37B)**。  (根据论文 arXiv:2412.19437v2 提供的信息,DeepSeek-V3 的架构明确标注为 671B 参数规模。)
Assistant: 090

LangGraph 还支持:

  • 工具调用
  • 并行处理
  • 状态持久化
  • 对话历史管理
  • 历史动作回放(用于调试与测试)
  • 子图管理
  • 多智能体协作

更多关于 LangGraph 的 HowTo,参考官方文档:https://langchain-ai.github.io/langgraph/how-tos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92660.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大疆无人机使用eport连接Jetson主板实现目标检测

所需硬件设备如下: 实现原理: 视频流获取:从大疆无人机获取实时视频流。数据传输:将视频流传输至 Jetson 平台。目标检测处理:在 Jetson 上运行目标检测算法对传入的视频帧进行分析 EPort开发套件 大疆官网给出了…

Typora激活与使用

Typora下载 下载地址:Typora 官方中文站 Typora(1.9.5及其以前的版本) 工具:待补充 流程 1.解压工具 2.将license-gen.exe、node_inject.exe两个文件放于typora安装目录下 3.在typora安装目录下运行cmd(可以打开…

图片拆分工具,自定义宫格切割

软件介绍 今天推荐一款实用的图像处理工具——lmage Splitter,支持图像拆分与格式互转功能,无广告干扰,操作简单流畅,满足多样化图片编辑需求。 软件优势 该工具为绿色版设计,无需安装即可直接运行,下载…

23种设计模式解析--创建型模式

创建型模式(造物主的智慧) 单例模式 模式定义 单例模式(Singleton)确保一个类仅有一个实例,并提供该实例的全局访问点。核心思想是通过私有化构造函数和静态成员实现受控的对象创建。核心实现要点 私有构造函数&#x…

全面解析软件工程形式化说明技术

一、形式化说明技术概述:从模糊到精确的跨越 在软件工程的发展历程中,需求说明技术始终是确保软件系统成功开发的关键环节。从早期依赖自然语言的非形式化描述,到如今基于数学和逻辑的形式化方法,这一领域经历了从模糊到精确的深…

百度网盘自动启动如何关闭,关闭智能看图

#某度软件引起的奔溃#在日常办公中,有时候双击图片,会自动打开了某度的网盘,很奇怪莫名其妙的为什么会关闭网盘后又自动打开了。如何发现是某度的牛虻软件在搞鬼的?我右键图片,选择打开方式,发现有“智能看…

疏老师-python训练营-Day40训练和测试的规范写法

浙大疏锦行 知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测…

【重磅发布】flutter_chen_keyboard -专注于键盘相关功能

flutter_chen_keyboard 一个功能强大且易于使用的 Flutter 键盘增强库,专为提升移动应用的键盘交互体验而设计。 📖 库简介 flutter_chen_keyboard 是一个专注于键盘相关功能的 Flutter 工具库,旨在为开发者提供更流畅、更智能的键盘交互解决…

idea设置注释--带日期和作者和描述

最终效果 在File Header中添加如下内容: /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}:IDEA 里设置的用户名 ${DATE}:当前日期 ${TIME}:当前时间 可以加自定义变量,比如 ${DESCRI…

【Linux】Socket编程——UDP版

📝前言: 这篇文章我们来讲讲Linux——udpsocket 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础&#…

RabbitMQ面试精讲 Day 14:Federation插件与数据同步

【RabbitMQ面试精讲 Day 14】Federation插件与数据同步 开篇 欢迎来到"RabbitMQ面试精讲"系列第14天,今天我们将深入探讨RabbitMQ Federation插件与跨集群数据同步机制。在分布式系统架构中,如何实现消息队列集群间的数据同步是确保业务连续…

AI编程工具 | Trae介绍

描述需求就可以自动创建可运行的完整项目了,确实很强! 终端中的报错信息都可以快速作为上下文输入,点击确认就可以自动修改,贼好使! Trae 编程工具详细介绍 一、产品简介 Trae 是字节跳动于 2025 年 1 月 19 日推出的…

【第11话:感知算法基础3】目标检测:深度学习目标检测模型介绍入门及常用模型详解

深度学习目标检测模型介绍入门及常用模型详解 目标检测是计算机视觉的核心任务,需同时完成目标定位(输出边界框坐标)和目标分类(识别类别)。深度学习通过端到端训练显著提升了检测精度和效率,主要分为两类架…

稿定科技:多云架构下的 AI 存储挑战与 JuiceFS 实践

稿定科技(gaoding.com)是一家专注于为企业和个人提供视觉内容创新方案的科技公司,致力于打造全新的设计方式,帮助更多用户轻松掌控设计,创造价值。 随着 AI 技术的加速发展,数据存储和管理成为支撑公司创新…

徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析

原创声明本文为原创技术解析,核心技术参数与架构设计参考自《陌讯技术白皮书》,转载请注明来源。一、行业痛点:徘徊识别的现实困境在安防监控领域,徘徊行为识别是保障公共安全的关键技术(如商场防盗窃、园区防闯入等场…

C# 通过第三方库INIFileParser管理INI配置文件

C# 通过第三方库INIFileParser管理INI配置文件目录前言一、添加动态库二、添加接口类代码总结前言 很多时候我们是直接调用系统的C库中的GetPrivateProfileString和WritePrivateProfileString接口来实现管理INI文件的,这个接口最久可以追溯到上个世纪80年代&#x…

政府数字化大屏系统 - Flask实现方案

下面我将设计一个基于Flask的政府数字化大屏系统,包含数据可视化、实时监控和统计分析功能,全套代码下载看底部。 设计思路 使用Flask作为后端框架提供数据接口 前端采用响应式设计,适配大屏展示 使用ECharts实现多种数据可视化 模拟实时…

2025年主流开源音视频播放项目深度解析

音视频技术作为多媒体领域的核心支撑,其开源生态在近年来呈现爆发式发展。从底层编解码引擎到跨平台播放器应用,开源项目已形成完整的技术栈,满足从个人娱乐到企业级流媒体服务的全场景需求。本文将深入剖析2025年最具影响力的五大开源音视频…

【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)

文章目录一、AVL树的概念二、AVL树的实现AVL树的结构AVL树的插⼊AVL树插⼊⼀个值的⼤概过程平衡因⼦更新更新原则更新停⽌条件插入结点及更新平衡因子的代码实现旋转旋转的原则右单旋右单旋代码实现左单旋左单旋代码实现左右双旋左右双旋代码实现右左双旋代码实现判断旋转中序遍…

C++ 中的 enable_shared_from_this 详解

# C 中的 enable_shared_from_this 详解enable_shared_from_this 是 C 标准库中的一个模板类,用于解决在类的成员函数中需要获取指向自身的 shared_ptr 的问题。## 基本概念当一个对象由 shared_ptr 管理时,如果你想在对象的成员函数中获得一个指向自身的…