LangGraph从0到1:开启大模型开发新征程

LangGraph从0到1:开启大模型开发新征程

本文较长,建议点赞收藏,以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<<

1. 引言:LangGraph 的魅力

在当今数字化时代,大模型技术的应用已经渗透到我们生活的方方面面。想象一下,你在一家电商平台购物,遇到了关于商品信息、订单状态或售后服务等问题。以往,你可能需要在繁琐的常见问题解答页面中自行查找答案,或者等待人工客服的回复,耗费大量的时间和精力。但现在,有了先进的大模型智能客服,一切都变得简单高效。

你只需在对话框中输入你的问题,例如 "我买的这件衣服有其他颜色吗?我之前下单的订单怎么还没发货?" 智能客服能够瞬间理解你的意图,不仅快速给出准确的回答,还能根据你的历史购物记录和偏好,提供个性化的推荐和解决方案。甚至当你的问题比较复杂,需要多轮对话才能解决时,它也能应对自如,就像一位贴心的购物助手,全程陪伴并满足你的需求。

而在这看似神奇的智能客服背后,LangGraph 发挥着关键的作用。它就像是智能客服的 "智慧大脑",为其提供了强大的逻辑推理、知识检索和多轮对话管理能力,让智能客服能够从海量的商品信息和用户数据中,精准地找到答案,并以最自然、流畅的方式与用户交流。

LangGraph 不仅仅局限于电商智能客服这一场景,在智能写作辅助、智能法律咨询、智能教育辅导等众多领域,都有着广泛的应用前景。它为大模型的落地应用开辟了新的道路,让我们能够更加充分地享受到大模型技术带来的便利和创新。接下来,就让我们一起走进 LangGraph 的世界,从 0 开始学习如何利用它开启大模型应用的精彩之旅。

2. 认识 LangGraph

2.1 什么是 LangGraph

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

与传统的线性工作流不同,LangGraph 采用有向图模型,其中节点(Nodes)代表各种任务单元,比如调用大型语言模型(LLM)、执行工具函数、进行数据库查询等;边(Edges)则定义了节点之间的流转逻辑,并且支持条件分支和循环。这种设计使得 LangGraph 能够处理非常复杂的动态流程,例如多轮对话、迭代优化以及多智能体协作等场景 ,为开发者提供了极大的灵活性和控制力。

2.2 核心特点

  1. 图结构(Graph-Based):采用有向图模型,由节点和边组成。节点是任务的基本单元,边则描述了任务执行的顺序和条件。这种结构使得 LangGraph 能够清晰地表达复杂的工作流程,比如在一个智能客服系统中,不同的节点可以分别处理用户问题的解析、知识检索、答案生成等任务,而边则根据用户问题的类型和检索结果来决定执行路径。

  2. 状态管理(State Management):提供全局共享状态,支持跨节点数据传递和持久化存储。这意味着在整个工作流执行过程中,各个节点可以访问和修改共享状态,并且状态可以被保存下来,以便在后续的执行中继续使用。例如,在一个数据分析项目中,前面节点生成的中间数据可以作为状态传递给后面的节点进行进一步处理,而且即使任务中断,也可以基于保存的状态恢复执行。

  3. 循环与分支(Loops & Conditional Flows):允许 AI 代理根据中间结果动态调整执行路径。比如在代码生成任务中,如果生成的代码不符合要求,AI 代理可以通过循环不断优化代码,直到生成满意的结果;在决策场景中,可以根据不同的条件选择不同的分支进行处理,实现更加智能的决策逻辑。

  4. 人类在环(Human-in-the-Loop):支持人工干预,这在一些对准确性和安全性要求极高的领域尤为重要。例如在医疗诊断辅助系统中,AI 生成的诊断建议可以由医生进行审核和修改;在金融风险评估中,人工可以对 AI 的决策进行监督和调整,确保决策的合理性。

  5. 多智能体协作(Multi-Agent Systems):可构建分工明确的 AI 代理团队。不同的智能体可以承担不同的角色和任务,例如在一个项目管理场景中,"规划代理" 负责制定项目计划,"执行代理" 负责调用各种工具和资源来执行计划,"监控代理" 负责实时监测项目进度和风险,通过多智能体的协作,能够高效地完成复杂的任务。

  6. 与 LangChain 无缝集成:LangGraph 可以直接复用 LangChain 的 Chains、Tools 和 Memory 组件,同时提供更强大的流程控制能力。这使得开发者可以在 LangChain 的基础上,利用 LangGraph 进一步扩展和优化应用的功能,充分发挥两者的优势。

2.3 典型应用场景

  1. 复杂问答系统:如带多轮优化的客服机器人。在电商客服场景中,用户的问题可能非常复杂,涉及多个方面。LangGraph 可以将问题解析、知识检索、答案生成等环节作为节点,通过边的流转逻辑实现多轮对话,不断优化答案,以满足用户的需求。

  2. 代码生成与测试:例如自动生成代码并迭代优化。在软件开发中,LangGraph 可以根据需求描述生成初始代码,然后通过循环和分支结构,对代码进行语法检查、功能测试等操作,如果发现问题,就返回代码生成节点进行优化,直到生成高质量的代码。

  3. 金融风控与数据分析:在金融领域,风险评估和数据分析需要处理大量的数据和复杂的逻辑。LangGraph 可以根据不同的风险指标和数据特征,动态调整决策流程,实现对风险的精准评估和控制;在数据分析中,它可以对数据进行清洗、分析、可视化等一系列操作,根据分析结果选择不同的处理路径。

  4. 多智能体协作:比如多个 AI 代理协同完成任务。在一个智能物流系统中,不同的智能体可以分别负责订单处理、库存管理、运输调度等任务,通过 LangGraph 的协调,它们能够相互配合,高效地完成整个物流流程。

  5. 医疗诊断辅助:结合专家审核的 AI 决策系统。AI 可以根据患者的症状、检查结果等信息生成初步的诊断建议,然后由医生对这些建议进行审核和修正,利用 LangGraph 可以将 AI 诊断和专家审核这两个环节有机结合,提高诊断的准确性和可靠性。

3. 快速入门准备

3.1 安装依赖

在开始使用 LangGraph 之前,需要确保你的开发环境已经安装了必要的依赖包。LangGraph 依赖于langchain库,同时为了充分发挥其功能,可能还需要其他一些工具和库。

首先,打开你的命令行终端,创建并激活一个虚拟环境(这一步是可选的,但强烈推荐,它可以帮助你隔离项目依赖,避免不同项目之间的冲突)。假设你使用venv来创建虚拟环境,命令如下:

bash 复制代码
# 创建一个名为langgraph_env的虚拟环境
python -m venv langgraph_env
# 激活虚拟环境(Windows系统)
langgraph_env\Scripts\activate
# 激活虚拟环境(Linux/macOS系统)
source langgraph_env/bin/activate

激活虚拟环境后,使用pip安装langgraph及其相关依赖:

复制代码
pip install langgraph langchain langchain-community

