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

Python 构建带记忆与人工干预的搜索机器人

基于 LangGraph 框架开发具备长期记忆、联网搜索及人工干预能力的聊天机器人。通过集成 Tavily 实现实时信息检索,利用 interrupt 机制在特定场景下请求人工协助,结合 InMemorySaver 保存对话状态。项目涵盖环境配置、工具绑定、图节点定义及运行逻辑,适合希望深入理解 Agent 工作流开发的开发者参考。

steve发布于 2026/3/27更新于 2026/6/516 浏览
Python 构建带记忆与人工干预的搜索机器人

Python 构建带记忆与人工干预的搜索机器人

前言

在 LangGraph 官方文档的启发下,我决定尝试构建一个具备长期记忆、支持联网搜索并能触发人工干预的智能助手。虽然背景是 Java 开发,但 AI 应用开发的快速迭代让我意识到掌握 Agent 工作流的重要性。本文将分享基于 LangGraph 搭建此类机器人的实战经验。

前置准备

环境配置

推荐使用 Python 3.9+(本文基于 3.12):

pip install langgraph langchain-community langchain-openai tavily-python python-dotenv langsmith

python-dotenv 用于读取根目录下的 .env 配置文件。

工具介绍

  • Tavily:专为 AI 设计的搜索引擎,提供实时联网能力。每月有免费额度,适合学习和测试。
  • LangSmith:LangChain 团队的可观测性平台,用于调试和监控 LLM 应用。支持免费额度,可追踪每一步执行细节。

密钥获取与环境配置

  1. Tavily:登录后进入首页,在左侧菜单添加 API Key。
  2. LangSmith:登录后进入仪表盘,点击左下角账号设置生成 API Key,并创建一个新的 Project 用于追踪。
  3. 大模型 API:支持智谱、阿里云等,需自行获取。

在根目录创建 .env 文件,填入如下内容:

# 智谱 API Key
ZHIPUAI_API_KEY=你的 apikey
# Tavily 智能体搜索工具
TAVILY_API_KEY=Tavily APIKEY
# LangSmith
LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT=https://api.smith.langchain.com
LANGCHAIN_API_KEY=LangSmith 的 APIKEY
LANGSMITH_PROJECT="langgraph-agent"

核心代码实现

依赖导入与环境加载

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
from langgraph.checkpoint.memory import InMemorySaver

# 加载父目录的 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(dotenv_path=env_path)

定义人工干预机制

利用 interrupt 实现人机协作,当遇到高风险或不确定问题时暂停流程等待人工输入:

@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]

# 配置聊天模型
print("env 中的智谱 APIKEY:", os.getenv("ZHIPUAI_API_KEY"))
os.environ["OPENAI_API_KEY"] = os.getenv("ZHIPUAI_API_KEY")
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)

# 系统提示词:引导 AI 在特定场景调用人工干预
SYSTEM_PROMPT = """
你是一个智能助手,能够记住之前的对话内容。
## 工具使用规则
你可以使用以下工具:
1. tavily_search: 搜索互联网获取实时信息
2. human_assistance: 请求人工专家协助

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

构建状态图 (StateGraph)

class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

def chatbot(state: State):
    # 在消息列表开头添加 system prompt
    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)
# 工具执行后返回 chatbot 节点
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")

# 编译图并添加内存
memory = InMemorySaver()
graph = graph_builder.compile(checkpointer=memory)

运行逻辑

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 搜索最新信息并汇总结果。

场景二:人工干预触发

当用户询问涉及医疗、法律等高风险问题或明确要求转人工时,程序会暂停并打印 [人工干预请求],等待控制台输入回复后继续执行。

例如:

[人工干预请求] AI 需要您的专业协助!
AI 的问题:用户询问手机坏掉的原因及售后处理流程
请输入您的专业回复:您好,手机坏掉了,如果是人为损坏的,我们是不进行退货退款的哟,但是您可以申请售后,进行售后维修。

后续机器人会将人工回复整合进对话上下文反馈给用户。

目录

  1. Python 构建带记忆与人工干预的搜索机器人
  2. 前言
  3. 前置准备
  4. 环境配置
  5. 工具介绍
  6. 密钥获取与环境配置
  7. 智谱 API Key
  8. Tavily 智能体搜索工具
  9. LangSmith
  10. 核心代码实现
  11. 依赖导入与环境加载
  12. 加载父目录的 .env 文件
  13. 定义人工干预机制
  14. 初始化工具与模型
  15. 定义工具列表
  16. 配置聊天模型
  17. 系统提示词:引导 AI 在特定场景调用人工干预
  18. 工具使用规则
  19. 何时必须调用 human_assistance 工具
  20. 构建状态图 (StateGraph)
  21. 条件边:判断是否需要调用工具
  22. 工具执行后返回 chatbot 节点
  23. 编译图并添加内存
  24. 运行逻辑
  25. 运行效果示例
  26. 场景一:联网搜索
  27. 场景二:人工干预触发
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 大模型训练存储优化:Unified Checkpoint 技术详解
  • 计算机基础知识总结:网络、操作系统、数据库、C++ 及算法
  • 2026 春晚 AI 趋势解析:从具身智能到普通人应对策略
  • 县域烟花禁燃监管 GIS 实践:基于 Java 与高德地图的销售点盘点
  • AI 全栈开发:利用 AI 工具降低门槛与赋能个体创业
  • Java 微服务架构设计模式:构建云原生分布式系统
  • 基于 2-RSS-1U 的双足机器人并联踝关节分析与实现
  • Openclaw 报错 unauthorized: gateway token mismatch 解决方案
  • Ubuntu 安装 OpenClaw 并接入飞书机器人
  • DeepSeek 中冷启动数据与多阶段训练的作用
  • 基于 OpenCode + OpenSpec 的企业级 AI Coding 工程化落地实践
  • C++ 内存管理:new/delete 操作自定义类型的构造与析构原理
  • AI 大模型通信机制解析:流式传输与数据封装逻辑
  • 牧神记圣女司幼幽 AI 绘图工作流搭建:Z-Turbo 模型实战
  • 主流大模型的优势与未来发展趋势分析
  • 基于深度学习的无人机洪水图像分割与水量估算
  • 远程控制软件安全分析:ToDesk、RayLink、TeamViewer 与 Splashtop 机制对比
  • 智慧农业-无人机枸杞树病害检测数据集 深度学习框架基于YOLOV8枸杞病害检测系统 无人机智慧农业枸杞病害巡检
  • C++ 函数重载:原理、匹配规则与底层实现
  • 单链表核心操作全实现与深度解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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