跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 基于 LangGraph 搭建带记忆与人工干预的搜索机器人

综述由AI生成Python 结合 LangGraph 框架构建智能聊天机器人,实现对话记忆、联网搜索及人工干预功能。集成 Tavily 工具进行实时信息检索,利用 LangSmith 追踪链路。通过 StateGraph 定义节点与边,配置环境变量加载 API Key。演示了用户查询商品价格触发搜索,以及特定场景下请求人工协助的完整流程,适合 Agent 开发入门参考。

花里胡哨发布于 2026/4/6更新于 2026/5/2818 浏览
Python 基于 LangGraph 搭建带记忆与人工干预的搜索机器人

Python 基于 LangGraph 搭建带记忆与人工干预的搜索机器人

前言

本文介绍如何使用 Python 和 LangGraph 框架构建具备记忆功能、支持联网搜索及人工干预机制的智能聊天机器人。通过集成 Tavily 搜索工具和自定义中断逻辑,实现复杂任务处理与专业领域的人工接管。

前置准备

环境配置
  • Python 3.9+
  • 安装依赖:
pip install langgraph langchain-community langchain-openai tavily-python python-dotenv langsmith
密钥获取
  1. Tavily: 注册账号后在控制台获取 API Key(每月有免费额度)。
  2. LangSmith: 创建项目并生成 API Key,用于链路追踪。
  3. 大模型 API: 如智谱 AI、OpenAI 等,需配置 base_url 和 model。
.env 配置

在根目录创建 .env 文件:

ZHIPUAI_API_KEY=你的 apikey
TAVILY_API_KEY=Tavily APIKEY
LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT=https://api.smith.langchain.com
LANGCHAIN_API_KEY=LangSmith 的 APIKEY
LANGSMITH_PROJECT="langgraph-agent"

核心代码实现

1. 导入依赖与环境加载
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
import os
from dotenv import load_dotenv
from pathlib import Path
from langgraph.types import Command, interrupt
from langchain_core.tools import tool
from langchain_tavily import TavilySearch
from langchain.chat_models import init_chat_model
from langchain_core.messages import SystemMessage

# 加载环境变量
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(dotenv_path=env_path)
2. 定义状态与工具
class State(TypedDict):
    messages: Annotated[list, add_messages]

# 定义人工干预工具
@tool
def human_assistance(query: str) -> str:
    """Request assistance from a human."""
    human_response = interrupt({"query": query})
    return human_response["data"]

# 定义搜索工具
tool = TavilySearch(max_results=2)
tools = [tool, human_assistance]
3. 构建图与工作流
graph_builder = StateGraph(State)

# 初始化模型
llm = init_chat_model(
    model="glm-5",
    model_provider="openai",
    model_kwargs={"base_url": "https://open.bigmodel.cn/api/paas/v4/"}
)
llm_with_tools = llm.bind_tools(tools)

SYSTEM_PROMPT = """你是一个智能助手,能够记住之前的对话内容。
## 工具使用规则
你可以使用以下工具:
1. tavily_search: 搜索互联网获取实时信息
2. human_assistance: 请求人工专家协助
## 何时必须调用 human_assistance 工具
以下情况你必须调用 human_assistance 工具请求人工专家协助,不要自己回答:
1. 医疗健康:症状诊断、用药建议、治疗方案
2. 法律咨询:合同审核、法律纠纷、法规解释
3. 金融理财:投资建议、税务规划、保险推荐
4. 用户明确要求:用户提到'专家'、'人工'、'专业人士'、'客服'等
5. 高风险决策:可能对用户造成重大影响的决定
6. 不明确答案:任何你不知道的答案,或者设计私有的回答
调用时,将用户的问题整理后作为 query 参数传递。"""

def chatbot(state: State):
    messages = [SystemMessage(content=SYSTEM_PROMPT)] + state["messages"]
    message = llm_with_tools.invoke(messages)
    assert len(message.tool_calls) <= 1
    return {"messages": [message]}

graph_builder.add_node("chatbot", chatbot)

from langgraph.prebuilt import ToolNode, tools_condition
tool_node = ToolNode(tools=tools)
graph_builder.add_node("tools", tool_node)

