当前位置: 首页 > news >正文

LangChain 和 LangGraph 入门学习指南

LangChain 和 LangGraph 入门学习指南

本文档面向有 .NET 背景但不熟悉 Python AI 开发的开发者


目录

  1. 什么是 LangChain?
  2. 什么是 LangGraph?
  3. 核心概念:大模型调用
  4. 核心概念:状态机
  5. 核心概念:节点和边
  6. TK Agent 架构解析
  7. 常见问题

1. 什么是 LangChain?

简单理解

LangChain 是一个 调用大模型的工具库

就像你用 HttpClient 调用 REST API 一样,LangChain 帮你调用大模型 API。

.NET 对比

.NETLangChain
HttpClient ChatOpenAI
httpClient.PostAsync(url, content) llm.invoke([messages])
JsonSerializer.Deserialize<T>() 直接返回字符串或结构化对象

代码示例

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage# 创建客户端 (类似 new HttpClient())
llm = ChatOpenAI(model="qwen3-max",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key="sk-xxx"
)# 调用大模型 (类似 httpClient.PostAsync())
response = llm.invoke([SystemMessage(content="你是一个助手"),  # 系统提示词HumanMessage(content="你好")            # 用户消息
])print(response.content)  # AI 的回复

为什么用 LangChain?

  1. 统一接口: 不管是 OpenAI、阿里云千问、还是本地 Ollama,代码几乎一样
  2. 消息格式: 自动处理消息格式转换
  3. 错误处理: 内置重试、超时等机制

2. 什么是 LangGraph?

简单理解

LangGraph 是一个 状态机框架,用于构建复杂的 AI 对话流程。

想象一个流程图:用户说话 → 判断意图 → 执行对应操作 → 返回结果

LangGraph 就是用代码实现这个流程图。

.NET 对比

.NETLangGraph
Windows Workflow Foundation LangGraph
State Machine Pattern StateGraph
Activity Node (节点)
Transition Edge (边)

为什么需要状态机?

普通的 if-else 代码:

if "发车" in user_input:# 处理发车
elif "呼车" in user_input:# 处理呼车
else:# 闲聊

问题:

  • 多轮对话怎么办?(用户说"发车",你问"去哪",用户说"神经内科")
  • 状态怎么保存?
  • 流程复杂了怎么维护?

LangGraph 解决这些问题!


3. 核心概念:大模型调用

3.1 消息类型

大模型对话由多条消息组成:

from langchain_core.messages import SystemMessage, HumanMessage, AIMessagemessages = [SystemMessage(content="你是一个助手"),  # 系统消息:设定 AI 的角色HumanMessage(content="你好"),          # 用户消息AIMessage(content="你好!有什么可以帮你?"),  # AI 回复HumanMessage(content="今天天气怎么样"),  # 用户继续问
]
消息类型作用例子
SystemMessage 设定 AI 的角色和行为规则 "你是一个轨道物流助手"
HumanMessage 用户说的话 "发车到神经内科"
AIMessage AI 的回复 "确认发车吗?"

3.2 Temperature(温度)

温度控制 AI 输出的随机性:

温度效果适用场景
0.0 - 0.1 几乎确定性输出,每次问同样的问题得到相同答案 意图识别、信息提取
0.5 - 0.7 有一定随机性,回答更自然 闲聊、创意写作
1.0+ 高度随机,可能产生意外结果 头脑风暴

3.3 Prompt(提示词)

Prompt 是给 AI 的指令,决定了 AI 的行为。

好的 Prompt 特点

  1. 明确角色:你是谁
  2. 明确任务:要做什么
  3. 明确格式:输出什么格式
  4. 给出示例:最好有例子
# 意图识别的 Prompt
router_prompt = """你是一个意图分类器。
请把用户的话分类到以下类别之一:
- send_car: 发车
- call_car: 呼车
- chat: 闲聊用户消息: {message}只回复类别名称,不要回复其他内容。"""

4. 核心概念:状态机

4.1 什么是状态?

状态是在整个对话过程中需要记住的信息。

class TkState(TypedDict):messages: List[BaseMessage]      # 对话历史user_location: str               # 用户位置selected_station: Optional[Dict] # 选中的站点awaiting_confirm: bool           # 是否等待确认final_result: Dict               # 最终结果