上述命令会安装langgraphlangchain以及langchain-community库。langchain是 LangGraph 的基础,提供了与各种语言模型交互的接口和工具;langchain-community则包含了社区贡献的各种实用工具和组件,能进一步扩展 LangGraph 的功能。

如果你希望使用可视化和监控功能,还需要安装LangSmith

复制代码
pip install langsmith

LangSmith是一个强大的工具,它可以帮助你可视化 LangGraph 的工作流程,监控模型的运行状态,分析性能指标等,大大提高开发和调试的效率。 安装完成后,你可以通过导入相关库来验证安装是否成功:

arduino 复制代码
import langgraph

import langchain

import langsmith

如果没有报错,说明安装成功,可以继续后续的学习和实践。

3.2 账号与模型准备

  1. LangSmith 账号与 API Key 获取
  • 首先,打开你的浏览器,访问 LangSmith 官网https://smith.langchain.com/

  • 点击页面上的 "注册" 按钮,按照提示填写注册信息,完成注册流程。你可以使用邮箱注册,也可以通过 Discord、GitHub、Google 等账号快速注册。

  • 注册成功后,登录到你的 LangSmith 账号。在页面左下角,找到并点击 "Settings" 图标,进入设置页面。

  • 在设置页面中,点击右上角的 "Create API Key" 按钮,为你的项目生成一个唯一的 API Key。在弹出的对话框中,输入一个描述性的名称(例如 "LangGraph 项目 API Key"),以便于识别和管理。

  • 点击 "Create API Key" 按钮后,系统会生成一个 API Key。请务必立即复制这个 API Key,并妥善保存,因为后续在使用 LangSmith 的功能时,需要将其配置到你的代码中。如果你不小心关闭了这个页面,无法再次查看已生成的 API Key,只能重新生成一个新的。

  1. 模型安装与使用
  • 以安装和使用ollama中的llama3.2模型为例。首先,确保你已经安装了ollama。你可以从ollama的官方网站(ollama.ai/)下载适合你操作系统的安装包,然后按照安装向导的提示完成安装。

  • 安装完成后,打开命令行终端,运行以下命令来安装llama3.2模型:

arduino 复制代码
ollama run llama3.2

这个命令会从模型仓库中下载llama3.2模型,并将其安装到你的本地环境中。下载过程可能需要一些时间,具体取决于你的网络速度。下载完成后,你就可以在本地使用llama3.2模型了。

  • 在 Python 代码中使用llama3.2模型,你需要先安装langchain-ollama库,它提供了与ollama模型交互的接口:

    pip install langchain-ollama

安装完成后,在 Python 代码中导入相关模块并使用模型:

ini 复制代码
from langchain_ollama import ChatOllama

# 创建一个ChatOllama实例,指定使用llama3.2模型
llm = ChatOllama(model="llama3.2")

# 使用模型生成回答
response = llm.invoke("请介绍一下LangGraph的主要特点。")
print(response)

上述代码中,我们首先导入ChatOllama类,然后创建一个ChatOllama实例,指定使用llama3.2模型。最后,通过调用invoke方法,传入一个问题,模型会返回相应的回答。 这样,我们就完成了账号和模型的准备工作,可以开始使用 LangGraph 进行开发了。

4. 深入 LangGraph 核心概念

4.1 图结构(Graph)

LangGraph 的核心是采用有向图模型来定义工作流。在这个有向图中,节点(Nodes)和边(Edges)是两个关键要素。

节点代表了各种不同的任务单元,这些任务单元可以是多种多样的操作。例如,调用大型语言模型(LLM),这在很多自然语言处理任务中是核心步骤,比如文本生成、问答系统等,通过调用强大的 LLM,利用其预训练的语言知识和理解能力,生成高质量的文本回复。再如执行工具函数,在实际应用中,我们可能需要调用各种工具来辅助完成任务,像日期处理工具、文本分析工具等,这些工具函数能够帮助我们对数据进行进一步的处理和分析,以满足具体业务需求。此外,还可以是进行数据库查询,从数据库中获取所需的数据,为后续的任务提供数据支持,无论是关系型数据库还是非关系型数据库,都能通过相应的查询语句获取到符合条件的数据记录。

边则定义了节点之间的流转逻辑,这是工作流能够按照预期顺序执行的关键。边支持条件分支和循环,使得工作流具备了很强的灵活性和适应性。以一个智能客服场景为例,当用户提出问题后,首先进入一个 "问题解析" 节点,根据解析结果(如问题类型、关键词等),通过条件边判断将工作流引导至不同的节点。如果是常见问题,可能直接进入 "常见问题答案检索" 节点;如果是复杂问题,可能进入 "知识图谱查询" 节点或者 "转人工处理" 节点。而在一些需要反复处理的任务中,循环边就发挥了重要作用。比如在代码生成任务中,如果生成的代码存在语法错误或者不符合功能要求,通过循环边可以将工作流重新引导回代码生成节点,进行迭代优化,直到生成满意的代码为止。

4.2 状态(State)

状态在 LangGraph 中扮演着非常重要的角色,它是一种全局共享的数据结构,代表了应用的当前快照。

状态的主要作用之一是支持跨节点数据传递。在整个工作流执行过程中,不同节点之间往往需要共享和传递数据。例如,在一个数据分析流程中,第一个节点可能是数据读取,从文件或者数据库中读取原始数据,这些数据会作为状态的一部分传递给下一个节点,如数据清洗节点。在数据清洗节点中,对数据进行去重、填补缺失值等操作后,更新后的状态再传递给后续的数据分析节点。通过这种方式,状态就像一根无形的线,将各个节点紧密地连接在一起,确保了数据在整个工作流中的连贯性和一致性。

同时,状态还支持持久化存储,这为断点续跑提供了可能。当一个任务在执行过程中由于各种原因(如系统故障、资源不足等)中断时,基于持久化存储的状态,我们可以在故障排除后,从断点处继续执行任务,而不需要从头开始。这在处理一些耗时较长、资源消耗较大的任务时,能够大大提高效率,减少资源浪费。例如,在一个复杂的机器学习模型训练任务中,训练过程可能需要数小时甚至数天,如果中途因为服务器断电等原因中断,利用持久化的状态,我们可以在服务器恢复供电后,直接从上次中断的训练步骤继续进行,而不需要重新初始化模型和加载数据,极大地节省了时间和计算资源。

4.3 节点(Nodes)

节点是 LangGraph 工作流中的任务执行单元,每个节点都有其明确的功能和职责。

不同类型的节点具有各自独特的特点和使用方式。LLM 节点主要负责与大型语言模型进行交互,根据输入的提示和上下文,利用 LLM 强大的语言理解和生成能力,输出相应的文本结果。在实际应用中,LLM 节点可以用于多种场景,比如在智能写作辅助工具中,用户输入一个写作主题和一些简单的描述,LLM 节点接收这些信息后,调用大型语言模型生成一篇完整的文章初稿,包括文章的结构、内容等。再如在智能翻译场景中,LLM 节点将待翻译的文本作为输入,借助语言模型的翻译能力,输出翻译后的文本。

