LangChain 1.0-Agent中间件-实现闭环(批准-编辑-拒绝动作)

发布时间:2026-03-03 23:14:17编辑:123阅读(5)

    LangChain 1.0-Agent中间件-实现闭环(批准-编辑-拒绝动作)

    在自动化系统中,尤其是高风险任务(如数据库写入、财务操作、邮件发送)中,完全让大模型自主执行往往并不安全。LangChain 1.0 引入的Human-in-Loop Middleware (人类在环中间件)允许在关键节点暂停Agent执行,等待人类对模型的行为进行批准(approve)、编辑(edit)或者拒绝(reject),从而让智能体的行为真正符合企业安全、合规和伦理要求。

    示例代码:

    from langchain.agents import create_agent
    from langchain.agents.middleware import HumanInTheLoopMiddleware
    from langgraph.checkpoint.memory import InMemorySaver
    import requests
    from lxml import etree
    from langchain.tools import tool
    from langchain_ollama import ChatOllama
    
    model = ChatOllama(
        model="qwen3:8b",
        temperature=0.2,
        top_p=0.95,
    )
    
    @tool
    def search_bing(keyword):
        """
        搜索内容函数
        :param keyword: 必要参数,字符串类型。用于表示搜索的具体关键词
        :return: 返回搜索出来的结果,dict类型
        """
        url = f'https://www.bing.com/search?q={keyword}'
        # //li[@class='b_algo']/div[@class='b_caption']/p
        headers = {
          "sec-ch-ua": '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
          "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
          Chrome/144.0.0.0 Safari/537.36"
        }
        response = requests.get(url=url, headers=headers, timeout=10)
        html = etree.HTML(response.text)
        res = html.xpath("//li[@class='b_algo']/div[@class='b_caption']/p/text()")
        ret = {}
        for num, value in enumerate(res):
            ret.setdefault(num, value)
        print(f"搜索关键词:{keyword}, 搜索结果:{ret}")
        return ret
    
    # 创建Agent,接入HumanInTheLoopMiddleware
    agent = create_agent(
        model=model,
        tools = [search_bing],
        checkpointer=InMemorySaver(),
        middleware=[
            HumanInTheLoopMiddleware(
                interrupt_on={
                    # 拦截 search_bing 搜索工具执行前,要求人工确认
                    "search_bing": {
                        "allowed_decisions": ["approve", "edit", "reject"],
                        "description":lambda tool_name,tool_input,state:(f"模型准备执行search_bing搜索:
                        {tool_input.get('query', '')}"
                        )
                    },
                },
                description_prefix="工具执行需要人工审批"
            )
        ],
    )
    config = {
        "configurable":{
            "thread_id":"23"
        }
    }
    
    for event in agent.stream(
    {"messages": [{"role": "user", "content": "AI最新的新闻"}]},
        config,
    ):
        print(event)

    运行结果:

    {'model': {'messages': [AIMessage(content='', additional_kwargs={}, response_metadata={'model': 'qwen3:8b', 'created_at': '2026-03-03T14:05:36.814844883Z', 'done': True, 'done_reason': 'stop', 'total_duration': 7591202321, 'load_duration': 77793223, 'prompt_eval_count': 157, 'prompt_eval_duration': 414795821, 'eval_count': 310, 'eval_duration': 7010172358, 'logprobs': None, 'model_name': 'qwen3:8b', 'model_provider': 'ollama'}, id='lc_run--019cb404-a505-7c70-8c11-c891c0dff8f5-0', tool_calls=[{'name': 'search_bing', 'args': {'keyword': 'AI最新新闻'}, 'id': '5026d20a-92c0-47f2-8f17-63efefb56bdc', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 157, 'output_tokens': 310, 'total_tokens': 467})]}}

    {'__interrupt__': (Interrupt(value={'action_requests': [{'name': 'search_bing', 'args': {'keyword': 'AI最新新闻'}, 'description': '模型准备执行search_bing搜索:'}], 'review_configs': [{'action_name': 'search_bing', 'allowed_decisions': ['approve', 'edit', 'reject']}]}, id='888e33259764e1d8a7161d8f6ae033ed'),)}


    在代码环境中,能看到有Interrupt这个打断动作,但是具体怎么续上后面的操作,需要到LangSmith或者线上环境中查看.

    LangSmith环境搭建,可查看:LangChain1.0-Agent-部署/上线(开发人员必备)

    langgraph.json  中添加一行新的"searchbot": "./theloop.py:agent"

    {

      "dependencies": ["./"],

      "graphs": {

        "chatbot": "./graph.py:agent",

        "searchbot": "./theloop.py:agent"

      },

      "env": ".env"

    }

    启动 langgraph dev

    image.png

    访问Studio UI界面

    image.png

    可以看到在执行工具调用时触发了HumanInTheLoopMiddleware中间件

    image.png

    输入approve可以继续执行,调用搜索工具

    image.png

    可以看到调用了search_bing工具,返回了结果

    image.png


关键字

上一篇: LangChain 1.0-Agent中间件-汇总消息

下一篇: 没有了