[将人类纳入循环:如何为工具添加人工审批机制]

92 阅读3分钟

引言

在自动化过程中,有些工具我们可能不愿意让模型独立执行,因为其可能存在风险或需经过人类的判断与确认。为此,我们可以在工具被调用之前,加入一个人工审批步骤。这篇文章将指导您如何在Jupyter笔记本或终端中,实现这样的人工审批机制。

主要内容

设置环境

首先,我们需要安装一些必要的包,通过下列命令来安装:

%pip install --upgrade --quiet langchain

接下来,设置环境变量:

import getpass
import os

# 如果想使用LangSmith,取消下面的注释:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

创建工具链

我们将创建一些简单的工具和一个工具调用链。以下是一些示例代码,包括如何设置不同AI提供商的API:

pip install -qU langchain-openai

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 使用API代理服务提高访问稳定性

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

工具示例

这里,我们定义了两个简化的工具:一个是邮件计数工具,另一个是发送邮件工具:

from typing import Dict, List
from langchain_core.messages import AIMessage
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}."

添加人工审批

接下来,我们在工具调用链中加入人工审批功能,以允许或拒绝调用请求:

import json

class NotApproved(Exception):
    """Custom exception to handle non-approved tool invocations."""

def human_approval(msg: AIMessage) -> AIMessage:
    """Check and approve tool invocations by a human.

    Args:
        msg: output from the chat model.

    Returns:
        msg: original output from the msg if approved.
    """
    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("Send sally@gmail.com an email saying 'What's up homie'")
except NotApproved as e:
    print()
    print(e)

常见问题和解决方案

1. 作业状态管理

在生产应用中,您可能需要跟踪应用状态。建议使用langgraph库来提供此功能,具体可以参考这份指南

2. 网络限制

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

总结和进一步学习资源

人类在循环中是确保关键任务安全的重要组成部分。通过本文介绍的方法,您可以在编码过程中增加一个人工审批步骤,让工具调用更加安全可靠。进一步学习可以参考以下资源:

参考资料

  1. Langchain 官方文档: www.langchain.com
  2. OpenAI API: platform.openai.com/docs/

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