工具节点则专注于执行各种工具函数,这些工具函数可以是自定义的业务逻辑函数,也可以是调用外部 API 的函数。例如,在一个电商订单处理系统中,有一个工具节点负责调用物流查询 API,根据订单中的物流单号,获取订单的实时物流状态信息。又如在一个文本处理项目中,工具节点可以执行文本摘要生成函数,对输入的长篇文本进行分析和处理,提取出关键信息,生成简洁的文本摘要。工具节点的存在,使得 LangGraph 能够与各种外部资源和系统进行交互,进一步扩展了其应用场景和功能。

4.4 边(Edges)

边在 LangGraph 中定义了节点之间的执行顺序,它是工作流能够按照预定逻辑有序执行的关键。

边分为普通边和条件边。普通边定义了一种简单直接的执行顺序,即当一个节点完成任务后,按照普通边的指向,直接将状态传递给下一个节点继续执行。例如,在一个简单的数据处理流程中,有三个节点:数据读取节点、数据清洗节点和数据分析节点,数据读取节点通过普通边连接到数据清洗节点,数据清洗节点又通过普通边连接到数据分析节点。当数据读取节点完成数据读取任务后,数据作为状态通过普通边传递给数据清洗节点,数据清洗节点处理完数据后,再将处理后的数据状态通过普通边传递给数据分析节点,整个流程按照普通边定义的顺序依次执行。

而条件边则赋予了工作流更强的动态性和智能性。条件边可以根据节点的输出结果或者当前状态的某些条件,动态地调整执行路径。以一个智能决策系统为例,假设有一个 "风险评估" 节点,根据输入的数据计算出风险等级。如果风险等级低于某个阈值,通过一条条件边将工作流引导至 "正常处理" 节点;如果风险等级高于阈值,则通过另一条条件边将工作流引导至 "风险预警" 节点,并触发相应的风险处理措施。通过条件边,工作流能够根据不同的情况做出合理的决策,适应更加复杂多变的业务需求。

5. 实战演练:构建简单应用

5.1 需求分析

为了更直观地理解 LangGraph 的实际应用,我们以构建一个简单的智能问答机器人为例进行实战演练。这个智能问答机器人需要具备以下核心功能:

  • 接收用户问题:能够准确接收用户输入的各种自然语言问题,无论是关于历史文化、科学技术、生活常识还是其他领域的问题,都能进行有效的捕捉和解析。例如,用户可能会问 "谁是牛顿?""人工智能有哪些应用场景?""如何制作蛋糕?" 等。

  • 提取问题关键词:从用户输入的问题中提取关键信息,这些关键词将作为后续检索和生成回答的重要依据。以 "人工智能有哪些应用场景?" 这个问题为例,关键词可能包括 "人工智能""应用场景" 等。通过准确提取关键词,可以更精准地定位相关知识和信息,提高回答的准确性和相关性。

  • 生成回答:根据提取的关键词,利用大型语言模型(LLM)生成相应的回答。在生成回答的过程中,模型会结合自身的语言知识和训练数据,以及可能检索到的相关信息,组织出合理、准确且有针对性的答案。例如,对于 "谁是牛顿?" 这个问题,模型可能会回答 "艾萨克・牛顿是英国著名的物理学家、数学家和天文学家,他发现了万有引力定律,提出了牛顿运动定律,在光学、数学等领域也有卓越的贡献 ,对现代科学的发展产生了深远的影响。"

  • 多轮对话支持(可选扩展):在实际应用中,用户的问题可能需要通过多轮对话才能得到完整的解答。例如,用户先问 "人工智能有哪些应用场景?" 在得到一个概括性的回答后,可能会进一步追问 "在医疗领域具体有哪些应用?" 智能问答机器人需要能够理解多轮对话中的上下文关系,基于之前的对话历史和当前的问题,生成连贯、准确的回答。这就要求机器人具备良好的状态管理和上下文理解能力,能够在多轮对话中保持对用户问题的持续跟踪和理解。

5.2 代码实现步骤

接下来,我们逐步展示使用 LangGraph 构建这个智能问答机器人的代码实现过程。

  1. 导入必要的库
javascript 复制代码
from langgraph import StateGraph, START, END, interrupt
from langchain_ollama import ChatOllama
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
import os

这里我们导入了StateGraph及其相关的常量STARTEND,用于构建 LangGraph 的图结构;interrupt用于实现中断和用户交互;ChatOllama作为我们的大型语言模型;PromptTemplateLLMChain用于构建和执行语言模型的提示和链;OpenAIEmbeddings用于生成文本的嵌入向量;Chroma作为向量存储;RecursiveCharacterTextSplitter用于分割文本;TextLoader用于加载文本文件;os用于操作系统相关的操作。

  1. 定义智能体和加载模型
ini 复制代码
# 初始化Ollama模型
llm = ChatOllama(model="llama3.2")

# 定义提示模板
prompt_template = PromptTemplate(
    input_variables=["question"],
    template="请回答这个问题:{question}"
)

# 创建LLMChain
llm_chain = LLMChain(llm=llm, prompt=prompt_template)

首先,我们初始化了ChatOllama模型,指定使用llama3.2模型。然后,定义了一个简单的提示模板,它接受一个question变量,并将其嵌入到模板字符串中,用于向模型提问。最后,基于这个提示模板和模型创建了LLMChain,这个链将负责实际的问题回答任务。

  1. 准备知识源(以本地文本文件为例)
ini 复制代码
# 加载本地文本文件作为知识源
loader = TextLoader('knowledge.txt')
documents = loader.load()

# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)

# 生成嵌入向量并存储到Chroma向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

这里我们使用TextLoader加载本地的knowledge.txt文件作为知识源。然后,通过RecursiveCharacterTextSplitter将文件内容分割成较小的文本块,每个块大小为 1000 个字符,重叠部分为 200 个字符,这样可以确保语义的连贯性。接着,使用OpenAIEmbeddings生成这些文本块的嵌入向量,并将其存储到Chroma向量数据库中,以便后续根据关键词进行检索。

  1. 定义节点函数
ini 复制代码
def extract_keywords(state):
    question = state["question"]
    # 这里可以使用更复杂的关键词提取算法,暂时简单处理
    keywords = question.split()
    return {"keywords": keywords}


def retrieve_info(state):
    keywords = state["keywords"]
    query = " ".join(keywords)
    docs = vectorstore.similarity_search(query)
    relevant_info = "\n".join([doc.page_content for doc in docs])
    return {"relevant_info": relevant_info}


def generate_answer(state):
    question = state["question"]
    relevant_info = state.get("relevant_info", "")
    full_prompt = f"根据以下信息回答问题:{relevant_info}\n问题:{question}"
    answer = llm_chain.run(full_prompt)
    return {"answer": answer}

extract_keywords函数从状态中获取用户的问题,并简单地将问题按空格分割成关键词。在实际应用中,可以使用更复杂的自然语言处理技术,如词性标注、命名实体识别等,来更准确地提取关键词。

