[Chat-LangChain] 会话图(LangGraph) | 大语言模型(LLM)

第二章:会话图(LangGraph)

在第一章中,我们学习了前端用户界面——这是聊天机器人的"面孔",我们在这里输入问题并查看答案。

我们看到了消息如何从聊天窗口传递到聊天机器人的"大脑"。现在,让我们深入探索这个"大脑"本身!

聊天机器人的大脑:解决什么问题?

想象我们向一位超级聪明的朋友提出复杂问题:“什么是LangChain?如何用它构建聊天机器人?”

人类朋友不会直接抛出第一个想到的答案。他们可能会:

  1. 理解问题:“好的,这是关于LangChain和构建聊天机器人的”
  2. 制定研究计划:“首先需要解释LangChain,然后说明如何用它构建聊天机器人”
  3. 执行研究(步骤1):“查找’什么是LangChain?'相关资料”
  4. 执行研究(步骤2):“搜索’LangChain构建聊天机器人示例’”
  5. 整合信息:“已经收集所有必要信息块”
  6. 给出清晰答案:“这是LangChain的定义,以及用它构建聊天机器人的方法…”

我们的聊天机器人需要实现类似的流程!它不能仅依赖大语言模型(LLM)一次性完成所有操作。

LLM擅长生成文本,但天然不擅长管理工作流,例如规划研究步骤、搜索数据库以及整合不同信息块。

chat-langchain项目的这个模块要解决的核心问题是:我们的聊天机器人如何管理复杂对话和任务,将其分解为步骤、做出决策,并协调不同工具来找到最佳答案?

这就是会话图(使用强大的LangGraph库构建)的用武之地。它是聊天机器人的"大脑"和"工作流管理器"。

什么是会话图(LangGraph)?

LangGraph可以看作聊天机器人行为的流程图配方。它定义了所有可能的执行步骤,以及步骤间的转移决策逻辑。

核心概念解析:

  • 图(Graph):在计算机科学中,"图"是由节点(圆形)和边(连接线)组成的结构
    • 节点(步骤/动作):聊天机器人可以执行的独立任务,例如"分析问题"、“搜索信息"或"生成最终答案”
    • 边(规则/决策):节点间的连接逻辑,例如"完成问题分析后,如果是LangChain相关的问题,则跳转到’搜索信息’节点"
  • LangGraph:专门为对话式AI构建的流程图库,帮助设计包含状态记忆的复杂工作流
  • 状态(大脑记忆):当聊天机器人执行流程图时,需要记忆:
    • 用户对话历史
    • 待解决的研究问题列表
    • 已找到的文档资料
    • LangGraph负责管理这些"记忆"以实现进度跟踪

简而言之,LangGraph帮助我们构建能够执行多步计划、使用不同工具(如搜索引擎)并做出智能决策的聊天机器人,而不是仅靠猜测生成答案。

会话图工作原理:以"智能问题"为例

