**增强工具安全性:在Jupyter Notebook中添加人类审批机制**

151 阅读3分钟
# 引言

在人工智能和自动化的世界中,有时候我们需要确保某些工具的调用经过人为审核,以避免潜在的错误或滥用。这篇文章旨在介绍如何在Jupyter Notebook或命令行中实现“人类在回路中” (human-in-the-loop) 的流程,以增强系统的安全性和可靠性。

# 主要内容

## 环境设置

首先,我们需要安装`langchain`这个Python包,以便能够创建连贯的工具调用链。

```bash
%pip install --upgrade --quiet langchain

设置环境变量以开启LangSmith特性(如果需要):

import getpass
import os

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

创建工具和链

我们将创建几个简单的工具,并通过一个调用链来管理这些工具。

from langchain_core.messages import AIMessage
from langchain_core.tools import tool

@tool
def count_emails(last_n_days: int) -> int:
    """对最近N天的电子邮件计数。"""
    return last_n_days * 5  # 数据为示例

@tool
def send_email(message: str, recipient: str) -> str:
    """发送电子邮件。"""
    return f"已成功发送邮件给 {recipient}。"

tools = [count_emails, send_email]

接下来,创建一个工具调用链:

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

添加人类审批

在工具调用链中引入一个审核步骤,要求用户进行审批。

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

代码示例

如下是一个完整的示例,展示如何调用这个加强版链:

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

try:
    chain.invoke("Send sally@gmail.com an email saying 'What's up homie'")
except NotApproved as e:
    print()
    print(e)

在这里,通过模拟用户输入,我们可以控制工具的执行流,以防止未经批准的调用。

常见问题和解决方案

  • 工具调用链过于复杂? 可以通过分步骤调试的方式来确保各个组成部分的稳定性。
  • 如何处理网络请求超时? 在涉及API调用时,可以选择使用API代理服务以提高访问的稳定性,特别在某些地区。

总结和进一步学习资源

这种“人类在回路中”的方法是增强自动化工具链安全性的一种有效方式。在生产环境中,您可能需要进一步优化以处理更多的状态管理和故障处理。

参考资料

  1. LangChain 官方文档
  2. Jupyter Notebook 官方指南

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

---END---