retrieve_info函数根据提取的关键词,在向量数据库中进行相似度搜索,获取相关的文档。然后将这些文档的内容合并成一个字符串,作为相关信息返回。这里使用的是similarity_search方法进行相似度搜索,它会根据向量的相似度返回最相关的文档。

generate_answer函数结合用户的问题和检索到的相关信息,构建一个完整的提示,然后通过LLMChain运行这个提示,得到模型生成的回答。

  1. 连接智能体,定义图的状态和结构
python 复制代码
# 定义图的状态类型
class QAState(TypedDict):
    question: str
    keywords: list[str]
    relevant_info: str
    answer: str


# 创建StateGraph实例
builder = StateGraph(QAState)

# 添加节点
builder.add_node("extract_keywords", extract_keywords)
builder.add_node("retrieve_info", retrieve_info)
builder.add_node("generate_answer", generate_answer)

# 添加边,定义执行顺序
builder.add_edge(START, "extract_keywords")
builder.add_edge("extract_keywords", "retrieve_info")
builder.add_edge("retrieve_info", "generate_answer")
builder.add_edge("generate_answer", END)

# 编译图
graph = builder.compile()

首先,定义了一个QAState类型,它描述了智能问答机器人在运行过程中的状态,包括用户的问题、提取的关键词、检索到的相关信息和生成的回答。

然后,创建了一个StateGraph实例builder,并使用add_node方法添加了三个节点:extract_keywordsretrieve_infogenerate_answer,分别对应关键词提取、信息检索和回答生成的功能。

接着,使用add_edge方法定义了节点之间的执行顺序,从START开始,依次经过extract_keywordsretrieve_infogenerate_answer,最后到达END

最后,通过compile方法编译图,使其可以被执行。

5.3 运行与测试

  1. 运行代码
perl 复制代码
# 运行图
state = {"question": "人工智能有哪些应用场景?"}
for chunk in graph.stream(state):
    if "answer" in chunk:
        print("回答:", chunk["answer"])

在上述代码中,我们创建了一个初始状态state,其中包含用户的问题 "人工智能有哪些应用场景?" 然后,通过graph.stream(state)方法来运行图,这个方法会返回一个生成器,我们可以遍历这个生成器来获取每个节点的输出。当输出中包含answer时,说明回答已经生成,我们打印出回答内容。

  1. 测试结果展示

    运行上述代码后,你应该能够看到智能问答机器人根据你的问题生成的回答。例如,可能会得到类似以下的回答:

markdown 复制代码
回答: 人工智能有广泛的应用场景,包括但不限于以下领域:
1. **医疗保健**:辅助疾病诊断、药物研发、医疗影像分析等。例如,通过分析大量的医疗数据,人工智能可以帮助医生更准确地诊断疾病,预测疾病的发展趋势。
2. **金融**:风险评估、投资决策、欺诈检测等。人工智能可以分析市场数据和客户行为,为金融机构提供决策支持,同时有效地检测和防范金融欺诈。
3. **交通**:自动驾驶、交通流量优化等。自动驾驶技术利用人工智能实现车辆的自主驾驶,提高交通安全性和效率;交通流量优化系统则通过分析实时交通数据,调整信号灯时间,缓解交通拥堵。
4. **教育**:个性化学习、智能辅导等。人工智能可以根据学生的学习情况和特点,提供个性化的学习方案和辅导,帮助学生更好地掌握知识。
5. **制造业**:质量控制、生产优化等。在制造业中,人工智能可以用于检测产品质量,优化生产流程,提高生产效率和降低成本。
6. **娱乐**:游戏开发、内容推荐等。人工智能可以生成更加智能的游戏对手,为用户提供个性化的娱乐内容推荐,提升用户体验。
  1. 可能出现的问题及解决方法
  • 模型加载失败

    • 问题描述:可能由于网络问题、模型名称错误或模型文件损坏等原因,导致模型无法成功加载,程序抛出异常。

    • 解决方法 :首先检查网络连接是否正常,可以尝试访问其他网络资源。如果网络正常,确认模型名称是否正确,例如在使用ChatOllama时,确保model参数设置为正确的模型名称,如llama3.2。如果模型文件损坏,可以尝试重新下载模型。

  • 关键词提取不准确

    • 问题描述:简单的按空格分割关键词可能无法准确提取关键信息,导致后续的信息检索和回答生成不准确。

    • 解决方法 :可以使用更专业的关键词提取工具,如jieba库(适用于中文)或nltk库(适用于英文)。这些库提供了更复杂的算法,如 TF-IDF、TextRank 等,可以更准确地提取关键词。例如,使用jieba.analyse.extract_tags方法来提取中文关键词。

  • 信息检索结果不理想

    • 问题描述:检索到的相关信息可能与问题不相关或不够全面,影响回答的质量。

    • 解决方法 :可以调整向量数据库的检索参数,如similarity_search中的k值,它表示返回的最相关文档数量,可以根据实际情况适当增大或减小这个值,以获取更合适的检索结果。此外,可以尝试使用更高级的检索算法,如基于语义理解的检索,来提高检索的准确性。

  • 回答生成不符合预期

    • 问题描述:生成的回答可能存在逻辑错误、内容不完整或与问题无关等情况。

    • 解决方法:检查提示模板的设计是否合理,是否能够准确引导模型生成正确的回答。可以尝试调整提示模板,添加更多的约束和引导信息。同时,也可以考虑对模型进行微调,使其更适应特定领域的问答任务。例如,如果是针对医疗领域的问答,可以使用医疗领域的专业数据对模型进行微调,提高其在该领域的回答准确性。

6. 学习资源推荐

如果你想更深入地学习 LangGraph,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度深入理解 LangGraph,提升你的实践能力。

  1. 官方文档 :LangGraph 的官方文档是最权威、最全面的学习资料。它详细介绍了 LangGraph 的核心概念、API 参考、使用方法以及各种高级特性。官方文档地址:langchain-ai.github.io/langgraph/ 。在官方文档中,你可以找到丰富的示例代码,这些代码涵盖了从简单到复杂的各种应用场景,通过阅读和运行这些代码,你可以快速掌握 LangGraph 的基本用法和实践技巧。同时,文档中对每个概念和 API 的解释都非常详细,能够帮助你深入理解 LangGraph 的工作原理和设计思路,为你在实际项目中应用 LangGraph 打下坚实的基础。

LangGraph从0到1:开启大模型开发新征程

本文较长,建议点赞收藏,以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<<

1. 引言:LangGraph 的魅力

在当今数字化时代,大模型技术的应用已经渗透到我们生活的方方面面。想象一下,你在一家电商平台购物,遇到了关于商品信息、订单状态或售后服务等问题。以往,你可能需要在繁琐的常见问题解答页面中自行查找答案,或者等待人工客服的回复,耗费大量的时间和精力。但现在,有了先进的大模型智能客服,一切都变得简单高效。