以问题"什么是LangChain?如何用它构建聊天机器人?"为例,演示LangGraph的协调过程:

  1. 接收消息(来自前端用户界面)
  2. 分析和路由查询
    • LangGraph"大脑"接收问题
    • 使用LLM分类问题类型(普通聊天/需要更多信息/LangChain相关复杂问题)
    • 决策:“这是关于LangChain的复杂问题”
  3. 创建研究计划
    • 判定需要分步研究
    • 使用另一个LLM拆分问题
      • 步骤1:“什么是LangChain?”
      • 步骤2:“如何用LangChain构建聊天机器人?”
  4. 执行研究(步骤1)
    • 将第一个研究步骤发送给专用"研究子脑"(也是LangGraph构建的流程图)
    • 研究子脑生成搜索查询,通过检索过程从向量存储(Weaviate)获取相关文档
    • 主脑更新记忆状态(存储找到的文档
  5. 检查完成状态
    • 查看研究计划剩余步骤
    • 决策:“步骤2待处理”
  6. 执行研究(步骤2)
    • 重复研究子脑的文档检索过程
    • 主脑更新记忆状态
  7. 检查完成状态
    • 确认所有步骤已完成
  8. 生成响应
    • 将所有对话历史和检索文档发送给最终LLM
    • 生成综合性的最终答案
  9. 返回前端(通过前端用户界面展示答案)

整个过程由会话图协调管理。

幕后机制:LangGraph工作流

大脑流程图(简化版)

在这里插入图片描述

大脑记忆:AgentState

LangGraph通过AgentState类管理记忆状态,定义见backend/retrieval_graph/state.py

# backend/retrieval_graph/state.py(简化版)
@dataclass(kw_only=True)
class AgentState:messages: Annotated[list[AnyMessage], add_messages]  # 全部聊天消息router: Router = field(default_factory=lambda: Router(type="general", logic=""))  # 查询类型steps: list[str] = field(default_factory=list)  # 研究计划步骤documents: Annotated[list[Document], reduce_docs] = field(default_factory=list)  # 检索到的文档answer: str = field(default="")  # 最终答案# ...其他状态字段...

messages记录对话历史,steps存储研究计划,documents保存检索结果。

构建大脑:节点与边

主流程图定义在backend/retrieval_graph/graph.py,关键组件:

节点1:analyze_and_route_query(决策器)
async def analyze_and_route_query(state: AgentState, *, config: RunnableConfig) -> dict[str, Router]:# 使用LLM分类问题类型model = load_chat_model(config.query_model).with_structured_output(Router)messages = [{"role": "system", "content": config.router_system_prompt}] + state.messagesresponse = cast(Router, await model.ainvoke(messages))return {"router": response}  # 存储分类结果
节点2:create_research_plan(规划器)
async def create_research_plan(state: AgentState, *, config: RunnableConfig) -> dict[str, list[str]]:# 生成分步研究计划model = load_chat_model(config.query_model).with_structured_output(Plan)messages = [{"role": "system", "content": config.research_plan_system_prompt}] + state.messagesresponse = cast(Plan, await model.ainvoke(messages))return {"steps": response["steps"]}  # 返回步骤列表
节点3:conduct_research(研究协调器)
async def conduct_research(state: AgentState) -> dict[str, Any]:# 委托研究子脑执行单个步骤result = await researcher_graph.ainvoke({"question": state.steps[0]})return {"documents": result["documents"], "steps": state.steps[1:]}  # 更新文档和步骤
节点4:respond(应答生成器)
async def respond(state: AgentState, *, config: RunnableConfig) -> dict[str, list[BaseMessage]]:# 整合信息生成最终答案model = load_chat_model(config.response_model)context = format_docs(state.documents)  # 格式化文档prompt = config.response_system_prompt.format(context=context)messages = [{"role": "system", "content": prompt}] + state.messagesresponse = await model.ainvoke(messages)return {"messages": [response], "answer": response.content}
流程图装配
builder = StateGraph(AgentState, input=InputState, config_schema=AgentConfiguration)# 添加所有节点
builder.add_node("analyze_and_route_query", analyze_and_route_query)
builder.add_node("create_research_plan", create_research_plan)
builder.add_node("conduct_research", conduct_research)
builder.add_node("respond", respond)
# ...其他节点...# 定义状态转移逻辑
builder.add_edge(START, "analyze_and_route_query")
builder.add_conditional_edges("analyze_and_route_query",route_query,{"create_research_plan": "create_research_plan","ask_for_more_info": "ask_for_more_info","general": "respond_to_general_query"}
)
# ...更多连接逻辑...graph = builder.compile()
graph.name = "RetrievalGraph"

结论

本章探讨了**会话图(LangGraph)**作为聊天机器人的核心决策系统

通过节点(执行步骤)、(转移逻辑)和状态(记忆管理)的协同工作,实现了复杂对话任务的分解与协调。

下一章将深入解析支撑这些功能的大语言模型(LLM)。

第三章:大语言模型(LLM)


第三章:大语言模型(LLM)

在第二章中,我们了解了会话图(LangGraph)作为聊天机器人的"大脑",它像熟练的项目经理般协调回答问题的各个步骤

但谁是真正执行理解、创造性思维并生成类人文本的智能专家?这正是本章的核心:大语言模型(LLM)

聊天机器人的专家顾问:解决什么问题?

想象我们正在构建复杂项目:项目经理(LangGraph)负责组织协调,但遇到技术文档理解、解决方案构思或撰写清晰报告等专业任务时,我们需要聘请专家顾问。

大语言模型(LLM)在chat-langchain中解决的核心理念是:我们的聊天机器人如何真正理解问题,通过创造性思维分解任务,并基于复杂信息生成类人化的智能答案?

LLM是系统的"专家顾问"和"对话专家",负责:

  1. 重述用户问题(查询分析:用户可能基于上下文提出简短追问,LLM能将其转化为完整清晰的独立问题
  2. 生成研究计划:针对复杂问题,LLM可像人类专家般拆解为分步研究计划
  3. 构建最终答案:整合检索过程获取的信息后,LLM将其转化为清晰易读的答案

什么是大语言模型(LLM)?

大语言模型(LLM)本质上是基于海量互联网文本数据(书籍/文章/网页等)训练的强大人工智能,可视为:

  • 超级智能文本生成器:能撰写文章/诗歌/代码/摘要等类人化文本
  • 卓越理解者:理解文本含义,识别词语关系,掌握复杂语境
  • 对话大师:凭借文本理解和生成能力,实现类人对话和问答

chat-langchain中,LLM赋予聊天机器人"智能"——实现文本解析、规划和创造的能力。

LLM在chat-langchain中的应用

1. 重述用户问题(查询分析)

当用户提出"聊天机器人场景下如何应用?"等简短追问时,LLM会结合:

  • 完整对话历史
  • 当前简短提问

生成独立清晰的问题:“LangChain如何用于构建聊天机器人?”(参见CONCEPTS.md中的REPHRASE_TEMPLATE提示模板)

2. 生成研究计划

面对"解释LangChain代理及其工具使用机制"等复杂问题,会话图(LangGraph)会请求LLM生成分步计划,例如:

  1. “什么是LangChain代理?”
  2. “LangChain代理如何使用工具?”

3. 构建最终答案

当会话图(LangGraph)通过检索过程收集足够信息后,LLM会:

  • 整合对话历史
  • 融合检索文档
  • 生成连贯答案(参见MODIFY.md中的RESPONSE_TEMPLATE模板)

在这里插入图片描述

实现细节:LLM工作机制

工作流中的LLM(简化版)

在这里插入图片描述

(LangGraph分解问题,列清单,LLM才是真正执行解答)

1. LLM选择与加载

chat-langchain支持多种LLM服务商(OpenAI/Anthropic/Google等),配置见backend/retrieval_graph/configuration.py

@dataclass(kw_only=True)
class AgentConfiguration(BaseConfiguration):# 查询分析和计划制定的LLMquery_model: str = field(default="anthropic/claude-3-5-haiku-20241022",metadata={"description": "用于查询处理的语言模型"})# 最终答案生成的LLMresponse_model: str = field(default="anthropic/claude-3-5-haiku-20241022",metadata={"description": "用于生成响应的语言模型"})# 系统提示模板router_system_prompt: str = field(default=prompts.ROUTER_SYSTEM_PROMPT, ...)research_plan_system_prompt: str = field(default=prompts.RESEARCH_PLAN_SYSTEM_PROMPT, ...)response_system_prompt: str = field(default=prompts.RESPONSE_SYSTEM_PROMPT, ...)

通过backend/utils.pyload_chat_model函数加载模型:

def load_chat_model(fully_specified_name: str) -> BaseChatModel:"""根据模型名称加载LLM(如'openai/gpt-4o-mini')"""if "/" in fully_specified_name:服务商, 模型 = fully_specified_name.split("/", maxsplit=1)else:服务商 = ""模型 = fully_specified_namereturn init_chat_model(模型, model_provider=服务商, temperature=0)  # 温度参数控制创造性

2. 核心功能实现

查询分析(路由决策)
async def analyze_and_route_query(state: AgentState, config: RunnableConfig) -> dict[str, Router]:配置 = AgentConfiguration.from_runnable_config(config)模型 = load_chat_model(配置.query_model).with_structured_output(Router)消息 = [{"role": "system", "content": 配置.router_system_prompt}] + state.messages响应 = cast(Router, await 模型.ainvoke(消息))return {"router": 响应}  # 存储分类结果
研究计划生成
async def create_research_plan(state: AgentState, config: RunnableConfig) -> dict[str, list[str]]:class 计划(TypedDict):steps: list[str]模型 = load_chat_model(配置.query_model).with_structured_output(计划)消息 = [{"role": "system", "content": 配置.research_plan_system_prompt}] + state.messages响应 = cast(计划, await 模型.ainvoke(消息))return {"steps": 响应["steps"]}
最终答案生成
async def respond(state: AgentState, config: RunnableConfig) -> dict[str, list[BaseMessage]]:模型 = load_chat_model(配置.response_model)上下文 = format_docs(state.documents[:20])  # 取前20个相关文档提示 = 配置.response_system_prompt.format(context=上下文)消息 = [{"role": "system", "content": 提示}] + state.messages响应 = await 模型.ainvoke(消息)return {"messages": [响应], "answer": 响应.content}

结论

本章深入解析了大语言模型(LLM)作为chat-langchain系统的智能核心。LLM在查询理解、研究规划和答案生成中发挥关键作用,而会话图(LangGraph)则负责整体协调。下一章将探讨支撑LLM工作的检索过程

第四章:检索过程

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

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

相关文章

Flask错误处理与会话技术详解

flask入门day03 错误处理 1.abort函数:放弃请求并返回错误代码 详细状态码 from flask import Flask,abort,render_template ​ app Flask(__name__) ​ app.route(/) def index():return 我是首页 ​ app.route(/error) def error():abort(404)return 没有找到…

java程序打包成exe,再打成安装包,没有jdk环境下可运行

一、前提条件准备:1、要被打包的程序文件:rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、图标文件tubiao123.ico3、jre4、打包成exe的软件 config.exe4j5、打成安装包的软件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步骤 按照以下图进行…

区块链技术原理(11)-以太坊交易

文章目录什么是交易?交易类型交易生命周期关键概念:Gas 与交易费用交易状态与失败原因总结什么是交易? “交易(Transaction)” 是从一个账户向另一个账户发送的经过数字签名的指令 。例如,如果 Bob 发送 A…

小兔鲜儿-小程序uni-app(二)

小兔鲜儿-小程序uni-app7.小兔鲜儿 - 用户模块会员中心页(我的)静态结构参考代码会员设置页分包预下载静态结构退出登录会员信息页静态结构获取会员信息渲染会员信息更新会员头像更新表单信息8.小兔鲜儿 - 地址模块准备工作静态结构地址管理页地址表单页动态设置标题新建地址页…

BLE 广播信道与数据信道:冲突避免、信道映射与自适应跳频实现

低功耗蓝牙(BLE)技术凭借低功耗、短距离、低成本的特性,已广泛应用于智能家居、可穿戴设备、工业物联网等领域。在 BLE 协议中,信道管理是保障通信可靠性的核心机制,其中广播信道与数据信道的设计、冲突避免策略、跳频技术更是面试中的高频考点。本文将从基础原理到实战真…

nodejs03-常用模块

nodejs 常用的核心模块 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境, 它允许 JavaScript 运行在服务器端。Node.js 拥有丰富的标准库,也就是核心模块, 这些模块提供了各种功能, 使得开发服务器端应用程序变得简单高…

多路混音声音播放芯片型号推荐

以下是唯创知音旗下主流的多路声音播放芯片深度解析,结合精准参数、丰富场景及技术特性,满足智能设备多样化音频需求:一、WTV380/890 系列:高集成多模态交互芯片核心参数通道能力:支持8 路独立语音输出,可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey:倒位序 逐级蝶形,入口 fft(int N, complex f[])”拆成三件事它在讲什么 “基 2 Cooley–Tukey” 指的是最常见的 FFT 算法:长度 N 必须是 2 的整数次幂,把离散傅里叶变换分解成一层一层的“2 点蝶形”运…

小白挑战一周上架元服务——ArkUI04

文章目录前言一、ArkUI是何方神圣?二、声明式UI三、组件1.基础组件2.布局容器组件3.导航组件4.自定义组件5.组件生命周期四、状态管理1.State装饰器: 状态变量2.Prop装饰器:父子单向同步3.Link装饰器:父子双向同步4.Provide/Consume装饰器&am…

剧本杀小程序系统开发:构建剧本杀社交新生态

在社交需求日益多样化的今天,剧本杀凭借其独特的社交属性,成为了人们热衷的社交娱乐方式之一。而剧本杀小程序系统开发,则进一步拓展了剧本杀的社交边界,构建起一个全新的剧本杀社交新生态,让玩家在推理与角色扮演中&a…

AI提高投放效率的核心策略

内容概要人工智能技术正深刻改变着广告投放领域,其核心价值在于显著提升投放效率。通过融合智能算法优化、实时数据分析与自动化投放流程,AI系统能够以前所未有的速度和精度处理海量信息,驱动更精准的营销决策。这不仅大幅缩短了传统人工操作…

OpenBMC 中命令模式的深度解析:从原理到实现

引言 在 OpenBMC 的设计中,命令模式(Command Pattern)被广泛应用于各种场景,特别是 IPMI 命令处理、异步操作封装和用户请求管理等。本文将深入分析 OpenBMC 中命令模式的实现原理、架构设计以及完整的执行流程,并通过…

从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.15

第十七天 第五十七,五十八,五十九和六十集 第五十六集 删除链表结点 没什么好说的关键部分代码如图 链表的插入操作 依旧没有啥可以说的代码部分大家看视频就能看懂,大家应该是没有什么问题的吧? 第五十七集 共用体形式结构与结构…

云服务器网站无法访问的系统化故障排查指南及多维度解决方案

当云服务器上的网站突然无法访问时,这种突发状况往往让人措手不及。别担心,我们可以通过系统化的排查流程快速定位问题根源。以下是经过实战验证的故障排除指南,帮您分步解决网站访问异常问题。一、基础状态确认 服务器的生命体征就像人体的脉…

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有权利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …

C语言:指针(5)

1. sizeof与strlen的对比1.1 sizeofsizeof属于是操作符,用于计算变量所占的空间大小,单位为字节。如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof只计算数据在内存中所占的空间大小,而不在乎内存中存…

rent8 安装部署教程之 Windows

1. Apache 安装与配置 1.1. 获取并解压 Apache 在 Apache Lounge 网址下载编译版的 Apache。下载完成后,将压缩包解压到 d:\web\Apache24 作为 Apache 的安装目录。 1.2. 配置 Apache 打开配置文件 conf\httpd.conf,找到第 37 行配置。 ​ Define SRVROO…

边缘智能实战手册:攻克IoT应用三大挑战的AI战术

前言:在当前的AIoT(人工智能物联网)赛道上,将AI能力下沉至边缘设备已不再是“要不要做”的选择题,而是“如何做好”的必答题。然而,在实际项目中,工程师们常常会遇到性能、功耗和隐私这“三座大…

【React】use-immer vs 原生 Hook:谁更胜一筹?

1.概述 use-immer 不属于官方 Hook,是社区维护的第三方库!use-immer 通过封装 Immer 的不可变更新机制,为 React 开发者提供了一种更直观、高效的状态管理方式。它尤其适合处理复杂嵌套状态或需要频繁更新的场景,同时保持了与 Re…

【案例】Vue3 实现高性能级横向循环滚动生产线效果:基于 requestAnimationFrame 的流畅动画方案

动画效果在工业监控系统、生产看板等场景中,经常需要模拟生产线的动态运行效果。本文将基于 Vue3 和 requestAnimationFrame 实现一个高性能的横向循环滚动效果,完美模拟生产线传输带的视觉体验。我们将从代码实现到原理分析,全面讲解如何打造…