4.2 状态的生命周期

请求1: "发车到神经内科"↓
状态: {awaiting_confirm: True, selected_station: {神经内科}}↓
返回: "确认发车吗?"请求2: "确认" (同一个 session_id)↓
状态: {awaiting_confirm: True, selected_station: {神经内科}}  ← 恢复上次的状态↓
执行发车 API↓
返回: "发车成功!"

4.3 .NET 对比

// .NET 中你可能这样做
public class ConversationState
{public List<Message> Messages { get; set; }public string UserLocation { get; set; }public Station SelectedStation { get; set; }public bool AwaitingConfirm { get; set; }
}// 存储在 Session 或 Redis 中
HttpContext.Session.SetObject("state", state);

LangGraph 的 MemorySaver 自动帮你做这件事。


5. 核心概念:节点和边

5.1 节点(Node)

节点是状态机中的一个处理步骤,本质上是一个函数。

def router_node(state: TkState) -> TkState:"""节点函数的签名:- 输入: 当前状态- 输出: 更新后的状态"""# 处理逻辑...return {**state, "next_node": "send_car_node"}

5.2 边(Edge)

边定义了节点之间的连接关系。

普通边:A 执行完后一定去 B

workflow.add_edge("send_car_node", END)

条件边:根据条件决定去哪

workflow.add_conditional_edges("router",           # 从哪个节点出发route_decision,     # 决策函数{"send_car_node": "send_car_node","chit_chat_node": "chit_chat_node"}
)

5.3 图示

         ┌─────────┐│ router  │  ← 入口点 (set_entry_point)└────┬────┘││ route_decision() 返回什么?│┌─────────┼─────────┐│         │         │▼         ▼         ▼
send_car  call_car  chit_chat   ← 条件边 (add_conditional_edges)│         │         │▼         ▼         ▼END       END       END      ← 普通边 (add_edge)

6. TK Agent 架构解析

6.1 整体流程

用户: "发车到神经内科"│▼
┌─────────────────────────────────────────┐
│ tkMain.py (HTTP 服务)                    │
│ - 接收 POST /tk/chat 请求               │
│ - 解析参数                              │
│ - 调用 Agent                            │
└─────────────────────────────────────────┘│▼
┌─────────────────────────────────────────┐
│ tkAgent.py (状态机)                      │
│                                         │
│ 1. router_node                          │
│    - 调用 LLM 判断意图                   │
│    - 返回 "send_car_node"               │
│                                         │
│ 2. send_car_node                        │
│    - 调用 LLM 提取目标站点               │
│    - 调用 get_all_stations() 获取站点   │
│    - 调用 fuzzy_match_station() 匹配    │
│    - 返回确认请求                        │
└─────────────────────────────────────────┘│▼
返回: {"content": "确认发车到神经内科吗?"}

6.2 多轮对话流程

第1轮: "发车到神经"router_node → 意图=发车 → send_car_nodesend_car_node → 匹配到2个站点 → 返回选项状态: {awaiting_selection: True, pending_stations: [神经内科, 神经外科]}第2轮: "1"router_node → 检测到 awaiting_selection=True → 直接去 send_car_nodesend_car_node → 解析选择 → 返回确认请求状态: {awaiting_confirm: True, selected_station: 神经内科}第3轮: "确认"router_node → 检测到 awaiting_confirm=True → 直接去 send_car_nodesend_car_node → 调用发车 API → 返回成功状态: {awaiting_confirm: False}

6.3 关键代码位置

功能文件函数/位置
HTTP 入口 tkMain.py tk_chat()
意图识别 tkAgent.py router_node()
发车处理 tkAgent.py send_car_node()
站点匹配 tkAgent.py fuzzy_match_station()
调用后端 tkAgent.py call_send_car_api()
构建状态机 tkAgent.py build_tk_graph()

7. 常见问题

Q1: LangChain 和 LangGraph 的关系?

  • LangChain: 调用大模型的工具库(底层)
  • LangGraph: 构建对话流程的框架(上层)
  • LangGraph 依赖 LangChain

Q2: 为什么用 LangGraph 而不是普通 if-else?

  1. 多轮对话: 自动管理状态
  2. 可维护性: 流程清晰,易于扩展
  3. 可视化: 可以生成流程图
  4. 复用性: 节点可以复用