你只需在对话框中输入你的问题,例如 "我买的这件衣服有其他颜色吗?我之前下单的订单怎么还没发货?" 智能客服能够瞬间理解你的意图,不仅快速给出准确的回答,还能根据你的历史购物记录和偏好,提供个性化的推荐和解决方案。甚至当你的问题比较复杂,需要多轮对话才能解决时,它也能应对自如,就像一位贴心的购物助手,全程陪伴并满足你的需求。

而在这看似神奇的智能客服背后,LangGraph 发挥着关键的作用。它就像是智能客服的 "智慧大脑",为其提供了强大的逻辑推理、知识检索和多轮对话管理能力,让智能客服能够从海量的商品信息和用户数据中,精准地找到答案,并以最自然、流畅的方式与用户交流。

LangGraph 不仅仅局限于电商智能客服这一场景,在智能写作辅助、智能法律咨询、智能教育辅导等众多领域,都有着广泛的应用前景。它为大模型的落地应用开辟了新的道路,让我们能够更加充分地享受到大模型技术带来的便利和创新。接下来,就让我们一起走进 LangGraph 的世界,从 0 开始学习如何利用它开启大模型应用的精彩之旅。

2. 认识 LangGraph

2.1 什么是 LangGraph

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

与传统的线性工作流不同,LangGraph 采用有向图模型,其中节点(Nodes)代表各种任务单元,比如调用大型语言模型(LLM)、执行工具函数、进行数据库查询等;边(Edges)则定义了节点之间的流转逻辑,并且支持条件分支和循环。这种设计使得 LangGraph 能够处理非常复杂的动态流程,例如多轮对话、迭代优化以及多智能体协作等场景 ,为开发者提供了极大的灵活性和控制力。

2.2 核心特点

  1. 图结构(Graph-Based):采用有向图模型,由节点和边组成。节点是任务的基本单元,边则描述了任务执行的顺序和条件。这种结构使得 LangGraph 能够清晰地表达复杂的工作流程,比如在一个智能客服系统中,不同的节点可以分别处理用户问题的解析、知识检索、答案生成等任务,而边则根据用户问题的类型和检索结果来决定执行路径。

  2. 状态管理(State Management):提供全局共享状态,支持跨节点数据传递和持久化存储。这意味着在整个工作流执行过程中,各个节点可以访问和修改共享状态,并且状态可以被保存下来,以便在后续的执行中继续使用。例如,在一个数据分析项目中,前面节点生成的中间数据可以作为状态传递给后面的节点进行进一步处理,而且即使任务中断,也可以基于保存的状态恢复执行。

  3. 循环与分支(Loops & Conditional Flows):允许 AI 代理根据中间结果动态调整执行路径。比如在代码生成任务中,如果生成的代码不符合要求,AI 代理可以通过循环不断优化代码,直到生成满意的结果;在决策场景中,可以根据不同的条件选择不同的分支进行处理,实现更加智能的决策逻辑。

  4. 人类在环(Human-in-the-Loop):支持人工干预,这在一些对准确性和安全性要求极高的领域尤为重要。例如在医疗诊断辅助系统中,AI 生成的诊断建议可以由医生进行审核和修改;在金融风险评估中,人工可以对 AI 的决策进行监督和调整,确保决策的合理性。

  5. 多智能体协作(Multi-Agent Systems):可构建分工明确的 AI 代理团队。不同的智能体可以承担不同的角色和任务,例如在一个项目管理场景中,"规划代理" 负责制定项目计划,"执行代理" 负责调用各种工具和资源来执行计划,"监控代理" 负责实时监测项目进度和风险,通过多智能体的协作,能够高效地完成复杂的任务。

  6. 与 LangChain 无缝集成:LangGraph 可以直接复用 LangChain 的 Chains、Tools 和 Memory 组件,同时提供更强大的流程控制能力。这使得开发者可以在 LangChain 的基础上,利用 LangGraph 进一步扩展和优化应用的功能,充分发挥两者的优势。

2.3 典型应用场景

  1. 复杂问答系统:如带多轮优化的客服机器人。在电商客服场景中,用户的问题可能非常复杂,涉及多个方面。LangGraph 可以将问题解析、知识检索、答案生成等环节作为节点,通过边的流转逻辑实现多轮对话,不断优化答案,以满足用户的需求。

  2. 代码生成与测试:例如自动生成代码并迭代优化。在软件开发中,LangGraph 可以根据需求描述生成初始代码,然后通过循环和分支结构,对代码进行语法检查、功能测试等操作,如果发现问题,就返回代码生成节点进行优化,直到生成高质量的代码。

  3. 金融风控与数据分析:在金融领域,风险评估和数据分析需要处理大量的数据和复杂的逻辑。LangGraph 可以根据不同的风险指标和数据特征,动态调整决策流程,实现对风险的精准评估和控制;在数据分析中,它可以对数据进行清洗、分析、可视化等一系列操作,根据分析结果选择不同的处理路径。

  4. 多智能体协作:比如多个 AI 代理协同完成任务。在一个智能物流系统中,不同的智能体可以分别负责订单处理、库存管理、运输调度等任务,通过 LangGraph 的协调,它们能够相互配合,高效地完成整个物流流程。

  5. 医疗诊断辅助:结合专家审核的 AI 决策系统。AI 可以根据患者的症状、检查结果等信息生成初步的诊断建议,然后由医生对这些建议进行审核和修正,利用 LangGraph 可以将 AI 诊断和专家审核这两个环节有机结合,提高诊断的准确性和可靠性。

3. 快速入门准备

3.1 安装依赖

在开始使用 LangGraph 之前,需要确保你的开发环境已经安装了必要的依赖包。LangGraph 依赖于langchain库,同时为了充分发挥其功能,可能还需要其他一些工具和库。

首先,打开你的命令行终端,创建并激活一个虚拟环境(这一步是可选的,但强烈推荐,它可以帮助你隔离项目依赖,避免不同项目之间的冲突)。假设你使用venv来创建虚拟环境,命令如下:

bash 复制代码
# 创建一个名为langgraph_env的虚拟环境
python -m venv langgraph_env
# 激活虚拟环境(Windows系统)
langgraph_env\Scripts\activate
# 激活虚拟环境(Linux/macOS系统)
source langgraph_env/bin/activate

激活虚拟环境后,使用pip安装langgraph及其相关依赖:

复制代码
pip install langgraph langchain langchain-community

上述命令会安装langgraphlangchain以及langchain-community库。langchain是 LangGraph 的基础,提供了与各种语言模型交互的接口和工具;langchain-community则包含了社区贡献的各种实用工具和组件,能进一步扩展 LangGraph 的功能。

如果你希望使用可视化和监控功能,还需要安装LangSmith

复制代码
pip install langsmith

LangSmith是一个强大的工具,它可以帮助你可视化 LangGraph 的工作流程,监控模型的运行状态,分析性能指标等,大大提高开发和调试的效率。 安装完成后,你可以通过导入相关库来验证安装是否成功:

arduino 复制代码
import langgraph

