1. 项目概述:LangGraph 实现 Qwen 模型的多轮对话与 JSON 提取
在构建生产级 AI 代理时,我们经常面临两个核心挑战:如何有效管理多轮对话历史,以及如何从非结构化文本中提取结构化数据。这两个问题看似简单,但在实际应用中往往会带来诸多困扰。传统解决方案通常需要编写大量胶水代码来维护对话状态,或者依赖复杂的正则表达式进行信息提取,这不仅效率低下,而且难以维护。
LangGraph 的出现为这些问题提供了优雅的解决方案。作为一个基于状态机的框架,LangGraph 通过其独特的消息传递机制和 Reducer 函数,让我们能够以声明式的方式管理对话状态,同时实现复杂的信息流转。本文将带你深入探索如何利用 LangGraph 构建一个具备对话记忆和结构化信息提取能力的 AI 代理,基于通义千问(Qwen)大模型实现端到端的解决方案。
这个项目的核心价值在于:
- 通过
Annotated类型注解实现对话历史的自动维护,无需手动管理状态 - 利用 SystemMessage 引导模型进行精准的命名实体识别(NER)
- 将非结构化对话内容转换为标准 JSON 格式,便于后续处理
- 整个流程采用模块化设计,各节点职责清晰,易于扩展和维护
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈与核心组件解析
2.1 技术栈清单与版本要求
本项目的技术栈经过精心选择,各组件版本严格匹配以确保兼容性:
python复制Python == 3.11.14 # 必须3.9+以支持Annotated语法
langgraph == 1.0.5 # 核心框架
langchain-openai == 1.1.7 # 模型调用接口
langchain-core == 1.2.7 # 基础消息类型
python-dotenv == 1.2.1 # 环境变量管理
特别注意:Python 3.9 及以上版本是硬性要求,因为我们需要使用
Annotated类型注解特性。如果使用旧版本,状态管理部分的代码将无法正常工作。
2.2 LangGraph 核心概念解析
2.2.1 状态机模型
LangGraph 的核心是一个状态机(State Machine)模型。在这个模型中:
- 状态(State):是一个字典结构,存储当前工作流的所有数据
- 节点(Node):是执行具体任务的函数单元
- 边(Edge):定义节点之间的流转逻辑
这种设计使得复杂的工作流可以被分解为一系列小的、可测试的单元,然后通过状态机组合起来。
2.2.2 消息传递机制
LangGraph 采用消息传递(Message Passing)模式进行节点间通信。每个节点接收当前状态作为输入,处理后返回新的状态片段。框架会自动将这些片段合并到全局状态中。
关键优势在于:
- 节点之间解耦,每个节点只需关注自己的输入输出
- 状态更新逻辑可定制(通过 Reducer)
- 易于跟踪数据流转过程
2.3 Qwen 模型接入
我们使用 langchain-openai 包来接入 Qwen 模型,这实际上是一个兼容 OpenAI API 的封装层。配置要点包括:
python复制llm = ChatOpenAI(
model="qwen-plus", # 指定模型
api_key=key, # 从环境变量读取
base_url=base_url, # 自定义API端点
temperature=0 # 确定性输出
)
实际项目中,建议将 API key 和 base_url 通过
.env文件管理,避免硬编码。例如:code复制DASHSCOPE_API_KEY=your_key_here DASHSCOPE_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
3. 核心实现原理深度解析
3.1 状态定义与 Reducer 机制
3.1.1 Annotated 类型注解
项目中最精妙的部分莫过于状态定义:
python复制class State(TypedDict):
messages: Annotated[List[str], operator.add]
这行代码做了三件事:
- 声明
messages字段类型为List[str] - 通过
Annotated附加元数据operator.add - 告诉 LangGraph 在更新此字段时使用加法操作而非覆盖
3.1.2 Reducer 工作原理
Reducer 是状态更新的核心机制。当节点返回新状态时:
- LangGraph 检查字段的注解
- 发现
operator.add元数据 - 对现有列表和新列表执行加法操作(即列表合并)
- 将结果存储为新的状态
这种设计实现了对话历史的自动累积,无需手动维护全局变量。