Q3: Tool(工具)是什么?

在 LangChain 中,Tool 是让 AI 可以调用的外部函数。

# 定义一个工具
@tool
def get_weather(city: str) -> str:"""获取城市天气"""return f"{city}今天晴天"# AI 可以决定是否调用这个工具

我们的 TK Agent 没有使用 Tool 机制,而是用状态机手动控制流程。 这样更可控,适合业务逻辑明确的场景。

Q4: 如何调试?

  1. 看日志: logger.info() 输出关键信息
  2. 打印状态: 在节点中打印 state
  3. Postman 测试: 发送请求看返回

Q5: 如何扩展新功能?

比如添加"呼车"功能:

  1. call_car_node() 中实现逻辑
  2. 调用相应的 HCMS API
  3. 更新 router_prompt 添加呼车关键词

学习资源

  • LangChain 官方文档
  • LangGraph 官方文档
  • 阿里云千问 API 文档

下一步

  1. 运行 TK Agent,用 Postman 测试各种场景
  2. 修改 Prompt,观察 AI 行为变化
  3. 尝试实现呼车功能
  4. 阅读 LangGraph 官方教程
http://www.jsqmd.com/news/527582/

相关文章:

  • 程序员专属!用Gopeed的API+插件实现自动化下载(附GitHub实战代码)
  • 终极指南:使用SnapDOM实现多语言界面的完美对比截图
  • Git 代码存储位置和在不同平台的提交差异总结
  • URLNavigator完整教程:从零开始构建可路由的Swift应用
  • 2026年安徽靠谱的钢结构异形结构推荐厂家盘点,哪家性价比高 - 工业推荐榜
  • 2026年名片小程序开发指南:如何甄选靠谱的定制化服务商(附带联系方式) - 品牌2025
  • 慢日志采集分析,无需再依赖人工登库:NineData 如何把多数据库慢查询定位和优化串联起来?
  • 用PyTorch玩转CGAN:手把手教你生成指定数字的MNIST图片(附完整代码)
  • 手把手教你用Xposed框架绕过App单向证书验证(附王者营地实战案例)
  • 深入剖析HttpCanary高级功能破解:从Frida Hook到Xposed模块实战
  • Simple Binary Encoding企业级应用案例:金融、物联网、游戏领域的成功实践
  • 别再只跑 WordCount 了!用 Flink 1.18.0 本地模式快速验证你的第一个实时数据处理想法
  • 从零到一:香橙派AIpro ROS具身智能机器人创新实践
  • 2026年石墨匀质板、固态静芯板等新型建筑保温材料厂家推荐:硅墨烯免拆模板/石墨门芯板/石墨一体板专业供应商精选 - 品牌推荐官
  • AI辅助安全测试:Chypass_pro2.0在XSS绕过中的实战应用与模型对比
  • 10个Unison调试技巧:快速定位和解决代码问题的完整指南
  • Spring 工厂模式与适配器模式学习笔记
  • Qt程序守护进程终极方案:用systemd实现崩溃自动重启(附ARM64适配指南)
  • 2026年3月海南塑料管道厂家最新推荐:市政给排水、家装PP-R、农业灌溉、通信电力护套管厂家选择指南 - 海棠依旧大
  • DeepSeek-R1-Distill-Qwen-7B与知识图谱的联合推理
  • mcp-feedback-enhanced 部署完全手册:从本地到云端的实战指南
  • PWM输出
  • 基于Agent的智能工作流:使用NLP-StructBERT进行任务自动分发与匹配
  • GraphQL Java vs REST API:2024年终极决策指南
  • 30美元“后门”击穿企业防线:IP-KVM漏洞背后,BIOS级入侵的致命陷阱
  • ULID CLI工具完全指南:命令行操作与批量生成技巧
  • 2026北京小程序开发公司推荐,定制化服务如何甄选靠谱服务商(附带联系方式) - 品牌2025
  • Wireshark协议解析器文档翻译终极指南:10个高效流程与最佳实践
  • 霜儿-汉服-造相Z-Turbo惊艳作品:‘霜’字意象贯穿——霜发、霜枝、霜釉瓷器背景
  • Candy vs Zerotier:轻量级组网工具横评(含独立网络配置避坑指南)