import langchain

import langsmith

如果没有报错,说明安装成功,可以继续后续的学习和实践。

3.2 账号与模型准备

  1. LangSmith 账号与 API Key 获取
  • 首先,打开你的浏览器,访问 LangSmith 官网https://smith.langchain.com/

  • 点击页面上的 "注册" 按钮,按照提示填写注册信息,完成注册流程。你可以使用邮箱注册,也可以通过 Discord、GitHub、Google 等账号快速注册。

  • 注册成功后,登录到你的 LangSmith 账号。在页面左下角,找到并点击 "Settings" 图标,进入设置页面。

  • 在设置页面中,点击右上角的 "Create API Key" 按钮,为你的项目生成一个唯一的 API Key。在弹出的对话框中,输入一个描述性的名称(例如 "LangGraph 项目 API Key"),以便于识别和管理。

  • 点击 "Create API Key" 按钮后,系统会生成一个 API Key。请务必立即复制这个 API Key,并妥善保存,因为后续在使用 LangSmith 的功能时,需要将其配置到你的代码中。如果你不小心关闭了这个页面,无法再次查看已生成的 API Key,只能重新生成一个新的。

  1. 模型安装与使用
  • 以安装和使用ollama中的llama3.2模型为例。首先,确保你已经安装了ollama。你可以从ollama的官方网站(ollama.ai/)下载适合你操作系统的安装包,然后按照安装向导的提示完成安装。

  • 安装完成后,打开命令行终端,运行以下命令来安装llama3.2模型:

arduino 复制代码
ollama run llama3.2

这个命令会从模型仓库中下载llama3.2模型,并将其安装到你的本地环境中。下载过程可能需要一些时间,具体取决于你的网络速度。下载完成后,你就可以在本地使用llama3.2模型了。

  • 在 Python 代码中使用llama3.2模型,你需要先安装langchain-ollama库,它提供了与ollama模型交互的接口:

    pip install langchain-ollama

安装完成后,在 Python 代码中导入相关模块并使用模型:

ini 复制代码
from langchain_ollama import ChatOllama

# 创建一个ChatOllama实例,指定使用llama3.2模型
llm = ChatOllama(model="llama3.2")

# 使用模型生成回答
response = llm.invoke("请介绍一下LangGraph的主要特点。")
print(response)

上述代码中,我们首先导入ChatOllama类,然后创建一个ChatOllama实例,指定使用llama3.2模型。最后,通过调用invoke方法,传入一个问题,模型会返回相应的回答。 这样,我们就完成了账号和模型的准备工作,可以开始使用 LangGraph 进行开发了。

4. 深入 LangGraph 核心概念

4.1 图结构(Graph)

LangGraph 的核心是采用有向图模型来定义工作流。在这个有向图中,节点(Nodes)和边(Edges)是两个关键要素。

节点代表了各种不同的任务单元,这些任务单元可以是多种多样的操作。例如,调用大型语言模型(LLM),这在很多自然语言处理任务中是核心步骤,比如文本生成、问答系统等,通过调用强大的 LLM,利用其预训练的语言知识和理解能力,生成高质量的文本回复。再如执行工具函数,在实际应用中,我们可能需要调用各种工具来辅助完成任务,像日期处理工具、文本分析工具等,这些工具函数能够帮助我们对数据进行进一步的处理和分析,以满足具体业务需求。此外,还可以是进行数据库查询,从数据库中获取所需的数据,为后续的任务提供数据支持,无论是关系型数据库还是非关系型数据库,都能通过相应的查询语句获取到符合条件的数据记录。

边则定义了节点之间的流转逻辑,这是工作流能够按照预期顺序执行的关键。边支持条件分支和循环,使得工作流具备了很强的灵活性和适应性。以一个智能客服场景为例,当用户提出问题后,首先进入一个 "问题解析" 节点,根据解析结果(如问题类型、关键词等),通过条件边判断将工作流引导至不同的节点。如果是常见问题,可能直接进入 "常见问题答案检索" 节点;如果是复杂问题,可能进入 "知识图谱查询" 节点或者 "转人工处理" 节点。而在一些需要反复处理的任务中,循环边就发挥了重要作用。比如在代码生成任务中,如果生成的代码存在语法错误或者不符合功能要求,通过循环边可以将工作流重新引导回代码生成节点,进行迭代优化,直到生成满意的代码为止。

4.2 状态(State)

状态在 LangGraph 中扮演着非常重要的角色,它是一种全局共享的数据结构,代表了应用的当前快照。

状态的主要作用之一是支持跨节点数据传递。在整个工作流执行过程中,不同节点之间往往需要共享和传递数据。例如,在一个数据分析流程中,第一个节点可能是数据读取,从文件或者数据库中读取原始数据,这些数据会作为状态的一部分传递给下一个节点,如数据清洗节点。在数据清洗节点中,对数据进行去重、填补缺失值等操作后,更新后的状态再传递给后续的数据分析节点。通过这种方式,状态就像一根无形的线,将各个节点紧密地连接在一起,确保了数据在整个工作流中的连贯性和一致性。

同时,状态还支持持久化存储,这为断点续跑提供了可能。当一个任务在执行过程中由于各种原因(如系统故障、资源不足等)中断时,基于持久化存储的状态,我们可以在故障排除后,从断点处继续执行任务,而不需要从头开始。这在处理一些耗时较长、资源消耗较大的任务时,能够大大提高效率,减少资源浪费。例如,在一个复杂的机器学习模型训练任务中,训练过程可能需要数小时甚至数天,如果中途因为服务器断电等原因中断,利用持久化的状态,我们可以在服务器恢复供电后,直接从上次中断的训练步骤继续进行,而不需要重新初始化模型和加载数据,极大地节省了时间和计算资源。

4.3 节点(Nodes)

节点是 LangGraph 工作流中的任务执行单元,每个节点都有其明确的功能和职责。

不同类型的节点具有各自独特的特点和使用方式。LLM 节点主要负责与大型语言模型进行交互,根据输入的提示和上下文,利用 LLM 强大的语言理解和生成能力,输出相应的文本结果。在实际应用中,LLM 节点可以用于多种场景,比如在智能写作辅助工具中,用户输入一个写作主题和一些简单的描述,LLM 节点接收这些信息后,调用大型语言模型生成一篇完整的文章初稿,包括文章的结构、内容等。再如在智能翻译场景中,LLM 节点将待翻译的文本作为输入,借助语言模型的翻译能力,输出翻译后的文本。

工具节点则专注于执行各种工具函数,这些工具函数可以是自定义的业务逻辑函数,也可以是调用外部 API 的函数。例如,在一个电商订单处理系统中,有一个工具节点负责调用物流查询 API,根据订单中的物流单号,获取订单的实时物流状态信息。又如在一个文本处理项目中,工具节点可以执行文本摘要生成函数,对输入的长篇文本进行分析和处理,提取出关键信息,生成简洁的文本摘要。工具节点的存在,使得 LangGraph 能够与各种外部资源和系统进行交互,进一步扩展了其应用场景和功能。