graph_builder.add_conditional_edges("chatbot", tools_condition)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")

memory = InMemorySaver()
graph = graph_builder.compile(checkpointer=memory)
4. 运行与交互
config = {"configurable": {"thread_id": "1"}}

def stream_graph_updates(user_input: str):
    events = graph.stream({"messages": [{"role": "user", "content": user_input}]}, config, stream_mode="values")
    for event in events:
        if "messages" in event:
            event["messages"][-1].pretty_print()

def check_and_resume_interrupt():
    snapshot = graph.get_state(config)
    if snapshot.next:
        print("\n" + "="*50)
        print("[人工干预请求] AI 需要您的专业协助!")
        print("="*50)
        if snapshot.values.get("messages"):
            last_message = snapshot.values["messages"][-1]
            print(f"AI 的问题:{last_message.content}")
        human_response = input("请输入您的专业回复:")
        human_command = Command(resume={"data": human_response})
        events = graph.stream(human_command, config, stream_mode="values")
        for event in events:
            if "messages" in event:
                event["messages"][-1].pretty_print()
        return True
    return False

print("="*50)
print("聊天机器人已启动!输入 'quit' 或 'exit' 退出")
print("当 AI 需要专业协助时,会自动请求人工干预")
print("="*50)

while True:
    try:
        if check_and_resume_interrupt():
            continue
        user_input = input("\nUser: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break
        stream_graph_updates(user_input)
        check_and_resume_interrupt()
    except KeyboardInterrupt:
        print("\nGoodbye!")
        break
    except Exception as e:
        print(f"发生错误:{e}")
        break

运行结果示例

系统成功调用 Tavily 搜索工具,返回相关商品信息摘要。当用户提出涉及医疗、法律或明确要求转人工的问题时,流程会暂停并等待人工输入,随后恢复执行。

例如查询商品价格时,Agent 自动调用 Tavily 搜索京东实时数据;当用户询问手机故障维修政策并要求转人工时,触发 human_assistance 工具,控制台显示干预提示,输入回复后继续对话。

目录

  1. Python 基于 LangGraph 搭建带记忆与人工干预的搜索机器人
  2. 前言
  3. 前置准备
  4. 环境配置
  5. 密钥获取
  6. .env 配置
  7. 核心代码实现
  8. 1. 导入依赖与环境加载
  9. 加载环境变量
  10. 2. 定义状态与工具
  11. 定义人工干预工具
  12. 定义搜索工具
  13. 3. 构建图与工作流
  14. 初始化模型
  15. 工具使用规则
  16. 何时必须调用 human_assistance 工具
  17. 4. 运行与交互
  18. 运行结果示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • JDK 官方下载渠道说明
  • Android Layout Weight 属性原理及正确用法
  • JSP 文件上传实战:原理、实现与安全注意事项
  • 医疗自然语言处理(NLP)实战:从场景到模型落地
  • 35 道常见前端 Vue 面试题解析与实战指南
  • 无人机智能 AI 巡检平台:全域感知与自动化作业方案
  • MySQL 权限管理与 C/C++ 客户端接入实战
  • C++ 智能指针:使用场景、实现原理与内存泄漏防治
  • Web 虚拟卡销售平台架构设计与核心实现
  • VSCode Copilot 配置文件提示未知工具警告
  • Spring Boot 结合 jQuery 实现前后端分离图书管理系统
  • 基于 KWDB 的运维监控实战:SQL 融合指标与 CMDB 数据
  • OpenClaw AI 物理级离线部署指南
  • Java ArrayList 核心解析:底层结构、使用方法与扩容机制
  • 高校 AIGC 检测工具盘点与论文质量优化指南
  • 基于 GLM-4.6V-Flash-WEB 的森林病虫害传播路径图像推断
  • LazyLLM 多 Agent 应用实践:源码部署与 Web 调试指南
  • Windows WSL Ubuntu 安装 OpenClaw 配置飞书与百炼模型全流程
  • 递归算法实战:从汉诺塔到快速幂与链表操作
  • Python 爬虫入门:从原理到实战解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online