4.4 边(Edges)

边在 LangGraph 中定义了节点之间的执行顺序,它是工作流能够按照预定逻辑有序执行的关键。

边分为普通边和条件边。普通边定义了一种简单直接的执行顺序,即当一个节点完成任务后,按照普通边的指向,直接将状态传递给下一个节点继续执行。例如,在一个简单的数据处理流程中,有三个节点:数据读取节点、数据清洗节点和数据分析节点,数据读取节点通过普通边连接到数据清洗节点,数据清洗节点又通过普通边连接到数据分析节点。当数据读取节点完成数据读取任务后,数据作为状态通过普通边传递给数据清洗节点,数据清洗节点处理完数据后,再将处理后的数据状态通过普通边传递给数据分析节点,整个流程按照普通边定义的顺序依次执行。

而条件边则赋予了工作流更强的动态性和智能性。条件边可以根据节点的输出结果或者当前状态的某些条件,动态地调整执行路径。以一个智能决策系统为例,假设有一个 "风险评估" 节点,根据输入的数据计算出风险等级。如果风险等级低于某个阈值,通过一条条件边将工作流引导至 "正常处理" 节点;如果风险等级高于阈值,则通过另一条条件边将工作流引导至 "风险预警" 节点,并触发相应的风险处理措施。通过条件边,工作流能够根据不同的情况做出合理的决策,适应更加复杂多变的业务需求。

5. 实战演练:构建简单应用

5.1 需求分析

为了更直观地理解 LangGraph 的实际应用,我们以构建一个简单的智能问答机器人为例进行实战演练。这个智能问答机器人需要具备以下核心功能:

  • 接收用户问题:能够准确接收用户输入的各种自然语言问题,无论是关于历史文化、科学技术、生活常识还是其他领域的问题,都能进行有效的捕捉和解析。例如,用户可能会问 "谁是牛顿?""人工智能有哪些应用场景?""如何制作蛋糕?" 等。

  • 提取问题关键词:从用户输入的问题中提取关键信息,这些关键词将作为后续检索和生成回答的重要依据。以 "人工智能有哪些应用场景?" 这个问题为例,关键词可能包括 "人工智能""应用场景" 等。通过准确提取关键词,可以更精准地定位相关知识和信息,提高回答的准确性和相关性。

  • 生成回答:根据提取的关键词,利用大型语言模型(LLM)生成相应的回答。在生成回答的过程中,模型会结合自身的语言知识和训练数据,以及可能检索到的相关信息,组织出合理、准确且有针对性的答案。例如,对于 "谁是牛顿?" 这个问题,模型可能会回答 "艾萨克・牛顿是英国著名的物理学家、数学家和天文学家,他发现了万有引力定律,提出了牛顿运动定律,在光学、数学等领域也有卓越的贡献 ,对现代科学的发展产生了深远的影响。"

  • 多轮对话支持(可选扩展):在实际应用中,用户的问题可能需要通过多轮对话才能得到完整的解答。例如,用户先问 "人工智能有哪些应用场景?" 在得到一个概括性的回答后,可能会进一步追问 "在医疗领域具体有哪些应用?" 智能问答机器人需要能够理解多轮对话中的上下文关系,基于之前的对话历史和当前的问题,生成连贯、准确的回答。这就要求机器人具备良好的状态管理和上下文理解能力,能够在多轮对话中保持对用户问题的持续跟踪和理解。

5.2 代码实现步骤

接下来,我们逐步展示使用 LangGraph 构建这个智能问答机器人的代码实现过程。

  1. 导入必要的库
javascript 复制代码
from langgraph import StateGraph, START, END, interrupt
from langchain_ollama import ChatOllama
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
import os

这里我们导入了StateGraph及其相关的常量STARTEND,用于构建 LangGraph 的图结构;interrupt用于实现中断和用户交互;ChatOllama作为我们的大型语言模型;PromptTemplateLLMChain用于构建和执行语言模型的提示和链;OpenAIEmbeddings用于生成文本的嵌入向量;Chroma作为向量存储;RecursiveCharacterTextSplitter用于分割文本;TextLoader用于加载文本文件;os用于操作系统相关的操作。

  1. 定义智能体和加载模型
ini 复制代码
# 初始化Ollama模型
llm = ChatOllama(model="llama3.2")

# 定义提示模板
prompt_template = PromptTemplate(
    input_variables=["question"],
    template="请回答这个问题:{question}"
)

# 创建LLMChain
llm_chain = LLMChain(llm=llm, prompt=prompt_template)

首先,我们初始化了ChatOllama模型,指定使用llama3.2模型。然后,定义了一个简单的提示模板,它接受一个question变量,并将其嵌入到模板字符串中,用于向模型提问。最后,基于这个提示模板和模型创建了LLMChain,这个链将负责实际的问题回答任务。

  1. 准备知识源(以本地文本文件为例)
ini 复制代码
# 加载本地文本文件作为知识源
loader = TextLoader('knowledge.txt')
documents = loader.load()

# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)

# 生成嵌入向量并存储到Chroma向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

这里我们使用TextLoader加载本地的knowledge.txt文件作为知识源。然后,通过RecursiveCharacterTextSplitter将文件内容分割成较小的文本块,每个块大小为 1000 个字符,重叠部分为 200 个字符,这样可以确保语义的连贯性。接着,使用OpenAIEmbeddings生成这些文本块的嵌入向量,并将其存储到Chroma向量数据库中,以便后续根据关键词进行检索。

  1. 定义节点函数
ini 复制代码
def extract_keywords(state):
    question = state["question"]
    # 这里可以使用更复杂的关键词提取算法,暂时简单处理
    keywords = question.split()
    return {"keywords": keywords}


def retrieve_info(state):
    keywords = state["keywords"]
    query = " ".join(keywords)
    docs = vectorstore.similarity_search(query)
    relevant_info = "\n".join([doc.page_content for doc in docs])
    return {"relevant_info": relevant_info}


def generate_answer(state):
    question = state["question"]
    relevant_info = state.get("relevant_info", "")
    full_prompt = f"根据以下信息回答问题:{relevant_info}\n问题:{question}"
    answer = llm_chain.run(full_prompt)
    return {"answer": answer}

extract_keywords函数从状态中获取用户的问题,并简单地将问题按空格分割成关键词。在实际应用中,可以使用更复杂的自然语言处理技术,如词性标注、命名实体识别等,来更准确地提取关键词。

retrieve_info函数根据提取的关键词,在向量数据库中进行相似度搜索,获取相关的文档。然后将这些文档的内容合并成一个字符串,作为相关信息返回。这里使用的是similarity_search方法进行相似度搜索,它会根据向量的相似度返回最相关的文档。

generate_answer函数结合用户的问题和检索到的相关信息,构建一个完整的提示,然后通过LLMChain运行这个提示,得到模型生成的回答。

  1. 连接智能体,定义图的状态和结构
python 复制代码
# 定义图的状态类型
class QAState(TypedDict):
    question: str
    keywords: list[str]
    relevant_info: str
    answer: str


# 创建StateGraph实例
builder = StateGraph(QAState)

# 添加节点
builder.add_node("extract_keywords", extract_keywords)
builder.add_node("retrieve_info", retrieve_info)
builder.add_node("generate_answer", generate_answer)

# 添加边,定义执行顺序
builder.add_edge(START, "extract_keywords")
builder.add_edge("extract_keywords", "retrieve_info")
builder.add_edge("retrieve_info", "generate_answer")
builder.add_edge("generate_answer", END)

# 编译图
graph = builder.compile()

首先,定义了一个QAState类型,它描述了智能问答机器人在运行过程中的状态,包括用户的问题、提取的关键词、检索到的相关信息和生成的回答。

然后,创建了一个StateGraph实例builder,并使用add_node方法添加了三个节点:extract_keywordsretrieve_infogenerate_answer,分别对应关键词提取、信息检索和回答生成的功能。

接着,使用add_edge方法定义了节点之间的执行顺序,从START开始,依次经过extract_keywordsretrieve_infogenerate_answer,最后到达END

最后,通过compile方法编译图,使其可以被执行。

5.3 运行与测试

  1. 运行代码
perl 复制代码
# 运行图
state = {"question": "人工智能有哪些应用场景?"}
for chunk in graph.stream(state):
    if "answer" in chunk:
        print("回答:", chunk["answer"])

在上述代码中,我们创建了一个初始状态state,其中包含用户的问题 "人工智能有哪些应用场景?" 然后,通过graph.stream(state)方法来运行图,这个方法会返回一个生成器,我们可以遍历这个生成器来获取每个节点的输出。当输出中包含answer时,说明回答已经生成,我们打印出回答内容。

  1. 测试结果展示

    运行上述代码后,你应该能够看到智能问答机器人根据你的问题生成的回答。例如,可能会得到类似以下的回答:

markdown 复制代码
回答: 人工智能有广泛的应用场景,包括但不限于以下领域:
1. **医疗保健**:辅助疾病诊断、药物研发、医疗影像分析等。例如,通过分析大量的医疗数据,人工智能可以帮助医生更准确地诊断疾病,预测疾病的发展趋势。
2. **金融**:风险评估、投资决策、欺诈检测等。人工智能可以分析市场数据和客户行为,为金融机构提供决策支持,同时有效地检测和防范金融欺诈。
3. **交通**:自动驾驶、交通流量优化等。自动驾驶技术利用人工智能实现车辆的自主驾驶,提高交通安全性和效率;交通流量优化系统则通过分析实时交通数据,调整信号灯时间,缓解交通拥堵。
4. **教育**:个性化学习、智能辅导等。人工智能可以根据学生的学习情况和特点,提供个性化的学习方案和辅导,帮助学生更好地掌握知识。
5. **制造业**:质量控制、生产优化等。在制造业中,人工智能可以用于检测产品质量,优化生产流程,提高生产效率和降低成本。
6. **娱乐**:游戏开发、内容推荐等。人工智能可以生成更加智能的游戏对手,为用户提供个性化的娱乐内容推荐,提升用户体验。
  1. 可能出现的问题及解决方法
  • 模型加载失败

    • 问题描述:可能由于网络问题、模型名称错误或模型文件损坏等原因,导致模型无法成功加载,程序抛出异常。

    • 解决方法 :首先检查网络连接是否正常,可以尝试访问其他网络资源。如果网络正常,确认模型名称是否正确,例如在使用ChatOllama时,确保model参数设置为正确的模型名称,如llama3.2。如果模型文件损坏,可以尝试重新下载模型。

  • 关键词提取不准确

    • 问题描述:简单的按空格分割关键词可能无法准确提取关键信息,导致后续的信息检索和回答生成不准确。

    • 解决方法 :可以使用更专业的关键词提取工具,如jieba库(适用于中文)或nltk库(适用于英文)。这些库提供了更复杂的算法,如 TF-IDF、TextRank 等,可以更准确地提取关键词。例如,使用jieba.analyse.extract_tags方法来提取中文关键词。

  • 信息检索结果不理想

    • 问题描述:检索到的相关信息可能与问题不相关或不够全面,影响回答的质量。

    • 解决方法 :可以调整向量数据库的检索参数,如similarity_search中的k值,它表示返回的最相关文档数量,可以根据实际情况适当增大或减小这个值,以获取更合适的检索结果。此外,可以尝试使用更高级的检索算法,如基于语义理解的检索,来提高检索的准确性。

  • 回答生成不符合预期

    • 问题描述:生成的回答可能存在逻辑错误、内容不完整或与问题无关等情况。

    • 解决方法:检查提示模板的设计是否合理,是否能够准确引导模型生成正确的回答。可以尝试调整提示模板,添加更多的约束和引导信息。同时,也可以考虑对模型进行微调,使其更适应特定领域的问答任务。例如,如果是针对医疗领域的问答,可以使用医疗领域的专业数据对模型进行微调,提高其在该领域的回答准确性。

6. 学习资源推荐

如果你想更深入地学习 LangGraph,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度深入理解 LangGraph,提升你的实践能力。

  1. 官方文档 :LangGraph 的官方文档是最权威、最全面的学习资料。它详细介绍了 LangGraph 的核心概念、API 参考、使用方法以及各种高级特性。官方文档地址:langchain-ai.github.io/langgraph/ 。在官方文档中,你可以找到丰富的示例代码,这些代码涵盖了从简单到复杂的各种应用场景,通过阅读和运行这些代码,你可以快速掌握 LangGraph 的基本用法和实践技巧。同时,文档中对每个概念和 API 的解释都非常详细,能够帮助你深入理解 LangGraph 的工作原理和设计思路,为你在实际项目中应用 LangGraph 打下坚实的基础。

本文较长,建议点赞收藏,以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<<

相关推荐
却道天凉_好个秋12 小时前
深度学习(二):神经元与神经网络
人工智能·神经网络·计算机视觉·神经元
UQI-LIUWJ12 小时前
unsloth笔记:运行&微调 gemma
人工智能·笔记·深度学习
THMAIL12 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
却道天凉_好个秋12 小时前
计算机视觉(八):开运算和闭运算
人工智能·计算机视觉·开运算与闭运算
无风听海12 小时前
神经网络之深入理解偏置
人工智能·神经网络·机器学习·偏置
JoinApper12 小时前
目标检测系列-Yolov5下载及运行
人工智能·yolo·目标检测
飞哥数智坊12 小时前
即梦4.0实测:我真想对PS说“拜拜”了!
人工智能
fantasy_arch13 小时前
9.3深度循环神经网络
人工智能·rnn·深度学习
Ai工具分享13 小时前
视频画质差怎么办?AI优化视频清晰度技术原理与实战应用
人工智能·音视频
新智元13 小时前
不到 10 天,国产「香蕉」突袭!一次 7 图逼真还原,合成大法惊呆歪果仁
人工智能·openai